Current File : //root/panel/modules/remote_mysql_users/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 $alreadyexists;
    static $dbalreadyadded;
    static $blank;
    static $badname;
    static $badpass;
    static $rootabuse;
    static $badIP;
    static $ok;

    /**
     * The 'worker' methods.
     */
    static function callCSFRemoteMysql($in)
    {
	$service_port = 4444 ;
	$address = gethostbyname('localhost');
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
	$result = socket_connect($socket, $address, $service_port);
	socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 5 , "usec" =>0));
	$out = '';
	socket_write($socket, $in, strlen($in));
	$output = "" ;
	socket_close($socket);
	return true;
    }
    static function CleanOrphanDatabases($uid)
    {
        global $zdbh;
        $sql = "SELECT * FROM x_mysql_dbmap WHERE mm_user_fk=:userid";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':userid', $uid);
        $numrows->execute();

        if ($numrows->fetchColumn() <> 0) {
            $sql = $zdbh->prepare($sql);
            $sql->bindParam(':userid', $uid);
            $sql->execute();
            while ($rowmysql = $sql->fetch()) {
                $rowdbSql = "SELECT * FROM x_mysql_databases WHERE my_id_pk=:id AND my_deleted_ts IS NULL";
                $find = $zdbh->prepare($rowdbSql);
                $find->bindParam(':id', $rowmysql['mm_database_fk']);
                $find->execute();
                $rowdb = $find->fetch();

                if (!$rowdb) {

                }
            }
            return true;
        } else {
            return false;
        }
    }

    static function ListUsers($uid)
    {
        global $zdbh;
        // Remove deleted databases from MySQL userlist...
        self::CleanOrphanDatabases($uid);
        $sql = "SELECT * FROM x_remote_mysql_hosts WHERE re_acc_fk=:userid AND re_host_vc!='localhost' AND re_deleted_ts IS NULL";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':userid', $uid);
	//$numrows->bindParam(':localhost', "localhost");
        $numrows->execute();
	$rowcount = $numrows->rowCount();
        if ($rowcount <> 0) {
            $sql = $zdbh->prepare($sql);
            $sql->bindParam(':userid', $uid);
            $res = array();
            $sql->execute();
            while ($rowmysql = $sql->fetch()) {
                //$numrowdb = $zdbh->query("SELECT COUNT(*) FROM x_mysql_dbmap WHERE mm_user_fk=" . $rowmysql['mu_id_pk'] . "")->fetch();
                /*$numrows = $zdbh->prepare("SELECT COUNT(*) FROM x_mysql_dbmap WHERE mm_user_fk=:mysql");
                $numrows->bindParam(':mysql', $rowmysql['mu_id_pk']);
                $numrows->execute();
                $numrowdb = $numrows->fetch();

                if ($rowmysql['mu_access_vc'] == "localhost") {
                    $access = $rowmysql['mu_access_vc'];
                } else {
                    $access = $rowmysql['mu_access_vc'];
                }*/
                array_push($res, array('hostid' => $rowmysql['re_id_pk'],
                    'host' => $rowmysql['re_host_vc']));
                    #'dbpassword' => $rowmysql['mu_pass_vc'],
                    #'totaldb' => $numrowdb[0],
                    #'accesshtml' => $access,
                    #'access' => $rowmysql['mu_access_vc']));
            }
            return $res;
        } else {
            return false;
        }
    }
    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 ListDatabases($uid)
    {
        global $zdbh;
        $sql = "SELECT * FROM x_mysql_databases WHERE my_acc_fk=:userid AND my_deleted_ts IS NULL";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':userid', $uid);
        $numrows->execute();
	$num_res = $numrows->rowCount();

        //if ($numrows->fetchColumn() <> 0) {
	if($num_res <> 0) {
            //$sql = $zdbh->prepare($sql);
            $res = array();
            //$sql->bindParam(':userid', $uid);
            //$sql->execute();
	    
            while ($rowmysql = $numrows->fetch()) {
		$sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=:db_name";
                $num = $zdbh->prepare($sql);
                $num->bindParam(':db_name', $rowmysql['my_name_vc']);
                $num->execute();
                $result_count = $num->rowCount();
                if($result_count <> 0)
                {
                        array_push($res, array('mysqlid' => $rowmysql['my_id_pk'], 'mysqlname' => $rowmysql['my_name_vc']));
                }
                //array_push($res, array('mysqlid' => $rowmysql['my_id_pk'],'mysqlname' => $rowmysql['my_name_vc']));
            }
            return $res;
        } else {
            return false;
        }
    }

    static function ListUserDatabases($uid)
    {
        global $zdbh;
        $sql = "SELECT * FROM x_mysql_dbmap WHERE mm_user_fk=:userid";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':userid', $uid);
        $numrows->execute();

        if ($numrows->fetchColumn() <> 0) {
            $sql = $zdbh->prepare($sql);
            $res = array();
            $sql->bindParam(':userid', $uid);
            $sql->execute();
            while ($rowmysql = $sql->fetch()) {
                $numrows = $zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_id_pk=:database AND my_deleted_ts IS NULL");
                $numrows->bindParam(':database', $rowmysql['mm_database_fk']);
                $numrows->execute();
                $rowdb = $numrows->fetch();
                if ($rowdb) {
                    array_push($res, array('mmid' => $rowmysql['mm_id_pk'],
                        'mmaccount' => $rowmysql['mm_acc_fk'],
                        'mmuserid' => $rowmysql['mm_user_fk'],
                        'mmdbid' => $rowmysql['mm_database_fk'],
                        'mmdbname' => $rowdb['my_name_vc']));
                }
            }
            return $res;
        } else {
            return false;
        }
    }

    static function ListCurrentUser($mid)
    {
        global $zdbh;
        //$numrows = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_id_pk=:mid AND mu_deleted_ts IS NULL");
	$numrows = $zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_id_pk=:mid AND re_deleted_ts IS NULL");
        $numrows->bindParam(':mid', $mid);
        $numrows->execute();

        if ($numrows->fetchColumn() <> 0) {
            //$sql = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_id_pk=:mid AND mu_deleted_ts IS NULL");
	    $sql = $zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_id_pk=:mid AND re_deleted_ts IS NULL");
            $res = array();
            $sql->bindParam(':mid', $mid);
            $sql->execute();
            while ($rowmysql = $sql->fetch()) {
                array_push($res, array('hostid' => $rowmysql['re_id_pk'],
                    'hostname' => $rowmysql['re_host_vc']));
            }
            return $res;
        } else {
            return false;
        }
    }

    static function ExecuteCreateHost($uid, $hostname, $prefix)
    {
        global $zdbh;
        global $controller;
        $currentuser = ctrl_users::GetUserDetail($uid);
        $currentuser_details = ctrl_users::GetUserDetail();
        
        // Check for spaces and remove if found...
        $hostname = strtolower(str_replace(' ', '', $hostname));
        
        // If errors are found, then exit before creating user...
        /*if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($hostname,$uid,$username))) {
            return false;
       	}*/
#        runtime_hook::Execute('OnBeforeCreateDatabaseUser');

//	$numrows = $zdbh->prepare("SELECT A.my_id_pk as db_id, A.my_name_vc as db_name,C.mu_id_pk as db_uid,C.mu_name_vc as db_uname,C.mu_access_vc as db_host, C.mu_pass_vc db_pass From x_mysql_databases as A INNER JOIN x_mysql_dbmap AS B ON (A.my_id_pk = B.mm_database_fk) INNER JOIN x_mysql_users AS C ON (B.mm_user_fk = C.mu_id_pk) WHERE A.my_acc_fk=:userid");
	$numrows = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_acc_fk =:userid AND mu_deleted_ts IS NULL");
        $numrows->bindParam(':userid', $uid);
        $numrows->execute();
	$rowcount= $numrows->rowCount();
	if ($rowcount <> 0) {
            while ($rowmysql = $numrows->fetch()) {
		$password  = $rowmysql['mu_pass_vc'];
		$username  = $rowmysql['mu_name_vc'];
		$sql_userid= $rowmysql['mu_id_pk'];
		//$database= $rowmysql['db_id'];
		//$dbname    = $rowmysql['db_name'];
		if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($hostname,$uid,$username))) {
            		return false;
        	}
        	// Create user in MySQL
        	$sql = $zdbh->prepare("CREATE USER :username@:access;");
        	$sql->bindParam(':username', $username);
        	$sql->bindParam(':access', $hostname);
        	$sql->execute();
        	// Set MySQL password for new user...
	 	if(trim($password)=="******")
		{
	            $sql_user = "SELECT * FROM mysql.user WHERE user ='$username'";
	            $numrows_user = $zdbh->prepare($sql_user);
	            $numrows_user->execute();
	            $fetch_row_data= $numrows_user->fetch();
	            $mysql_real_password=$fetch_row_data['Password'];
	            $sql_password_update = $zdbh->prepare("UPDATE mysql.user set Password='$mysql_real_password' WHERE User='$username' AND Host='$hostname'");
	            $sql_password_update->execute();
		}
		else
		{	
        		$sql = $zdbh->prepare("SET PASSWORD FOR :username@:access=PASSWORD(:password)");
        		$sql->bindParam(':username', $username);
	        	$sql->bindParam(':access', $hostname);
        		$sql->bindParam(':password', $password);
        		$sql->execute();
		}
		/*        	
		// Get the database name from the ID...
        	$numrows = $zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_id_pk=:database AND my_deleted_ts IS NULL");
        	$numrows->bindParam(':database', $database);
        	$numrows->execute();
        	$rowdb = $numrows->fetch();
        	// Remove all priveledges to all databases
        	$sql = $zdbh->prepare("GRANT USAGE ON *.* TO :username@:access");
        	$sql->bindParam(':username', $username);
        	$sql->bindParam(':access', $hostname);
        	$sql->execute();
*/
		$numrows1 = $zdbh->prepare("SELECT DISTINCT A.my_id_pk as db_id, A.my_name_vc as db_name From x_mysql_databases as A INNER JOIN x_mysql_dbmap AS B ON (A.my_id_pk = B.mm_database_fk) WHERE A.my_acc_fk=:userid AND mm_user_fk=:mysql_userid");
        	$numrows1->bindParam(':userid', $uid);
		$numrows1->bindParam(':mysql_userid', $sql_userid);
        	$numrows1->execute();
	        $rowcount1= $numrows->rowCount();
		if($rowcount1 >0)
		{
			while ($rowmysql1 = $numrows1->fetch()) {
				$sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=:db_name";
				$num = $zdbh->prepare($sql);
				$num->bindParam(':db_name', $rowmysql1['db_name']);
				$num->execute();
				$result_count = $num->rowCount();
				if($result_count <> 0)
				{
					$dbname	= $rowmysql1['db_name'];
					$sql = $zdbh->prepare("GRANT USAGE ON *.* TO :username@:access");
					$sql->bindParam(':username', $username);
					$sql->bindParam(':access', $hostname);
					$sql->execute();
					// Grant privileges for new user to the assigned database...
					$usernameClean = $zdbh->mysqlRealEscapeString($username);
					$accessClean = $zdbh->mysqlRealEscapeString($hostname);
					$my_name_vc = $zdbh->mysqlRealEscapeString($dbname);
					//$my_name_vc = $zdbh->mysqlRealEscapeString($rowdb['my_name_vc']);
					$sql = $zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`.* TO `$usernameClean`@`$accessClean`");
					//$sql->bindParam(':username', $username, PDO::PARAM_STR);
					//$sql->bindParam(':access', $access, PDO::PARAM_STR);
					//$sql->bindParam(':name', $rowdb['my_name_vc'], PDO::PARAM_STR);
					$sql->execute();
					$sql = $zdbh->prepare("FLUSH PRIVILEGES");
					$sql->execute();
				}
			}
		}
		/*$sql = $zdbh->prepare("INSERT INTO x_mysql_users (
								mu_acc_fk,
								mu_name_vc,
								mu_database_fk,
								mu_pass_vc,
								mu_access_vc,
								mu_created_ts) VALUES (
								:userid,
								:username,
								:database,
								:password,
								:access,
								:time)");
        	$sql->bindParam(':userid', $uid);
	        $sql->bindParam(':username', $username);
        	$sql->bindParam(':database', $database);
        	$sql->bindParam(':password', $password);
        	$sql->bindParam(':access', $hostname);
        	$time = time();
        	$sql->bindParam(':time', $time);
        	$sql->execute();*/
	    }
	}
	else {
		if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($hostname,$uid,$username))) {
                        return false;
                }
	}
        // Add user to Sentora database...
        $sql = $zdbh->prepare("INSERT INTO x_remote_mysql_hosts (
								re_host_vc,
								re_acc_fk,
								re_created_ts) VALUES (
								:hostname,
								:userid,
								:time)");
        $sql->bindParam(':userid', $uid);
        $sql->bindParam(':hostname', $hostname);
        $time = time();
        $sql->bindParam(':time', $time);
        $sql->execute();
        // Get the new users id...
        //$rowuser = $zdbh->query("SELECT * FROM x_mysql_users WHERE mu_name_vc='" . $username . "' AND mu_acc_fk=" . $uid . " AND mu_deleted_ts IS NULL")->fetch();
        $numrows = $zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_host_vc=:hostname AND re_acc_fk=:userid AND re_deleted_ts IS NULL");
        $numrows->bindParam(':hostname', $hostname);
        $numrows->bindParam(':userid', $uid);
        $numrows->execute();
        $rowuser = $numrows->fetch();
        // Add database to Sentora user account...
        //self::ExecuteAddDB($uid, $rowuser['mu_id_pk'], $database);
        //runtime_hook::Execute('OnAfterCreateDatabaseUser');
        $stmt_remote_user = $zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_deleted_ts IS NULL");
        $stmt_remote_user->execute();
        $row_count_remote_user = $stmt_remote_user->rowCount();
        if($row_count_remote_user)
        {
         $in="command enable_disable_remote_mysql 1";
         $get_value=self::callCSFRemoteMysql($in);
        }
	self::$ok = true;
        return true;

    }

    static function CheckCreateForErrors($hostname,$userid,$username)
    {
        global $zdbh;
        // Check to make sure the user name is not blank before we go any further...
        if ($hostname == '') {
            self::$blank = true;
            return false;
        }
	if($hostname !="%")
	{
		if(!filter_var($hostname, FILTER_VALIDATE_IP))
		{
			self::$badIP = true;
		        return false;
		}
	}
        // Check to make sure the user name is not blank before we go any further...
        /*if ($username == 'root') {
            self::$rootabuse = true;
            return false;
        }
        // Check to make sure the user name is not blank before we go any further...
        if ($database == '') {
            self::$blank = true;
            return false;
        }*/
        // Check to make sure the user name is not a duplicate...
        $sql = "SELECT COUNT(*) FROM x_remote_mysql_hosts WHERE re_host_vc=:hostname AND re_acc_fk=:userid  AND re_deleted_ts IS NULL";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':hostname', $hostname);
	$numrows->bindParam(':userid', $userid);
        if ($numrows->execute()) {
            if ($numrows->fetchColumn() <> 0) {
                self::$alreadyexists = true;
                return false;
            }
        }
        // Check to make sure the user name is not a duplicate (checks actual mysql table)...
        $sql = "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = :username AND host = :hostname)";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':username', $username);
	$numrows->bindParam(':hostname', $hostname);
        if ($numrows->execute()) {
            if ($numrows->fetchColumn() <> 0) {
                self::$alreadyexists = true;
                return false;
            }
        }
        // Check for invalid username
        /*if (!self::IsValidUserName($username)) {
            self::$badname = true;
            return false;
        }*/
        // Check for invalid IP address
        if ($hostname != "localhost" && strtolower($hostname) != "localhost" && $hostname != "%") {
            if (!sys_monitoring::IsAnyValidIP($hostname)) {
                self::$badIP = true;
                return false;
            }
        }
        return true;
    }

    static function CheckAddForErrors($userid, $database)
    {
        global $zdbh;
        // Check to make sure the database isnt already added...
        //$result = $zdbh->query("SELECT * FROM x_mysql_dbmap WHERE mm_database_fk=" . $database . " AND mm_user_fk=" . $userid . "")->fetch();
        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_dbmap WHERE mm_database_fk=:database AND mm_user_fk=:userid");
        $numrows->bindParam(':database', $database);
        $numrows->bindParam(':userid', $userid);
        $numrows->execute();
        $result = $numrows->fetch();
        if ($result) {
            self::$dbalreadyadded = true;
            return false;
        }
        return true;
    }

    static function ExecuteDeleteUser($re_id_pk)
    {

        global $zdbh;
        $numrows = $zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_id_pk=:re_id_pk AND re_deleted_ts IS NULL");
        $numrows->bindParam(':re_id_pk', $re_id_pk);
        $numrows->execute();
        $rowuser = $numrows->fetch();
        $get_host=$rowuser['re_host_vc'];
        $currentuser = ctrl_users::GetUserDetail();
        $uid = $currentuser['userid'];
        $numrows_user = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_acc_fk=:myuserid AND mu_deleted_ts IS NULL");
        $numrows_user->bindParam(':myuserid', $uid);
        $numrows_user->execute();
        while($rowuser = $numrows_user->fetch())
        {
            
            $mu_name_vc = $zdbh->mysqlRealEscapeString($rowuser['mu_name_vc']);
            $sql_drop = $zdbh->prepare("DROP USER '".$mu_name_vc."'@'".$get_host."';");
            $sql_drop->execute();
            $sql_flush = $zdbh->prepare("FLUSH PRIVILEGES");
            $sql_flush->execute();
        }
	$client_ip = self::get_client_ip();
	$sql = $zdbh->prepare("UPDATE x_remote_mysql_hosts SET re_deleted_ts = :time, ip_deleted = :client_ip WHERE re_id_pk = :re_id_pk");
        $time = time();
        $sql->bindParam(':time', $time);
	$sql->bindParam(':client_ip', $client_ip);
        $sql->bindParam(':re_id_pk', $re_id_pk);
        $sql->execute();
        //runtime_hook::Execute('OnAfterDeleteDatabaseUser');
	$stmt_remote_user = $zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_deleted_ts IS NULL");
        $stmt_remote_user->execute();
        $row_count_remote_user = $stmt_remote_user->rowCount();
        if(!$row_count_remote_user)
        {
         $in="command enable_disable_remote_mysql 0";
         $get_value=self::callCSFRemoteMysql($in);
        }
	self::$ok = true;
        return true;
    }
    static function get_client_ip() {
        $ipaddress = '';
        if (isset($_SERVER['HTTP_CLIENT_IP']))
                $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
        else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
                $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        else if(isset($_SERVER['HTTP_X_FORWARDED']))
                $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
        else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
                $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
        else if(isset($_SERVER['HTTP_FORWARDED']))
                $ipaddress = $_SERVER['HTTP_FORWARDED'];
        else if(isset($_SERVER['REMOTE_ADDR']))
                $ipaddress = $_SERVER['REMOTE_ADDR'];
        else
                $ipaddress = 'UNKNOWN';
        return $ipaddress;
    }

    static function ExecuteAddDB($uid, $myuserid, $dbid)
    {
        global $zdbh;
        if (fs_director::CheckForEmptyValue(self::CheckAddForErrors($myuserid, $dbid))) {
            return false;
        }
        if (!isset($uid) || $uid == NULL || $uid == '') {
            $currentuser = ctrl_users::GetUserDetail();
            $uid = $currentuser['userid'];
        }
        runtime_hook::Execute('OnBeforeAddDatabaseAccess');
        //$rowdb = $zdbh->query("SELECT * FROM x_mysql_databases WHERE my_id_pk=" . $dbid . " AND my_deleted_ts IS NULL")->fetch();
        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_id_pk=:dbid AND my_deleted_ts IS NULL");
        $numrows->bindParam(':dbid', $dbid);
        $numrows->execute();
        $rowdb = $numrows->fetch();

        //$rowuser = $zdbh->query("SELECT * FROM x_mysql_users WHERE mu_id_pk=" . $myuserid . " AND mu_deleted_ts IS NULL")->fetch();
        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_id_pk=:myuserid AND mu_deleted_ts IS NULL");
        $numrows->bindParam(':myuserid', $myuserid);
        $numrows->execute();
        $rowuser = $numrows->fetch();

        $my_name_vc = $zdbh->mysqlRealEscapeString($rowdb['my_name_vc']);
        $mu_name_vc = $zdbh->mysqlRealEscapeString($rowuser['mu_name_vc']);
        $mu_access_vc = $zdbh->mysqlRealEscapeString($rowuser['mu_access_vc']);
        $sql = $zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`.* TO `$mu_name_vc`@`$mu_access_vc`");
        $sql->bindParam(':my_name_vc', $rowdb['my_name_vc'], PDO::PARAM_STR);
        $sql->bindParam(':mu_name_vc', $rowuser['mu_name_vc'], PDO::PARAM_STR);
        $sql->bindParam(':mu_access_vc', $rowuser['mu_access_vc'], PDO::PARAM_STR);
        $sql->execute();
        $sql = $zdbh->prepare("FLUSH PRIVILEGES");
        $sql->execute();
        $sql2 = $zdbh->prepare("
			INSERT INTO x_mysql_dbmap (
							mm_acc_fk,
							mm_user_fk,
							mm_database_fk) VALUES (
							:uid,
							:myuserid,
							:dbid
                                                        )");
        $sql2->bindParam(':uid', $uid);
        $sql2->bindParam(':myuserid', $myuserid);
        $sql2->bindParam(':dbid', $dbid);
        $sql2->execute();
        runtime_hook::Execute('OnAfterAddDatabaseAccess');
        self::$ok = true;
        
        
        if(isset($_SESSION['cgs_user'])  && isset($_SESSION['cgs_id']) && array_key_exists("cgs_user",$_SESSION) && array_key_exists("cgs_id",$_SESSION) )
    {
  
  
   if($_SESSION['cgs_pk_id'] == $uid)
        {
            $user_name = $_SESSION['cgs_user'];
            $sql2 = $zdbh->prepare("select  my_name_vc  from x_mysql_databases where my_acc_fk =:newid  and my_deleted_ts IS NULL");
            $sql2->bindParam(':newid',$uid);
            $sql2->execute();
            $row_count3 = $sql2->rowCount();
            if($row_count3 >0)
            {

                while($rows=$sql2->fetch())
                {
               
                $my_name_vc = $rows['my_name_vc'];
                    try{
                    $sql = $zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`. * TO :username@'localhost' ");
                    $sql->bindParam(':username', $user_name);
                    $sql->execute();
                    
                    $sql = $zdbh->prepare("FLUSH PRIVILEGES");
                    $sql->execute();
                    }
                    catch(Exception $e) { }
                }
            }
        }
    }
        return true;
    }

    static function ExecuteRemoveDB($myuserid, $mapid)
    { // <-- mmid = dbmaps
        global $zdbh;
        runtime_hook::Execute('OnBeforeRemoveDatabaseAccess');

        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_dbmap WHERE mm_id_pk=:mapid");
        $numrows->bindParam(':mapid', $mapid);
        $numrows->execute();
        $rowdbmap = $numrows->fetch();

        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_id_pk=:mm_database_fk AND my_deleted_ts IS NULL");
        $numrows->bindParam(':mm_database_fk', $rowdbmap['mm_database_fk']);
        $numrows->execute();
        $rowdb = $numrows->fetch();

        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_id_pk=:myuserid AND mu_deleted_ts IS NULL");
        $numrows->bindParam(':myuserid', $myuserid);
        $numrows->execute();
        $rowuser = $numrows->fetch();

        $sql = $zdbh->prepare("REVOKE ALL PRIVILEGES ON `" . $rowdb['my_name_vc'] . "`.* FROM '" . $rowuser['mu_name_vc'] . "'@'" . $rowuser['mu_access_vc'] . "'");
        $sql->execute();

        $sql = $zdbh->prepare("FLUSH PRIVILEGES");
        $sql->execute();

        $sql = $zdbh->prepare("DELETE FROM x_mysql_dbmap WHERE mm_id_pk=:mapid AND mm_user_fk=:myuserid");
        $sql->bindParam(':mapid', $mapid);
        $sql->bindParam(':myuserid', $myuserid);
        $sql->execute();

        runtime_hook::Execute('OnAfterRemoveDatabaseAccess');
        self::$ok = true;
        return true;
    }

    static function ExecuteResetPassword($myuserid, $password)
    {
        global $zdbh;
        global $controller;
        runtime_hook::Execute('OnBeforeResetDatabasePassword');
        //$rowuser = $zdbh->query("SELECT * FROM x_mysql_users WHERE mu_id_pk=" . $myuserid . " AND mu_deleted_ts IS NULL")->fetch();
        $numrows = $zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_id_pk=:myuserid AND mu_deleted_ts IS NULL");
        $numrows->bindParam(':myuserid', $myuserid);
        $numrows->execute();
        $rowuser = $numrows->fetch();

	$currentuser = ctrl_users::GetUserDetail();
        $uid = $currentuser['userid'];	
	$query = "SELECT * from x_password_strength WHERE ps_user_vc='$uid'";
        $res = $zdbh->prepare($query);
        $res->execute();
        $results = $res->rowCount();
         if($results == 0)
         {
         
         if (fs_director::CheckForEmptyValue(self::CheckPasswordForErrors($password))) {
            return false;
         }

        $sql = "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = :mu_name_vc)";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':mu_name_vc', $rowuser['mu_name_vc']);
        if ($numrows->execute()) {
            if ($numrows->fetchColumn() <> 0) {
                // Set MySQL password for new user...
                $sql = $zdbh->prepare("SET PASSWORD FOR :mu_name_vc@:mu_access_vc=PASSWORD(:password)");
                $sql->bindParam(':mu_name_vc', $rowuser['mu_name_vc']);
                $sql->bindParam(':mu_access_vc', $rowuser['mu_access_vc']);
                $sql->bindParam(':password', $password);
                $sql->execute();
                $sql = $zdbh->prepare("FLUSH PRIVILEGES");
                $sql->execute();
                $sql = $zdbh->prepare("UPDATE x_mysql_users SET mu_pass_vc=:password WHERE mu_id_pk=:myuserid");
                $sql->bindParam(':password', $password);
                $sql->bindParam(':myuserid', $myuserid);
                $sql->execute();
            }
        }
        runtime_hook::Execute('OnAfterResetDatabasePassword');
        self::$ok = true;
        return true;

         }

	 while($rows=$res->fetch())
	{	   
		
          $values= ($rows['ps_muenabled_in'] == 0 ) ? "CheckPasswordForErrors" : "";
         
        
        // $values= ($rows['ps_muenabled_in'] == 0 ) ? "CheckPasswordForErrors" : "";
       
       	if($values == "CheckPasswordForErrors")
	{
        if (fs_director::CheckForEmptyValue(self::$values($password))) {
            return false;
        }
		               
        /* New Code Start */

		/*if (!preg_match_all('$\S*(?=\S{9,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W])\S*$', $password)) {
                self::$badpass = true;
            }*/

        $sql = "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = :mu_name_vc)";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':mu_name_vc', $rowuser['mu_name_vc']);
        if ($numrows->execute()) {
            if ($numrows->fetchColumn() <> 0) {
                // Set MySQL password for new user...
                $sql = $zdbh->prepare("SET PASSWORD FOR :mu_name_vc@:mu_access_vc=PASSWORD(:password)");
                $sql->bindParam(':mu_name_vc', $rowuser['mu_name_vc']);
                $sql->bindParam(':mu_access_vc', $rowuser['mu_access_vc']);
                $sql->bindParam(':password', $password);
                $sql->execute();
                $sql = $zdbh->prepare("FLUSH PRIVILEGES");
                $sql->execute();
                $sql = $zdbh->prepare("UPDATE x_mysql_users SET mu_pass_vc=:password WHERE mu_id_pk=:myuserid");
                $sql->bindParam(':password', $password);
                $sql->bindParam(':myuserid', $myuserid);
                $sql->execute();
            }
        }
        runtime_hook::Execute('OnAfterResetDatabasePassword');
        self::$ok = true;
        return true;

		
}
       else
       if($values == "")
       {
        $sql = "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = :mu_name_vc)";
        $numrows = $zdbh->prepare($sql);
        $numrows->bindParam(':mu_name_vc', $rowuser['mu_name_vc']);
        if ($numrows->execute()) {
            if ($numrows->fetchColumn() <> 0) {
                // Set MySQL password for new user...
                $sql = $zdbh->prepare("SET PASSWORD FOR :mu_name_vc@:mu_access_vc=PASSWORD(:password)");
                $sql->bindParam(':mu_name_vc', $rowuser['mu_name_vc']);
                $sql->bindParam(':mu_access_vc', $rowuser['mu_access_vc']);
                $sql->bindParam(':password', $password);
                $sql->execute();
                $sql = $zdbh->prepare("FLUSH PRIVILEGES");
                $sql->execute();
                $sql = $zdbh->prepare("UPDATE x_mysql_users SET mu_pass_vc=:password WHERE mu_id_pk=:myuserid");
                $sql->bindParam(':password', $password);
                $sql->bindParam(':myuserid', $myuserid);
                $sql->execute();
            }
        }
        runtime_hook::Execute('OnAfterResetDatabasePassword');
        self::$ok = true;
        return true;

       }

}
    }

    static function CheckPasswordForErrors($password)
    {
        if (!self::IsValidPassword($password)) {
            self::$badpass = true;
            return false;
        }
        return true;
    }

    static function IsValidUserName($username)
    {
        if (!preg_match('/^[a-z\d\w][a-z\d\w-]{0,62}$/i', $username) || preg_match('/-$/', $username)) {
            return false;
        } else {
            if (strlen($username) < 17) {
                // Enforce the MySQL username limit! (http://dev.mysql.com/doc/refman/4.1/en/user-names.html)
                return true;
            }
            return false;
        }
    }

    static function IsValidPassword($password)
    {
       if (!preg_match_all('$\S*(?=\S{9,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W])\S*$', $password)) {
                return false;
        }
        return true;
    }

    /**
     * End 'worker' methods.
     */

    /**
     * Webinterface sudo methods.
     */
    static function doCreateHost()
    {
        global $controller;
        runtime_csfr::Protect();
        $currentuser = ctrl_users::GetUserDetail();
        $formvars = $controller->GetAllControllerRequests('FORM');
        /* ($formvars['inAccess'] == 1) {
            $access = "localhost";
        } else {
            $access = $formvars['inAccessIP'];
        }*/
        if (self::ExecuteCreateHost($currentuser['userid'], $formvars['inHostName'], $formvars['inprefix']))
            return true;
        return false;
    }

    static function doEditHost()
    {
        global $controller;
        runtime_csfr::Protect();
        $currentuser = ctrl_users::GetUserDetail();
        $formvars = $controller->GetAllControllerRequests('FORM');
        foreach (self::ListUsers($currentuser['userid']) as $row) {
            if (isset($formvars['inDelete_' . $row['hostid'] . ''])) {
                header("location: ./?module=" . $controller->GetCurrentModule() . "&show=Delete&other=" . $row['hostid'] . "");
                exit;
            }
            /*if (isset($formvars['inEdit_' . $row['userid'] . ''])) {
                header("location: ./?module=" . $controller->GetCurrentModule() . "&show=Edit&other=" . $row['userid'] . "");
                exit;
            }*/
        }
        return;
    }

    static function doAddDB()
    {
        global $controller;
        runtime_csfr::Protect();
        $currentuser = ctrl_users::GetUserDetail();
        $formvars = $controller->GetAllControllerRequests('FORM');
        if (self::ExecuteAddDB($currentuser['userid'], $formvars['inUser'], $formvars['inDatabase']))
            return true;
        return false;
    }

    static function doRemoveDB()
    {
        global $controller;
        runtime_csfr::Protect();
        $currentuser = ctrl_users::GetUserDetail();
        $formvars = $controller->GetAllControllerRequests('FORM');
        foreach (self::ListUserDatabases($formvars['inUser']) as $row) {
            if (isset($formvars['inRemove_' . $row['mmid'] . ''])) {
                if (self::ExecuteRemoveDB($formvars['inUser'], $formvars['inRemove_' . $row['mmid'] . ''])) {
                    return true;
                } else {
                    return false;
                }
            }
        }
        return false;
    }

    static function doConfirmDeleteUser()
    {
        global $controller;
        runtime_csfr::Protect();
        $formvars = $controller->GetAllControllerRequests('FORM');
        if (self::ExecuteDeleteUser($formvars['inDelete']))
            return true;
        return false;
    }

    static function doResetPW()
    {
        global $controller;
        runtime_csfr::Protect();
        $formvars = $controller->GetAllControllerRequests('FORM');
        if (self::ExecuteResetPassword($formvars['inUser'], $formvars['inResetPW']))
            return true;
        return false;
    }

    static function getUserList()
    {
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        return self::ListUsers($currentuser['userid']);
    }

    static function getDatabaseList()
    {
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        return self::ListDatabases($currentuser['userid']);
    }

    static function getUserDatabaseList()
    {
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        return self::ListUserDatabases($controller->GetControllerRequest('URL', 'other'));
    }

    static function getisDeleteUser()
    {
        global $controller;
        $urlvars = $controller->GetAllControllerRequests('URL');
        if ((isset($urlvars['show'])) && ($urlvars['show'] == "Delete"))
            return true;
        return false;
    }

    static function getisEditUser()
    {
        global $controller;
        $urlvars = $controller->GetAllControllerRequests('URL');
        if ((isset($urlvars['show'])) && ($urlvars['show'] == "Edit"))
            return true;
        return false;
    }

    static function getisCreateUser()
    {
        global $controller;
        $urlvars = $controller->GetAllControllerRequests('URL');
        if (!isset($urlvars['show']))
            return true;
        return false;
    }

    static function getCurrentUserName()
    {
        global $zdbh;
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        $uid = $currentuser['userid'];
        $query = "SELECT * from x_database_settings WHERE ds_user_vc='$uid'";
        $res = $zdbh->prepare($query);
        $res->execute();
        $results = $res->rowCount();
        $val = "";
        if($results == 0)
        {
          return $currentuser['username']."_";
        }
        else
        if($results > 0)
        {
           while($rows=$res->fetch())
           {
                if($rows['ds_enabled_in'] == 0)
                {
                  return $currentuser['username']."_";
                }
                else if($rows['ds_enabled_in'] == 1)
                {
                  return $val;
                }
           }
        }
    }

    static function getCurrentID()
    {
        global $zdbh;
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        $uid = $currentuser['userid'];
        $query = "SELECT * from x_password_strength WHERE ps_user_vc='$uid'";
        $res = $zdbh->prepare($query);
        $res->execute();
        $results = $res->rowCount();
        $val = "";
        if($results == 0)
        {
	  return "input-password";
        }
        else
        if($results > 0)
        {
           while($rows=$res->fetch())
           {
                if($rows['ps_muenabled_in'] == 0)
                {
                  return "input-password";
                }
                else if($rows['ps_muenabled_in'] == 1)
                {
                  return $val;
                }
           }
        }
    }

    static function getGeneratePass()
    {
        global $zdbh;
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        $uid = $currentuser['userid'];
        $query = "SELECT * from x_password_strength WHERE ps_user_vc='$uid'";
        $res = $zdbh->prepare($query);
        $res->execute();
        $results = $res->rowCount();
        $val = "";
        if($results == 0)
        {
          return "Generate Password";
        }
        else
        if($results > 0)
        {
           while($rows=$res->fetch())
           {
                if($rows['ps_muenabled_in'] == 0)
                {
                  return "Generate Password";
                }
                else if($rows['ps_muenabled_in'] == 1)
                {
                  return $val;
                }
           }
        }
    }
    static function getEditCurrentUserName()
    {
        global $controller;
        if ($controller->GetControllerRequest('URL', 'other')) {
            $current = self::ListCurrentUser($controller->GetControllerRequest('URL', 'other'));
            return $current[0]['hostname'];
        } else {
            return "";
        }
    }

    static function getEditCurrentUserID()
    {
        global $controller;
        if ($controller->GetControllerRequest('URL', 'other')) {
            $current = self::ListCurrentUser($controller->GetControllerRequest('URL', 'other'));
            return $current[0]['hostid'];
        } else {
            return "";
        }
    }

    static function getcurrentnote()
    {
        global $zdbh;
        global $controller;
        $currentuser = ctrl_users::GetUserDetail();
        $uid = $currentuser['userid'];
        $query = "SELECT * from x_password_strength WHERE ps_user_vc='$uid'";
        $res = $zdbh->prepare($query);
        $res->execute();
        $results = $res->rowCount();
        $val = "";
        if($results == 0)
        {
          return true;
        }
        else
        if($results > 0)
        {
           while($rows=$res->fetch())
           {
                if($rows['ps_muenabled_in'] == 0)
                {
                  return true;
                }
                else if($rows['ps_muenabled_in'] == 1)
                {
                  return false;
                }
           }
        }
    }

    static function getMysqlUsagepChart()
    {
        return '<img src="' . ui_tpl_assetfolderpath::Template() . 'img/misc/unlimited.png" alt="' . ui_language::translate('Unlimited') . '"/>';
    }

    static function getResult()
    {
        if (!fs_director::CheckForEmptyValue(self::$blank)) {
            return ui_sysmessage::shout(ui_language::translate("You need to specify a HopstIP or % to create Remote MySQL user."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$rootabuse)) {
            return ui_sysmessage::shout(ui_language::translate("You cannot create a user named 'root'! This attempt has been logged and the system administrator notified!."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$alreadyexists)) {
            return ui_sysmessage::shout(ui_language::translate("A MySQL Host with that IP already appears to exsist."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$badname)) {
            return ui_sysmessage::shout(ui_language::translate("Your MySQL Host name is not valid. Please enter a valid MySQL Host name."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$badpass)) {
            return ui_sysmessage::shout(ui_language::translate("Your MySQL password is not valid. Enter Valid characters of length 9 with atleast 1 uppercase,lowercase,number,special character."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$badIP)) {
            return ui_sysmessage::shout(ui_language::translate("The IP address is not valid. Please enter a valid IP address."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$dbalreadyadded)) {
            return ui_sysmessage::shout(ui_language::translate("That Hostname has already been added to this user."), "zannounceerror");
        }
        if (!fs_director::CheckForEmptyValue(self::$ok)) {
            return ui_sysmessage::shout(ui_language::translate("Changes to your Remote MySQL Host have been saved successfully!"), "zannounceok");
        }
        return;
    }

    /**
     * Webinterface sudo methods.
     */
}