root/tags/umit-1.0beta2/umit/gui/NmapOutputViewer.py @ 4485

Revision 4485, 16.2 kB (checked in by gpolo, 4 years ago)

Tagging the Umit 1.0beta2 release.

Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Copyright (C) 2005-2006 Insecure.Com LLC.
5# Copyright (C) 2007-2008 Adriano Monteiro Marques
6#
7# Author: Adriano Monteiro Marques <adriano@umitproject.org>
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
23import sys
24import gtk
25import gtk.gdk
26import pango
27import re
28
29from threading import Thread
30
31from higwidgets.higbuttons import HIGButton
32from higwidgets.higboxes import HIGVBox
33
34from umit.core.I18N import _, enc
35from umit.core.UmitLogging import log
36from umit.core.UmitConf import NmapOutputHighlight
37
38from umit.gui.NmapOutputProperties import NmapOutputProperties
39
40class NmapOutputViewer (HIGVBox):
41    def __init__ (self, refresh=1, stop=1):
42        self.nmap_highlight = NmapOutputHighlight()
43        HIGVBox.__init__ (self)
44       
45        # Creating widgets
46        self.__create_widgets()
47       
48        # Setting scrolled window
49        self.__set_scrolled_window()
50       
51        # Setting text view
52        self.__set_text_view()
53       
54        # Setting buttons
55        self.__set_buttons()
56       
57        # Getting text buffer
58        self.text_buffer = self.text_view.get_buffer()
59       
60        self.refreshing = True
61        self.thread = Thread()
62       
63        # Adding widgets to the VPaned
64        self._pack_expand_fill(self.scrolled)
65        self._pack_noexpand_nofill(self.hbox_buttons)
66       
67        self.nmap_output_file = None
68        self.nmap_previous_output = ''
69        self.brazil = True
70
71        # We have to create a mark to follow changes in the view with left grav.
72        self.mark = self.text_buffer.create_mark(
73            'start', 
74            self.text_buffer.get_start_iter(),
75            True
76        )
77       
78        self.__create_tags()
79
80
81    def __create_tags(self):
82        tag_table = self.text_buffer.get_tag_table()
83        tag_table.foreach(lambda tag, table: table.remove(tag), tag_table)
84       
85        properties = ["details",
86              "date",
87              "hostname",
88              "ip",
89              "port_list",
90              "open_port",
91              "closed_port",
92              "filtered_port"]
93       
94        for p in xrange(len(properties)):
95            settings = self.nmap_highlight.__getattribute__(properties[p])
96           
97            # Create a tag name
98            tag = gtk.TextTag(properties[p])
99               
100            if settings[0]:
101                tag.set_property("weight", pango.WEIGHT_HEAVY)
102            else:
103                tag.set_property("weight", pango.WEIGHT_NORMAL)
104               
105            if settings[1]:
106                tag.set_property("style", pango.STYLE_ITALIC)
107            else:
108                tag.set_property("style", pango.STYLE_NORMAL)
109           
110            if settings[2]:
111                tag.set_property("underline", pango.UNDERLINE_SINGLE)
112            else:
113                tag.set_property("underline", pango.UNDERLINE_NONE)
114
115            text_color = settings[3]
116            highlight_color = settings[4]
117
118            tag.set_property("foreground",
119gtk.color_selection_palette_to_string([gtk.gdk.Color(*text_color),]))
120            tag.set_property("background",
121gtk.color_selection_palette_to_string([gtk.gdk.Color(*highlight_color),]))
122
123            tag_table.add(tag)
124            tag.set_priority(p)
125       
126        # brasil tags
127        names = ('brasil1', 'brasil2', 'brasil3')
128        prop = ('foreground', 'background', 'weight')
129        values = (('#EAFF00', '#21C800', pango.WEIGHT_HEAVY),
130                  ('#0006FF', '#21C800', pango.WEIGHT_HEAVY),
131                  ('#FFFFFF', '#21C800', pango.WEIGHT_HEAVY))
132       
133        for i in xrange(len(names)):
134            tag = gtk.TextTag(names[i])
135            for tup in zip(prop, values[i]):
136                tag.set_property(tup[0], tup[1])
137            tag_table.add(tag)
138
139        self.txg_font = gtk.TextTag()
140        self.txg_date = gtk.TextTag()
141        self.txg_font.set_property("family", "Monospace")
142
143        tag_table.add(self.txg_font)
144        tag_table.add(self.txg_date)
145   
146    def __create_widgets (self):
147        # Creating widgets
148        self.scrolled = gtk.ScrolledWindow ()
149        self.text_view = gtk.TextView ()
150        self.btn_refresh = gtk.Button (stock=gtk.STOCK_REFRESH)
151        self.check_enable_color = gtk.CheckButton(\
152            _("Enable Nmap output highlight"))
153        self.btn_output_properties = HIGButton(stock=gtk.STOCK_PREFERENCES)
154        self.hbox_buttons = gtk.HBox (spacing=5)
155   
156    def __set_scrolled_window(self):
157        # By default the vertical scroller remains at bottom
158        self._scroll_at_bottom = True
159
160        # Seting scrolled window
161        self.scrolled.set_border_width(5)
162        self.scrolled.add(self.text_view)
163        self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
164        self.scrolled.set_size_request(450, 350)
165        vadjust = self.scrolled.get_vadjustment()
166        vadjust.connect('changed', self.__adjustment_update)
167        vadjust.connect('value-changed', self.__adjustment_at_bottom)
168
169    def __adjustment_at_bottom(self, adjustment):
170        vadjust_end = adjustment.upper - adjustment.page_size
171        self._scroll_at_bottom = adjustment.value == vadjust_end
172
173    def __adjustment_update(self, adjustment):
174        if self._scroll_at_bottom:
175            adjustment.set_value(adjustment.upper - adjustment.page_size)
176
177    def __set_text_view(self):
178        self.text_view.set_wrap_mode(gtk.WRAP_WORD)
179        self.text_view.set_editable(False)
180       
181    def __set_buttons (self):
182        self.check_enable_color.set_active(self.nmap_highlight.enable)
183       
184        # Connecting events
185        self.btn_refresh.connect('clicked',
186                                 self.refresh_output)
187        self.btn_output_properties.connect("clicked",
188                                           self.show_output_properties)
189        self.check_enable_color.connect("toggled",
190                                        self.enable_color_highlight)
191       
192        # Setting hbox
193        self.hbox_buttons.set_border_width(5)
194       
195        # Packing buttons
196        self.hbox_buttons.pack_start(self.check_enable_color)
197        self.hbox_buttons.pack_start(self.btn_output_properties)
198        self.hbox_buttons.pack_start(self.btn_refresh)
199
200    def enable_color_highlight(self, widget):
201        if widget.get_active():
202            self.nmap_highlight.enable = 1
203        else:
204            self.nmap_highlight.enable = 0
205
206        self.update_output_colors()
207
208    def show_output_properties(self, widget):
209        nmap_out_prop = NmapOutputProperties(self.text_view)
210        nmap_out_prop.run()
211       
212        for prop in nmap_out_prop.property_names:
213            widget = nmap_out_prop.property_names[prop][8]
214
215            wid_props = []
216
217            if widget.bold:
218                wid_props.append(1)
219            else:
220                wid_props.append(0)
221
222            if widget.italic:
223                wid_props.append(1)
224            else:
225                wid_props.append(0)
226
227            if widget.underline:
228                wid_props.append(1)
229            else:
230                wid_props.append(0)
231 
232            wid_props.append("(%s, %s, %s)" % (widget.text_color.red,
233                                               widget.text_color.green,
234                                               widget.text_color.blue))
235            wid_props.append("(%s, %s, %s)" % (widget.highlight_color.red,
236                                               widget.highlight_color.green,
237                                               widget.highlight_color.blue))
238
239            self.nmap_highlight.__setattr__(widget.property_name, wid_props)
240           
241        nmap_out_prop.destroy()
242        self.nmap_highlight.save_changes()
243       
244        # TODO: Foreach in all tabs to update ?
245        self.__create_tags()
246
247        self.update_output_colors()
248   
249    def update_output_colors(self, dialog=None, response_id=None):
250        self.text_buffer.move_mark(self.mark, self.text_buffer.get_start_iter())
251
252        buff = self.text_view.get_buffer()
253        tag_table = buff.get_tag_table()
254       
255        # Get the not-parsed text
256        start = self.text_buffer.get_iter_at_mark(self.mark)
257        end = self.text_buffer.get_end_iter()
258       
259        self.text_buffer.remove_all_tags(start, end)
260        self.text_buffer.apply_tag(self.txg_font, start, end)
261       
262        if not self.nmap_highlight.enable or start == end:
263            return
264       
265        text = buff.get_text(start, end)
266       
267        # Get the line offset
268        offset = start.get_line()
269       
270        if text:
271            text = text.split("\n")
272            properties = ["details",
273                          "date",
274                          "hostname",
275                          "ip",
276                          "port_list",
277                          "open_port",
278                          "closed_port",
279                          "filtered_port"]
280           
281            for pos in xrange(len(text)):
282                if not text[pos]:
283                    continue
284               
285                for p in xrange(len(properties)):
286                    settings = self.nmap_highlight.__getattribute__(\
287                        properties[p])
288                    match = re.finditer(settings[5], text[pos])
289                   
290                    for m in match:
291                        buff.apply_tag(tag_table.lookup(properties[p]),
292                                       buff.get_iter_at_line_index(pos + offset,
293                                                                   m.start()),
294                                       buff.get_iter_at_line_index(pos + offset,
295                                                                   m.end()))
296                   
297                    tag1 = tag_table.lookup('brasil1')
298                    tag2 = tag_table.lookup('brasil2')
299                    tag3 = tag_table.lookup('brasil3')
300                   
301                    match = re.finditer("Bra[sz]il", text[pos])
302                   
303                    for m in match:
304                        buff.apply_tag(tag1,
305                                       buff.get_iter_at_line_index(pos + offset,
306                                                                   m.start()),
307                                       buff.get_iter_at_line_index(pos + offset,
308                                                                   m.end() - 5))
309
310                        buff.apply_tag(tag2,
311                                       buff.get_iter_at_line_index(pos + offset,
312                                                                m.start() + 1),
313                                       buff.get_iter_at_line_index(pos + offset,
314                                                                   m.end() -4))
315
316                        buff.apply_tag(tag3,
317                                       buff.get_iter_at_line_index(pos + offset,
318                                                                m.start() + 2),
319                                       buff.get_iter_at_line_index(pos + offset,
320                                                                   m.end() - 3))
321                       
322                        buff.apply_tag(tag1,
323                                       buff.get_iter_at_line_index(pos + offset,
324                                                                m.start() + 3),
325                                       buff.get_iter_at_line_index(pos + offset,
326                                                                   m.end() - 2))
327
328                        buff.apply_tag(tag2,
329                                       buff.get_iter_at_line_index(pos + offset,
330                                                                m.start() + 4),
331                                       buff.get_iter_at_line_index(pos + offset,
332                                                                   m.end() - 1))
333
334                        buff.apply_tag(tag3,
335                                       buff.get_iter_at_line_index(pos + offset,
336                                                                m.start() + 5),
337                                       buff.get_iter_at_line_index(pos + offset,
338                                                                   m.end()))
339                    else:
340                        self._brasil_log()
341                   
342                    match = re.finditer("BRT", text[pos])
343                   
344                    for m in match:
345                        buff.apply_tag(tag1,
346                                       buff.get_iter_at_line_index(pos + offset,
347                                                                   m.start()),
348                                       buff.get_iter_at_line_index(pos + offset,
349                                                                   m.end() - 2))
350
351                        buff.apply_tag(tag2,
352                                       buff.get_iter_at_line_index(pos + offset,
353                                                                m.start() + 1),
354                                       buff.get_iter_at_line_index(pos + offset,
355                                                                   m.end() -1))
356
357                        buff.apply_tag(tag3,
358                                       buff.get_iter_at_line_index(pos + offset,
359                                                                m.start() + 2),
360                                       buff.get_iter_at_line_index(pos + offset,
361                                                                   m.end()))
362                    else:
363                        self._brasil_log()
364                   
365        self.text_buffer.move_mark(self.mark, self.text_buffer.get_end_iter())
366
367    def _brasil_log(self):
368        if self.brazil:
369            log.info("Isto aqui, o o")
370            log.info("E um pouquinho de Brasil, io io")
371            log.info("Deste Brasil que canta e e feliz")
372            log.info("Feliz, feliz")
373            log.info("")
374            log.info("E tambem um pouco de uma raca")
375            log.info("Que nao tem medo de fumaca ai, ai")
376            log.info("E nao se entrega, nao ")
377            log.info("")
378            log.info('Olha o jeito das "cadera"  que ela sabe dar')
379            log.info("Olha o tombo nos quadris que ela sabe dar")
380            log.info("Olha o passe de batuque que ela sabe dar")
381            log.info("Olha so o remelexo que ela sabe dar")
382            log.info("")
383            log.info("Morena boa me faz chorar")
384            log.info("Poe a sandalia de prata")
385            log.info("e vem pro samba sambar")
386           
387            self.brazil = False
388   
389    def show_nmap_output(self, file):
390        self.nmap_output_file = file
391        self.text_buffer.set_text("")
392        self.refresh_output()
393
394    def refresh_output(self, widget=None):
395        log.debug("Refresh nmap output")
396
397        if self.nmap_output_file is not None:
398            nmap_of = open(self.nmap_output_file, "r")
399
400            new_output = nmap_of.read()
401
402            if self.nmap_previous_output != new_output:
403                # Setting text and moving mark to the start
404                # to update_colors correctly
405                text_prev_len = len(self.nmap_previous_output)
406
407                self.text_buffer.insert(
408                        self.text_buffer.get_end_iter(),
409                        enc(new_output[text_prev_len:]))
410
411                self.nmap_previous_output = new_output
412
413                self.update_output_colors()
414
415            nmap_of.close()
416
417
418if __name__ == '__main__':
419    w = gtk.Window()
420    n = NmapOutputViewer()
421    w.add(n)
422    w.show_all()
423    w.connect('delete-event', lambda x,y,z=None:gtk.main_quit())
424
425    buff = n.text_view.get_buffer()
426    buff.set_text(open("file_with_encoding_issues.txt", 'rb').read())
427
428    gtk.main()
Note: See TracBrowser for help on using the browser.