Skip to content

Commit 97a1b17

Browse files
authored
Merge pull request #2 from Fabian123333/refactor-filter-hooks
Refactor filter hooks
2 parents 022c192 + 124084e commit 97a1b17

5 files changed

+59
-22
lines changed

anti_ddos_worker.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ class AntiDDoSWorker{
4848
// LoadConfig();
4949
ConnectRedisServer();
5050
}
51+
52+
static int PostContentHook(ap_filter_t* f, apr_bucket_brigade* bb) {
53+
// todo
54+
return DECLINED;
55+
}
5156

5257
static int PostRequestHook(request_rec *r){
5358
// ignore whitelist
@@ -59,8 +64,8 @@ class AntiDDoSWorker{
5964

6065
int score = 0;
6166

62-
for(int i = 0; i < Config::Filters().Count(); i++){
63-
score += Config::Filters().Get(i).GetScore(r, true);
67+
for(int i = 0; i < Config::FiltersPostRequest().Count(); i++){
68+
score += Config::FiltersPostRequest().Get(i).GetScore(r, true);
6469
}
6570

6671
if(score > 0){
@@ -109,8 +114,8 @@ class AntiDDoSWorker{
109114

110115
int score = 0;
111116

112-
for(int i = 0; i < Config::Filters().Count(); i++){
113-
score += Config::Filters().Get(i).GetScore(r);
117+
for(int i = 0; i < Config::FiltersPreRequest().Count(); i++){
118+
score += Config::FiltersPreRequest().Get(i).GetScore(r);
114119
}
115120

116121
if(score > 0){

char_list.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
#include <iostream>
33
#include <cstdlib>
44

5+
// uint16_t
6+
#include <cstdint>
7+
58
// pow
69
#include <cmath>
710

@@ -200,4 +203,4 @@ class CharList{
200203

201204
return network_ip == network_cidr;
202205
}
203-
};
206+
};

config.cpp

+36-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ using json = nlohmann::json;
2121
class Config{
2222
public:
2323
Config(){
24-
filters = FilterList();
24+
filtersPreRequest = FilterList();
25+
filtersPostRequest = FilterList();
26+
filtersPostContent = FilterList();
2527
whitelist = CharList();
2628
}
2729

@@ -143,7 +145,14 @@ class Config{
143145
newFilter.SetRefeer(tmp);
144146
free(tmp);
145147
}catch(const std::exception& e){}
146-
148+
149+
try{
150+
char* tmp = (char*)malloc(el.value()["content"].get<std::string>().length());
151+
strcpy(tmp, el.value()["content"].get<std::string>().c_str());
152+
newFilter.SetContent(tmp);
153+
free(tmp);
154+
}catch(const std::exception& e){}
155+
147156
try{
148157
char* tmp = (char*)malloc(el.value()["request"].get<std::string>().length());
149158
strcpy(tmp, el.value()["request"].get<std::string>().c_str());
@@ -181,15 +190,31 @@ class Config{
181190
try{
182191
newFilter.SetApplyForAssets(el.value()["applyForAssets"]);
183192
}catch(const std::exception& e){}
193+
194+
if(newFilter.GetContent() != NULL){
195+
filtersPostContent.Add(newFilter);
196+
}
197+
else if(newFilter.GetStatusCode() != 0){
198+
filtersPostRequest.Add(newFilter);
199+
} else {
200+
filtersPreRequest.Add(newFilter);
201+
}
184202

185-
filters.Add(newFilter);
186203
}
187204

188205
f.close();
189206
}
190207

191-
static FilterList Filters(){
192-
return filters;
208+
static FilterList FiltersPreRequest(){
209+
return filtersPreRequest;
210+
}
211+
212+
static FilterList FiltersPostRequest(){
213+
return filtersPostRequest;
214+
}
215+
216+
static FilterList FiltersPostContent(){
217+
return filtersPostContent;
193218
}
194219

195220
static int TickDown(){
@@ -248,7 +273,9 @@ class Config{
248273
static int maxHits;
249274
static int tickDown;
250275
static int blockTime;
251-
static FilterList filters;
276+
static FilterList filtersPreRequest;
277+
static FilterList filtersPostRequest;
278+
static FilterList filtersPostContent;
252279
static Filter* defaults;
253280
static CharList whitelist;
254281

@@ -266,7 +293,9 @@ int Config::maxHits = 1000;
266293
int Config::tickDown = 5;
267294
int Config::blockTime = 60;
268295
Filter* Config::defaults;
269-
FilterList Config::filters;
296+
FilterList Config::filtersPreRequest;
297+
FilterList Config::filtersPostRequest;
298+
FilterList Config::filtersPostContent;
270299
CharList Config::whitelist;
271300

272301
char* Config::blockCommandFormat;

filter.cpp

+9-10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class Filter{
2626
char* GetMethod(){
2727
return method;
2828
}
29+
char* GetContent(){
30+
return content;
31+
}
2932
int GetStatusCode(){
3033
return statusCode;
3134
}
@@ -70,6 +73,11 @@ class Filter{
7073
method = toLowerCase(value);
7174
}
7275

76+
void SetContent(const char* c){
77+
content = (char*)malloc(strlen(c));
78+
strcpy(content, c);
79+
}
80+
7381
void SetStatusCode(int value){
7482
statusCode = value;
7583
}
@@ -107,16 +115,6 @@ class Filter{
107115
}
108116

109117
int GetScore(request_rec *r, bool postRequest = false){
110-
// status code only available after request
111-
if(GetStatusCode() == 0 && postRequest)
112-
return 0;
113-
114-
if(GetStatusCode() != 0 && !postRequest)
115-
return 0;
116-
117-
if(r->status != GetStatusCode() && GetStatusCode() != 0)
118-
return 0;
119-
120118
if(!ApplyForAssets()){
121119
if(UrlIsAsset(r->unparsed_uri)){
122120
// std::cerr << "skipped asset request on " << r->unparsed_uri << "\n";
@@ -209,6 +207,7 @@ class Filter{
209207
char* refeer;
210208
char* request;
211209
char* method;
210+
char* content;
212211
int statusCode = 0;
213212
int score = 1;
214213
bool useRegex = false;

mod_antiddos.c

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ static void module_register_hooks(apr_pool_t *p)
99
{
1010
ap_hook_handler(AntiDDoSWorker::PreRequestHook, NULL, NULL, APR_HOOK_FIRST);
1111
ap_hook_log_transaction(AntiDDoSWorker::PostRequestHook , NULL, NULL, APR_HOOK_MIDDLE);
12+
//ap_register_output_filter("antiddos_output_filter", AntiDDoSWorker::PostContentHook, NULL, AP_FTYPE_RESOURCE);
1213
ap_hook_post_config(AntiDDoSWorker::PostConfigHook, NULL, NULL, APR_HOOK_MIDDLE);
1314
}
1415

0 commit comments

Comments
 (0)