From 8c3db2d1d8bbc33f3e4ecae8a14581010a10c8da Mon Sep 17 00:00:00 2001
From: MaximeOLIVA <maxime.oliva@etu.univ-cotedazur.fr>
Date: Tue, 14 Feb 2023 14:17:50 +0100
Subject: [PATCH] fix lab2 and 3 FINAL

---
 .DS_Store                                     | Bin 8196 -> 8196 bytes
 .../database_helper.cpython-310.pyc           | Bin 3866 -> 3688 bytes
 Lab2/__pycache__/server.cpython-310.pyc       | Bin 4719 -> 4885 bytes
 Lab2/database.db                              | Bin 28672 -> 28672 bytes
 Lab2/database_helper.py                       |   4 +--
 Lab2/server.py                                |  23 ++++++++++++------
 Twidder (Lab3)/database_helper.py             |  13 ++--------
 Twidder (Lab3)/server.py                      |  22 ++++++++++-------
 8 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/.DS_Store b/.DS_Store
index 2fec223903ac1694571e02c744a2c068a627bbfe..add6cc6fc0deb56d8b7edaadccd95edcfc062405 100644
GIT binary patch
delta 95
zcmZp1XmQx^T8MGSWFLV-cZuq1BMUPf1tU}QS{;RIOH%_K1v3Nl+FDKyQDuGWp!n>Z
g+`RlQ1~6b`1XBzQyigiOb#GoQY|ps)v4|o!0EFBW8vp<R

delta 21
dcmZp1XmQx^T4?eg;oX~;3)?Vmek7vA4FGNz2@?PS

diff --git a/Lab2/__pycache__/database_helper.cpython-310.pyc b/Lab2/__pycache__/database_helper.cpython-310.pyc
index c0cb2b59bf7e62a54d13752438c29730b94473b0..99b546519230212e54a8bc011cbc93babc0b8519 100644
GIT binary patch
delta 844
zcmbOw_d<p*pO=@5fq{WxUi<6h8+;S_WEguUYWJ`*1~X_XOgyqu!bd-}IJKx)KR2-=
zGdES=B|o_|H#M)Mcycpi$mBUplR0m(r&gpUmzJbXHepT`=Vf4EDCS{cU|?dDVdP?D
z1H&TG$s3qg%7BD#aipb|BxmI3rE0Pi@i8zk6!C)y@yVquYK&r&=degKN=@FuQqRxL
zz`&r%bc?klKRY$Ah;Q;mK4B4|#FUhfe4qUE^wbp3Jg~czCMU9rGRjP@;gFp?g>|o@
zILI`RMMV-I7RWi8%tg{5Hdsm$WRRqIQEF~}S*lx6elCh>+LQa(<Qe5AuVc$rk!4_D
zc*zLTC<by03&N0FY(=TXr8y-KS4|FJ=Vi2<9LFxps5p5Yo9yJX%p8*!vKMJ9g7kvI
zwg_x9+)<iPqrkogOYwsorOglaYDj)SVsUYKeo=}WC@2NMLCL|$#mL9V0}f0!#v-N3
zH5|#3AP0uH6@guc>_r8TX_L7*xkLg%CJ2E|0O{voWMO2RT+9(LxsuaC2&8W%Gb9ec
zu7K#f$H~taJNX@_G@~jwP}R9QM8VP^_eViuFEJ;lNCj-mbuMAaERZcA&oF^q$pLev
z+GJ+#DqfH^noLk@z<TC#3o#Z?-oP!&rp~~?kjyl>kwaqgW9~c-aFjC_@lB58F=ect
z+|MJ<s4;mtPZb-;45)=xyu!k*APYGd7#JX);$bY(oSeYBf{}YNC!eQG4@ef|SSCgh
zL<-ae#i7vTJU$r}QBb@{fe0B8AqOJBais)eDT4^r$?Nze7<DI~;ZsusiE=RTFtRXl
gFmbSRaB}c)aB}c*@N#f-@Nn>QaB^^PaPhDM0OXggJpcdz

