* Add or_filters filter for export_fixtures, to filter by doctype or fieldnames
Eg:
fixtures = [
{
"doctype": "Custom Field",
"or_filters": {
"dt": ["in", [
"Process Payroll",
"Journal Entry Account"
]],
"name": ["in", [
"Print Settings-compact_item_print",
"Account-account_id",
"Account-some_bank_name"
]]
}
}
]
* Passsword Policy Enhancement
In Security Settings, the Password Plociy can be enabled and the passcord strength score can be set.
User will see helpful password validation messages when they change password.
* Enhance Update Password to handle Password Policy
* remove function argument
* update test cases to use strong password
* Add test cases, add default value for minimum password score, make error messages translatable
* make message translatable
* Update update-password.html
99 lines
3.2 KiB
Python
99 lines
3.2 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# MIT License. See license.txt
|
|
from __future__ import unicode_literals
|
|
import frappe
|
|
import unittest
|
|
from frappe.utils.password import update_password, check_password
|
|
|
|
class TestPassword(unittest.TestCase):
|
|
def setUp(self):
|
|
frappe.delete_doc('Email Account', 'Test Email Account Password')
|
|
frappe.delete_doc('Email Account', 'Test Email Account Password-new')
|
|
|
|
def test_encrypted_password(self):
|
|
doc = self.make_email_account()
|
|
|
|
new_password = 'test-password'
|
|
doc.password = new_password
|
|
doc.save()
|
|
|
|
self.assertEquals(doc.password, '*'*len(new_password))
|
|
|
|
auth_password = frappe.db.sql('''select `password` from `__Auth`
|
|
where doctype=%(doctype)s and name=%(name)s and fieldname="password"''', doc.as_dict())[0][0]
|
|
|
|
# encrypted
|
|
self.assertTrue(auth_password != new_password)
|
|
|
|
# decrypted
|
|
self.assertEquals(doc.get_password(), new_password)
|
|
|
|
return doc, new_password
|
|
|
|
def make_email_account(self, name='Test Email Account Password'):
|
|
if not frappe.db.exists('Email Account', name):
|
|
return frappe.get_doc({
|
|
'doctype': 'Email Account',
|
|
'domain': 'example.com',
|
|
'email_account_name': name,
|
|
'append_to': 'Communication',
|
|
'smtp_server': 'test.example.com',
|
|
'pop3_server': 'pop.test.example.com',
|
|
'email_id': 'test-password@example.com',
|
|
'password': 'password',
|
|
}).insert()
|
|
|
|
else:
|
|
return frappe.get_doc('Email Account', name)
|
|
|
|
def test_hashed_password(self, user='test@example.com'):
|
|
old_password = 'Eastern_43A1W'
|
|
new_password = 'Eastern_43A1W-new'
|
|
|
|
update_password(user, new_password)
|
|
|
|
auth = frappe.db.sql('''select `password`, `salt` from `__Auth`
|
|
where doctype='User' and name=%s and fieldname="password"''', user, as_dict=True)[0]
|
|
|
|
self.assertTrue(auth.password != new_password)
|
|
self.assertTrue(auth.salt)
|
|
|
|
# stored password = password(plain_text_password + salt)
|
|
self.assertEquals(frappe.db.sql('select password(concat(%s, %s))', (new_password, auth.salt))[0][0], auth.password)
|
|
|
|
self.assertTrue(check_password(user, new_password))
|
|
|
|
# revert back to old
|
|
update_password(user, old_password)
|
|
self.assertTrue(check_password(user, old_password))
|
|
|
|
# shouldn't work with old password
|
|
self.assertRaises(frappe.AuthenticationError, check_password, user, new_password)
|
|
|
|
def test_password_on_rename_user(self):
|
|
password = 'test-rename-password'
|
|
|
|
doc = self.make_email_account()
|
|
doc.password = password
|
|
doc.save()
|
|
|
|
old_name = doc.name
|
|
new_name = old_name + '-new'
|
|
frappe.rename_doc(doc.doctype, old_name, new_name)
|
|
|
|
new_doc = frappe.get_doc(doc.doctype, new_name)
|
|
self.assertEquals(new_doc.get_password(), password)
|
|
self.assertTrue(not frappe.db.sql('''select `password` from `__Auth`
|
|
where doctype=%s and name=%s and fieldname="password"''', (doc.doctype, doc.name)))
|
|
|
|
frappe.rename_doc(doc.doctype, new_name, old_name)
|
|
self.assertTrue(frappe.db.sql('''select `password` from `__Auth`
|
|
where doctype=%s and name=%s and fieldname="password"''', (doc.doctype, doc.name)))
|
|
|
|
def test_password_on_delete(self):
|
|
doc = self.make_email_account()
|
|
doc.delete()
|
|
|
|
self.assertTrue(not frappe.db.sql('''select `password` from `__Auth`
|
|
where doctype=%s and name=%s and fieldname="password"''', (doc.doctype, doc.name)))
|
|
|