From c4b2fb1a6062b6cb63ce0f08f48ccdaf72708643 Mon Sep 17 00:00:00 2001
From: James Valleroy
Date: Sun, 3 Nov 2013 21:55:06 +0000
Subject: [PATCH] Use bcrypt to hash passwords for new users in firstboot and
user_add forms. Removed references to md5 hashing which was already
non-functional.
---
modules/installed/first_boot.py | 10 ++++------
modules/installed/system/users.py | 32 ++++++++++++++++++-------------
2 files changed, 23 insertions(+), 19 deletions(-)
diff --git a/modules/installed/first_boot.py b/modules/installed/first_boot.py
index e2fcd736b..8c166c742 100644
--- a/modules/installed/first_boot.py
+++ b/modules/installed/first_boot.py
@@ -9,7 +9,7 @@ from withsqlite.withsqlite import sqlite_db
import cfg
import config
from model import User
-import md5
+from passlib.hash import bcrypt
class FirstBoot(PagePlugin):
def __init__(self, *args, **kwargs):
@@ -65,16 +65,14 @@ class FirstBoot(PagePlugin):
box_key = self.generate_box_key()
db['box_key'] = box_key
if username and password:
- # FIXME: MD5 as a password hash? REALLY?! NOOO!!!
- passphrase = md5.new()
- passphrase.update(password)
-
+ pass_hash = bcrypt.encrypt(password)
di = {
'username':username,
'name': 'First user - please change',
'expert': 'on',
"groups": ["expert"],
- 'passphrase': passphrase.digest(),
+ 'passphrase':pass_hash,
+ 'salt':pass_hash[7:29], # for bcrypt
}
new_user = User(di)
cfg.users.set(username,new_user)
diff --git a/modules/installed/system/users.py b/modules/installed/system/users.py
index 23e2470cd..53bf71192 100644
--- a/modules/installed/system/users.py
+++ b/modules/installed/system/users.py
@@ -6,6 +6,7 @@ import cfg
from forms import Form
from util import *
from model import User
+from passlib.hash import bcrypt
class users(PagePlugin):
order = 20 # order of running init in PagePlugins
@@ -32,30 +33,35 @@ class add(FormPlugin, PagePlugin):
don't worry about it.
""")
def main(self, username='', name='', email='', message=None, *args, **kwargs):
- form = Form(title="Add User",
- action=cfg.server_dir + "/sys/users/add/index",
- onsubmit="return md5ify('add_user_form', 'password')",
+ form = Form(title="Add User",
+ action=cfg.server_dir + "/sys/users/add/index",
name="add_user_form",
message=message)
form.text_input(_("Username"), name="username", value=username)
form.text_input(_("Full name"), name="name", value=name)
form.text_input(_("Email"), name="email", value=email)
form.text_input(_("Password"), name="password", type="password")
- form.text_input(name="md5_password", type="hidden")
form.submit(label=_("Create User"), name="create")
return form.render()
- def process_form(self, username=None, name=None, email=None, md5_password=None, **kwargs):
+ def process_form(self, username=None, name=None, email=None, password=None, **kwargs):
msg = Message()
if not username: msg.add = _("Must specify a username!")
- if not md5_password: msg.add = _("Must specify a password!")
-
+ if not password: msg.add = _("Must specify a password!")
+
if username in cfg.users.get_all():
msg.add = _("User already exists!")
else:
try:
- di = {'username':username, 'name':name, 'email':email, 'passphrase':md5_password}
+ pass_hash = bcrypt.encrypt(password)
+ di = {
+ 'username':username,
+ 'name':name,
+ 'email':email,
+ 'passphrase':pass_hash,
+ 'salt': pass_hash[7:29], # for bcrypt
+ }
new_user = User(di)
cfg.users.set(username,new_user)
except:
@@ -70,7 +76,7 @@ class add(FormPlugin, PagePlugin):
class edit(FormPlugin, PagePlugin):
url = ["/sys/users/edit"]
order = 35
-
+
sidebar_left = ''
sidebar_right = _("""Edit UsersClick on a user's name to
go to a screen for editing that user's account.
Delete
@@ -84,9 +90,9 @@ class edit(FormPlugin, PagePlugin):
add_form.html('Delete
')
for uname in users:
user = User(uname[1])
- add_form.html(' %s ' %
+ add_form.html(' %s ' %
add_form.get_checkbox(name=user['username']) +
- '%s (%s)
' %
+ '%s (%s)
' %
(user['username'], user['name'], user['username']))
add_form.submit(label=_("Delete User"), name="delete")
return add_form.render()
@@ -123,9 +129,9 @@ class edit(FormPlugin, PagePlugin):
u = cfg.users[kwargs['username']]
if not u:
main = _("Could not find a user with username of %s!
" % kwargs['username'])
- return self.fill_template(template="err", title=_("Unnown User"), main=main,
+ return self.fill_template(template="err", title=_("Unnown User"), main=main,
sidebar_left=self.sidebar_left, sidebar_right=sidebar_right)
-
+
main = _("""Edit User '%s'""" % u['username'])
sidebar_right = ''
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=sidebar_right)