~ubuntu-branches/ubuntu/precise/ettercap/precise

« back to all changes in this revision

Viewing changes to src/interface/gtk/ec_gtk_inject.c

  • Committer: Bazaar Package Importer
  • Author(s): Murat Demirten
  • Date: 2003-06-21 19:57:18 UTC
  • Revision ID: james.westby@ubuntu.com-20030621195718-qqbbfk18e1djchd9
Tags: upstream-0.6.b
ImportĀ upstreamĀ versionĀ 0.6.b

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
    ettercap -- gtk interface for data injector and filtering form
 
3
 
 
4
    Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
 
5
    GTK+ 2.0 interface by daten <daten@dnetc.org>
 
6
 
 
7
    This program is free software; you can redistribute it and/or modify
 
8
    it under the terms of the GNU General Public License as published by
 
9
    the Free Software Foundation; either version 2 of the License, or
 
10
    (at your option) any later version.
 
11
 
 
12
    This program is distributed in the hope that it will be useful,
 
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
    GNU General Public License for more details.
 
16
 
 
17
    You should have received a copy of the GNU General Public License
 
18
    along with this program; if not, write to the Free Software
 
19
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
20
 
 
21
*/
 
22
#include <ec_main.h>
 
23
 
 
24
#ifdef HAVE_CTYPE_H
 
25
   #include <ctype.h>
 
26
#endif
 
27
 
 
28
 
 
29
#include <ec_gtk.h>
 
30
#include <ec_gtk_sniff_data.h>
 
31
#include <ec_decodedata.h>
 
32
#include <ec_filterdrop.h>
 
33
#include <ec_parser.h>
 
34
 
 
35
/* if FORM is defined, ec_interface_form provides trim_buffer */
 
36
/* otherwise, a copy of trim_buffer will be provided by ec_gtk */
 
37
#ifdef HAVE_FORM
 
38
extern void trim_buffer(char *buffer, char trim);
 
39
#endif
 
40
 
 
41
// protos...
 
42
void Ginterface_Inject_FilterTopStatus(void);
 
43
void Ginterface_Inject_FilterStatus(void);
 
44
int Ginterface_Inject_Run(u_char *inject_data, char proto, char *app);
 
45
int Ginterface_Inject_Filter(DROP_FILTER *filters);
 
46
void Ginterface_Inject_SetFilter(short mode);
 
47
void Ginterface_Inject_FilterStatus();
 
48
void Ginterface_Inject_EditFilters(DROP_FILTER *FA_ptr);
 
49
void Ginterface_Inject_EditFilters_InitList(DROP_FILTER *FA_ptr);
 
50
void Ginterface_Inject_EditFilters_PointItem(GtkWidget *widget, gpointer data);
 
51
void Ginterface_Inject_SelectItem(GtkTreeView *treeview, gpointer arg1, GtkTreeViewColumn *arg2, gpointer data);
 
52
 
 
53
void Toggle_Source_Filters(GtkWidget *button, gpointer *data);
 
54
void Toggle_Dest_Filters(GtkWidget *button, gpointer *data);
 
55
void Edit_Source_Filters(GtkWidget *button, gpointer *data);
 
56
void Edit_Dest_Filters(GtkWidget *button, gpointer *data);
 
57
 
 
58
void Ginterface_Inject_Callback(GtkWidget *widget, gpointer data);
 
59
void Ginterface_Inject_ChainWindow (DROP_FILTER *FA_ptr);
 
60
void Ginterface_Inject_CloseChainWindow (GtkWidget *widget, gpointer data);
 
61
 
 
62
// global variables
 
63
GtkWidget *filter_window, *filter_label[2], *itable, *c_treeview;
 
64
GtkListStore *filterlist = NULL;
 
65
GtkTreeSelection *c_select;
 
66
GtkTreeIter c_listiter;
 
67
extern GtkWidget *window;
 
68
 
 
69
DROP_FILTER *gFA_ptr;
 
70
 
 
71
int gFil_Number;
 
72
int gFil_Base_Pointer = 0;
 
73
int gFil_Pointer = 0;
 
74
short inject_mode;   /* global mode for file */
 
75
 
 
76
//---------------------------
 
77
 
 
78
 
 
79
int Ginterface_Inject_Run(u_char *inject_data, char proto, char *app)
 
