# HG changeset patch # User om # Date 1386769774 -3600 # Node ID 7c2e34bcdf3d46385306c359452390dd6b072a76 # Parent 76d9177ca5093f77aa8ddff8ceeed96132b661d9# Parent e10a08095ccce191d48269a2315119c346b36f84 polished about, launch and systray diff -r 76d9177ca509 -r 7c2e34bcdf3d OpenSecurity/bin/launch.pyw --- a/OpenSecurity/bin/launch.pyw Wed Dec 11 14:34:19 2013 +0100 +++ b/OpenSecurity/bin/launch.pyw Wed Dec 11 14:49:34 2013 +0100 @@ -36,7 +36,6 @@ import os import subprocess import sys -import urllib import urllib2 from PyQt4 import QtCore @@ -68,7 +67,8 @@ size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) - self._vms = [ { 'name': 'SecurityDVM0', 'ip': '192.168.56.101' } ] + # TODO: THIS HERE IS HARD CODED + self._vms = [ { 'name': 'SecurityDVM0' } ] self._apps = [ { 'name': 'Browser', 'command': '/usr/bin/iceweasel' } ] # add the VMs we know @@ -186,11 +186,7 @@ def vm_get(self): """The vm of choice.""" - v = str(self._cbVM.currentText()) - for vm in self._vms: - if v == vm['name']: - return vm['ip'] - return v + return str(self._cbVM.currentText()) vm = property(vm_get) @@ -227,43 +223,33 @@ # parse command line parser = argparse.ArgumentParser(description = 'OpenSecurity Launcher: run application in VM') - parser.add_argument('ip', metavar='IP', help='IP of Virtual Machine', nargs='?', type=str, default='') + parser.add_argument('vm', metavar='VM', help='Name of Virtual Machine', nargs='?', type=str, default='') parser.add_argument('command', metavar='COMMAND', help='Full path of command and arguments to start inside VM', nargs='?', type=str, default='') args = parser.parse_args() - # we must have at least all or none set - set_ip = args.ip != '' - set_command = args.command != '' - set_ALL = set_ip and set_command - set_NONE = (not set_ip) and (not set_command) - if (not set_ALL) and (not set_NONE): - sys.stderr.write("Please specify ip and command or none.\n") - sys.stderr.write("Type '--help' for help.\n") - sys.exit(1) + # we must have all set + if args.vm == "" or args.command == '': + print('VM and/or COMMAND missing - invoking user dialog') + args.vm, args.command = ask_user() - # check if we need to ask the user - if set_NONE: - args.ip, args.command = ask_user() - - # still no IP? --> no chance, over and out! - if args.ip == '': + # still no VM? --> no chance, over and out! + if args.vm == '': sys.exit(0) # ensure we have our X11 running Cygwin.start_X11() # call the OpenSecurity Admin to launch our progie =) - url_vm = urllib.quote(args.ip) - url_command = urllib.quote(args.command) - QtGui.QMessageBox.information(None, 'OpenSecurity Launche', 'About to launch
' + url_command + '
at VM
' + url_vm + '') + # TODO: hard coded PORT + url = 'http://127.0.0.1:8080/sdvms/' + args.vm + '/application' + args.command + print('Calling ' + url) + try: + result = urllib2.urlopen(url, None, 5) + except urllib2.HTTPError as e: + # Error, Fail, ... :( + msg = 'Error received from OpenSecurity Subsystem\nError code: ' + str(e.code) + '\nReason: ' + e.reason + QtGui.QMessageBox.critical(None, 'OpenSecurity Error', msg) - # user_at_guest = args.user + '@' + args.ip - # ssh = 'DISPLAY=:0 /usr/bin/ssh -Y ' + user_at_guest + ' ' + args.command - # print(ssh) - - # # off we go! - # Cygwin()(['/bin/bash', '--login', '-i', '-c', ssh], None, None, None) - # start if __name__ == "__main__": diff -r 76d9177ca509 -r 7c2e34bcdf3d OpenSecurity/bin/opensecurity_tray.pyw --- a/OpenSecurity/bin/opensecurity_tray.pyw Wed Dec 11 14:34:19 2013 +0100 +++ b/OpenSecurity/bin/opensecurity_tray.pyw Wed Dec 11 14:49:34 2013 +0100 @@ -36,6 +36,7 @@ import os import subprocess import sys +import urllib2 from PyQt4 import QtCore from PyQt4 import QtGui @@ -49,6 +50,30 @@ # code +class OpenSecurityWait(QtGui.QDialog): + + """OpenSecurity: please wait ...""" + + def __init__(self, parent = None, flags = QtCore.Qt.WindowFlags(0)): + super(OpenSecurityWait, self).__init__(parent, flags) + self.setWindowTitle('OpenSecurity') + self.setup_ui() + + + def setup_ui(self): + """Create the widgets.""" + + lyMain = QtGui.QVBoxLayout(self) + lyMain.setContentsMargins(8, 8, 8, 8) + + # content area: left pixmap, right text + lbTitle = QtGui.QLabel('Creating secure subsystem. Please stand by ...') + lyMain.addWidget(lbTitle) + + self.setMinimumSize(400, 50) + self.resize(lyMain.minimumSize()) + + class OpenSecurityTrayIcon(QtGui.QSystemTrayIcon): """This is the OpenSecuirty Tray Icon""" @@ -67,11 +92,31 @@ def clicked_browser(self): """wish for safe internet browsing""" - dlg_launch_image = os.path.join(sys.path[0], 'launch.pyw') - process_command = [sys.executable, dlg_launch_image, '192.168.56.101', '/usr/bin/iceweasel'] - print(process_command) - process = subprocess.Popen(process_command, shell = False) - process.communicate() + + # TODO: HARDCODED ADDRESS OF OPENSECURITYD + + # tell the user to wait + dlg = OpenSecurityWait() + dlg.show() + QtGui.QApplication.instance().processEvents() + + try: + + # get a proper browsing VM + browsing_vm = urllib2.urlopen('http://127.0.0.1:8080/browsing').readline() + dlg_launch_image = os.path.join(sys.path[0], 'launch.pyw') + process_command = [sys.executable, dlg_launch_image, browsing_vm, '/usr/bin/iceweasel'] + print(process_command) + process = subprocess.Popen(process_command, shell = False) + process.communicate() + + except: + dlg.hide() + QtGui.QApplication.instance().processEvents() + QtGui.QMessageBox.critical(None, 'Failed to invoke Safe Internet Browsing', 'OpenSecurity Error') + + dlg.hide() + QtGui.QApplication.instance().processEvents() def clicked_exit(self): diff -r 76d9177ca509 -r 7c2e34bcdf3d OpenSecurity/bin/opensecurityd.py --- a/OpenSecurity/bin/opensecurityd.py Wed Dec 11 14:34:19 2013 +0100 +++ b/OpenSecurity/bin/opensecurityd.py Wed Dec 11 14:49:34 2013 +0100 @@ -81,8 +81,9 @@ """OpenSecurity '/device_change' handler""" def GET(self): - gvm_mgr.handleDeviceChange() - + new_ip = gvm_mgr.handleDeviceChange() + if new_ip != None: + gvm_mgr.mapNetworkDrive('h:', '\\\\' + new_ip + '\\USB', None, None) return "os_device_change" @@ -95,6 +96,7 @@ def GET(self): try: browsingVM = gvm_mgr.handleBrowsingRequest() + gvm_mgr.startVM(browsingVM) return browsingVM except: raise web.internalerror() diff -r 76d9177ca509 -r 7c2e34bcdf3d OpenSecurity/bin/vmmanager.py --- a/OpenSecurity/bin/vmmanager.py Wed Dec 11 14:34:19 2013 +0100 +++ b/OpenSecurity/bin/vmmanager.py Wed Dec 11 14:49:34 2013 +0100 @@ -16,7 +16,7 @@ import string -DEBUG = False +DEBUG = True class USBFilter: vendorid = "" @@ -225,14 +225,7 @@ def startVM(self, vm_name): print('starting ' + vm_name) cmd = 'VBoxManage startvm ' + vm_name + ' --type headless' - result = self.execute(cmd) - while result[0] != 0: - print "Failed to start SDVM: ", vm_name, " retrying" - time.sleep(1) - result = self.execute(cmd) - #verify against (0, 'Waiting for VM "SecurityDVM0" to power on...\r\nVM "SecurityDVM0" has been successfully started.\r\n', '') - return result[0] - + print self.execute(cmd) #verify against (0, 'Waiting for VM "SecurityDVM0" to power on...\r\nVM "SecurityDVM0" has been successfully started.\r\n', '') # stop VM def stopVM(self, vm_name): @@ -326,37 +319,25 @@ new_sdvm = self.generateSDVMName() self.createVM(new_sdvm) self.attachRSD(new_sdvm, connected_device) - - + #sleep like method + self.listSDVM() self.startVM(new_sdvm) - # wait for machine to come up + while new_ip == None: time.sleep(1) new_ip = self.getHostOnlyIP(new_sdvm) while new_ip not in self.startNotifications: time.sleep(1) - if new_ip != None: - self.mapNetworkDrive('h:', '\\\\' + new_ip + '\\USB', None, None) #TODO: cleanup notifications somwhere else (eg. machine shutdown) self.startNotifications.remove(new_ip) VMManager.handleDeviceChangeLock.release() return new_ip def handleBrowsingRequest(self): - if VMManager.handleDeviceChangeLock.acquire(True): - new_ip = None - new_sdvm = self.generateSDVMName() - self.createVM(new_sdvm) - self.genCertificateISO(new_sdvm) - self.attachCertificateISO(new_sdvm) - self.startVM(new_sdvm) - # wait for machine to come up - while new_ip == None: - time.sleep(1) - new_ip = self.getHostOnlyIP(new_sdvm) - while new_ip not in self.startNotifications: - time.sleep(1) - VMManager.handleDeviceChangeLock.release() + new_sdvm = self.generateSDVMName() + self.createVM(new_sdvm) + self.genCertificateISO(new_sdvm) + self.attachCertificateISO(new_sdvm) return new_sdvm # executes command over ssh on guest vm @@ -369,7 +350,7 @@ return self.execute(cmd) # executes command over ssh on guest vm with X forwarding - def sshGuestX11Execute(self, vm_name, prog, user_name='osecuser'): + def sshGuestX11Execute(self, vm_name, prog, user_name='opensec'): #TODO: verify if X server is running on user account #TODO: set DISPLAY accordingly address = self.getHostOnlyIP(vm_name) @@ -429,13 +410,13 @@ return -1 return 1 -#if __name__ == '__main__': +if __name__ == '__main__': - #man = VMManager.getInstance() + man = VMManager.getInstance() #man.removeVM('SecurityDVM0') #man.netUse('192.168.56.134', 'USB\\') - #ip = '192.168.56.139' - #man.mapNetworkDrive('h:', '\\\\' + ip + '\USB', None, None) + ip = '192.168.56.139' + man.mapNetworkDrive('h:', '\\\\' + ip + '\USB', None, None) #man.cygwin_path = 'c:\\cygwin64\\bin\\' #man.handleDeviceChange() diff -r 76d9177ca509 -r 7c2e34bcdf3d OpenSecurity/test/create-security-vm.bat --- a/OpenSecurity/test/create-security-vm.bat Wed Dec 11 14:34:19 2013 +0100 +++ b/OpenSecurity/test/create-security-vm.bat Wed Dec 11 14:49:34 2013 +0100 @@ -1,2 +1,2 @@ @echo off -..\cygwin\bin\curl -X POST http://127.0.0.1:8080/sdvms \ No newline at end of file +..\cygwin\bin\curl -X POST http://127.0.0.1:8080/sdvms