Current File : //root/panel/modules/ssl_crt/code/controller.ext.php
<?php

/**
 * @copyright 2014-2015 Sentora Project (http://www.sentora.org/) 
 * Sentora is a GPL fork of the ZPanel Project whose original header follows:
 *
 * ZPanel - A Cross-Platform Open-Source Web Hosting Control panel.
 *
 * @package ZPanel
 * @version $Id$
 * @author Bobby Allen - ballen@bobbyallen.me
 * @copyright (c) 2008-2014 ZPanel Group - http://www.zpanelcp.com/
 * @license http://opensource.org/licenses/gpl-3.0.html GNU Public License v3
 *
 * This program (ZPanel) 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 */
 

 
class module_controller extends ctrl_module
{
	static $complete;
	
	static $nosub;
	static $alreadyexists;
	static $badname;
	static $blank;
	static $ok;
	static $del;
	static $validemail;
	static $badpointing;
	static $httpcodeerror;
	static $uploadcrt;
	static $uploadfailed;
	static $crtempt;
	static $csrfilenotexist;
	static $domainnotpointed;
	static $invalidcrtfile;
	static $crtexists;
	static $UpadteSsl;
	static $uploadcrtempt;
	static $tryagain;
	
	static function get_client_ip() 
	{
		$ipaddress = '';
		if (getenv('HTTP_CLIENT_IP'))
		$ipaddress = getenv('HTTP_CLIENT_IP');
		else if(getenv('HTTP_X_FORWARDED_FOR'))
		$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
		else if(getenv('HTTP_X_FORWARDED'))
		$ipaddress = getenv('HTTP_X_FORWARDED');
		else if(getenv('HTTP_FORWARDED_FOR'))
		$ipaddress = getenv('HTTP_FORWARDED_FOR');
		else if(getenv('HTTP_FORWARDED'))
		$ipaddress = getenv('HTTP_FORWARDED');
		else if(getenv('REMOTE_ADDR'))
		$ipaddress = getenv('REMOTE_ADDR');
		else
		$ipaddress = 'UNKNOWN';
		return $ipaddress;
	}
	
	static function getCreatedDomain()
    	{
        	$currentuser = ctrl_users::GetUserDetail();
        	return self::ListDomain($currentuser['userid']);
    	}
	
	static function random_string($length) 
	{
		$key = '';
		$keys = array_merge(range(0, 9), range('a', 'z'));

		for ($i = 0; $i < $length; $i++) {
			$key .= $keys[array_rand($keys)];
		}

		return $key;
	}

	static public function doSaveSSL()
	{
		global $controller;
		if (isset($_POST['ca_bundle']))
		{
			if (self::ExecuteCreateSSL($_POST['ca_bundle'],$_POST['ca_desc']))
			{
				self::$ok = TRUE;
				return true;
			}
			else
			{
				return false;
			}
		}
		return;
	}
	
