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