mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-01-21 07:55:00 +00:00
Merge pull request #8 from tomgalloway/master
Manage User & Groups pages now display correctly but don't do anything yet.
This commit is contained in:
commit
ba15a92023
1
.gitignore
vendored
1
.gitignore
vendored
@ -25,3 +25,4 @@ cherrypy.config
|
||||
data/users.sqlite3
|
||||
predepend
|
||||
build/
|
||||
*.pid
|
||||
9
model.py
9
model.py
@ -1,14 +1,15 @@
|
||||
class User(dict):
|
||||
""" Every user must have keys for a username, name, password (this
|
||||
""" Every user must have keys for a username, name, passphrase (this
|
||||
is a md5 hash of the password), groups, and an email address. They can be
|
||||
blank or None, but the keys must exist. """
|
||||
def __init__(self, dict=None):
|
||||
for key in ['username', 'name', 'password', 'email']:
|
||||
for key in ['username', 'name', 'passphrase', 'email']:
|
||||
self[key] = ''
|
||||
for key in ['groups']:
|
||||
self[key] = []
|
||||
for key in dict:
|
||||
self[key] = dict[key]
|
||||
if dict:
|
||||
for key in dict:
|
||||
self[key] = dict[key]
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return None
|
||||
|
||||
@ -12,10 +12,42 @@ class UserStore(UserStoreModule, sqlite_db):
|
||||
self.db_file = cfg.user_db
|
||||
sqlite_db.__init__(self, self.db_file, autocommit=True)
|
||||
self.__enter__()
|
||||
|
||||
def close(self):
|
||||
self.__exit__()
|
||||
def expert(self):
|
||||
return False
|
||||
self.__exit__(None,None,None)
|
||||
|
||||
def expert(self, username=None):
|
||||
groups = self.attr(username,"groups")
|
||||
if not groups:
|
||||
return False
|
||||
return 'expert' in groups
|
||||
|
||||
def attr(self, username=None, field=None):
|
||||
return self.get(username)[field]
|
||||
|
||||
def get(self,username=None):
|
||||
return User(sqlite_db.get(self,username))
|
||||
|
||||
def exists(self, username=None):
|
||||
try:
|
||||
user = self.get(username)
|
||||
if not user:
|
||||
return False
|
||||
elif user["username"]=='':
|
||||
return False
|
||||
return True
|
||||
except TypeError:
|
||||
return False
|
||||
|
||||
def remove(self,username=None):
|
||||
self.__delitem__(username)
|
||||
self.commit()
|
||||
|
||||
def get_all(self):
|
||||
return self.items()
|
||||
|
||||
def set(self,username=None,user=None):
|
||||
sqlite_db.__setitem__(self,username, user)
|
||||
|
||||
class UserStoreOld():
|
||||
#class UserStore(UserStoreModule):
|
||||
|
||||
@ -5,22 +5,23 @@ from plugin_mount import PagePlugin, FormPlugin
|
||||
import cfg
|
||||
from forms import Form
|
||||
from util import *
|
||||
from pprint import pprint
|
||||
|
||||
class users(PagePlugin):
|
||||
order = 20 # order of running init in PagePlugins
|
||||
def __init__(self, *args, **kwargs):
|
||||
PagePlugin.__init__(self, *args, **kwargs)
|
||||
self.register_page("sys.users")
|
||||
self.register_page("sys.users.add")
|
||||
self.register_page("sys.users.edit")
|
||||
|
||||
@cherrypy.expose
|
||||
@require()
|
||||
def index(self):
|
||||
parts = self.forms('/sys/config')
|
||||
parts['title']=_("Manage Users and Groups")
|
||||
return self.fill_template(**parts)
|
||||
return self.fill_template(title="Manage Users and Groups", sidebar_right="""<strong><a href="/sys/users/add">Add User</a></strong><br/><strong><a href="/sys/users/edit">Edit Users</a></strong>""")
|
||||
|
||||
class add(FormPlugin, PagePlugin):
|
||||
url = ["/sys/users"]
|
||||
url = ["/sys/users/add"]
|
||||
order = 30
|
||||
|
||||
sidebar_left = ''
|
||||
@ -46,27 +47,29 @@ class add(FormPlugin, PagePlugin):
|
||||
return form.render()
|
||||
|
||||
def process_form(self, username=None, name=None, email=None, md5_password=None, **kwargs):
|
||||
msg = ''
|
||||
msg = Message()
|
||||
|
||||
if not username: msg = add_message(msg, _("Must specify a username!"))
|
||||
if not md5_password: msg = add_message(msg, _("Must specify a password!"))
|
||||
if not username: msg.add = _("Must specify a username!")
|
||||
if not md5_password: msg.add = _("Must specify a password!")
|
||||
|
||||
if username in cfg.users:
|
||||
msg = add_message(msg, _("User already exists!"))
|
||||
if username in cfg.users.keys():
|
||||
msg.add = _("User already exists!")
|
||||
else:
|
||||
try:
|
||||
cfg.users[username]= User(dict={'username':username, 'name':name, 'email':email, 'password':md5_password})
|
||||
di = {'username':username, 'name':name, 'email':email, 'passphrase':md5_password}
|
||||
new_user = User(dict=di)
|
||||
cfg.users.set(username,new_user)
|
||||
except:
|
||||
msg = add_message(msg, _("Error storing user!"))
|
||||
msg.add = _("Error storing user!")
|
||||
|
||||
if not msg:
|
||||
msg = add_message(msg, "%s saved." % username)
|
||||
|
||||
main = self.make_form(username, name, email, message=msg)
|
||||
return self.fill_template(title="", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
|
||||
msg.add = _("%s saved." % username)
|
||||
cfg.log(msg.text)
|
||||
#main = self.make_form(username, name, email, msg=msg.text)
|
||||
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
|
||||
|
||||
class edit(FormPlugin, PagePlugin):
|
||||
url = ["/sys/users"]
|
||||
url = ["/sys/users/edit"]
|
||||
order = 35
|
||||
|
||||
sidebar_left = ''
|
||||
@ -77,7 +80,7 @@ class edit(FormPlugin, PagePlugin):
|
||||
system.</p><p>Deleting users is permanent!</p>""" % (cfg.product_name, cfg.box_name))
|
||||
|
||||
def main(self, msg=''):
|
||||
users = cfg.users.keys()
|
||||
users = cfg.users
|
||||
add_form = Form(title=_("Edit or Delete User"), action="/sys/users/edit", message=msg)
|
||||
add_form.html('<span class="indent"><strong>Delete</strong><br /></span>')
|
||||
for uname in sorted(users.keys()):
|
||||
@ -113,8 +116,8 @@ class edit(FormPlugin, PagePlugin):
|
||||
msg.add(_("User %s does not exist." % username))
|
||||
else:
|
||||
msg.add = _("Must specify at least one valid, existing user.")
|
||||
main = self.make_form(msg=msg.text)
|
||||
return self.fill_template(title="", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
|
||||
#main = self.make_form(msg=msg.text)
|
||||
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
|
||||
|
||||
sidebar_right = ''
|
||||
u = cfg.users[kwargs['username']]
|
||||
@ -125,4 +128,4 @@ class edit(FormPlugin, PagePlugin):
|
||||
|
||||
main = _("""<strong>Edit User '%s'</strong>""" % u['username'])
|
||||
sidebar_right = ''
|
||||
return self.fill_template(title="", main=main, sidebar_left=self.sidebar_left, sidebar_right=sidebar_right)
|
||||
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=sidebar_right)
|
||||
|
||||
1
start.sh
1
start.sh
@ -1,7 +1,6 @@
|
||||
#! /bin/sh
|
||||
|
||||
PYTHONPATH=build/exmachina:$PYTHONPATH
|
||||
PYTHONPATH=build/bjsonrpc:$PYTHONPATH
|
||||
|
||||
export PYTHONPATH
|
||||
|
||||
|
||||
9
test.sh
Executable file
9
test.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#! /bin/sh
|
||||
|
||||
PYTHONPATH=build/exmachina:$PYTHONPATH
|
||||
PYTHONPATH=modules/installed/lib:$PYTHONPATH
|
||||
PYTHONPATH=vendor:$PYTHONPATH
|
||||
|
||||
export PYTHONPATH
|
||||
|
||||
python tests/test_user_store.py
|
||||
86
tests/test_user_store.py
Normal file
86
tests/test_user_store.py
Normal file
@ -0,0 +1,86 @@
|
||||
#! /usr/bin/env python
|
||||
# -*- mode: python; mode: auto-fill; fill-column: 80 -*-
|
||||
|
||||
import user_store
|
||||
from logger import Logger
|
||||
import cfg
|
||||
import unittest
|
||||
import cherrypy
|
||||
import plugin_mount
|
||||
import os
|
||||
from model import User
|
||||
cfg.log = Logger()
|
||||
|
||||
cherrypy.log.access_file = None
|
||||
|
||||
class UserStore(unittest.TestCase):
|
||||
"""Test each function of user_store to confirm they work as expected"""
|
||||
|
||||
def setUp(self):
|
||||
cfg.user_db = os.path.join(cfg.file_root, "tests/testdata/users");
|
||||
self.userstore = plugin_mount.UserStoreModule.get_plugins()[0]
|
||||
|
||||
def tearDown(self):
|
||||
for user in self.userstore.get_all():
|
||||
self.userstore.remove(user[0])
|
||||
self.userstore.close()
|
||||
|
||||
def test_user_does_not_exist(self):
|
||||
self.assertEqual(self.userstore.exists("notausername"),False)
|
||||
|
||||
def test_user_does_exist(self):
|
||||
self.add_user("isausername", False)
|
||||
self.assertEqual(self.userstore.exists("isausername"),True)
|
||||
|
||||
def test_add_user(self):
|
||||
self.assertEqual(len(self.userstore.items()),0)
|
||||
self.add_user("test_user", False)
|
||||
self.assertEqual(len(self.userstore.items()),1)
|
||||
|
||||
def test_user_is_in_expert_group(self):
|
||||
self.add_user("test_user", True)
|
||||
self.assertEqual(self.userstore.expert("test_user"),True)
|
||||
|
||||
def test_user_is_not_in_expert_group(self):
|
||||
self.add_user("test_user", False)
|
||||
self.assertEqual(self.userstore.expert("test_user"),False)
|
||||
|
||||
def test_user_removal(self):
|
||||
self.assertEqual(len(self.userstore.items()),0)
|
||||
self.add_user("test_user", False)
|
||||
self.assertEqual(len(self.userstore.items()),1)
|
||||
self.userstore.remove("test_user")
|
||||
self.assertEqual(len(self.userstore.items()),0)
|
||||
|
||||
def test_get_user_email_attribute(self):
|
||||
self.add_user("test_user", False,"test@home")
|
||||
self.assertEqual(self.userstore.attr("test_user","email"),"test@home")
|
||||
|
||||
def test_get_user(self):
|
||||
test_user = self.add_user("test_user", False)
|
||||
self.assertEqual(self.userstore.get("test_user"),test_user)
|
||||
|
||||
def test_get_all_users(self):
|
||||
self.add_user("test_user1", False)
|
||||
self.add_user("test_user2", False)
|
||||
self.assertEqual(len(self.userstore.get_all()),2)
|
||||
|
||||
def add_user(self, test_username, add_to_expert_group, email=''):
|
||||
test_user = self.create_user(test_username, email)
|
||||
if add_to_expert_group:
|
||||
test_user = self.add_user_to_expert_group(test_user)
|
||||
self.userstore.set(test_username,test_user)
|
||||
return test_user
|
||||
|
||||
def create_user(self, username, email=''):
|
||||
test_user = User()
|
||||
test_user["username"] = username
|
||||
test_user["email"] = email
|
||||
return test_user
|
||||
|
||||
def add_user_to_expert_group(self, user):
|
||||
user["groups"] = ["expert"]
|
||||
return user
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
BIN
tests/testdata/users.sqlite3
vendored
Normal file
BIN
tests/testdata/users.sqlite3
vendored
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user