Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
3e2d0ad
Use PySide6 and fix the Qt5 issue in Arch Linux
zzjjzzgggg Apr 8, 2022
c23b6e0
format echo message
zzjjzzgggg Jul 10, 2022
4964e7c
use the correct olbrowserlogin
zzjjzzgggg Sep 14, 2022
8025300
fix for GCLB cookie
itstorque Nov 26, 2022
d846193
fix for csrfToken and project query
svennniiii Mar 10, 2023
c9c341d
Fix that removes the issue of printing multiple lines of ".olignore: …
svennniiii Apr 17, 2023
9839071
Fix that removes the issue of printing multiple lines of ".olignore: …
svennniiii Apr 17, 2023
a197165
Merge branch 'master' of https://github.com/svennniiii/overleaf-sync
svennniiii Apr 17, 2023
41c0320
update JS to extract GCLB correctly
zzjjzzgggg Apr 22, 2023
82221cc
simplify JS snippet
zzjjzzgggg Apr 22, 2023
187b1b9
correct post parameters in update_file
zzjjzzgggg Apr 22, 2023
037246b
fix bug when deleting files
zzjjzzgggg Oct 3, 2023
65e5708
support overleaf-ce sync
zzjjzzgggg Dec 1, 2023
b4d62fb
no verify for delete file
zzjjzzgggg Dec 1, 2023
3d72480
automatically save project name to .olproject_name
zzjjzzgggg Dec 4, 2023
e76ee89
handling folder depth larger than 2
zzjjzzgggg Dec 10, 2023
9dde3f1
revised
zzjjzzgggg Dec 10, 2023
6c23dce
reivsed
zzjjzzgggg Dec 10, 2023
6f69b4d
re-organize package structure
zzjjzzgggg Jan 9, 2024
8e47f84
no ignore setup.py
zzjjzzgggg Jan 9, 2024
b309ecc
allow set different server ip
zzjjzzgggg Jan 22, 2024
571e2be
fix bugs in get_project_infos
zzjjzzgggg Mar 3, 2024
9d101b6
delete requirements.txt
zzjjzzgggg Mar 15, 2024
61ea6d4
update readme
zzjjzzgggg Mar 15, 2024
2e08bf9
auto switch dir
Apr 11, 2024
1ec53c4
minor updates on requirements.txt
zzjjzzgggg Apr 24, 2024
db3a11a
fix conflicts on requirements.txt
zzjjzzgggg Apr 24, 2024
b2b78ff
fix bug in getting project infos
zzjjzzgggg Apr 30, 2024
025756d
Merge branch 'master' of github.com:zzjjzzgggg/overleaf-sync
zzjjzzgggg May 1, 2024
887fdd8
set GCLB in cookie
zzjjzzgggg Jul 12, 2024
b1babfc
revert
zzjjzzgggg Aug 15, 2024
734eea9
Merge remote-tracking branch 'zzjjzzgggg/master'
svennniiii Sep 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ venv.bak/
.DS_Store

# dev testing
setup.py
# setup.py
test*
.olauth
.olignore
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@

olsync is for overleaf.
olcesync is for the community edition.
Remember to click "accept all cookies" when logging in.


# Overleaf-Sync
### Easy Overleaf Two-Way Synchronization

Expand Down
File renamed without changes.
11 changes: 11 additions & 0 deletions olcesync/olcesync/comm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# created on 2024-04-30 17:25 by J. Zhao

# Where to get the CSRF Token and where to send the login request to
# 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.sid"]
122 changes: 122 additions & 0 deletions olcesync/olcesync/olbrowserlogin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
"""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 QCoreApplication, QUrl
from PySide6.QtWebEngineCore import (QWebEnginePage, QWebEngineProfile,
QWebEngineSettings)
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import QApplication, QMainWindow

from olcesync.comm import *


def on_cert_error(e):
# print(f"cert error: {e.description()}")
# print(f"type: {e.type()}")
# print(f"overridable: {e.isOverridable()}")
# print(f"url: {e.url()}")
# for c in e.certificateChain():
# print(c.toText())
e.acceptCertificate()


class OlBrowserLoginWindow(QMainWindow):
"""
Overleaf Browser Login Utility
Opens a browser window to securely login the user and returns relevant login data.
"""

def __init__(self, server_ip, *args, **kwargs):
super(OlBrowserLoginWindow, self).__init__(*args, **kwargs)

self.webview = QWebEngineView()
self._cookies = {}
self._csrf = ""
self._login_success = False

self.LOGIN_URL = "https://{}/login".format(server_ip)
self.PROJECT_URL = "https://{}/project".format(server_ip)

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)
webpage.certificateError.connect(on_cert_error)
self.webview.setPage(webpage)
self.webview.load(QUrl.fromUserInput(self.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() == self.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(server_ip):
from PySide6.QtCore import QLoggingCategory
QLoggingCategory.setFilterRules('''\
qt.webenginecontext.info=false
''')

app = QApplication([])
ol_browser_login_window = OlBrowserLoginWindow(server_ip)
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
}


if __name__ == '__main__':
print(login("202.117.43.87"))
Loading