80
{
 
81
   GtkWidget *dialog, *textview;
 
82
   GtkTextBuffer *textbuf = NULL;
 
83
   char inject_sequence[MAX_INJECT];
 
84
   int len = 0;
 
85
   char response, temp[100];
 
86
 
 
87
   DEBUG_MSG("Ginterface_Inject_Run -- %c %s", proto, app);
 
88
 
 
89
   sprintf(temp, "Type characters to be injected (max %d):", MAX_INJECT);
 
90
   dialog = gtk_dialog_new_with_buttons (temp, GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, 
 
91
            "Send", GTK_RESPONSE_YES, "Cancel", GTK_RESPONSE_NO, NULL);
 
92
   textview = gtk_text_view_new();
 
93
   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
 
94
   gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), textview, TRUE, TRUE, 0);
 
95
   gtk_widget_show(textview);
 
96
 
 
97
   response = gtk_dialog_run(GTK_DIALOG (dialog));
 
98
 
 
99
   if(response == -8) {
 
100
      GtkTextIter start, end;
 
101
      gtk_text_buffer_get_bounds(textbuf, &start, &end);
 
102
 
 
103
      strcpy(inject_sequence, gtk_text_buffer_get_text(textbuf, &start, &end, FALSE));
 
104
      DEBUG_MSG("Ginterface_Inject_Run -- inject_sequence len -- [%d]", strlen(inject_sequence));
 
105
 
 
106
      len = FilterDrop_strescape(inject_data, inject_sequence);
 
107
      DEBUG_MSG("Ginterface_Inject_Run -- inject_data len -- [%d]", len);
 
108
   }
 
109
 
 
110
   return len;
 
111
}
 
112
 
 
113
 
 
114
void Ginterface_Inject_FilterTopStatus(void)
 
115
{
 
116
   Ginterface_EditTop(2, "Filter: ");
 
117
 
 
118
   if (filter_on_source || filter_on_dest)
 
119
   {
 
120
      Ginterface_AppendTop(2, "ON ");
 
121
   }
 
122
   else
 
123
   {
 
124
      Ginterface_AppendTop(2, "OFF");
 
125
   }
 
126
}
 
127
 
 
128
void Ginterface_Inject_FilterStatus(void)
 
129
{
 
130
 
 
131
   DEBUG_MSG("Ginterface_Inject_FilterStatus -- source %d : dest %d", filter_on_source, filter_on_dest);
 
132
 
 
133
   switch(filter_on_source)
 
134
   {
 
135
      case 1:  gtk_label_set_text(GTK_LABEL(filter_label[0]), "ON ");
 
136
               break;
 
137
 
 
138
      case 0:  gtk_label_set_text(GTK_LABEL(filter_label[0]), "OFF");
 
139
               break;
 
140
   }
 
141
   switch(filter_on_dest)
 
142
   {
 
143
      case 1:  gtk_label_set_text(GTK_LABEL(filter_label[1]), "ON ");
 
144
               break;
 
145
 
 
146
      case 0:  gtk_label_set_text(GTK_LABEL(filter_label[1]), "OFF");
 
147
               break;
 
148
   }
 
149
   Ginterface_Inject_FilterTopStatus();
 
150
}
 
151
 
 
152
 
 
153
 
 
154
void Ginterface_Inject_SetFilter(short mode)
 
155
{
 
156
   GtkWidget *button;
 
157
 
 
158
   DEBUG_MSG("Ginterface_Inject_SetFilter");
 
159
 
 
160
   inject_mode = mode;
 
161
 
 
162
   // gFil_Number = dimY;
 
163
 
 
164
   filter_window = gtk_dialog_new_with_buttons ("Filters :", GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, "Close", GTK_RESPONSE_CLOSE, NULL);
 
165
   g_signal_connect_swapped (GTK_OBJECT (filter_window), "response", G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (filter_window));
 
166
   itable = gtk_table_new(2, 3, FALSE);
 
167
   gtk_box_pack_start (GTK_BOX(GTK_DIALOG(filter_window)->vbox), itable, TRUE, TRUE, 0);
 
168
   gtk_widget_show (itable);
 
169
 
 
170
   button = gtk_button_new_with_mnemonic ("_S] Filters on Source : ");
 
171
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Toggle_Source_Filters), &mode);
 
172
   gtk_table_attach ( GTK_TABLE (itable), button, 0, 1, 0, 1, 0, 0, 5, 5);
 
173
   gtk_widget_show (button);
 
174
 
 
175
   button = gtk_button_new_with_mnemonic ("_D] Filters on Dest   : ");
 
176
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Toggle_Dest_Filters), &mode);
 
177
   gtk_table_attach ( GTK_TABLE (itable), button, 0, 1, 1, 2, 0, 0, 5, 5);
 
178
   gtk_widget_show (button);
 
179
 
 
180
   filter_label[0] = gtk_label_new("   ");
 
181
   gtk_table_attach ( GTK_TABLE (itable), filter_label[0], 1, 2, 0, 1, 0, 0, 5, 5);
 
