diff --git a/server.py b/server.py
index f596486..75359a1 100644
--- a/server.py
+++ b/server.py
@@ -15,9 +15,9 @@ import db_classes
import timeout as tmo
# Simple config
-GET_ONLY_FOR_VIP = True
+GET_ONLY_FOR_VIP = False
POST_ONLY_FOR_VIP = True
-VERSION = "20240503.1"
+VERSION = "20240503.2"
CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
@@ -141,6 +141,8 @@ def parse_request(r):
rtype = results['type']
test_id = results['id']
user_id = results['uid']
+ stud_id = results['sid']
+ data = db.read(f"tests.{test_id}", None)
blacklist = db.read('users.blacklist', set())
vip = db.read('users.vip', set())
if user_id not in vip and POST_ONLY_FOR_VIP:
@@ -149,6 +151,16 @@ def parse_request(r):
return 403
match rtype:
case "test_results":
+ if 'access' in data:
+ if len(data['access']) > 0:
+ if f"{user_id}{stud_id}" in data['access']:
+ pass
+ elif user_id in data['access']:
+ data['access'].remove(user_id)
+ data['access'].append(f"{user_id}{stud_id}")
+ db.write(f"tests.{test_id}", data)
+ else:
+ return 403
answers = results['answers']
all_answ = int(results['all'])
while len(answers) != all_answ:
@@ -281,6 +293,33 @@ class S(BaseHTTPRequestHandler):
self.send_header('Content-Length', len(data))
self.end_headers()
self.wfile.write(data)
+ case "/add_access":
+ user = parameters.get('uid', "")
+ target_user = parameters.get('tuid', "")
+ test_id = parameters.get('test', "")
+ if user not in db.read('users.vip'):
+ self._set_response(403)
+ self.end_headers()
+ self.wfile.write("403 Forbidden".encode('utf-8'))
+ return
+ if len(target_user) != 36:
+ self._set_response(400)
+ self.end_headers()
+ self.wfile.write("400 Bad request".encode('utf-8'))
+ return
+ data = db.read(f'tests.{test_id}', None)
+ if data is None:
+ self._set_response(400)
+ self.end_headers()
+ self.wfile.write("400 Bad request".encode('utf-8'))
+ return
+ if 'access' not in data:
+ data['access'] = []
+ data['access'].append(target_user)
+ db.write(f'tests.{test_id}', data)
+ self._set_response(200)
+ self.end_headers()
+ self.wfile.write("200 OK".encode('utf-8'))
case _:
db_path = 'tests.' + '.'.join(self_path[1:].split('/'))
data = db.read(db_path, None)
@@ -301,8 +340,8 @@ class S(BaseHTTPRequestHandler):
if f"{user}{stud}" in data['access']:
pass
elif user in data['access']:
- data.remove(user)
- data.append(f"{user}{stud}")
+ data['access'].remove(user)
+ data['access'].append(f"{user}{stud}")
db.write(db_path, data)
else:
self._set_response(403)
diff --git a/user.js b/user.js
index 4ba3e66..7d8bf4d 100644
--- a/user.js
+++ b/user.js
@@ -2,7 +2,7 @@
// @name Sorryops
// @name:ru Сориупс
// @namespace https://git.disroot.org/electromagneticcyclone/sorryops
-// @version 20240503.1
+// @version 20240503.2
// @description Collect and reuse ORIOKS test answers
// @description:ru Скрипт для сбора и переиспользования ответов на тесты ОРИОКС
// @icon https://sorryops.ru/favicon.ico
@@ -20,12 +20,12 @@
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @connect sorryops.ru
// @run-at document-start
-// @downloadURL https://update.greasyfork.org/scripts/481036/Sorryops.user.js
-// @updateURL https://update.greasyfork.org/scripts/481036/Sorryops.meta.js
+// @downloadURL https://update.greasyfork.org/scripts/481036/Sorryops.user.js
+// @updateURL https://update.greasyfork.org/scripts/481036/Sorryops.meta.js
// ==/UserScript==
/* Version */
-const VERSION = "20240503.1";
+const VERSION = "20240503.2";
/* End Version */
/* Charset */
@@ -299,7 +299,7 @@ function send_to_server(results) {
function fetch_from_server(path, func) {
var server = config.get('server');
var fetched_data = GM_getValue('fetched_data');
- if (fetched_data == undefined) {
+ if ((fetched_data == undefined) || (fetched_data.forbidden == true)) {
fetched_data = {};
}
if ((server != '') && (Object.keys(fetched_data).length == 0)) {
@@ -313,6 +313,11 @@ function fetch_from_server(path, func) {
fetched_data = {version: VERSION};
GM_setValue('fetched_data', fetched_data);
func(fetched_data);
+ } else if (response.status == 403) {
+ fetched_data = {version: VERSION, forbidden: true};
+ forbidden = true;
+ GM_setValue('fetched_data', fetched_data);
+ func(fetched_data);
} else if (!text.includes("{")) {
func({});
} else {
@@ -387,6 +392,7 @@ var answers = [];
var sorted_objects_value = [];
var variant, hash, type, correct, incorrect, version;
var student_name = "";
+var forbidden = false;
var prev_new_answer_f = false;
var new_answer_f = false;
var testID = (() => {
@@ -543,6 +549,8 @@ function update_variant() {
} else {
status = "Нет соединения";
}
+ } else if (forbidden) {
+ status = "Доступ запрещён";
} else if (chosen_answer == correct) {
status = "Верно";
new_answer_f = false;