Commit 777c2726 authored by Ozzieisaacs's avatar Ozzieisaacs

Changed session_handing

parent c25afdc2
...@@ -71,7 +71,7 @@ lm.session_protection = 'strong' ...@@ -71,7 +71,7 @@ lm.session_protection = 'strong'
ub.init_db(cli.settingspath) ub.init_db(cli.settingspath)
# pylint: disable=no-member # pylint: disable=no-member
config = config_sql.load_configuration(ub.session) config = config_sql.load_configuration(ub.Scoped_Session)
web_server = WebServer() web_server = WebServer()
...@@ -94,12 +94,13 @@ def create_app(): ...@@ -94,12 +94,13 @@ def create_app():
app.root_path = app.root_path.decode('utf-8') app.root_path = app.root_path.decode('utf-8')
app.instance_path = app.instance_path.decode('utf-8') app.instance_path = app.instance_path.decode('utf-8')
#if os.environ.get('FLASK_DEBUG'):
cache_buster.init_cache_busting(app) cache_buster.init_cache_busting(app)
log.info('Starting Calibre Web...') log.info('Starting Calibre Web...')
Principal(app) Principal(app)
lm.init_app(app) lm.init_app(app)
app.secret_key = os.getenv('SECRET_KEY', config_sql.get_flask_session_key(ub.session)) app.secret_key = os.getenv('SECRET_KEY', config_sql.get_flask_session_key(ub.Scoped_Session))
web_server.init_app(app, config) web_server.init_app(app, config)
......
This diff is collapsed.
...@@ -395,7 +395,8 @@ def _migrate_database(session): ...@@ -395,7 +395,8 @@ def _migrate_database(session):
_migrate_table(session, _Flask_Settings) _migrate_table(session, _Flask_Settings)
def load_configuration(session): def load_configuration(Session):
session = Session()
_migrate_database(session) _migrate_database(session)
if not session.query(_Settings).count(): if not session.query(_Settings).count():
...@@ -409,12 +410,15 @@ def load_configuration(session): ...@@ -409,12 +410,15 @@ def load_configuration(session):
session.query(ub.User).filter(ub.User.mature_content != True). \ session.query(ub.User).filter(ub.User.mature_content != True). \
update({"denied_tags": conf.config_mature_content_tags}, synchronize_session=False) update({"denied_tags": conf.config_mature_content_tags}, synchronize_session=False)
session.commit() session.commit()
session.close()
return conf return conf
def get_flask_session_key(session): def get_flask_session_key(Session):
session = Session()
flask_settings = session.query(_Flask_Settings).one_or_none() flask_settings = session.query(_Flask_Settings).one_or_none()
if flask_settings == None: if flask_settings == None:
flask_settings = _Flask_Settings(os.urandom(32)) flask_settings = _Flask_Settings(os.urandom(32))
session.add(flask_settings) session.add(flask_settings)
session.commit() session.commit()
session.close()
return flask_settings.flask_session_key return flask_settings.flask_session_key
...@@ -32,9 +32,10 @@ from sqlalchemy.orm import relationship, sessionmaker, scoped_session ...@@ -32,9 +32,10 @@ from sqlalchemy.orm import relationship, sessionmaker, scoped_session
from sqlalchemy.orm.collections import InstrumentedList from sqlalchemy.orm.collections import InstrumentedList
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
from sqlalchemy.pool import StaticPool from sqlalchemy.pool import StaticPool
from flask_login import current_user
from sqlalchemy.sql.expression import and_, true, false, text, func, or_ from sqlalchemy.sql.expression import and_, true, false, text, func, or_
from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.associationproxy import association_proxy
from flask_login import current_user
from flask import g
from babel import Locale as LC from babel import Locale as LC
from babel.core import UnknownLocaleError from babel.core import UnknownLocaleError
from flask_babel import gettext as _ from flask_babel import gettext as _
...@@ -564,7 +565,7 @@ class CalibreDB(): ...@@ -564,7 +565,7 @@ class CalibreDB():
def common_filters(self, allow_show_archived=False): def common_filters(self, allow_show_archived=False):
if not allow_show_archived: if not allow_show_archived:
archived_books = ( archived_books = (
ub.session.query(ub.ArchivedBook) g.ubsession.query(ub.ArchivedBook)
.filter(ub.ArchivedBook.user_id == int(current_user.id)) .filter(ub.ArchivedBook.user_id == int(current_user.id))
.filter(ub.ArchivedBook.is_archived == True) .filter(ub.ArchivedBook.is_archived == True)
.all() .all()
......
...@@ -27,7 +27,7 @@ import json ...@@ -27,7 +27,7 @@ import json
from shutil import copyfile from shutil import copyfile
from uuid import uuid4 from uuid import uuid4
from flask import Blueprint, request, flash, redirect, url_for, abort, Markup, Response from flask import Blueprint, request, flash, redirect, url_for, abort, Markup, Response, g
from flask_babel import gettext as _ from flask_babel import gettext as _
from flask_login import current_user, login_required from flask_login import current_user, login_required
from sqlalchemy.exc import OperationalError from sqlalchemy.exc import OperationalError
...@@ -212,10 +212,10 @@ def delete_book(book_id, book_format, jsonResponse): ...@@ -212,10 +212,10 @@ def delete_book(book_id, book_format, jsonResponse):
flash(error, category="warning") flash(error, category="warning")
if not book_format: if not book_format:
# delete book from Shelfs, Downloads, Read list # delete book from Shelfs, Downloads, Read list
ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).delete() g.ubsession.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).delete()
ub.session.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id).delete() g.ubsession.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id).delete()
ub.delete_download(book_id) ub.delete_download(book_id)
ub.session.commit() g.ubsession.commit()
# check if only this book links to: # check if only this book links to:
# author, language, series, tags, custom columns # author, language, series, tags, custom columns
......
...@@ -24,10 +24,7 @@ import io ...@@ -24,10 +24,7 @@ import io
import mimetypes import mimetypes
import re import re
import shutil import shutil
import glob
import time import time
import zipfile
import json
import unicodedata import unicodedata
from datetime import datetime, timedelta from datetime import datetime, timedelta
from tempfile import gettempdir from tempfile import gettempdir
...@@ -35,7 +32,7 @@ from tempfile import gettempdir ...@@ -35,7 +32,7 @@ from tempfile import gettempdir
import requests import requests
from babel.dates import format_datetime from babel.dates import format_datetime
from babel.units import format_unit from babel.units import format_unit
from flask import send_from_directory, make_response, redirect, abort, url_for, send_file from flask import send_from_directory, make_response, redirect, abort, url_for, g
from flask_babel import gettext as _ from flask_babel import gettext as _
from flask_login import current_user from flask_login import current_user
from sqlalchemy.sql.expression import true, false, and_, text from sqlalchemy.sql.expression import true, false, and_, text
...@@ -485,7 +482,7 @@ def delete_book_gdrive(book, book_format): ...@@ -485,7 +482,7 @@ def delete_book_gdrive(book, book_format):
def reset_password(user_id): def reset_password(user_id):
existing_user = ub.session.query(ub.User).filter(ub.User.id == user_id).first() existing_user = g.ubsession.query(ub.User).filter(ub.User.id == user_id).first()
if not existing_user: if not existing_user:
return 0, None return 0, None
if not config.get_mail_server_configured(): if not config.get_mail_server_configured():
...@@ -493,11 +490,11 @@ def reset_password(user_id): ...@@ -493,11 +490,11 @@ def reset_password(user_id):
try: try:
password = generate_random_password() password = generate_random_password()
existing_user.password = generate_password_hash(password) existing_user.password = generate_password_hash(password)
ub.session.commit() g.ubsession.commit()
send_registration_mail(existing_user.email, existing_user.nickname, password, True) send_registration_mail(existing_user.email, existing_user.nickname, password, True)
return 1, existing_user.nickname return 1, existing_user.nickname
except Exception: except Exception:
ub.session.rollback() g.ubsession.rollback()
return 0, None return 0, None
...@@ -779,11 +776,11 @@ def tags_filters(): ...@@ -779,11 +776,11 @@ def tags_filters():
def check_valid_domain(domain_text): def check_valid_domain(domain_text):
# domain_text = domain_text.split('@', 1)[-1].lower() # domain_text = domain_text.split('@', 1)[-1].lower()
sql = "SELECT * FROM registration WHERE (:domain LIKE domain and allow = 1);" sql = "SELECT * FROM registration WHERE (:domain LIKE domain and allow = 1);"
result = ub.session.query(ub.Registration).from_statement(text(sql)).params(domain=domain_text).all() result = g.ubsession.query(ub.Registration).from_statement(text(sql)).params(domain=domain_text).all()
if not len(result): if not len(result):
return False return False
sql = "SELECT * FROM registration WHERE (:domain LIKE domain and allow = 0);" sql = "SELECT * FROM registration WHERE (:domain LIKE domain and allow = 0);"
result = ub.session.query(ub.Registration).from_statement(text(sql)).params(domain=domain_text).all() result = g.ubsession.query(ub.Registration).from_statement(text(sql)).params(domain=domain_text).all()
return not len(result) return not len(result)
......
...@@ -37,7 +37,8 @@ from flask import ( ...@@ -37,7 +37,8 @@ from flask import (
current_app, current_app,
url_for, url_for,
redirect, redirect,
abort abort,
g
) )
from flask_login import current_user from flask_login import current_user
from werkzeug.datastructures import Headers from werkzeug.datastructures import Headers
...@@ -210,7 +211,7 @@ def HandleSyncRequest(): ...@@ -210,7 +211,7 @@ def HandleSyncRequest():
# generate reading state data # generate reading state data
changed_reading_states = ( changed_reading_states = (
ub.session.query(ub.KoboReadingState) g.ubsession.query(ub.KoboReadingState)
.filter(and_(func.datetime(ub.KoboReadingState.last_modified) > sync_token.reading_state_last_modified, .filter(and_(func.datetime(ub.KoboReadingState.last_modified) > sync_token.reading_state_last_modified,
ub.KoboReadingState.user_id == current_user.id, ub.KoboReadingState.user_id == current_user.id,
ub.KoboReadingState.book_id.notin_(reading_states_in_new_entitlements)))) ub.KoboReadingState.book_id.notin_(reading_states_in_new_entitlements))))
...@@ -439,19 +440,19 @@ def HandleTagCreate(): ...@@ -439,19 +440,19 @@ def HandleTagCreate():
log.debug("Received malformed v1/library/tags request.") log.debug("Received malformed v1/library/tags request.")
abort(400, description="Malformed tags POST request. Data has empty 'Name', missing 'Name' or 'Items' field") abort(400, description="Malformed tags POST request. Data has empty 'Name', missing 'Name' or 'Items' field")
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.name == name, ub.Shelf.user_id == shelf = g.ubsession.query(ub.Shelf).filter(ub.Shelf.name == name, ub.Shelf.user_id ==
current_user.id).one_or_none() current_user.id).one_or_none()
if shelf and not shelf_lib.check_shelf_edit_permissions(shelf): if shelf and not shelf_lib.check_shelf_edit_permissions(shelf):
abort(401, description="User is unauthaurized to create shelf.") abort(401, description="User is unauthaurized to create shelf.")
if not shelf: if not shelf:
shelf = ub.Shelf(user_id=current_user.id, name=name, uuid=str(uuid.uuid4())) shelf = ub.Shelf(user_id=current_user.id, name=name, uuid=str(uuid.uuid4()))
ub.session.add(shelf) g.ubsession.add(shelf)
items_unknown_to_calibre = add_items_to_shelf(items, shelf) items_unknown_to_calibre = add_items_to_shelf(items, shelf)
if items_unknown_to_calibre: if items_unknown_to_calibre:
log.debug("Received request to add unknown books to a collection. Silently ignoring items.") log.debug("Received request to add unknown books to a collection. Silently ignoring items.")
ub.session.commit() g.ubsession.commit()
return make_response(jsonify(str(shelf.uuid)), 201) return make_response(jsonify(str(shelf.uuid)), 201)
...@@ -459,7 +460,7 @@ def HandleTagCreate(): ...@@ -459,7 +460,7 @@ def HandleTagCreate():
@kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE", "PUT"]) @kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE", "PUT"])
@requires_kobo_auth @requires_kobo_auth
def HandleTagUpdate(tag_id): def HandleTagUpdate(tag_id):
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id, shelf = g.ubsession.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id,
ub.Shelf.user_id == current_user.id).one_or_none() ub.Shelf.user_id == current_user.id).one_or_none()
if not shelf: if not shelf:
log.debug("Received Kobo tag update request on a collection unknown to CalibreWeb") log.debug("Received Kobo tag update request on a collection unknown to CalibreWeb")
...@@ -483,8 +484,8 @@ def HandleTagUpdate(tag_id): ...@@ -483,8 +484,8 @@ def HandleTagUpdate(tag_id):
abort(400, description="Malformed tags POST request. Data is missing 'Name' field") abort(400, description="Malformed tags POST request. Data is missing 'Name' field")
shelf.name = name shelf.name = name
ub.session.merge(shelf) g.ubsession.merge(shelf)
ub.session.commit() g.ubsession.commit()
return make_response(' ', 200) return make_response(' ', 200)
...@@ -522,7 +523,7 @@ def HandleTagAddItem(tag_id): ...@@ -522,7 +523,7 @@ def HandleTagAddItem(tag_id):
log.debug("Received malformed v1/library/tags/<tag_id>/items/delete request.") log.debug("Received malformed v1/library/tags/<tag_id>/items/delete request.")
abort(400, description="Malformed tags POST request. Data is missing 'Items' field") abort(400, description="Malformed tags POST request. Data is missing 'Items' field")
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id, shelf = g.ubsession.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id,
ub.Shelf.user_id == current_user.id).one_or_none() ub.Shelf.user_id == current_user.id).one_or_none()
if not shelf: if not shelf:
log.debug("Received Kobo request on a collection unknown to CalibreWeb") log.debug("Received Kobo request on a collection unknown to CalibreWeb")
...@@ -535,8 +536,8 @@ def HandleTagAddItem(tag_id): ...@@ -535,8 +536,8 @@ def HandleTagAddItem(tag_id):
if items_unknown_to_calibre: if items_unknown_to_calibre:
log.debug("Received request to add an unknown book to a collection. Silently ignoring item.") log.debug("Received request to add an unknown book to a collection. Silently ignoring item.")
ub.session.merge(shelf) g.ubsession.merge(shelf)
ub.session.commit() g.ubsession.commit()
return make_response('', 201) return make_response('', 201)
...@@ -552,7 +553,7 @@ def HandleTagRemoveItem(tag_id): ...@@ -552,7 +553,7 @@ def HandleTagRemoveItem(tag_id):
log.debug("Received malformed v1/library/tags/<tag_id>/items/delete request.") log.debug("Received malformed v1/library/tags/<tag_id>/items/delete request.")
abort(400, description="Malformed tags POST request. Data is missing 'Items' field") abort(400, description="Malformed tags POST request. Data is missing 'Items' field")
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id, shelf = g.ubsession.query(ub.Shelf).filter(ub.Shelf.uuid == tag_id,
ub.Shelf.user_id == current_user.id).one_or_none() ub.Shelf.user_id == current_user.id).one_or_none()
if not shelf: if not shelf:
log.debug( log.debug(
...@@ -577,7 +578,7 @@ def HandleTagRemoveItem(tag_id): ...@@ -577,7 +578,7 @@ def HandleTagRemoveItem(tag_id):
shelf.books.filter(ub.BookShelf.book_id == book.id).delete() shelf.books.filter(ub.BookShelf.book_id == book.id).delete()
except KeyError: except KeyError:
items_unknown_to_calibre.append(item) items_unknown_to_calibre.append(item)
ub.session.commit() g.ubsession.commit()
if items_unknown_to_calibre: if items_unknown_to_calibre:
log.debug("Received request to remove an unknown book to a collecition. Silently ignoring item.") log.debug("Received request to remove an unknown book to a collecition. Silently ignoring item.")
...@@ -590,7 +591,7 @@ def HandleTagRemoveItem(tag_id): ...@@ -590,7 +591,7 @@ def HandleTagRemoveItem(tag_id):
def sync_shelves(sync_token, sync_results): def sync_shelves(sync_token, sync_results):
new_tags_last_modified = sync_token.tags_last_modified new_tags_last_modified = sync_token.tags_last_modified
for shelf in ub.session.query(ub.ShelfArchive).filter(func.datetime(ub.ShelfArchive.last_modified) > sync_token.tags_last_modified, for shelf in g.ubsession.query(ub.ShelfArchive).filter(func.datetime(ub.ShelfArchive.last_modified) > sync_token.tags_last_modified,
ub.ShelfArchive.user_id == current_user.id): ub.ShelfArchive.user_id == current_user.id):
new_tags_last_modified = max(shelf.last_modified, new_tags_last_modified) new_tags_last_modified = max(shelf.last_modified, new_tags_last_modified)
...@@ -603,7 +604,7 @@ def sync_shelves(sync_token, sync_results): ...@@ -603,7 +604,7 @@ def sync_shelves(sync_token, sync_results):
} }
}) })
for shelf in ub.session.query(ub.Shelf).filter(func.datetime(ub.Shelf.last_modified) > sync_token.tags_last_modified, for shelf in g.ubsession.query(ub.Shelf).filter(func.datetime(ub.Shelf.last_modified) > sync_token.tags_last_modified,
ub.Shelf.user_id == current_user.id): ub.Shelf.user_id == current_user.id):
if not shelf_lib.check_shelf_view_permissions(shelf): if not shelf_lib.check_shelf_view_permissions(shelf):
continue continue
...@@ -623,7 +624,7 @@ def sync_shelves(sync_token, sync_results): ...@@ -623,7 +624,7 @@ def sync_shelves(sync_token, sync_results):
"ChangedTag": tag "ChangedTag": tag
}) })
sync_token.tags_last_modified = new_tags_last_modified sync_token.tags_last_modified = new_tags_last_modified
ub.session.commit() g.ubsession.commit()
# Creates a Kobo "Tag" object from a ub.Shelf object # Creates a Kobo "Tag" object from a ub.Shelf object
...@@ -700,11 +701,11 @@ def HandleStateRequest(book_uuid): ...@@ -700,11 +701,11 @@ def HandleStateRequest(book_uuid):
update_results_response["StatusInfoResult"] = {"Result": "Success"} update_results_response["StatusInfoResult"] = {"Result": "Success"}
except (KeyError, TypeError, ValueError, StatementError): except (KeyError, TypeError, ValueError, StatementError):
log.debug("Received malformed v1/library/<book_uuid>/state request.") log.debug("Received malformed v1/library/<book_uuid>/state request.")
ub.session.rollback() g.ubsession.rollback()
abort(400, description="Malformed request data is missing 'ReadingStates' key") abort(400, description="Malformed request data is missing 'ReadingStates' key")
ub.session.merge(kobo_reading_state) g.ubsession.merge(kobo_reading_state)
ub.session.commit() g.ubsession.commit()
return jsonify({ return jsonify({
"RequestResult": "Success", "RequestResult": "Success",
"UpdateResults": [update_results_response], "UpdateResults": [update_results_response],
...@@ -732,7 +733,7 @@ def get_ub_read_status(kobo_read_status): ...@@ -732,7 +733,7 @@ def get_ub_read_status(kobo_read_status):
def get_or_create_reading_state(book_id): def get_or_create_reading_state(book_id):
book_read = ub.session.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id, book_read = g.ubsession.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id,
ub.ReadBook.user_id == current_user.id).one_or_none() ub.ReadBook.user_id == current_user.id).one_or_none()
if not book_read: if not book_read:
book_read = ub.ReadBook(user_id=current_user.id, book_id=book_id) book_read = ub.ReadBook(user_id=current_user.id, book_id=book_id)
...@@ -741,8 +742,8 @@ def get_or_create_reading_state(book_id): ...@@ -741,8 +742,8 @@ def get_or_create_reading_state(book_id):
kobo_reading_state.current_bookmark = ub.KoboBookmark() kobo_reading_state.current_bookmark = ub.KoboBookmark()
kobo_reading_state.statistics = ub.KoboStatistics() kobo_reading_state.statistics = ub.KoboStatistics()
book_read.kobo_reading_state = kobo_reading_state book_read.kobo_reading_state = kobo_reading_state
ub.session.add(book_read) g.ubsession.add(book_read)
ub.session.commit() g.ubsession.commit()
return book_read.kobo_reading_state return book_read.kobo_reading_state
...@@ -835,7 +836,7 @@ def HandleBookDeletionRequest(book_uuid): ...@@ -835,7 +836,7 @@ def HandleBookDeletionRequest(book_uuid):
book_id = book.id book_id = book.id
archived_book = ( archived_book = (
ub.session.query(ub.ArchivedBook) g.ubsession.query(ub.ArchivedBook)
.filter(ub.ArchivedBook.book_id == book_id) .filter(ub.ArchivedBook.book_id == book_id)
.first() .first()
) )
...@@ -844,8 +845,8 @@ def HandleBookDeletionRequest(book_uuid): ...@@ -844,8 +845,8 @@ def HandleBookDeletionRequest(book_uuid):
archived_book.is_archived = True archived_book.is_archived = True
archived_book.last_modified = datetime.datetime.utcnow() archived_book.last_modified = datetime.datetime.utcnow()
ub.session.merge(archived_book) g.ubsession.merge(archived_book)
ub.session.commit() g.ubsession.commit()
return ("", 204) return ("", 204)
......
...@@ -102,7 +102,7 @@ def requires_kobo_auth(f): ...@@ -102,7 +102,7 @@ def requires_kobo_auth(f):
auth_token = get_auth_token() auth_token = get_auth_token()
if auth_token is not None: if auth_token is not None:
user = ( user = (
ub.session.query(ub.User) g.ubsession.query(ub.User)
.join(ub.RemoteAuthToken) .join(ub.RemoteAuthToken)
.filter(ub.RemoteAuthToken.auth_token == auth_token).filter(ub.RemoteAuthToken.token_type==1) .filter(ub.RemoteAuthToken.auth_token == auth_token).filter(ub.RemoteAuthToken.token_type==1)
.first() .first()
...@@ -135,7 +135,7 @@ def generate_auth_token(user_id): ...@@ -135,7 +135,7 @@ def generate_auth_token(user_id):
) )
else: else:
# Invalidate any prevously generated Kobo Auth token for this user. # Invalidate any prevously generated Kobo Auth token for this user.
auth_token = ub.session.query(ub.RemoteAuthToken).filter( auth_token = g.ubsession.query(ub.RemoteAuthToken).filter(
ub.RemoteAuthToken.user_id == user_id ub.RemoteAuthToken.user_id == user_id
).filter(ub.RemoteAuthToken.token_type==1).first() ).filter(ub.RemoteAuthToken.token_type==1).first()
...@@ -146,8 +146,8 @@ def generate_auth_token(user_id): ...@@ -146,8 +146,8 @@ def generate_auth_token(user_id):
auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8") auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8")
auth_token.token_type = 1 auth_token.token_type = 1
ub.session.add(auth_token) g.ubsession.add(auth_token)
ub.session.commit() g.ubsession.commit()
return render_title_template( return render_title_template(
"generate_kobo_auth_url.html", "generate_kobo_auth_url.html",
title=_(u"Kobo Setup"), title=_(u"Kobo Setup"),
...@@ -162,7 +162,7 @@ def generate_auth_token(user_id): ...@@ -162,7 +162,7 @@ def generate_auth_token(user_id):
@login_required @login_required
def delete_auth_token(user_id): def delete_auth_token(user_id):
# Invalidate any prevously generated Kobo Auth token for this user. # Invalidate any prevously generated Kobo Auth token for this user.
ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.user_id == user_id)\ g.ubsession.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.user_id == user_id)\
.filter(ub.RemoteAuthToken.token_type==1).delete() .filter(ub.RemoteAuthToken.token_type==1).delete()
ub.session.commit() g.ubsession.commit()
return "" return ""
...@@ -24,7 +24,7 @@ from __future__ import division, print_function, unicode_literals ...@@ -24,7 +24,7 @@ from __future__ import division, print_function, unicode_literals
import json import json
from functools import wraps from functools import wraps
from flask import session, request, make_response, abort from flask import session, request, make_response, abort, g
from flask import Blueprint, flash, redirect, url_for from flask import Blueprint, flash, redirect, url_for
from flask_babel import gettext as _ from flask_babel import gettext as _
from flask_dance.consumer import oauth_authorized, oauth_error from flask_dance.consumer import oauth_authorized, oauth_error
...@@ -74,7 +74,7 @@ def register_user_with_oauth(user=None): ...@@ -74,7 +74,7 @@ def register_user_with_oauth(user=None):
else: else:
for oauth_key in all_oauth.keys(): for oauth_key in all_oauth.keys():
# Find this OAuth token in the database, or create it # Find this OAuth token in the database, or create it
query = ub.session.query(ub.OAuth).filter_by( query = g.ubsession.query(ub.OAuth).filter_by(
provider=oauth_key, provider=oauth_key,
provider_user_id=session[str(oauth_key) + "_oauth_user_id"], provider_user_id=session[str(oauth_key) + "_oauth_user_id"],
) )
...@@ -85,10 +85,10 @@ def register_user_with_oauth(user=None): ...@@ -85,10 +85,10 @@ def register_user_with_oauth(user=None):
# no found, return error # no found, return error
return return
try: try:
ub.session.commit() g.ubsession.commit()
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
ub.session.rollback() g.ubsession.rollback()
def logout_oauth_user(): def logout_oauth_user():
...@@ -99,19 +99,19 @@ def logout_oauth_user(): ...@@ -99,19 +99,19 @@ def logout_oauth_user():
if ub.oauth_support: if ub.oauth_support:
oauthblueprints = [] oauthblueprints = []
if not ub.session.query(ub.OAuthProvider).count(): if not g.ubsession.query(ub.OAuthProvider).count():
oauthProvider = ub.OAuthProvider() oauthProvider = ub.OAuthProvider()
oauthProvider.provider_name = "github" oauthProvider.provider_name = "github"
oauthProvider.active = False oauthProvider.active = False
ub.session.add(oauthProvider) g.ubsession.add(oauthProvider)
ub.session.commit() g.ubsession.commit()
oauthProvider = ub.OAuthProvider() oauthProvider = ub.OAuthProvider()
oauthProvider.provider_name = "google" oauthProvider.provider_name = "google"
oauthProvider.active = False oauthProvider.active = False
ub.session.add(oauthProvider) g.ubsession.add(oauthProvider)
ub.session.commit() g.ubsession.commit()
oauth_ids = ub.session.query(ub.OAuthProvider).all() oauth_ids = g.ubsession.query(ub.OAuthProvider).all()
ele1 = dict(provider_name='github', ele1 = dict(provider_name='github',
id=oauth_ids[0].id, id=oauth_ids[0].id,
active=oauth_ids[0].active, active=oauth_ids[0].active,
...@@ -141,7 +141,7 @@ if ub.oauth_support: ...@@ -141,7 +141,7 @@ if ub.oauth_support:
scope=element['scope'] scope=element['scope']
) )
element['blueprint'] = blueprint element['blueprint'] = blueprint
element['blueprint'].backend = OAuthBackend(ub.OAuth, ub.session, str(element['id']), element['blueprint'].backend = OAuthBackend(ub.OAuth, g.ubsession, str(element['id']),
user=current_user, user_required=True) user=current_user, user_required=True)
app.register_blueprint(blueprint, url_prefix="/login") app.register_blueprint(blueprint, url_prefix="/login")
if element['active']: if element['active']:
...@@ -185,7 +185,7 @@ if ub.oauth_support: ...@@ -185,7 +185,7 @@ if ub.oauth_support:
session[provider_id + "_oauth_token"] = token session[provider_id + "_oauth_token"] = token
# Find this OAuth token in the database, or create it # Find this OAuth token in the database, or create it
query = ub.session.query(ub.OAuth).filter_by( query = g.ubsession.query(ub.OAuth).filter_by(
provider=provider_id, provider=provider_id,
provider_user_id=provider_user_id, provider_user_id=provider_user_id,
) )
...@@ -200,11 +200,11 @@ if ub.oauth_support: ...@@ -200,11 +200,11 @@ if ub.oauth_support:
token=token, token=token,
) )
try: try:
ub.session.add(oauth_entry) g.ubsession.add(oauth_entry)
ub.session.commit() g.ubsession.commit()
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
ub.session.rollback() g.ubsession.rollback()
# Disable Flask-Dance's default behavior for saving the OAuth token # Disable Flask-Dance's default behavior for saving the OAuth token
# Value differrs depending on flask-dance version # Value differrs depending on flask-dance version
...@@ -212,7 +212,7 @@ if ub.oauth_support: ...@@ -212,7 +212,7 @@ if ub.oauth_support:
def bind_oauth_or_register(provider_id, provider_user_id, redirect_url, provider_name): def bind_oauth_or_register(provider_id, provider_user_id, redirect_url, provider_name):
query = ub.session.query(ub.OAuth).filter_by( query = g.ubsession.query(ub.OAuth).filter_by(
provider=provider_id, provider=provider_id,
provider_user_id=provider_user_id, provider_user_id=provider_user_id,
) )
...@@ -230,13 +230,13 @@ if ub.oauth_support: ...@@ -230,13 +230,13 @@ if ub.oauth_support:
if current_user and current_user.is_authenticated: if current_user and current_user.is_authenticated:
oauth_entry.user = current_user oauth_entry.user = current_user
try: try:
ub.session.add(oauth_entry) g.ubsession.add(oauth_entry)
ub.session.commit() g.ubsession.commit()
flash(_(u"Link to %(oauth)s Succeeded", oauth=provider_name), category="success") flash(_(u"Link to %(oauth)s Succeeded", oauth=provider_name), category="success")
return redirect(url_for('web.profile')) return redirect(url_for('web.profile'))
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
ub.session.rollback() g.ubsession.rollback()
else: else:
flash(_(u"Login failed, No User Linked With OAuth Account"), category="error") flash(_(u"Login failed, No User Linked With OAuth Account"), category="error")
log.info('Login failed, No User Linked With OAuth Account') log.info('Login failed, No User Linked With OAuth Account')
...@@ -253,7 +253,7 @@ if ub.oauth_support: ...@@ -253,7 +253,7 @@ if ub.oauth_support:
def get_oauth_status(): def get_oauth_status():
status = [] status = []
query = ub.session.query(ub.OAuth).filter_by( query = g.ubsession.query(ub.OAuth).filter_by(
user_id=current_user.id, user_id=current_user.id,
) )
try: try:
...@@ -268,7 +268,7 @@ if ub.oauth_support: ...@@ -268,7 +268,7 @@ if ub.oauth_support:
def unlink_oauth(provider): def unlink_oauth(provider):
if request.host_url + 'me' != request.referrer: if request.host_url + 'me' != request.referrer:
pass pass
query = ub.session.query(ub.OAuth).filter_by( query = g.ubsession.query(ub.OAuth).filter_by(
provider=provider, provider=provider,
user_id=current_user.id, user_id=current_user.id,
) )
...@@ -277,13 +277,13 @@ if ub.oauth_support: ...@@ -277,13 +277,13 @@ if ub.oauth_support:
if current_user and current_user.is_authenticated: if current_user and current_user.is_authenticated:
oauth_entry.user = current_user oauth_entry.user = current_user
try: try:
ub.session.delete(oauth_entry) g.ubsession.delete(oauth_entry)
ub.session.commit() g.ubsession.commit()
logout_oauth_user() logout_oauth_user()
flash(_(u"Unlink to %(oauth)s Succeeded", oauth=oauth_check[provider]), category="success") flash(_(u"Unlink to %(oauth)s Succeeded", oauth=oauth_check[provider]), category="success")
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
ub.session.rollback() g.ubsession.rollback()
flash(_(u"Unlink to %(oauth)s Failed", oauth=oauth_check[provider]), category="error") flash(_(u"Unlink to %(oauth)s Failed", oauth=oauth_check[provider]), category="error")
except NoResultFound: except NoResultFound:
log.warning("oauth %s for user %d not found", provider, current_user.id) log.warning("oauth %s for user %d not found", provider, current_user.id)
......
...@@ -33,7 +33,7 @@ from werkzeug.security import check_password_hash ...@@ -33,7 +33,7 @@ from werkzeug.security import check_password_hash
from . import constants, logger, config, db, calibre_db, ub, services, get_locale, isoLanguages from . import constants, logger, config, db, calibre_db, ub, services, get_locale, isoLanguages
from .helper import get_download_link, get_book_cover from .helper import get_download_link, get_book_cover
from .pagination import Pagination from .pagination import Pagination
from .web import render_read_books, download_required, load_user_from_request from .web import render_read_books, load_user_from_request
from flask_babel import gettext as _ from flask_babel import gettext as _
from babel import Locale as LC from babel import Locale as LC
from babel.core import UnknownLocaleError from babel.core import UnknownLocaleError
...@@ -128,7 +128,7 @@ def feed_best_rated(): ...@@ -128,7 +128,7 @@ def feed_best_rated():
@requires_basic_auth_if_no_ano @requires_basic_auth_if_no_ano
def feed_hot(): def feed_hot():
off = request.args.get("offset") or 0 off = request.args.get("offset") or 0
all_books = ub.session.query(ub.Downloads, func.count(ub.Downloads.book_id)).order_by( all_books = g.ubsession.query(ub.Downloads, func.count(ub.Downloads.book_id)).order_by(
func.count(ub.Downloads.book_id).desc()).group_by(ub.Downloads.book_id) func.count(ub.Downloads.book_id).desc()).group_by(ub.Downloads.book_id)
hot_books = all_books.offset(off).limit(config.config_books_per_page) hot_books = all_books.offset(off).limit(config.config_books_per_page)
entries = list() entries = list()
...@@ -361,17 +361,17 @@ def feed_shelfindex(): ...@@ -361,17 +361,17 @@ def feed_shelfindex():
def feed_shelf(book_id): def feed_shelf(book_id):
off = request.args.get("offset") or 0 off = request.args.get("offset") or 0
if current_user.is_anonymous: if current_user.is_anonymous:
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, shelf = g.ubsession.query(ub.Shelf).filter(ub.Shelf.is_public == 1,
ub.Shelf.id == book_id).first() ub.Shelf.id == book_id).first()
else: else:
shelf = ub.session.query(ub.Shelf).filter(or_(and_(ub.Shelf.user_id == int(current_user.id), shelf = g.ubsession.query(ub.Shelf).filter(or_(and_(ub.Shelf.user_id == int(current_user.id),
ub.Shelf.id == book_id), ub.Shelf.id == book_id),
and_(ub.Shelf.is_public == 1, and_(ub.Shelf.is_public == 1,
ub.Shelf.id == book_id))).first() ub.Shelf.id == book_id))).first()
result = list() result = list()
# user is allowed to access shelf # user is allowed to access shelf
if shelf: if shelf:
books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == book_id).order_by( books_in_shelf = g.ubsession.query(ub.BookShelf).filter(ub.BookShelf.shelf == book_id).order_by(
ub.BookShelf.order.asc()).all() ub.BookShelf.order.asc()).all()
for book in books_in_shelf: for book in books_in_shelf:
cur_book = calibre_db.get_book(book.book_id) cur_book = calibre_db.get_book(book.book_id)
...@@ -427,7 +427,7 @@ def check_auth(username, password): ...@@ -427,7 +427,7 @@ def check_auth(username, password):
username = username.encode('windows-1252') username = username.encode('windows-1252')
except UnicodeEncodeError: except UnicodeEncodeError:
username = username.encode('utf-8') username = username.encode('utf-8')
user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == user = g.ubsession.query(ub.User).filter(func.lower(ub.User.nickname) ==
username.decode('utf-8').lower()).first() username.decode('utf-8').lower()).first()
return bool(user and check_password_hash(str(user.password), password)) return bool(user and check_password_hash(str(user.password), password))
......
This diff is collapsed.
...@@ -46,12 +46,13 @@ from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, ...@@ -46,12 +46,13 @@ from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float,
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.orm.attributes import flag_modified
from sqlalchemy.orm import backref, relationship, sessionmaker, Session from sqlalchemy.orm import backref, relationship, sessionmaker, Session
from sqlalchemy.orm import relationship, scoped_session
from werkzeug.security import generate_password_hash from werkzeug.security import generate_password_hash
from . import constants from . import constants
session = None Scoped_Session = None
app_DB_path = None app_DB_path = None
Base = declarative_base() Base = declarative_base()
searched_ids = {} searched_ids = {}
...@@ -219,9 +220,9 @@ class UserBase: ...@@ -219,9 +220,9 @@ class UserBase:
except AttributeError: except AttributeError:
pass pass
try: try:
session.commit() g.ubsession.commit()
except (exc.OperationalError, exc.InvalidRequestError): except (exc.OperationalError, exc.InvalidRequestError):
session.rollback() g.ubsession.rollback()
# ToDo: Error message # ToDo: Error message
def __repr__(self): def __repr__(self):
...@@ -279,6 +280,7 @@ class Anonymous(AnonymousUserMixin, UserBase): ...@@ -279,6 +280,7 @@ class Anonymous(AnonymousUserMixin, UserBase):
self.loadSettings() self.loadSettings()
def loadSettings(self): def loadSettings(self):
session = Scoped_Session()
data = session.query(User).filter(User.role.op('&')(constants.ROLE_ANONYMOUS) == constants.ROLE_ANONYMOUS)\ data = session.query(User).filter(User.role.op('&')(constants.ROLE_ANONYMOUS) == constants.ROLE_ANONYMOUS)\
.first() # type: User .first() # type: User
self.nickname = data.nickname self.nickname = data.nickname
...@@ -297,6 +299,7 @@ class Anonymous(AnonymousUserMixin, UserBase): ...@@ -297,6 +299,7 @@ class Anonymous(AnonymousUserMixin, UserBase):
# Initialize flask_session once # Initialize flask_session once
if 'view' not in flask_session: if 'view' not in flask_session:
flask_session['view']={} flask_session['view']={}
session.close()
def role_admin(self): def role_admin(self):
...@@ -673,18 +676,18 @@ def clean_database(session): ...@@ -673,18 +676,18 @@ def clean_database(session):
# Save downloaded books per user in calibre-web's own database # Save downloaded books per user in calibre-web's own database
def update_download(book_id, user_id): def update_download(book_id, user_id):
check = session.query(Downloads).filter(Downloads.user_id == user_id).filter(Downloads.book_id == book_id).first() check = g.ubsession.query(Downloads).filter(Downloads.user_id == user_id).filter(Downloads.book_id == book_id).first()
if not check: if not check:
new_download = Downloads(user_id=user_id, book_id=book_id) new_download = Downloads(user_id=user_id, book_id=book_id)
session.add(new_download) g.ubsession.add(new_download)
session.commit() g.ubsession.commit()
# Delete non exisiting downloaded books in calibre-web's own database # Delete non exisiting downloaded books in calibre-web's own database
def delete_download(book_id): def delete_download(book_id):
session.query(Downloads).filter(book_id == Downloads.book_id).delete() g.ubsession.query(Downloads).filter(book_id == Downloads.book_id).delete()
session.commit() g.ubsession.commit()
# Generate user Guest (translated text), as anonymous user, no rights # Generate user Guest (translated text), as anonymous user, no rights
def create_anonymous_user(session): def create_anonymous_user(session):
...@@ -716,18 +719,21 @@ def create_admin_user(session): ...@@ -716,18 +719,21 @@ def create_admin_user(session):
except Exception: except Exception:
session.rollback() session.rollback()
def create_session():
pass
def init_db(app_db_path): def init_db(app_db_path):
# Open session for database connection # Open session for database connection
global session global Scoped_Session
global app_DB_path global app_DB_path
global engine
app_DB_path = app_db_path app_DB_path = app_db_path
engine = create_engine(u'sqlite:///{0}'.format(app_db_path), echo=False) engine = create_engine(u'sqlite:///{0}'.format(app_db_path), echo=False)
Session = sessionmaker() Scoped_Session = scoped_session(sessionmaker()) # sessionmaker()
Session.configure(bind=engine) Scoped_Session.configure(bind=engine)
session = Session() session = Scoped_Session()
if os.path.exists(app_db_path): if os.path.exists(app_db_path):
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
...@@ -737,6 +743,7 @@ def init_db(app_db_path): ...@@ -737,6 +743,7 @@ def init_db(app_db_path):
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
create_admin_user(session) create_admin_user(session)
create_anonymous_user(session) create_anonymous_user(session)
session.close()
def dispose(): def dispose():
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment