diff --git a/cps/editbooks.py b/cps/editbooks.py
index 8ea00469..f0b8fb41 100755
--- a/cps/editbooks.py
+++ b/cps/editbooks.py
@@ -341,7 +341,8 @@ def delete_book_from_table(book_id, book_format, jsonResponse):
else:
calibre_db.session.query(db.Data).filter(db.Data.book == book.id).\
filter(db.Data.format == book_format).delete()
- kobo_sync_status.remove_synced_book(book.id, True)
+ if book_format.upper() in ['KEPUB', 'EPUB', 'EPUB3']:
+ kobo_sync_status.remove_synced_book(book.id, True)
calibre_db.session.commit()
except Exception as ex:
log.debug_or_exception(ex)
diff --git a/cps/helper.py b/cps/helper.py
index 5cfefe50..622af817 100644
--- a/cps/helper.py
+++ b/cps/helper.py
@@ -17,18 +17,18 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
import os
import io
import mimetypes
import re
import shutil
-import time
+import socket
import unicodedata
from datetime import datetime, timedelta
from tempfile import gettempdir
-
+from urllib.parse import urlparse
import requests
+
from babel.dates import format_datetime
from babel.units import format_unit
from flask import send_from_directory, make_response, redirect, abort, url_for
@@ -584,10 +584,16 @@ def get_book_cover_internal(book, use_generic_cover_on_failure):
# saves book cover from url
def save_cover_from_url(url, book_path):
try:
+ # 127.0.x.x, localhost, [::1], [::ffff:7f00:1]
+ ip = socket.getaddrinfo(urlparse(url).hostname, 0)[0][4][0]
+ if ip.startswith("127.") or ip.startswith('::ffff:7f') or ip == "::1":
+ log.error("Localhost was accessed for cover upload")
+ return False, _("You are not allowed to access localhost for cover uploads")
img = requests.get(url, timeout=(10, 200)) # ToDo: Error Handling
img.raise_for_status()
return save_cover(img, book_path)
- except (requests.exceptions.HTTPError,
+ except (socket.gaierror,
+ requests.exceptions.HTTPError,
requests.exceptions.ConnectionError,
requests.exceptions.Timeout) as ex:
log.info(u'Cover Download Error %s', ex)
diff --git a/cps/kobo_sync_status.py b/cps/kobo_sync_status.py
index 6df0a503..2e99394b 100644
--- a/cps/kobo_sync_status.py
+++ b/cps/kobo_sync_status.py
@@ -21,6 +21,7 @@ from flask_login import current_user
from . import ub
import datetime
from sqlalchemy.sql.expression import or_, and_, true
+from sqlalchemy import exc
# Add the current book id to kobo_synced_books table for current user, if entry is already present,
# do nothing (safety precaution)
@@ -36,14 +37,18 @@ def add_synced_books(book_id):
# Select all entries of current book in kobo_synced_books table, which are from current user and delete them
-def remove_synced_book(book_id, all=False):
+def remove_synced_book(book_id, all=False, session=None):
if not all:
user = ub.KoboSyncedBooks.user_id == current_user.id
else:
user = true()
- ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id) \
- .filter(user).delete()
- ub.session_commit()
+ if not session:
+ ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id).filter(user).delete()
+ ub.session_commit()
+ else:
+ session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id).filter(user).delete()
+ ub.session_commit(sess=session)
+
def change_archived_books(book_id, state=None, message=None):
diff --git a/cps/tasks/convert.py b/cps/tasks/convert.py
index 59ad6909..596bf95c 100644
--- a/cps/tasks/convert.py
+++ b/cps/tasks/convert.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
import os
import re
@@ -31,7 +30,8 @@ from cps import db
from cps import logger, config
from cps.subproc_wrapper import process_open
from flask_babel import gettext as _
-from flask import url_for
+from cps.kobo_sync_status import remove_synced_book
+from cps.ub import ini
from cps.tasks.mail import TaskEmail
from cps import gdriveutils
@@ -147,6 +147,10 @@ class TaskConvert(CalibreTask):
try:
local_db.session.merge(new_format)
local_db.session.commit()
+ if self.settings['new_book_format'].upper() in ['KEPUB', 'EPUB', 'EPUB3']:
+ ub_session = ini()
+ remove_synced_book(book_id, True, ub_session)
+ ub_session.close()
except SQLAlchemyError as e:
local_db.session.rollback()
log.error("Database error: %s", e)
diff --git a/cps/ub.py b/cps/ub.py
index 1d5db58a..27e9ef8f 100644
--- a/cps/ub.py
+++ b/cps/ub.py
@@ -773,6 +773,14 @@ def create_admin_user(session):
except Exception:
session.rollback()
+def ini():
+ global app_DB_path
+ engine = create_engine(u'sqlite:///{0}'.format(app_DB_path), echo=False)
+
+ Session = scoped_session(sessionmaker())
+ Session.configure(bind=engine)
+ return Session()
+
def init_db(app_db_path):
# Open session for database connection
@@ -830,12 +838,13 @@ def dispose():
except Exception:
pass
-def session_commit(success=None):
+def session_commit(success=None, sess=None):
+ s = sess if sess else session
try:
- session.commit()
+ s.commit()
if success:
log.info(success)
except (exc.OperationalError, exc.InvalidRequestError) as e:
- session.rollback()
+ s.rollback()
log.debug_or_exception(e)
return ""
diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html
index 84bdae18..652248a2 100644
--- a/test/Calibre-Web TestSummary_Linux.html
+++ b/test/Calibre-Web TestSummary_Linux.html
@@ -37,20 +37,20 @@
-
Start Time: 2022-01-18 21:11:17
+
Start Time: 2022-01-23 05:50:54
-
Stop Time: 2022-01-19 01:03:52
+
Stop Time: 2022-01-23 10:25:22
-
Duration: 3h 12 min
+
Duration: 3h 54 min
@@ -714,15 +714,15 @@
-
+
TestEditAdditionalBooks |
- 17 |
+ 18 |
15 |
0 |
- 0 |
+ 1 |
2 |
- Detail
+ Detail
|
@@ -809,7 +809,36 @@
-
+
+
+ TestEditAdditionalBooks - test_upload_cbz_coverformats
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
TestEditAdditionalBooks - test_upload_edit_role
|
@@ -818,7 +847,7 @@
-
+
TestEditAdditionalBooks - test_upload_metadata_cbr
|
@@ -827,7 +856,7 @@
-
+
TestEditAdditionalBooks - test_upload_metadata_cbt
|
@@ -836,19 +865,19 @@
-
+
TestEditAdditionalBooks - test_writeonly_calibre_database
|
-
+
- |