+merged some config changes

@[l] please also check the webserver if you change the config
+moved language checkers
+changed input sanitizing
This commit is contained in:
age 2006-08-30 19:56:37 +00:00
parent f450e116a7
commit f4bf1c7a34
5 changed files with 80 additions and 68 deletions

View file

@ -287,6 +287,41 @@ class CryptoBoxProps(CryptoBox):
"the uuid was not found"
return None
def getAvailableLanguages(self):
'''reads all files in path LangDir and returns a list of
basenames from existing hdf files, that should are all available
languages'''
languages = []
for file in os.listdir(self.cbxPrefs["Locations"]["LangDir"]):
if file.endswith(".hdf"): languages.append(file.rstrip(".hdf"))
if len(languages) < 1:
self.log.warn("No .hdf files found! The website won't render properly.")
return languages
def getAvailableDocLanguages(self):
'''reads all dirs in path DocDir and returns a list of
available documentation languages, this list might be empty.'''
doclangs = []
regpat = re.compile(r"^\w+$")
try:
doc_dir = self.cbxPrefs["Locations"]["DocDir"]
except KeyError:
self.log.error("Could not find a configuration setting: [Locations]->DocDir - please check the config file")
return []
if not os.path.exists(doc_dir):
self.log.error("The configured documentation directory (%s) does not exist" % (doc_dir, ))
return []
try:
for e in os.listdir(doc_dir):
if regpat.search(e) and os.path.isdir(os.path.join(doc_dir, e)):
doclangs.append(e)
if len(doclangs) < 1:
self.log.warn("Didn't find any documentation files.")
return doclangs
except OSError:
self.log.error("Could not access the documentations directory (%s)" % (doc_dir,))
return []
""" ************ internal stuff starts here *********** """

View file

@ -1,8 +1,8 @@
import os
try:
import neo_cgi, neo_util, neo_cs
except:
print "could not import clearsilver modules! Try apt-get install python-clearsilver."
except ImportError:
raise ImportError("could not import clearsilver modules! Try apt-get install python-clearsilver.")
class CryptoBoxWebserverRender:
'''renders the site with clearsilver template and languagefile
@ -24,13 +24,14 @@ class CryptoBoxWebserverRender:
website.log.error("Couldn't read cs file: %s" % cs_path)
return "Couldn't read cs file: %s" % cs_path
hdf_path = website.cbxPrefs["Locations"]["LangDir"]+"/"+website.cbxPrefs["Settings"]["Language"]+".hdf"
hdf_path = website.cbxPrefs["Locations"]["LangDir"]+"/"+website.cbxPrefs["WebSettings"]["Language"]+".hdf"
if not os.access(hdf_path, os.R_OK):
website.log.error("Couldn't read hdf file: %s" % hdf_path)
return "Couldn't read hdf file: %s" % hdf_path
hdf = neo_util.HDF()
hdf.readFile(hdf_path)
#website.log.info(website.settings)
for key in website.settings.keys():
hdf.setValue(key,str(website.settings[key]))
cs = neo_cs.CS(hdf)

View file

@ -8,13 +8,23 @@ class CryptoBoxWebserverSettings:
There may also be set some useful standards here.'''
website.settings={}
## put all found Settings values in the dictionary
for key in self.cbxPrefs["Settings"].keys():
website.settings["Settings."+key] = self.cbxPrefs["Settings"][key]
#TODO: this is nessessary since the last config split in different sections
## put all found WebSettings values in the dictionary
for key in self.cbxPrefs["WebSettings"].keys():
website.settings["Settings."+key] = self.cbxPrefs["WebSettings"][key]
## also all Log values
for key in self.cbxPrefs["Log"].keys():
website.settings["Log."+key] = self.cbxPrefs["Log"][key]
## also Main
for key in self.cbxPrefs["Main"].keys():
website.settings["Settings."+key] = self.cbxPrefs["Main"][key]
## Locations dito
for key in self.cbxPrefs["Locations"].keys():
website.settings["Settings."+key] = self.cbxPrefs["Locations"][key]
## put available languages also in the dictionary
website.settings["Settings.AvailableLanguages"] = self.getAvailableLanguages()
website.settings["Settings.AvailableDocLanguages"] = self.getAvailableDocLanguages()
#self.log.info(self.settings)

View file

