From 84bc3c6154f8dbe83403e60c129c0b3f966a09cd Mon Sep 17 00:00:00 2001 From: ecsw98 Date: Thu, 15 Jul 2021 20:37:22 -0500 Subject: [PATCH 1/4] Submission for 3 challenges --- challenges/backend/server.py | 51 ++++++++++++++++++++++++++++++ challenges/backend/tester.py | 14 ++++++++ challenges/database/database.db | Bin 0 -> 20480 bytes challenges/database/database.py | 30 ++++++++++++++++++ challenges/database/database_db | 0 challenges/database/db_migrate.py | 40 +++++++++++++++++++++++ challenges/database/record.json | 1 + challenges/frontend/favicon.png | Bin 0 -> 20835 bytes challenges/frontend/frontend.html | 32 +++++++++++++++++++ 9 files changed, 168 insertions(+) create mode 100755 challenges/backend/server.py create mode 100644 challenges/backend/tester.py create mode 100644 challenges/database/database.db create mode 100644 challenges/database/database.py create mode 100644 challenges/database/database_db create mode 100644 challenges/database/db_migrate.py create mode 100644 challenges/database/record.json create mode 100644 challenges/frontend/favicon.png create mode 100644 challenges/frontend/frontend.html diff --git a/challenges/backend/server.py b/challenges/backend/server.py new file mode 100755 index 000000000..af43e56ff --- /dev/null +++ b/challenges/backend/server.py @@ -0,0 +1,51 @@ +from flask import Flask, request +from flask_restful import Resource,Api,reqparse, abort +import requests + +app = Flask(__name__) +api = Api(app) + +NUMBERLIST = {"list":[]} + +class ListProcess(Resource): + def get(self): + #Sort before returning + NUMBERLIST['list'].sort() + return NUMBERLIST + + def post(self): + numlist = str(request.data).strip() + numlist = numlist.split(sep=',') + templist = [] + if(len(numlist) == 500): + allnumbers = True + for entry in numlist: + entry = entry.replace('b\'','') + entry = entry.replace('\'','') + if(entry.isdigit() == False): + allnumbers = False + else: + templist.append(int(entry)) + if(allnumbers == True): + NUMBERLIST['list'] = templist + return NUMBERLIST + else: + abort(400,message="Bad input. All entries must be numbers.") + else: + abort(400, message="Bad input. Length must be 500.") + + def patch(self): + entry = str(request.data).strip() + entry = entry.replace('b\'', '') + entry = entry.replace('\'', '') + if(entry.isdigit()): + NUMBERLIST['list'].append(int(entry)) + NUMBERLIST['list'].sort() + return NUMBERLIST + else: + abort(400,message="Bad input. All entries must be numbers.") + +api.add_resource(ListProcess, "/data/",endpoint='data') + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file diff --git a/challenges/backend/tester.py b/challenges/backend/tester.py new file mode 100644 index 000000000..b5b7e2b4e --- /dev/null +++ b/challenges/backend/tester.py @@ -0,0 +1,14 @@ +import requests +import random +payload = '' +for i in range(499): + temp = random.randint(0,500) + payload = payload + str(temp) + ',' +payload = payload + str(random.randint(0,500)) +patchload = str(random.randint(0,500)) +r=requests.post("http://localhost:5000/data/",data=payload) +print("post",r.text) +r=requests.get("http://localhost:5000/data/") +print("get", r.text) +r=requests.patch("http://localhost:5000/data/",data=patchload) +print("patch", r.text) \ No newline at end of file diff --git a/challenges/database/database.db b/challenges/database/database.db new file mode 100644 index 0000000000000000000000000000000000000000..5696105585960b8ccf86374f7d17ada3ad14c43a GIT binary patch literal 20480 zcmeI(U2oD*7zglkpbWb>>K(z1?A(w*AP8gVymE-0nVVAq-F8I|?NO?InQb?>8x!@@ z?9T7u-M+#;gNgCVL%Wjs!mY{3|D=a=`m~hi`GuRdIsF$qRw&qO&v$spTI3d?lx#3Y z2uaJHkv(ZCIZ=`wInpchS<^JBFMnOqeh?*>Bigq1Etk`7&pH`#2tWV=5P$##AOHaf zKmY;|_+J8_)pRyrEYdF`^AU=p^B4Y9ariFe~BsSBK4boZQ>rnEb1jWT)D9 zA~!S$KmY;|fB*y_009U<00Izz00ibqK&6=!rK)mXy16LpqS{X)H#7)900Izz00bZa z0SG_<0uX=z1m;d4lTOJe0P*|(Goqc%U4bYF0uX=z1Rwwb2tWV=5P$##AaMNzUefGJ zwN%nmPdvf;junpIdSV!CyqT=As2iTsTy51a``TKgU0=VuUT?P=_hpQ|lB){#_-Tzj zk_#nxzy|y5Uc1p~D(CV0{|lmBTt5") \ No newline at end of file diff --git a/challenges/database/database_db b/challenges/database/database_db new file mode 100644 index 000000000..e69de29bb diff --git a/challenges/database/db_migrate.py b/challenges/database/db_migrate.py new file mode 100644 index 000000000..4c9180d3d --- /dev/null +++ b/challenges/database/db_migrate.py @@ -0,0 +1,40 @@ +import sqlite3 +import json +import sys +json_dict = {} +if(len(sys.argv) == 3): + with open (sys.argv[1], 'r') as handle: + json_dict = json.load(handle) + con = sqlite3.connect(sys.argv[2]) + cur = con.cursor() + values = ('(' + str(json_dict['record_id']) + ',' + + str(json_dict['basic_order']) + ',' + + str(json_dict['advanced_order']) + ',' + + str(int(json_dict['protection_plan'])) + ')') + query = "INSERT INTO record " + values + print(query) + #This is the query, but doing this directly is insecure. Instead, we do this: + cur.execute("INSERT INTO record values (?,?,?,?)",( + json_dict['record_id'], + json_dict['basic_order'], + json_dict['advanced_order'], + int(json_dict['protection_plan']))) + values = ('(\'' + json_dict['name'] + '\',\'' + + json_dict['email'] + '\',\'' + + json_dict['work'] + '\',\'' + + json_dict['cell'] + '\',\'' + + json_dict['address'] + '\',' + + str(json_dict['record_id']) + ')') + query = "INSERT INTO custormer " + values + print(query) + cur.execute("INSERT INTO customer values (?,?,?,?,?,?)",( + json_dict['name'], + json_dict['email'], + json_dict['work'], + json_dict['cell'], + json_dict['address'], + json_dict['record_id'])) + con.commit() + con.close() +else: + print("Expected input: python3 db_migrate.py ") \ No newline at end of file diff --git a/challenges/database/record.json b/challenges/database/record.json new file mode 100644 index 000000000..9e718a6be --- /dev/null +++ b/challenges/database/record.json @@ -0,0 +1 @@ +{"record_id": 1234, "name": "Joe Smith", "cell": "405.868.5309", "work": "123.123.1234", "email": "joe_s@gmail.com", "address": "123 Vic Way, Dallas TX 75001", "basic_order": 37, "advanced_order": 12, "protection_plan": true} \ No newline at end of file diff --git a/challenges/frontend/favicon.png b/challenges/frontend/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..626e97c13232b0b7b026637df440ef1cd5c62598 GIT binary patch literal 20835 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 literal 0 HcmV?d00001 diff --git a/challenges/frontend/frontend.html b/challenges/frontend/frontend.html new file mode 100644 index 000000000..334b21fe1 --- /dev/null +++ b/challenges/frontend/frontend.html @@ -0,0 +1,32 @@ + + + + + + + + +

