|
18 | 18 | from .apis import api_bp as api_bp_v1
|
19 | 19 | from .views import view_bp, oauth_bp
|
20 | 20 | from .util.extensions import db, migrate, ma, login_manager, assets, cache
|
21 |
| -from .models import User, ActiveToken |
| 21 | +from .models import User, ActiveToken, Account |
22 | 22 | from .util import generate_content_hash
|
23 | 23 |
|
24 | 24 |
|
@@ -119,20 +119,28 @@ def create_app() -> Flask:
|
119 | 119 |
|
120 | 120 | @login_manager.user_loader
|
121 | 121 | def load_user(id):
|
| 122 | + """Load a user from the database""" |
| 123 | + |
122 | 124 | user_with_token = (
|
123 |
| - db.session.query(ActiveToken.token, User) |
| 125 | + db.session.query(ActiveToken.token, Account.provider, User) |
124 | 126 | .select_from(User)
|
125 | 127 | .outerjoin(ActiveToken, User.id == ActiveToken.user_id)
|
| 128 | + .outerjoin(Account, Account.userId == User.id) |
126 | 129 | .filter(User.id == id)
|
127 | 130 | .first()
|
128 | 131 | )
|
129 | 132 |
|
| 133 | + # In case the user id is sent but it's no longer in the database |
| 134 | + if not user_with_token: |
| 135 | + return None |
| 136 | + |
130 | 137 | # The above query returns a tuple of an API token and a User object
|
131 | 138 | # However, Flask-Login expects a User object, so we have to set the
|
132 | 139 | # active token manually
|
133 |
| - user_with_token[1].active_token = user_with_token[0] |
| 140 | + user_with_token[2].provider = user_with_token[1] |
| 141 | + user_with_token[2].active_token = user_with_token[0] |
134 | 142 |
|
135 |
| - return user_with_token[1] |
| 143 | + return user_with_token[2] |
136 | 144 |
|
137 | 145 | @login_manager.unauthorized_handler
|
138 | 146 | def handle_needs_login():
|
|
0 commit comments