diff --git a/gitflic/_oauth_server/GitflicOAuthServer.py b/gitflic/_oauth_server/GitflicOAuthServer.py index 7e5948e..798041c 100644 --- a/gitflic/_oauth_server/GitflicOAuthServer.py +++ b/gitflic/_oauth_server/GitflicOAuthServer.py @@ -1,7 +1,7 @@ import http.server +import json import os import sys -import time from typing import Tuple, AnyStr, NoReturn from urllib.parse import parse_qs, urlsplit import importlib.resources @@ -81,7 +81,6 @@ class GitflicOAuthServer(http.server.BaseHTTPRequestHandler):
{self.server_version.replace("/", " ")} by SantaSpeen -
''') else: for k, v in params.items(): @@ -105,14 +104,14 @@ class GitflicOAuthServer(http.server.BaseHTTPRequestHandler): res = requests.get("https://oauth.gitflic.ru/api/token/access?code=" + code) if res.status_code == 200: - res = res.json() + jsn = {"request": {"code": code, "state": state}, "response": res.json()} with open(os.path.join(os.getcwd(), "config.json"), "w") as f: - f.write(res) + json.dump(jsn, f, indent=3) - access_token = res['accessToken'] + access_token = jsn['response']['accessToken'] if _GitflicAuth: _GitflicAuth.access_token = access_token - _GitflicAuth.refresh_token = res['refreshToken'] + _GitflicAuth.refresh_token = jsn['response']['refreshToken'] self.send_html_row("access_token", "Access Token:", access_token) else: is_error = True @@ -132,7 +131,8 @@ class GitflicOAuthServer(http.server.BaseHTTPRequestHandler): # Info and footer send self.send(""" -
+
+

Server close automatically.

You can close this page

@@ -160,20 +160,26 @@ class GitflicOAuthServer(http.server.BaseHTTPRequestHandler): sys.exit(1) -def get_server(auth_class, port: int = None) -> Tuple[http.server.HTTPServer, str]: +def get_server(auth_class, port: int = None) -> Tuple[http.server.HTTPServer, str, str]: global server, redirect_link, _GitflicAuth _GitflicAuth = auth_class + url = "https://gitflic.santaspeen.ru/" try: port = port or randint(49152, 65535) - server_address = ('127.0.0.1', port) - server = http.server.HTTPServer(server_address, GitflicOAuthServer) - redirect_link = f"http://{':'.join([str(i) for i in server_address])}/" - print(f"GitflicOAuthServer serving on {redirect_link}") - return server, redirect_link + server_address = ('localhost', port) + req = requests.get(url+"getstate", params={"port": port}) + if req.status_code == 201: + server = http.server.HTTPServer(server_address, GitflicOAuthServer) + serving = f"http://{':'.join([str(i) for i in server_address])}/" + print(f"GitflicOAuthServer serving on {serving}") + state = req.json()['state'] + return server, url+state, state except Exception as e: print(f"get_server send error: {e}. Trying to rebind server.") return get_server(auth_class) + raise Exception(f"Cannot get state code from {url}") + def kill_server(): exit(0) diff --git a/gitflic/auth.py b/gitflic/auth.py index 9e1f214..ad286ab 100644 --- a/gitflic/auth.py +++ b/gitflic/auth.py @@ -1,6 +1,7 @@ """ Gitflic authentication wrapper. """ +import json import os import threading from urllib.parse import quote_plus, parse_qs, urlsplit @@ -64,8 +65,7 @@ class GitflicAuth: scope: Union[GitflicAuthScopes, str] = GitflicAuthScopes.ALL_READ, client_id: str = "cc2a5d8a-385a-4367-8b2b-bb2412eacb73", redirect_url: str = "https://gitflic.ru/settings/oauth/token", - state: str = "python_user", - oauth_implemented_pass: bool = False): + state: str = None): """ :param access_token: Raw token for raw AUTH. :param scope: OAUTH field. Default GitflicAuthScopes.ALL_READ @@ -100,7 +100,6 @@ class GitflicAuth: self.state: str = state self._server_thread: threading.Thread = None - self._oauth_implemented_pass: bool = oauth_implemented_pass self._try_login() @@ -140,34 +139,26 @@ class GitflicAuth: self.log.debug("Trying to login with OAUTH...") - if not self._oauth_implemented_pass: - raise GitflicExceptions("OAUTH not implemented yet! Use raw access_token authorization.") - - del self._oauth_implemented_pass - if self._localhost_oauth: - server, self.redirect_url = GitflicOAuthServer.get_server(self) + server, self.redirect_url, self.state = GitflicOAuthServer.get_server(self) # OAUTH authorization. redirect_url = quote_plus(self.redirect_url) webbrowser.open(OAUTH_URL.format(self.scope, self.client_id, redirect_url, self.state)) if not self._localhost_oauth: - url_or_code = input("Paste redirect url: ") - params = parse_qs(urlsplit(url_or_code).query) - code = None - for k, v in params.items(): - if k == "code": - code = v[0] - res = self.session.get("https://oauth.gitflic.ru/api/token/access?code=" + code or url_or_code) + code = input("Paste code: ") + if not code: + raise AuthError("Cannot find code.") + res = self.session.get("https://oauth.gitflic.ru/api/token/access?code=" + code) if res.status_code == 200: res = res.json() + jsn = {"request": {"code": code, "state": None}, "response": res} with open(os.path.join(os.getcwd(), "config.json"), "w") as f: - f.write(res) + json.dump(jsn, f, indent=3) access_token = res['accessToken'] self.access_token = access_token self.refresh_token = res['refreshToken'] self.session.headers["Authorization"] += access_token - self.check_token() else: error = None title_split = res.json()['title'].split(".") @@ -179,7 +170,9 @@ class GitflicAuth: self._server_thread.start() print("Waiting server..") self._server_thread.join() - self.check_token() + + self.session.headers['Authorization'] += self.access_token + self.check_token() def _token_login(self): """