Erik's HTML Company

+

Contact Us

+
+ +
+
+
+
+
+
+
+ + + + \ No newline at end of file From e5bfc802303345ae88500e189e59263b37cc53d8 Mon Sep 17 00:00:00 2001 From: ecsw98 Date: Thu, 15 Jul 2021 21:33:12 -0500 Subject: [PATCH 2/4] Submission for front end, back end and database --- challenges/backend/server.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/challenges/backend/server.py b/challenges/backend/server.py index af43e56ff..d2fc92946 100755 --- a/challenges/backend/server.py +++ b/challenges/backend/server.py @@ -10,8 +10,11 @@ class ListProcess(Resource): def get(self): #Sort before returning - NUMBERLIST['list'].sort() - return NUMBERLIST + if('list' in NUMBERLIST): + NUMBERLIST['list'].sort() + return NUMBERLIST + else: + abort(404, message="No lists found.") def post(self): numlist = str(request.data).strip() From 8ea4da657d8fd47f99c1c97ff16db1d3a0f73ec7 Mon Sep 17 00:00:00 2001 From: ecsw98 Date: Thu, 15 Jul 2021 21:40:27 -0500 Subject: [PATCH 3/4] Submission for front-end, back-end, database challenges --- challenges/backend/server.py | 2 +- challenges/backend/tester.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/challenges/backend/server.py b/challenges/backend/server.py index d2fc92946..c533949c6 100755 --- a/challenges/backend/server.py +++ b/challenges/backend/server.py @@ -10,7 +10,7 @@ class ListProcess(Resource): def get(self): #Sort before returning - if('list' in NUMBERLIST): + if(len(NUMBERLIST['list']) > 0): NUMBERLIST['list'].sort() return NUMBERLIST else: diff --git a/challenges/backend/tester.py b/challenges/backend/tester.py index b5b7e2b4e..952a85be7 100644 --- a/challenges/backend/tester.py +++ b/challenges/backend/tester.py @@ -6,6 +6,8 @@ payload = payload + str(temp) + ',' payload = payload + str(random.randint(0,500)) patchload = str(random.randint(0,500)) +r=requests.get("http://localhost:5000/data/") +print("get", r.text) r=requests.post("http://localhost:5000/data/",data=payload) print("post",r.text) r=requests.get("http://localhost:5000/data/") From a50637c77930e62db8db2140a76e0c6d921cb2d4 Mon Sep 17 00:00:00 2001 From: ecsw98 Date: Thu, 15 Jul 2021 21:57:14 -0500 Subject: [PATCH 4/4] Removing generated files and adding ER diagram --- challenges/database/ER_Diagram.png | Bin 0 -> 24729 bytes challenges/database/database.db | Bin 20480 -> 0 bytes challenges/database/database_db | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 challenges/database/ER_Diagram.png delete mode 100644 challenges/database/database.db delete mode 100644 challenges/database/database_db diff --git a/challenges/database/ER_Diagram.png b/challenges/database/ER_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4fab4c1603d22500edf356214dfada65e5b256cb GIT binary patch literal 24729 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 literal 0 HcmV?d00001 diff --git a/challenges/database/database.db b/challenges/database/database.db deleted file mode 100644 index 5696105585960b8ccf86374f7d17ada3ad14c43a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI(U2oD*7zglkpbWb>>K(z1?A(w*AP8gVymE-0nVVAq-F8I|?NO?InQb?>8x!@@ z?9T7u-M+#;gNgCVL%Wjs!mY{3|D=a=`m~hi`GuRdIsF$qRw&qO&v$spTI3d?lx#3Y z2uaJHkv(ZCIZ=`wInpchS<^JBFMnOqeh?*>Bigq1Etk`7&pH`#2tWV=5P$##AOHaf zKmY;|_+J8_)pRyrEYdF`^AU=p^B4Y9ariFe~BsSBK4boZQ>rnEb1jWT)D9 zA~!S$KmY;|fB*y_009U<00Izz00ibqK&6=!rK)mXy16LpqS{X)H#7)900Izz00bZa z0SG_<0uX=z1m;d4lTOJe0P*|(Goqc%U4bYF0uX=z1Rwwb2tWV=5P$##AaMNzUefGJ zwN%nmPdvf;junpIdSV!CyqT=As2iTsTy51a``TKgU0=VuUT?P=_hpQ|lB){#_-Tzj zk_#nxzy|y5Uc1p~D(CV0{|lmBTt5