From 23aa5d8ceed1c7be1a4fa23b143c87fc220273d0 Mon Sep 17 00:00:00 2001 From: key Date: Wed, 2 Aug 2023 15:28:36 +0200 Subject: [PATCH] Flask is very good and will be the definitiv solution for the database intrerface --- webinterface/minibase/__init__.py | 12 ++++- .../__pycache__/__init__.cpython-311.pyc | Bin 884 -> 1358 bytes .../__pycache__/forms.cpython-311.pyc | Bin 5287 -> 6719 bytes .../__pycache__/models.cpython-311.pyc | Bin 2878 -> 3997 bytes .../__pycache__/route.cpython-311.pyc | Bin 11505 -> 14619 bytes webinterface/minibase/forms.py | 44 ++++++++++++---- webinterface/minibase/models.py | 18 ++++++- webinterface/minibase/route.py | 48 ++++++++++++++++-- webinterface/minibase/site.db | Bin 32768 -> 32768 bytes webinterface/minibase/templates/login.html | 2 +- .../minibase/templates/reset_request.html | 27 ++++++++++ .../minibase/templates/reset_token.html | 40 +++++++++++++++ 12 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 webinterface/minibase/templates/reset_request.html create mode 100644 webinterface/minibase/templates/reset_token.html diff --git a/webinterface/minibase/__init__.py b/webinterface/minibase/__init__.py index 578b180c..c9ac9c9a 100644 --- a/webinterface/minibase/__init__.py +++ b/webinterface/minibase/__init__.py @@ -2,9 +2,11 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_bcrypt import Bcrypt from flask_login import LoginManager +from flask_mail import Mail +import os app = Flask(__name__) -app.config['SECRET_KEY'] = '57636aef33666affr6' +app.config['SECRET_KEY'] = '5791628bb0b13ce0c676dfde280ba245' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' db = SQLAlchemy(app) bcrypt = Bcrypt(app) @@ -12,4 +14,12 @@ login_manager = LoginManager(app) login_manager.login_view = 'login' login_manager.login_message_category = 'info' +app.config['MAIL_SERVER']= 'smtp.googlemail.com' +app.config['MAIL_PORT']= 465 +app.config['MAIL_USE_TLS']= False +app.config['MAIL_USE_SSL']= True +app.config['MAIL_USERNAME']= 'kerem.yollu@gmail.com' +app.config['MAIL_PASSWORD']= 'eoilsjxjwmnfjbbj' +mail = Mail(app) + from minibase import route diff --git a/webinterface/minibase/__pycache__/__init__.cpython-311.pyc b/webinterface/minibase/__pycache__/__init__.cpython-311.pyc index 3aef9a32f20a5b0c9ee924816a55243562f1a031..c6ad3d3ab3b0cbb0411f5936a34b8237982f7ea8 100644 GIT binary patch delta 812 zcmZva&2HL25XX1Tw~Yw|NWw=Xs!CN*BuXfOR888V)>R`xKsIe8E(qfV;n;DDiCS{O zkvMRT{0wbX^-X%H;+y4DUZA%=Ko>_LG41YJ`p-`@voo{)UsPG4UwE1E0T2fvcJek-^Q>%S;{U zeplmTDzCYw;cX8YcBj45^H%9LpFP7*+!@1VnMBu%>cm zfz^XVQrK)jBs+>22S^O4n>m#eO*c1C6sR9flm{pZGyzRipErdwl{cObWDN+UZ~=Mz z5H^swhl9x;*1inZJ>85vNTJ~N7ewY$$6)8&)EJ|}*f-oyZocPy zPtG}?&-bkPA9mZ;c;3Rn`lJ0f@iBkLR;#HacYM1;8ty75+HZ5BLn5nMj(Y%4X+=G% ztp;q)W41cc^(N2km^1MDJnu_{YN?U^)^O38$xq?F4IC4(Qp%zOyxxZl>7cotSRe z@1UplkjE1hnqdp}`n1}^vRtaWIfzFPuyFY)Kt(t0b=i+{ukIW)a?AS{h`pU8&|K@e?0C*tI>*e8FH4OcWQ!IL`_b|H3l#;hyEQMDQmmqR z1QSC*s^#UQiB){+l+9}Q}dI8|3P35~x|ML!}D+i-G>ea!B zC#W5v2jQ@fRTn0LR)leQ2iYvWxPnF6v;#+Btg)v{k{Z#58a zkvk46<~`iqKQuYmkh?3bCk;jJIAkFf-Fni7v8y2mslYDA LZgW>Tr~>{M0;mD8 delta 1237 zcmZ{i%TE(g6vjKHw585;id5Pv#^I%um&mI`Dn@38M{FvfAj&W?N+UE@%~Td@2wiq3 zS-^=rDxvQ^^{dspYSCEKVwdg@K`Lsln6acI>rPO-^H*)&DDQOM|V z6_U(py>f*-lxl*oo`B;NH~M0%H`*cMLreB*RB9@sDo}^%`Z!0&4HZC^eu5SEb0P~W{OByfX zxyge5&>iYrVr*7{QL9>IiC%AU4?3 z=(G8zF;h$)`gzucY&k1K*PxU350dfIFfMP%?zy`QX5Y8gtpdBDmj{2A~stk=YA<_ze znYCM0Bz#CR(-EgiUIoeB1_Q+!WMfOIYShSv#=!}{+oqgqE&~}HVBcl~46_NAO)p2D zyc$&k2Mpe8$D>v^Llyum39k@DbZFhwfr7U8JC-#gL++n52bO}ibE}F^+BP1v0QI0X z0^1hYYtOb++mBq_(~G@*s<%(`_TkF=nC@5UevR%Y8)&@{4aGVW-h_9yWv&I+wqh%< zT6xXNN7~bjGdd8onxvt(=?fKGV3_pQrl*4=*7_Jvp|c| zMRKT}1uD)NiKTj|4c*C{c)gjK**Z91WT1*SbjLA~vkB3y{V5tnT={6iRp7~@3O97e O5heO0x^==-roMml6g2Vx diff --git a/webinterface/minibase/__pycache__/models.cpython-311.pyc b/webinterface/minibase/__pycache__/models.cpython-311.pyc index 843a8d23c306a27aebcea1a307f3cb443c736eee..6f89b6b82ef80b02662c737ceb68a2682f0c1b1a 100644 GIT binary patch delta 2061 zcmb7EO>7fK6rS1juGjI;h9t826`|p$Zc<43hbEwwLfRq%!n7z>C3o>`%!c(knq4(hQk{?|oeOBOMmV5MlBRVL@FQi>&DN&|Cm; z@RCvk81;b)07I*Rb0WatZH#n`wWUZhyok#r^){a~@;ZArb$a-`ej#P#EX^r$J*9I) zGmS}|14Ln(qdNdgik`qOcu}*EGptNrv$UMfJy8?J$8SD)Cbh$kLH98|O0T=K@7(>7!cFbQT9-b&v9d z`%HYPw5S9L$qJxa8F+uZ+#eMXv&5nBSsu zCQO(jV}VAXVQJ7gIOu-!u!^)AyfSBED+=xy81~vy$B&&oelBzJ_y~^ybW$ohqpu!J z%3x`Rox?qeCua-RsFCv|R?Lsvo=`HFCo?@;V8}(l*3D5btY02CxNc``J?l~1M)$kB zySa)Rs5#xqfDxoqxTIT?UGLdC-}#)j6QK4{5Ld~gNc>a#_GG26me}=R!+d1078xwl z1-1Rg#I=b#rBG$>mj|ke-g&jJruO}!?)h2W^I&LR9jK`TRb_y$flac_sKBC0PYo9T zm!8(>P18^b7<(~4Q=}Elgnw9`7OYqgp~O+ZhvktKMo5ZW7Dvbgb(+;j$e6r>s2~H+ z4d8!DXgvrx6^D5b0DUr(3g3!z{4?JM!jsH`#%wQO6)c_ONj!`K>liqcd|G%fsxTQ^ z>Ff9i5@Ph@CW9rUFyT}9oCOS6HuiZCSIOg5EY3&zYmxpktqWpk?Ls^;o4b{}qu;b{ zTa}Sod{=p>JhW67XlU)D&P4en{+5=O9;uzzCvRN2cI8fPUfo_(w^x^Da?d;3|ZR0$XdBwe~Bu_OW z(!mcQ>M)AeQD9g&wm3eB0^`Atpcn$-DQ`jN#Rko>jy$>OWUaykf7^YcZ0^By@z3MO zaOV4sMbFV|U-Y>Bp@${kfV$zN>O~C4W|{@DFBEN#y`qt?{{Bkdu#5{DbO_%qEQLlN z3XhtaeJSJjeU4S+g^Pd!g~otIZ2X>d3c8Zn;KKJ{*(<0SpQXQ)fqa1#P5lT@0UmS4 z{uM-Bq?9g@6V=vdfo!U_J`1F``rpq2*-~wN>M{}38a=ZfvYWnKCm?`wVMC2BYvedR dP3z>vvb_8H!B0k>`qn>JWBOewyf1)3{TmU8!h-++ delta 1016 zcmZvaJxmlq6vt=w>-G-zP6!+dA$-ZlikOJOSfCg+Dg|Hy7F=^Vm;n!W_sHyCG&B@a zP?#v0!bTG+4AIWmVxg54g#}JwXi11UjFpw|?FmA{WcI)F=Kbd5y*F>#wzBEBj*}wL zrr&>NPmQ(o+2z+@y&{Y->Jgvh2*t7HQD4hxzMj)#TlWm#%$byMeZj)@*qE_GHsJp* zwoq~jjoc&5Tp`Tj+Jb%P;O2$_9DLQ5OU7IRxKaB!xS<0E-#;wHl9R+u?V;&XWwS!W zqoU7UO=)aKIbLbL807szP?+aJ_RwEu8c0*NY9lm|pHh!xLT`}YwS6bOLUL)Af!)ps zTUPX2*+w8$g7LXR*^Bmu!P=yvQQkK?<OD{DiXoZ}v)wQ^6cCD`Q!&d4#ZE68)O4NbwF_62W z8B{dM`r3(+b{Ik$&8Qf8T-9J^^NXc0;!KG0M4VBTjYAJJ64UkUi1PW z`cPaH3}0M8=|{PUGJrA!qU<|x)D#p^V4am!j%I_>6LD2$oi?`?F+5LPM){u)3`L+c zz!!eRe00laj$Dorbd0+-)g5iW7!+p;P@?!ECiqm%oL2}R=i~Pxtazpj08A7Z7Xn|6 zGRI1cd)3Ux$DO>wAA8s@v9iZ+h?{`p!wA2UWkM=CrF4h1ZlCNsq-XoIzC${;Pxf7! v{zjWC8l`%S+ diff --git a/webinterface/minibase/__pycache__/route.cpython-311.pyc b/webinterface/minibase/__pycache__/route.cpython-311.pyc index 410e1daed4af82759263999aa56f029f9ed226a7..d3c9bcad0765f71a8d6d6ec96e5f8c6b1b36cd8e 100644 GIT binary patch delta 4639 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 JJZy@2=6|YoM|c1L delta 2562 zcmai0Uu;uV7{BMXz3bM$>)NgD*0uXn);nMWv!M)vu&6X4@^7HAQJSvz(iM8w=G&^5MK@?Q?i9U8=YdFy`aTR=&_7x%s zSKw_tO2>z`_+rfBT9)jwkaacLs=Z1W3Yih)Ar`g27_^zTT%}@) z%B(5P=IQB*A=}wo_9^zOeXsi-8Lv6U=gOLz7uausVEwS8KuCanEj=SeKolBh|4C^g zvpsEp1xB$W1zwkbWMx-^c-XRQvVR*N zP;y4jloT~zR#e&vU33CrlHGP~BvZ`ijzu_E=h_PNc^D7FtKVkdj19A*yB{|8u6rpd zed@d9yWvaS^rcpvsXtuNPoDi^^xKJ5SNeu4ebbd*wWsN5ecbbr=tSx=fmMF;o!q@0 z8{ISrUvvjT8-fGDi?9=cQyT)yY(HKs!A`TYr|Be)>|zW45z-*saPZ`-tuAu5DZ6c9q=A~3F6zA!I`ak{vA)|~0mc}?^8x3J_i{BVF zTM3mQ5Hos+T?=f2jNS@-Ovn+Y2Y(215#4(3bv0Wl=8Y;<=^Wc1x&&T-hrSY%Pa~nW zTs~i}&Kqc`n)XUr zH*~D1Yk70ds|(pm*{&P(6niRm9a8su?D~Gb)&ls+4$2qj$Ec&A8rd?0;if0Z?-tt-#e%69-{7T7@1t z)LNX@&`(F;J8ws;rI1COmM#`a*w~08S5T*<{mAOTF92Ktu2~Fik@CTQuxq}m4h4aq2VMYSFpfcZ%Vlq?cF=un zPpaow0>^k=7(|PoiD9&o2pbSa5V)%L#*M+L8Y|+=Iu1d-Xcml)*8223`!aRSgEc{x z>B|^(l#z*ji>6mA&KGBMx;lo%Sf?Hw;{}f2Tui^|yYHhxJuc}D>PXOZ9WUkdli5aT z;)RYM9bS;S(ZNBX^r-w-fsW(cSg7d%ghPUmZWaQ5e@|g2KPO9Qq5kwd!o&6Ko^vPA zsFu`S^aB{h|3>-*o1Q$jdw5lN?B{1;X7x!Q_V46Q@s6`Tz3rgr7bNlmxx", methods=['GET', 'POST']) +def reset_token(token): + if current_user.is_authenticated: + return redirect(url_for('home')) + user = User.verify_reset_token(token) + if user is None: + flash('That is an invalid or expired token', 'warning') + return redirect(url_for('reset_request')) + form = resetPasswordForm() + if form.validate_on_submit(): + hashed_pw = bcrypt.generate_password_hash(form.password.data).decode('utf-8') + user.password = hashed_pw + db.session.commit() + flash(f'Your password has benn udated','success') + return redirect(url_for('login')) + return render_template('reset_token.html', title='Reset Password', form=form) diff --git a/webinterface/minibase/site.db b/webinterface/minibase/site.db index 5fa8ce3acf0513eda47d2645b6e12c508ae1aa6e..2cf6104d308143a75a7fa1da5aed42400a11cf78 100644 GIT binary patch delta 233 zcmZo@U}|V!njp=nFj2;tQDI}k5`I2b-Wmq}seIvlhk4)d)@&9O$l_JaV`XQMwN-9p z&92NV&P>lJ$xbaw&DE>S&&erufQe0hC?{r`99r(1TGU*w<9zYVCWfL~UI*_IKTi}aH7b6Gdfw@-8c E05OtGnE(I) delta 83 zcmV-Z0IdIjfC7Mk0+1U49+4bF0Uohnqz?=P4eS69l@3=9!wu}SAt2lhv+Nxh0tf^T p$p8=c57)B}Ag&LQP!E&IFFOVV51#@L=Cceib`Oz|AG4o7VL&|i8tMQ5 diff --git a/webinterface/minibase/templates/login.html b/webinterface/minibase/templates/login.html index b6556b87..207c7009 100644 --- a/webinterface/minibase/templates/login.html +++ b/webinterface/minibase/templates/login.html @@ -40,7 +40,7 @@ {{ form.submit(class="btn btn-outline-info") }} - Forgot Password? + Forgot Password? diff --git a/webinterface/minibase/templates/reset_request.html b/webinterface/minibase/templates/reset_request.html new file mode 100644 index 00000000..bc3863c1 --- /dev/null +++ b/webinterface/minibase/templates/reset_request.html @@ -0,0 +1,27 @@ +{% extends "layout.html" %} +{% block content %} +
+
+ {{ form.hidden_tag() }} +
+ Reset Password +
+ {{ form.email.label(class="form-control-label") }} + {% if form.email.errors %} + {{ form.email(class="form-control form-control-lg is-invalid") }} +
+ {% for error in form.email.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.email(class="form-control form-control-lg") }} + {% endif %} +
+
+
+ {{ form.submit(class="btn btn-outline-info") }} +
+
+
+{% endblock content %} diff --git a/webinterface/minibase/templates/reset_token.html b/webinterface/minibase/templates/reset_token.html new file mode 100644 index 00000000..f0ed2b78 --- /dev/null +++ b/webinterface/minibase/templates/reset_token.html @@ -0,0 +1,40 @@ +{% extends "layout.html" %} +{% block content %} +
+
+ {{ form.hidden_tag() }} +
+ Reset Password +
+ {{ form.password.label(class="form-control-label") }} + {% if form.password.errors %} + {{ form.password(class="form-control form-control-lg is-invalid") }} +
+ {% for error in form.password.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.password(class="form-control form-control-lg") }} + {% endif %} +
+
+ {{ form.password_confirm.label(class="form-control-label") }} + {% if form.password_confirm.errors %} + {{ form.password_confirm(class="form-control form-control-lg is-invalid") }} +
+ {% for error in form.password_confirm.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.password_confirm(class="form-control form-control-lg") }} + {% endif %} +
+
+
+ {{ form.submit(class="btn btn-outline-info") }} +
+
+
+{% endblock content %}