def CreateVolumeMenu(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.volumetablemenu.clear() volumename = encfsgui_globals.g_CurrentlySelected if volumename != "": if volumename in encfsgui_globals.g_Volumes: EncVolumeObj = encfsgui_globals.g_Volumes[volumename] self.volumemenuheader = QAction("Actions for volume '%s':" % volumename, self) self.volumetablemenu.addAction(self.volumemenuheader) self.volumetablemenu.addSeparator() if not EncVolumeObj.ismounted: self.volumemountaction = QAction(QIcon("./bitmaps/icons8-unlock-24.png"),"Mount volume", self) self.volumetablemenu.addAction(self.volumemountaction) self.volumemountaction.triggered.connect(self.TableMenuMountVolume) self.volumeeditaction = QAction("Edit volume", self) self.volumetablemenu.addAction(self.volumeeditaction) self.volumeeditaction.triggered.connect(self.EditVolumeButtonClicked) else: self.volumeunmountaction = QAction(QIcon("./bitmaps/icons8-lock-24.png"), "Unmount volume", self) self.volumetablemenu.addAction(self.volumeunmountaction) self.volumeunmountaction.triggered.connect(self.TableMenuUnmountVolume) self.volumeinfoaction = QAction("Show info", self) self.volumetablemenu.addAction(self.volumeinfoaction) self.volumeinfoaction.triggered.connect(self.ShowVolumeInfoClicked) return
def MenuUnmountVolume(self, action): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) actionname = self.sender().text() volumename = self.getVolumeNameFromAction(actionname) self.UnmountVolume(volumename) self.PopulateVolumeMenu() return
def saveVolumes(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) config = configparser.RawConfigParser() for volumename in encfsgui_globals.g_Volumes: EncVolumeObj = encfsgui_globals.g_Volumes[volumename] config.add_section(volumename) str_enc_path = EncVolumeObj.enc_path str_mount_path = EncVolumeObj.mount_path # if encryption is enabled, encrypt the strings first using the master password if encfsgui_globals.g_Settings["encrypt"] == "true": if encfsgui_globals.masterkey == "": # ask for masterkey encfsgui_helper.getMasterKey() if len(encfsgui_globals.masterkey) == 32: str_enc_path = encfsgui_helper.encrypt( EncVolumeObj.enc_path) str_mount_path = encfsgui_helper.encrypt( EncVolumeObj.mount_path) config.set(volumename, 'enc_path', str_enc_path) config.set(volumename, 'mount_path', str_mount_path) config.set(volumename, 'automount', EncVolumeObj.automount) config.set(volumename, 'preventautounmount', EncVolumeObj.preventautounmount) config.set(volumename, 'allowother', EncVolumeObj.allowother) config.set(volumename, 'mountaslocal', EncVolumeObj.mountaslocal) config.set(volumename, 'encfsmountoptions', EncVolumeObj.encfsmountoptions) config.set(volumename, 'passwordsaved', EncVolumeObj.passwordsaved) with open(encfsgui_globals.volumesfile, 'w') as configfile: config.write(configfile) self.clearMasterKeyIfNeeded() return
def QuitButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) doexit = False autunmount = False if "autounmount" in encfsgui_globals.g_Settings: if str(encfsgui_globals.g_Settings["autounmount"]) == "true": autunmount = True if "noconfirmationexit" in encfsgui_globals.g_Settings: if str(encfsgui_globals.g_Settings["noconfirmationexit"]) == "false": msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Question) msgBox.setWindowTitle("Please confirm?") if autunmount: msgBox.setText("Are you sure you would like to exit?\n\nPlease note that some volumes may be unmounted automatically when you exit the application, so please make sure all files are closed.") else: msgBox.setText("Are you sure you would like to exit?") msgBox.setStandardButtons(QtWidgets.QMessageBox.No) msgBox.addButton(QtWidgets.QMessageBox.Yes) msgBox.show() msgBox.setFocus() if (msgBox.exec_() == QtWidgets.QMessageBox.Yes): doexit = True else: doexit = True if doexit: self.AutoUnMount() encfsgui_helper.print_debug("Application has exited.") sys.exit(0) return
def getSettings(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) curframe = inspect.currentframe() calframe = inspect.getouterframes(curframe, 2) encfsgui_helper.print_debug("%s() Called from: %s()" % (inspect.stack()[0][3], calframe[1][3])) # if file does not exist, generate default file if not os.path.exists(self.settingsfile): self.populateDefaultSettings() self.saveSettings() appsettings = configparser.ConfigParser() appsettings.read(self.settingsfile) for settingkey in appsettings["config"]: encfsgui_globals.g_Settings[settingkey] = appsettings["config"][ settingkey].strip().replace("\n", "") if "encodings" in appsettings: encodinglist = appsettings["encodings"]["filenameencodings"] encfsgui_globals.g_Encodings = encodinglist.split(",") # in case the current settings file is incomplete, pick up additional settings self.populateDefaultSettings() self.saveSettings() encfsgui_globals.volumesfile = encfsgui_globals.g_Settings[ "workingfolder"] + "/" + 'encfsgui.volumes' return
def EnableDisableButtons(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) # did we select an entry in the table? selectedenable = False if encfsgui_globals.g_CurrentlySelected != "": selectedenable = True mounted = False if encfsgui_globals.g_CurrentlySelected in encfsgui_globals.g_Volumes: mounted = encfsgui_globals.g_Volumes[encfsgui_globals.g_CurrentlySelected].ismounted if mounted: self.mountvolumebutton.setEnabled(False) self.unmountvolumebutton.setEnabled(True) self.browsevolumebutton.setEnabled(True) self.editvolumebutton.setEnabled(False) else: self.mountvolumebutton.setEnabled(True) self.unmountvolumebutton.setEnabled(False) self.browsevolumebutton.setEnabled(False) self.editvolumebutton.setEnabled(True) else: self.mountvolumebutton.setEnabled(False) self.unmountvolumebutton.setEnabled(False) self.browsevolumebutton.setEnabled(False) self.editvolumebutton.setEnabled(False) self.infovolumebutton.setEnabled(selectedenable) self.removevolumebutton.setEnabled(selectedenable) return
def ShowVolumeInfoClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) volumename = encfsgui_globals.g_CurrentlySelected if volumename != "": if volumename in encfsgui_globals.g_Volumes: EncVolumeObj = encfsgui_globals.g_Volumes[volumename] infotext = "" if EncVolumeObj.enctype == "encfs": if os.path.exists(encfsgui_globals.g_Settings["encfspath"]): cmd = "%sctl info '%s'" % (encfsgui_globals.g_Settings["encfspath"], EncVolumeObj.enc_path) cmdoutput = encfsgui_helper.execOSCmd(cmd) infotext = "EncFS volume info for '%s'\n" % volumename infotext += "Encrypted folder '%s'\n\n" % EncVolumeObj.enc_path for l in cmdoutput: infotext = infotext + l + "\n" if EncVolumeObj.enctype == "gocryptfs": if os.path.exists(encfsgui_globals.g_Settings["gocryptfspath"]): cmd = "%s -info '%s'" % (encfsgui_globals.g_Settings["gocryptfspath"], EncVolumeObj.enc_path) cmdoutput = encfsgui_helper.execOSCmd(cmd) infotext = "GoCryptFS volume info for '%s'\n" % volumename infotext += "Encrypted folder '%s'\n\n" % EncVolumeObj.enc_path for l in cmdoutput: infotext = infotext + l + "\n" if not infotext == "": msgBox = QtWidgets.QMessageBox() msgBox.setIcon(QtWidgets.QMessageBox.Information) msgBox.setWindowTitle("Encrypted Volume info (%s)" % EncVolumeObj.enctype) msgBox.setText(infotext) msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok) msgBox.show() msgBox.exec_() return
def BrowseVolumeClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) if encfsgui_globals.g_CurrentlySelected != "": if encfsgui_globals.g_CurrentlySelected in encfsgui_globals.g_Volumes: EncVolumeObj = encfsgui_globals.g_Volumes[encfsgui_globals.g_CurrentlySelected] encfsgui_helper.openFolder(EncVolumeObj.mount_path) return
def AboutClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) abouttext = "pyencfsgui (EncFSGui) is a python3/PyQT5 based GUI wrapper around encfs and/or gocryptfs.\n\n" abouttext += "This version has been tested with encfs 1.9.x on OSX Catalina (and newer macOS versions), \n" abouttext += "and with gocryptfs 1.8.x on OSX Big Sur (and newer macOS versions). \n" abouttext += "Additionally, EncFSGui has been confirmed to work in Kali Linux.\n\n" abouttext += "Development started in 2019. The utility was written by Peter 'corelanc0d3r' Van Eeckhoutte.\n" abouttext += "Corelan Consulting bv\nwww.corelan-consulting.com | www.corelan-training.com\n\n" abouttext += "Project repository:\nhttps://github.com/corelan/pyencfsgui\n\n" abouttext += "Version info:\n" abouttext += "EncFSGui version %s.\n" % encfsgui_helper.getVersion() if os.path.exists(encfsgui_globals.g_Settings["encfspath"]): abouttext += "encfs version %s.\n" % getEncFSVersion() else: abouttext += "encfs not found.\n" if os.path.exists(encfsgui_globals.g_Settings["gocryptfspath"]): abouttext += "gocryptfs version %s.\n\n" % getGoCryptFSVersion() else: abouttext += "gocryptfs not found.\n\n" abouttext += "This application uses icons from https://icons8.com.\n" abouttext += "\nYou are running %s" % encfsgui_helper.getOSType() msgBox = QMessageBox() msgBox.setWindowTitle("About pyencfsgui") msgBox.setText(abouttext) msgBox.show() msgBox.exec_() return
def delVolume(self, volumename): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) # remove volume from g_Volumes if (volumename in encfsgui_globals.g_Volumes): del encfsgui_globals.g_Volumes[volumename] # write g_Volumes to volumes file self.saveVolumes() return
def getVolumeNameFromAction(self, actionname): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) volumename = "" if (actionname.startswith("Mount")): volumename = actionname.lstrip("Mount ").lstrip("'").rstrip("'") elif (actionname.startswith("Unmount")): volumename = actionname.lstrip("Unmount ").lstrip("'").rstrip("'") return volumename
def TableMenuMountVolume(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) volumename = encfsgui_globals.g_CurrentlySelected if volumename in encfsgui_globals.g_Volumes: thispassword = self.getPasswordForVolume(volumename) self.MountVolume(volumename, thispassword) self.PopulateVolumeMenu() return
def MountVolumeClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) # do we need to ask for password? if encfsgui_globals.g_CurrentlySelected != "": if encfsgui_globals.g_CurrentlySelected in encfsgui_globals.g_Volumes: thispassword = self.getPasswordForVolume(encfsgui_globals.g_CurrentlySelected) self.MountVolume(encfsgui_globals.g_CurrentlySelected, thispassword) return
def __init__(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) super(CMainWindow, self).__init__() uic.loadUi('encfsgui_main.ui', self) # disable/remove buttons self.setWindowFlags(self.windowFlags() | QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowStaysOnTopHint) self.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint, False) self.setWindowFlag(QtCore.Qt.WindowCloseButtonHint, False) # assign methods to buttons self.quitbutton = self.findChild(QtWidgets.QToolButton, 'btn_Quit') self.quitbutton.clicked.connect(self.QuitButtonClicked) self.hidebutton = self.findChild(QtWidgets.QToolButton, 'btn_Hide') self.hidebutton.clicked.connect(self.HideButtonClicked) self.createvolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_createVolume') self.createvolumebutton.clicked.connect(self.CreateVolumeButtonClicked) self.addvolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_openVolume') self.addvolumebutton.clicked.connect(self.AddVolumeButtonClicked) self.editvolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_editVolume') self.editvolumebutton.clicked.connect(self.EditVolumeButtonClicked) self.settingsbutton = self.findChild(QtWidgets.QToolButton, 'btn_Settings') self.settingsbutton.clicked.connect(self.SetttingsButtonClicked) self.volumetable = self.findChild(QtWidgets.QTableWidget, 'tbl_Volumes') self.volumetable.itemSelectionChanged.connect(self.TableEntrySelected) self.browsevolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_browseVolume') self.browsevolumebutton.clicked.connect(self.BrowseVolumeClicked) self.removevolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_removeVolume') self.removevolumebutton.clicked.connect(self.RemoveVolumeClicked) self.infovolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_infoVolume') self.infovolumebutton.clicked.connect(self.ShowVolumeInfoClicked) self.refreshbutton = self.findChild(QtWidgets.QToolButton, 'btn_refreshVolumes') self.refreshbutton.clicked.connect(self.RefreshVolumesClicked) self.mountvolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_mountVolume') self.mountvolumebutton.clicked.connect(self.MountVolumeClicked) self.unmountvolumebutton = self.findChild(QtWidgets.QToolButton, 'btn_unmountVolume') self.unmountvolumebutton.clicked.connect(self.UnmountVolumeClicked) self.unmountallbutton = self.findChild(QtWidgets.QToolButton, 'btn_unmountAll') self.unmountallbutton.clicked.connect(self.UnmountAllClicked) self.lbl_updatestate = self.findChild(QtWidgets.QLabel, 'lbl_updatestate') self.lbl_updatestate.setText("") self.lbl_infolabel = self.findChild(QtWidgets.QLabel, 'lbl_InfoLabel') self.lbl_infolabel.setText("")
def MenuMountVolume(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) actionname = self.sender().text() volumename = self.getVolumeNameFromAction(actionname) if volumename in encfsgui_globals.g_Volumes: thispassword = self.getPasswordForVolume(volumename) self.MountVolume(volumename, thispassword) self.PopulateVolumeMenu() return
def AutoUnMount(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) if str(encfsgui_globals.g_Settings["autounmount"]) == "true": # unmount the volumes that don't have preventautounmount set for volumename in encfsgui_globals.g_Volumes: EncVolumeObj = encfsgui_globals.g_Volumes[volumename] if str(EncVolumeObj.preventautounmount) == "0": self.UnmountVolume(volumename) return
def SelectMountFolderClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) folderName = str( QtWidgets.QFileDialog.getExistingDirectory( self, "Select Directory", self.txt_mountfolder.displayText(), QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontResolveSymlinks)) if folderName: self.txt_mountfolder.setText("%s" % folderName) return
def AutoMount(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) # process automounts for volumename in encfsgui_globals.g_Volumes: EncVolumeObj = encfsgui_globals.g_Volumes[volumename] if str(EncVolumeObj.automount) == "1": if not EncVolumeObj.ismounted: thispassword = self.getPasswordForVolume(volumename) self.MountVolume(volumename, thispassword) return
def AddVolumeButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) addvolumewindow = CVolumeWindow() addvolumewindow.show() addvolumewindow.setRunMode(1) # add addvolumewindow.setFocus() addvolumewindow.activateWindow() addvolumewindow.exec_() self.RefreshVolumes() self.PopulateVolumeMenu() return
def HideButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.show_action.setEnabled(True) self.hide_action.setEnabled(False) if encfsgui_globals.g_Settings["clearkeywhenhidden"] == "true": print_debug("Hiding window, clearing masterkey") encfsgui_globals.masterkey = "" encfsgui_globals.ishidden = True self.PopulateVolumeMenu() # will disable menu if needed self.hide() return
def SelectProfileCustom(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.ciphercombo.setEnabled(True) self.keysizecombo.setEnabled(True) self.blocksizecombo.setEnabled(True) self.filenameencodingcombo.setEnabled(True) self.chk_perblockhmac.setEnabled(True) self.chk_perfileuniqueiv.setEnabled(True) self.chk_chainediv.setEnabled(True) self.chk_externaliv.setEnabled(True) return
def CreateVolumeButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.checkFilenameEncodings() createvolumewindow = CVolumeWindow() createvolumewindow.show() createvolumewindow.setRunMode(0) # create createvolumewindow.setFocus() createvolumewindow.activateWindow() createvolumewindow.exec_() self.RefreshVolumes() self.PopulateVolumeMenu() return
def SelectWorkingFolderClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.txt_workingfolder = self.findChild(QtWidgets.QLineEdit, 'txt_workingfolder') options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog folderName = str( QtWidgets.QFileDialog.getExistingDirectory(self, "Select Directory")) if folderName: self.txt_workingfolder.setText("%s" % folderName) return
def SelectVolumeTypeGoCryptFS(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) #disable the EncfS tab if self.runmode == 0: self.grp_encfsoptions.setEnabled(False) self.grp_gocryptfsoptions.setEnabled(True) #set GoCryptFS tab in focus self.tab_encfs_options.setEnabled(False) self.tab_gocryptfs_options.setEnabled(True) self.tab_volumetypes.setCurrentWidget(self.tab_gocryptfs_options) self.tab_gocryptfs_options.show() #self.chk_mountaslocal.setEnabled(False) return
def TableEntrySelected(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) # update the currently selected volume encfsgui_globals.g_CurrentlySelected = "" selectedindex = 0 for currentQTableWidgetItem in self.volumetable.selectedItems(): if selectedindex == 1: encfsgui_globals.g_CurrentlySelected = currentQTableWidgetItem.text() encfsgui_helper.print_debug("Selected entry %s" % encfsgui_globals.g_CurrentlySelected) selectedindex += 1 # enable/disable buttons accordingly self.EnableDisableButtons() return
def SelectGocryptfsButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.txt_gocryptfsbinary = self.findChild(QtWidgets.QLineEdit, 'txt_gocryptfsbinary') options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog fileName, _ = QtWidgets.QFileDialog.getOpenFileName( self, "Select 'gocryptfs' binary", self.txt_gocryptfsbinary.displayText(), "All Files (*)", options=options) if fileName: self.txt_gocryptfsbinary.setText("%s" % fileName) return
def SetttingsButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) settingswindow = CSettingsWindow() settingswindow.loadSettings() settingswindow.show() settingswindow.setFocus() settingswindow.activateWindow() settingswindow.exec_() # when dialog closes, refresh settings (in case user made a change) self.RefreshSettings() # don't refresh gui if gui is hidden, otherwise app might ask for master key if not encfsgui_globals.ishidden: self.RefreshVolumes() self.PopulateVolumeMenu() return
def EditVolumeButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.checkFilenameEncodings() if encfsgui_globals.g_CurrentlySelected != "": editvolumewindow = CVolumeWindow() editvolumewindow.show() editvolumewindow.setRunMode(2) # edit editvolumewindow.origvolumename = encfsgui_globals.g_CurrentlySelected editvolumewindow.PopulateFields(encfsgui_globals.g_CurrentlySelected) editvolumewindow.setFocus() editvolumewindow.activateWindow() editvolumewindow.exec_() encfsgui_globals.appconfig.getVolumes() self.RefreshVolumes() return
def ShowButtonClicked(self): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) self.show_action.setEnabled(False) self.hide_action.setEnabled(True) encfsgui_globals.ishidden = False self.show() # force reload of modules and update window self.lbl_infolabel.setText("") self.volumetable.clearContents() self.volumetable.setRowCount(0) encfsgui_globals.appconfig.getVolumes() self.RefreshVolumes() self.PopulateVolumeMenu() self.setFocus() return
def getPasswordForVolume(self, volumename): encfsgui_helper.print_debug("Start %s" % inspect.stack()[0][3]) thispassword = "" EncVolumeObj = encfsgui_globals.g_Volumes[volumename] if str(EncVolumeObj.passwordsaved) == "0": frmpassword = CMountPasswordWindow() frmpassword.setEncPath(EncVolumeObj.enc_path) frmpassword.setMountPath(EncVolumeObj.mount_path) frmpassword.setWindowTitle("Please enter password for volume '%s'" % volumename) frmpassword.show() frmpassword.setFocus() frmpassword.activateWindow() frmpassword.exec_() thispassword = frmpassword.getPassword() else: thispassword = str(encfsgui_helper.getKeyChainPassword(volumename)) return thispassword