Added case-insensitve regex

This commit is contained in:
nik012003
2022-06-17 20:48:27 +02:00
committed by DomySh
parent 07552e36da
commit 4caf7c2bce
8 changed files with 53 additions and 20 deletions

View File

@@ -3,8 +3,9 @@ import subprocess, re, os
#c++ -o proxy proxy.cpp
class Filter:
def __init__(self, regex, is_blacklist=True, c_to_s=False, s_to_c=False, blocked_packets=0, code=None):
def __init__(self, regex, is_case_sensitive=True, is_blacklist=True, c_to_s=False, s_to_c=False, blocked_packets=0, code=None):
self.regex = regex
self.is_case_sensitive = is_case_sensitive
self.is_blacklist = is_blacklist
if c_to_s == s_to_c: c_to_s = s_to_c = True # (False, False) == (True, True)
self.c_to_s = c_to_s
@@ -16,10 +17,11 @@ class Filter:
if isinstance(self.regex, str): self.regex = self.regex.encode()
if not isinstance(self.regex, bytes): raise Exception("Invalid Regex Paramether")
re.compile(self.regex) # raise re.error if is invalid!
case_sensitive = "1" if self.is_case_sensitive else "0"
if self.c_to_s:
yield "C"+self.regex.hex() if self.is_blacklist else "c"+self.regex.hex()
yield case_sensitive + "C" + self.regex.hex() if self.is_blacklist else case_sensitive + "c"+ self.regex.hex()
if self.s_to_c:
yield "S"+self.regex.hex() if self.is_blacklist else "s"+self.regex.hex()
yield case_sensitive + "S" + self.regex.hex() if self.is_blacklist else case_sensitive + "s"+ self.regex.hex()
class Proxy:
def __init__(self, internal_port, public_port, filters=None, public_host="0.0.0.0", internal_host="127.0.0.1"):

View File

@@ -308,20 +308,26 @@ namespace tcp_proxy
};
}
void push_regex(char* arg, vector<pair<string,boost::regex>> &v){
size_t expr_len = (strlen(arg)-1)/2;
void push_regex(char* arg, bool case_sensitive, vector<pair<string,boost::regex>> &v){
size_t expr_len = (strlen(arg)-2)/2;
char expr[expr_len];
unhexlify(arg+1, arg+strlen(arg)-1, expr);
boost::regex regex(reinterpret_cast<char*>(expr),
unhexlify(arg+2, arg+strlen(arg)-1, expr);
if (case_sensitive){
boost::regex regex(reinterpret_cast<char*>(expr),
reinterpret_cast<char*>(expr) + expr_len);
v.push_back(make_pair(string(arg), regex));
v.push_back(make_pair(string(arg), regex));
} else {
boost::regex regex(reinterpret_cast<char*>(expr),
reinterpret_cast<char*>(expr) + expr_len, boost::regex::icase);
v.push_back(make_pair(string(arg), regex));
}
}
int main(int argc, char* argv[])
{
if (argc < 5)
{
std::cerr << "usage: tcpproxy_server <local host ip> <local port> <forward host ip> <forward port> C..... S....." << std::endl;
std::cerr << "usage: tcpproxy_server <local host ip> <local port> <forward host ip> <forward port> 0C..... 1S....." << std::endl;
return 1;
}
@@ -330,22 +336,26 @@ int main(int argc, char* argv[])
const std::string local_host = argv[1];
const std::string forward_host = argv[3];
for (int i=5;i<argc;i++){
if (strlen(argv[i]) >= 1){
switch(argv[i][0]){
if (strlen(argv[i]) >= 2){
bool case_sensitive = true;
if(argv[i][0] == '0'){
case_sensitive = false;
}
switch(argv[i][1]){
case 'C': { // Client to server Blacklist
push_regex(argv[i], regex_c_s_b);
push_regex(argv[i], case_sensitive, regex_c_s_b);
break;
}
case 'c': { // Client to server Whitelist
push_regex(argv[i], regex_c_s_w);
push_regex(argv[i], case_sensitive, regex_c_s_w);
break;
}
case 'S': { // Server to client Blacklist
push_regex(argv[i], regex_s_c_b);
push_regex(argv[i], case_sensitive, regex_s_c_b);
break;
}
case 's': { // Server to client Whitelist
push_regex(argv[i], regex_s_c_w);
push_regex(argv[i], case_sensitive, regex_s_c_w);
break;
}
}