From 25a875b6280d361b4d8f874cab1d5bdacfaba09f Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Fri, 10 May 2024 09:42:44 +0200 Subject: [PATCH] Fix for goodreads blocking "requests" --- cps/__init__.py | 1 - cps/admin.py | 3 -- cps/config_sql.py | 10 +------ cps/services/goodreads_support.py | 47 +++++++++++++++++++++++++------ cps/templates/config_edit.html | 4 --- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/cps/__init__.py b/cps/__init__.py index 621705fd..9601c63b 100755 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -186,7 +186,6 @@ def create_app(): services.ldap.init_app(app, config) if services.goodreads_support: services.goodreads_support.connect(config.config_goodreads_api_key, - config.config_goodreads_api_secret_e, config.config_use_goodreads) config.store_calibre_uuid(calibre_db, db.Library_Id) # Configure rate limiter diff --git a/cps/admin.py b/cps/admin.py index 86e59317..b709764b 100755 --- a/cps/admin.py +++ b/cps/admin.py @@ -1806,11 +1806,8 @@ def _configuration_update_helper(): # Goodreads configuration _config_checkbox(to_save, "config_use_goodreads") _config_string(to_save, "config_goodreads_api_key") - if to_save.get("config_goodreads_api_secret_e", ""): - _config_string(to_save, "config_goodreads_api_secret_e") if services.goodreads_support: services.goodreads_support.connect(config.config_goodreads_api_key, - config.config_goodreads_api_secret_e, config.config_use_goodreads) _config_int(to_save, "config_updatechannel") diff --git a/cps/config_sql.py b/cps/config_sql.py index a781f2c5..4ea4a9e0 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -114,8 +114,6 @@ class _Settings(_Base): config_use_goodreads = Column(Boolean, default=False) config_goodreads_api_key = Column(String) - config_goodreads_api_secret_e = Column(String) - config_goodreads_api_secret = Column(String) config_register_email = Column(Boolean, default=False) config_login_type = Column(Integer, default=0) @@ -422,19 +420,13 @@ def _encrypt_fields(session, secret_key): except OperationalError: with session.bind.connect() as conn: conn.execute(text("ALTER TABLE settings ADD column 'mail_password_e' String")) - conn.execute(text("ALTER TABLE settings ADD column 'config_goodreads_api_secret_e' String")) conn.execute(text("ALTER TABLE settings ADD column 'config_ldap_serv_password_e' String")) session.commit() crypter = Fernet(secret_key) - settings = session.query(_Settings.mail_password, _Settings.config_goodreads_api_secret, - _Settings.config_ldap_serv_password).first() + settings = session.query(_Settings.mail_password, _Settings.config_ldap_serv_password).first() if settings.mail_password: session.query(_Settings).update( {_Settings.mail_password_e: crypter.encrypt(settings.mail_password.encode())}) - if settings.config_goodreads_api_secret: - session.query(_Settings).update( - {_Settings.config_goodreads_api_secret_e: - crypter.encrypt(settings.config_goodreads_api_secret.encode())}) if settings.config_ldap_serv_password: session.query(_Settings).update( {_Settings.config_ldap_serv_password_e: diff --git a/cps/services/goodreads_support.py b/cps/services/goodreads_support.py index 74e6eba9..a4425ee4 100644 --- a/cps/services/goodreads_support.py +++ b/cps/services/goodreads_support.py @@ -18,11 +18,11 @@ import time from functools import reduce +import requests +import xmltodict -try: - from goodreads.client import GoodreadsClient -except ImportError: - from betterreads.client import GoodreadsClient +from goodreads.client import GoodreadsClient +from goodreads.request import GoodreadsRequest try: import Levenshtein except ImportError: Levenshtein = False @@ -30,6 +30,37 @@ except ImportError: Levenshtein = False from .. import logger +class my_GoodreadsClient(GoodreadsClient): + + def request(self, *args, **kwargs): + """Create a GoodreadsRequest object and make that request""" + req = my_GoodreadsRequest(self, *args, **kwargs) + return req.request() + +class GoodreadsRequestException(Exception): + def __init__(self, error_msg, url): + self.error_msg = error_msg + self.url = url + + def __str__(self): + return self.url, ':', self.error_msg + + +class my_GoodreadsRequest(GoodreadsRequest): + + def request(self): + resp = requests.get(self.host+self.path, params=self.params, + headers={"User-agent":"Mozilla/5.0 (X11; Linux x86_64; rv:125.0) " + "Gecko/20100101 Firefox/125.0"}) + if resp.status_code != 200: + raise GoodreadsRequestException(resp.reason, self.path) + if self.req_format == 'xml': + data_dict = xmltodict.parse(resp.content) + return data_dict['GoodreadsResponse'] + else: + raise Exception("Invalid format") + + log = logger.create() _client = None # type: GoodreadsClient @@ -38,20 +69,20 @@ _CACHE_TIMEOUT = 23 * 60 * 60 # 23 hours (in seconds) _AUTHORS_CACHE = {} -def connect(key=None, secret=None, enabled=True): +def connect(key=None, enabled=True): global _client - if not enabled or not key or not secret: + if not enabled or not key: _client = None return if _client: # make sure the configuration has not changed since last we used the client - if _client.client_key != key or _client.client_secret != secret: + if _client.client_key != key: _client = None if not _client: - _client = GoodreadsClient(key, secret) + _client = GoodreadsClient(key, None) def get_author_info(author_name): diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index 8035d03f..b03b7d6d 100755 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -162,10 +162,6 @@ -
- - -
{% endif %}