OpenSecurity/bin/opensecurity_tray.pyw
author Oliver Maurhart <oliver.maurhart@ait.ac.at>
Wed, 25 Jun 2014 19:21:04 +0200
changeset 199 26b9a95b0da1
parent 193 8d5b7c9ff783
child 207 ae931a692b54
permissions -rwxr-xr-x
explorer button in configuration 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         
    95         
    96     def clicked_about(self):
    97         """clicked about"""
    98         d = AboutDialog()
    99         d.exec_()
   100     
   101 
   102     def clicked_browser(self):
   103         """wish for safe internet browsing"""
   104         
   105         if not (sys.platform == 'win32' or sys.platform == 'cygwin'):
   106             QtGui.QMessageBox.critical(self.parent(), 'OpenSecurity Error', 'This action is not supported on this platform.\nSorry.')
   107             return
   108        
   109         try:
   110         
   111             # get a proper browsing VM
   112             Cygwin.start_X11()
   113 
   114             # TODO: HARDCODED ADDRESS OF OPENSECURITYD
   115             browsing_vm = urllib2.urlopen('http://127.0.0.1:8080/browsing').readline()
   116             print('Called http://127.0.0.1:8080/browsing got: ' + str(browsing_vm))
   117             
   118         except:
   119             
   120             QtGui.QApplication.instance().processEvents()
   121             QtGui.QMessageBox.critical(None, 'Failed to invoke Safe Internet Browsing', 'OpenSecurity Error')
   122             
   123         QtGui.QApplication.instance().processEvents()
   124             
   125             
   126     def clicked_configure(self):
   127         """clicked configure"""
   128         d = ConfigureDialog()
   129         d.exec_()
   130     
   131 
   132     def clicked_exit(self):
   133         """clicked exit"""
   134         opensecurity_client_restful_server.stop()
   135         sys.exit(0)
   136     
   137 
   138     def clicked_launch_application(self):
   139         """clicked the launch an application"""
   140         dlg_launch_image = os.path.join(sys.path[0], 'ui', 'launch_dialog.py')
   141         process_command = [sys.executable, dlg_launch_image]
   142         process = subprocess.Popen(process_command, shell = False, stdout = subprocess.PIPE)        
   143         try:
   144             stdout = process.communicate()[0]
   145             j = json.loads(stdout)
   146         except:
   147             return
   148 
   149         try:
   150         
   151             # get a proper browsing VM
   152             Cygwin.start_X11()
   153 
   154             # TODO: HARDCODED ADDRESS OF OPENSECURITYD
   155             url = 'http://127.0.0.1:8080/sdvms/' + j['vm'] + '/application' + j['application']
   156             result = urllib2.urlopen(url).readline()
   157             
   158         except:
   159             pass 
   160             
   161             
   162     def clicked_mail(self):
   163         
   164         """clicked mail"""
   165         address = 'feedback@opensecurity.at'
   166         subject = 'Feedback zu OpenSecurity V' + opensecurity.__version__
   167 
   168         if sys.platform == 'linux2':
   169             subprocess.Popen(['xdg-email', '--subject', subject, address])
   170         elif sys.platform == 'win32' or sys.platform == 'cygwin':
   171             mail_url = 'mailto:' + urllib.quote(address, '@') + '?' + urllib.quote('subject=' + subject)
   172             subprocess.Popen(['cmd', '/C', 'start', mail_url])
   173     
   174 
   175     def setup_ui(self):
   176         """create the user interface
   177         As for the system tray this is 'just' the context menu.
   178         """
   179     
   180         # define the tray icon menu
   181         menu = QtGui.QMenu(self.parent())
   182         self.setContextMenu(menu)
   183         
   184         # add known apps
   185         self.acBrowser = QtGui.QAction('Secure Browsing', self.parent())
   186         icon = QtGui.QIcon()
   187         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_browsing_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   188         self.acBrowser.setIcon(icon)
   189         menu.addAction(self.acBrowser)
   190         menu.addSeparator()
   191         
   192         # add standard menu items
   193         self.acLaunch = QtGui.QAction('Launch Application', self.parent())
   194         icon = QtGui.QIcon()
   195         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_launch_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   196         self.acLaunch.setIcon(icon)
   197         menu.addAction(self.acLaunch)
   198         self.acConfigure = QtGui.QAction('Configuration', self.parent())
   199         icon = QtGui.QIcon()
   200         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_configure_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   201         self.acConfigure.setIcon(icon)
   202         menu.addAction(self.acConfigure)
   203         menu.addSeparator()
   204 
   205         self.acMail = menu.addAction('Send feedback mail')
   206         icon = QtGui.QIcon()
   207         icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(':/opensecurity/gfx/opensecurity_mail_64.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   208         self.acMail.setIcon(icon)
   209         self.acAbout = menu.addAction('About')
   210         self.acExit = menu.addAction('Exit')
   211        
   212         self.acBrowser.triggered.connect(self.clicked_browser)
   213         self.acLaunch.triggered.connect(self.clicked_launch_application)
   214         self.acConfigure.triggered.connect(self.clicked_configure)
   215         self.acAbout.triggered.connect(self.clicked_about)
   216         self.acExit.triggered.connect(self.clicked_exit)
   217         self.acMail.triggered.connect(self.clicked_mail)
   218         
   219 
   220 def main():
   221     
   222     # parse arguments
   223     parser = argparse.ArgumentParser(description = 'OpenSecurity Tray Icon.')
   224     parser.add_argument('-p', '--port', type=int, default=8090, help='port number of the REST API this instance will listen on.')
   225     args = parser.parse_args()
   226 
   227     # get up Qt
   228     a = QtGui.QApplication(sys.argv)
   229 
   230     # enforce singelton process
   231     if opensecurity_client_restful_server.is_already_running(args.port):
   232         QtGui.QMessageBox.critical(None, 'OpenSecurity Error', 'OpenSecurity Tray Instance already launched.\nClose previous instance first.')
   233         sys.exit(1)
   234 
   235     # start serving
   236     opensecurity_client_restful_server.serve(args.port, True)
   237 
   238     # init tray icon widget
   239     w = QtGui.QWidget()
   240     icon = QtGui.QIcon()
   241     icon.addPixmap(QtGui.QPixmap(QtCore.QString.fromUtf8(":/opensecurity/gfx/opensecurity_icon_64.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
   242     trayIcon = OpenSecurityTrayIcon(icon)
   243     opensecurity_client_restful_server.tray_icon = trayIcon
   244 
   245     # go!
   246     trayIcon.show()
   247     a.setQuitOnLastWindowClosed(False)
   248     sys.exit(a.exec_())
   249    
   250 
   251 # start
   252 if __name__ == "__main__":
   253     main()
   254