 94929d8e66
			
		
	
	94929d8e66
	
	
	
		
			
			https://github.com/RainLoop/rainloop-webmail/tree/master/plugins/postfixadmin-change-password
		
			
				
	
	
		
			139 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| // md5crypt
 | |
| // Action: Creates MD5 encrypted password
 | |
| // Call: md5crypt (string cleartextpassword)
 | |
| 
 | |
| function md5crypt($pw, $salt = "", $magic = "")
 | |
| {
 | |
|     $MAGIC = "$1$";
 | |
| 
 | |
|     if ($magic == "")
 | |
| 	{
 | |
| 		$magic = $MAGIC;
 | |
| 	}
 | |
| 
 | |
|     if ($salt == "")
 | |
| 	{
 | |
| 		$salt = create_salt();
 | |
| 	}
 | |
| 
 | |
|     $slist = explode("$", $salt);
 | |
|     if (isset($slist[0]) && $slist[0] == "1")
 | |
| 	{
 | |
| 		$salt = $slist[1];
 | |
| 	}
 | |
| 
 | |
|     $salt = substr($salt, 0, 8);
 | |
|     $ctx = $pw.$magic.$salt;
 | |
|     $final = hex2bin(md5($pw.$salt.$pw));
 | |
| 
 | |
|     for ($i = strlen($pw); $i > 0; $i -= 16)
 | |
|     {
 | |
|         if ($i > 16)
 | |
|         {
 | |
|             $ctx .= substr($final,0,16);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             $ctx .= substr($final,0,$i);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     $i = strlen($pw);
 | |
| 
 | |
|     while ($i > 0)
 | |
|     {
 | |
|         if ($i & 1)
 | |
| 		{
 | |
| 			$ctx .= chr(0);
 | |
| 		}
 | |
|         else
 | |
| 		{
 | |
| 			$ctx .= $pw[0];
 | |
| 		}
 | |
| 		
 | |
|         $i = $i >> 1;
 | |
|     }
 | |
| 
 | |
|     $final = hex2bin(md5($ctx));
 | |
| 
 | |
|     for ($i=0; $i<1000; $i++)
 | |
|     {
 | |
|         $ctx1 = "";
 | |
|         if ($i & 1)
 | |
|         {
 | |
|             $ctx1 .= $pw;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             $ctx1 .= substr($final,0,16);
 | |
|         }
 | |
|         if ($i % 3)
 | |
| 		{
 | |
| 			$ctx1 .= $salt;
 | |
| 		}
 | |
|         if ($i % 7)
 | |
| 		{
 | |
| 			$ctx1 .= $pw;
 | |
| 		}
 | |
|         if ($i & 1)
 | |
|         {
 | |
|             $ctx1 .= substr($final, 0, 16);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             $ctx1 .= $pw;
 | |
|         }
 | |
| 
 | |
|         $final = hex2bin(md5($ctx1));
 | |
|     }
 | |
| 
 | |
|     $passwd = "";
 | |
|     $passwd .= to64(((ord($final[0]) << 16) | (ord($final[6]) << 8) | (ord($final[12]))), 4);
 | |
|     $passwd .= to64(((ord($final[1]) << 16) | (ord($final[7]) << 8) | (ord($final[13]))), 4);
 | |
|     $passwd .= to64(((ord($final[2]) << 16) | (ord($final[8]) << 8) | (ord($final[14]))), 4);
 | |
|     $passwd .= to64(((ord($final[3]) << 16) | (ord($final[9]) << 8) | (ord($final[15]))), 4);
 | |
|     $passwd .= to64(((ord($final[4]) << 16) | (ord($final[10]) << 8) | (ord($final[5]))), 4);
 | |
|     $passwd .= to64(ord($final[11]), 2);
 | |
| 
 | |
|     return $magic.$salt.'$'.$passwd;
 | |
| }
 | |
| 
 | |
| function create_salt()
 | |
| {
 | |
|     srand((double) microtime() * 1000000);
 | |
|     return substr(md5(rand(0,9999999)), 0, 8);
 | |
| }
 | |
| 
 | |
| // PHP around 5.3.8 includes hex2bin as native function - http://php.net/hex2bin
 | |
| if (!function_exists('hex2bin'))
 | |
| {
 | |
| 	function hex2bin($str)
 | |
| 	{
 | |
| 		$len = strlen($str);
 | |
| 		$nstr = "";
 | |
| 		for ($i = 0; $i < $len; $i += 2)
 | |
| 		{
 | |
| 			$num = sscanf(substr($str, $i, 2), "%x");
 | |
| 			$nstr .= chr($num[0]);
 | |
| 		}
 | |
| 
 | |
| 		return $nstr;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| function to64($v, $n)
 | |
| {
 | |
|     $ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 | |
|     $ret = "";
 | |
| 
 | |
|     while (($n - 1) >= 0)
 | |
|     {
 | |
|         $n--;
 | |
|         $ret .= $ITOA64[$v & 0x3f];
 | |
|         $v = $v >> 6;
 | |
|     }
 | |
| 
 | |
|     return $ret;
 | |
| } |