#!/usr/bin/env python import os,sys import CryptoBox try: import cherrypy except: print "could not import cherrypy module! Try apt-get install python-cherrypy." sys.exit(1) try: import neo_cgi, neo_util, neo_cs except: print "could not import clearsilver modules! Try apt-get install python-clearsilver." class clearsilver: def __init__(self): pass def render(self,cs_path,settings = {},hdf_path = ""): """ render a clearsilver template and return the result. gets: - path to clearsilver template - dictionary with settings (optional) - path to hdf dataset (optional) """ hdf=neo_util.HDF() if hdf_path != "": hdf.readFile(hdf_path) for key in settings.keys(): hdf.setValue(key,str(settings[key])) cs= neo_cs.CS(hdf) cs.parseFile(cs_path) return cs.render() class CryptoBoxSite(CryptoBox.CryptoBoxProps): def index(self,action="show_status",page="",weblang="",device="", type=""): #PROPOSAL: #cherrypy could create nice paths like http://crypto.box/doc/, #but that would require an update of the links in the templates. #is the style worth it? #sanitize input page = self.sanitize_input(page) action = self.sanitize_input(action) device = self.sanitize_input(device) type = self.sanitize_input(type) #setting settings ;) settings={} TemplateDir = self.cbxPrefs["Settings"]["TemplateDir"] settings["Settings.TemplateDir"] = TemplateDir settings["Settings.Stylesheet"] = self.cbxPrefs["Settings"]["Stylesheet"] LangDir = self.cbxPrefs["Settings"]["LangDir"] settings["Settings.LangDir"] = LangDir Language = self.cbxPrefs["Settings"]["Language"] settings["Settings.DocDir"] = self.cbxPrefs["Settings"]["DocDir"] settings["Settings.DocLang"] = self.cbxPrefs["Settings"]["DocLang"] # BEWARE: there are two kinds of actions: # * some require a harddisk # * some do not require a harddisk # take care, that you put a new action into the appropriate block below #TODO: check for ssl, see cryptobox.pl lines 483-9 #--------------------------------------------------------------# # here you may define all cases that do not require a harddisk # # put all other cases below the harddisk check # #--------------------------------------------------------------# #################### show_log ####################### if action == "show_log": settings["Data.Action"] = "show_log" ##################### doc ############################ elif action == "doc": settings["Data.Action"] = "show_doc" if page != "": settings["Data.Doc.Page"] = page else: settings["Data.Doc.Page"] ="CryptoBoxUser" ##################### poweroff ###################### elif action == "system_ask": settings["Data.Action"] = "form_system" ##################### reboot ######################## elif action == "shutdown_do": if type == "reboot": #TODO: call function for system reboot pass settings["Data.Success"] = "ReBoot" settings["Data.Redirect.Action"] = "show_status" settings["Data.Redirect.Delay"] = "180" else: settings["Data.Success"] = "PowerOff" settings["Data.Action"] = "empty" ##################### check for a harddisk ########################## # catch this error, to prevent all following actions from execution # ##################################################################### elif not True: #TODO: replace True with check for hard disk is_harddisk_available() settings["Data.Error"] = "NoHardDisk" #-------------------------------------------------------# # here you may define all cases that require a harddisk # #-------------------------------------------------------# ################ umount_do ####################### elif action == "unmount_do": if device == "": #TODO: debug message: "invalid device: "+ 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) if device == "": #TODO: debug_msg(DEBUG_INFO, "invalid device: " + 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 #go render stuff cs = clearsilver() content = cs.render(TemplateDir+"/main.cs",settings,LangDir+"/"+Language+".hdf") return content def sanitize_input(self,data): #TODO: do things return data index.exposed = True ############################################################## cherrypy.root = CryptoBoxSite() #expose static content: #I currently have no idea how to cleanly extract the stylesheet path from #the config object without an extra CryptoBox.CryptoBoxProps instance. #perhaps put config handling into a seperate class in CryptoBox.py? cherrypy.config.configMap.update( { "/cryptobox.css": { "staticFilter.on" : True, "staticFilter.file": os.path.abspath("../www-data/cryptobox.css" ) } }) cherrypy.server.start()