diff --git a/pythonrewrite/bin/CryptoBoxContainer.py b/pythonrewrite/bin/CryptoBoxContainer.py index e594032..088311b 100755 --- a/pythonrewrite/bin/CryptoBoxContainer.py +++ b/pythonrewrite/bin/CryptoBoxContainer.py @@ -11,6 +11,7 @@ import subprocess import os import re import logging +from CryptoBoxExceptions import * """exceptions: VolumeIsActive @@ -55,15 +56,15 @@ class CryptoBoxContainer: def setName(self, new_name): if new_name == self.name: return if self.isMounted(): - raise "VolumeIsActive", "the container must be inactive during renaming" + raise CBVolumeIsActive("the container must be inactive during renaming") if not re.search(r'^[a-zA-Z0-9_\.\- ]+$', new_name): - raise "InvalidName", "the supplied new name contains illegal characters" + raise CBInvalidName("the supplied new name contains illegal characters") "check for active partitions with the same name" prev_name_owner = self.cbox.getContainerList(filterName=new_name) if prev_name_owner: for a in prev_name_owner: if a.isMounted(): - raise "NameActivelyUsed", "the supplied new name is already in use for an active partition" + raise CBNameActivelyUsed("the supplied new name is already in use for an active partition") self.cbox.setNameForUUID(self.uuid, new_name) self.name = new_name @@ -116,21 +117,20 @@ class CryptoBoxContainer: self.__createPlain() self.resetObject() return - raise "InvalidType", "invalid container type (%d) supplied" % (type, ) + raise CBInvalidType("invalid container type (%d) supplied" % (type, )) def changePassword(self, oldpw, newpw): if self.type != self.Types["luks"]: - raise "InvalidType", \ - "changing of password is possible only for luks containers" + raise CBInvalidType("changing of password is possible only for luks containers") if not oldpw: - raise "InvalidPassword", "no old password supplied for password change" + raise CBInvalidPassword("no old password supplied for password change") if not newpw: - raise "InvalidPassword", "no new password supplied for password change" + raise CBInvalidPassword("no new password supplied for password change") "return if new and old passwords are the same" if oldpw == newpw: return if self.isMounted(): - raise "VolumeIsActive", "this container is currently active" + raise CBVolumeIsActive("this container is currently active") devnull = None try: devnull = open(os.devnull, "w") @@ -156,13 +156,13 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not add a new luks key: %s - %s" % (output.strip(), errout.strip(), ) self.log.error(errorMsg) - raise "ChangePasswordError", errorMsg + raise CBChangePasswordError(errorMsg) ## retrieve the key slot we used for unlocking keys_found = re.search(r'key slot (\d{1,3}) unlocked', output).groups() if keys_found: keyslot = int(keys_found[0]) else: - raise "ChangePasswordError", "could not get the old key slot" + raise CBChangePasswordError("could not get the old key slot") "remove the old key" proc = subprocess.Popen( shell = False, @@ -179,7 +179,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not remove the old luks key: %s" % (proc.stderr.read().strip(), ) self.log.error(errorMsg) - raise "ChangePasswordError", errorMsg + raise CBChangePasswordError(errorMsg) @@ -300,8 +300,8 @@ class CryptoBoxContainer: def __mountLuks(self, password): "mount a luks partition" if not password: - raise "InvalidPassword", "no password supplied for luksOpen" - if self.isMounted(): raise "VolumeIsActive", "this container is already active" + raise CBInvalidPassword("no password supplied for luksOpen") + if self.isMounted(): raise CBVolumeIsActive("this container is already active") self.__umountLuks() try: devnull = open(os.devnull, "w") @@ -313,7 +313,7 @@ class CryptoBoxContainer: if not os.path.exists(self.__getMountPoint()): errorMsg = "Could not create mountpoint (%s)" % (self.__getMountPoint(), ) self.log.error(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) proc = subprocess.Popen( shell = False, stdin = subprocess.PIPE, @@ -332,7 +332,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not open the luks mapping: %s" % (errout.strip(), ) self.log.warn(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) proc = subprocess.Popen( shell = False, stdin = None, @@ -348,7 +348,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not mount the filesystem: %s" % (proc.stderr.read().strip(), ) self.log.warn(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) devnull.close() @@ -374,7 +374,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not umount the filesystem: %s" % (proc.stderr.read().strip(), ) self.log.warn(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) if os.path.exists(os.path.join(self.__dmDir, self.name)): proc = subprocess.Popen( shell = False, @@ -392,13 +392,13 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not remove the luks mapping: %s" % (proc.stderr.read().strip(), ) self.log.warn(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) devnull.close() def __mountPlain(self): "mount a plaintext partition" - if self.isMounted(): raise "VolumeIsActive", "this container is already active" + if self.isMounted(): raise CBVolumeIsActive("this container is already active") devnull = None try: devnull = open(os.devnull, "w") @@ -410,7 +410,7 @@ class CryptoBoxContainer: if not os.path.exists(self.__getMountPoint()): errorMsg = "Could not create mountpoint (%s)" % (self.__getMountPoint(), ) self.log.error(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) proc = subprocess.Popen( shell = False, stdin = None, @@ -426,7 +426,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not mount the filesystem: %s" % (proc.stderr.read().strip(), ) self.log.warn(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) devnull.close() @@ -452,15 +452,14 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not umount the filesystem: %s" % (proc.stderr.read().strip(), ) self.log.warn(errorMsg) - raise "MountError", errorMsg + raise CBMountError(errorMsg) devnull.close() def __createPlain(self): "make a plaintext partition" if self.isMounted(): - raise "VolumeIsActive", \ - "deactivate the partition before filesystem initialization" + raise CBVolumeIsActive("deactivate the partition before filesystem initialization") devnull = None try: devnull = open(os.devnull, "w") @@ -478,17 +477,16 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not create the filesystem: %s" % (proc.stderr.read().strip(), ) self.log.error(errorMsg) - raise "CreateError", errorMsg + raise CBCreateError(errorMsg) devnull.close() def __createLuks(self, password): "make a luks partition" if not password: - raise "InvalidPassword", "no password supplied for new luks mapping" + raise CBInvalidPassword("no password supplied for new luks mapping") if self.isMounted(): - raise "VolumeIsActive", \ - "deactivate the partition before filesystem initialization" + raise CBVolumeIsActive("deactivate the partition before filesystem initialization") devnull = None try: devnull = open(os.devnull, "w") @@ -516,7 +514,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not create the luks header: %s" % (errout.strip(), ) self.log.error(errorMsg) - raise "CreateError", errorMsg + raise CBCreateError(errorMsg) "open the luks container for mkfs" proc = subprocess.Popen( shell = False, @@ -536,7 +534,7 @@ class CryptoBoxContainer: if proc.returncode != 0: errorMsg = "Could not open the new luks mapping: %s" % (errout.strip(), ) self.log.error(errorMsg) - raise "CreateError", errorMsg + raise CBCreateError(errorMsg) "make the filesystem" proc = subprocess.Popen( shell = False, @@ -553,7 +551,7 @@ class CryptoBoxContainer: errorMsg = "Could not create the filesystem: %s" % (proc.stderr.read().strip(), ) self.log.error(errorMsg) "remove the luks mapping" - raise "CreateError", errorMsg + raise CBCreateError(errorMsg) devnull.close() diff --git a/pythonrewrite/bin/CryptoBoxExceptions.py b/pythonrewrite/bin/CryptoBoxExceptions.py index f99e84a..2ab16ed 100644 --- a/pythonrewrite/bin/CryptoBoxExceptions.py +++ b/pythonrewrite/bin/CryptoBoxExceptions.py @@ -8,15 +8,6 @@ class CryptoBoxError(Exception): pass -class CBPluginError(CryptoBoxError): - """should be raised for plugin specific problems""" - - -class CBPluginActionError(CBPluginError): - """should be raised when a plugin action failed""" - pass - - class CBConfigError(CryptoBoxError): """any kind of error related to the configuration of a cryptobox""" pass @@ -78,3 +69,36 @@ class CBEnvironmentError(CryptoBoxError): return "misconfiguration detected: %s" % self.desc +class CBContainerError(CryptoBoxError): + """any error raised while manipulating a cryptobox container""" + + def __init__(self, desc): + self.desc = desc + + def __str__(self): + return self.desc + +class CBCreateError(CBContainerError): + pass + +class CBVolumeIsActive(CBContainerError): + pass + +class CBInvalidName(CBContainerError): + pass + +class CBNameActivelyUsed(CBContainerError): + pass + +class CBInvalidType(CBContainerError): + pass + +class CBInvalidPassword(CBContainerError): + pass + +class CBChangePasswordError(CBContainerError): + pass + +class CBMountError(CBContainerError): + pass + diff --git a/pythonrewrite/bin/WebInterfaceSites.py b/pythonrewrite/bin/WebInterfaceSites.py index 8d7ff69..074f54c 100755 --- a/pythonrewrite/bin/WebInterfaceSites.py +++ b/pythonrewrite/bin/WebInterfaceSites.py @@ -60,14 +60,6 @@ class WebInterfaceSites: ###################################################################### ## put real sites down here and don't forget to expose them at the end - def logs(self, weblang=""): - '''displays a HTML version of the logfile - ''' - self.__resetDataset() - self.__setWebLang(weblang) - self.dataset["Data.Log"] = "
".join(self.cbox.getLogData(lines=30, maxSize=2000)) - return self.__render("show_log") - def status(self, weblang=""): '''shows the current status of the box @@ -143,8 +135,7 @@ class WebInterfaceSites: container = self.cbox.getContainer(device) try: container.setName(volume_name) - # TODO: specify the possible exceptions - except Exception, errMsg: + except CBContainerError, errMsg: self.log.warn("failed to rename the volume '%s' to '%s: %s'" % (device, volume_name, errMsg)) self.dataset["Data.Warning"] = "SetVolumeNameFailed" else: @@ -183,8 +174,7 @@ class WebInterfaceSites: container.mount() else: ## mounting is not possible - # TODO: wrong warning message - replace it - self.dataset["Data.Warning"] = "MountFailed" + self.dataset["Data.Warning"] = "InvalidType" self.log.warn("this type of container (%s) cannot be mounted - sorry!" % device) except (Exception, "MountError"): self.dataset["Data.Warning"] = "MountFailed" @@ -222,7 +212,7 @@ class WebInterfaceSites: return self.__render("show_status") - def init_do(self, device, confirm, crypto_password=None, crypto_password2=None, encryption=None, weblang=""): + def init_do(self, device, confirm="", crypto_password=None, crypto_password2=None, encryption=None, weblang=""): self.__resetDataset() self.__setWebLang(weblang) if self.__setDevice(device): @@ -237,8 +227,7 @@ class WebInterfaceSites: self.log.warn("initialization is not possible as long as the device (%s) is mounted" % device) return self.__render("form_init") else: - # TODO: we have to compare 'confirm' with the value in the language file - IMPORTANT! - if not confirm: + if confirm != self.__getLanguageValue("Text.ConfirmInit"): self.dataset["Data.Warning"] = "InitNotConfirmed" self.log.warn("the confirmation sentence for initialization of the device '%s' was wrong" % device) return self.__render("form_init") @@ -255,10 +244,8 @@ class WebInterfaceSites: container.create(container.Types["luks"], crypto_password) else: container.create(container.Types["plain"]) - # TODO: specify the exception - except Exception, errMsg: - # TODO: wrong error/warning message - change it - self.dataset["Data.Error"] = "InitFailed" + except CBContainerError, errMsg: + self.dataset["Data.Warning"] = "CreateFailed" self.log.warn("initialization of device '%s' failed" % device) self.log.warn("reason: %s" % errMsg) return self.__render("form_init") @@ -278,11 +265,7 @@ class WebInterfaceSites: import cherrypy self.__resetDataset() self.__setWebLang(weblang) - for x in pref_langs: - yield "Lang: %s
" % x - for (key,value) in headers.items(): - yield "%s: %s
" % (key,value) - #return "test passed" + return "test passed" def umount_do(self, device, weblang=""): @@ -302,9 +285,8 @@ class WebInterfaceSites: ## plain container container.umount() else: - ## mounting is not possible - # TODO: wrong warning message - replace it - self.dataset["Data.Warning"] = "UmountFailed" + ## umounting is not possible + self.dataset["Data.Warning"] = "InvalidType" self.log.warn("this type of container (%s) cannot be umounted - sorry!" % device) except (Exception, "UmountError"): self.dataset["Data.Warning"] = "UmountFailed" @@ -336,61 +318,12 @@ class WebInterfaceSites: return handler - ''' - ## DONE: these functions are pythonized - #################### show_log ####################### - ##################### doc ############################ - ##################### poweroff ###################### - ##################### reboot ######################## - - ## but there are even more TODO - #-------------------------------------------------------# - # here you may define all cases that require a harddisk # - #-------------------------------------------------------# - ################ umount_do ####################### - elif action == "unmount_do": - if not device: - self.log.debug("invalid device chosen: %s" device - settings["Data.Warning"] = "InvalidDevice" - settings["Data.Action"] = "empty" - elif not True: #TODO: replace True with check_config() - settings["Data.Warning"] = "NotInitialized" - settings["Data.Action"] = "form_init" - elif True: #TODO: replace True with check_init_running() - settings["Data.Warning"] = "InitNotFinished" - settings["Data.Action"] = "empty" - settings["Data.Redirect.Action"] = "form_config" - settings["Data.Redirect.Delay"] = "30" - elif not True: #TODO: replace True with check_mounted(device) - settings["Data.Warning"] = "NotMounted" - settings["Data.Action"] = "show_volume" - else: #unmount - #TODO: replace this line with umount_vol(device) - if True: #TODO: replace True with check_mounted(device) - settings["Data.Warning"] = "UmountFailed" - settings["Data.Action"] = "show_volume" - else: - settings["Data.Action"] = "show_volume" - ################ mount_do ######################## - elif action == "mount_do": - if device: - pass #TODO: is_encrypted = check_device_encryption(device) - else: - self.log.debug("invalid device chosen: %s" device - settings["Data.Warning"] = "InvalidDevice" - settings["Data.Action"] = "empty" - elif not True: #TODO: replace True with check_config() - settings["Data.Warning"] = "NotInitialized" - settings["Data.Action"] = "form_init" - #at cryptobox.pl line 568 - ''' - ##################### input checker ########################## def __setWebLang(self, value): - ## TODO: add some code to evaluate the language setting of the browser guess = value availLangs = self.cbox.getAvailableLanguages() + ## no language specified: check browser language if not guess: guess = self.__getPreferredBrowserLanguage(availLangs) if not guess or \ @@ -398,7 +331,6 @@ class WebInterfaceSites: re.search(u'\W', guess): self.cbox.log.info("invalid language choosen: %s" % guess) guess = self.prefs["WebSettings"]["Language"] - ## TODO: extract the current "browser-language" - this should be the first guess ## maybe the language is still not valid if not guess in availLangs: self.log.warn("the configured language is invalid: %s" % guess) @@ -459,6 +391,11 @@ class WebInterfaceSites: return False + def __getLanguageValue(self, value): + hdf = self.__getLanguageData(self.dataset["Settings.Language"]) + return hdf.getValue(value, "") + + def __getLanguageData(self, web_lang="en"): import neo_cgi, neo_util, os default_lang = "en" @@ -572,7 +509,6 @@ class WebInterfaceSites: ## to make the sites visible through the webserver they must be exposed here index.exposed = True doc.exposed = True - logs.exposed = True system.exposed = True status.exposed = True show_volume.exposed = True diff --git a/pythonrewrite/lang/en.hdf b/pythonrewrite/lang/en.hdf index 6f2964a..291aa33 100644 --- a/pythonrewrite/lang/en.hdf +++ b/pythonrewrite/lang/en.hdf @@ -161,6 +161,16 @@ WarningMessage { Text = Could not change the name of the container. Take a look at the log files for details. } + CreateFailed { + Title = Initialization failed + Text = Initialization of the volume failed for some unknown reasons - sorry! + } + + InvalidType { + Title = Unknown type + Text = The type of this volume is unknown. + } + VolumeMayNotBeMounted { Title = The container is mounted Text = This action is not available while the container is active. Please turn it off first. diff --git a/pythonrewrite/www-data/cryptobox.css b/pythonrewrite/www-data/cryptobox.css index 0b03790..c0c71c3 100644 --- a/pythonrewrite/www-data/cryptobox.css +++ b/pythonrewrite/www-data/cryptobox.css @@ -375,65 +375,3 @@ button:hover { padding-top: 10px; } -/* ------------=-=-=- special things -=-=-=------------- */ - -#partition_info p, #log p.console { - margin-left: 10%; - margin-right: 10%; - font-family: monospace; - text-align: left; - } - -/* ---------=-=-=-=- onscreen help -=-=-=-=--------- */ -/* not active anymore */ - -#words a.popup { - line-height: inherit; - color: inherit; - background-color: inherit; - text-decoration: inherit; - font-weight: inherit; - font-size: inherit; - } - -#words a.popup:hover { - text-decoration: inherit; - } - -#words a.popup span { - display: none; - position: fixed; - bottom: 10px; - left: 9%; - width: 80%; - background: #f0f0f0; - padding: 10px; - border-color: #e0e0e0; - border-width: 2px; - border-style: solid; - margin: 0; - } - -#words a.popup:hover span { - display: inline; - } - -#words a.popup span p { - text-align: left; - } - -#words a.popup span h3 { - color: #909090; - margin-top: 0px; - } - - -// TODO: move this to the plugin "partition" (inline include with cs) -#words div.partition { - text-align: center; - align: center; - } - -table.partition tr td{ - text-align: center - }