cryptonas-branches/pythonrewrite/bin2/CryptoBoxWebserverSites.py
age 7f9c736116 * removed hardcoded doclangs
* truly removed '?action'
* some RFC comments
2006-09-06 07:14:27 +00:00

256 lines
9.3 KiB
Python
Executable file

import CryptoBox
import CryptoBoxWebserverSettings
import CryptoBoxWebserverRender
# RFC: is this global variable necessary? [l]
website = CryptoBoxWebserverRender.CryptoBoxWebserverRender()
# RFC: where should we put the information gathering? (available harddisks, current volume info, ...) - selectively for every "site" or always (as before)? [l]
# RFC: is it necessary to inherit these both classes?
# for clarity they should be just instanciated - or not? [l]
class CryptoBoxWebserverSites(CryptoBox.CryptoBoxProps, CryptoBoxWebserverSettings.CryptoBoxWebserverSettings):
'''
url2func = {'index':'show_status','doc':'show_doc','logs':'show_log'}
'''
def __prepare(self, action="show_status"):
'''handles stuff that all sites need as preparation
The default site to render is 'show_status'.
Self.settings is filled by the following methodcall
thus every rendered site will get actual values from the configfile.
After that the corresponding site-method (e.g. doc) may set individual values.
'''
# RFC: the following line somehow implicitly calls 'setSettings(self, self)'
# should it be that way? [l]
self.setSettings(self)
#self.settings
self.settings["Data.Action"] = action
#TODO: check ssl status
def __sanitize_input(self, evilparams):
'''mistrusts every given parameter and wipes crap out
Every single site method has to call this before even looking
at url-given parameters.
This has to be called manually, since I don't see any other way of
sanitizing input automatically for all sites.
To take full effect it is good style not to use any given
parameter for any website. Instead use "settings.["..." if it
isn't already defined. Then define it in here, after carefully
checking.
# RFC: why shouldn't it be called in __init__? [l]
there is no such thing like __init__ in cherrypy sites [a]
what about the unnamed place, where 'exposed' attributes are set? [l]
'''
# RFC: this dictionary is not sufficient for arbitrary text inputs (e.g.: names) or numbers [l]
# what way would we sanizite such input? just exclude forbidden elements? [a]
niceparams = {
'weblang': ["Settings.Language", self.settings["Settings.AvailableLanguages"]],
'loglevel': ["Log.Level", ('','info', 'warn', 'debug', 'error')],
'type': ["Data.Type", ('reboot', 'poweroff')]
}
## check all given evil parameters against the nice ones
## set them to self.settings if accepted, otherwise do nothing
for evilkey in evilparams.keys():
# TODO: should be easier without the following for-loop
for nicekey in niceparams.keys():
if evilkey == nicekey:
#self.log.warn(niceparams[nicekey][0])
#self.log.warn(niceparams[nicekey][1])
if evilparams[nicekey] and evilparams[nicekey] in niceparams[nicekey][1]:
# RFC: isn't "self.settings" a non-obvious name for user input? [l]
# self.settings is used by clearsilver [a]
self.settings[niceparams[nicekey][0]] = evilparams[nicekey]
#self.log.warn(niceparams[nicekey][0])
#self.log.warn(evilparams[nicekey])
'''
## e.g. do this manually
if evilkey == "weblang":
if evilparams["weblang"] and evilparams["weblang"] in niceparams["weblang"]:
self.settings["Settings.Language"] = evilparams["weblang"]
if evilkey == "loglevel":
if evilparams["loglevel"] and evilparams["loglevel"] in niceparams["loglevel"]:
self.settings["Log.Level"] = evilparams["loglevel"]
if evilkey == "type":
if evilparams["type"] and evilparams["type"] in niceparams["type"]:
self.settings["Data.Type"] = evilparams["type"]
'''
return
def __isHDAvailable(self):
#TODO: implement this
return True
def __check_config(self):
#TODO: from now on a cryptobox is always configured
return True
def __check_init_running(self):
#TODO: implement this check (is mkfs still running?)
return False
######################################################################
## put real sites down here and don't forget to expose them at the end
def logs(self, loglevel=""):
'''displays a HTML version of the logfile
The loglevel has to be set and nothing else, as we just log in english.
RFC: what does this mean? We still have to save the current language - or not? [l]
Be aware not to name this method just "log" as it seems to be a
reserved word.
# RFC: maybe it conflicts with CryptoBoxProps.log - which we inherited? [l]
'''
self.__prepare("show_log")
self.__sanitize_input({"loglevel":loglevel})
self.settings["Data.Log"] = "<br/>".join(self.getLogData(lines=30, maxSize=2000))
return website.render(self)
def status(self, weblang=""):
'''shows the current status of the box
'''
self.__prepare("show_status")
self.__sanitize_input({"weblang":weblang})
if not self.__check_config():
self.settings["Data.Warning"] = "NotInitialized"
self.settings["Data.Action"] = "form_init"
elif self.__check_init_running():
self.settings["Data.Warning"] = "InitNotFinished"
self.settings["Data.Action"] = "empty"
self.settings["Data.Redirect.Action"] = "form_config"
self.settings["Data.Redirect.Delay"] = "30"
else:
self.settings["Data.Action"] = "show_status"
self.settings["Data.Redirect.Delay"] = "60"
return website.render(self)
def config(self,weblang=""):
pass
# TODO: add "doclang" - it is selected by each link in the doc pages
# according to scripts/docexport it's weblang [a]
def doc(self,page="",weblang=""):
'''prints the offline wikipage
'''
self.__prepare("show_doc")
# TODO: single pagenames should be sanitized
self.__sanitize_input({"weblang":weblang})
# TODO: check the supplied page name for validity (is it text? pattern match?)
if page:
self.settings["Data.Doc.Page"] = page
else:
## display this site as default helpsite
self.settings["Data.Doc.Page"] ="CryptoBoxUser"
if len(self.settings["Settings.AvailableDocLanguages"]) < 1:
self.settings["Data.Error"] = "NoDocumentation"
# TODO: what should be done, if there is an error?
# do you mean this is not an error? [a]
## set doclang to weblang, otherwise the default weblang from the config will be used for doclang
elif self.settings["Settings.Language"] in ["Settings.AvailableDocLanguages"]:
self.settings["Settings.DocLang"] = self.settings["Settings.Language"]
# TODO: missing 'else'?
return website.render(self)
def system(self, type="", weblang=""):
self.__prepare("form_system")
self.__sanitize_input({"type":type,"weblang":weblang})
if type == "reboot":
self.settings["Data.Success"] = "ReBoot"
self.settings["Data.Redirect.Action"] = "show_status"
self.settings["Data.Redirect.Delay"] = "180"
self.log.info("TODO: call function for system reboot")
elif type == "poweroff":
self.settings["Data.Success"] = "PowerOff"
self.log.info("TODO: call function for system shutdown")
else:
self.log.warn("This shutdown-mode (%s) is not supplied." % type)
return website.render(self)
def index(self):
self.__prepare("show_status")
return website.render(self)
def test(self):
return "test passed"
def umount_do(self):
if not __isHDAvailable():
pass
else:
pass
'''
## 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
'''
############################################################################
## 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
test.exposed = True