GIF89a;
Direktori : /home/serb/www/freichat/installation/ |
Current File : /home/serb/www/freichat/installation/smart_ajax.php |
<?php session_start(); /* Make me secure */ if (!isset($_SESSION['FREIX']) || $_SESSION['FREIX'] != 'authenticated') { header("Location:index.php"); exit; } /* Now i am secure */ require_once '../hardcode.php'; class Smart { public static $connected = false; public static $connection; public static $driver; public static $debug; private $db; private $db_prefix; public function __construct() { global $connected; global $db_prefix; $this->db_prefix = $db_prefix; if ($connected == 'YES') { global $dsn, $db_user, $db_pass; $this->db = self::get_connection($dsn, $db_user, $db_pass); //will return false on failed connection } else { $this->db = false; //not yet connected } } function connect($host, $client_db_name, $username, $password, $port, $driver = 'mysql') { if (!extension_loaded('PDO') || !extension_loaded('pdo_'.$driver)) { return array("pdo_".$driver." driver is not installed or enabled", false); } $keys = array( 'mysql' => array( "host" => "host", "dbname" => "dbname", "port" => ";port=" ), 'sqlsrv' => array( "host" => "Server", "dbname" => "Database", "port" => "," ) ); if (strpos($host, "/") !== FALSE) { if (strpos($host, ":") !== FALSE) { //localhost:socket_dir $parts = explode(":", $host); $host = $keys[$driver]["host"] . "=" . $parts[0]; $unix_socket = ";unix_socket=" . $parts[1]; } else { //socket_dir $unix_socket = "unix_socket=$host"; $host = ''; } } else { //clean host $unix_socket = ''; $host = $keys[$driver]["host"] . "=$host"; } $error = false; if ($port != '') { $port = $keys[$driver]["port"]."$port;"; } else { $port = ";"; } $dbname = $keys[$driver]["dbname"] . "="; $dsn = "$driver:$host$unix_socket$port$dbname$client_db_name"; try { $dbh = new PDO($dsn, $username, $password, array( PDO::ATTR_PERSISTENT => false )); } catch (PDOException $e) { //self::freichat_debug("unable to connect to database. Error : " . $e->getMessage()); $error = $e->getMessage(); } if (!$error) { return array($dsn, true); } $dbh = null; //reset connection; //if in localhost , host cannot be localhost for unix $_error = false; $host = $keys[$driver]["host"] . "=127.0.0.1"; $dsn = "$driver:$host$unix_socket$port$dbname$client_db_name"; try { $dbh = new PDO($dsn, $username, $password, array( PDO::ATTR_PERSISTENT => false )); } catch (PDOException $e) { //self::freichat_debug("unable to connect to database. Error : " . $e->getMessage()); $_error = $e->getMessage(); } if (!$_error) { return array($dsn, true); } return array($error, false); } public static function get_connection($dsn, $db_user, $db_pass) { if (self::$connected == true) { return self::$connection; } try { self::$connection = new PDO($dsn, $db_user, $db_pass, array( //check for side effects //changed to false in v8.7 //due to inconsistencies while testing in IIS 8.0 //problem: 500 internal server error PDO::ATTR_PERSISTENT => false //make a persistent connection )); } catch (PDOException $e) { self::freichat_debug("unable to connect to database. Error : " . $e->getMessage()); //die(); //do not die return false; //instead return false } self::freichat_debug("connected to database successfully"); self::$connection->exec("SET CHARACTER SET utf8"); self::$connection->exec("SET NAMES utf8"); self::$connected = true; return self::$connection; } private static function freichat_debug($message) { if (self::$debug == true) { $dbgfile = fopen("../freixlog.log", "a"); fwrite($dbgfile, "\n" . date("F j, Y, g:i a") . ": " . $message . "\n"); } } public function update_db() { $db = $_POST['db']; //format port acc to PDO if ($db['port'] == '' || $db['port'] == null) { $db['port'] = ''; } else { $db['port'] = 'port=' . $db['port'] . ';'; } $conn = $this->connect($db['host'], $db['name'], $db['user'], $db['pass'], $db['port'], $db['driver']); if (!$conn[1]) { echo 'database connection failed ERROR: ' . $conn[0]; // :( exit; } if (!is_writable("../hardcode.php")) { echo 'freichat/hardcode.php not writable'; // :( exit; } if (isset($_POST['lang']) && $_POST['lang'] == "asp") { $use_cookie = 'freichat_user'; } else { $use_cookie = 'false'; } //Evertything is fine :) @file_put_contents("../cache/perm/request.001", "0"); $data = "<?php /* Data base details */ \$dsn='$conn[0]'; //DSN \$db_user='" . $db['user'] . "'; //DB username \$db_pass='" . $db['pass'] . "'; //DB password \$driver='Custom'; //Integration driver \$db_prefix='" . $db['prefix'] . "'; //prefix used for tables in database \$uid='" . uniqid() . "'; //Any random unique number \$connected='YES'; //only for custom installation \$PATH = '" . $_POST['PATH'] . "/'; // Use this only if you have placed the freichat folder somewhere else \$installed=false; //make it false if you want to reinstall freichat \$admin_pswd='" . $_POST['admin_pass'] . "'; //backend password \$debug = false; \$custom_error_handling='YES'; // used during custom installation \$use_cookie='" . $use_cookie . "'; /* email plugin */ \$smtp_username = ''; \$smtp_password = ''; \$force_load_jquery = 'NO'; /* Custom driver */ \$usertable='login'; //specifies the name of the table in which your user information is stored. \$row_username='root'; //specifies the name of the field in which the user's name/display name is stored. \$row_userid='loginid'; //specifies the name of the field in which the user's id is stored (usually id or userid) \$avatar_table_name='members'; //specifies the table where avatar information is stored \$avatar_column_name='avatar'; //specifies the column name where the avatar url is stored \$avatar_userid='id'; //specifies the userid to the user to get the user's avatar \$avatar_reference_user='id'; //specifies the reference to the user to get the user's avatar in user table \$avatar_reference_avatar='id'; //specifies the reference to the user to get the user's avatar in avatar \$avatar_field_name=\$avatar_column_name; //to avoid unnecessary file changes , *do not change "; @file_put_contents('../hardcode.php', $data); echo 'written'; //mission successfull :) } public function generate_report() { //generate 4 digit unique number $digits = 4; $random = str_pad(rand(0, pow(10, $digits) - 1), $digits, '0', STR_PAD_LEFT); $filename = '../client/plugins/upload/upload/report' . $random . '.html'; $data = $_GET['error_report']; @file_put_contents($filename, $data); echo $filename; } /* Removes table prefix if present */ private function tolerate_prefix($tbl_name) { //make it tolerant if ($this->db_prefix != "") { //dont want a missing delimiter error if (strpos($tbl_name, $this->db_prefix) !== FALSE) { //not present $tbl_name = str_replace($this->db_prefix, "", $tbl_name); } } return $tbl_name; } public function test_table_info() { $tbl_name = $_POST['table']; $tbl_user = $_POST['name']; $tbl_id = $_POST['id']; global $db_prefix; $tbl_name = $this->tolerate_prefix($tbl_name); //limit 1 to save resources $query = "SELECT $tbl_user,$tbl_id FROM $db_prefix$tbl_name LIMIT 1"; $res = $this->db->query($query); //false on failure if ($res) { $cnts = file_get_contents("../hardcode.php"); //store table name without prefix $cnts = str_replace("\$usertable='login';", "\$usertable='" . $tbl_name . "';", $cnts); $cnts = str_replace("\$row_username='root';", "\$row_username='" . $tbl_user . "';", $cnts); $cnts = str_replace("\$row_userid='loginid';", "\$row_userid='" . $tbl_id . "';", $cnts); $cnts = str_replace("\$custom_error_handling='YES';", "\$custom_error_handling='NO';", $cnts); @file_put_contents("../hardcode.php", $cnts); echo 'correct'; } } /* * * Below three functions taken directly from phpBB :) * */ // remove_comments will strip the sql comment lines out of an uploaded sql file // specifically for mssql and postgres type files in the install.... private function remove_comments(&$output) { $lines = explode("\n", $output); $output = ""; // try to keep mem. use down $linecount = count($lines); $in_comment = false; for ($i = 0; $i < $linecount; $i++) { if (preg_match("/^\/\*/", preg_quote($lines[$i]))) { $in_comment = true; } if (!$in_comment) { $output .= $lines[$i] . "\n"; } if (preg_match("/\*\/$/", preg_quote($lines[$i]))) { $in_comment = false; } } unset($lines); return $output; } // // remove_remarks will strip the sql comment lines out of an uploaded sql file // private function remove_remarks($sql) { $lines = explode("\n", $sql); // try to keep mem. use down $sql = ""; $linecount = count($lines); $output = ""; for ($i = 0; $i < $linecount; $i++) { if (($i != ($linecount - 1)) || (strlen($lines[$i]) > 0)) { if (isset($lines[$i][0]) && $lines[$i][0] != "#") { $output .= $lines[$i] . "\n"; } else { $output .= "\n"; } // Trading a bit of speed for lower mem. use here. $lines[$i] = ""; } } return $output; } // // split_sql_file will split an uploaded sql file into single sql statements. // Note: expects trim() to have already been run on $sql. // private function split_sql_file($sql, $delimiter) { // Split up our string into "possible" SQL statements. $tokens = explode($delimiter, $sql); // try to save mem. $sql = ""; $output = array(); // we don't actually care about the matches preg gives us. $matches = array(); // this is faster than calling count($oktens) every time thru the loop. $token_count = count($tokens); for ($i = 0; $i < $token_count; $i++) { // Don't wanna add an empty string as the last thing in the array. if (($i != ($token_count - 1)) || (strlen($tokens[$i] > 0))) { // This is the total number of single quotes in the token. $total_quotes = preg_match_all("/'/", $tokens[$i], $matches); // Counts single quotes that are preceded by an odd number of backslashes, // which means they're escaped quotes. $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$i], $matches); $unescaped_quotes = $total_quotes - $escaped_quotes; // If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal. if (($unescaped_quotes % 2) == 0) { // It's a complete sql statement. $output[] = $tokens[$i]; // save memory. $tokens[$i] = ""; } else { // incomplete sql statement. keep adding tokens until we have a complete one. // $temp will hold what we have so far. $temp = $tokens[$i] . $delimiter; // save memory.. $tokens[$i] = ""; // Do we have a complete statement yet? $complete_stmt = false; for ($j = $i + 1; (!$complete_stmt && ($j < $token_count)); $j++) { // This is the total number of single quotes in the token. $total_quotes = preg_match_all("/'/", $tokens[$j], $matches); // Counts single quotes that are preceded by an odd number of backslashes, // which means they're escaped quotes. $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$j], $matches); $unescaped_quotes = $total_quotes - $escaped_quotes; if (($unescaped_quotes % 2) == 1) { // odd number of unescaped quotes. In combination with the previous incomplete // statement(s), we now have a complete statement. (2 odds always make an even) $output[] = $temp . $tokens[$j]; // save memory. $tokens[$j] = ""; $temp = ""; // exit the loop. $complete_stmt = true; // make sure the outer loop continues at the right point. $i = $j; } else { // even number of unescaped quotes. We still don't have a complete statement. // (1 odd and 1 even always make an odd) $temp .= $tokens[$j] . $delimiter; // save memory. $tokens[$j] = ""; } } // for.. } // else } } return $output; } private function get_queries($sql) { $sql = $this->remove_remarks($sql); $sql = $this->split_sql_file($sql, ';'); return $sql; } public function create_tables() { $driver = $_POST['driver']; if($driver == "sqlsrv") { $filename = 'install_mssql.sql'; }else{ $filename = 'install.sql'; } $sql = file_get_contents($filename); $queries = $this->get_queries($sql); $res = false; //print_r($queries); foreach ($queries as $query) { //reformat the query $query = trim($query) . ";"; $res = $this->db->query($query); if (!$res) { //problem; break; } } $cnts = file_get_contents("../hardcode.php"); $cnts = str_replace("\$installed=false;", "\$installed=true;", $cnts); @file_put_contents("../hardcode.php", $cnts); if ($res) { echo "created"; } } public function test_avatar_details() { $avatar_table = $_GET['avatar_table']; $avatar_column_name = $_GET['avatar_column']; $avatar_userid = $_GET['userid_column']; $avatar_reference_user = $_GET['reference_column_user']; $avatar_reference_avatar = $_GET['reference_column_avatar']; global $usertable, $db_prefix; $avatar_table_name = $this->tolerate_prefix($avatar_table); $usertable = $this->tolerate_prefix($usertable); if ($avatar_reference_user != '' && $avatar_reference_avatar != '') { //this is for systems that use double linked tables to store avatars such as Drupal //time for complicated queries $query = "SELECT a.$avatar_column_name,a.$avatar_userid,u.$avatar_reference_user,a.$avatar_reference_avatar FROM $db_prefix$avatar_table_name AS a,$db_prefix$usertable AS u LIMIT 1"; } else { $query = "SELECT $avatar_column_name,$avatar_userid FROM $db_prefix$avatar_table_name LIMIT 1"; } $res = $this->db->query($query); if ($res) { //query worked $cnts = file_get_contents("../hardcode.php"); //store table name without prefix $cnts = str_replace("\$avatar_table_name='members'", "\$avatar_table_name='" . $avatar_table_name . "'", $cnts); $cnts = str_replace("\$avatar_column_name='avatar';", "\$avatar_column_name='" . $avatar_column_name . "';", $cnts); $cnts = str_replace("\$avatar_userid='id';", "\$avatar_userid='" . $avatar_userid . "';", $cnts); $cnts = str_replace("\$avatar_reference_avatar='id';", "\$avatar_reference_avatar='" . $avatar_reference_avatar . "';", $cnts); $cnts = str_replace("\$avatar_reference_user='id';", "\$avatar_reference_user='" . $avatar_reference_user . "';", $cnts); //@-> do not corrupt the response @file_put_contents("../hardcode.php", $cnts); echo "correct"; } } private function remove_forward_slash($url) { if ($url[strlen($url) - 1] == "/") { $url = rtrim($url, "/"); } return $url; } private function test_avatar_url($avatar, $site_url, $primary, $correction) { if (!$primary) { //here user may or may not have any avatar if ($avatar == NULL || $avatar == "") { return array(1, ""); } } else { //here user must have an avatar //raise error if ($avatar == NULL || $avatar == "") { return array(0, ""); } } $url = false; $site_url = $this->remove_forward_slash($site_url); if (strpos($avatar, "http://") === FALSE && strpos($avatar, "https://") === FALSE) { if ($avatar[0] != "/") { $slash = "/"; } else { $slash = ""; } if ($correction == "") { global $PATH; if (@$_SERVER["HTTPS"] == "on") { $protocol = "https://"; } else { $protocol = "http://"; } $address = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']; //http address to main folder $root = str_replace($PATH . "installation/smart_ajax.php", "", $address); $root = $this->remove_forward_slash($root); } else { if ($this->diff) { $avatar = ''; } $root = $this->remove_forward_slash($correction); } $url = $root . $slash . $avatar; $try = @file_get_contents($url); if ($try) { return array(1, $url); } else { return array(0, $url); } } else { return array(1, $avatar); //assume it is correct , not a issue to be handles by freichat } //returns url of avatar false on failure return array(0, $url); } public function test_avatar() { /* * correct => no problems * wrong => give path to correct after testing site.com/avatar client side */ $site_url = $_GET['site_url']; $id = $_GET['id']; $correction = $_GET['correction']; $new_rule = $_GET['new_rule']; $orig = $_GET['original']; $this->diff = false; $this->path_vars = false; if (strpos($correction, "}") !== FALSE) { $vars = explode("}", $correction); $path_vars = array(); foreach ($vars as $var) { $s = explode("{", $var); $path_vars[] = $s[1]; } $this->path_vars = $path_vars; } print_r($this->path_vars); if ($new_rule == "name_changed") { //other possibilities can exist //but here only smf like url is concerned for now $correct_arr = explode("/", $correction); $correct = end($correct_arr); if ($correct == '') { end($correct_arr); $correct = prev($correct_arr); } $pos = strpos($orig, $correct); if ($pos !== FALSE) { $this->diff = substr($orig, 0, $pos); } } /* preserved for future reference if($correction != "") { //correct the avatar_url(); } */ $changed = 0; if (isset($_SESSION['correction'])) { if ($correction != $_SESSION['correction']) { $_SESSION['correction'] = $correction; $changed = 1; } } else { $_SESSION['correction'] = $correction; $changed = 1; } //get avatar table details global $avatar_table_name, $avatar_column_name, $avatar_reference_avatar, $avatar_reference_user, $avatar_userid; //get user table details global $usertable; //get DB prefix global $db_prefix; $double_linked = false; if ($avatar_reference_user != '' && $avatar_reference_avatar != '') { //this is for systems that use double linked tables to store avatars such as Drupal //time for complicated queries $double_linked = true; $query = "SELECT a.$avatar_column_name FROM $db_prefix$avatar_table_name AS a,$db_prefix$usertable AS u WHERE u.$avatar_reference_user = a.$avatar_reference_avatar AND u.$avatar_userid = $id"; } else { $query = "SELECT a.$avatar_column_name FROM $db_prefix$avatar_table_name AS a WHERE a.$avatar_userid = $id"; } //get current logged in users avatar $res = $this->db->query($query); if (!$res) { //wrong userid has been passed to freichat echo json_encode(array('exit', "wrong userid is passed or your above details are improper")); exit(0); } $res = $res->fetchAll(); if (empty($res)) { //wrong userid has been passed to freichat echo json_encode(array('exit', "you have either not logged in or userid passed is wrong !")); exit(0); } //primary check -> true $avatar_url = $res[0][0]; $avatar_url = str_replace(" ", "%20", $avatar_url); $res = $this->test_avatar_url($avatar_url, $site_url, true, $correction); if ($res[0]) { //now safe to REPLACE avatar fetch query $this->replace_fetch_queries(); //do some further testing //get avatars of 100 users if ($double_linked) { $query = "SELECT a.$avatar_column_name AS avatar_url FROM $db_prefix$usertable AS u, $db_prefix$avatar_table_name AS a WHERE u.$avatar_reference_user = a.$avatar_reference_avatar LIMIT 100"; } else { $query = "SELECT a.$avatar_column_name AS avatar_url FROM $db_prefix$avatar_table_name AS a LIMIT 100"; } $avatars = $this->db->query($query)->fetchAll(); foreach ($avatars as $avatar) { $avatar['avatar_url'] = str_replace(" ", "%20", $avatar['avatar_url']); $res = $this->test_avatar_url($avatar['avatar_url'], $site_url, false, $correction); if (!$res[0]) { echo json_encode(array("wrong", $res[1], $avatar['avatar_url'], $changed)); //url needs to be corrected exit; } } echo json_encode(array('correct', $res[1], $avatar_url)); $this->replace_avatar_url(); //now safe to replace avatar_url() //everything is perfect } else { echo json_encode(array('wrong', $res[1], $avatar_url, $changed)); //echo url to be corrected } } private function preg_replace_pt($startPoint, $endPoint, $newText, $source) { return preg_replace('#(' . preg_quote($startPoint) . ')(.*)(' . preg_quote($endPoint) . ')#si', '$1' . $newText . '$3', $source); } private function replace_avatar_url() { $filename = "../server/drivers/Custom.php"; $cnts = file_get_contents($filename); $root = $this->remove_forward_slash($_SESSION['correction']); $start = "//AVATAR_URL_START"; $end = "//AVATAR_URL_END"; $diff = $this->diff; $func = " public function avatar_url(\$res) { \$root = '$root'; \$avatar = \$res[\$this->avatar_field_name]; \$avatar = str_replace(' ','%20',\$avatar); "; if ($diff) { $func .= " if(strpos(\$avatar,'$diff') !== FALSE) { \$avatar = str_replace('$diff','',\$avatar); } "; } $func .= "if (strpos(\$avatar, 'http://') === FALSE && strpos(\$avatar, 'https://') === FALSE) { \$slash = '/'; if(\$avatar[0] == '/') \$slash = ''; return \$root.\$slash.\$avatar; }else{ return \$avatar; } } "; $cnts = $this->preg_replace_pt($start, $end, $func, $cnts); file_put_contents($filename, $cnts); } private function replace_fetch_queries() { //get avatar table details global $avatar_table_name, $avatar_column_name, $avatar_reference_avatar, $avatar_reference_user, $avatar_userid; //get user table details global $usertable, $row_userid; //get DB prefix global $db_prefix; $filename = "../server/drivers/Custom.php"; $cnts = file_get_contents($filename); $g_start = "//CUSTOM_GUESTS_QUERY_START"; $g_end = "//CUSTOM_GUESTS_QUERY_END"; $double_linked = false; if ($avatar_reference_avatar != '' && $avatar_reference_user != '') { $double_linked = true; } //No need to do AS avatar in any of the queries if ($double_linked) { $guests = " \$query = \"SELECT DISTINCT f.status_mesg,f.username,f.session_id,f.status,f.guest,f.in_room,a.$avatar_column_name FROM frei_session AS f LEFT JOIN $db_prefix$usertable AS u ON u.$row_userid = f.session_id LEFT JOIN $db_prefix$avatar_table_name AS a ON u.$avatar_reference_user = a.$avatar_reference_avatar WHERE f.time>\" . \$this->online_time2 . \" AND f.session_id!=\" . \$_SESSION[\$this->uid . 'usr_ses_id'] . \" AND f.status!=2 AND f.status!=0\";\n"; } else { $guests = " \$query = \"SELECT DISTINCT f.status_mesg,f.username,f.session_id,f.status,f.guest,f.in_room,a.$avatar_column_name FROM frei_session AS f LEFT JOIN $db_prefix$avatar_table_name AS a ON f.session_id = a.$avatar_userid WHERE f.time>\" . \$this->online_time2 . \" AND f.session_id!=\" . \$_SESSION[\$this->uid . 'usr_ses_id'] . \" AND f.status!=2 AND f.status!=0\";\n"; } $u_start = "//CUSTOM_USERS_QUERY_START"; $u_end = "//CUSTOM_USERS_QUERY_END"; if ($double_linked) { $users = " \$query = \"SELECT DISTINCT f.status_mesg,f.username,f.session_id,f.status,f.guest,f.in_room,a.$avatar_column_name FROM frei_session AS f LEFT JOIN $db_prefix$usertable AS u ON u.$row_userid = f.session_id LEFT JOIN $db_prefix$avatar_table_name AS a ON u.$avatar_reference_user = a.$avatar_reference_avatar WHERE f.time>\" . \$this->online_time2 . \" AND f.session_id!=\" . \$_SESSION[\$this->uid . 'usr_ses_id'] . \" AND f.status!=2 AND f.status!=0 AND f.guest=0\";\n"; } else { $users = " \$query = \"SELECT DISTINCT f.status_mesg,f.username,f.session_id,f.status,f.guest,f.in_room,a.$avatar_column_name FROM frei_session AS f LEFT JOIN $db_prefix$avatar_table_name AS a ON f.session_id = a.$avatar_userid WHERE f.time>\" . \$this->online_time2 . \" AND f.session_id!=\" . \$_SESSION[\$this->uid . 'usr_ses_id'] . \" AND f.status!=2 AND f.status!=0 AND f.guest=0\";\n"; } $b_start = "//CUSTOM_BUDDIES_QUERY_START"; $b_end = "//CUSTOM_BUDDIES_QUERY_END"; if ($double_linked) { $buddies = " \$query = \"SELECT DISTINCT f.status_mesg,f.username,f.session_id,f.status,f.guest,f.in_room,a.$avatar_column_name FROM frei_session AS f LEFT JOIN $db_prefix$usertable AS u ON u.$row_userid = f.session_id LEFT JOIN $db_prefix$avatar_table_name AS a ON u.$avatar_reference_user = a.$avatar_reference_avatar WHERE f.time>\" . \$this->online_time2 . \" AND f.session_id!=\" . \$_SESSION[\$this->uid . 'usr_ses_id'] . \" AND f.status!=2 AND f.status!=0 AND f.guest=0\";\n"; } else { $buddies = " \$query = \"SELECT DISTINCT f.status_mesg,f.username,f.session_id,f.status,f.guest,f.in_room,a.$avatar_column_name FROM frei_session AS f LEFT JOIN $db_prefix$avatar_table_name AS a ON f.session_id = a.$avatar_userid WHERE f.time>\" . \$this->online_time2 . \" AND f.session_id!=\" . \$_SESSION[\$this->uid . 'usr_ses_id'] . \" AND f.status!=2 AND f.status!=0 AND f.guest=0\";\n"; } //mem eater $cnts = $this->preg_replace_pt($g_start, $g_end, $guests, $cnts); $cnts = $this->preg_replace_pt($u_start, $u_end, $users, $cnts); $cnts = $this->preg_replace_pt($b_start, $b_end, $buddies, $cnts); file_put_contents($filename, $cnts); } //no no no -> i simply don't like break n; private function chk_possibility($possible_arr, $fixes, $val, $mids) { $p_val = $break = false; foreach ($possible_arr as $possible) { if (strcasecmp($possible, $val) == 0) { $p_val = $val; break; } foreach ($fixes as $fix) { foreach ($mids as $mid) { if (strcasecmp($possible . $mid . $fix, $val) == 0) { $p_val = $val; $break = true; } } if ($break) break; } //try it the other way round too //different styles of different people ;) foreach ($fixes as $fix) { foreach ($mids as $mid) { if (strcasecmp($fix . $mid . $possible, $val) == 0) { $p_val = $val; $break = true; } } if ($break) break; } if ($break) break; } return $p_val; } private function chk_table_possibility($values, $possible_arr, $fixes) { $p_val = $break = false; //exchanging below foreach can reduce memusage by 1/nth the size of array //but this will disrupt the order of that array thus giving us the //wrong result in certain cases foreach ($possible_arr as $possible) { foreach ($values as $val) { $val = $this->tolerate_prefix($val[0]); if (strcasecmp($possible, $val) == 0) { $p_val = $val; $break = true; break; } foreach ($fixes as $fix) { if (strcasecmp($possible . $fix, $val) == 0) { $p_val = $val; $break = true; break; } } if ($break) break; } if ($break) break; } return $p_val; } private function get_usercolumn($column) { $possible_columns = array("", "user", "member", "screen"); $fixes = array("base", "name", "login"); $mids = array("", "_"); return $this->chk_possibility($possible_columns, $fixes, $column, $mids); } private function get_idcolumn($column) { $possible_columns = array("", "u", "g", "user", "member"); $fixes = array("base", "id", "uid"); $mids = array("", "_"); return $this->chk_possibility($possible_columns, $fixes, $column, $mids); } public function get_tables_smartly() { $query = "SHOW tables"; $q = $this->db->query($query); if (!$q) { echo json_encode(0); exit; } $tables = $q->fetchAll(); //in descending order of importance $possible_tables = array("user", "member", "session"); $fixes = array("s"); $usertable = false; $usertable = $this->chk_table_possibility($tables, $possible_tables, $fixes); if ($usertable) { global $db_prefix; //1 row is enough to retrieve all column names $query = "SELECT * FROM $db_prefix$usertable LIMIT 1"; $q = $this->db->query($query); if (!$q) { echo json_encode(array("usertable" => $usertable)); exit; } $columns = $q->fetchObject(); $usercolumn = false; $idcolumn = false; $do_user = true; $do_id = true; foreach ($columns as $column => $val) { $val = "you are useless here!"; if ($do_user) { $usercolumn = $this->get_usercolumn($column); } if ($do_id) { $idcolumn = $this->get_idcolumn($column); } if ($usercolumn) { $do_user = false; } if ($idcolumn) { $do_id = false; } if (!$do_user && !$do_id) { break; } } if ($usercolumn && $idcolumn) { echo json_encode(array( "usertable" => $usertable, "usercolumn" => $usercolumn, "idcolumn" => $idcolumn )); } else { echo json_encode(array("usertable" => $usertable)); } } else { echo json_encode(0); } } } if (isset($_REQUEST["action"])) { $smart = new Smart(); $smart->$_REQUEST['action'](); }