	static public function ExecuteCreateSSL($ca_bundle,$ca_desc)
	{
		global $zdbh;
		global $controller;
		$time = time();
		if($ca_bundle == "")
		{
			self::$crtempt = TRUE;
			return FALSE;
		}
		else
		{
			$file_name = self::random_string(10);
			$crt_file = "/etc/csr/tmp/".$file_name.".crt";
			echo $crt_file."\n";
			self::SocketConnect("SslCrtValid",$crt_file);
			$file = fopen($crt_file,"w");
			fwrite($file,$ca_bundle);
			fclose($file);
			$fp = fopen($crt_file, "r");
			$cert = fread($fp, 8192);
			fclose($fp);
			$csr_result = openssl_x509_parse($cert);
			$csr_domain = trim($csr_result['subject']['CN']);
			
			$currentuser = ctrl_users::GetUserDetail();
			$gsql=$zdbh->prepare("select * from x_vhosts where vh_name_vc=:domainName AND vh_acc_fk=:userid AND vh_deleted_ts is NULL");
			$gsql->bindParam(':userid', $currentuser['userid']);
			$gsql->bindParam(':domainName', $csr_domain);
			$gsql->execute();
			if($gsql->rowCount() !=0 ) 
			{
				$qsql=$zdbh->prepare("select * from x_ssl_crt where ssl_crt_doamin=:domainName AND userid=:userid AND ssl_crt_delete is NULL");
				$qsql->bindParam(':userid', $currentuser['userid']);
				$qsql->bindParam(':domainName', $csr_domain);
				$qsql->execute();
				
				if($qsql->rowCount() ==0 )
				{
					$let_ssl = $zdbh->prepare("select * from x_ssl where ssl_doamin=:domainName AND userid=:userid AND ssl_delete is NULL");
					$let_ssl->bindParam(':userid', $currentuser['userid']);
					$let_ssl->bindParam(':domainName', $csr_domain);
					$let_ssl->execute();
					if($let_ssl->rowCount() != 0)
					{
						$del_lets = $zdbh->prepare("UPDATE x_ssl SET ssl_delete=:time where ssl_doamin=:domainName AND userid=:userid AND ssl_delete is NULL");
						$del_lets->bindParam(':userid', $currentuser['userid']);
						$del_lets->bindParam(':domainName', $csr_domain);
						$del_lets->bindParam(':time', $time);
						$del_lets->execute();
					}
					$key_file = "/etc/csr/".$csr_domain."/".$csr_domain.".key";

					if(file_exists($key_file))
					{
						$certFile = file_get_contents($crt_file);
						$keyFile = file_get_contents($key_file);
						$result = openssl_x509_check_private_key($certFile,$keyFile);
						
						if($result == 1)
						{
							self::SocketConnect("CopyCrt",$crt_file,$csr_domain);
							$validFrom_time_t = $csr_result['validFrom_time_t'];
							$validTo_time_t = $csr_result['validTo_time_t'];
							$ssl_crt_issuer = trim($csr_result['issuer']['O']);
							
							$user_id = $currentuser['userid'];
							$ssl_crt_type = "KEY_TEXT";
							
							$sql = "INSERT INTO x_ssl_crt (userid,ssl_crt_doamin,ssl_crt,ssl_crt_desc,ssl_crt_type,ssl_crt_issuer,ssl_crt_status,ssl_crt_valid_from,ssl_crt_valid_to,ssl_crt_create) VALUES ($user_id,'$csr_domain','$ca_bundle','$ca_desc','$ssl_crt_type','$ssl_crt_issuer',0,$validFrom_time_t,$validTo_time_t,$time)";
							$sql = $zdbh->prepare($sql);
							
							/*$sql = $zdbh->prepare("INSERT INTO x_ssl_crt (userid,
																			ssl_crt_doamin,
																			ssl_crt,
																			ssl_crt_desc,
																			ssl_crt_type,
																			ssl_crt_issuer,
																			ssl_crt_status,
																			ssl_crt_valid_from,
																			ssl_crt_valid_to,
																			ssl_crt_create) 
																			VALUES (:userid,
																			:domainName,
																			:sslcrt,
																			:ca_desc,
																			:ssl_crt_type,
																			:ssl_crt_issuer,
																			:0,
																			:ssl_crt_valid_from,
																			:ssl_crt_valid_to,
																			:time)");
							$sql->bindParam(':userid', $user_id);
							$sql->bindParam(':domainName', $csr_domain);
							$sql->bindParam(':sslcrt', $ca_bundle);
							$sql->bindParam(':ca_desc', $ca_desc);
							$sql->bindParam(':ssl_crt_type', $ssl_crt_type);
							$sql->bindParam(':ssl_crt_issuer', $ssl_crt_issuer);
							$sql->bindParam(':ssl_crt_valid_from', $validFrom_time_t);
							$sql->bindParam(':ssl_crt_valid_to', $validTo_time_t);
							$sql->bindParam(':time', $time);*/
							$sql->execute();
							unset($sql);
							$sql = $zdbh->prepare("UPDATE x_settings SET so_value_tx='true' WHERE so_name_vc='apache_changed'");
							$sql->execute();
							unset($sql);
							self::SetCallDaemon();
							self::$ok = TRUE;
							return FALSE;
						}
						else
						{
							self::$invalidcrtfile = TRUE;
							return FALSE;
						}
					}
					else
					{
						self::$csrfilenotexist = TRUE;
						return FALSE;
					}
				}
				else
				{
					self::$crtexists = TRUE;
					return FALSE;
				}
			}
			else
			{
				self::$domainnotpointed = TRUE;
				return FALSE;
			}
		}
	}

	static public function doUploadSSL()
	{
		global $zdbh;
		global $controller;
		if (isset($_FILES["ca_file"]))
		{
			$ca_fdesc = $_POST['ca_fdesc'];
			$ca_file = $_FILES["ca_file"]["name"];
			if($ca_file == "")
			{
				self::$uploadcrtempt = TRUE;
				return FALSE;
			}
			$ext = trim(pathinfo($ca_file, PATHINFO_EXTENSION));
			if($ext != "crt")
			{
				self::$uploadcrt = TRUE;
				return FALSE;
			}
			else
			{
				$target_dir = "/etc/csr/tmp/";
				$target_path = $target_dir . basename($ca_file);
				
				if (move_uploaded_file($_FILES["ca_file"]["tmp_name"], $target_path))
				{
					echo $target_path;
					$fp = fopen($target_path, "r");
					$cert = fread($fp, 8192);
					fclose($fp);
					//exit;
					$csr_result = openssl_x509_parse($cert);
					$csr_domain = trim($csr_result['subject']['CN']);
					$currentuser = ctrl_users::GetUserDetail();
					$gsql=$zdbh->prepare("select * from x_vhosts where vh_name_vc=:domainName AND vh_acc_fk=:userid AND vh_deleted_ts is NULL");
					$gsql->bindParam(':userid', $currentuser['userid']);
					$gsql->bindParam(':domainName', $csr_domain);
					$gsql->execute();
					
					if($gsql->rowCount() !=0 ) 
					{
						$qsql=$zdbh->prepare("select * from x_ssl_crt where ssl_crt_doamin=:domainName AND userid=:userid AND ssl_crt_delete is NULL");
						$qsql->bindParam(':userid', $currentuser['userid']);
						$qsql->bindParam(':domainName', $csr_domain);
						$qsql->execute();
						
						if($qsql->rowCount() ==0 )
						{
							$let_ssl = $zdbh->prepare("select * from x_ssl where ssl_doamin=:domainName AND userid=:userid AND ssl_delete is NULL");
							$let_ssl->bindParam(':userid', $currentuser['userid']);
							$let_ssl->bindParam(':domainName', $csr_domain);
							$let_ssl->execute();
							if($let_ssl->rowCount() != 0)
							{
								$del_lets = $zdbh->prepare("UPDATE x_ssl SET ssl_delete=:time where ssl_doamin=:domainName AND userid=:userid AND ssl_delete is NULL");
								$del_lets->bindParam(':userid', $currentuser['userid']);
								$del_lets->bindParam(':domainName', $csr_domain);
								$del_lets->bindParam(':time', $time);
								$del_lets->execute();
							}
							$key_file = "/etc/csr/".$csr_domain."/".$csr_domain.".key";

							if(file_exists($key_file))
							{
								$certFile = file_get_contents($target_path);
								$keyFile = file_get_contents($key_file);
								$result = openssl_x509_check_private_key($certFile,$keyFile);
								
								if($result == 1)
								{
									self::SocketConnect("CopyCrt",$target_path,$csr_domain);
									$validFrom_time_t = $csr_result['validFrom_time_t'];
									$validTo_time_t = $csr_result['validTo_time_t'];
									$ssl_crt_issuer = trim($csr_result['issuer']['O']);
									$time = time();
									$crt_path = "/etc/csr/".$csr_domain."/".$csr_domain.".crt";
									$fpq = fopen($crt_path, "r");
									$ca_bundle = fread($fpq, 8192);
									fclose($fpq);
									$user_id = $currentuser['userid'];
									$ssl_crt_type = "CRT_UPLOAD";
									$sql = "INSERT INTO x_ssl_crt (userid,ssl_crt_doamin,ssl_crt,ssl_crt_desc,ssl_crt_type,ssl_crt_issuer,ssl_crt_status,ssl_crt_valid_from,ssl_crt_valid_to,ssl_crt_create)VALUES ('$user_id','$csr_domain','$ca_bundle','$ca_fdesc','$ssl_crt_type','$ssl_crt_issuer',0,'$validFrom_time_t','$validTo_time_t','$time')"; 
									//echo $sql; exit;
									/*$sql = $zdbh->prepare("INSERT INTO x_ssl_crt (userid,
																			ssl_crt_doamin,
																			ssl_crt,
																			ssl_crt_desc,
																			ssl_crt_type,
																			ssl_crt_issuer,
																			ssl_crt_status,
																			ssl_crt_valid_from,
																			ssl_crt_valid_to,
																			ssl_crt_create) 
																			VALUES (:userid,
																			:domainName,
																			:sslcrt,
																			:ca_desc,
																			:ssl_crt_type,
																			:ssl_crt_issuer,
																			:0,
																			:ssl_crt_valid_from,
																			:ssl_crt_valid_to,
																			:time)");
									$sql->bindParam(':userid', $user_id);
									$sql->bindParam(':domainName', $csr_domain);
									$sql->bindParam(':sslcrt', $ca_bundle);
									$sql->bindParam(':ca_desc', $ca_fdesc);
									$sql->bindParam(':ssl_crt_type', $ssl_crt_type);
									$sql->bindParam(':ssl_crt_issuer', $ssl_crt_issuer);
									$sql->bindParam(':ssl_crt_valid_from', $validFrom_time_t);
									$sql->bindParam(':ssl_crt_valid_to', $validTo_time_t);
									$sql->bindParam(':time', $time);*/
									$sql = $zdbh->prepare($sql);
									$sql->execute();
									unset($sql);
									$sql = $zdbh->prepare("UPDATE x_settings SET so_value_tx='true' WHERE so_name_vc='apache_changed'");
									$sql->execute();
									unset($sql);
									self::SetCallDaemon();
									self::$ok = TRUE;
									return FALSE;
								}
								else
								{
									self::$invalidcrtfile = TRUE;
									return FALSE;
								}
							}
							else
							{
								self::$csrfilenotexist = TRUE;
								return FALSE;
							}
						}
						else
						{
							self::$crtexists = TRUE;
							return FALSE;
						}
					}
					else
					{
						self::$domainnotpointed = TRUE;
						return FALSE;
					}
				}
				else
				{
					self::$uploadfailed = TRUE;
					return FALSE;
				}
				exit;
			}
		}
		else
		{
			return false;
		}
		return;
	}
	
