From 4e119960d3104b9581e427c317219d75296a0629 Mon Sep 17 00:00:00 2001
From: Rishabh Kalakoti
Date: Thu, 16 May 2019 09:19:30 +0530
Subject: [PATCH 01/11] basic login/ register
---
.gitignore | 3 ++-
server.py | 59 ++++++++++++++++++++++++++++++++++++++++++++-----
views/home.html | 44 ++++++++++++++++++++++++++++++++++++
3 files changed, 99 insertions(+), 7 deletions(-)
create mode 100644 views/home.html
diff --git a/.gitignore b/.gitignore
index c966d14..3b01ea3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,4 +69,5 @@ venv/
.pytest_cache
submission_record.db
-
+user_record.db
+session_record.db
\ No newline at end of file
diff --git a/server.py b/server.py
index e8fa131..9bccbd6 100644
--- a/server.py
+++ b/server.py
@@ -1,23 +1,25 @@
from bottle import Bottle, run, template, static_file, request, route, redirect
-import os
-import sys
-import datetime
+import os, sys, datetime
+import string, random
from collections import defaultdict, namedtuple
import shelve
+from http import cookies
path = os.path.abspath(__file__)
dir_path = os.path.dirname(path)
app = Bottle()
database_path = "submission_record.db"
+user_db = "user_record.db"
+sessions_db = "session_record.db"
questions = {}
contests = {}
question_dir = "files/questions"
Question = namedtuple("Question", "output statement")
Submission = namedtuple("Submission", "question time output is_correct contest")
-# questions, code, description, start_time, end_time
Contest = namedtuple("Contest", "description questions start_time end_time")
+User = namedtuple("User", "password firstname lastname")
# dummy contests
contests["PRACTICE"] = Contest(
@@ -61,6 +63,11 @@ def changePath():
return redirect("/dashboard")
+@app.get("/home")
+def dashboard():
+ return template("home.html")
+
+
@app.get("/dashboard")
def dashboard():
return template("dashboard.html", contests=contests)
@@ -150,9 +157,50 @@ def rankings():
return template("rankings.html", people=order)
+def createSession(username):
+ session_id = "".join(
+ random.choice(string.ascii_letters + string.digits) for i in range(20)
+ )
+
+
+@app.post("/login")
+def login():
+ username = request.forms.get("username")
+ password = request.forms.get("password")
+ with shelve.open(user_db) as users:
+ if not username in users:
+ return "user does not exist."
+ if users[username].password != password:
+ return "incorrect password."
+ return createSession(username)
+
+
+@app.post("/register")
+def register():
+ username = request.forms.get("username")
+ password = request.forms.get("password")
+ cpassword = request.forms.get("cpassword")
+ firstname = request.forms.get("firstname")
+ lastname = request.forms.get("lastname")
+ if password != cpassword:
+ return "Passwords do not match."
+ with shelve.open(user_db) as users:
+ if username in users:
+ return "User already exists."
+ users[username] = User(
+ password=password, firstname=firstname, lastname=lastname
+ )
+ return "Registered."
+
+
+@app.get("/logout")
+def logout():
+ return "Logged out."
+
+
@app.post("/check//")
def file_upload(code, number):
- u_name = request.forms.get("username") # accepting username
+ u_name = request.forms.get("username")
time = datetime.datetime.now()
uploaded = request.files.get("upload").file.read()
expected = questions[number].output
@@ -164,7 +212,6 @@ def file_upload(code, number):
submissions = (
[] if u_name not in submission_record else submission_record[u_name]
)
- # submissions = submission_record.get(u_name, list())
submissions.append(
Submission(
question=number,
diff --git a/views/home.html b/views/home.html
new file mode 100644
index 0000000..ba902c9
--- /dev/null
+++ b/views/home.html
@@ -0,0 +1,44 @@
+% include('base.html', title="PyJudge")
+
+
+
+ PyJudge
+
+
+
+
\ No newline at end of file
From f3d7bec32d467a580d4e6001b541bbe3a7b8de74 Mon Sep 17 00:00:00 2001
From: Rishabh Kalakoti
Date: Thu, 16 May 2019 12:22:21 +0530
Subject: [PATCH 02/11] sessions working
---
server.py | 38 +++++++++++++++++++++++------
views/contest.html | 3 +++
views/dashboard.html | 3 +++
views/home.html | 4 +--
views/{index.html => question.html} | 8 ++----
5 files changed, 40 insertions(+), 16 deletions(-)
rename views/{index.html => question.html} (76%)
diff --git a/server.py b/server.py
index 9bccbd6..811e286 100644
--- a/server.py
+++ b/server.py
@@ -1,4 +1,4 @@
-from bottle import Bottle, run, template, static_file, request, route, redirect
+from bottle import Bottle, run, template, static_file, request, route, redirect, response
import os, sys, datetime
import string, random
from collections import defaultdict, namedtuple
@@ -50,7 +50,6 @@
for i in os.listdir(question_dir):
if not i.isdigit():
continue
- # read the correct output as bytes object
with open(os.path.join(question_dir, i, "output.txt"), "rb") as fl:
output = fl.read()
with open(os.path.join(question_dir, i, "statement.txt"), "r") as fl:
@@ -64,12 +63,16 @@ def changePath():
@app.get("/home")
-def dashboard():
+def home():
+ if logggedIn()==True:
+ return redirect("/dashboard")
return template("home.html")
@app.get("/dashboard")
def dashboard():
+ if logggedIn()==False:
+ return redirect("/home")
return template("dashboard.html", contests=contests)
@@ -81,12 +84,14 @@ def contest(code, number):
return "The contest had not started yet."
statement = questions[number].statement
return template(
- "index.html", question_number=number, contest=code, question=statement
+ "question.html", question_number=number, contest=code, question=statement
)
@app.get("/contest/")
def contest(code):
+ if logggedIn()==False:
+ return template("home.html")
if not code in contests:
return "Contest does not exist"
if contests[code].start_time > datetime.datetime.now():
@@ -156,12 +161,23 @@ def rankings():
order = [(user, score, rank) for rank, (user, score) in enumerate(order, start=1)]
return template("rankings.html", people=order)
+@app.get("/checklogin")
+def logggedIn():
+ if not request.get_cookie("s_id"):
+ return False
+ with shelve.open(sessions_db) as sessions:
+ if not request.get_cookie("s_id") in sessions:
+ return False
+ return True
def createSession(username):
session_id = "".join(
random.choice(string.ascii_letters + string.digits) for i in range(20)
)
-
+ response.set_cookie("s_id", session_id)
+ with shelve.open(sessions_db) as sessions:
+ sessions[session_id] = username
+ return redirect("/dashboard")
@app.post("/login")
def login():
@@ -190,17 +206,23 @@ def register():
users[username] = User(
password=password, firstname=firstname, lastname=lastname
)
- return "Registered."
+ return createSession(username)
@app.get("/logout")
def logout():
- return "Logged out."
+ with shelve.open(sessions_db) as sessions:
+ del sessions[request.get_cookie("s_id")]
+ response.set_cookie("s_id","")
+ return redirect("/home")
@app.post("/check//")
def file_upload(code, number):
- u_name = request.forms.get("username")
+ if not logggedIn():
+ return "You need to log in to submit a solution."
+ with shelve.open(sessions_db) as sessions:
+ u_name = sessions[request.get_cookie("s_id")]
time = datetime.datetime.now()
uploaded = request.files.get("upload").file.read()
expected = questions[number].output
diff --git a/views/contest.html b/views/contest.html
index 053e0b0..c7a3f12 100644
--- a/views/contest.html
+++ b/views/contest.html
@@ -9,6 +9,9 @@ {{code}}
{{contest.description}}
+
% for qno in range(len(contest.questions)):
{{qno+1}}
diff --git a/views/dashboard.html b/views/dashboard.html
index cddaef1..1349b5c 100644
--- a/views/dashboard.html
+++ b/views/dashboard.html
@@ -23,5 +23,8 @@
Contests
+