182
   gtk_widget_show(filter_label[0]);
 
183
 
 
184
   filter_label[1] = gtk_label_new("   ");
 
185
   gtk_table_attach ( GTK_TABLE (itable), filter_label[1], 1, 2, 1, 2, 0, 0, 5, 5);
 
186
   gtk_widget_show(filter_label[1]);
 
187
 
 
188
   Ginterface_Inject_FilterStatus();
 
189
 
 
190
   button = gtk_button_new_with_mnemonic ("_W] Edit filter chain");
 
191
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Edit_Source_Filters), &mode);
 
192
   gtk_table_attach ( GTK_TABLE (itable), button, 2, 3, 0, 1, 0, 0, 5, 5);
 
193
   gtk_widget_show (button);
 
194
 
 
195
   button = gtk_button_new_with_mnemonic ("_E] Edit filter chain");
 
196
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Edit_Dest_Filters), &mode);
 
197
   gtk_table_attach ( GTK_TABLE (itable), button, 2, 3, 1, 2, 0, 0, 5, 5);
 
198
   gtk_widget_show (button);
 
199
 
 
200
   Parser_LoadFilters(""); // what does this do?
 
201
 
 
202
   gtk_widget_show (filter_window);
 
203
}
 
204
 
 
205
void Toggle_Source_Filters(GtkWidget *button, gpointer *data) {
 
206
   if (!filter_on_source && !Filter_Array_Source)
 
207
   {
 
208
      Ginterface_PopUp("The Source chain is empty !!");
 
209
   }
 
210
   else if (FilterDrop_CheckMode(Filter_Array_Source, inject_mode))
 
211
   {
 
212
      Ginterface_PopUp("The chain contains filter(s) that can be used only in ARPBASED mode !!");
 
213
   }
 
214
   else
 
215
   {
 
216
      if (!filter_on_source)
 
217
         switch(FilterDrop_Validation(Filter_Array_Source))
 
218
         {
 
219
            case 1:
 
220
               Ginterface_PopUp("CAUTION: the filter chain contains a loop...\nettercap may hang up. please review your filter chain...");
 
221
               break;
 
222
            case 2:
 
223
               Ginterface_PopUp("CAUTION: filter with a jump outside the chain !!!\nettercap will sig fault. review your filter chain immediately !");
 
224
               return;
 
225
               break;
 
226
         }
 
227
      filter_on_source = (filter_on_source) ? 0 : 1;
 
228
   }
 
229
 
 
230
   Ginterface_Inject_FilterStatus();
 
231
}
 
232
 
 
233
void Toggle_Dest_Filters(GtkWidget *button, gpointer *data) {
 
234
 
 
235
   if (!filter_on_dest && !Filter_Array_Dest)
 
236
   {
 
237
      Ginterface_PopUp("The Dest chain is empty !!");
 
238
   }
 
239
   else if (FilterDrop_CheckMode(Filter_Array_Dest, inject_mode))
 
240
   {
 
241
      Ginterface_PopUp("The chain contains filter(s) that can be used only in ARPBASED mode !!");
 
242
   }
 
243
   else
 
244
   {
 
245
      if (!filter_on_dest)
 
246
         switch(FilterDrop_Validation(Filter_Array_Dest))
 
247
         {
 
248
            case 1:
 
249
               Ginterface_PopUp("CAUTION: the filter chain contains a loop...\nettercap may hang up. please review your filter chain...");
 
250
               break;
 
251
            case 2:
 
252
               Ginterface_PopUp("CAUTION: filter with a jump outside the chain !!!\nettercap will sig fault. review your filter chain immediately !");
 
253
               return;
 
254
               break;
 
255
         }
 
256
      filter_on_dest = (filter_on_dest) ? 0 : 1;
 
257
   }
 
258
 
 
259
   Ginterface_Inject_FilterStatus();
 
260
}
 
261
 
 
262
void Edit_Source_Filters(GtkWidget *button, gpointer *data) {
 
263
   filter_on_source = 0;
 
264
   Ginterface_Inject_EditFilters(Filter_Array_Source);
 
265
      switch(FilterDrop_Validation(Filter_Array_Source))
 
266
      {
 
267
         case 1:
 
268
            Ginterface_PopUp("CAUTION: the source filter chain contains a loop...\nettercap may hang up. please review your filter chain...");
 
269
            break;
 
270
         case 2:
 
271
            Ginterface_PopUp("CAUTION: filter with a jump outside the chain !!!\nettercap will sig fault. review your filter chain immediately !");
 
272
            return;
 
273
            break;
 
274
      }
 
275
   Ginterface_Inject_FilterStatus();
 
276
}
 
