1 # -*- coding: utf-8 -*-
3 # ------------------------------------------------------------
6 # an opensecurity dialog
8 # Autor: Oliver Maurhart, <oliver.maurhart@ait.ac.at>
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
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.
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.
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 # ------------------------------------------------------------
31 # ------------------------------------------------------------
43 from PyQt4 import QtCore
44 from PyQt4 import QtGui
47 import __init__ as opensecurity
49 if sys.platform == 'win32' or sys.platform == 'cygwin':
50 from cygwin import Cygwin
52 import opensecurity_client_restful_server
53 from ui import AboutDialog
54 from ui import ConfigureDialog
55 from ui import opensecurity_rc
58 # ------------------------------------------------------------
62 class OpenSecurityWait(QtGui.QDialog):
64 """OpenSecurity: please wait ..."""
66 def __init__(self, parent = None, flags = QtCore.Qt.WindowFlags(0)):
67 super(OpenSecurityWait, self).__init__(parent, flags)
68 self.setWindowTitle('OpenSecurity')
73 """Create the widgets."""
75 lyMain = QtGui.QVBoxLayout(self)
76 lyMain.setContentsMargins(8, 8, 8, 8)
78 # content area: left pixmap, right text
79 lbTitle = QtGui.QLabel('Creating secure subsystem. Please stand by ...')
80 lyMain.addWidget(lbTitle)
82 self.setMinimumSize(400, 50)
83 self.resize(lyMain.minimumSize())
86 class OpenSecurityTrayIcon(QtGui.QSystemTrayIcon):
88 """This is the OpenSecuirty Tray Icon"""
90 def __init__(self, icon, parent=None):
92 super(OpenSecurityTrayIcon, self).__init__(icon, parent)
96 def clicked_about(self):
102 def clicked_browser(self):
103 """wish for safe internet browsing"""
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.')
111 # get a proper browsing VM
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))
120 QtGui.QApplication.instance().processEvents()
121 QtGui.QMessageBox.critical(None, 'Failed to invoke Safe Internet Browsing', 'OpenSecurity Error')
123 QtGui.QApplication.instance().processEvents()
126 def clicked_configure(self):
127 """clicked configure"""
128 d = ConfigureDialog()
132 def clicked_exit(self):
134 opensecurity_client_restful_server.stop()
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)
144 stdout = process.communicate()[0]
145 j = json.loads(stdout)
151 # get a proper browsing VM
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()
162 def clicked_mail(self):
165 address = 'feedback@opensecurity.at'
166 subject = 'Feedback zu OpenSecurity V' + opensecurity.__version__
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])
176 """create the user interface
177 As for the system tray this is 'just' the context menu.
180 # define the tray icon menu
181 menu = QtGui.QMenu(self.parent())
182 self.setContextMenu(menu)
185 self.acBrowser = QtGui.QAction('Secure Browsing', self.parent())
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)
192 # add standard menu items
193 self.acLaunch = QtGui.QAction('Launch Application', self.parent())
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())
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)
205 self.acMail = menu.addAction('Send feedback mail')
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')
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)
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()
228 a = QtGui.QApplication(sys.argv)
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.')
236 opensecurity_client_restful_server.serve(args.port, True)
238 # init tray icon widget
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
247 a.setQuitOnLastWindowClosed(False)
252 if __name__ == "__main__":