diff --git a/cps/web.py b/cps/web.py index ffa6a97c..5a90ae34 100644 --- a/cps/web.py +++ b/cps/web.py @@ -39,7 +39,7 @@ from flask_babel import gettext as _ from flask_login import login_user, logout_user, login_required, current_user from sqlalchemy.exc import IntegrityError from sqlalchemy.sql.expression import text, func, true, false, not_, and_, exists, or_ -from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import default_exceptions, FailedDependency from werkzeug.datastructures import Headers from werkzeug.security import generate_password_hash, check_password_hash @@ -111,6 +111,14 @@ for ex in default_exceptions: elif ex == 500: app.register_error_handler(ex, internal_error) + +# Only way of catching the LDAPException upon logging in with LDAP server down +@app.errorhandler(services.ldap.LDAPException) +def handle_exception(e): + log.debug('LDAP server not accessible while trying to login to opds feed') + return error_http(FailedDependency()) + + web = Blueprint('web', __name__) log = logger.create() @@ -156,7 +164,7 @@ def load_user_from_auth_header(header_val): except (TypeError, UnicodeDecodeError, binascii.Error): pass user = _fetch_user_by_name(basic_username) - if config.config_login_type == constants.LOGIN_LDAP and services.ldap: + if user and config.config_login_type == constants.LOGIN_LDAP and services.ldap: if services.ldap.bind_user(str(user.password), basic_password): return user if user and check_password_hash(str(user.password), basic_password):