-
Notifications
You must be signed in to change notification settings - Fork 0
/
gateway.cc
196 lines (133 loc) · 5.02 KB
/
gateway.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# include <glib.h>
# include <string.h>
# include <unistd.h>
# include <time.h>
# include "gateway.h"
GHashTable* peer_tab;
unsigned long int total_connections = 0;
time_t last_connection = 0;
extern class comm_interface* wsk_comm_interface;
gchar* target_redirect(http_request *h){
gchar *orig, *host = HEADER("Host");
if ( host != NULL ) {
orig = g_strdup_printf( "http://%s%s", host, h->uri_orig );
} else {
orig = g_strdup_printf("http://%s",CONF("HomePage"));
}
return orig;
}
gchar* local_host( http_request *h ) {
gchar* ret = NULL;
ret = g_strdup_printf( "%s:%s", CONF("GatewayAddr"), CONF("GatewayPort") );
return ret;
}
/************* Permit and deny peers *************/
peer* find_peer ( http_request *h) {
peer* p;
p = (peer*) g_hash_table_lookup(peer_tab, h->hw);
if (p == NULL) {
p = peer_new(nocat_conf, h);
g_hash_table_insert(peer_tab, (gpointer) p->hw, p);
}
return p;
}
/*void accept_peer ( http_request *h ) {
peer *p;
if (*(h->peer_ip) != 0) p = find_peer( h->peer_ip);
else p = find_peer( h->peer_ip6);
g_message( "accept_peer: Accepting peer %s", p->ip );
total_connections++;
time(&last_connection);
peer_permit( nocat_conf, p,NULL);
}*/
/*void remove_peer ( peer *p ) {
g_message( "remove_peer: Removing peer %s", p->ip );
peer_deny(nocat_conf, p);
}*/
gboolean check_peer_expire (gchar *hw, peer *p, time_t *now ) {
long int elapsed;
long int login;
long int grace;
//g_debug("check_peer_expire: checking peer %s",hw);
elapsed = (long int)(*now - p->current_time);
login = (long int)CONFd("LoginTimeout");
grace = (long int)CONFd("LoginGrace");
//g_debug("elapsed: %d",elapsed);
//g_debug("loginTimeout: %d",login);
//g_debug("loginGrace: %d",grace);
if (elapsed > (2 *login )) { // Este es un peer que lleva mucho tiempo sin tr'afico, por lo tanto lo tumbamos.
g_debug("check_peer_expire: el peer %s lleva mucho tiempo sin generar tr'afico, se elimina",hw);
peer_free(p);
return TRUE;
}
else {
if ((p->status == 3) && (elapsed == login - 5)) { // El peer est'a navegando pero se le est'a acabando el tiempo, por lo tanto
// se pone en status 0 para que se vuelva a capturar en cuanto la regla de iptables
// se le agote.
p->status = 0;
}
else if (p->status == 2){ // El peer ya est'a en el tiempo de grace
if ((*now - p->s_time) > CONFd("LoginGrace") - 5) { // Se est'a llegando al final del grace period adicionar
// m'as tiempo.
//g_debug("check_peer_expire: se est'a llegando al final del logingrace para el peer %s, se le da m'as tiempo",hw);
struct tm *loctime;
p->s_time = time(NULL);
loctime = localtime (&p->s_time);
strftime (p->start_time, 100, "%H:%M:%S", loctime);
p->e_time = p->s_time + CONFd("LoginGrace");
loctime = localtime (&p->e_time);
strftime (p->end_time, 100, "%H:%M:%S", loctime);
fw_perform((gchar*)"Permit_t",nocat_conf, p,NULL);
}
if (elapsed > CONFd("LoginGrace")) { // Ha pasado el login grace y el cliente hace rato que no va a datalnet
//g_debug("contador_m: %u",p->contador_m);
//g_debug("50 * contador_b: %u",50 * p->contador_b);
if (p->contador_m > (50 * p->contador_b)) { // Si el tr'afico a otros sitios es mucho mayor que el tr'afico a datalnet
g_debug("check_peer_expire: el peer %s ha generando mucho tr'afico fuera de datalnet, se castiga..",hw);
p->status = 1;
p->punish_time = time(NULL);
}
}
}
else if (p->status == 1){
// El peer est'a castigado, contar el tiempo para quitarle el castigo.
int castigo = CONFd("LoginPunish");
if (castigo < 2 * CONFd("LoginGrace")) castigo = 2 * CONFd("LoginGrace");
if ( (*now - p->punish_time) > castigo ) {
// Ya pas'o el castigo
g_debug("check_peer_expire: pas'o el tiempo de castigo, se quita");
p->status = 0;
p->current_time = time(NULL);
p->s_time = time(NULL);
p->e_time = time(NULL);
p->contador_b = 0;
p->contador_m = 0;
}
}
}
return FALSE;
}
void compare_token( gchar *hw, peer *p, struct mi_struct* fr){
if (!fr->encontrado){
if (strcmp(p->token,fr->trama->parameters->items[1]->valor) == 0){
fr->encontrado = TRUE;
if (strcmp(fr->trama->parameters->items[0]->valor,"true") == 0){
if (CONFd("authhttp") == 0) {
g_debug("compare_token: peer %s autenticado, permitiendolo por todo el timeout...",hw);
peer_permit(nocat_conf,p,NULL);
}
else {
g_debug("compare_token: se recibe la trama de autentificacion por el wsk para el peer %s, pero el sistema est'a configurado para auth por http...",hw);
}
}
}
}
}
gboolean check_peer(class m_frame* frame){
mi_struct* fr = new struct mi_struct;
fr->encontrado = FALSE;
fr->trama = frame;
g_hash_table_foreach(peer_tab,(GHFunc)compare_token,fr);
wsk_comm_interface->reception_queu->delete_frame(frame->get_index());
return FALSE;
}