Commit 3c7aa32c authored by James Vasile's avatar James Vasile

Yay for first boot screens

 * import withsqlite into and start detecting first boot
 * new url page and start on forms
 * update license intro and (c) statement
parent 2e1240ad
# License to Copy the Plinth front end to the Freedom Plug
# License to Copy Plinth
Plinth is Copyright 2011 James Vasile (<>). It
Plinth is Copyright 2011-2013 James Vasile (<>). It
is distributed under the GNU Affero General Public License, Version 3
or later. A copy of GPLv3 is available [from the Free Software
or later. A copy of AGPLv3 is available [from the Free Software
In addition, the documentation to this software is distributed under a
Creative Commons Attribution-ShareAlike 3.0 Unported, Version 3
\ No newline at end of file
from urlparse import urlparse
import os, cherrypy
from gettext import gettext as _
from plugin_mount import PagePlugin, PluginMount, FormPlugin
from modules.auth import require
from forms import Form
from util import *
import cfg
class FirstBoot(PagePlugin):
order = 0 # order of running init in PagePlugins
def __init__(self, *args, **kwargs):
PagePlugin.__init__(self, *args, **kwargs)
self.register_page("firstboot") # this is the url this page will hang off of (/firstboot) = cfg.main_menu.add_item("First Boot", "icon-eye-open", "/privacy", 12)"General Config", "icon-asterisk", "/privacy/config", 10)"Ad Blocking", "icon-ban-circle", "/privacy/adblock", 20)"TOR", "icon-eye-close", "/privacy/TOR", 30)"HTTPS Everywhere", "icon-lock", "/privacy/https_everywhere", 30)
def index(self, *args, **kwargs):
return self.state0(*args, **kwargs)
def state0(self, message=None, box_name=None, box_key=""):
All the parameters are form inputs. They get passed in when
the form is submitted. This method checks the inputs and if
they validate, uses them to take action. If they do not
validate, it displays the form to give the user a chance to
input correct values. It might display an error message (in
the message parameter).
message is an optional string that we can display to the
user. It's a good place to put error messages.
form = Form(title="Welcome to Your FreedomBox!",
if not box_name:
box_name = cfg.box_name
form.html("<p>For convenience, your FreedomBox needs a name. It should be something short that doesn't contain spaces or punctuation. 'Willard' would be a good name. 'Freestyle McFreedomBox!!!' would not.</p>")
form.text_input('Name your FreedomBox', id="box_name", value=box_name)
form.html("<p>%(box_name)s uses cryptographic keys so it can prove its identity when talking to you. %(box_name)s can make a key for you, but if you already have one (from a prior FreedomBox, maybe), you can paste it below. This key should not be the same as your key because you are not your FreedomBox!</p>" % {'box_name':cfg.box_name})
form.text_box("If you want, paste your box's key here.", id="box_key", value=box_key)
form.submit("Box it up!")
return main
return self.fill_template(title=_("Privacy Control Panel"), main=main,
sidebar_right=_("""<strong>Statement of Principles</strong><p>When we say your
privacy is important, it's not just an empty pleasantry. We really
mean it. Your privacy control panel should give you fine-grained
control over exactly who can access your %s and the
information on it.</p>
<p>Your personal information should not leave this box without your
knowledge and direction. And if companies or government wants this
information, they have to ask <strong>you</strong> for it. This gives you a
change to refuse and also tells you who wants your data.</p>
""") % cfg.product_name)
......@@ -23,7 +23,10 @@ class Form():
"""Note that there appears to be a bug in cherrypy whereby
forms submitted via post don't have their fields included in
kwargs for the default index method. So we use get by
default, though it's not as neat."""
default, though it's not as neat.
TODO: file bug on this w/ CherryPy project
action = self.get_form_attrib_text('action', action)
onsubmit = self.get_form_attrib_text('onsubmit', onsubmit)
......@@ -85,13 +88,13 @@ class Form():
<input type="%s" class="inputtext" name="%s" id="%s" value="%s" size="%s"/>
</label>""" % (label, type, name, id, value, size)
def text_box(self, label='', name=None, id=None):
def text_box(self, label='', name=None, id=None, value=""):
name, id = self.name_or_id(name, id)
self.text += """
<textarea class="textbox" name="%s" id="%s"></textarea>
</label>""" % (label, name, id)
<textarea class="textbox" name="%s" id="%s">%s</textarea>
</label>""" % (label, name, id, value)
def submit(self, label='', name=None, id=None):
name, id = self.name_or_id(name, id)
self.text += """
......@@ -16,6 +16,8 @@ from util import *
from logger import Logger
#from modules.auth import AuthController, require, member_of, name_is
import withsqlite
from withsqlite.withsqlite import sqlite_db
import exmachina
from exmachina.exmachina import ExMachinaClient
import socket
......@@ -52,6 +54,9 @@ def error_page_500(status, message, traceback, version):
class Root(plugin_mount.PagePlugin):
def index(self):
with sqlite_db(cfg.store_file, table="firstboot") as db:
if not 'state' in db:
raise cherrypy.InternalRedirect('/firstboot')
if cherrypy.session.get(cfg.session_key, None):
raise cherrypy.InternalRedirect('/router')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment