Skip to content

Commit

Permalink
Upgraded PasswordSetting and fixed the tests
Browse files Browse the repository at this point in the history
  • Loading branch information
pinae committed Feb 5, 2016
1 parent 70513f9 commit 84c86c0
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 108 deletions.
28 changes: 16 additions & 12 deletions password_setting.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ def get_full_template(self):
if complexity >= 0:
return str(complexity) + ";" + self.get_template()
else:
return ""
return self.get_template()

def calculate_template(self, use_lower_case=None, use_upper_case=None, use_digits=None, use_extra=None):
"""
Expand Down Expand Up @@ -473,28 +473,29 @@ def get_template(self):
"""
return self.template

def set_full_template(self, full_template):
def set_template(self, full_template):
"""
Sets a template from a complete template string with digit and semicolon. This also preferences the template
so other settings might get ignored.
:param full_template: complete template string
:type full_template: str
"""
matches = re.compile("([0123456]);([aAnox]+)").match(full_template)
if matches and len(matches.groups()) >= 2:
self.set_complexity(int(matches.group(1)))
self.template = matches.group(2)
matches = re.compile("(([01234567]);)?([aAnox]+)").match(full_template)
if matches and len(matches.groups()) >= 3:
if matches.group(2):
self.set_complexity(int(matches.group(2)))
self.template = matches.group(3)

def set_complexity(self, complexity):
"""
Sets the complexity by activating the appropriate character groups.
:param complexity: 0, 1, 2, 3, 4, 5 or 6
:param complexity: 0, 1, 2, 3, 4, 5, 6 or 7
:type complexity: int
"""
if not 0 <= complexity <= 6:
ValueError("The complexity must be in the range 0 to 6.")
if not 0 <= complexity <= 7:
ValueError("The complexity must be in the range 0 to 7.")

