monitor: prevent html injection with cgi.escape
[slapos.git] / stack / monitor / webfile-directory / settings.cgi.in
1 #!{{ python_executable }}
2
3 import cgi
4 import cgitb
5 import ConfigParser
6 import os
7
8 cgitb.enable()
9 form = cgi.FieldStorage()
10
11 print "<html><head>"
12 print "<link rel=\"stylesheet\" href=\"static/pure-min.css\">"
13 print "<link rel=\"stylesheet\" href=\"static/style.css\">"
14 print "</head><body>"
15
16 config_file = "{{ config_cfg }}"
17
18 if not os.path.exists(config_file):
19   print "Your software does <b>not</b> embed 0-knowledge. \
20   This interface is useless in this case</body></html>"
21   exit(0)
22
23 parser = ConfigParser.ConfigParser()
24 parser.read(config_file)
25
26 if not parser.has_section('public'):
27   print "<p>Your software does not use 0-knowledge settings.</p></body></html>"
28   exit(0)
29
30 for name in form:
31   if parser.has_option('public', name):
32     parser.set('public', name, form[name].value)
33 with open(config_file, 'w') as file:
34   parser.write(file)
35
36 if len(form) > 0:
37   try:
38     os.remove("{{ timestamp }}")
39   except OSError:
40     pass
41
42 print "<h1>Values that can be defined :</h1>"
43 print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">"
44 print "<input type=\"hidden\" name=\"posting-script\" value=\"{{ pwd }}/{{ this_file }}\">"
45 for option in parser.options("public"):
46   print "<div class=\"pure-control-group\">"
47   print "<label for=\"%s\">%s</label>" % (cgi.escape(option, quote=True), cgi.escape(option))
48   print "<input type=\"text\" name=\"%s\" value=\"%s\">" % (cgi.escape(option, quote=True), cgi.escape(parser.get('public', option), quote=True))
49   print "</div>"
50 print "<div class=\"pure-controls\"><button type=\"submit\" class=\"pure-button \
51  pure-button-primary\">Save</button></div></form>"
52
53 print "<br><h1>Other values :</h1>"
54 print "<form class=\"pure-form-aligned\">"
55 for section in parser.sections():
56   if section != 'public':
57     for option in parser.options(section):
58       print "<div class=\"pure-control-group\">"
59       print "<label for=\"%s\">%s</label>" % (cgi.escape(option, quote=True), cgi.escape(option))
60       print "<input type=\"text\" name=\"%s\" value=\"%s\" readonly>" %(cgi.escape(option, quote=True), cgi.escape(parser.get(section, option), quote=True))
61       print "</div>"
62 print "</form>"
63
64 print "</body></html>"