	static function SocketConnect($command, $crt_file, $csr_domain=null)
    {
		$crt_file = escapeshellarg($crt_file);
		//$org_crt_file = escapeshellarg($org_crt_file);
		//echo "crt_file: ".$crt_file; exit;
        $service_port = 4444;
		$address = gethostbyname('localhost');
		$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
		if ($socket === false) 
		{
			//echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
			self::$tryagain=true;
			return false;
		}
		   //echo "Attempting to connect to '$address' on port '$service_port'...";
		   $result = socket_connect($socket, $address, $service_port);
		if ($result === false) 
		{
		   echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
		   self::$tryagain=true;
		   return false;
		}
	   
		socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 5, "usec" =>0));
		//echo "command $command $vhost_path \n";
		if($command == "SslCrtValid")
			$in = "command $command $crt_file";
		else
			$in = "command $command $crt_file $csr_domain";
		$out = '';
		socket_write($socket, $in, strlen($in));
		$output = "" ;
	
		$out = socket_read($socket, 2048);
		$output .= $out ;
		socket_close($socket);
	}
	
	static public function doSslCrtList()
	{
		global $zdbh;
		global $controller;
		echo "<h2 style='height:55px;'>Certificates on Server</h2>";
		$currentuser = ctrl_users::GetUserDetail();
		
		$sql = "SELECT * FROM x_ssl_crt WHERE ssl_crt_status=1 AND ssl_crt_delete IS NULL AND userid=:userid";
		$numrows = $zdbh->prepare($sql);
		$numrows->bindParam(':userid', $currentuser['userid']);
		$numrows->execute();
		
		if ($numrows->fetchColumn() > 0) 
		{
		
			$sql = $zdbh->prepare($sql);
			$sql->bindParam(':userid', $currentuser['userid']);
			$res = array();
			$sql->execute();
			$line .='<form action="./?module=ssl_crt&action=ConfirmDeleteSsl" method="post">';
			$line .= '<table style="width:100%">';
			$line .='<tr><td>&nbsp;</td></tr>';
			$line .= '<tr><th style="width: 15%;">Domain</th><th style="width: 15%;">Issuer</th><th style="width: 15%;">Expiration</th><th style="width: 15%;">Description</th><th style="width: 15%;">Actions</th></tr>';
			while ($rowdomain = $sql->fetch()) 
			{
				$listdomain = $rowdomain['ssl_crt_doamin'];
				$listdomain = trim($listdomain);
				$crtvalid = $rowdomain['ssl_crt_valid_to'];
				$crtvalid = date('m/d/Y H:i:s', $crtvalid);
				$issuer = $rowdomain['ssl_crt_issuer'];
				$crtdesc = $rowdomain['ssl_crt_desc'];
				$listid = $rowdomain['ssl_crt_no'];	
				$line .= '<tr><td>'.$listdomain.'</td><td>'.$issuer.'</td><td>'.$crtvalid.'</td><td>'.$crtdesc.'</td>';
				$line .= '<td><button class="button-loader delete btn btn-danger" type="submit" id="button" name="inEdit_'.$listid.'" id="inEdit_'.$listid.'" value="inEdit_'.$listid.'" >Edit</button><button class="button-loader delete btn btn-danger" type="submit" id="button" name="inDelete_'.$listid.'" id="inDelete_'.$listid.'" value="inDelete_'.$listid.'" >Delete</button></td></tr>';
			}
			$line .= '</table>';
			$line .='</form>';
			echo $line;
			exit;
        } else {
			echo "You currently do not have any Self Signed SSl Certificate. Upload CRT for create Self Signed SSl Certificate using the form below.";
			exit;
        }
    }
	
	static function SetCallDaemon()
    {

        $service_port = 4445 ;
		$address = gethostbyname('localhost');
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
		if ($socket === false)
		{
			/*
			echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
			self::$tryagain=true;
			return false;
			*/
		}
       //  echo "Attempting to connect to '$address' on port '$service_port'...";
        $result = socket_connect($socket, $address, $service_port);
        if ($result === false)
		{
			/*
			echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
			self::$tryagain=true;
			return false;
			*/
		}
		socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 2000, "usec" =>0));
		$in="command DaemonCall ";
		socket_write($socket, $in, strlen($in));
		socket_close($socket);

    }
	
	static function getisDeleteDomain()
    {
        global $controller;
        $urlvars = $controller->GetAllControllerRequests('URL');
        return (isset($urlvars['show'])) && ($urlvars['show'] == 'Delete');
    }
	
	static function getisEditDomain()
    {
        global $controller;
        $urlvars = $controller->GetAllControllerRequests('URL');
        return (isset($_GET['show'])) && ($_GET['show'] == 'Edit');
		
    }
	
	static function doConfirmDeleteSsl()
    {
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        $formvars = $controller->GetAllControllerRequests('FORM');
        foreach (self::ListDomain($currentuser['userid']) as $row) {
            if (isset($formvars['inDelete_' . $row['subid'] . ''])) {
                header('location: ./?module=' . $controller->GetCurrentModule() . '&show=Delete&id=' . $row['subid'] . '&domain=' . $row['list']);
                exit;
            }
			else if (isset($formvars['inEdit_' . $row['subid'] . ''])) {
                header('location: ./?module=' . $controller->GetCurrentModule() . '&show=Edit&id=' . $row['subid'] . '&domain=' . $row['list']);
                exit;
            }
        }
        return false;
    }
	
	static function doEditSslDomain()
    {
        global $controller;		
        if (isset($_POST['inEdit'])) {
            if (self::ExecuteEditSslDomain($_POST['inEdit'],$_POST['inEditDomain'])) {
                self::$del = TRUE;
                return true;
            }
        }
        return false;
    }
	
	static function ExecuteEditSslDomain($id, $domain)
    {
		global $zdbh;
		global $controller;
		echo "<h2 style='height:55px;'>Certificates on Server</h2>";
		$currentuser = ctrl_users::GetUserDetail();
		$sql = "SELECT * FROM x_ssl_crt WHERE ssl_crt_no=:id";
		$numrows = $zdbh->prepare($sql);
		$numrows->bindParam(':id', $id);
		$numrows->execute();
		$we = $numrows->fetchColumn();
		
		if ($we > 0) 
		{
			$sql = $zdbh->prepare($sql);
			$sql->bindParam(':id', $id);
			$sql->execute();
			$rowdomain = $sql->fetch();
			
			$crtvalid = $rowdomain['ssl_crt_valid_to'];
			$crtvalid = date('m/d/Y H:i:s', $crtvalid);
			$line = "";
			$line .='<form action="./?module=ssl_crt&action=UpdateSSL" method="post">';
			$line .= '<table style="width:100%;border-collapse: collapse;">';
			$line .='<tr"><td>&nbsp;</td></tr>';
			$line .= '<tr><th style="width: 15%;">Domain</th><td>'.$rowdomain['ssl_crt_doamin'].'</td></tr>';
			$line .= '<tr><th style="width: 15%;">Issuer</th><td>'.$rowdomain['ssl_crt_issuer'].'</td></tr>';
			$line .= '<tr><th style="width: 15%;">Expiration</th><td>'.$crtvalid.'</td></tr>';
			$line .= '<th style="width: 15%;">Description</th><td><textarea  style="width:600px;height:130px;" name="ca_desc" id="ca_desc">'.$rowdomain['ssl_crt_desc'].'</textarea></td></tr>';
			$line .= '<th></th><tr><td><input type="hidden" Id="inUpdate" name="inUpdate" value="'.$id.'"><button class="button-loader delete btn btn-danger" type="submit" id="UpdateSSL" style="margin-left:77px;margin-top:25px">Update</button></td></tr>';
			$line .= "<tr>&nbsp;</tr>";
			$line .= '</table>';
			$line .= '</form>';
			
			$line .= '<pre>';
			$line .= '<table style="width:100%">';
			$line .= "<h3 style='height:55px;margin-top:30px;'>Decoded Certificate:</h3>";
			$fp = fopen("/etc/csr/frwdtokesav.tk/frwdtokesav.tk.crt", "r");
			$cert = fread($fp, 8192);
			fclose($fp);
			#echo openssl_x509_read($cert);
			$cst_info = openssl_x509_parse( openssl_x509_read($cert));
			$line .= "Certificate: <br>";
			$line .= "Data: <br>";
			
			foreach($cst_info as $key => $value)
			{
				if($key == "version")
				{
					$version = $value;
				}
				elseif($key == "serialNumber")
				{
					$serialNumber = $value;
				}
				elseif($key == "signatureTypeLN")
				{
					$Algorithm = $value;
				}
				elseif($key == "validFrom_time_t")
				{
					$validFrom_time_t = $value;
				}
				elseif($key == "validTo_time_t")
				{
					$validTo_time_t = $value;
				}
				elseif($key == "subject")
				{
					$subject = $value['CN'];
				}
				elseif($key == "issuer")
				{
					foreach ($value as $issue_key => $issue_value)
					{
						//$issuer .= $issue_value.", ";
						//$iss_arr[] = $issuer;
						$issuer = $issue_key." = ".$issue_value.", ";
					}
				}
				elseif($key == "signatureTypeSN")
				{
					$signatureTypeSN = $value;
				}
				elseif($key == "extensions")
				{
					foreach($value as $ext => $extension)
					{
						if($ext == "authorityKeyIdentifier")
							$authorityKeyIdentifier = $extension;
						elseif($ext == "subjectKeyIdentifier")
							$subjectKeyIdentifier = $extension;
						elseif($ext == "keyUsage")
							$keyUsage = $extension;
						elseif($ext == "basicConstraints")
							$basicConstraints = $extension;
						elseif($ext == "extendedKeyUsage")
							$extendedKeyUsage = $extension;
						elseif($ext == "certificatePolicies")
							$certificatePolicies = $extension;
						elseif($ext == "crlDistributionPoints")
							$crlDistributionPoints = $extension;
						elseif($ext == "authorityInfoAccess")
							$authorityInfoAccess = $extension;
						elseif($ext == "subjectAltName")
							$subjectAltName = $extension;
						elseif($ext == "ct_precert_scts")
							$ct_precert_scts = $extension;
					}
				}
			}
			$line .= "<tr style='height:27px;'><td>Version: ".$version."</td></tr>";
			$line .= "<tr style='height:27px;'><td>Serial Number: ".$serialNumber."</td></tr>";
			$line .= "<tr style='height:27px;'><td>Signature Algorithm: ".$Algorithm."</td></tr>";
			$line .= "Issuer: ".$issuer."<br>";
			$validFrom = date('m/d/Y H:i:s', $validFrom_time_t);
			$validTo = date('m/d/Y H:i:s', $validTo_time_t);
			$line .= "<tr style='height:27px;'><td>Validity: </td></tr><tr><td>From: ".$validFrom."<br> To: ".$validTo."</td></tr>";
			$line .= "<tr style='height:27px;'><td>Subject: CN = ".$subject."</td></tr>";
			$line .= "<tr style='height:27px;'><td>Subject Public Key Info:</td></tr>";
			$line .= "<tr style='height:27px;'><td>Public Key Algorithm: ".$signatureTypeSN."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 extensions:</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Authority Key Identifier: <br>".$authorityKeyIdentifier."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Subject Key Identifier: <br>".$subjectKeyIdentifier."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Key Usage: <br>".$keyUsage."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Basic Constraints: <br>".$basicConstraints."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Extended Key Usage: <br>".$extendedKeyUsage."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Certificate Policies: <br>".$certificatePolicies."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 CRL Distribution Points: <br>".$crlDistributionPoints."</td></tr>";
			$line .= "<tr style='height:27px;'><td>Authority Information Access: <br>".$authorityInfoAccess."</td></tr>";
			$line .= "<tr style='height:27px;'><td>X509v3 Subject Alternative Name: ".$subjectAltName."</td></tr>";
			$line .= "<tr style='height:27px;'><td>CT Precertificate SCTs: <br>".$ct_precert_scts."</td></tr>";
			$line .= '<th></th><tr><td><button class="button-loader btn btn-default" type="button" onclick="window.location.href=\'./?module=ssl_crt\';return false;"style="margin-left:72px;margin-top:20px;!important;">Go Back</button></td></tr>';
			$line .= '</table>';
			$line .= '</pre>';
			echo $line;
			exit;
        } 
		else {
			echo "You currently do not have any Self Signed SSl Certificate. Upload CRT for create Self Signed SSl Certificate using the form below.";
			exit;
        }    
    }
	
	static function doUpdateSSL()
    {
		global $zdbh;
		global $controller;
        if (isset($_POST['inUpdate'])) 
		{
            $ssl_id = $_POST['inUpdate'];
            $ssl_desc = $_POST['ca_desc'];
			
			$sql = $zdbh->prepare("UPDATE x_ssl_crt SET ssl_crt_desc=:ssl_crt_desc WHERE ssl_crt_no=:id");
			$sql->bindParam(':ssl_crt_desc', $ssl_desc);
			$sql->bindParam(':id', $ssl_id);
			$sql->execute();
			self::$UpadteSsl = TRUE;
			return FALSE;
        }
        return false;
		
	}
	
	static function doDeleteSslDomain()
    {
        global $controller;
        if (isset($_POST['inDelete'])) {
            if (self::ExecuteDeleteSslDomain($_POST['inDelete'])) {
                self::$del = TRUE;
                return true;
            }
        }
        return false;
    }
	
	static function ExecuteDeleteSslDomain($id)
    {
        global $zdbh;
        $sql = $zdbh->prepare("UPDATE x_ssl_crt SET ssl_crt_delete=:time WHERE ssl_crt_no=:id");
        $time = time();
        $sql->bindParam(':time', $time);
        $sql->bindParam(':id', $id);
        $sql->execute();
        $retval = TRUE;
		
		$sql = $zdbh->prepare("SELECT ssl_crt_doamin FROM x_ssl_crt WHERE ssl_crt_no=:id");
		$sql->bindParam(':id', $id);
		$sql->execute();
		$row = $sql->fetch();
		$domain = $row['ssl_crt_doamin'];	
		
		/*============================== Socket ==============================*/
		
			$service_port = 4444 ;
			$address = gethostbyname('localhost');
			$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
			 if ($socket === false) {
            // echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
            self::$tryagain=true;
            return false;
        } 

        //  echo "Attempting to connect to '$address' on port '$service_port'...";
        $result = socket_connect($socket, $address, $service_port);
        if ($result === false) {
        //            echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
        self::$tryagain=true;
        return false;

        }
			
			$in="command deleteCRT $domain";
			$out = '';
			socket_write($socket, $in, strlen($in));
			$output = "" ;
	
			echo "DONE";
			exit;
					
			/*==============================END==============================*/
				
        return $retval;
    }
	
	static function doshowLogcontent()
	{
		$listdomain=$_POST['listdomain'];
		echo file_get_contents("/var/log/letsencrypt/letsencrypt.log");
		fclose($file);
		exit;
	}
	
	static function gethelpicon()
	{
		global $zdbh;
		global $controller;
		$temp=$controller->GetControllerRequest('URL','module') ;
		$val = '/assets/one.txt';
		$val1 = '/modules/';
		$name=file_get_contents("modules/$temp/assets/helpicon.txt");
		return $name;
	}

	static function ListDomain($uid)
    {
        global $zdbh;
        global $controller;
			
        $currentuser = ctrl_users::GetUserDetail($uid);
		$sql = "SELECT * FROM x_ssl_crt WHERE ssl_crt_delete IS NULL AND userid=:userid";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':userid', $currentuser['userid']);
        $numrows->execute();
		
        if ($numrows->fetchColumn() > 0) {
            $sql = $zdbh->prepare($sql);
            $sql->bindParam(':userid', $currentuser['userid']);
            $res = array();
            $sql->execute();
			
            while ($rowdomain = $sql->fetch()) {
                $res[] = array('list' => $rowdomain['ssl_crt_doamin'], 
							   'subid' => $rowdomain['ssl_crt_no']);		
            }
            return $res;
        } else {
            return false;
        }
    }
	
	
	
	
	static function getCurrentID()
    {
        global $controller;
        $id = $controller->GetControllerRequest('URL', 'id');
        return ($id) ? $id : '';
    }

    static function getCurrentDomain()
    {
        global $controller;
        $domain = $controller->GetControllerRequest('URL', 'domain');
        return ($domain) ? $domain : '';
    }
	
	
			/*=============================================================*/
			
 

	static function CheckCreateForErrors($domain)
    {
	
        global $zdbh;
        global $controller;
        // Check for spaces and remove if found...
		
        $domain = strtolower(str_replace(' ', '', $domain));
        // Check to make sure the domain is not blank before we go any further...
        if ($domain == '') {
            self::$blank = TRUE;
            return FALSE;
        }
        // Check for invalid characters in the domain...
        if (!self::IsValidDomainName($domain)) {
            self::$badname = TRUE;
            return FALSE;
        }
        
		$server_ip = ctrl_options::GetSystemOption('server_ip');
		$recordresult = dns_get_record($domain , DNS_A);
		if(empty($recordresult))
		{
			echo "BADPOINTING";
			exit;
		}
		foreach($recordresult as $keys=>$values)
		{
			if(trim($values['ip']) != trim($server_ip))
			{ 
				echo "BADPOINTING";
				exit;
			}
		}
		
				/*

				 $ch = curl_init();
				// set url 
				curl_setopt($ch, CURLOPT_URL, $domain);
				//return the transfer as a string 
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
				// $output contains the output string 
				$output = curl_exec($ch);
				$http_code = curl_getinfo ($ch, CURLINFO_HTTP_CODE) ;
				if($http_code!=200)
				{
						echo "HTTPCODEERR";
						exit;
				}

		  		*/
			$sock_err=0;
			$service_port = 4444 ;
			$address = gethostbyname('localhost');
			$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
			if ($socket === false) {
			echo "SOCKETERR";
			$sock_err=1;
			self::$tryagain=true;
            return false;
			} 
			$result = socket_connect($socket, $address, $service_port);
			if ($result === false) {
			echo "SOCKETERR";
			$sock_err=1;
			self::$tryagain=true;
            return false;
			}
			socket_close($socket);
			if($sock_err==1)
			exit;
			
        // Check to see if the domain already exists in Sentora somewhere and redirect if it does....
        $sql = "SELECT COUNT(*) FROM x_vhosts WHERE vh_name_vc=:domain AND vh_deleted_ts IS NULL";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':domain', $domain);

        if ($numrows->execute()) {
            if ($numrows->fetchColumn() == 0) {
                self::$alreadyexists = TRUE;
                return FALSE;
            }
        }
        return TRUE;
    }
	
	static function IsValidEmail($email)
    {
        return preg_match('/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i', $email) == 1;
    }
	
	static function IsValidDomainName($a)
    {
        if (stristr($a, '.')) {
            $part = explode(".", $a);
            foreach ($part as $check) {
                if (!preg_match('/^[a-z\d][a-z\d-]{0,62}$/i', $check) || preg_match('/-$/', $check)) {
                    return false;
                }
            }
        } else {
            return false;
        }
        return true;
    }
	
	
    static function ListDomains($uid)
    {
        global $zdbh;
        $currentuser = ctrl_users::GetUserDetail($uid);
        $sql = "SELECT * FROM x_vhosts WHERE vh_acc_fk=:userid AND vh_enabled_in=1 AND vh_deleted_ts IS NULL AND vh_name_vc NOT IN (select ssl_doamin from x_ssl where ssl_delete IS NULL And userid=:userid) ORDER BY vh_name_vc ASC";
		//$sql = "SELECT * FROM x_vhosts WHERE vh_acc_fk=:userid AND vh_enabled_in=1 AND vh_deleted_ts IS NULL AND vh_name_vc IN(SELECT ssl_doamin FROM x_ssl WHERE ssl_delete IS NOT NULL) ORDER BY vh_name_vc ASC";
		//$sql = "SELECT x_vhosts.*,x_ssl.ssl_doamin FROM x_vhosts LEFT OUTER JOIN x_ssl ON x_vhosts.vh_name_vc = x_ssl.ssl_doamin";
        //$numrows = $zdbh->query($sql);
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':userid', $currentuser['userid']);
        $numrows->execute();
		$domaincount = $numrows->fetchColumn();
        if ($domaincount > 0) {
            $sql = $zdbh->prepare($sql);
            $sql->bindParam(':userid', $currentuser['userid']);
            $res = array();
            $sql->execute();
            while ($rowdomains = $sql->fetch()) {
                $res[] = array('domain' => ui_language::translate($rowdomains['vh_name_vc']));
            }
            return $res;
        } else {
            return false;
        }
    }
	
	
    static function getDomainList()
    {
        $currentuser = ctrl_users::GetUserDetail();
        return self::ListDomains($currentuser['userid']);
    }
	
	static function getEmailList()
    {
        $currentuser = ctrl_users::GetUserDetail();
		return $currentuser['email'];
       // return self::ListEmail($currentuser['userid']);
    }
	
    
    static function getQuotaLimit()
    {
        $currentuser = ctrl_users::GetUserDetail();
        return ($currentuser['mailboxquota'] < 0) or //-1 = unlimited
                ($currentuser['mailboxquota'] > ctrl_users::GetQuotaUsages('mailboxes', $currentuser['userid']));
    }

    
	static function getResult()
    {
		 if (!fs_director::CheckForEmptyValue(self::$tryagain)) {
			return ui_sysmessage::shout(ui_language::translate("<strong>Error:</strong> Please try again Later. Server service not available."), "Error");
		}
        if (!fs_director::CheckForEmptyValue(self::$uploadfailed)) {
            return ui_sysmessage::shout(ui_language::translate("Upload failed kindly re-upload your CRT files.."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$uploadcrt)) {
            return ui_sysmessage::shout(ui_language::translate("Upload CRT files only.."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$uploadcrtempt)) {
            return ui_sysmessage::shout(ui_language::translate("Kindly Choose CRT file for upload."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$crtempt)) {
            return ui_sysmessage::shout(ui_language::translate("Kindly paste your CRT key in below TextBox.."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$csrfilenotexist)) {
            return ui_sysmessage::shout(ui_language::translate("CSR and Key files are not generated. Kindly generate CSR and Key after regenerate  CRT.."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$domainnotpointed)) {
            return ui_sysmessage::shout(ui_language::translate("This CRT which has domain is not pointed with us.."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$invalidcrtfile)) {
            return ui_sysmessage::shout(ui_language::translate("Your entered CRT is invalid. Kindly upload valid CRT Key.."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$crtexists)) {
            return ui_sysmessage::shout(ui_language::translate("This CRT which has domain is already configured. If you want new Certificate kindly delete existing."), "zannounceerror");
        }
		if (!fs_director::CheckForEmptyValue(self::$UpadteSsl)) {
            return ui_sysmessage::shout(ui_language::translate("Description Updated."), "zannounceok");
        }
        if (!fs_director::CheckForEmptyValue(self::$badname)) {
            return ui_sysmessage::shout(ui_language::translate("Your Domain name is not valid. Please enter a valid Domain Name: i.e. 'domain.com'"), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$badpointing)) {
            return ui_sysmessage::shout(ui_language::translate("Your Domain name is not pointing to the IP"), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$alreadyexists)) {
            return ui_sysmessage::shout(ui_language::translate("Your Domain name is not registred on this server."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$ok)) {
            return ui_sysmessage::shout(ui_language::translate("SSL Certificate created successfully."), "zannounceok");
        }
		if (!fs_director::CheckForEmptyValue(self::$del)) {
            return ui_sysmessage::shout(ui_language::translate("SSL Certificate deleted successfully."), "zannounceok");
        }
        return "";
    }
 	
}