def get_complexity(self):
"""
Expand Down Expand Up @@ -525,6 +526,9 @@ def get_complexity(self):
elif 'n' in self.get_template() and 'a' in self.get_template() and \
'A' in self.get_template() and 'o' in self.get_template():
return 6
elif 'n' not in self.get_template() and 'a' not in self.get_template() and \
'A' not in self.get_template() and 'o' in self.get_template():
return 7
else:
return -1

Expand Down Expand Up @@ -568,7 +572,7 @@ def to_dict(self):
domain_object["cDate"] = self.get_creation_date()
domain_object["mDate"] = self.get_modification_date()
domain_object["extras"] = self.get_extra_character_set()
domain_object["passwordTemplate"] = self.get_full_template()
domain_object["passwordTemplate"] = self.get_template()
return domain_object

def load_from_dict(self, loaded_setting):
Expand Down Expand Up @@ -597,7 +601,7 @@ def load_from_dict(self, loaded_setting):
if "extras" in loaded_setting:
self.set_extra_character_set(loaded_setting["extras"])
if "passwordTemplate" in loaded_setting:
self.set_full_template(loaded_setting["passwordTemplate"])
self.set_template(loaded_setting["passwordTemplate"])
if "length" in loaded_setting and "usedCharacters" in loaded_setting and \
"passwordTemplate" not in loaded_setting:
self.template = "o"*int(loaded_setting["length"])
Expand All @@ -620,7 +624,7 @@ def ask_for_input(self):
length = self.get_length()
except ValueError:
length = self.get_length()
self.set_full_template("6;" + "x"*length)
self.set_template("6;" + "x"*length)
self.calculate_template(True, True, True, True)
iterations_str = input('Iterationszahl [' + str(self.get_iterations()) + ']: ')
try:
Expand Down
8 changes: 4 additions & 4 deletions tests/test_PasswordGenerator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class TestCtSesam(unittest.TestCase):
def test_default(self):
setting = PasswordSetting('some.domain')
setting.set_salt('pepper'.encode('utf-8'))
setting.set_full_template("5;xaxnxxAoxx")
setting.set_template("xaxnxxAoxx")
manager = CtSesam(domain=setting.get_domain(), username=setting.get_username(), kgk='foo'.encode('utf-8'))
self.assertEqual("]ew26XW.X<", manager.generate(setting))

Expand All @@ -20,20 +20,20 @@ def test_custom_character_set(self):
setting.set_salt('pepper'.encode('utf-8'))
setting.set_extra_character_set(
'abcdefghijklmnopqrstuvwxyzABCDUFGHJKLMNPQRTEVWXYZ0123456789#!"§$%&/()[]{}=-_+*<>;:.')
setting.set_full_template("6;oxxxxxxxxx")
setting.set_template("oxxxxxxxxx")
manager = CtSesam(domain=setting.get_domain(), username=setting.get_username(), kgk='foo'.encode('utf-8'))
self.assertEqual("5#%KiEvUU7", manager.generate(setting))

def test_custom_salt(self):
setting = PasswordSetting('some.domain')
setting.set_salt(b'qanisaoerna56745678eornsiarteonstiaroenstiaeroh')
setting.set_full_template("6;oxAxxaxxnx")
setting.set_template("oxAxxaxxnx")
manager = CtSesam(domain=setting.get_domain(), username=setting.get_username(), kgk='foo'.encode('utf-8'))
self.assertEqual(")hN8ol<;6<", manager.generate(setting))

def test_long(self):
setting = PasswordSetting('some.domain')
setting.set_salt('pepper'.encode('utf-8'))
setting.set_full_template("5;Aanoxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
setting.set_template("Aanoxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
manager = CtSesam(domain=setting.get_domain(), username=setting.get_username(), kgk='foo'.encode('utf-8'))
self.assertEqual("Ba0=}#K.X<$/eS0AuGjRm>(\"dnDnvZCx", manager.generate(setting))
93 changes: 25 additions & 68 deletions tests/test_PasswordSetting.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,35 +22,33 @@ def test_legacy_password(self):

def test_character_set(self):
s = PasswordSetting("unit.test")
self.assertFalse(s.use_custom_character_set())
self.assertEqual("abcdefghijklmnopqrstuvwxyz" +
self.assertEqual("0123456789" +
"abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"0123456789" +
"#!\"§$%&/()[]{}=-_+*<>;:.", s.get_character_set())
s.set_custom_character_set("&=Oo0wWsS$#uUvVzZ")
self.assertTrue(s.use_custom_character_set())
s.set_extra_character_set("&=Oo0wWsS$#uUvVzZ")
s.set_template("oxxxxxxxxx")
self.assertEqual("&=Oo0wWsS$#uUvVzZ", s.get_character_set())
s.set_custom_character_set(
s.set_extra_character_set(
"abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"0123456789" +
"#!\"§$%&/()[]{}=-_+*<>;:.")
self.assertFalse(s.use_custom_character_set())
self.assertEqual("abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"0123456789" +
"#!\"§$%&/()[]{}=-_+*<>;:.", s.get_character_set())
s.set_use_letters(False)
s.set_template("noxxxxxxxx")
s.set_extra_character_set("#!\"§$%&/()[]{}=-_+*<>;:.")
self.assertEqual("0123456789#!\"§$%&/()[]{}=-_+*<>;:.", s.get_character_set())
s.set_use_letters(True)
s.set_use_digits(False)
s.set_use_extra(False)
s.set_template("xaxxxAxxx")
self.assertEqual("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", s.get_character_set())

def test_get_character_set(self):
s = PasswordSetting("unit.test")
self.assertEqual("c", s.get_character_set()[2])
s.set_custom_character_set("axFLp0")
self.assertEqual("c", s.get_character_set()[12])
s.set_extra_character_set("axFLp0")
s.set_template("xox")
self.assertEqual(6, len(s.get_character_set()))
self.assertEqual("F", s.get_character_set()[2])
self.assertEqual("0", s.get_character_set()[5])
Expand Down Expand Up @@ -90,8 +88,8 @@ def test_to_json(self):
s.set_creation_date("2001-01-01T02:14:12")
s.set_salt("something".encode('utf-8'))
s.set_iterations(213)
s.set_length(14)
s.set_custom_character_set("XVLCWKHGFQUIAEOSNRTDYÜÖÄPZBMJ")
s.set_template("xxxxxxxxxxoxxx")
s.set_extra_character_set("XVLCWKHGFQUIAEOSNRTDYÜÖÄPZBMJ")
s.set_notes("Some note.")
self.assertIn("domain", s.to_dict())
self.assertEqual("unit.test", s.to_dict()["domain"])
Expand All @@ -103,82 +101,41 @@ def test_to_json(self):
self.assertEqual(str(b64encode("something".encode('utf-8')), encoding='utf-8'), s.to_dict()["salt"])
self.assertIn("iterations", s.to_dict())
self.assertEqual(213, s.to_dict()["iterations"])
self.assertIn("length", s.to_dict())
self.assertEqual(14, s.to_dict()["length"])
self.assertIn("usedCharacters", s.to_dict())
self.assertEqual("XVLCWKHGFQUIAEOSNRTDYÜÖÄPZBMJ", s.to_dict()["usedCharacters"])
self.assertIn("passwordTemplate", s.to_dict())
self.assertEqual("xxxxxxxxxxoxxx", s.to_dict()["passwordTemplate"])
self.assertIn("extras", s.to_dict())
self.assertEqual("XVLCWKHGFQUIAEOSNRTDYÜÖÄPZBMJ", s.to_dict()["extras"])
self.assertIn("notes", s.to_dict())
self.assertEqual("Some note.", s.to_dict()["notes"])

def test_load_from_json(self):
json_str = "{\"domain\": \"unit.test\", \"username\": \"testilinius\", " +\
"\"notes\": \"interesting note\", \"legacyPassword\": \"rtSr?bS,mi\", " +\
"\"usedCharacters\": \"AEIOUaeiou\", \"iterations\": 5341, " +\
"\"length\": 16, \"salt\": \"ZmFzY2luYXRpbmc=\", " +\
"\"extras\": \"AEIOUaeiou\", \"iterations\": 5341, " +\
"\"passwordTemplate\": \"7;xxxxoxxxxxxxxxxx\", \"salt\": \"ZmFzY2luYXRpbmc=\", " +\
"\"cDate\": \"2001-01-01T02:14:12\", \"mDate\": \"2005-01-01T01:14:12\"}"
s = PasswordSetting(json.loads(json_str)["domain"])
s.load_from_dict(json.loads(json_str))
self.assertEquals("unit.test", s.get_domain())
self.assertEquals("testilinius", s.get_username())
self.assertEquals("interesting note", s.get_notes())
self.assertEquals("rtSr?bS,mi", s.get_legacy_password())
self.assertFalse(s.use_lower_case())
self.assertFalse(s.use_upper_case())
self.assertFalse(s.use_digits())
self.assertFalse(s.use_extra())
self.assertTrue(s.use_custom_character_set())
self.assertEquals("AEIOUaeiou", s.get_character_set())
self.assertEquals(5341, s.get_iterations())
self.assertEquals(16, s.get_length())
self.assertEquals("xxxxoxxxxxxxxxxx", s.get_template())
expected_salt = "fascinating".encode('utf-8')
self.assertEqual(len(expected_salt), len(s.get_salt()))
for i in range(len(expected_salt)):
self.assertEqual(expected_salt[i], s.get_salt()[i])
self.assertEquals("2001-01-01T02:14:12", s.get_creation_date())
self.assertEquals("2005-01-01T01:14:12", s.get_modification_date())

def test_set_use_digits(self):
s = PasswordSetting("unit.test")
s.set_custom_character_set("abE;c2")
s.set_use_digits(False)
self.assertEqual("abcE;", s.get_character_set())
s.set_custom_character_set("aL;^bc2")
s.set_use_digits(True)
self.assertEqual("abcL0123456789;^", s.get_character_set())

def test_set_use_lower_case(self):
s = PasswordSetting("unit.test")
s.set_custom_character_set("Eabc2")
s.set_use_lower_case(False)
self.assertEqual("E2", s.get_character_set())
s.set_custom_character_set("Eabc2")
s.set_use_lower_case(True)
self.assertEqual("abcdefghijklmnopqrstuvwxyzE2", s.get_character_set())

def test_set_use_upper_case(self):
s = PasswordSetting("unit.test")
s.set_custom_character_set("Eab2c3")
s.set_use_upper_case(False)
self.assertEqual("abc23", s.get_character_set())
s.set_custom_character_set("Eab2c3")
s.set_use_upper_case(True)
self.assertEqual("abcABCDEFGHIJKLMNOPQRSTUVWXYZ23", s.get_character_set())

def test_set_use_extra(self):
s = PasswordSetting("unit.test")
s.set_custom_character_set("Eab;^2c3")
s.set_use_extra(False)
self.assertEqual("abcE23", s.get_character_set())
s.set_custom_character_set("Eab;^2c3")
s.set_use_extra(True)
self.assertEqual("abcE23#!\"§$%&/()[]{}=-_+*<>;:.^", s.get_character_set())

def test_change_length(self):
def test_get_template(self):
s = PasswordSetting("unit.test")
s.set_full_template("1;xxxaxxxxxxx")
self.assertEqual(11, s.get_length())
s.set_length(16)
self.assertEqual(16, s.get_length())
s.set_template("xxxaxxxxxxx")
self.assertEqual("xxxaxxxxxxx", s.get_template())
s.set_template("6;xxxxxxoxxxnAxxxa")
self.assertEqual("xxxxxxoxxxnAxxxa", s.get_template())
self.assertEqual(16, len(s.get_template()))


Expand Down

0 comments on commit 84c86c0

Please sign in to comment.