| | |
| | | |
| | | } |
| | | |
| | | function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = '', $user_read_only = false) { |
| | | function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = '', $user_access_mode = 'rw') { |
| | | global $app; |
| | | |
| | | |
| | | if(!$user_access_mode) $user_access_mode = 'rw'; |
| | | $action = strtoupper($action); |
| | | |
| | | // set to all hosts if none given |
| | |
| | | $result->free(); |
| | | } |
| | | } |
| | | |
| | | $app->log("Calling $action for $database_name with access $user_access_mode and hosts " . implode(', ', $host_list), LOGLEVEL_DEBUG); |
| | | |
| | | // loop through hostlist |
| | | foreach($host_list as $db_host) { |
| | | $db_host = trim($db_host); |
| | |
| | | $valid = true; |
| | | if($db_host == '%' || $db_host == 'localhost') { |
| | | $valid = true; |
| | | // } elseif(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) { |
| | | } elseif(preg_match("/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/", $db_host)) { |
| | | $groups = explode('.', $db_host); |
| | | foreach($groups as $group){ |
| | |
| | | $valid = false; |
| | | } |
| | | |
| | | if($valid == false) continue; |
| | | |
| | | if($valid == false) { |
| | | $app->log("Invalid host " . $db_host . " for GRANT to " . $database_name, LOGLEVEL_DEBUG); |
| | | continue; |
| | | } |
| | | |
| | | $grants = 'ALL PRIVILEGES'; |
| | | if($user_access_mode == 'r') $grants = 'SELECT'; |
| | | elseif($user_access_mode == 'rd') $grants = 'SELECT, DELETE, ALTER, DROP'; |
| | | |
| | | if($action == 'GRANT') { |
| | | if(!$link->query("GRANT " . ($user_read_only ? "SELECT" : "ALL") . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."';")) $success = false; |
| | | $app->log("GRANT " . ($user_read_only ? "SELECT" : "ALL") . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."'; success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); |
| | | if($user_access_mode == 'r' || $user_access_mode == 'rd') { |
| | | if(!$link->query("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; |
| | | $app->log("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); |
| | | $success = true; |
| | | } |
| | | |
| | | if(!$link->query("GRANT " . $grants . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."'")) $success = false; |
| | | $app->log("GRANT " . $grants . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); |
| | | } elseif($action == 'REVOKE') { |
| | | if(!$link->query("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."';")) $success = false; |
| | | if(!$link->query("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; |
| | | } elseif($action == 'DROP') { |
| | | if(!$link->query("DROP USER '".$link->escape_string($database_user)."'@'$db_host';")) $success = false; |
| | | if(!$link->query("DROP USER '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; |
| | | } elseif($action == 'RENAME') { |
| | | if(!$link->query("RENAME USER '".$link->escape_string($database_user)."'@'$db_host' TO '".$link->escape_string($database_rename_user)."'@'$db_host'")) $success = false; |
| | | } elseif($action == 'PASSWORD') { |
| | | if(!$link->query("SET PASSWORD FOR '".$link->escape_string($database_user)."'@'$db_host' = '".$link->escape_string($database_password)."';")) $success = false; |
| | | if(!$link->query("SET PASSWORD FOR '".$link->escape_string($database_user)."'@'$db_host' = '".$link->escape_string($database_password)."'")) $success = false; |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | if($db_user) { |
| | | if($db_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $host_list, $link); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $host_list, $link, '', ($data['new']['quota_exceeded'] == 'y' ? 'rd' : 'rw')); |
| | | } |
| | | if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) { |
| | | if($db_ro_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', true); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', 'r'); |
| | | } |
| | | |
| | | } |
| | | |
| | | $link->query('FLUSH PRIVILEGES;'); |
| | | $link->close(); |
| | | } |
| | | } |
| | |
| | | $app->log('Unable to connect to the database: '.$link->connect_error, LOGLEVEL_ERROR); |
| | | return; |
| | | } |
| | | |
| | | |
| | | // get the users for this database |
| | | $db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = ?", $data['new']['database_user_id']); |
| | | $old_db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = ?", $data['old']['database_user_id']); |
| | |
| | | if($data['new']['active'] == 'y') { |
| | | if($db_user) { |
| | | if($db_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $host_list, $link); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $host_list, $link, '', ($data['new']['quota_exceeded'] == 'y' ? 'rd' : 'rw')); |
| | | } |
| | | if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) { |
| | | if($db_ro_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', true); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', 'r'); |
| | | } |
| | | } else if($data['new']['active'] == 'n' && $data['old']['active'] == 'y') { // revoke database user, if inactive |
| | | if($old_db_user) { |
| | | if($old_db_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | // Find out users to drop and users to revoke |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | |
| | | |
| | | //$this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $old_host_list, $link); |
| | | //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $old_host_list, $link); |
| | | } |
| | | |
| | | } elseif($data['new']['active'] == 'n' && $data['old']['active'] == 'y') { // revoke database user, if inactive |
| | | if($old_db_user) { |
| | | if($old_db_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | // Find out users to drop and users to revoke |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | } |
| | | if($old_db_ro_user && $data['old']['database_user_id'] != $data['old']['database_ro_user_id']) { |
| | | if($old_db_ro_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | // Find out users to drop and users to revoke |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_ro_user_id'], $old_host_list); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | |
| | | //$this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $old_host_list, $link); |
| | | //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $old_host_list, $link); |
| | | } |
| | | } |
| | | // Database is not active, so stop processing here |
| | | $link->query('FLUSH PRIVILEGES;'); |
| | | $link->close(); |
| | | return; |
| | | } |
| | | if($old_db_ro_user && $data['old']['database_user_id'] != $data['old']['database_ro_user_id']) { |
| | | if($old_db_ro_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | // Find out users to drop and users to revoke |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_ro_user_id'], $old_host_list); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | } |
| | | } |
| | | // Database is not active, so stop processing here |
| | | $link->close(); |
| | | return; |
| | | } |
| | | |
| | | //* selected Users have changed |
| | | if($data['new']['database_user_id'] != $data['old']['database_user_id']) { |
| | |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | |
| | | //$this->process_host_list('DROP', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link); |
| | | //$this->process_host_list('REVOKE', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link); |
| | | } |
| | | } |
| | | } |
| | | if($db_user) { |
| | | if($db_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $host_list, $link); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $host_list, $link, '', ($data['new']['quota_exceeded'] == 'y' ? 'rd' : 'rw')); |
| | | } |
| | | } |
| | | if($data['new']['database_ro_user_id'] != $data['old']['database_ro_user_id']) { |
| | |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | |
| | | //$this->process_host_list('DROP', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link); |
| | | //$this->process_host_list('REVOKE', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link); |
| | | } |
| | | } |
| | | } |
| | | if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) { |
| | | if($db_ro_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', true); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', 'r'); |
| | | } |
| | | } |
| | | |
| | | //* Remote access option has changed. |
| | | if($data['new']['remote_access'] != $data['old']['remote_access']) { |
| | | |
| | | //* revoke old priveliges |
| | | //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link); |
| | | |
| | | //* set new priveliges |
| | | if($data['new']['remote_access'] == 'y') { |
| | |
| | | if($db_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['new']['remote_ips'], $link); |
| | | $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['new']['remote_ips'], $link, '', ($data['new']['quota_exceeded'] == 'y' ? 'rd' : 'rw')); |
| | | } |
| | | } |
| | | if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) { |
| | | if($db_ro_user['database_user'] == 'root') $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['new']['remote_ips'], $link, '', true); |
| | | else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['new']['remote_ips'], $link, '', 'r'); |
| | | } |
| | | } else { |
| | | if($old_db_user) { |
| | |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $data['old']['remote_ips']); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | |
| | | //$this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['old']['remote_ips'], $link); |
| | | //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['old']['remote_ips'], $link); |
| | | } |
| | | } |
| | | if($old_db_ro_user && $data['old']['database_user_id'] != $data['old']['database_ro_user_id']) { |
| | |
| | | $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_ro_user_id'], $data['old']['remote_ips']); |
| | | if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link); |
| | | if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link); |
| | | |
| | | //$this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['old']['remote_ips'], $link); |
| | | //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['old']['remote_ips'], $link); |
| | | } |
| | | } |
| | | } |
| | |
| | | if($db_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['new']['remote_ips'], $link); |
| | | $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['new']['remote_ips'], $link, '', ($data['new']['quota_exceeded'] == 'y' ? 'rd' : 'rw')); |
| | | } |
| | | } |
| | | |
| | |
| | | if($db_ro_user['database_user'] == 'root'){ |
| | | $app->log('User root not allowed for Client databases', LOGLEVEL_WARNING); |
| | | } else { |
| | | $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['new']['remote_ips'], $link, '', true); |
| | | $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['new']['remote_ips'], $link, '', 'r'); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | $link->query('FLUSH PRIVILEGES;'); |
| | | $link->close(); |
| | | } |
| | | |
| | |
| | | $app->log('Error while dropping MySQL database: '.$data['old']['database_name'].' '.$link->error, LOGLEVEL_WARNING); |
| | | } |
| | | |
| | | $link->query('FLUSH PRIVILEGES;'); |
| | | $link->close(); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | $link->query('FLUSH PRIVILEGES;'); |
| | | $link->close(); |
| | | |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | $link->query('FLUSH PRIVILEGES;'); |
| | | $link->close(); |
| | | } |
| | | |