@ -34,24 +34,25 @@ class CryptoBoxWebserverSites(CryptoBox.CryptoBoxProps, CryptoBoxWebserverSettin
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]
'''
niceparams = { 'weblang': tuple(self.__getAvailableLanguages()),
niceparams = { 'weblang': self.settings["Settings.AvailableLanguages"],
'loglevel': ('','info', 'warn', 'debug', 'error'),
'type': ('reboot', 'poweroff')
}
for evilkey in evilparams.keys():
## if the param isn't in the niceparams list, ignore it
if not niceparams.get(evilkey):
self.log.warn('ignoring "%s"' % evilkey)
# RFC: why "return False"? - just ignoring is sufficient
return False
#TODO: until now only a warning message is printed
## if the param has no such value, set it to a default (the first in the list)
if evilparams.get(evilkey) not in niceparams.get(evilkey):
self.log.warn('"%s" not in weblang %s' % (evilkey, niceparams.get(evilkey)))
# RFC: why "weblang"?
#TODO: set it to: niceparams.get(evilkey)[0]))
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"]
return
@ -64,44 +65,6 @@ class CryptoBoxWebserverSites(CryptoBox.CryptoBoxProps, CryptoBoxWebserverSettin
#TODO
pass
def __getAvailableLanguages(self):
import re, os
regpat = re.compile(r"^\w+\.hdf$")
try:
lang_dir = self.cbxPrefs["Locations"]["LangDir"]
except KeyError:
self.log.error("Could not find a configuration setting: [Locations]->LangDir - please check the config file")
return []
if not os.path.exists(lang_dir):
self.log.error("The configured language directory (%s) does not exist" % (lang_dir, ))
return []
try:
return [ e[:-4] for e in os.listdir(lang_dir) if regpat.search(e)]
except OSError:
self.log.error("Could not access the language directory (%s)" % (lang_dir,))
return []
def __getAvailableDocLanguages(self):
import re, os
regpat = re.compile(r"^\w+$")
try:
doc_dir = self.cbxPrefs["Locations"]["DocDir"]
except KeyError:
self.log.error("Could not find a configuration setting: [Locations]->DocDir - please check the config file")
return []
if not os.path.exists(doc_dir):
self.log.error("The configured documentation directory (%s) does not exist" % (doc_dir, ))
return []
try:
return [ e for e in os.listdir(doc_dir)
if regpat.search(e) and os.path.isdir(os.path.join(doc_dir, e))]
except OSError:
self.log.error("Could not access the documentations directory (%s)" % (doc_dir,))
return []
######################################################################
## put real sites down here and don't forget to expose them at the end
@ -115,16 +78,16 @@ class CryptoBoxWebserverSites(CryptoBox.CryptoBoxProps, CryptoBoxWebserverSettin
reserved word.
# RFC: maybe it conflicts with CryptoBoxProps.log - which we inherited?
'''
self.__sanitize_input({"loglevel":loglevel})
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.__sanitize_input({"weblang":weblang})
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"
@ -146,7 +109,7 @@ class CryptoBoxWebserverSites(CryptoBox.CryptoBoxProps, CryptoBoxWebserverSettin
def doc(self,action="",page="",weblang=""):
'''prints the offline wikipage
TODO: action is unnessessary, remove here and from all html
TODO: "action" is unnessessary, remove it here and from all html
files in doc/html/[de|en]/*
'''
# RFC: sanitize?
@ -154,12 +117,13 @@ class CryptoBoxWebserverSites(CryptoBox.CryptoBoxProps, CryptoBoxWebserverSettin
if page:
self.settings["Data.Doc.Page"] = page
else:
## display this site as default helpsite
self.settings["Data.Doc.Page"] ="CryptoBoxUser"
if weblang:
if weblang in self.__getAvailableDocLanguages():
self.settings["Settings.DocLang"] = weblang
else:
self.log.warn("invalid documentation language selected: %s", % (weblang, ))
if len(self.settings["Settings.AvailableDocLanguages"]) < 1:
self.settings["Data.Error"] = "NoDocumentation"
## set doclang to weblang, otherwise the default lang from the config will be used
elif weblang in ("en","de"):
self.settings["Settings.DocLang"] = weblang
return website.render(self)

View file

@ -86,9 +86,11 @@ CryptoBoxRootActions = CryptoBoxRootActions
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps,"/invalid/path/to/config/file")
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps,"/etc/shadow")
for a in self.CryptoBox.CONF_LOCATIONS:
if os.path.exists(a): self.CryptoBox.CryptoBoxProps()
else: self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps)
self.CryptoBox.CryptoBoxProps(self.filenames["configFileOK"])
if os.path.exists(a):
self.CryptoBox.CryptoBoxProps()
self.CryptoBox.CryptoBoxProps(self.filenames["configFileOK"])
else:
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps)
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps,[])
def testBrokenConfigs(self):