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