|
|
@@ -1,47 +1,18 @@
|
|
|
-
|
|
|
"""
|
|
|
-Client module
|
|
|
+Authentication handeler module
|
|
|
"""
|
|
|
|
|
|
import sys
|
|
|
-import logging
|
|
|
import re
|
|
|
import time
|
|
|
-from datetime import datetime
|
|
|
-import json
|
|
|
-import pathlib2
|
|
|
|
|
|
import requests
|
|
|
import cfscrape
|
|
|
-from .browser import StealthBrowser as Browser
|
|
|
-from appdirs import user_data_dir
|
|
|
-
|
|
|
-
|
|
|
-DATA_DIR = user_data_dir('rival_regions_wrapper', 'bergc')
|
|
|
-pathlib2.Path(DATA_DIR).mkdir(parents=True, exist_ok=True)
|
|
|
-
|
|
|
-# get logger
|
|
|
-LOGGER = logging.getLogger(__name__)
|
|
|
-LOGGER.setLevel(logging.DEBUG)
|
|
|
|
|
|
-# create file handler
|
|
|
-FILE_HANDLER = logging.FileHandler('{}/output.log'.format(DATA_DIR))
|
|
|
-FILE_HANDLER.setLevel(logging.DEBUG)
|
|
|
+from rival_regions_wrapper import LOGGER
|
|
|
|
|
|
-# create console handler
|
|
|
-STREAM_HANDLER = logging.StreamHandler()
|
|
|
-STREAM_HANDLER.setLevel(logging.INFO)
|
|
|
-
|
|
|
-# create formatter and add it to the handlers
|
|
|
-STREAM_FORMATTER = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
|
|
|
-STREAM_HANDLER.setFormatter(STREAM_FORMATTER)
|
|
|
-FILE_FORMATTER = logging \
|
|
|
- .Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
|
-FILE_HANDLER.setFormatter(FILE_FORMATTER)
|
|
|
-
|
|
|
-# add the handlers to logger
|
|
|
-LOGGER.addHandler(STREAM_HANDLER)
|
|
|
-LOGGER.addHandler(FILE_HANDLER)
|
|
|
+from .cookie_storage import CookieStorage
|
|
|
+from .browser import StealthBrowser as Browser
|
|
|
|
|
|
|
|
|
class RRClientException(Exception):
|
|
|
@@ -82,7 +53,7 @@ def session_handler(func):
|
|
|
try:
|
|
|
return func(*args, **kwargs)
|
|
|
except (SessionExpireException, ConnectionError, ConnectionResetError):
|
|
|
- instance.remove_cookie(instance.username)
|
|
|
+ CookieStorage.remove_cookie(instance.username)
|
|
|
instance.login()
|
|
|
return try_run(instance, func, *args, **kwargs)
|
|
|
except NoLogginException:
|
|
|
@@ -103,7 +74,6 @@ class AuthenticationHandler:
|
|
|
|
|
|
def __init__(self, show_window=False):
|
|
|
self.show_window = show_window
|
|
|
- self.LOGGER = LOGGER
|
|
|
LOGGER.info('Initialize authentication handler, show window: "%s"',
|
|
|
self.show_window)
|
|
|
|
|
|
@@ -119,7 +89,7 @@ class AuthenticationHandler:
|
|
|
"""Login user if needed"""
|
|
|
LOGGER.info('"%s": start login, method: "%s"',
|
|
|
self.username, self.login_method)
|
|
|
- cookies = self.get_cookies(self.username)
|
|
|
+ cookies = CookieStorage.get_cookies(self.username)
|
|
|
if not cookies:
|
|
|
cookies = []
|
|
|
LOGGER.info('"%s": no cookie, new login, method "%s"',
|
|
|
@@ -155,9 +125,9 @@ class AuthenticationHandler:
|
|
|
if browser_cookie:
|
|
|
expiry = browser_cookie.get('expiry', None)
|
|
|
value = browser_cookie.get('value', None)
|
|
|
- LOGGER.info('"{}": "value": {}, "expiry": {}'.format(
|
|
|
+ LOGGER.info('"%s": "value": %s, "expiry": {}',
|
|
|
self.username, value, expiry
|
|
|
- ))
|
|
|
+ )
|
|
|
cookie = self.create_cookie(
|
|
|
'PHPSESSID',
|
|
|
expiry,
|
|
|
@@ -167,8 +137,6 @@ class AuthenticationHandler:
|
|
|
else:
|
|
|
raise NoCookieException()
|
|
|
|
|
|
- # TODO: what's up with 'rival/googles'
|
|
|
-
|
|
|
cookie_names = ['rr_f']
|
|
|
for cookie_name in cookie_names:
|
|
|
browser_cookie = browser.get_cookie(cookie_name)
|
|
|
@@ -191,7 +159,7 @@ class AuthenticationHandler:
|
|
|
else:
|
|
|
raise NoCookieException()
|
|
|
|
|
|
- self.write_cookies(self.username, cookies)
|
|
|
+ CookieStorage.write_cookies(self.username, cookies)
|
|
|
LOGGER.debug('"%s": closing login tab', self.username)
|
|
|
browser.close_current_tab()
|
|
|
else:
|
|
|
@@ -276,73 +244,6 @@ class AuthenticationHandler:
|
|
|
browser.click(css_selector='.sa_sn.imp.float_left')
|
|
|
return browser
|
|
|
|
|
|
- @classmethod
|
|
|
- def write_cookies(cls, username, passed_cookies):
|
|
|
- """Write cookie to file"""
|
|
|
- LOGGER.info('"%s": Saving cookie', username)
|
|
|
- cookies = None
|
|
|
- try:
|
|
|
- with open('{}/cookies.json'.format(DATA_DIR), 'r') as cookies_file:
|
|
|
- cookies = json.load(cookies_file)
|
|
|
- if not cookies:
|
|
|
- raise FileNotFoundError # raise error as if file hadn't been found
|
|
|
- except FileNotFoundError:
|
|
|
- cookies = {username : {}}
|
|
|
- if username not in cookies:
|
|
|
- cookies[username] = {}
|
|
|
- for cookie in passed_cookies:
|
|
|
- cookies[username][cookie['name']] = {
|
|
|
- 'expiry': cookie['expires'],
|
|
|
- 'value': cookie['value'],
|
|
|
- }
|
|
|
-
|
|
|
- with open('{}/cookies.json'.format(DATA_DIR), 'w+') as cookies_file:
|
|
|
- json.dump(cookies, cookies_file)
|
|
|
- LOGGER.info('"%s": Saved cookie', username)
|
|
|
-
|
|
|
- @classmethod
|
|
|
- def get_cookies(cls, username):
|
|
|
- """Read cookies for username"""
|
|
|
- LOGGER.info('"%s": Reading cookie', username)
|
|
|
- cookies = []
|
|
|
- try:
|
|
|
- with open('{}/cookies.json'.format(DATA_DIR), 'r') as cookies_file:
|
|
|
- cookies_data = json.load(cookies_file)
|
|
|
- for cookie_username, user_cookies in cookies_data.items():
|
|
|
- if cookie_username == username:
|
|
|
- LOGGER.info('"%s": Found cookies', username)
|
|
|
- for cookie_name, cookie in user_cookies.items():
|
|
|
- expires = datetime.fromtimestamp(
|
|
|
- int(cookie['expiry'])
|
|
|
- )
|
|
|
- if datetime.now() >= expires:
|
|
|
- LOGGER.info('"%s": Cookie is expired', username)
|
|
|
- return None
|
|
|
- cookies.append(cls.create_cookie(
|
|
|
- cookie_name,
|
|
|
- cookie['expiry'],
|
|
|
- cookie['value'],
|
|
|
- ))
|
|
|
- return cookies
|
|
|
- except FileNotFoundError:
|
|
|
- pass
|
|
|
- return cookies
|
|
|
-
|
|
|
- @classmethod
|
|
|
- def remove_cookie(cls, username):
|
|
|
- """Remove cookie from storage"""
|
|
|
- LOGGER.info('"%s": Removing cookie', username)
|
|
|
- cookies = None
|
|
|
- try:
|
|
|
- with open('{}/cookies.json'.format(DATA_DIR), 'r') as cookies_file:
|
|
|
- cookies = json.load(cookies_file)
|
|
|
- except FileNotFoundError:
|
|
|
- cookies = {}
|
|
|
- cookies.pop(username, None)
|
|
|
- with open('{}/cookies.json'.format(DATA_DIR), 'w+') as cookies_file:
|
|
|
- json.dump(cookies, cookies_file)
|
|
|
- LOGGER.info('"%s": Removed cookie', username)
|
|
|
-
|
|
|
@staticmethod
|
|
|
def create_cookie(name, expiry, value):
|
|
|
"""Create cookie"""
|
|
|
@@ -416,7 +317,7 @@ class AuthenticationHandler:
|
|
|
raise SessionExpireException()
|
|
|
browser = Browser(showWindow=self.show_window)
|
|
|
browser.go_to('https://rivalregions.com/')
|
|
|
- for cookie in self.get_cookies(self.username):
|
|
|
+ for cookie in CookieStorage.get_cookies(self.username):
|
|
|
browser.add_cookie(cookie)
|
|
|
browser.go_to(
|
|
|
'https://rivalregions.com/#slide/chat/lang_{}'
|
|
|
@@ -444,7 +345,7 @@ class AuthenticationHandler:
|
|
|
raise SessionExpireException()
|
|
|
browser = Browser(showWindow=self.show_window)
|
|
|
browser.go_to('https://rivalregions.com/')
|
|
|
- for cookie in self.get_cookies(self.username):
|
|
|
+ for cookie in CookieStorage.get_cookies(self.username):
|
|
|
browser.add_cookie(cookie)
|
|
|
browser.go_to(
|
|
|
'https://rivalregions.com/#messages/{}'.format(user_id)
|