277
 
 
278
void Edit_Dest_Filters(GtkWidget *button, gpointer *data) {
 
279
   filter_on_dest = 0;
 
280
   Ginterface_Inject_EditFilters(Filter_Array_Dest);
 
281
      switch(FilterDrop_Validation(Filter_Array_Dest))
 
282
      {
 
283
         case 1:
 
284
            Ginterface_PopUp("CAUTION: the dest filter chain contains a loop...\nettercap may hang up. please review your filter chain...");
 
285
            break;
 
286
         case 2:
 
287
            Ginterface_PopUp("CAUTION: filter with a jump outside the chain !!!\nettercap will sig fault. review your filter chain immediately !");
 
288
            return;
 
289
            break;
 
290
      }
 
291
   Ginterface_Inject_FilterStatus();
 
292
}
 
293
 
 
294
int Ginterface_Inject_Filter(DROP_FILTER *filters)
 
295
{
 
296
   GtkWidget *popup, *entry[6], *label, *itable, *textview[2], *scrolled;
 
297
   GtkTextBuffer *textbuf[2];
 
298
   // 0 Proto, 1 Source Port, 2 Dest Port, 3 action, 4 match, 5 no match
 
299
   int finished = 0;
 
300
   int status = 0;
 
301
   char tmp[10];
 
302
 
 
303
   DEBUG_MSG("Ginterface_Inject_Filter");
 
304
 
 
305
   popup = gtk_dialog_new_with_buttons ("Edit Filter", GTK_WINDOW (window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
306
                                 "Set Filter", GTK_RESPONSE_YES, "Cancel", GTK_RESPONSE_NO, NULL);
 
307
   gtk_window_set_position (GTK_WINDOW (popup), GTK_WIN_POS_CENTER);
 
308
 
 
309
   itable = gtk_table_new (6, 8, FALSE);
 
310
   gtk_container_add (GTK_CONTAINER (GTK_DIALOG(popup)->vbox), itable);
 
311
   gtk_widget_show(itable);
 
312
 
 
313
   label = gtk_label_new_with_mnemonic ("_Proto: ");
 
314
   gtk_table_attach (GTK_TABLE (itable), label, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
315
   gtk_widget_show(label);
 
316
 
 
317
   entry[0] = gtk_entry_new ();
 
318
   gtk_entry_set_width_chars(GTK_ENTRY (entry[0]), 3);
 
319
   gtk_table_attach (GTK_TABLE (itable), entry[0], 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
320
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (entry[0]));
 
321
   gtk_widget_show(entry[0]);
 
322
 
 
323
   label = gtk_label_new_with_mnemonic ("_Source port :");
 
324
   gtk_table_attach (GTK_TABLE (itable), label, 2, 3, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
325
   gtk_widget_show(label);
 
326
 
 
327
   entry[1] = gtk_entry_new ();
 
328
   gtk_entry_set_width_chars(GTK_ENTRY (entry[1]), 5);
 
329
   gtk_table_attach (GTK_TABLE (itable), entry[1], 3, 4, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
330
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (entry[1]));
 
331
   gtk_widget_show(entry[1]);
 
332
 
 
333
   label = gtk_label_new_with_mnemonic ("_Dest port :");
 
334
   gtk_table_attach (GTK_TABLE (itable), label, 4, 5, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
335
   gtk_widget_show(label);
 
336
 
 
337
   entry[2] = gtk_entry_new ();
 
338
   gtk_entry_set_width_chars(GTK_ENTRY (entry[2]), 5);
 
339
   gtk_table_attach (GTK_TABLE (itable), entry[2], 5, 6, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
340
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (entry[2]));
 
341
   gtk_widget_show(entry[2]);
 
342
 
 
343
   label = gtk_label_new_with_mnemonic ("Searc_h :");
 
344
   gtk_table_attach (GTK_TABLE (itable), label, 0, 6, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
345
   gtk_widget_show(label);
 
346
 
 
347
   scrolled = gtk_scrolled_window_new(NULL, NULL);
 
348
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
349
   gtk_table_attach (GTK_TABLE (itable), scrolled, 0, 6, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
 
350
   gtk_widget_show (scrolled);
 
351
 
 
352
   textview[0] = gtk_text_view_new ();
 
353
   textbuf[0] = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview[0]));
 
354
   gtk_container_add(GTK_CONTAINER (scrolled), textview[0]);
 
355
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (textview[0]));
 
356
   gtk_widget_show(textview[0]);
 
357
   
 
358
   label = gtk_label_new_with_mnemonic ("_Action (Drop/Replace/Log) :");
 
359
   gtk_table_attach (GTK_TABLE (itable), label, 0, 3, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
360
   gtk_widget_show(label);
 
361
 
 
362
   entry[3] = gtk_entry_new ();
 
363
   gtk_entry_set_width_chars(GTK_ENTRY (entry[3]), 7);
 
364
   gtk_table_attach (GTK_TABLE (itable), entry[3], 3, 6, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
365
   gtk_widget_show(entry[3]);
 
366
 
 
367
   label = gtk_label_new_with_mnemonic ("_Replace :");
 
368
   gtk_table_attach (GTK_TABLE (itable), label, 0, 6, 4, 5, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
369
   gtk_widget_show(label);
 
370
 
 
371
   scrolled = gtk_scrolled_window_new(NULL, NULL);
 
372
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
373
   gtk_table_attach (GTK_TABLE (itable), scrolled, 0, 6, 5, 6, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
 
374
   gtk_widget_show (scrolled);
 
375
 
 
376
   textview[1] = gtk_text_view_new ();
 
377
   textbuf[1] = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview[1]));
 
378
   gtk_container_add(GTK_CONTAINER (scrolled), textview[1]);
 
379
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (textview[1]));
 
380
   gtk_widget_show(textview[1]);
 
381
 
 
382
   label = gtk_label_new_with_mnemonic ("Goto if _match         :");
 
383
   gtk_table_attach (GTK_TABLE (itable), label, 0, 3, 6, 7, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
384
   gtk_widget_show(label);
 
385
 
 
386
   entry[4] = gtk_entry_new ();
 
387
   gtk_entry_set_width_chars(GTK_ENTRY (entry[4]), 3);
 
388
   gtk_table_attach (GTK_TABLE (itable), entry[4], 3, 6, 6, 7, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
389
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (entry[4]));
 
390
   gtk_widget_show(entry[4]);
 
391
 
 
392
   label = gtk_label_new_with_mnemonic ("Goto if does_n't match :");  
 
393
   gtk_table_attach (GTK_TABLE (itable), label, 0, 3, 7, 8, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
394
   gtk_widget_show(label);
 
395
 
 
396
   entry[5] = gtk_entry_new ();
 
397
   gtk_entry_set_width_chars(GTK_ENTRY (entry[5]), 3);
 
398
   gtk_table_attach (GTK_TABLE (itable), entry[5], 3, 6, 7, 8, GTK_FILL | GTK_EXPAND, 0, 0, 0);
 
399
   gtk_label_set_mnemonic_widget(GTK_LABEL (label), GTK_WIDGET (entry[5]));
 
400
   gtk_widget_show(entry[5]);
 
401
 
 
402
   if (filters[gFil_Pointer].proto == 'T')
 
403
      snprintf(tmp, sizeof(tmp), "TCP");
 
404
   else if (filters[gFil_Pointer].proto == 'U')
 
405
      snprintf(tmp, sizeof(tmp), "UDP");
 
406
   else 
 
407
      snprintf(tmp, sizeof(tmp), "   ");
 
408
   gtk_entry_set_text(GTK_ENTRY (entry[0]), tmp);
 
409
 
 
410
   snprintf(tmp, sizeof(tmp), "%d",  filters[gFil_Pointer].source);
 
411
   gtk_entry_set_text(GTK_ENTRY (entry[1]), tmp);
 
412
   snprintf(tmp, sizeof(tmp), "%d",  filters[gFil_Pointer].dest);
 
413
   gtk_entry_set_text(GTK_ENTRY (entry[2]), tmp);
 
414
   gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER (textbuf[0]), filters[gFil_Pointer].display_search, -1);
 
415
   snprintf(tmp, sizeof(tmp), "%c",  filters[gFil_Pointer].type);
 
416
   gtk_entry_set_text(GTK_ENTRY (entry[3]), tmp);
 
417
   gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER (textbuf[1]), filters[gFil_Pointer].display_replace, -1);
 
418
 
 
419
   snprintf(tmp, sizeof(tmp), "%d",  filters[gFil_Pointer].go_to);
 
420
   if (!strcmp(tmp, "-1"))
 
421
      gtk_entry_set_text(GTK_ENTRY (entry[4]), "   ");
 
422
   else
 
423
      gtk_entry_set_text(GTK_ENTRY (entry[4]), tmp);
 
424
 
 
425
   snprintf(tmp, sizeof(tmp), "%d",  filters[gFil_Pointer].else_go_to);
 
426
   if (!strcmp(tmp, "-1"))
 
427
      gtk_entry_set_text(GTK_ENTRY (entry[5]), "   ");
 
428
   else
 
429
      gtk_entry_set_text(GTK_ENTRY (entry[5]), tmp);
 
430
 
 
431
   finished = gtk_dialog_run(GTK_DIALOG (popup));
 
432
 
 
433
   if (finished == -8) {
 
434
      GtkTextIter start[2], end[2];
 
435
      char tmp_search[MAX_FILTER+1];
 
436
 
 
437
      gtk_text_buffer_get_bounds(textbuf[0], &start[0], &end[0]);
 
438
      gtk_text_buffer_get_bounds(textbuf[1], &start[1], &end[1]);
 
439
 
 
440
      pthread_mutex_lock(&filter_mutex);
 
441
 
 
442
      memset(&filters[gFil_Pointer], 0, sizeof(DROP_FILTER));
 
443
 
 
444
      memcpy(&filters[gFil_Pointer].proto, gtk_entry_get_text(GTK_ENTRY (entry[0])), 1);
 
445
      filters[gFil_Pointer].proto = toupper(filters[gFil_Pointer].proto);
 
446
 
 
447
      filters[gFil_Pointer].source = atoi(gtk_entry_get_text(GTK_ENTRY (entry[1])));
 
448
      filters[gFil_Pointer].dest = atoi(gtk_entry_get_text(GTK_ENTRY (entry[2])));
 
449
 
 
450
      memcpy(&filters[gFil_Pointer].display_search, gtk_text_buffer_get_text(textbuf[0], &start[0], &end[0], FALSE), MAX_FILTER);
 
451
      trim_buffer(filters[gFil_Pointer].display_search, ' ');
 
452
      filters[gFil_Pointer].wildcard = FilterDrop_ParseWildcard(tmp_search, filters->display_search, sizeof(tmp_search));
 
453
      filters[gFil_Pointer].slen = FilterDrop_strescape(filters[gFil_Pointer].search, tmp_search);
 
454
 
 
455
      memcpy(&filters[gFil_Pointer].display_replace, gtk_text_buffer_get_text(textbuf[1], &start[1], &end[1], FALSE), MAX_FILTER);
 
456
      trim_buffer(filters[gFil_Pointer].display_replace, ' ');
 
457
      filters[gFil_Pointer].rlen = FilterDrop_strescape(filters[gFil_Pointer].replace, filters[gFil_Pointer].display_replace);
 
458
 
 
459
      memcpy(&filters[gFil_Pointer].type, gtk_entry_get_text(GTK_ENTRY (entry[3])), 1);
 
460
      filters[gFil_Pointer].type = toupper(filters[gFil_Pointer].type);
 
461
 
 
462
      if (!strcmp(gtk_entry_get_text(GTK_ENTRY (entry[4])), "   "))
 
463
         filters[gFil_Pointer].go_to = -1;
 
464
      else
 
465
         filters[gFil_Pointer].go_to = atoi(gtk_entry_get_text(GTK_ENTRY (entry[4])));
 
466
 
 
467
      if (!strcmp(gtk_entry_get_text(GTK_ENTRY (entry[5])), "   "))
 
468
         filters[gFil_Pointer].else_go_to = -1;
 
469
      else
 
470
         filters[gFil_Pointer].else_go_to = atoi(gtk_entry_get_text(GTK_ENTRY (entry[5])));
 
471
 
 
472
      pthread_mutex_unlock(&filter_mutex);
 
473
 
 
474
      status = 1;
 
475
   }
 
476
 
 
477
   gtk_widget_destroy (popup);
 
478
 
 
479
   return status;
 
480
}
 
481
 
 
482
void Ginterface_Inject_EditFilters_InitList(DROP_FILTER *FA_ptr)
 
483
{
 
484
   int j;
 
485
   int num_filter;
 
486
 
 
487
   if (FA_ptr == Filter_Array_Source)
 
488
      num_filter = Filter_Source;
 
489
   else
 
490
      num_filter = Filter_Dest;
 
491
 
 
492
   if (gFil_Pointer >= num_filter) gFil_Pointer = num_filter-1;
 
493
 
 
494
   if(filterlist)
 
495
      gtk_list_store_clear(filterlist);
 
496
   else {
 
497
      filterlist = gtk_list_store_new (1, G_TYPE_STRING);
 
498
      gtk_tree_view_set_model (GTK_TREE_VIEW (c_treeview), GTK_TREE_MODEL (filterlist));
 
499
   }
 
500
 
 
501
   if (num_filter == 0)
 
502
   {
 
503
      gtk_list_store_append (filterlist, &c_listiter);
 
504
      gtk_list_store_set (filterlist, &c_listiter, 0, "NO FILTER IN THIS CHAIN", -1);
 
505
   } else {
 
506
      for(j=gFil_Base_Pointer; j<num_filter; j++)
 
507
      {
 
508
         gtk_list_store_append (filterlist, &c_listiter);
 
509
         gtk_list_store_set (filterlist, &c_listiter, 0, Parser_PrintFilter(FA_ptr, j), -1);
 
510
      }
 
511
   }
 
512
}
 
513
 
 
514
void Ginterface_Inject_ChainWindow (DROP_FILTER *FA_ptr)
 
515
{
 
516
   GtkWidget *chain_dialog;
 
517
   GtkCellRenderer *renderer;
 
518
   GtkTreeViewColumn *column;
 
519
   GtkWidget *box, *button, *scrolled = NULL;
 
520
 
 
521
   chain_dialog = gtk_dialog_new_with_buttons ("Filters :", GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, "Close", GTK_RESPONSE_CLOSE, NULL);
 
522
   gtk_window_set_default_size(GTK_WINDOW (chain_dialog), 300, 200);
 
523
   g_signal_connect (GTK_OBJECT (chain_dialog), "response", G_CALLBACK (Ginterface_Inject_CloseChainWindow), NULL);
 
524
 
 
525
   scrolled = gtk_scrolled_window_new(NULL, NULL);
 
526
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
527
   gtk_box_pack_start (GTK_BOX(GTK_DIALOG(chain_dialog)->vbox),  scrolled, TRUE, TRUE, 0);
 
528
   gtk_widget_show (scrolled);
 
529
 
 
530
   c_treeview = gtk_tree_view_new ();
 
531
   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (c_treeview), FALSE);
 
532
   /* add the column */
 
533
   renderer = gtk_cell_renderer_text_new ();
 
534
   column = gtk_tree_view_column_new_with_attributes ("Chains", renderer, "text", 0, NULL);
 
535
   gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(c_treeview), FALSE);
 
536
   gtk_tree_view_column_set_sort_column_id (column, 0);
 
537
   gtk_tree_view_append_column (GTK_TREE_VIEW (c_treeview), column);
 
538
   /* connect signals */
 
539
   c_select = gtk_tree_view_get_selection (GTK_TREE_VIEW (c_treeview));
 
540
   gtk_tree_selection_set_mode (c_select, GTK_SELECTION_SINGLE);
 
541
   g_signal_connect (G_OBJECT (c_select), "changed", G_CALLBACK (Ginterface_Inject_EditFilters_PointItem), NULL);
 
542
   g_signal_connect (G_OBJECT (c_treeview), "row_activated", G_CALLBACK (Ginterface_Inject_SelectItem), "!");
 
543
   /* add it and display it */
 
544
   gtk_container_add(GTK_CONTAINER (scrolled), c_treeview);
 
545
   gtk_widget_show(c_treeview);
 
546
 
 
547
   box = gtk_hbox_new(TRUE, 5);
 
548
 
 
549
   button = gtk_button_new_with_mnemonic ("_Add");
 
550
   gtk_box_pack_start (GTK_BOX(box), button, FALSE, TRUE, 0);
 
551
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Ginterface_Inject_Callback), "a");
 
552
   gtk_widget_show (button);
 
553
 
 
554
   button = gtk_button_new_with_mnemonic ("_Delete");
 
555
   gtk_box_pack_start (GTK_BOX(box), button, FALSE, TRUE, 0);
 
556
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Ginterface_Inject_Callback), "d");
 
