OpenSecurity/bin/opensecurity_tray.pyw
author Oliver Maurhart <oliver.maurhart@ait.ac.at>
Wed, 25 Jun 2014 22:26:34 +0200
changeset 207 ae931a692b54
parent 199 26b9a95b0da1
child 213 2e0b94e12bfc
permissions -rwxr-xr-x
format drive working
     1 # -*- coding: utf-8 -*-
     2 
     3 # ------------------------------------------------------------
     4 # opensecurity-dialog
     5 # 
     6 # an opensecurity dialog
     7 #
     8 # Autor: Oliver Maurhart, <oliver.maurhart@ait.ac.at>
     9 #
    10 # Copyright (C) 2013 AIT Austrian Institute of Technology
    11 # AIT Austrian Institute of Technology GmbH
    12 # Donau-City-Strasse 1 | 1220 Vienna | Austria
    13 # http://www.ait.ac.at
    14 #
    15 # This program is free software; you can redistribute it and/or
    16 # modify it under the terms of the GNU General Public License
    17 # as published by the Free Software Foundation version 2.
    18 # 
    19 # This program is distributed in the hope that it will be useful,
    20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
    21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    22 # GNU General Public License for more details.
    23 # 
    24 # You should have received a copy of the GNU General Public License
    25 # along with this program; if not, write to the Free Software
    26 # Foundation, Inc., 51 Franklin Street, Fifth Floor, 
    27 # Boston, MA  02110-1301, USA.
    28 # ------------------------------------------------------------
    29 
    30 
    31 # ------------------------------------------------------------
    32 # imports
    33 
    34 import argparse
    35 import json
    36 import os
    37 import subprocess
    38 import sys
    39 import urllib
    40 import urllib2
    41 import webbrowser
    42 
    43 from PyQt4 import QtCore
    44 from PyQt4 import QtGui
    45 
    46 # local
    47 import __init__ as opensecurity
    48 
    49 if sys.platform == 'win32' or sys.platform == 'cygwin':
    50     from cygwin import Cygwin
    51 
    52 import opensecurity_client_restful_server 
    53 from ui import AboutDialog
    54 from ui import ConfigureDialog
    55 from ui import opensecurity_rc
    56 
    57 
    58 # ------------------------------------------------------------
    59 # code
    60 
    61 
    62 class OpenSecurityWait(QtGui.QDialog):
    63 
    64     """OpenSecurity: please wait ..."""
    65     
    66     def __init__(self, parent = None, flags = QtCore.Qt.WindowFlags(0)):
    67         super(OpenSecurityWait, self).__init__(parent, flags)
    68         self.setWindowTitle('OpenSecurity')
    69         self.setup_ui()
    70         
    71         
    72     def setup_ui(self):
    73         """Create the widgets."""
    74         
    75         lyMain = QtGui.QVBoxLayout(self)
    76         lyMain.setContentsMargins(8, 8, 8, 8)
    77         
    78         # content area: left pixmap, right text
    79         lbTitle = QtGui.QLabel('Creating secure subsystem. Please stand by ...')
    80         lyMain.addWidget(lbTitle)
    81         
    82         self.setMinimumSize(400, 50)
    83         self.resize(lyMain.minimumSize())
    84 
    85 
    86 class OpenSecurityTrayIcon(QtGui.QSystemTrayIcon):
    87     
    88     """This is the OpenSecuirty Tray Icon"""
    89 
    90     def __init__(self, icon, parent=None):
    91         
    92         super(OpenSecurityTrayIcon, self).__init__(icon, parent)
    93         self.setup_ui()
    94         self.activated.connect(self.activated_)
    95        
    96 
    97     def activated_(self, reason):
    98 
    99         """the system tray icon was activated"""
   100         self.refresh_format_menu()
   101 
   102         
   103     def clicked_about(self):
   104         """clicked about"""
   105         d = AboutDialog()
   106         d.exec_()
   107     
   108 
   109     def clicked_browser(self):
   110         """wish for safe internet browsing"""
   111         
   112         if not (sys.platform == 'win32' or sys.platform == 'cygwin'):
   113             QtGui.QMessageBox.critical(self.parent(), 'OpenSecurity Error', 'This action is not supported on this platform.\nSorry.')
   114             return
   115        
   116         try:
   117         
   118             # get a proper browsing VM
   119             Cygwin.start_X11()
   120 
   121             # TODO: HARDCODED ADDRESS OF OPENSECURITYD
   122             browsing_vm = urllib2.urlopen('http://127.0.0.1:8080/browsing').readline()
   123             print('Called http://127.0.0.1:8080/browsing got: ' + str(browsing_vm))
   124             
   125         except:
   126             
   127             QtGui.QApplication.instance().processEvents()
   128             QtGui.QMessageBox.critical(None, 'Failed to invoke Safe Internet Browsing', 'OpenSecurity Error')
   129             
   130         QtGui.QApplication.instance().processEvents()
   131             
   132             
   133     def clicked_configure(self):
   134         """clicked configure"""
   135         d = ConfigureDialog()
   136         d.exec_()
   137     
   138 
   139     def clicked_exit(self):
   140         """clicked exit"""
   141         opensecurity_client_restful_server.stop()
   142         sys.exit(0)
   143     
   144 
   145     def clicked_launch_application(self):
   146         """clicked the launch an application"""
   147         dlg_launch_image = os.path.join(sys.path[0], 'ui', 'launch_dialog.py')
   148         process_command = [sys.executable, dlg_launch_image]
   149         process = subprocess.Popen(process_command, shell = False, stdout = subprocess.PIPE)        
   150         try:
   151             stdout = process.communicate()[0]
   152             j = json.loads(stdout)
   153         except:
   154             return
   155 
   156         try:
   157         
   158             # get a proper browsing VM
   159             Cygwin.start_X11()
   160 
   161             # TODO: HARDCODED ADDRESS OF OPENSECURITYD
   162             url = 'http://127.0.0.1:8080/sdvms/' + j['vm'] + '/application' + j['application']
   163             result = urllib2.urlopen(url).readline()
   164             
   165         except:
   166             pass 
   167             
   168             
   169     def clicked_mail(self):
   170         
   171         """clicked mail"""
   172         address = 'feedback@opensecurity.at'
   173         subject = 'Feedback zu OpenSecurity V' + opensecurity.__version__
   174 
   175         if sys.platform == 'linux2':
   176             subprocess.Popen(['xdg-email', '--subject', subject, address])
   177         elif sys.platform == 'win32' or sys.platform == 'cygwin':
   178             mail_url = 'mailto:' + urllib.quote(address, '@') + '?' + urllib.quote('subject=' + subject)
   179             subprocess.Popen(['cmd', '/C', 'start', mail_url])
   180    
   181 
   182     def format_drive(self):
   183 
   184         """format drive clicked (the sender should a QAction created with refresh_format_menu)"""
   185         try:
   186 
   187             # fiddle the IP of the VM controlling the VM
   188             s = self.sender()
   189             ip = str(s.text().split('\\\\')[1])
   190 
   191             # invoke the format drive dialog
   192             dlg_format_drive = os.path.join(sys.path[0], 'ui', 'format_drive_dialog.py')
   193             process_command = [sys.executable, dlg_format_drive, ip]
   194             process = subprocess.Popen(process_command, shell = False, stdout = subprocess.PIPE)        
   195 
   196             stdout = process.communicate()[0]
   197 
   198         except:
   199             pass
   200 
   201 
   202     def refresh_format_menu(self):
   203 
   204         """create a new list of format 'drives'"""
   205         self._menu_format.clear()
   206         a = self._menu_format.addAction('<No Drive given>')
   207         a.setEnabled(False)
   208 
   209         try:
   210 
   211             # get machines
   212             machines = json.load(urllib2.urlopen('http://127.0.0.1:8080/sdvms'))
   213             if len(machines) == 0:
   214                 return
   215 
   216             self._icon_network = QtGui.QIcon()
   217             self._icon_network.addPixmap(QtGui.QPixmap(":/opensecurity/gfx/network-workgroup.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   218 
   219             self._menu_format.clear()
   220             for m in machines:
   221                 a = self._menu_format.addAction(m + '\\\\' + machines[m])
   222                 a.setIcon(self._icon_network)
   223                 a.triggered.connect(self.format_drive)
   224 
   225         except:
   226             pass
   227 
   228 
   229     def setup_ui(self):
   230         """create the user interface
   231         As for the system tray this is 'just' the context menu.
   232         """
   233     
   234         # define the tray icon menu
   235         menu = QtGui.QMenu(self.parent())
   236         self.setContextMenu(menu)
   237         
   238         # add known apps
   239         self.acBrowser = QtGui.QAction('Secure Browsing', self.parent())
   240         icon = QtGui.QIcon()
   241         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_browsing_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   242         self.acBrowser.setIcon(icon)
   243         menu.addAction(self.acBrowser)
   244         menu.addSeparator()
   245         
   246         # add standard menu items
   247         self.acLaunch = QtGui.QAction('Launch Application', self.parent())
   248         icon = QtGui.QIcon()
   249         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_launch_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   250         self.acLaunch.setIcon(icon)
   251         menu.addAction(self.acLaunch)
   252         self.acConfigure = QtGui.QAction('Configuration', self.parent())
   253         icon = QtGui.QIcon()
   254         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_configure_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   255         self.acConfigure.setIcon(icon)
   256         menu.addAction(self.acConfigure)
   257         menu.addSeparator()
   258 
   259         self._menu_format = menu.addMenu('Format')
   260         menu.addSeparator()
   261 
   262         self.acMail = menu.addAction('Send feedback mail')
   263         icon = QtGui.QIcon()
   264         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_mail_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   265         self.acMail.setIcon(icon)
   266         self.acAbout = menu.addAction('About')
   267         self.acExit = menu.addAction('Exit')
   268        
   269         self.acBrowser.triggered.connect(self.clicked_browser)
   270         self.acLaunch.triggered.connect(self.clicked_launch_application)
   271         self.acConfigure.triggered.connect(self.clicked_configure)
   272         self.acAbout.triggered.connect(self.clicked_about)
   273         self.acExit.triggered.connect(self.clicked_exit)
   274         self.acMail.triggered.connect(self.clicked_mail)
   275         
   276 
   277 def main():
   278     
   279     # parse arguments
   280     parser = argparse.ArgumentParser(description = 'OpenSecurity Tray Icon.')
   281     parser.add_argument('-p', '--port', type=int, default=8090, help='port number of the REST API this instance will listen on.')
   282     args = parser.parse_args()
   283 
   284     # get up Qt
   285     a = QtGui.QApplication(sys.argv)
   286 
   287     # enforce singelton process
   288     if opensecurity_client_restful_server.is_already_running(args.port):
   289         QtGui.QMessageBox.critical(None, 'OpenSecurity Error', 'OpenSecurity Tray Instance already launched.\nClose previous instance first.')
   290         sys.exit(1)
   291 
   292     # start serving
   293     opensecurity_client_restful_server.serve(args.port, True)
   294 
   295     # init tray icon widget
   296     w = QtGui.QWidget()
   297     icon = QtGui.QIcon()
   298     icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(":/opensecurity/gfx/opensecurity_icon_64.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   299     trayIcon = OpenSecurityTrayIcon(icon)
   300     opensecurity_client_restful_server.tray_icon = trayIcon
   301 
   302     # go!
   303     trayIcon.show()
   304     a.setQuitOnLastWindowClosed(False)
   305     sys.exit(a.exec_())
   306    
   307 
   308 # start
   309 if __name__ == "__main__":
   310     main()
   311