php-text-password-1.1.1/0000755000175000017500000000000011314615503013624 5ustar zigozigophp-text-password-1.1.1/Text_Password-1.1.1/0000755000175000017500000000000011314615475017076 5ustar zigozigophp-text-password-1.1.1/Text_Password-1.1.1/tests/0000755000175000017500000000000011314615475020240 5ustar zigozigophp-text-password-1.1.1/Text_Password-1.1.1/tests/Text_Password_Test.php0000644000175000017500000001334711314615475024566 0ustar zigozigo * @extends PHPUnit_TestCase * @version $Id: Text_Password_Test.php,v 1.2 2004/10/31 22:40:50 mj Exp $ */ class Text_Password_Test extends PHPUnit_TestCase { function testCreate() { $password = Text_Password::create(); $this->assertTrue(strlen($password) == 10); } function testCreateWithLength() { $password = Text_Password::create(15); $this->assertTrue(strlen($password) == 15); } function testCreateMultiple() { $passwords = Text_Password::createMultiple(3); $this->_testCreateMultiple($passwords, 3, 10); } function testCreateMultipleWithLength() { $passwords = Text_Password::createMultiple(3, 15); $this->_testCreateMultiple($passwords, 3, 15); } function testCreateNumericWithLength() { $password = Text_Password::create(8, 'unpronounceable', 'numeric'); $this->assertRegExp("/^[0-9]{8}$/", $password); } function testCreateFromABCWithLength() { $password = Text_Password::create(8, 'unpronounceable', 'a,b,c'); $this->assertRegExp("/^[abc]{8}$/i", $password); } function testCreateAlphabeticWithLength() { $password = Text_Password::create(8, 'unpronounceable', 'alphabetic'); $this->assertRegExp("/^[a-z]{8}$/i", $password); } function testTimeToBruteForce() { $password = Text_Password::create(5, 'unpronounceable'); $result = $this->_TimeToBruteForce($pass); $this->assertTrue($result['combination'] == 1); $this->assertTrue($result['max'] == 0.00025); $this->assertTrue($result['min'] == 0.000125); } // {{{ Test cases for creating passwords based on a given login string function testCreateFromLoginReverse() { $this->assertEquals("eoj", Text_Password::createFromLogin("joe", "reverse")); } function testCreateFromLoginShuffle() { $this->assertTrue(strlen(Text_Password::createFromLogin("hello world", "shuffle")) == strlen("hello world")); } function testCreateFromLoginRotX() { $this->assertEquals("tyo", Text_Password::createFromLogin("joe", "rotx", 10)); } function testCreateFromLoginRot13() { $this->assertEquals("wbr", Text_Password::createFromLogin("joe", "rot13")); } function testCreateFromLoginRotXplusplus() { $this->assertEquals("syp", Text_Password::createFromLogin("joe", "rotx++", 9)); } function testCreateFromLoginRotXminusminus() { $this->assertEquals("swl", Text_Password::createFromLogin("joe", "rotx--", 9)); } function testCreateFromLoginXOR() { $this->assertEquals("oj`", Text_Password::createFromLogin("joe", "xor", 5)); } function testCreateFromLoginASCIIRotX() { $this->assertEquals("otj", Text_Password::createFromLogin("joe", "ascii_rotx", 5)); } function testCreateFromLoginASCIIRotXplusplus() { $this->assertEquals("oul", Text_Password::createFromLogin("joe", "ascii_rotx++", 5)); } function testCreateFromLoginASCIIRotXminusminus() { $this->assertEquals("uyn", Text_Password::createFromLogin("joe", "ascii_rotx--", 11)); } /** * Unit test for bug #2605 * * Actually this method does not implement a real unit test, but * instead it is there to make sure that no warning is produced * by PHP. * * @link http://pear.php.net/bugs/bug.php?id=2605 */ function testBugReport2605() { $password = Text_Password::create(7, 'unpronounceable', '1,3,a,Q,~,[,f'); $this->assertTrue(strlen($password) == 7); } // }}} // {{{ private helper methods function _testCreateMultiple($passwords, $count, $length) { $this->assertType("array", $passwords); $this->assertTrue(count($passwords) == $count); foreach ($passwords as $password) { $this->assertTrue(strlen($password) == $length); } } function _timeToBruteForce($password, $nbr = 0, $cmbPerSeconde = 4000) { global $_Text_Password_NumberOfPossibleCharacters; $nbr = ($nbr == 0) ? $_Text_Password_NumberOfPossibleCharacters : $nbr; $cmb = pow($nbr, strlen($password)); $time_max = $cmb / $cmbPerSeconde; $time_min = ($cmb / $cmbPerSeconde) / 2; return array("combination" => $cmb, "max" => $time_max, "min" => $time_min); } // }}} } $suite = new PHPUnit_TestSuite('Text_Password_Test'); $result = PHPUnit::run($suite); echo $result->toString(); php-text-password-1.1.1/Text_Password-1.1.1/Password.php0000644000175000017500000003411211314615475021412 0ustar zigozigo * @author Olivier Vanhoucke * @copyright 2004-2005 Martin Jansen, Olivier Vanhoucke * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version CVS: $Id: Password.php,v 1.18 2008/11/30 13:38:56 mj Exp $ * @link http://pear.php.net/package/Text_Password */ /** * Number of possible characters in the password */ $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = 0; /** * Main class for the Text_Password package * * @category Text * @package Text_Password * @author Martin Jansen * @author Olivier Vanhoucke * @copyright 2004-2005 Martin Jansen, Olivier Vanhoucke * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version Release: @package_version@ * @link http://pear.php.net/package/Text_Password */ class Text_Password { /** * Create a single password. * * @access public * @param integer Length of the password. * @param string Type of password (pronounceable, unpronounceable) * @param string Character which could be use in the * unpronounceable password ex : 'ABCDEFG' * or numeric, alphabetical or alphanumeric. * @return string Returns the generated password. */ function create($length = 10, $type = 'pronounceable', $chars = '') { switch ($type) { case 'unpronounceable' : return Text_Password::_createUnpronounceable($length, $chars); case 'pronounceable' : default : return Text_Password::_createPronounceable($length); } } /** * Create multiple, different passwords * * Method to create a list of different passwords which are * all different. * * @access public * @param integer Number of different password * @param integer Length of the password * @param string Type of password (pronounceable, unpronounceable) * @param string Character which could be use in the * unpronounceable password ex : 'A,B,C,D,E,F,G' * or numeric, alphabetical or alphanumeric. * @return array Array containing the passwords */ function createMultiple($number, $length = 10, $type = 'pronounceable', $chars = '') { $passwords = array(); while ($number > 0) { while (true) { $password = Text_Password::create($length, $type, $chars); if (!in_array($password, $passwords)) { $passwords[] = $password; break; } } $number--; } return $passwords; } /** * Create password from login * * Method to create password from login * * @access public * @param string Login * @param string Type * @param integer Key * @return string */ function createFromLogin($login, $type, $key = 0) { switch ($type) { case 'reverse': return strrev($login); case 'shuffle': return Text_Password::_shuffle($login); case 'xor': return Text_Password::_xor($login, $key); case 'rot13': return str_rot13($login); case 'rotx': return Text_Password::_rotx($login, $key); case 'rotx++': return Text_Password::_rotxpp($login, $key); case 'rotx--': return Text_Password::_rotxmm($login, $key); case 'ascii_rotx': return Text_Password::_asciiRotx($login, $key); case 'ascii_rotx++': return Text_Password::_asciiRotxpp($login, $key); case 'ascii_rotx--': return Text_Password::_asciiRotxmm($login, $key); } } /** * Create multiple, different passwords from an array of login * * Method to create a list of different password from login * * @access public * @param array Login * @param string Type * @param integer Key * @return array Array containing the passwords */ function createMultipleFromLogin($login, $type, $key = 0) { $passwords = array(); $number = count($login); $save = $number; while ($number > 0) { while (true) { $password = Text_Password::createFromLogin($login[$save - $number], $type, $key); if (!in_array($password, $passwords)) { $passwords[] = $password; break; } } $number--; } return $passwords; } /** * Helper method to create password * * Method to create a password from a login * * @access private * @param string Login * @param integer Key * @return string */ function _xor($login, $key) { $tmp = ''; for ($i = 0; $i < strlen($login); $i++) { $next = ord($login{$i}) ^ $key; if ($next > 255) { $next -= 255; } elseif ($next < 0) { $next += 255; } $tmp .= chr($next); } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * lowercase only * * @access private * @param string Login * @param integer Key * @return string */ function _rotx($login, $key) { $tmp = ''; $login = strtolower($login); for ($i = 0; $i < strlen($login); $i++) { if ((ord($login{$i}) >= 97) && (ord($login{$i}) <= 122)) { // 65, 90 for uppercase $next = ord($login{$i}) + $key; if ($next > 122) { $next -= 26; } elseif ($next < 97) { $next += 26; } $tmp .= chr($next); } else { $tmp .= $login{$i}; } } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * lowercase only * * @access private * @param string Login * @param integer Key * @return string */ function _rotxpp($login, $key) { $tmp = ''; $login = strtolower($login); for ($i = 0; $i < strlen($login); $i++, $key++) { if ((ord($login{$i}) >= 97) && (ord($login{$i}) <= 122)) { // 65, 90 for uppercase $next = ord($login{$i}) + $key; if ($next > 122) { $next -= 26; } elseif ($next < 97) { $next += 26; } $tmp .= chr($next); } else { $tmp .= $login{$i}; } } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * lowercase only * * @access private * @param string Login * @param integer Key * @return string */ function _rotxmm($login, $key) { $tmp = ''; $login = strtolower($login); for ($i = 0; $i < strlen($login); $i++, $key--) { if ((ord($login{$i}) >= 97) && (ord($login{$i}) <= 122)) { // 65, 90 for uppercase $next = ord($login{$i}) + $key; if ($next > 122) { $next -= 26; } elseif ($next < 97) { $next += 26; } $tmp .= chr($next); } else { $tmp .= $login{$i}; } } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * * @access private * @param string Login * @param integer Key * @return string */ function _asciiRotx($login, $key) { $tmp = ''; for ($i = 0; $i < strlen($login); $i++) { $next = ord($login{$i}) + $key; if ($next > 255) { $next -= 255; } elseif ($next < 0) { $next += 255; } switch ($next) { // delete white space case 0x09: case 0x20: case 0x0A: case 0x0D: $next++; } $tmp .= chr($next); } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * * @access private * @param string Login * @param integer Key * @return string */ function _asciiRotxpp($login, $key) { $tmp = ''; for ($i = 0; $i < strlen($login); $i++, $key++) { $next = ord($login{$i}) + $key; if ($next > 255) { $next -= 255; } elseif ($next < 0) { $next += 255; } switch ($next) { // delete white space case 0x09: case 0x20: case 0x0A: case 0x0D: $next++; } $tmp .= chr($next); } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * * @access private * @param string Login * @param integer Key * @return string */ function _asciiRotxmm($login, $key) { $tmp = ''; for ($i = 0; $i < strlen($login); $i++, $key--) { $next = ord($login{$i}) + $key; if ($next > 255) { $next -= 255; } elseif ($next < 0) { $next += 255; } switch ($next) { // delete white space case 0x09: case 0x20: case 0x0A: case 0x0D: $next++; } $tmp .= chr($next); } return $tmp; } /** * Helper method to create password * * Method to create a password from a login * * @access private * @param string Login * @return string */ function _shuffle($login) { $tmp = array(); for ($i = 0; $i < strlen($login); $i++) { $tmp[] = $login{$i}; } shuffle($tmp); return implode($tmp, ''); } /** * Create pronounceable password * * This method creates a string that consists of * vowels and consonats. * * @access private * @param integer Length of the password * @return string Returns the password */ function _createPronounceable($length) { $retVal = ''; /** * List of vowels and vowel sounds */ $v = array('a', 'e', 'i', 'o', 'u', 'ae', 'ou', 'io', 'ea', 'ou', 'ia', 'ai' ); /** * List of consonants and consonant sounds */ $c = array('b', 'c', 'd', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'u', 'v', 'w', 'tr', 'cr', 'fr', 'dr', 'wr', 'pr', 'th', 'ch', 'ph', 'st', 'sl', 'cl' ); $v_count = 12; $c_count = 29; $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = $v_count + $c_count; for ($i = 0; $i < $length; $i++) { $retVal .= $c[mt_rand(0, $c_count-1)] . $v[mt_rand(0, $v_count-1)]; } return substr($retVal, 0, $length); } /** * Create unpronounceable password * * This method creates a random unpronounceable password * * @access private * @param integer Length of the password * @param string Character which could be use in the * unpronounceable password ex : 'ABCDEFG' * or numeric, alphabetical or alphanumeric. * @return string Returns the password */ function _createUnpronounceable($length, $chars) { $password = ''; /** * List of character which could be use in the password */ switch($chars) { case 'alphanumeric': $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = 62; break; case 'alphabetical': $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = 52; break; case 'numeric': $chars = '0123456789'; $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = 10; break; case '': $chars = '_#@%&ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = 67; break; default: /** * Some characters shouldn't be used */ $chars = trim($chars); $chars = str_replace(array('+', '|', '$', '^', '/', '\\', ','), '', $chars); $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] = strlen($chars); } /** * Generate password */ for ($i = 0; $i < $length; $i++) { $num = mt_rand(0, $GLOBALS['_Text_Password_NumberOfPossibleCharacters'] - 1); $password .= $chars{$num}; } /** * Return password */ return $password; } } ?> php-text-password-1.1.1/package.xml0000644000175000017500000000333611314615475015756 0ustar zigozigo Text_Password pear.php.net Creating passwords with PHP. Text_Password allows one to create pronounceable and unpronounceable passwords. The full functional range is explained in the manual at http://pear.php.net/manual/. Martin Jansen mj mj@php.net yes Olivier Vanhoucke olivier olivier@php.net yes 2008-11-30 1.1.1 1.1.1 stable stable PHP License * Fixed bug #12220: potential problems with global var use (Patch by Christian Weiske) 4.2.0 1.4.0b1