557
   gtk_widget_show (button);
 
558
 
 
559
   button = gtk_button_new_with_mnemonic ("_Save");
 
560
   gtk_box_pack_start (GTK_BOX(box), button, FALSE, TRUE, 0);
 
561
   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Ginterface_Inject_Callback), "s");
 
562
   gtk_widget_show (button);
 
563
 
 
564
   gtk_box_pack_start (GTK_BOX(GTK_DIALOG(chain_dialog)->vbox), box, FALSE, TRUE, 0);
 
565
   gtk_widget_show(box);
 
566
 
 
567
   Ginterface_Inject_EditFilters_InitList(FA_ptr);
 
568
 
 
569
   gtk_widget_show(chain_dialog);
 
570
}
 
571
 
 
572
void Ginterface_Inject_EditFilters_PointItem(GtkWidget *widget, gpointer data) /* DROP_FILTER *FA_ptr, char direction) */
 
573
{
 
574
   GtkTreeIter iter;
 
575
   GtkTreeModel *model;
 
576
   gchar *lineptr;
 
577
 
 
578
   if (gtk_tree_selection_get_selected (GTK_TREE_SELECTION (widget), &model, &iter)) {
 
579
      gtk_tree_model_get (model, &iter, 0, &lineptr, -1);
 
580
      gFil_Pointer = atoi(strtok(lineptr, "|"));
 
581
      g_free(lineptr);
 
582
   } else return;
 
583
}
 
