|  | @ -12,20 +12,29 @@ function lenUtf8(string $str): int { // get string length (Chinese -> 2) | 
			
		
	
		
		
			
				
					|  |  |     return strlen(iconv('utf-8', 'gb2312', $str)); |  |  |     return strlen(iconv('utf-8', 'gb2312', $str)); | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  | function isIPv4($ip): bool { |  |  | function isIPv4(string $ip): bool { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); |  |  |     return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  | function isIPv6($ip): bool { |  |  | function isIPv6(string $ip): bool { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); |  |  |     return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  | function isDomain($domain): bool { |  |  | function isDomain(string $domain): bool { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     $regex = '/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/'; |  |  |     $regex = '/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/'; | 
			
		
	
		
		
			
				
					|  |  |     preg_match($regex, $domain, $match); |  |  |     preg_match($regex, $domain, $match); | 
			
		
	
		
		
			
				
					|  |  |     return count($match) != 0; |  |  |     return count($match) != 0; | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | function isHost(string $host): bool { // IPv4 / IPv6 / Domain | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     return isIPv4($host) or isIPv6($host) or isDomain($host); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | function isPort(int $port): bool { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     $port = intval($port); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     return ($port < 65536 and $port > 0); | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | function getKeys(bool $isWinServer = false): array { // get kms keys asset |  |  | function getKeys(bool $isWinServer = false): array { // get kms keys asset | 
			
		
	
		
		
			
				
					|  |  |     $keysAsset = json_decode(file_get_contents('../assets/kms-keys.json'), true); |  |  |     $keysAsset = json_decode(file_get_contents('../assets/kms-keys.json'), true); | 
			
		
	
		
		
			
				
					|  |  |     return $isWinServer ? array_reverse($keysAsset['win-server']) : $keysAsset['win']; |  |  |     return $isWinServer ? array_reverse($keysAsset['win-server']) : $keysAsset['win']; | 
			
		
	
	
		
		
			
				
					|  | @ -43,7 +52,7 @@ function getHost(): string { | 
			
		
	
		
		
			
				
					|  |  |         return 'KMS_HOST'; |  |  |         return 'KMS_HOST'; | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |     $host = v6DelBracket($_SERVER['HTTP_HOST']); // try to remove ipv6 bracket |  |  |     $host = v6DelBracket($_SERVER['HTTP_HOST']); // try to remove ipv6 bracket | 
			
		
	
		
		
			
				
					
					|  |  |     if (isIPv4($host) or isIPv6($host) or isDomain($host)) { // invalid host |  |  |     if (isHost($host)) { // valid host | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         return $host; |  |  |         return $host; | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |     preg_match_all('/(\S+):\d+$/', $host, $match); |  |  |     preg_match_all('/(\S+):\d+$/', $host, $match); | 
			
		
	
	
		
		
			
				
					|  | @ -51,7 +60,7 @@ function getHost(): string { | 
			
		
	
		
		
			
				
					|  |  |         return 'KMS_HOST'; |  |  |         return 'KMS_HOST'; | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |     $host = v6DelBracket($match[1][0]); // try to remove ipv6 bracket again |  |  |     $host = v6DelBracket($match[1][0]); // try to remove ipv6 bracket again | 
			
		
	
		
		
			
				
					
					|  |  |     return (isIPv4($host) or isIPv6($host) or isDomain($host)) ? $host : 'KMS_HOST'; |  |  |     return (isHost($host)) ? $host : 'KMS_HOST'; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | function officeInfo(): array { // office dir and kms key for different version |  |  | function officeInfo(): array { // office dir and kms key for different version | 
			
		
	
	
		
		
			
				
					|  | 
 |