Unit tests and password validation code
* provide nose based unit test infrastructure (fixes #20) * create unit tests for gnuviechadmin.util.passwordutils * add password validation function to gnuviechadmin.util.passwordutils (fixes #19) * make new files PEP8 clean (addresses #18) git-svn-id: file:///home/www/usr01/svn/gnuviechadmin/trunk@258 a67ec6bc-e5d5-0310-a910-815c51eb3124
This commit is contained in:
		
							parent
							
								
									09180938f1
								
							
						
					
					
						commit
						065996e0df
					
				
					 5 changed files with 156 additions and 18 deletions
				
			
		
							
								
								
									
										42
									
								
								gnuviechadmin/tests/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								gnuviechadmin/tests/__init__.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # Copyright (C) 2008 by Jan Dittberner. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation; either version 2 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, but | ||||
| # WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| # General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||||
| # USA. | ||||
| # | ||||
| # Version: $Id$ | ||||
| """Gnuviechadmin application test package | ||||
| 
 | ||||
| When the test runner finds and executes test within this directory, | ||||
| this file will be loaded to setup the test environment. | ||||
| 
 | ||||
| It registers the root directory of the project in sys.path and | ||||
| pkg_resources, in case the project hasn't been installed with | ||||
| setuptools. | ||||
| """ | ||||
| import os | ||||
| import sys | ||||
| from unittest import TestCase | ||||
| 
 | ||||
| import pkg_resources | ||||
| 
 | ||||
| here_dir = os.path.dirname(os.path.abspath(__file__)) | ||||
| conf_dir = os.path.dirname(os.path.dirname(here_dir)) | ||||
| 
 | ||||
| sys.path.insert(0, conf_dir) | ||||
| pkg_resources.working_set.add_entry(conf_dir) | ||||
| 
 | ||||
| test_file = os.path.join(conf_dir, 'test.ini') | ||||
							
								
								
									
										23
									
								
								gnuviechadmin/tests/functional/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								gnuviechadmin/tests/functional/__init__.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # Copyright (C) 2007, 2008 by Jan Dittberner. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation; either version 2 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, but | ||||
| # WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| # General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||||
| # USA. | ||||
| # | ||||
| # Version: $Id$ | ||||
| """This package provides functional unit tests for gnuviechadmin. | ||||
| 
 | ||||
| """ | ||||
							
								
								
									
										72
									
								
								gnuviechadmin/tests/functional/test_util_passwordutils.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								gnuviechadmin/tests/functional/test_util_passwordutils.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| # Copyright (C) 2008 by Jan Dittberner. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation; either version 2 of the License, or | ||||
| # (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, but | ||||
| # WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
| # General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||||
| # USA. | ||||
| # | ||||
| # Version: $Id$ | ||||
| """Unit tests for gnuviechadmin.util.passwordutils. | ||||
| 
 | ||||
| """ | ||||
| from gnuviechadmin.util import passwordutils | ||||
| from unittest import TestCase | ||||
| import crypt | ||||
| 
 | ||||
| 
 | ||||
| class TestPasswordUtils(TestCase): | ||||
|     weakpw = "test" | ||||
|     strongpw = "Str0ng#l33tP4assword" | ||||
| 
 | ||||
|     def test_generatepassword(self): | ||||
|         password = passwordutils.generatepassword() | ||||
|         self.assert_(password is not None) | ||||
| 
 | ||||
|     def test_checkpassword(self): | ||||
|         weakcheck = passwordutils.checkpassword(self.weakpw) | ||||
|         self.assertEqual(weakcheck, None, | ||||
|                      "checking a weak password should return ''None''." + \ | ||||
|                              "%s was returned." % weakcheck) | ||||
|         strongcheck = passwordutils.checkpassword(self.strongpw) | ||||
|         self.assertEqual(self.strongpw, strongcheck, | ||||
|                          'checking a strong password should return the ' + \ | ||||
|                              ' the password. %s was returned.' % strongcheck) | ||||
| 
 | ||||
|     def test_md5_crypt_password(self): | ||||
|         encrypted = passwordutils.md5_crypt_password(self.strongpw) | ||||
|         self.assertNotEqual(self.strongpw, encrypted) | ||||
|         self.assertEqual(encrypted, crypt.crypt(self.strongpw, encrypted)) | ||||
| 
 | ||||
|     def test_get_pw_tuple(self): | ||||
| 
 | ||||
|         def check_tuple(pwtuple): | ||||
|             self.assertEqual(len(pwtuple), 2) | ||||
|             self.assertNotEqual(pwtuple[0], None) | ||||
|             self.assert_(len(pwtuple[0]) >= 8) | ||||
|             self.assertEqual(pwtuple[1], crypt.crypt(pwtuple[0], pwtuple[1])) | ||||
|         check_tuple(passwordutils.get_pw_tuple()) | ||||
|         weakpwtuple = passwordutils.get_pw_tuple(self.weakpw) | ||||
|         check_tuple(weakpwtuple) | ||||
|         self.assertNotEqual(self.weakpw, weakpwtuple[0]) | ||||
|         strongpwtuple = passwordutils.get_pw_tuple(self.strongpw) | ||||
|         check_tuple(strongpwtuple) | ||||
|         self.assertEqual(self.strongpw, strongpwtuple[0]) | ||||
| 
 | ||||
|     def test_validate_password(self): | ||||
|         hashed = passwordutils.md5_crypt_password(self.strongpw) | ||||
|         self.assertEqual(passwordutils.validate_password(hashed, | ||||
|                                                          self.strongpw), True) | ||||
|         self.assertEqual(passwordutils.validate_password(self.weakpw, | ||||
|                                                          self.strongpw), False) | ||||
|  | @ -23,6 +23,9 @@ | |||
| import crypt | ||||
| import crack | ||||
| import random | ||||
| import logging | ||||
| 
 | ||||
| log = logging.getLogger(__name__) | ||||
| 
 | ||||
| _pwchars = [] | ||||
| for _pair in (('0', '9'), ('A', 'Z'), ('a', 'z')): | ||||
|  | @ -59,7 +62,7 @@ def checkpassword(password): | |||
|     try: | ||||
|         return crack.VeryFascistCheck(password) | ||||
|     except ValueError, ve: | ||||
|         print "Weak password:", ve | ||||
|         log.info("Weak password: %s", ve) | ||||
|     return None | ||||
| 
 | ||||
| 
 | ||||
|  | @ -89,4 +92,8 @@ def get_pw_tuple(password = None): | |||
|     return (password, md5_crypt_password(password)) | ||||
| 
 | ||||
| 
 | ||||
| # TODO: implement a is_password_valid(hash, password) function | ||||
| def validate_password(hash, password): | ||||
|     """Validates whether the given clear text password matches the | ||||
|     given hash value. | ||||
|     """ | ||||
|     return hash == crypt.crypt(password, hash) | ||||
|  |  | |||
							
								
								
									
										26
									
								
								setup.py
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								setup.py
									
										
									
									
									
								
							|  | @ -24,26 +24,20 @@ from setuptools import setup, find_packages | |||
| setup( | ||||
|     name = 'gnuviechadmin', | ||||
|     version = '0.1', | ||||
|     packages = find_packages(), | ||||
|     scripts = ['bin/gva'], | ||||
| 
 | ||||
|     install_requires = ['sqlalchemy >= 0.4', | ||||
|                         'sqlalchemy-migrate >= 0.4', | ||||
| #                        'pyme >= 0.7', | ||||
| #                        'python-crack >= 0.5' | ||||
|                         ], | ||||
|     setup_requires = [], | ||||
| 
 | ||||
|     include_package_data = True, | ||||
|     exclude_package_data = {'': ['gva.cfg']}, | ||||
| 
 | ||||
|     description = 'gnuviechadmin server administration suite', | ||||
|     author = 'Jan Dittberner', | ||||
|     author_email = 'jan@dittberner.info', | ||||
|     description = 'gnuviechadmin server administration suite', | ||||
|     url = 'http://www.gnuviech-server.de/projects/gnuviechadmin', | ||||
|     install_requires = ['SQLAlchemy>=0.4', 'sqlalchemy-migrate>=0.4', | ||||
|                         'AuthKit>=0.4'], | ||||
|     packages = find_packages(), | ||||
|     include_package_data = True, | ||||
|     exclude_package_data = {'': ['gva.cfg']}, | ||||
|     test_suite='nose.collector', | ||||
|     scripts = ['bin/gva', 'bin/gvaserver'], | ||||
|     long_description = """this is a suite of tools for administering a server | ||||
| it contains tools for maintaining e.g. clients, domains, users, mail | ||||
| accounts""", | ||||
|     license = 'GPL', | ||||
|     keywords = 'administration backend frontend', | ||||
|     url = 'http://www.gnuviech-server.de/projects/gnuviechadmin', | ||||
|     ) | ||||
| ) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue