diff --git a/backend/app.py b/backend/app.py
index c60a6fa..c4bcad0 100644
--- a/backend/app.py
+++ b/backend/app.py
@@ -1,3 +1,4 @@
+from base64 import b64decode
import sqlite3, subprocess, sys, threading, bcrypt, secrets, time, re
from flask import Flask, jsonify, request, abort, session
from functools import wraps
@@ -262,7 +263,6 @@ def get_regex_delete(regex_id):
return {'status': 'ok'}
-
@app.route('/api/regexes/add', methods = ['POST'])
@login_required
def post_regexes_add():
@@ -283,9 +283,17 @@ def post_regexes_add():
return abort(400)
except Exception:
return abort(400)
- db.query("INSERT INTO regexes (service_id, regex, is_blacklist, mode) VALUES (?, ?, ?, ?);",
+
+ try:
+ re.compile(b64decode(req["regex"]))
+ except Exception:
+ return {"status":"Invalid regex"}
+ try:
+ db.query("INSERT INTO regexes (service_id, regex, is_blacklist, mode) VALUES (?, ?, ?, ?);",
(req['service_id'], req['regex'], req['is_blacklist'], req['mode']))
-
+ except sqlite3.IntegrityError:
+ return {'status': 'An identical regex already exists'}
+
firewall.fire_update(req['service_id'])
return {'status': 'ok'}
@@ -345,6 +353,7 @@ if __name__ == '__main__':
'value': 'VARCHAR(100) NOT NULL',
},
})
+ db.query("CREATE UNIQUE INDEX IF NOT EXISTS unique_regex_service ON regexes (regex,service_id,is_blacklist,mode);")
if DEBUG:
app.run(host="0.0.0.0", port=8080 ,debug=True)
diff --git a/backend/utils.py b/backend/utils.py
index 955b0dd..ef60ffa 100755
--- a/backend/utils.py
+++ b/backend/utils.py
@@ -1,6 +1,6 @@
from asyncore import file_dispatcher
from proxy import Filter, Proxy
-import random, string, os, threading, sqlite3, time
+import random, string, os, threading, sqlite3, time, atexit
from kthread import KThread
from base64 import b64decode
@@ -68,12 +68,13 @@ class STATUS:
STOP = "stop"
PAUSE = "pause"
ACTIVE = "active"
-
+
class ProxyManager:
def __init__(self, db:SQLite):
self.db = db
self.proxy_table = {}
self.lock = threading.Lock()
+ atexit.register(self.clear)
def __clear_proxy_table(self):
with self.lock:
@@ -81,6 +82,13 @@ class ProxyManager:
if not self.proxy_table[key]["thread"].is_alive():
del self.proxy_table[key]
+ def clear(self):
+ with self.lock:
+ for key in list(self.proxy_table.keys()):
+ if self.proxy_table[key]["thread"].is_alive():
+ self.proxy_table[key]["thread"].kill()
+ del self.proxy_table[key]
+
def reload(self):
self.__clear_proxy_table()
with self.lock:
diff --git a/frontend/src/components/AddNewRegex.tsx b/frontend/src/components/AddNewRegex.tsx
index 142894e..a440eb9 100755
--- a/frontend/src/components/AddNewRegex.tsx
+++ b/frontend/src/components/AddNewRegex.tsx
@@ -2,7 +2,7 @@ import { Button, Group, Space, TextInput, Notification, Switch, NativeSelect, To
import { useForm } from '@mantine/hooks';
import React, { useState } from 'react';
import { RegexAddForm } from '../js/models';
-import { addregex, b64encode, getHumanReadableRegex, okNotify, validateRegex } from '../js/utils';
+import { addregex, b64encode, getHumanReadableRegex, okNotify } from '../js/utils';
import { ImCross } from "react-icons/im"
import FilterTypeSelector from './FilterTypeSelector';
@@ -26,7 +26,7 @@ function AddNewRegex({ opened, onClose, service }:{ opened:boolean, onClose:()=>
percentage_encoding:false
},
validationRules:{
- regex: (value) => value !== "" && validateRegex(value),
+ regex: (value) => value !== "",
type: (value) => ["blacklist","whitelist"].includes(value),
mode: (value) => ['C -> S', 'S -> C', 'C <-> S'].includes(value)
}
@@ -35,6 +35,7 @@ function AddNewRegex({ opened, onClose, service }:{ opened:boolean, onClose:()=>
const close = () =>{
onClose()
form.reset()
+ setError(null)
}
const [submitLoading, setSubmitLoading] = useState(false)
@@ -64,9 +65,12 @@ function AddNewRegex({ opened, onClose, service }:{ opened:boolean, onClose:()=>
setSubmitLoading(false)
close();
okNotify(`Regex ${getHumanReadableRegex(request.regex)} has been added`, `Successfully added ${request.is_blacklist?"blacklist":"whitelist"} regex to ${request.service_id} service`)
+ }else if (res.toLowerCase() === "invalid regex"){
+ setSubmitLoading(false)
+ form.setFieldError("regex", "Invalid Regex")
}else{
setSubmitLoading(false)
- setError("Invalid request! [ "+res+" ]")
+ setError("Error: [ "+res+" ]")
}
}).catch( err => {
setSubmitLoading(false)
@@ -84,7 +88,7 @@ function AddNewRegex({ opened, onClose, service }:{ opened:boolean, onClose:()=>
{...form.getInputProps('regex')}
/>
-
void })
const close = () =>{
onClose()
form.reset()
+ setError(null)
}
const [submitLoading, setSubmitLoading] = useState(false)
diff --git a/frontend/src/js/utils.tsx b/frontend/src/js/utils.tsx
index 3efd86c..e58361e 100755
--- a/frontend/src/js/utils.tsx
+++ b/frontend/src/js/utils.tsx
@@ -159,17 +159,6 @@ export function okNotify(title:string, description:string ){
});
}
-export function validateRegex(pattern:string) {
- return true; // TO TEST
- try {
- new RegExp(pattern);
- return true;
- }
- catch(e) {
- return false;
- }
-}
-
export function b64encode(data:string){
return Buffer.from(data).toString('base64')
}