seitime-frappe/frappe/tests/test_password.py
schilgod 7ccbbce572 Password Strength Policy Enhancement (#3194)
* 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
2017-05-08 16:10:12 +05:30

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)))