2021-02-18 01:58:29 +13:00
|
|
|
import json
|
|
|
|
from logging import getLogger
|
2021-10-11 09:08:31 +13:00
|
|
|
from typing import Tuple
|
2021-02-18 01:58:29 +13:00
|
|
|
|
2024-02-03 01:47:29 +13:00
|
|
|
from PyQt5.QtCore import pyqtSignal, QUrl, QProcess, pyqtSlot
|
2021-05-29 06:34:34 +12:00
|
|
|
from PyQt5.QtGui import QDesktopServices
|
2023-12-12 11:42:25 +13:00
|
|
|
from PyQt5.QtWidgets import QFrame, qApp, QFormLayout, QLineEdit
|
2022-06-24 03:05:04 +12:00
|
|
|
from legendary.utils import webview_login
|
|
|
|
|
2024-02-03 01:47:29 +13:00
|
|
|
from rare.lgndr.core import LegendaryCore
|
2021-05-29 06:34:34 +12:00
|
|
|
from rare.ui.components.dialogs.login.browser_login import Ui_BrowserLogin
|
2024-02-22 00:21:44 +13:00
|
|
|
from rare.utils.misc import qta_icon
|
2024-02-03 01:47:29 +13:00
|
|
|
from rare.utils.paths import get_rare_executable
|
2023-02-19 04:29:41 +13:00
|
|
|
from rare.widgets.indicator_edit import IndicatorLineEdit, IndicatorReasonsCommon
|
2021-02-18 01:58:29 +13:00
|
|
|
|
|
|
|
logger = getLogger("BrowserLogin")
|
|
|
|
|
2021-02-18 22:22:15 +13:00
|
|
|
|
2022-06-24 02:57:29 +12:00
|
|
|
class BrowserLogin(QFrame):
|
2021-02-18 01:58:29 +13:00
|
|
|
success = pyqtSignal()
|
2021-10-10 01:08:54 +13:00
|
|
|
changed = pyqtSignal()
|
2021-02-18 22:22:15 +13:00
|
|
|
|
2021-05-29 06:34:34 +12:00
|
|
|
def __init__(self, core: LegendaryCore, parent=None):
|
|
|
|
super(BrowserLogin, self).__init__(parent=parent)
|
2022-06-24 02:57:29 +12:00
|
|
|
self.setFrameStyle(self.StyledPanel)
|
|
|
|
self.ui = Ui_BrowserLogin()
|
|
|
|
self.ui.setupUi(self)
|
2021-02-18 01:58:29 +13:00
|
|
|
|
2021-05-29 06:34:34 +12:00
|
|
|
self.core = core
|
2022-09-02 00:13:58 +12:00
|
|
|
self.login_url = self.core.egs.get_auth_url()
|
2021-02-18 01:58:29 +13:00
|
|
|
|
2021-10-10 01:08:54 +13:00
|
|
|
self.sid_edit = IndicatorLineEdit(
|
2022-09-02 00:13:58 +12:00
|
|
|
placeholder=self.tr("Insert authorizationCode here"), edit_func=self.text_changed, parent=self
|
2021-10-10 01:08:54 +13:00
|
|
|
)
|
2023-12-12 11:42:25 +13:00
|
|
|
self.sid_edit.line_edit.setEchoMode(QLineEdit.Password)
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.link_text.setText(self.login_url)
|
2024-02-22 00:21:44 +13:00
|
|
|
self.ui.copy_button.setIcon(qta_icon("mdi.content-copy", "fa.copy"))
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.copy_button.clicked.connect(self.copy_link)
|
2023-12-12 11:42:25 +13:00
|
|
|
self.ui.form_layout.setWidget(
|
|
|
|
self.ui.form_layout.getWidgetPosition(self.ui.sid_label)[0],
|
|
|
|
QFormLayout.FieldRole, self.sid_edit
|
2023-12-12 03:23:41 +13:00
|
|
|
)
|
2021-02-18 01:58:29 +13:00
|
|
|
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.open_button.clicked.connect(self.open_browser)
|
2021-10-10 01:08:54 +13:00
|
|
|
self.sid_edit.textChanged.connect(self.changed.emit)
|
2021-10-08 08:58:50 +13:00
|
|
|
|
2024-02-03 01:47:29 +13:00
|
|
|
@pyqtSlot()
|
2022-01-23 13:03:56 +13:00
|
|
|
def copy_link(self):
|
2022-06-24 02:57:29 +12:00
|
|
|
clipboard = qApp.clipboard()
|
2022-01-23 13:03:56 +13:00
|
|
|
clipboard.setText(self.login_url)
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Copied to clipboard"))
|
2022-01-23 13:03:56 +13:00
|
|
|
|
2021-10-10 01:08:54 +13:00
|
|
|
def is_valid(self):
|
|
|
|
return self.sid_edit.is_valid
|
2021-10-08 08:58:50 +13:00
|
|
|
|
2021-10-10 01:08:54 +13:00
|
|
|
@staticmethod
|
2023-02-19 01:33:42 +13:00
|
|
|
def text_changed(text) -> Tuple[bool, str, int]:
|
2021-10-10 01:08:54 +13:00
|
|
|
if text:
|
|
|
|
text = text.strip()
|
|
|
|
if text.startswith("{") and text.endswith("}"):
|
|
|
|
try:
|
2022-09-02 00:13:58 +12:00
|
|
|
text = json.loads(text).get("authorizationCode")
|
2021-10-10 01:08:54 +13:00
|
|
|
except json.JSONDecodeError:
|
2023-02-19 01:33:42 +13:00
|
|
|
return False, text, IndicatorReasonsCommon.WRONG_FORMAT
|
2021-10-10 01:08:54 +13:00
|
|
|
elif '"' in text:
|
|
|
|
text = text.strip('"')
|
2023-02-19 01:33:42 +13:00
|
|
|
return len(text) == 32, text, IndicatorReasonsCommon.WRONG_FORMAT
|
2021-10-08 08:58:50 +13:00
|
|
|
else:
|
2023-02-19 01:33:42 +13:00
|
|
|
return False, text, IndicatorReasonsCommon.VALID
|
2021-02-18 01:58:29 +13:00
|
|
|
|
2021-05-29 06:34:34 +12:00
|
|
|
def do_login(self):
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Logging in..."))
|
2022-09-02 00:13:58 +12:00
|
|
|
auth_code = self.sid_edit.text()
|
2021-05-29 06:34:34 +12:00
|
|
|
try:
|
2022-09-02 00:13:58 +12:00
|
|
|
if self.core.auth_code(auth_code):
|
2023-12-12 11:42:25 +13:00
|
|
|
logger.info("Successfully logged in as %s", self.core.lgd.userdata['displayName'])
|
2021-05-29 06:34:34 +12:00
|
|
|
self.success.emit()
|
|
|
|
else:
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Login failed."))
|
2021-05-29 06:34:34 +12:00
|
|
|
logger.warning("Failed to login through browser")
|
|
|
|
except Exception as e:
|
|
|
|
logger.warning(e)
|
2021-06-15 18:02:18 +12:00
|
|
|
|
2024-02-03 01:47:29 +13:00
|
|
|
@pyqtSlot()
|
2021-06-15 18:02:18 +12:00
|
|
|
def open_browser(self):
|
2022-09-02 00:13:58 +12:00
|
|
|
if not webview_login.webview_available:
|
|
|
|
logger.warning("You don't have webengine installed, you will need to manually copy the authorizationCode.")
|
2022-01-30 12:23:37 +13:00
|
|
|
QDesktopServices.openUrl(QUrl(self.login_url))
|
|
|
|
else:
|
2024-02-03 01:47:29 +13:00
|
|
|
cmd = get_rare_executable() + ["login", self.core.get_egl_version()]
|
|
|
|
proc = QProcess(self)
|
|
|
|
proc.start(cmd[0], cmd[1:])
|
|
|
|
proc.waitForFinished(-1)
|
|
|
|
out, err = (
|
|
|
|
proc.readAllStandardOutput().data().decode("utf-8", "ignore"),
|
|
|
|
proc.readAllStandardError().data().decode("utf-8", "ignore")
|
|
|
|
)
|
|
|
|
proc.deleteLater()
|
|
|
|
|
|
|
|
if out:
|
|
|
|
self.core.auth_ex_token(out)
|
2023-12-12 11:42:25 +13:00
|
|
|
logger.info("Successfully logged in as %s", {self.core.lgd.userdata['displayName']})
|
2022-01-30 12:23:37 +13:00
|
|
|
self.success.emit()
|
|
|
|
else:
|
|
|
|
logger.warning("Failed to login through browser.")
|