osohq / oso

Deprecated: See README
Apache License 2.0
3.48k stars 177 forks source link

Python: Recursion error #1469

Open AstraLuma opened 2 years ago

AstraLuma commented 2 years ago

Pretty sure this is a regression introduced by #1440

If get_user() accesses the database via oso's ScopedSession and get_checked_permissions() returns None, infinite recursion happens.

    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 318, in _load_user
    user = self._user_callback(user_id)
  File "/var/www/myapp/web/auth.py", line 26, in load_user
    return db.session.query(User).filter(User.id == user_id).first()
  File "<string>", line 2, in query

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 24, in _proxied
    return self.registry()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1006, in __call__
    key = self.scopefunc()
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy_oso/session.py", line 181, in _scopefunc
    return (get_oso(), perms, get_user(), scopefunc())
  File "/var/www/myapp/core.py", line 124, in <lambda>
    get_user=lambda: flask_login.current_user._get_current_object(),
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 346, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 310, in _load_user
    if self._session_protection_failed():
  File "/usr/local/lib/python3.8/site-packages/flask_login/login_manager.py", line 340, in _session_protection_failed
    ident = self._session_identifier_generator()
  File "/usr/local/lib/python3.8/site-packages/flask_login/utils.py", line 367, in _create_identifier
    user_agent = request.headers.get('User-Agent')
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 347, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python3.8/site-packages/flask/globals.py", line 36, in _lookup_req_object
    top = _request_ctx_stack.top
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 168, in top
    return self._local.stack[-1]
  File "/usr/local/lib/python3.8/site-packages/werkzeug/local.py", line 72, in __getattr__
    return self.__storage__[self.__ident_func__()][name]
RecursionError: maximum recursion depth exceeded while calling a Python object
AstraLuma commented 2 years ago

I'm pretty sure it's a regression because my initial work around hit a similar problem, so my version ended up with:

def scoped_session(
    get_oso,
    get_user,
    get_checked_permissions,
    scopefunc=None,
    **kwargs,
):
    from sqlalchemy_oso.session import authorized_sessionmaker
    from sqlalchemy import orm
    scopefunc = scopefunc or (lambda: None)

    def _scopefunc():
        cperms = get_checked_permissions()
        if cperms is None:
            checked_permissions = None
            return scopefunc()
            # Note: get_user() often needs database access, so don't call that in this branch.
        else:
            checked_permissions = frozenset(cperms.items())
            return (get_oso(), checked_permissions, get_user(), scopefunc())

    factory = authorized_sessionmaker(
        get_oso, get_user, get_checked_permissions, **kwargs
    )

    return orm.scoped_session(factory, scopefunc=_scopefunc)
dhatch commented 2 years ago

Hi @AstraLuma. Sorry for the delay getting back to you! I think this issue is caused by your use of scoped session to access User. The get_user function may access the database, but it cannot use an Oso session to do so, otherwise you end up with recursion as you've noted.

To get around this, most users will use an 'unauthorized' session to retrieve the current user. You'll need an authorized session and an unauthorized session for every request.

You can see an example in this app.

This workaround you presented is interesting and could be an enhancement to the scoped_session API. I think you'd still hit a recursive get_user call when the AuthorizedSession is constructed though (see here). Do you see the recursive query issue with your workaround?

One enhancement we could add is to avoid calling get_user if get_checked_permissions returns None in session construction.

AstraLuma commented 2 years ago

My current app just uses a non-oso session.

dhatch commented 2 years ago

Within get_user()?

AstraLuma commented 2 years ago

Yeah

kkirsche commented 1 year ago

Does this overlap with https://github.com/osohq/oso/issues/1579 / did https://github.com/osohq/oso/pull/1581 address this issue?

AstraLuma commented 1 year ago

I don't think so, it looks like different code paths. But we ended up not using oso-sqlalchemy (just vanilla oso), so I don't have current code handy to check.

kkirsche commented 1 year ago

No worries, I figured I'd check in case. Thanks :)