1.1 --- a/OpenSecurity/bin/vmmanager.pyw Tue May 20 15:10:33 2014 +0100
1.2 +++ b/OpenSecurity/bin/vmmanager.pyw Thu May 22 11:00:33 2014 +0200
1.3 @@ -183,6 +183,10 @@
1.4 # check if the device is mass storage type
1.5 @staticmethod
1.6 def isMassStorageDevice(device):
1.7 + #TODO: implement filtering for card readers (this is olivers)
1.8 + # alternatively implement handling of multiple drives on same USB client
1.9 + if device.vendorid == '058f' and device.productid=='6362':
1.10 + return False
1.11 keyname = 'SYSTEM\CurrentControlSet\Enum\USB' + '\VID_' + device.vendorid+'&'+'PID_'+ device.productid
1.12 key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, keyname)
1.13 #subkeys = _winreg.QueryInfoKey(key)[0]
1.14 @@ -375,7 +379,7 @@
1.15 # stop VM
1.16 def hibernateVM(self, vm_name):
1.17 logger.info('Sending hibernate-disk signal to ' + vm_name)
1.18 - Cygwin.checkResult(Cygwin.sshExecute( '"sudo hibernate-disk&"', VMManager.getHostOnlyIP(vm_name), 'osecuser', Cygwin.cygPath(self.machineFolder) + '/' + vm_name + '/dvm_key', wait_return=False))
1.19 + Cygwin.checkResult(Cygwin.sshBackgroundExecute( '"sudo hibernate-disk"', VMManager.getHostOnlyIP(vm_name), 'osecuser', Cygwin.cygPath(self.machineFolder) + '/' + vm_name + '/dvm_key', wait_return=False))
1.20
1.21 # poweroff VM
1.22 def poweroffVM(self, vm_name):
1.23 @@ -481,19 +485,14 @@
1.24 ip = ip[:ip.rindex('.')]
1.25 drives = dict()
1.26 result = Cygwin.checkResult(Cygwin.execute('C:\\Windows\\system32\\net.exe', 'USE'))
1.27 +
1.28 + #logger.info( result[1] )
1.29 for line in result[1].splitlines():
1.30 if ip in line:
1.31 parts = line.split()
1.32 drives[parts[1]] = parts[2]
1.33 +
1.34 return drives
1.35 -
1.36 - def genNetworkDrive(self):
1.37 - network_drives = self.getNetworkDrives()
1.38 - logical_drives = VMManager.getLogicalDrives()
1.39 - drives = list(map(chr, range(68, 91)))
1.40 - for drive in drives:
1.41 - if drive+':' not in network_drives and drive not in logical_drives:
1.42 - return drive+':'
1.43
1.44 def getNetworkDrive(self, vm_name):
1.45 ip = self.getHostOnlyIP(vm_name)
1.46 @@ -502,6 +501,16 @@
1.47 if line != None and ip in line:
1.48 parts = line.split()
1.49 return parts[1]
1.50 +
1.51 + def genNetworkDrive(self):
1.52 + network_drives = self.getNetworkDrives()
1.53 + logger.info("Used network drive letters: "+ str(network_drives.keys()).strip('[]') )
1.54 + logical_drives = VMManager.getLogicalDrives()
1.55 + logger.info("Used logical drive letters: "+ str(logical_drives).strip('[]') )
1.56 + drives = list(map(chr, range(68, 91)))
1.57 + for drive in drives:
1.58 + if drive+':' not in network_drives and drive not in logical_drives:
1.59 + return drive+':'
1.60
1.61 @staticmethod
1.62 def getLogicalDrives():
1.63 @@ -548,8 +557,15 @@
1.64 return user_name
1.65
1.66 def getUserSID(self, user_name):
1.67 - account_name = win32security.LookupAccountName(None, user_name)
1.68 + domain, user = user_name.split("\\")
1.69 + account_name = win32security.LookupAccountName(domain, user)
1.70 + if account_name == None:
1.71 + logger.error("Failed lookup account name for user " + user_name)
1.72 + return None
1.73 sid = win32security.ConvertSidToStringSid(account_name[0])
1.74 + if sid == None:
1.75 + logger.error("Failed converting SID for account " + account_name[0])
1.76 + return None
1.77 return sid
1.78
1.79 def getAppDataDir(self, sid):
1.80 @@ -643,10 +659,17 @@
1.81 self.vmm.startVM(self.vm_name)
1.82 self.ip_addr = self.vmm.waitStartup(self.vm_name)
1.83 if self.ip_addr == None:
1.84 + logger.error("Failed to get ip address")
1.85 continue
1.86 + else:
1.87 + logger.info("Got IP address for " + self.vm_name + ' ' + self.ip_addr)
1.88 +
1.89 self.drive = self.vmm.genNetworkDrive()
1.90 if self.drive == None:
1.91 + logger.error("Failed to assign Network drive letter")
1.92 continue
1.93 + else:
1.94 + logger.info("Assigned drive " + self.drive + " to " + self.vm_name)
1.95
1.96 try:
1.97 net_resource = '\\\\' + self.ip_addr + '\\Download'
1.98 @@ -655,14 +678,29 @@
1.99 logger.error("Network drive connect failed. OpenSecurity Tray client not running.")
1.100 self.drive = None
1.101 continue
1.102 -
1.103 -
1.104 - self.started.set()
1.105
1.106 user = self.vmm.getActiveUserName()
1.107 + if user == None:
1.108 + logger.error("Cannot get active user name")
1.109 + continue
1.110 + else:
1.111 + logger.info('Got active user name ' + user)
1.112 sid = self.vmm.getUserSID(user)
1.113 + if sid == None:
1.114 + logger.error("Cannot get SID for active user")
1.115 + continue
1.116 + else:
1.117 + logger.info("Got active user SID " + sid + " for user " + user)
1.118 +
1.119 path = self.vmm.getAppDataDir(sid)
1.120 + if path == None:
1.121 + logger.error("Cannot get AppDataDir for active user")
1.122 + continue
1.123 + else:
1.124 + logger.info("Got AppData dir for user " + user + ': ' + path)
1.125 +
1.126 self.appDataDir = Cygwin.cygPath(path)
1.127 + logger.info("Restoring browser settings in AppData dir " + self.appDataDir)
1.128 # create OpenSecurity settings dir on local machine user home /AppData/Roaming
1.129 Cygwin.checkResult(Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + self.appDataDir + '/OpenSecurity\\\"'))
1.130 # create chromium settings dir on local machine if not existing
1.131 @@ -671,6 +709,8 @@
1.132 Cygwin.checkResult(Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key'))
1.133 #restore settings on vm
1.134 self.vmm.restoreFile(self.appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/')
1.135 + self.started.set()
1.136 + logger.error("Browsing SDVM running.")
1.137 self.restart.wait()
1.138 except:
1.139 logger.error("BrowsingHandler failed. Cleaning up")