584
 
 
585
/* the row_activated signal requires a function in this form, even though we don't need all the args */
 
586
void Ginterface_Inject_SelectItem(GtkTreeView *treeview, gpointer arg1, GtkTreeViewColumn *arg2, gpointer data)
 
587
{
 
588
   Ginterface_Inject_Callback(GTK_WIDGET (treeview), (gpointer) data);
 
589
}
 
590
 
 
591
void Ginterface_Inject_EditFilters(DROP_FILTER *FA_ptr)
 
592
{
 
593
   DEBUG_MSG("Ginterface_Inject_EditFilters");
 
594
 
 
595
   gFA_ptr = FA_ptr;
 
596
 
 
597
   gFil_Pointer = gFil_Base_Pointer = 0;
 
598
 
 
599
   Ginterface_Inject_ChainWindow(FA_ptr);
 
600
}
 
601
 
 
602
void Ginterface_Inject_Callback(GtkWidget *widget, gpointer data)
 
603
{
 
604
   gchar action = '!';
 
605
 
 
606
   sscanf(data, "%c", &action);
 
607
 
 
608
   switch (action)
 
609
      {
 
610
         case '!':
 
611
                  Ginterface_Inject_Filter(gFA_ptr);
 
612
                  if (gFA_ptr[gFil_Pointer].slen == 0 && gFA_ptr[gFil_Pointer].type == 'R')
 
613
                  {
 
614
                     Ginterface_PopUp("NOT a good idea setting a zero length search string with Replace method...\nplease re-Edit this filter or ettercap will hang up on it !!");
 
615
                     if (gFA_ptr == Filter_Array_Source)  // safe disable the filter chain
 
616
                        filter_on_source = 0;
 
617
                     else
 
618
                        filter_on_dest = 0;
 
619
                  }
 
620
                  Ginterface_Inject_EditFilters_InitList(gFA_ptr);
 
621
                  break;
 
622
         case 'A':
 
623
         case 'a':
 
624
                  if (gFA_ptr == Filter_Array_Source)
 
625
                  {
 
626
                     FilterDrop_AddFilter(Filter_Array_Source);
 
627
                     gFA_ptr = Filter_Array_Source;
 
628
                  }
 
629
                  else if (gFA_ptr == Filter_Array_Dest)
 
630
                  {
 
631
                     FilterDrop_AddFilter(Filter_Array_Dest);
 
632
                     gFA_ptr = Filter_Array_Dest;
 
633
                  }
 
634
                  Ginterface_Inject_EditFilters_InitList(gFA_ptr);
 
635
                  break;
 
636
         case 'D':
 
637
         case 'd':
 
638
                  FilterDrop_DelFilter(gFA_ptr, gFil_Pointer);
 
639
                  Ginterface_Inject_EditFilters_InitList(gFA_ptr);
 
640
                  break;
 
641
 
 
642
         case 'S':
 
643
         case 's':
 
644
                  FilterDrop_SaveFilter();
 
645
                  Ginterface_PopUp("Filter chain saved !");
 
646
                  break;
 
647
         case 'H':
 
648
         case 'h':{
 
649
                     static char *help[] = {
 
650
                        "[qQ][F10] - quit",
 
651
                        "[return]  - edit the selected filter",
 
652
                        "[dD]      - Delete the filter",
 
653
                        "[aA]      - Add a new filter",
 
654
                        "[sS]      - Save the filters chain",
 
655
                        NULL};
 
656
                     Ginterface_HelpWindow(help);
 
657
                  }
 
658
                  break;
 
659
      }
 
660
}
 
661
 
 
662
void Ginterface_Inject_CloseChainWindow (GtkWidget *widget, gpointer data)
 
663
{
 
664
   if (Ginterface_PopUpQ("Do you want to save the filters chain (y/n)?")=='y')
 
665
      FilterDrop_SaveFilter();
 
666
 
 
667
   // g_signal_handlers_block_by_func (G_OBJECT (c_select), G_CALLBACK (Ginterface_Inject_EditFilters_PointItem), NULL);
 
668
 
 
669
   gtk_widget_destroy (widget);
 
670
   g_free(filterlist);
 
671
   filterlist = NULL;
 
672
 
 
673
   Parser_LoadFilters("");
 
674
   return;
 
675
}
 
676
 
 
677
/* EOF */
 
678
 
 
679
// vim:ts=3:expandtab
 
680