-
Notifications
You must be signed in to change notification settings - Fork 63
/
Copy patholbrowserlogin.py
110 lines (86 loc) · 3.6 KB
/
olbrowserlogin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""Ol Browser Login Utility"""
##################################################
# MIT License
##################################################
# File: olbrowserlogin.py
# Description: Overleaf Browser Login Utility
# Author: Moritz Glöckl
# License: MIT
# Version: 1.2.0
##################################################
from PySide6.QtCore import *
from PySide6.QtWidgets import *
from PySide6.QtWebEngineWidgets import *
from PySide6.QtWebEngineCore import QWebEngineProfile, QWebEngineSettings, QWebEnginePage
# Where to get the CSRF Token and where to send the login request to
LOGIN_URL = "https://www.overleaf.com/login"
PROJECT_URL = "https://www.overleaf.com/project" # The dashboard URL
# JS snippet to get the first link
JAVASCRIPT_EXTRACT_PROJECT_URL = "document.getElementsByClassName('dash-cell-name')[1].firstChild.href"
# JS snippet to extract the csrfToken
JAVASCRIPT_CSRF_EXTRACTOR = "document.getElementsByName('ol-csrfToken')[0].content"
# Name of the cookies we want to extract
COOKIE_NAMES = ["overleaf_session2", "GCLB"]
class OlBrowserLoginWindow(QMainWindow):
"""
Overleaf Browser Login Utility
Opens a browser window to securely login the user and returns relevant login data.
"""
def __init__(self, *args, **kwargs):
super(OlBrowserLoginWindow, self).__init__(*args, **kwargs)
self.webview = QWebEngineView()
self._cookies = {}
self._csrf = ""
self._login_success = False
self.profile = QWebEngineProfile(self.webview)
self.cookie_store = self.profile.cookieStore()
self.cookie_store.cookieAdded.connect(self.handle_cookie_added)
self.profile.setPersistentCookiesPolicy(QWebEngineProfile.NoPersistentCookies)
self.profile.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)
webpage = QWebEnginePage(self.profile, self)
self.webview.setPage(webpage)
self.webview.load(QUrl.fromUserInput(LOGIN_URL))
self.webview.loadFinished.connect(self.handle_load_finished)
self.setCentralWidget(self.webview)
self.resize(600, 700)
def handle_load_finished(self):
def callback(result):
def callback(result):
self._csrf = result
self._login_success = True
QCoreApplication.quit()
self.webview.load(QUrl.fromUserInput(result))
self.webview.loadFinished.connect( lambda x:
self.webview.page().runJavaScript(
JAVASCRIPT_CSRF_EXTRACTOR, 0, callback
)
)
if self.webview.url().toString() == PROJECT_URL:
self.webview.page().runJavaScript(
JAVASCRIPT_EXTRACT_PROJECT_URL, 0, callback
)
def handle_cookie_added(self, cookie):
cookie_name = cookie.name().data().decode('utf-8')
if cookie_name in COOKIE_NAMES:
self._cookies[cookie_name] = cookie.value().data().decode('utf-8')
@property
def cookies(self):
return self._cookies
@property
def csrf(self):
return self._csrf
@property
def login_success(self):
return self._login_success
def login():
from PySide6.QtCore import QLoggingCategory
QLoggingCategory.setFilterRules('''\
qt.webenginecontext.info=false
''')
app = QApplication([])
ol_browser_login_window = OlBrowserLoginWindow()
ol_browser_login_window.show()
app.exec()
if not ol_browser_login_window.login_success:
return None
return {"cookie": ol_browser_login_window.cookies, "csrf": ol_browser_login_window.csrf}