Passed
Push — mvp ( d4ca14...cc6b3c )
by Yohann
01:31
created

app.logout()   A

Complexity

Conditions 2

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 2
nop 0
1
import re
2
import secrets
3
from datetime import datetime
4
from flask import Flask, render_template, redirect, url_for, request, session
5
from flask_sqlalchemy import SQLAlchemy
6
7
from src.security import sha512
8
9
app = Flask(__name__)
10
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///bday.db'
11
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
12
db = SQLAlchemy(app)
13
14
app.config.from_object(__name__)
15
app.secret_key = secrets.token_urlsafe(32)
16
17
USERNAME_PATTERN = r'^([\w -]){4,32}$'
18
PASSWORD_PATTERN = r'^(.*(?=.{8,})(?=.*[a-zA-Z])(?=.*\d).*){8,32}$'
19
20
21
# DB Model
22
class User(db.Model):
23
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
24
    pseudo = db.Column(db.String(32))
25
    password = db.Column(db.String(128))
26
    birthday = db.Column(db.String(10), default=None)
27
28
29
class Birthday(db.Model):
30
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
31
    user_id = db.Column(db.Integer)
32
    person_name = db.Column(db.String(32))
33
    person_birthday = db.Column(db.String(10))
34
35
36
db.drop_all()
37
db.create_all()
38
39
40
@app.route('/', methods=('GET', 'POST'))
41
def index_page():
42
    return render_template('index.jinja2')
43
44
45
@app.route('/auth/login', methods=('GET', 'POST'))
46
def login_page():
47
    if session.get('user'):
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable session does not seem to be defined.
Loading history...
48
        return redirect(url_for('dashboard_page'))
49
    if request.method == 'POST':
50
        username = request.form['username']
51
        password = request.form['password']
52
53
        if username and password:
54
            login = User.query.filter_by(
55
                pseudo=username,
56
                password=sha512(password)
57
            ).first()
58
59
            if login is not None:
60
                session['user'] = {'name': username}
61
                return redirect(url_for('dashboard_page'))
62
63
    return render_template('auth/login.jinja2')
64
65
66
@app.route('/auth/register', methods=('GET', 'POST'))
67
def register_page():
68
    if request.method == 'POST':
69
        username = request.form['username']
70
        password = request.form['password']
71
        confirm_password = request.form['confirm_password']
72
73
        if (
74
                re.match(USERNAME_PATTERN, username)
75
                and re.match(PASSWORD_PATTERN, password)
76
                and confirm_password
77
                and confirm_password == password
78
        ):
79
            new_user = User(
80
                pseudo=username,
81
                password=sha512(password)
82
            )
83
84
            db.session.add(new_user)
85
            db.session.commit()
86
87
            session['user'] = {'name': username}
88
            return redirect(url_for('dashboard_page'))
89
90
    return render_template(
91
        'auth/register.jinja2',
92
        USERNAME_PATTERN=USERNAME_PATTERN,
93
        PASSWORD_PATTERN=PASSWORD_PATTERN
94
    )
95
96
97
@app.route('/dashboard', methods=('GET', 'POST'))
98
def dashboard_page():
99
    user = session.get('user')
100
101
    if not user:
102
        return redirect(url_for('login_page'))
103
104
    if not user.get('name'):
105
        return redirect(url_for('login_page'))
106
107
    if request.method == 'POST':
108
        username = request.form['username']
109
        date = request.form['date']
110
111
        if re.match(USERNAME_PATTERN, username) and date:
112
            new_birthday = Birthday(person_name=username, person_birthday=date)
113
            db.session.add(new_birthday)
114
            db.session.commit()
115
116
    return render_template('dashboard.jinja2')
117
118
119
@app.route('/auth/delete', methods=('GET', 'POST'))
120
def delete_account_page():
121
    user = session.get('user')
122
123
    if not user:
124
        return redirect(url_for('login_page'))
125
126
    if not user.get('name'):
127
        return redirect(url_for('login_page'))
128
    if request.method == 'POST' and user.get('name') == request.form.get(
129
            'account_name'
130
    ):
131
        db.session.delete(User.query.filter_by(pseudo=user.get('name')).first())
132
        db.session.commit()
133
        return redirect(url_for('logout'))
134
    return render_template('auth/delete.jinja2')
135
136
137
@app.route('/legal')
138
def legal_page():
139
    return render_template('legal.jinja2')
140
141
142
@app.route('/auth/edit', methods=('GET', 'POST'))
143
def edit_page():
144
    user = session.get('user')
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable session does not seem to be defined.
Loading history...
145
146
    if not user:
147
        return redirect(url_for('login_page'))
148
149
    if not user.get('name'):
150
        return redirect(url_for('login_page'))
151
152
    if request.method == 'POST':
153
        if request.form.get('new_password'):
154
            new_password = request.form['new_password']
155
            confirm_password = request.form['confirm_new_password']
156
            old_password = request.form['old_password']
157
158
            if (
159
                    User.query.filter_by(
160
                        pseudo=user.get('name'), password=sha512(old_password)
161
                    ).first()
162
                    and new_password == confirm_password
163
            ):
164
                user = User.query.filter_by(pseudo=user.get('name')).first()
165
                user.password = sha512(new_password)
166
                db.session.commit()
167
168
        elif request.form.get('new_username'):
169
            new_username = request.form['new_username']
170
            confirm_username = request.form['confirm_new_username']
171
172
            if (
173
                    new_username == confirm_username
174
                    and not User.query.filter_by(pseudo=new_username).first()
175
            ):
176
                user = User.query.filter_by(pseudo=user.get('name')).first()
177
                user.pseudo = new_username
178
                db.session.commit()
179
180
                session['user'] = {'name': new_username}
181
182
    return render_template('auth/edit.jinja2')
183
184
185
@app.route('/api/search/<user>')
186
def search_user(user):
187
    found_user: User = User.query.filter_by(pseudo=user).first()
188
    if not found_user:
189
        return {}
190
191
    return {
192
        'id': found_user.id,
193
        'name': found_user.pseudo,
194
        'birthday': found_user.birthday
195
    }
196
197
198
@app.route('/logout/')
199
def logout():
200
    if session.get('user'):
201
        session.pop('user')
202
203
    return redirect(url_for('index_page'))
204
205
206
if __name__ == '__main__':
207
    app.run(debug=True)
208