From 52711fcc3f70a5600ba6ef199d96eb82f5001dd3 Mon Sep 17 00:00:00 2001 From: Allie Bopp <aebopp@umich.edu> Date: Tue, 16 Jun 2020 20:30:41 -0400 Subject: [PATCH] org registration and error handling --- servicePoints/templates/accountNotFound.html | 19 +++ servicePoints/templates/create.html | 15 ++- servicePoints/templates/createOrg.html | 38 ++++++ servicePoints/templates/duplicateOrgName.html | 16 +++ .../templates/duplicateUsername.html | 16 +++ servicePoints/templates/incompleteForm.html | 16 +++ servicePoints/templates/login.html | 10 +- servicePoints/templates/orgNotFound.html | 19 +++ .../views/__pycache__/accounts.cpython-36.pyc | Bin 3320 -> 6286 bytes servicePoints/views/accounts.py | 125 ++++++++++++++++-- sql/schema.sql | 6 + var/servicePoints.sqlite3 | Bin 12288 -> 20480 bytes 12 files changed, 260 insertions(+), 20 deletions(-) create mode 100644 servicePoints/templates/accountNotFound.html create mode 100644 servicePoints/templates/createOrg.html create mode 100644 servicePoints/templates/duplicateOrgName.html create mode 100644 servicePoints/templates/duplicateUsername.html create mode 100644 servicePoints/templates/incompleteForm.html create mode 100644 servicePoints/templates/orgNotFound.html diff --git a/servicePoints/templates/accountNotFound.html b/servicePoints/templates/accountNotFound.html new file mode 100644 index 0000000..af51f66 --- /dev/null +++ b/servicePoints/templates/accountNotFound.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="stylesheet" type="text/css" href="/css/style.css"> + <title>ServicePoints</title> + </head> + + <body> + <p> + The Username or Password You've Entered is Incorrect + </p> + <form action="/accounts/accountNotFound/" method="post" enctype="multipart/form-data"> + <input type="submit" name="login" value="Return to Login"/> + </form> + <form action="/accounts/accountNotFound/" method="post" enctype="multipart/form-data"> + <input type="submit" name="createAccount" value="Create Account"/> + </form> + </body> +</html> diff --git a/servicePoints/templates/create.html b/servicePoints/templates/create.html index 3b874f6..73a9e65 100644 --- a/servicePoints/templates/create.html +++ b/servicePoints/templates/create.html @@ -2,9 +2,18 @@ <html> <body> <title>ServicePoints</title> +<p> + Want to register an organization with your new account account? +<a href="/accounts/createOrg/">Register as organization leader</a> +</p> + <form action="/accounts/create/" method="post" enctype="multipart/form-data"> <p> - Name + Student Organization + <input type="text" name="orgName"/> + </p> + <p> + Your Name <input type="text" name="fullname"/> </p> <p> @@ -15,10 +24,6 @@ Email <input type="text" name="email"/> </p> - <p> - Student Organization - <input type="text" name="orgName"/> - </p> <p> Password <input type="password" name="password"/> diff --git a/servicePoints/templates/createOrg.html b/servicePoints/templates/createOrg.html new file mode 100644 index 0000000..afecf95 --- /dev/null +++ b/servicePoints/templates/createOrg.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<body> +<title>ServicePoints</title> +<p> + Don't want to register a new student organization? +<a href="/accounts/create/">Register as organization member</a> +</p> + + <form action="/accounts/createOrg/" method="post" enctype="multipart/form-data"> + <p> + New Student Organization Name + <input type="text" name="orgName"/> + </p> + <p> + Your Name + <input type="text" name="fullname"/> + </p> + <p> + Username + <input type="text" name="username"/> + </p> + <p> + Email + <input type="text" name="email"/> + </p> + <p> + Password + <input type="password" name="password"/> + </p> + <input type="submit" name="signup" value="sign up"/> + </form> + <p> + Have an account? + <a href="/accounts/login/">Log in</a> + </p> +</body> +</html> diff --git a/servicePoints/templates/duplicateOrgName.html b/servicePoints/templates/duplicateOrgName.html new file mode 100644 index 0000000..0ba6975 --- /dev/null +++ b/servicePoints/templates/duplicateOrgName.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="stylesheet" type="text/css" href="/css/style.css"> + <title>ServicePoints</title> + </head> + + <body> + <p> + This organization already exists + </p> + <form action="/accounts/duplicateOrgName/{{prev}}" method="post" enctype="multipart/form-data"> + <input type="submit" name="return" value="Return to Create Organization"/> + </form> + </body> +</html> diff --git a/servicePoints/templates/duplicateUsername.html b/servicePoints/templates/duplicateUsername.html new file mode 100644 index 0000000..b94f158 --- /dev/null +++ b/servicePoints/templates/duplicateUsername.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="stylesheet" type="text/css" href="/css/style.css"> + <title>ServicePoints</title> + </head> + + <body> + <p> + This username is taken + </p> + <form action="/accounts/duplicateUsername/{{prev}}" method="post" enctype="multipart/form-data"> + <input type="submit" name="return" value="Return to Create Account"/> + </form> + </body> +</html> diff --git a/servicePoints/templates/incompleteForm.html b/servicePoints/templates/incompleteForm.html new file mode 100644 index 0000000..21d1d5b --- /dev/null +++ b/servicePoints/templates/incompleteForm.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="stylesheet" type="text/css" href="/css/style.css"> + <title>ServicePoints</title> + </head> + + <body> + <p> + Please fill out all fields of the form + </p> + <form action="/accounts/incompleteForm/{{prev}}" method="post" enctype="multipart/form-data"> + <input type="submit" name="return" value="Return"/> + </form> + </body> +</html> diff --git a/servicePoints/templates/login.html b/servicePoints/templates/login.html index 8553696..3558396 100644 --- a/servicePoints/templates/login.html +++ b/servicePoints/templates/login.html @@ -5,10 +5,12 @@ <title>insta485</title> </head> <body> - <h1> - <a href="/">/ </a> - <a href="/accounts/create/">create account</a> - </h1> + <p> + <a href="/accounts/create/">create student org member account</a> + </p> + <p> + <a href="/accounts/createOrg/">create student org leader account</a> + </p> </body> diff --git a/servicePoints/templates/orgNotFound.html b/servicePoints/templates/orgNotFound.html new file mode 100644 index 0000000..bb037ed --- /dev/null +++ b/servicePoints/templates/orgNotFound.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + <head> + <link rel="stylesheet" type="text/css" href="/css/style.css"> + <title>ServicePoints</title> + </head> + + <body> + <p> + The Student Organization You've Entered Does Not Exist + </p> + <form action="/accounts/orgNotFound/" method="post" enctype="multipart/form-data"> + <input type="submit" name="registerOrg" value="Register Your Organization"/> + </form> + <form action="/accounts/orgNotFound/" method="post" enctype="multipart/form-data"> + <input type="submit" name="login" value="Return To Login"/> + </form> + </body> +</html> diff --git a/servicePoints/views/__pycache__/accounts.cpython-36.pyc b/servicePoints/views/__pycache__/accounts.cpython-36.pyc index 394d327d3d65b11945112c8fd0612b5e23813cc9..3cb0c4ddf8b903b2865fc47105808f807bf177a3 100644 GIT binary patch literal 6286 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 CXpG$e delta 1129 zcmZ8g&uiR96rMMlkw#jrR=f7@dTo;$n$pOJH13aJjN1eXxuoeOkie!iY&>#y<+Znr z<U>J=q4Kqk!<+)4w+3>{Dfe9Z7nBnAkV`_zDUe(7sc*Di6C&}R-h4Cj^u2H19IgG= zIsa9)>iv1=?azY-A+N~?55xE>TKW%pc>dX{oRjm1q#MROag&N{N-pjDR64&?*^=!; zQb4yZ;U<X|^b`0MgkGVaQ+1-R({GpdGLlrKQvi_MlA=Q->yR<aSrX`{^plNR66SUR zV>fqlXp^y*yGcFwl7{pPD0jKZTtUW_T;!D<OT9eHr-gL^=JlGD@qq?H^mFTi?IY`` zsoz-pymxP;GJTt^LrWjC_cb2^@WG}H5Wv9G$GnOD30LhZZc+id3EvvVJ*8>}2=y2C zjljW>qkWH-Uc<^(57v<aOKb@pf)PmAG+%>YX(htW5PpjAGsHec>@&nUMI1z&L?muO z5)VrzS!J5Pg9?u!hiw?soE#*+6ge#@DvH_`M7le!`U{r^(ld&cn=q-Y>`?Wp#8FGc zYqJ?lXO;1+gc<P}Ii#Ii+kDJsgvLDQ_}^;I3jM-wRqZU4wcI{3rylA^e6}RE_lLv1 z-frA=M(X~L7)*G)+Zzm((ADayKX`;^G$Dgyb5!p{zj6^3jq1vXuYYnEZ?!Q{bH>dZ z*EFt$ZepdGQVSS$#de%+^+$WL>X-?)-%I;<f9a*EqBxG6>3U{ZOzdoQw<o3k*ZuT| ziM^%bUKX$6s`P7ggn1A`z#1@n0|=;%{o#Yh0`O>n^C8&aq1iN~4Af=ZcLKWBYHL}$ zv%HSOh?o4!<|#SMTIX?Vk(<`(>XX_Z;Oa-=Z~PLD@9C9#2QKN2`b3ubDl#6%S$wgd z?G7VQ-<hQTG-(}Ug;#Uhn;%OPnF*uH=`T%Gs=$;fQ+;XNH~K}htsgYR<}MCXlZ;qc zqA84eSS*SF>I$M!LoMM)ZJ?XbQ97ky5~?}<cY8B5Y?UcVnL5-Jyd4Yr)<SS@5r+cr UlzDwL&k}U`+`O|KEelckAH84PDgXcg diff --git a/servicePoints/views/accounts.py b/servicePoints/views/accounts.py index 6bfa5b9..d0160b7 100644 --- a/servicePoints/views/accounts.py +++ b/servicePoints/views/accounts.py @@ -22,7 +22,7 @@ def login(): {"who": flask.request.form['username']}) password_3 = password_1.fetchall() if not password_3: - flask.abort(403) + return flask.redirect(flask.url_for('accountNotFound')) password_2 = password_3[0]['password'] password_4 = password_2.split('$') algorithm = password_4[0] @@ -33,7 +33,7 @@ def login(): hash_obj.update(password_salted.encode('utf-8')) password_hash = hash_obj.hexdigest() if p2word != password_hash: - flask.abort(403) + return flask.redirect(flask.url_for('accountNotFound')) flask.session['username'] = flask.request.form['username'] return flask.redirect(flask.url_for('index')) context = {} @@ -53,39 +53,100 @@ def create(): if 'username' in flask.session: return flask.redirect(flask.url_for('index')) if flask.request.method == 'POST': + cursor = servicePoints.model.get_db().cursor() + name = str(flask.request.form['username']) + orgName = str(flask.request.form['orgName']) + password = str(flask.request.form['password']) + + to_add = (name,) + to_join = (orgName,) + cursor.execute('SELECT * FROM users WHERE username=?', to_add) + if cursor.fetchone() is not None: + return flask.redirect(flask.url_for('duplicateUsername', prev='create')) + + cursor.execute('SELECT * FROM orgs WHERE orgName=?', to_join) + if cursor.fetchone() is None: + return flask.redirect(flask.url_for('orgNotFound')) + + # If a user tries to create an account with an empty string as the + # password, abort(400) + if password == '': + flask.abort(400) - # If a user tries to create an account with an existing username in - # the database, abort(409) flask.session['username'] = flask.request.form['username'] flask.session['fullname'] = flask.request.form['fullname'] flask.session['orgName'] = flask.request.form['orgName'] flask.session['email'] = flask.request.form['email'] flask.session['password'] = flask.request.form['password'] + + pw = hash_pass(flask.session['password']) + data = (flask.session['username'], flask.session['fullname'], + flask.session['email'], flask.session['orgName'], + pw) + cur = servicePoints.model.get_db() + cur.execute("INSERT INTO users(username, fullname, email, orgName, " + "password) VALUES (?, ?, ?, ?, ?)", data) + + return flask.redirect(flask.url_for('index')) + + context = {} + return render_template('create.html', **context) + +@servicePoints.app.route('/accounts/createOrg/', methods=['GET', 'POST']) +def createOrg(): + """Render createOrg page.""" + # If a user is already logged in, redirect to /accounts/edit/ + if 'username' in flask.session: + return flask.redirect(flask.url_for('index')) + if flask.request.method == 'POST': + + # If a user tries to create an account with an existing username in + # the database, abort(409) cursor = servicePoints.model.get_db().cursor() - name = str(flask.session['username']) + name = str(flask.request.form['username']) + orgName = str(flask.request.form['orgName']) to_add = (name,) + to_addOrg = (orgName,) cursor.execute('SELECT * FROM users WHERE username=?', to_add) if cursor.fetchone() is not None: - flask.abort(409) + return flask.redirect(flask.url_for('duplicateUsername', prev='createOrg')) + + cursor.execute('SELECT * FROM orgs WHERE orgName=?', to_addOrg) + if cursor.fetchone() is not None: + return flask.redirect(flask.url_for('duplicateOrgName', prev='createOrg')) # If a user tries to create an account with an empty string as the # password, abort(400) - if flask.session['password'] == '': - flask.abort(400) + if len(str(flask.request.form['password'])) is 0 or len(str(flask.request.form['fullname'])) is 0: + return flask.redirect(flask.url_for('incompleteForm', prev="createOrg")) + + if len(str(flask.request.form['orgName'])) is 0 or len(str(flask.request.form['email'])) is 0: + return flask.redirect(flask.url_for('incompleteForm', prev="createOrg")) + + if len(str(flask.request.form['username'])) is 0: + return flask.redirect(flask.url_for('incompleteForm', prev="createOrg")) + + flask.session['username'] = flask.request.form['username'] + flask.session['fullname'] = flask.request.form['fullname'] + flask.session['orgName'] = flask.request.form['orgName'] + flask.session['email'] = flask.request.form['email'] + flask.session['password'] = flask.request.form['password'] pw = hash_pass(flask.session['password']) data = (flask.session['username'], flask.session['fullname'], flask.session['email'], flask.session['orgName'], pw) + orgData = (flask.session['username'], flask.session['orgName']) cur = servicePoints.model.get_db() + cur.execute("INSERT INTO orgs(username, orgName) VALUES (?, ?)", orgData) cur.execute("INSERT INTO users(username, fullname, email, orgName, " "password) VALUES (?, ?, ?, ?, ?)", data) return flask.redirect(flask.url_for('index')) context = {} - return render_template('create.html', **context) + return render_template('createOrg.html', **context) @servicePoints.app.route('/', methods=['GET', 'POST']) def index(): @@ -116,6 +177,48 @@ def delete(): flask.session.clear() cur.execute('DELETE FROM users WHERE username=?', to_add) - return flask.redirect(flask.url_for('create')) + return flask.redirect(flask.url_for('login')) context = {'username': flask.session['username']} - return render_template('delete.html', **context) \ No newline at end of file + return render_template('delete.html', **context) + +@servicePoints.app.route('/accounts/orgNotFound/', methods=['GET', 'POST']) +def orgNotFound(): + """Render delete page.""" + if flask.request.method == 'POST': + if 'login' in flask.request.form: + return flask.redirect(flask.url_for('login')) + if 'registerOrg' in flask.request.form: + return flask.redirect(flask.url_for('createOrg')) + context = {} + return render_template('orgNotFound.html', **context) + +@servicePoints.app.route('/accounts/accountNotFound/', methods=['GET', 'POST']) +def accountNotFound(): + if flask.request.method == 'POST': + if 'login' in flask.request.form: + return flask.redirect(flask.url_for('login')) + if 'createAccount' in flask.request.form: + return flask.redirect(flask.url_for('create')) + context = {} + return render_template('accountNotFound.html', **context) + +@servicePoints.app.route('/accounts/duplicateUsername/<prev>', methods=['GET', 'POST']) +def duplicateUsername(prev): + if flask.request.method == 'POST': + return flask.redirect(flask.url_for(prev)) + context = {"prev": prev} + return render_template('duplicateUsername.html', **context) + +@servicePoints.app.route('/accounts/duplicateOrgName/', methods=['GET', 'POST']) +def duplicateOrgName(): + if flask.request.method == 'POST': + return flask.redirect(flask.url_for('createOrg')) + context = {} + return render_template('duplicateOrgName.html', **context) + +@servicePoints.app.route('/accounts/incompleteForm/<prev>', methods=['GET', 'POST']) +def incompleteForm(prev): + if flask.request.method == 'POST': + return flask.redirect(flask.url_for(prev)) + context = {"prev": prev} + return render_template('incompleteForm.html', **context) diff --git a/sql/schema.sql b/sql/schema.sql index 74ba94d..989a33b 100644 --- a/sql/schema.sql +++ b/sql/schema.sql @@ -8,3 +8,9 @@ CREATE TABLE users( password VARCHAR(256) NOT NULL, PRIMARY KEY(username) ); + +CREATE TABLE orgs( + username VARCHAR(20) NOT NULL, + orgName VARCHAR(40) NOT NULL, + PRIMARY KEY(orgName) +); \ No newline at end of file diff --git a/var/servicePoints.sqlite3 b/var/servicePoints.sqlite3 index 9e8299e1f860840844facfaaf6e31a9c86477411..37c9916f2a06b154765e141dbaf03c370f0cc320 100644 GIT binary patch literal 20480 zcmeI(&rc&&902fXr`>K*I!j2?i-#Uagv6Nl`$sm$#SMwNh>B>k2SVOYB?1)+!E5pE z-{R4K!o<@idnDeB@nAe?y!f3$35y|k<nW#HW~OgmXTIOhd+*Sh^4X{ByT@smM@Rea zc*u)KMWazX84io0=s;;hnJrD&Y0ciiwsCF$w%tzg_8ULUSAP|)9xZz3)lWUz`|-BM zSdRiIfC4Ch0w{n2D1ZVefC4CRj|3*IvNP!S8<Ve(o!?8Nqc6vGX+7OsTise4Zmqtz zzBa6Dmgl;|;mJ519k~58{9<+U>HDjj%Z#iHH$L7PZhXGJ{#M-rnr>WgAZ|AJWb=cM zRyUsypRGM#zHGcQxAJD|!QgSfQS2VX^zHa?55C0ixRc}2^!-kK{T*7b+mqc!XD}Ev zzN6E4>ww17Rr8gIr&a$m<b1NX_exSXV(zAWx4U<h^39`nWZeD6jmM{>qj+@!Ce;nJ z>n1Z|Kv`)%7`!vM4P~0*4xMgF7*P-FQ8f>x{ra<_`mp!?{Lk|}*u@0}Pyhu`00mG0 z1yBG5Pyhw)5|}(`*WV2LXWL;k+GF)<R>ogBN!gO8o>)n8)<Fp7qGOT!#AMQ3D(%gZ z@G2TYjDpH&C=Emi2`kEl3PyWPf(l-nOcilCd7g;Wgvu-x&6!yeqsoSJORSg5%fK^t z4)$`iCW%P1wbmIDwKd#F=ZGZU`b@a=_4Ow2wmOi(WeT(C>+NL*JaOqPT+$jPw6UIf z8=Q+Fr$o4SON0{39dU_ME0||038I+OmdGra71mIQ&`Bv2cPdHgAuj1dV8m!iXv~sw z#R;WO3du9o8JL9iL@37~L#3&W6dDol;d6?T;G(jLum};z$>XxK2+P^_>FD(8?=t$R zXpqS<%K{Uc1p_MC5F?F(I0RV|JZVdLV8%*AGBMCyAee|!R%;TukSxQ6nD-0<_D(X! zAxRUsGgikGM9zt4mjlTRQuZQ8<5C6*O&k@OXThz}26~0r7#JmtM&+#%a8ONbv$L?U z0RH=_ejTLK(^>2;P?K{I7GO*WPMQ>~1%hO)&~!;t8M9Z)(_p#O&^5uQ<amG&>O_)+ zzK3)aF-9}y63qsJPYMd>!Z{c)A(_OX!sZ~g@>=9zVKfS1nRfN?<B%GIUf>Wg)7(Y_ z_0T5?x@5u|oeGw-?L$~DqgLP<dE{DiBC<5j!=TOq1_xC^I=-Yc1R}g(5Kd4qxP#Dw z85#i#2EK{O!>rLT9T;S5A#vz65P*|uZ>?4#YMp(Atg~`~gnGQete~J_9ZW8gO%5>N zvZsP+?L9GxMVN$!DXrxk%<6XavZ#KkURHlr|5U%-HO=uj3ZMWApa2S>01BW03ZMWA zpa2S>z`YUZmV-up<BGK(mi_5ot5YsE;FeJNpj>F|r)I0Hx`*}i|5o*)sQ#{ghkF1o z?oIp{2nwJ83ZMWApa2S>01BW03ZMWApuimhueHj4fA;g0ZdooaUi=iK+bkFQ7eA|L zH_ECyJglGpx2p4^I<NkKr~kj+abi4-0w{n2D1ZVefC4Ch0w{n2D1ZVea32N!^Yp*2 LsQ<6x;`#r-oh!Vj delta 547 zcmZ`$F-rq67`^M+t5thJi<F|GVsR45cS$ZeT>S~Ig1Jl5iY~SVacb)?uuEqrXTiz6 zI7r>xrMtV1=2|Nb`uOq^-WR^S@Vd8d_vB`6x#&2KXV(mFe~(ykfBn9MKAl`Jc7ic_ zdDz~%2p-14j=SOq0|&jKN7P4W=qMPJMz;A_a-aLXr%vy{FO)5=k1uuer&<lkAgnRq zp`wOFm;+6jh#^WqBs`QDn37Nf!!X4uSHQH=NyL?+Sf`37I1Cw)BE*7HLx~ZTfD9Ah zlnP;J1UyQK)Ex*@ng~fi#9A3maLP=~SfUjMZKSa;Dmxk*4#o}u4OmGcBNfMj=yWyj zXYR|o+5TO%Ilr3W!v3gz^&jtgerKavS*z-nYMOSvF}>JQrrwxHGo_ZBj+5u-r#ktM zH(kGyVbcGL7Hnib8an6$y`zzh<P~{CG_+~lp~J=RJPTggwXXeax90N;Ue%rYnp^TV S+?iD`)2B{y^IoMmIer1VW1c7g -- GitLab