File size: 1,294 Bytes
43d5999
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from urllib.parse import urlparse

from flask import flash, redirect, session, url_for
from flask_jwt_extended import create_access_token


def _safe_next(relay_state: str | None) -> str | None:
    if not relay_state:
        return None
    parsed = urlparse(relay_state)
    if parsed.netloc:
        return None
    if not relay_state.startswith('/'):
        return None
    return relay_state


def establish_user_session(user, relay_state: str | None = None, auth_method: str = 'password'):
    """Create a browser session + JWT for the provided user."""
    session['user_id'] = user.id
    session['username'] = user.username
    session['is_admin'] = user.is_admin
    session['auth_method'] = auth_method

    access_token = create_access_token(identity=str(user.id))
    session['access_token'] = access_token

    if user.password_change_required and auth_method != 'saml':
        flash('You must change your password before continuing', 'warning')
        target = url_for('web.change_password')
    else:
        target = _safe_next(relay_state) or url_for('web.dashboard')
        flash('Logged in successfully', 'success')

    response = redirect(target)
    response.set_cookie('access_token', access_token, httponly=False, secure=False, samesite='Lax')
    return response