delta 1151
zcmaDMGfR#ypO=@5fq{X+XV;_T0{)47GK^CuYWMIeq$sv9L<yxZ1~X_XP296m%u7GC
zIJKx)KR2-=GdES=CAB!aB)?#CEn`SMNINoSV_;x#W?*0_)?r{^sNyeSXl7Wzn8LV_
zk&yw)W&*Lp8B&;o85qGZk|Bj9m_d`(uS(D*$Ui`#Brz!`RUtIkH7MA+N)k!P$KT!E
z)y2~fA{FAM$y5Y(|1I{^iqz!NlGMrad}8v+IjM<x@hM5XAXo4(FfcGN@-Xr+vVma{
z&*Za=(^-qS85kHQ=Q5>=iy>6WFmi#_urU^iO@7I=QU;{x7DrlYNpePhUaBTb5kCV1
zLy-W8keIxVSxr_Rq*(}T1s9_LBL^c3)BrZdBI(H=nd^B$j?iSf#afb|otig!BD<&@
zTTXs@d}f|DNGrs3LI`_hCtqZjoqUsJuc8FV7LWsqBta}b1_lOA<{}vo8!RO?S&>gz
zlO1GOerbsb$TW~wm>9Vj`M?h0gPY36SR_CBBAe`F1vWn=IR*xXmy94|#6d=~AdI}l
zR+L&?no|ODr4A3+!6Essxrv!MP9W1opxy+Tj^a_J$rstCYb$|_1SO^-u=C(9*M!;t
z4mz-u0LbN&m$3^7`Gd>_1t$|D2iV;_lj}GFCQES0NP?Uh;#LH9BeJ&@!I~2|xEP}*
zXLCq1s!YDf?mqb(hl3DE=}Klu6oKslE7jpkPc4a0Ni0c>PX&1;4P+%O#z0;H#~2eR
zaTKY61HXo|LlmqZ<b^0m>?h{r6sdx3*5MLnES~JZCC;cmIfAQ-7i6m@6Vz6)icefZ
zGBqGuK#>cJ3>HQf#v%;{28Lv&$p={^CR=dlae$Ksa}odKb=;<sEg&7BNM>SWVMIz0
znv*ZGi%b^aNn-=q1a(9|kFZ1^NCO800|Ueg9>yXqknzl5<1g`aGxAQ3<Mphc3Q`7g
z2@|6TJV6xcfudfxh?RkX;TCIJPGWI(5fdo>*g*t15<yyuKnbcy8YCtQB0#CV2prGK
yAg&6CPy-R_AOhsOB25qr<PfkGMI4hA`4j~}3ON{f7+IJ&m^j!uI41}2NdN#x0LvHv

diff --git a/Lab2/__pycache__/server.cpython-310.pyc b/Lab2/__pycache__/server.cpython-310.pyc
index 9b004867109a8db67ebe33d1813dc745cabcd9d6..c45131d588856539e63fafc227021f49aca3e0e6 100644
GIT binary patch
delta 2286
zcmaE_GF6Q)pO=@5fq{X+rt@{Ohtxzq8OE%M+UE5s3@J=G98nypjH#T>j8R;vTv^;H
z%qcACj47<WOet(B>@5t<j8QybagG#Ds5n;&H&~n(EY1TL=S|@Qi}QiS`BMa->IGAT
zz~cO1abdW4y-12ESV90SAqKZtJVgR5E(jKvgo{h1NQ1?Nz~VA+aoH3(u(&W-Tplj2
zkfI0{7Xgba!5ylcq5=}PiV{sxO;KxMh!RUtPtj;$h!RiHOwnp#h>}R<OwrC}D%zZ)
zlgbq@naZ_5Y9Rw7Lkd$c7;EZIUc}fT;jAB8oLW?@pPN{bnVYKblAm0fo0?ZrJlTQC
zl9!i(fuWd*fq{XAsfc^BHnVYk2_pkT3Bv-$g$%U}DU3A?Wei0-N|<UGQWzx}N|>9O
zigu(hA&D}<MVXOAnc<==NTMuoQC1{TR=6lz4MSNy%sMu>FgucBc9>`hOASK`lO#hk
zV+uz$OVKtYK4&%ql+Os3=K{;KLcGw-2$f?-k^`B=0^wVL6@vs=Ap&qd8ycS-iO;rx
zeR2njA>)?GyI7JHZ!x?)$-uy{lBr0Xfq@}&CL@A9fsuhhlVh?KtE$Z{zRcqIvc#Os
zl=#%##LS#q{3(egiAjmYsqq=9IR&XjQQXNzsfi`2@ukJ7MVd^vSU~c(Sc+1M3nss3
z6XPf?5CX+s+~hf|mReklO#k^nn2G5h9|$uu{pDk3`YXmF!N~HTg^7icg$V?UlqdgY
zRj6lXU|?WnU|?_tnNY`o5#_e9C~sygvV}&tZ3#0x%$c)Uifl_*7C=K4BEFERSS^Jm
zn4yHNnW2_3g|&t;ld+bmgk=GH4I?D<7cv!DmvGcD#WXXfu%&_0DSI$O3P&)5CZ}H!
zC@mK8F)%O`i6DjEL`DXNTdXDd*{OL&5+F%Q5Fy3Dz@W)l1oB3aG)O=mM96^%g~>bE
zl(dBsQ&K|mee%=OQ&T+iz&W6Z1*D0&ND-t;l>uaISz=CU>g4xq5=y$DfB@;|U=m?u
z0|g`_(|-{r7DhHuu>BWc=9#R>F3oz2IUqD-vJJaepe7`Ci#R~0selNuo0xBjrl*#~
zgWVgSR+OI`pOKoFl3G-xz`(!|C0>-8n_rgdR+OKM;<S~FMXHkzu*;Y@f}Fv_z`(%9
z#KFkL2#K{KkmIT(^b?bl^Gowe^pi6Z^U_n}3lfWq%kzs;CW~@hiPi$S04dyFo<R!3
zDM%@BG9v>+5y-tz4`faS34q;>9G==B^FZNIq%hfq(@_H+Xh_k-2~q<lK*e^E2?GOz
z@8q?dJ>p=;fQ*D##8Lz{O<{5XmjW9o;EQ-CmvN~xrcR#6bs!3%n2~{j;U%ardI^fx
zm!RkZCk0KmB7Trn0w6*VM1T^0kuZn_PBh>+FaUAE9%F^sw}V?j1FQgSDcB3@AXQ*D
zg9)(1%|U@anTaQp4eHK99v^`okU}dEVb8$8P$e_jkVj<lL!M1+5cf`=$*au^wv8QT
z+eKb`ZY0|#OY^C-+A%ON%$n@Zr^{$Jxs>k!M6<(WYkp~MF_78d#0+-1A&3hKGfj4+
zWDRvtBfkzC*!ilHH}jh@?wI_FU!T!!vXp?kC)jHsH)%3~_1$8JB)H-t9gvA&UxEp+
zS3%}o1bG*f#+Vp+7+F}@{<1N$FcoP}UM1klC_edvKzjWxkP1-n^Dv4q7O62XFeHQG
z22?kLFer*Zvf#o4l;%<xYZ*ax1}K{^WJ+NuWejG}Wb&&rh>K3tt#Z_jGSIcui&xdw
zjn#HQ648y-j?shiW2=pHYE?9uZZQ?5*56{yO)N>y&}0H9wp;84i6teeMR`SFe}D<F
zXFz%W9?YpMi~@{BAdy=f@$tEdnR)T?A)3;+SkrP6i?fSBP6h`LxDWtm#v(sZ_;`WJ
z0hX-d{Jf$-5R)T5K5z0eL2(OZkgNuX0OdY#;x4iTaY3o22$Uv@K#^PI1`-1WD>$5r
l<R^a>bQEOdVB%xpVgzF;E=E4#$(};;oGcuyY@i_j2LR)i?}7jT

delta 2057
zcmbQL_FjcApO=@5fq{YH`m-m=O_CG&WEhJkYMa-mGNy7gGe&Wya%OR*FsHDjGp4Zi
zGNrJku(vQYGe&WP#W~>OoGDyjaUQTZcM1<wJ#PvhSezFu&JPzCND%~!^MS>M;Nrq5
zB4F`)ez1gSiWt-&@e~QLgaBAv5^k|niZobU5G*bO7ne<u1B(lR#pU7R3Mq<Uabd8y
z5?ow4MFlJ_0v1<wg1bm9MI9_5nxc`S*}@PdmZFuS-NFzhp30G;lg(7LJw-Q_GhQN<
zbAjYS21bSyreHAE)SEnuu|v#JKeRZts8~NYu_7}!Ro^AGIJ+djV6qjHWjzlA14A(r
z0|NsKQxP`<149+NeoAUiYDsD`C^}%6k%55$q{tbhT7-dtp@d-p<3fg7h8l(<jub|y
zWz2pnnQk!@aWF72tYj+UWnf^)oXN<*pviQLKP9mwF)6V)H9jLXry#W`iX%BEH8C$f
z#W+cm@fJ%_YH>jkCj$cmgaD<4TWk<#2!d<`naIJ!!pOqN!c-(Uxq->JK7$eAh!n;e
zhBAhtO(je<3@MC~3?<CXOhubgn2<!7;G)b(qRenn79>#?xF{=<C@Wl)t%jkj9%daI
zT$mk6F*{7Ogr$Zdg-Md3nK6YUo26(25}z}h0m^3t%X7iynbG(xXna;l2AyWc6odvg
zGzIKPeAWeQlV36$GOn8}&5|q&j+K`uK|#%j6ipLA(ZoJ^K8vb+5kCV1Llk#%QEFmI
zYJ6#NYLO<>Ef!Gx6$vmfFic{VV3PvHNz`OHR!cQLMyCI8%*6DMkBRA@7_$T;%YPP7
zd@->wu`m^>Om1XVs0XDVRt5$Ja2g6jN<+}-(}YHtW(m^*W=KRr!fqi`u|x`UFhdDT
zGea$73DW}B8b*lxLZ%}18pafsG*EJ94Q5DT3ue${_bU<x`45y#VaaeJBZC}6kt|3U
z<n1Ck1_lOAwjySbfINucpIpPHB+8bPpB|r?r^!^L%)r2Ki?t*_J2h_-tC)Fao(ag$
zVhjun984UHY>Z6*MVMF^*_Z?vIT*oy)Bxojetl4Q73&vgrsu`ymzGRcX7}PL0%frx
zRgf)mlN;D&1;GK#4zeo0v}7e?k^1C)>@wo6APYcB*_b#Oxxh)Cg{eqq@<(=A)?3U0
zp&^s`IIcu%f{X!$Kh$S0&mhI(6h=hGo6N|-0Jc;UniHpj1i=30MDn*5$UG$w!9UrS
z(@_BA?;>>&9}<R>A94$`g8Uvhc^PMqIM{lSArPZkiop8$Cwp=!ut9W9&gW8R%$z)(
z>i`=>@#I);2^)}$HQ9<pK?Z{Yu}B=mk^m8sAOdU|D3=!*fViN*(qx4hzL8sj8>|3q
zgYxA4Y?5q6<_ruB<&%GMXR<+^kip}_JprWI3Pd<e-p_Ly=7I^l+Pq*R*<nVW;I&6F
zQixBT)t-TYVcujrK3zup$vJ!ne8A3k1Z4*P)ZE0(ocN;D<jjK1)Vz{gEP16lIYlxc
zi@?bV>}W#}7Zf&{?C1f^Ke>WmhYb?8lUMPZG47fCkYAtCeX^i{yENEWAj>qF!1`{n
zXQU>kq!twyX@f#v8sxvLu*AW{$iv9O!uFR9R1#`UUMS$o$UFJDKzjW>kO~$C1_mBR
z5ym1lQ1a!7kIzla%!`i?(UiKynwFDToLvOUgkW2WKx)Bxy~rQraBq+fmaO9ZyjvXc
z@p*~4sqyi*m=g;MZm|~SmzJc0D~BRbX<VcNQV&Y+MLHlBD0LLcTY{LNNGWmvu|R=Y
r<PKtioL{6idA5+FFcTjO7b6&Ra53^paxwA=OnxgQ&(6vQ^3^{8SPQu;

diff --git a/Lab2/database.db b/Lab2/database.db
index b6cf4525b5d293f9e54549358aecdf98cdb5cf98..ecfc5db7f8012e708b8bb0719f07367d0c9357d9 100644
GIT binary patch
delta 740
zcmZp8z}WDBae}m95d#AQI|Bj;Pt-A%EMm|L_u}PQ!@$NJz`zs57tVi>x0p|aJ78nu
z4KA)Gc5ZfYSy{&B#L3%ulI0b2b)8dlN;4G-OEVRUQV%cB&n!{MNma;AEiO(>Pn|5u
zt0tp>q9`@5EI%_9tR^utXR<x7&EzPaAQnD<hT{_(4>LE)aZaw|RbynCyp*?sk!!LX
zp9K#q{~HDlkSm+g**8b=WiT>wOg_x7p~}p_01*et!7wia0|N`c2m}9N{vQ57ev!?B
z3M~Bf)+`*7!lLq$y3!@7#VN%lsVT`NsVOBnnR(gy1(|v2#pS6fsd>ryxhW~B4(Yjx
znK^pN`MHKh#wMm_=9bJ5&6<QXV`?>J0%?`37gkq9u^7ZjE2%81%uTF7*q2vUkXT$?
zo?n!r&j{8htcYqQk~TCq!n_ZnxxhiNhJk+#|3Us|{8tzlHVY@r;^!1$)@1~Haq@C|
zc?m&gbw(81nRuBMIdc;yzp<BKW8~k*z`t*^V8RxDJrhReQ1$Z4sPf{B<bdEvfB*Dc
zm-1ql#BfJb|Elx=1E&H@)BG&UfC8{-li%orv_EFxf4o^R;VS>c02WRGW_3=eq`d?O
z6aQ>b?9ARQsL;>vpvJ_?ps6mIoS%yndSJyc9~vo?q!yRxGlJA<W2l>)5G%R)OZ<O+
KUM7&=VHf}|BhcRf

literal 28672
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

diff --git a/Lab2/database_helper.py b/Lab2/database_helper.py
index cd923d7..7eac6bd 100644
--- a/Lab2/database_helper.py
+++ b/Lab2/database_helper.py
@@ -31,7 +31,7 @@ def authenticate(email, password):
         return False
 
 
-def log_in(token, email):
+def addToLoggedInUsers(token, email):
     try:
         get_db().execute("INSERT into LOGGEDINUSERS values(?, ?)", [token, email])
         get_db().commit()
@@ -40,7 +40,7 @@ def log_in(token, email):
         return False
 
 
-def log_out(token):
+def removeFromLoggedInUsers(token):
     try:
         cursor = get_db().cursor()
         cursor.execute("SELECT * FROM LOGGEDINUSERS WHERE TOKEN=?;", [token])
diff --git a/Lab2/server.py b/Lab2/server.py
index 3504ab7..26cc2a3 100644
--- a/Lab2/server.py
+++ b/Lab2/server.py
@@ -4,6 +4,7 @@ import database_helper
 import random
 import string
 import json
+import re
 
 app = Flask(__name__)
 
@@ -26,7 +27,8 @@ def sign_up():
         and 'country' in data and isinstance(data['country'], str)
         ):
         if(len(data['password']) > 5 and len(data['password']) < 21 and len(data['email']) > 0
-        and len(data['firstname']) > 0 and len(data['familyname']) > 0 and len(data['gender']) > 0
+        and is_valid_email(data['email']) and len(data['firstname']) > 0
+        and len(data['familyname']) > 0 and len(data['gender']) > 0
         and len(data['city']) > 0 and len(data['country']) > 0 ):
             resp = database_helper.create_user(data['email'], data['password'], data['firstname'],
             data['familyname'], data['gender'], data['city'], data['country'])
@@ -43,25 +45,28 @@ def sign_up():
 @app.route("/users/sign_in", methods = ['POST'])
 def sign_in():
     data = request.get_json()
-    if('email' in data
-        and 'password' in data):
+    if('email' in data and is_valid_email(data['email'])
+        and 'password' in data and len(data['password']) > 5):
         if not database_helper.authenticate(data['email'], data['password']):
             return "", 401
         else :
             token = generate_token()
-            if database_helper.log_in(token, data['email']):
-                return token, 201
+            value = {
+                "token" : token
+            }
+            if database_helper.addToLoggedInUsers(token, data['email']):
+                return jsonify(value), 201
             else:
                 return "", 409
     else:
         return "", 400
 
 
-@app.route("/users/sign_out", methods = ['POST'])
+@app.route("/users/sign_out", methods = ['PUT'])
 def sign_out():
     token = get_token_from_header()
     if(token != 1):
-        if database_helper.log_out(token):
+        if database_helper.removeFromLoggedInUsers(token):
             return "", 200
         else:
             return "", 401
@@ -214,6 +219,10 @@ def generate_token():
     characters = string.ascii_letters + string.digits
     return ''.join(random.choices(characters, k=36))
 
+def is_valid_email(email):
+    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
+    return re.match(pattern, email) is not None
+
 
 if __name__ == '__main__':
     app.debug = True
diff --git a/Twidder (Lab3)/database_helper.py b/Twidder (Lab3)/database_helper.py
index f69e47b..7eac6bd 100644
--- a/Twidder (Lab3)/database_helper.py	
+++ b/Twidder (Lab3)/database_helper.py	
@@ -10,15 +10,6 @@ def get_db():
     return db
 
 
-def clean_db():
-    try:
-        get_db().execute("DROP table USERS;")
-        get_db().execute("DROP table LOGGEDINUSERS;")
-        return True
-    except:
-        return False
-
-
 def create_user(email, password, firstname, familyname, gender, city, country):
     try:
         get_db().execute("INSERT into USERS values(?, ?, ?, ?, ?, ?, ?);", [firstname, familyname, gender, city, country, email, password])
@@ -40,7 +31,7 @@ def authenticate(email, password):
         return False
 
 
-def log_in(token, email):
+def addToLoggedInUsers(token, email):
     try:
         get_db().execute("INSERT into LOGGEDINUSERS values(?, ?)", [token, email])
         get_db().commit()
@@ -49,7 +40,7 @@ def log_in(token, email):
         return False
 
 
-def log_out(token):
+def removeFromLoggedInUsers(token):
     try:
         cursor = get_db().cursor()
         cursor.execute("SELECT * FROM LOGGEDINUSERS WHERE TOKEN=?;", [token])
diff --git a/Twidder (Lab3)/server.py b/Twidder (Lab3)/server.py
index c126024..c45c45c 100644
--- a/Twidder (Lab3)/server.py	
+++ b/Twidder (Lab3)/server.py	
@@ -4,14 +4,13 @@ import database_helper
 import random
 import string
 import json
+import re
 
 app = Flask(__name__)
 
-
-
 @app.route("/", methods = ['GET'])
 def hello_world():
-    return app.send_static_file("client.html"), 200
+    return "<p>Hello, Lab_2!</p>", 200
 
 
 @app.route("/users/sign_up", methods = ['POST'])
@@ -26,7 +25,8 @@ def sign_up():
         and 'country' in data and isinstance(data['country'], str)
         ):
         if(len(data['password']) > 5 and len(data['password']) < 21 and len(data['email']) > 0
-        and len(data['firstname']) > 0 and len(data['familyname']) > 0 and len(data['gender']) > 0
+        and is_valid_email(data['email']) and len(data['firstname']) > 0
+        and len(data['familyname']) > 0 and len(data['gender']) > 0
         and len(data['city']) > 0 and len(data['country']) > 0 ):
             resp = database_helper.create_user(data['email'], data['password'], data['firstname'],
             data['familyname'], data['gender'], data['city'], data['country'])
@@ -43,8 +43,8 @@ def sign_up():
 @app.route("/users/sign_in", methods = ['POST'])
 def sign_in():
     data = request.get_json()
-    if('email' in data
-        and 'password' in data):
+    if('email' in data and is_valid_email(data['email'])
+        and 'password' in data and len(data['password']) > 5):
         if not database_helper.authenticate(data['email'], data['password']):
             return "", 401
         else :
@@ -52,7 +52,7 @@ def sign_in():
             value = {
                 "token" : token
             }
-            if database_helper.log_in(token, data['email']):
+            if database_helper.addToLoggedInUsers(token, data['email']):
                 return jsonify(value), 201
             else:
                 return "", 409
@@ -60,11 +60,11 @@ def sign_in():
         return "", 400
 
 
-@app.route("/users/sign_out", methods = ['POST'])
+@app.route("/users/sign_out", methods = ['PUT'])
 def sign_out():
     token = get_token_from_header()
     if(token != 1):
-        if database_helper.log_out(token):
+        if database_helper.removeFromLoggedInUsers(token):
             return "", 200
         else:
             return "", 401
@@ -217,6 +217,10 @@ def generate_token():
     characters = string.ascii_letters + string.digits
     return ''.join(random.choices(characters, k=36))
 
+def is_valid_email(email):
+    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
+    return re.match(pattern, email) is not None
+
 
 if __name__ == '__main__':
     app.debug = True
-- 
GitLab