From 3c4846fd0a9e120d837175ce96c5ff3c7e0ccc69 Mon Sep 17 00:00:00 2001 From: flashwave Date: Sat, 25 Apr 2015 20:08:44 +0000 Subject: [PATCH] Auth is fucking FINISHED --- .gitignore | 3 +- _developer_data/{Sakura.php => Sockura.php} | 13 +- _sakura/components/Main.php | 6 + _sakura/components/Users.php | 157 +++- _sakura/config/config.example.php | 8 +- _sakura/sakura.php | 3 +- _sakura/templates/yuuno/global/header.tpl | 10 +- _sakura/templates/yuuno/main/authenticate.tpl | 2 +- .../templates/yuuno/main/forgotpassword.tpl | 3 +- content/data/yuuno/css/yuuno.css | 18 +- main/.htaccess | 11 +- main/authenticate.php | 127 ++- main/dev/index.php | 5 - main/dev/registerData.php | 39 - main/dev/sql.php | 817 ------------------ main/profile.php | 16 + 16 files changed, 321 insertions(+), 917 deletions(-) rename _developer_data/{Sakura.php => Sockura.php} (87%) delete mode 100644 main/dev/index.php delete mode 100644 main/dev/registerData.php delete mode 100644 main/dev/sql.php create mode 100644 main/profile.php diff --git a/.gitignore b/.gitignore index 3f8bcd6..597ff52 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,8 @@ content/images/backgrounds/* !content/images/backgrounds/.htaccess BingSiteAuth.xml google*.html -logs/* +main/logs/* +main/dev/* ################# diff --git a/_developer_data/Sakura.php b/_developer_data/Sockura.php similarity index 87% rename from _developer_data/Sakura.php rename to _developer_data/Sockura.php index 4b2d411..a64e4bb 100644 --- a/_developer_data/Sakura.php +++ b/_developer_data/Sockura.php @@ -4,8 +4,11 @@ * By Flashwave */ -// Settings -$sockSakuraPath = ''; // Filesystem path to the _sakura folder WITHOUT an ending / +// Filesystem path to the _sakura folder WITHOUT an ending / +// This can also be set before an include of this file in case +// you're using git to keep in sync and don't want conflicts +if(!isset($sockSakuraPath)) + $sockSakuraPath = ''; /* * * DON'T EDIT ANYTHING BELOW THIS LINE * * */ @@ -31,8 +34,8 @@ if(Auth::getPageType() == AUTH_FETCH) { } else { // Get arguments - $uid = $_GET['arg1']; - $sid = $_GET['arg2']; + $uid = $_REQUEST['arg1']; + $sid = $_REQUEST['arg2']; // Check if session is active else deny if(Session::checkSession($uid, $sid)) { @@ -53,7 +56,7 @@ if(Auth::getPageType() == AUTH_FETCH) { Auth::SetUserData( $user['id'], $user['username'], - $rank['colour'] + $user['name_colour'] == null ? $rank['colour'] : $user['name_colour'] ); switch($rank['id']) { diff --git a/_sakura/components/Main.php b/_sakura/components/Main.php index 5382a0d..fb9c6f7 100644 --- a/_sakura/components/Main.php +++ b/_sakura/components/Main.php @@ -219,9 +219,15 @@ class Main { // Get user data foreach($newsPosts as $newsId => $newsPost) { + $newsPosts[$newsId]['parsed'] = self::mdParse($newsPost['content']); $newsPosts[$newsId]['udata'] = Users::getUser($newsPost['uid']); $newsPosts[$newsId]['rdata'] = Users::getRank($newsPosts[$newsId]['udata']['rank_main']); + + // Check if a custom name colour is set and if so overwrite the rank colour + if($newsPosts[$newsId]['udata']['name_colour'] != null) + $newsPosts[$newsId]['rdata']['colour'] = $newsPosts[$newsId]['udata']['name_colour']; + } // Return posts diff --git a/_sakura/components/Users.php b/_sakura/components/Users.php index 89febfd..78122fa 100644 --- a/_sakura/components/Users.php +++ b/_sakura/components/Users.php @@ -69,6 +69,10 @@ class Users { } + // Redirect people that need to change their password to the new format + if(self::getUser(Session::$userId)['password_algo'] == 'legacy' && $_SERVER['PHP_SELF'] != '/authenticate.php' && $_SERVER['PHP_SELF'] != '/imageserve.php') + header('Location: /authenticate.php?legacy=true'); + // If everything went through return true return true; @@ -258,6 +262,157 @@ class Users { } + // Check if a user exists and then send the password forgot email + public static function sendPasswordForgot($username, $email) { + + // Check if authentication is disallowed + if(Configuration::getConfig('lock_authentication')) + return [0, 'AUTH_LOCKED']; + + // Clean username string + $usernameClean = Main::cleanString($username, true); + $emailClean = Main::cleanString($email, true); + + // Do database request + $user = Database::fetch('users', false, [ + 'username_clean' => [$usernameClean, '='], + 'email' => [$emailClean, '='] + ]); + + // Check if user exists + if(count($user) < 2) + return [0, 'USER_NOT_EXIST']; + + // Check if the user is deactivated + if(in_array(0, json_decode($user['ranks'], true))) + return [0, 'DEACTIVATED']; + + // Generate the verification key + $verk = Main::newActionCode('LOST_PASS', $user['id'], [ + 'meta' => [ + 'password_change' => 1 + ] + ]); + + // Build the e-mail + $message = "Hello ". $user['username'] .",\r\n\r\n"; + $message .= "You are receiving this notification because you have (or someone pretending to be you has) requested a password reset link to be sent for your account on \"". Configuration::getConfig('sitename') ."\". If you did not request this notification then please ignore it, if you keep receiving it please contact the site administrator.\r\n\r\n"; + $message .= "To use this password reset key you need to go to a special page. To do this click the link provided below.\r\n\r\n"; + $message .= "http://". Configuration::getLocalConfig('urls', 'main') ."/forgotpassword?pw=true&uid=". $user['id'] ."&key=". $verk ."\r\n\r\n"; + $message .= "If successful you should be able to change your password here.\r\n\r\n"; + $message .= "Alternatively if the above method fails for some reason you can go to http://". Configuration::getLocalConfig('urls', 'main') ."/forgotpassword?pw=true&uid=". $user['id'] ." and use the key listed below:\r\n\r\n"; + $message .= "Verification key: ". $verk ."\r\n\r\n"; + $message .= "You can of course change this password yourself via the profile page. If you have any difficulties please contact the site administrator.\r\n\r\n"; + $message .= "--\r\n\r\nThanks\r\n\r\n". Configuration::getConfig('mail_signature'); + + // Send the message + Main::sendMail([$user['email'] => $user['username']], Configuration::getConfig('sitename') .' password restoration', $message); + + // Return success + return [1, 'SUCCESS']; + + } + + // [Flashwave 2015-04-25] Prepare for 5 million password changing functions + + // Change legacy passwords after logging in + public static function changeLegacy($oldpass, $newpass, $verpass) { + + // Check if user is logged in because I just know someone is going to meme around it + if(!self::checkLogin()) + return [0, 'USER_NOT_LOGIN']; + + // Get user data + $user = Users::getUser(Session::$userId); + + // Check if the user is deactivated + if(in_array(0, json_decode($user['ranks'], true))) + return [0, 'DEACTIVATED']; + + // Check if the account is disabled + if('nologin' == $user['password_algo']) + return [0, 'NO_LOGIN']; + + // Check if old pass is correct + if(Main::legacyPasswordHash($oldpass) != $user['password_hash']) + return [0, 'INCORRECT_PASSWORD']; + + // Check password entropy + if(Main::pwdEntropy($newpass) < Configuration::getConfig('min_entropy')) + return [0, 'PASS_TOO_SHIT']; + + // Passwords do not match + if($newpass != $verpass) + return [0, 'PASS_NOT_MATCH']; + + // Hash the password + $password = Hashing::create_hash($newpass); + $time = time(); + + // Update the user + Database::update('users', [ + [ + 'password_hash' => $password[3], + 'password_salt' => $password[2], + 'password_algo' => $password[0], + 'password_iter' => $password[1], + 'password_chan' => $time + ], + [ + 'id' => [Session::$userId, '='] + ] + ]); + + // Return success + return [1, 'SUCCESS']; + + } + + // Reset password with key + public static function resetPassword($verk, $uid, $newpass, $verpass) { + + // Check if authentication is disallowed + if(Configuration::getConfig('lock_authentication')) + return [0, 'AUTH_LOCKED']; + + // Check password entropy + if(Main::pwdEntropy($newpass) < Configuration::getConfig('min_entropy')) + return [0, 'PASS_TOO_SHIT']; + + // Passwords do not match + if($newpass != $verpass) + return [0, 'PASS_NOT_MATCH']; + + // Check the verification key + $action = Main::useActionCode('LOST_PASS', $verk, $uid); + + // Check if we got a negative return + if(!$action[0]) + return [0, $action[1]]; + + // Hash the password + $password = Hashing::create_hash($newpass); + $time = time(); + + // Update the user + Database::update('users', [ + [ + 'password_hash' => $password[3], + 'password_salt' => $password[2], + 'password_algo' => $password[0], + 'password_iter' => $password[1], + 'password_chan' => $time + ], + [ + 'id' => [$uid, '='] + ] + ]); + + // Return success + return [1, 'SUCCESS']; + + } + // Check if a user exists and then resend the activation e-mail public static function resendActivationMail($username, $email) { @@ -321,7 +476,7 @@ class Users { $message .= "Your password has been securely stored in our database and cannot be retrieved. "; $message .= "In the event that it is forgotten, you will be able to reset it using the email address associated with your account.\r\n\r\n"; $message .= "Thank you for registering.\r\n\r\n"; - $message .= "--\r\n\r\nSincerely\r\n\r\n". Configuration::getConfig('mail_signature'); + $message .= "--\r\n\r\nThanks\r\n\r\n". Configuration::getConfig('mail_signature'); // Send the message Main::sendMail([$user['email'] => $user['username']], Configuration::getConfig('sitename') .' Activation Mail', $message); diff --git a/_sakura/config/config.example.php b/_sakura/config/config.example.php index 8afc384..7a960e4 100644 --- a/_sakura/config/config.example.php +++ b/_sakura/config/config.example.php @@ -1,5 +1,5 @@ Users::checkLogin(), 'session' => Session::$sessionId, 'data' => ($_init_udata = Users::getUser(Session::$userId)), - 'rank' => Users::getRank($_init_udata['rank_main']) + 'rank' => ($_init_rdata = Users::getRank($_init_udata['rank_main'])), + 'colour' => ($_init_udata['name_colour'] == null ? $_init_rdata['colour'] : $_init_udata['name_colour']) ] ); diff --git a/_sakura/templates/yuuno/global/header.tpl b/_sakura/templates/yuuno/global/header.tpl index 1a477ae..1c19611 100644 --- a/_sakura/templates/yuuno/global/header.tpl +++ b/_sakura/templates/yuuno/global/header.tpl @@ -122,13 +122,13 @@ Chat {% if user.checklogin %} Members - Donate + Support {% endif %} {% endif %} + diff --git a/_sakura/templates/yuuno/main/authenticate.tpl b/_sakura/templates/yuuno/main/authenticate.tpl index 6d16a01..3923096 100644 --- a/_sakura/templates/yuuno/main/authenticate.tpl +++ b/_sakura/templates/yuuno/main/authenticate.tpl @@ -89,7 +89,7 @@
- +
diff --git a/_sakura/templates/yuuno/main/forgotpassword.tpl b/_sakura/templates/yuuno/main/forgotpassword.tpl index 5a7cd00..59a81e9 100644 --- a/_sakura/templates/yuuno/main/forgotpassword.tpl +++ b/_sakura/templates/yuuno/main/forgotpassword.tpl @@ -5,6 +5,7 @@ +

Verification Key

@@ -12,7 +13,7 @@

New Password

-
+

Verify Password

diff --git a/content/data/yuuno/css/yuuno.css b/content/data/yuuno/css/yuuno.css index eeb497f..2ce2daa 100644 --- a/content/data/yuuno/css/yuuno.css +++ b/content/data/yuuno/css/yuuno.css @@ -324,6 +324,20 @@ a.gotop:active { } } +/* Header notification thing */ +.headerNotify { + margin: 10px auto; + padding: 10px; + width: auto; + max-width: 1024px; + border: 1px solid #9475B2; + box-shadow: 0 0 3px #9475B2; + border-radius: 3px; + background: #D3BFFF; + display: block; + text-align: center; +} + /* Footer Styling */ .footer { box-shadow: 0 0 1em #9475B2; @@ -467,7 +481,7 @@ a.gotop:active { background: #B19DDD; } .markdown hr { - background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC') repeat-x scroll 0px 0px transparent; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC') repeat-x scroll 0 0 transparent; border: 0 none; color: #CCC; height: 4px; @@ -1240,7 +1254,7 @@ textarea.inputStyling { background: linear-gradient(0deg, #9475B2 0%, #9475B2 50%, #86A 50%) repeat scroll 0% 0% #9475B2; } .recaptcha > .recaptcha_buttons > a:first-child { - border-top-right-radius: 0px; + border-top-right-radius: 0; border-bottom-left-radius: 4px; } } diff --git a/main/.htaccess b/main/.htaccess index e92ec07..28c4260 100644 --- a/main/.htaccess +++ b/main/.htaccess @@ -18,7 +18,7 @@ RewriteRule ^feedback?/?$ http://forum.flash.moe/viewforum.php?f=22 RewriteRule ^credits?/?$ credits.php RewriteRule ^index?/?$ index.php RewriteRule ^login?/?$|logout?/?$|activate?/?$|register?/?$|forgotpassword?/?|authenticate?/?$ authenticate.php -RewriteRule ^donate?/?$ donate.php +RewriteRule ^donate?/?$|support?/?$ support.php RewriteRule ^contact?/?$ infopage.php?r=contact ## Info pages @@ -29,6 +29,11 @@ RewriteRule ^news?/?$ news.php RewriteRule ^news/([0-9]+)$ news.php?id=$1 RewriteRule ^news.xml$ news.php?xml +## Profiles +RewriteRule ^u$|u/$ profile.php +RewriteRule ^u/([A-Za-z0-9_-\s\.]+)?/?$ profile.php?u=$1 +RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/api?/?$ profile.php?data + # Serving Images -RewriteRule ^a/([0-9]+)$ imageserve.php?m=avatar&u=$1 -RewriteRule ^a/([0-9]+).png$ imageserve.php?m=avatar&u=$1 +RewriteRule ^a/([0-9]+)$|a/([0-9]+).png$ imageserve.php?m=avatar&u=$1 +RewriteRule ^bg/([0-9]+)$|bg/([0-9]+).png$ imageserve.php?m=background&u=$1 diff --git a/main/authenticate.php b/main/authenticate.php index 3c22700..257b5d3 100644 --- a/main/authenticate.php +++ b/main/authenticate.php @@ -24,7 +24,7 @@ if(isset($_REQUEST['mode'])) { $renderData['page'] = [ 'title' => 'Action failed', 'redirect' => '/authenticate', - 'message' => 'Timestamps differ too much, please try again.', + 'message' => 'Timestamps differ too much, refresh the page and try again.', 'success' => 0 ]; @@ -53,9 +53,18 @@ if(isset($_REQUEST['mode'])) { // Login check if(Users::checkLogin()) { - if(!in_array($_REQUEST['mode'], ['logout', 'legacypw'])) + if(!in_array($_REQUEST['mode'], ['logout', 'legacypw'])) { $continue = false; + // Add page specific things + $renderData['page'] = [ + 'title' => 'Authentication', + 'redirect' => '/', + 'message' => 'You are already authenticated. Redirecting...', + 'success' => 1 + ]; + } + } if($continue) { @@ -79,24 +88,53 @@ if(isset($_REQUEST['mode'])) { case 'legacypw': + // Attempt change + $legacypass = Users::changeLegacy($_REQUEST['oldpw'], $_REQUEST['newpw'], $_REQUEST['verpw']); + + // Array containing "human understandable" messages + $messages = [ + 'USER_NOT_LOGIN' => 'What are you doing, you\'re not even logged in. GO AWAY!', + 'INCORRECT_PASSWORD' => 'The password you entered was invalid.', + 'DEACTIVATED' => 'Your account is deactivated.', + 'NO_LOGIN' => 'Logging into this account is disabled.', + 'PASS_TOO_SHIT' => 'Your password is too weak, try adding some special characters.', + 'PASS_NOT_MATCH' => 'Passwords do not match.', + 'SUCCESS' => 'Successfully changed your password, you may now continue.' + ]; + // Add page specific things $renderData['page'] = [ - 'title' => 'Changing Password', - 'redirect' => $_SERVER['PHP_SELF'], - 'message' => 'yet to be implemented', - 'success' => 0 + 'title' => 'Change Password', + 'redirect' => '/', + 'message' => $messages[$legacypass[1]], + 'success' => $legacypass[0] ]; + break; case 'changepassword': + // Attempt change + $passforget = Users::resetPassword($_REQUEST['verk'], $_REQUEST['uid'], $_REQUEST['newpw'], $_REQUEST['verpw']); + + // Array containing "human understandable" messages + $messages = [ + 'INVALID_VERK' => 'The verification key supplied was invalid!', + 'INVALID_CODE' => 'Invalid verification key, if you think this is an error contact the administrator.', + 'INVALID_USER' => 'The used verification key is not designated for this user.', + 'VERK_TOO_SHIT' => 'Your verification code is too weak, try adding some special characters.', + 'PASS_TOO_SHIT' => 'Your password is too weak, try adding some special characters.', + 'PASS_NOT_MATCH' => 'Passwords do not match.', + 'SUCCESS' => 'Successfully changed your password, you may now log in.' + ]; + // Add page specific things $renderData['page'] = [ 'title' => 'Forgot Password', - 'redirect' => $_SERVER['PHP_SELF'], - 'message' => 'Yet to be implemented', - 'success' => 0 + 'redirect' => ($passforget[0] ? '/' : $_SERVER['PHP_SELF'] .'?pw=true&uid='. $_REQUEST['uid'] .'&verk='. $_REQUEST['verk']), + 'message' => $messages[$passforget[1]], + 'success' => $passforget[0] ]; break; @@ -112,7 +150,7 @@ if(isset($_REQUEST['mode'])) { 'USER_NOT_EXIST' => 'The user you tried to activate does not exist.', 'USER_ALREADY_ACTIVE' => 'The user you tried to activate is already active.', 'INVALID_CODE' => 'Invalid activation code, if you think this is an error contact the administrator.', - 'INVALID_USER' => 'The used registration code is not designated for this user.', + 'INVALID_USER' => 'The used activation code is not designated for this user.', 'SUCCESS' => 'Successfully activated your account, you may now log in.' ]; @@ -170,7 +208,7 @@ if(isset($_REQUEST['mode'])) { // Add page specific things $renderData['page'] = [ 'title' => 'Login', - 'redirect' => ($login[0] ? $_REQUEST['redirect'] : '/authenticate'), + 'redirect' => ($login[1] == 'LEGACY_SUCCESS' ? '/authenticate?legacy=true' : ($login[0] ? $_REQUEST['redirect'] : '/authenticate')), 'message' => $messages[$login[1]], 'success' => $login[0] ]; @@ -230,12 +268,23 @@ if(isset($_REQUEST['mode'])) { // Unforgetting passwords case 'forgotpassword': + // Attempt send + $passforgot = Users::sendPasswordForgot($_REQUEST['username'], $_REQUEST['email']); + + // Array containing "human understandable" messages + $messages = [ + 'AUTH_LOCKED' => 'Authentication is currently not allowed, try again later.', + 'USER_NOT_EXIST' => 'The requested user does not exist (confirm the username/email combination).', + 'DEACTIVATED' => 'Your account is deactivated.', + 'SUCCESS' => 'The password reset e-mail has been sent to the address associated with your account.' + ]; + // Add page specific things $renderData['page'] = [ - 'title' => 'Forgot Password', - 'redirect' => $_SERVER['PHP_SELF'], - 'message' => 'yet to be implemented', - 'success' => 0 + 'title' => 'Lost Password', + 'redirect' => '/authenticate', + 'message' => $messages[$passforgot[1]], + 'success' => $passforgot[0] ]; break; @@ -279,6 +328,32 @@ $renderData['auth'] = [ ] ]; +// Check if the user is already logged in +if(Users::checkLogin()) { + + // If password forgot things are set display password forget thing + if(isset($_REQUEST['legacy']) && $_REQUEST['legacy'] && Users::getUser(Session::$userId)['password_algo'] == 'legacy') { + + $renderData['page']['title'] = 'Changing Password'; + $renderData['auth']['changingPass'] = true; + + print Templates::render('main/legacypasswordchange.tpl', $renderData); + exit; + + } + + // Add page specific things + $renderData['page'] = [ + 'title' => 'Authentication', + 'redirect' => '/', + 'message' => 'You are already logged in, log out to access this page.' + ]; + + print Templates::render('errors/information.tpl', $renderData); + exit; + +} + // Check if a user has already registered from the current IP address if(count($regUserIP = Users::getUsersByIP(Main::getRemoteIP()))) { @@ -292,8 +367,9 @@ if(count($regUserIP = Users::getUsersByIP(Main::getRemoteIP()))) { // If password forgot things are set display password forget thing if(isset($_REQUEST['pw']) && $_REQUEST['pw']) { - $renderData['page']['title'] = 'Changing Password'; + $renderData['page']['title'] = 'Resetting Password'; $renderData['auth']['changingPass'] = true; + $renderData['auth']['userId'] = $_REQUEST['uid']; if(isset($_REQUEST['key'])) $renderData['auth']['forgotKey'] = $_REQUEST['key']; @@ -303,24 +379,5 @@ if(isset($_REQUEST['pw']) && $_REQUEST['pw']) { } -// Check if the user is already logged in -if(Users::checkLogin()) { - - // Add page specific things - $renderData['page'] = [ - 'title' => 'Authentication', - 'redirect' => ( - isset($_SERVER['HTTP_REFERER']) ? - $_SERVER['HTTP_REFERER'] : - '/' - ), - 'message' => 'You are already logged in, log out to access this page.' - ]; - - print Templates::render('errors/information.tpl', $renderData); - exit; - -} - // Print page contents print Templates::render('main/authenticate.tpl', $renderData); diff --git a/main/dev/index.php b/main/dev/index.php deleted file mode 100644 index ffca22a..0000000 --- a/main/dev/index.php +++ /dev/null @@ -1,5 +0,0 @@ -

Development Tools

- \ No newline at end of file diff --git a/main/dev/registerData.php b/main/dev/registerData.php deleted file mode 100644 index 5c4f8b1..0000000 --- a/main/dev/registerData.php +++ /dev/null @@ -1,39 +0,0 @@ - $_POST['username'], - 'username_clean' => Sakura\Main::cleanString($_POST['username'], true), - 'password_hash' => $pass[3], - 'password_salt' => $pass[2], - 'password_algo' => $pass[0], - 'password_iter' => $pass[1], - 'password_chan' => time(), - 'email' => Sakura\Main::cleanString($_POST['email'], true), - 'group_main' => '1', - 'groups' => json_encode([1]), - 'register_ip' => Main::getRemoteIP(), - 'last_ip' => Main::getRemoteIP(), - 'regdate' => time(), - 'lastdate' => time(), - 'lastunamechange' => time(), - 'profile_data' => json_encode([]) - ]; - - print_r($regData); - exit; - -} -?> -
- username:
- password:
- email:
- -
diff --git a/main/dev/sql.php b/main/dev/sql.php deleted file mode 100644 index 66b56b4..0000000 --- a/main/dev/sql.php +++ /dev/null @@ -1,817 +0,0 @@ -S8LJt.M ϋ`'C889 Q2#8А6mjh<9/:J)ʂ\0d>!\0Zvno(k7s> !R\"*nS\0@P\"(#[@g ozn9k8n1I* =n0c(;à!*c>ΎE7DLJ1J=1L?s=#`3\$4uȱzGC YAt?;Qk&YPuǯ}UaHV%G;slڴIH3xw0t6%MR%jhB<\0AQ-ʈ QH\nvL+væ<\rv\\*Ӵݢgn˩ TЩ2P\rߋ\"+z8:#2J[i;zr3 #ى:n\r㽃epdݍ 2c4k\rGE6_މb/HB%0>hoWnxl֍浃CQ^\r4lK{Z:Ã.pĂJB-+B(T%J0lT`+-@BۄV\0C,0tF?Ġ\na@Ɍ>ZECO-^Q&)I)R]\r97_\rF80Ob >\nR_8٫ ov0bCAF!tă%0/zAYO(4 '] I8hH053@x&n|T)`.s6eYDzJѓ.{GEbӋ2{\$**@C-:zYHZI5F]YCOA`x'.*9t'{(wP=**xwr*cc|DV\rV.0 Vd?Ҁ,E͝`T6ۈ-ڎT[ѐz.Ar̀Pnc= a9Fn!u A0iPJ6e T]V[\rXav k\n+Eܕ*\0~@g\"NCI\$Ɍx@Wy*vuD\0v댆V\0V`GuE֕flh@)0@T7§RAٷ3ۘ/Q],s{VRFA<vץ%@9F5t%+ /8;WJo:N` h{ܣ Ԑ8Eu&W|ɆU&\r\"|-udžN:ncfV# U20>\">`k]-xS͇ТcB}&`r+E\$yNb,Wx -9r,`+ˊC)7x\rWfMSR \\zQ̓u A24L&Hi µS\$)eg rȌ\$]ZiYskWn>7E1k8drkEwwcmTya\$tx\rB=*<l fKN/ lkH8.?f6ч{gi/\"@ K@2a|#,Z wd6w^&tP].Tkro\ro=%h`:\0᱂ |ꊣa Ԯ6*:*rO-^nM}Aya\nu^rnO\r`T~</wy}:|̡6v \rcٸߣC/6ഷ#p@p `Zch\0 \0o 4OO i\0-\n/\0D. .Đ\0fiȫ\0ID\0\r0foGeJ|\rl 3~ iP&/\09 ^\0r0] ›o .\" M vPZm pP ڜޏ{C ?kϼ}d ʏ~=.- m1> hЕ1;QIOP\rcpApVk\rQ* Q}q>u15BqQ[1flap\0*JQ=G _bGHF.0 = 2P P!#(3 \n!1&72f`/\0\"PU \$\r0 ,QrU&2f_X ]9\"S''y8\rkW)O)*Ra%\\ i%&ҳ+r3S`,v&2L&Pu*-0\"%HĬԞ@ؓHBP(\$p&,1M ح;\rn. I.',1)42u+3 ` S pL\nt_*S3;6r'h3555䜋d2q+68O7sC\"pm8ҭ69m\n@e0<8B8<,(8\0 0J<@IR6pԭmG\"116.\"5̂:8bA1;';?<*\$,̍o= T/3#҆");}elseif($_GET["file"]=="functions.js"){header("Content-Type: text/javascript; charset=utf-8");echo -lzw_decompress("f:gCI\n0S a9S`&(n0QIf\$At^ sGtf6ey()LSP'R'fq]\"s> )`H2Eq9?*)t'ϧ\n \rs2Xœej:9^1cȝ:Y@u㓛4X&|)ђ-Kx S1\$@\\!x]\0FCO:1K*F4 ak KϚ2lp3J<,28# \r hF݉2Pl(\$ְ\nJ۷-ǰcc~Frtbm{h.{tkBKcz4C9۫~>`ƓC s:!cڵ*WHX:W;Nj*/(_p3HIKln!trG㭺tC v?m㤣\0Coܥcbf6I'\rb7h`9id5taM={ɩ`NoK !d4zWXdmH*S ]3&\0ڰ d%A- ( Q}U !t7 䋆>xt{mY0@^\"= @t\r+Y.X\nI'KT^(D.@ ++@3X aE!,Y2-432Ԍ MOI\$q% ċGX9[R\0nи PJy\r Bp\\HpgSɼFaejk.4C.^yi9PĈe\"ΔNYBH#8B1\"j\\کx#@G 92f.ЌpsrTJxk4KIlf8zKȇ>AKn^=&A*?' ^%; 4܀9QhN>M=['vHIJvRt<Ҳ^z‰B^h'ɩ)-'#9JT)@jO!c,ej@H,javZ>ҷ)E`\0\nTP8LX'L {XzoD%sPW:[=v0?ܷ,%{\". .YIB \nWpV)qAMV5IPοˎ(b.\$[Қj@h\nF-4 8nj+VMxnjmb\$ \n'~ Z@ VL\"p5O,\0K\0-6\r:pDbՐn\$mm\$i )O6 (APIP+VHpn4?BMJF.0+ij P(&a%l]'^@(5N fscbz >x\0k Đ\rJH'3 (Fт z`O qX`r\r 1,gk lv|+kf'=R@46` -.i~4#<\$R |u2N;Bn<-#{%b=#(J1b%gzG21^8w b^%/ G*7D\0^ rc p\nL, 0+ Xr\$ 8-)+(D \nb s12G\\{.I~`*l]N X.#%\$KS'36\$CrC0B\r--H| Ȇ,\"57ӒT)n ĸ/2La72K1/ d\"4SH ͌1\0O6R8|S|+rӲ\$O\re(\r\"8ӎs\r2!*mNTQ]jk+15Rh1Qz`pRE -SS\r1@vo.tTUFqE;g\\\"DQ`sIv`0 +KpT)|l 8%'LLJ@\r&+ ԃX&t \\*'4NƣO\0OTDb\r1PL\0gM\"O>Cw]770 !\"ː4\0zW2 D\\W<2\"_ xw|qJ&e24\"qX:d6+-̓/ӄ[V71\rc\n\0\n`J ~+'1f!G\0[a\rv\0^\0ZK ~Ʌ7w%/(F?`z%vjyj\$w/!fqT,ӉY7I*jF,yRK~ rr菒_W|x;`㍃nn<'%xр 8߀ b_J \"h`Ev\\ˁ#\"4ٛɖلxdLFq9TljV#q-=qD2Mދud+rTtgcfnx^@da&\n\0B|:I+,7'8\\P,\"-scsvG'W\$=}[~ YycYi2sw4\rK.PU@ 珜\nAi2قY~'AmqӚ,4<ss򉬜#@`X\rͲ1 E=G4vG\0R'Y@7:@fPV{!\"z7Mo[D!*W2j2g8|L\$ DiG}GRb!r&- 3ԣmș\r0qh1Ki,| ezHYFdiS3b\r>]:~=!}i'] 2(\nFgX Xn}#ܗn`\r?t XQɑLZny~?nNr\0\$oj7Z&9S tU`tc*7s\r|w盕N)=\$Z'ˀ a!#Uȕe^ia0-ʀ!JD`fd0) RH+dI6AfvۓxT{C 1&GO \\Ex(.nP\"(02쮇dW=.@gG['jZ2='!K5f)R(r1j\rX1i5\$ Ļt, o\0p2,m%unoS 0PJ\\6sp)jL?ֲ~9d\r-,@%Zf QY,pXRCiJ!3#Y nc|@ (ɲ\"q\n_)1!8\0ы `cC}(_2 8MY ^3.U]!4a\ngJKЋ`9LH) Xn00܌S4EP`+ I4YFXI9hWIJE9!k#H]f7< fm(Q<@0 |&'@4 vȞ\0/ A\"&0yS<'5UZq%\"3 Rr鋞Ip:\0-PXT\\\0NYI2\0&n;2g|9N}ANP欫\0>&T D5sb\",VSPО2` .e@\\RDw4\$(⒢ 'b2\0\$Bf7\"q%W@\0`E]BJSxo\r8By(\n S =@7UA\r{\$bc\n\\\".h^\0`\"^L\0@9 W\0RO`eN=8ogv3n-CFq!Bp-qa7Mb'sK'MqHZm\$1IOj5lkgmzi6A\\@d,\n@Ӯ4tiJ\0l(k哊Vˆ\0Oiȭm(9tЅA\0fT~\$S]\\d[9g2\rpB֠x\0- 6eEA1\"y,+V]ٔimtW[B<&`bmqH|fSZ-?g DOQAVθE3 Q`T&AƩ\0\n%a\\Si 'bhH^|} O!.ɞW!\$Lyи:ݻ[:HD\0 v\0v*l{(.uŕRÕZt m+lLY<+1 !05/>T:Z6ISǯՠ?La,l.=[3tlhʲ0XhF⧂xPFh‚Vu0a,،9\n`nTŬb7l \$M9+Ldl6Y5+ZreI qPZ40YaE'5 pmK`آ|\r|\$CKBxRյmt8ogIu1ZeИϓO%MCS nwݧAut\$2{6X2V'ݼ/o[\\]s0!%}xY7+?aI[#U\0c{2f*F2}\0bm@zdX!T˔Md&ےI8.tJd/\0X{I K~^7C @D&]&SCVۧdyD՗41\$ F'\\2Et@}fA8.iK6~kOrW['/FL`J8EݦvVR%꒡*ɀJ^rcH7t:n7m x]&ze)5JtA֫)ZK%/n e®|6ɘc|Ԗ\\>ۖK~Ԃ۾ò\0-MliRdB|!O\$=\$Y;z]a8p!T\0.\r>(28i,XW4Z8h%Z6jDs2 M_\nҤ6ՖRTQY,`F/S\"`nHWy!2\"\\\0=66B )\\-UιWp )}q!p\\\nRXlJ-# Sm=\\KE1#H2 _Mm.Hҥo&!΃9V'+*U_)L.&J p5kB5T,M\"7Q\"\$aE7):Ţr:*.5|=a68JZLivBx t>mY9N\"4Ub,p1wP>A:n WqhR;Z\0b,=Cp\0,R^rk7G>MiVi)h9+2Jս!~4V4疮l=e恺։,d #ZiYſiH#[Jk ɕkKax\n PTٲc8r~9dO,᠍DA^d=?O5E5O߲j)j#[eMݐViaqp Kt -9+ċ̙YN6\rH[ŹK:fQ\nAJ]eo Ҹ?-r:s)1 lS+dFz3<k^6\0Ae8fifj*rfi&V>Lzu'3I5k5Ƒ#la|@̗ lh9C拑,K,&nBUze7\n:X@I\n<+\r&mf[d++A3Dm7BD`9 Eh(N̓k :U)1뵙'\nL& \$8ElDihq%\"NcI@회6|Pe,{ śfu\"f(l-\\P5f|kP\nh(p&Nzb\r3*ֈL{zuLeoPͲVz\n<|N1l)9z*j#h)y_!gut!^My\rj4xҞ\"U] Xj>Cr:w\n׭t`%!CzȐ\0^Jxa4.cXmUY|\rHR%#N\$00.淝:2OA&\02 y0apYC\0{ IU1>|4 \0W@oQ\0An߈y.hFP\nx<\rDx}.Bh\0ʳ!uBE61U`i9噎=Kmi{?H˭wk>G)v-٥Z:m+CsQh\n[W)3ï\nH\0\n9\rsd3|h|9p,^WsգŒC/c\">AaNh0 {8Bȇ@0!t O-\n^9j/N7D\"pHsq^5Nˢ߁ ɗp WoyYr4Ί-9SXŞ&'Cuaz~d\n7 ??mnvKҶkWǐm+ba9\\/~˸ݸ|tcp%F0}p z\0Z5=qtTU\" u<.ugW&¿]f3י9 ?h6m\0tŏf,]\$u^-_UGԾ%&i(]0kGr'z \$?P~Kq\\*_gW2t");}elseif($_GET["file"]=="jush.js"){header("Content-Type: text/javascript; charset=utf-8");echo -lzw_decompress("v0F==FS _6MƳr:ECIo:CXc\r؄J(:=Ea28x?'iSANNxsNBVl0S Ul(D|҄P>E㩶yH ch-3Eb bpEp9.~\n?Kbiw|`d.x8EN!23\rYy6GFmY8o7\n\r0\0Dbc!Q7Шd8~N)Eг`Ns`S)O /<x9o3n2!r:;+9CȨ\n<`b\\?`4\r#`8\$c1cc{n7ANRLi\r1!( j´+62X8+.\r!xh' 6S\0RO\n1(W07q:NE:68n+մ5_(s\r /m6P@EQ9\nV-\".:J8weq|؇X]Y XezW 7Z1hQfuj4Z{p\\AUJ<k@ɍ@}&L7 UwuYh2@u P7Ah3 ÛXEͅZ]l@Mplv) HWy>Y-Y/hC[*F#~!`\r#0PC˝f \\^%B<\\fޱ&/OL\\jFjZ1\\:ƴ>NXaFAfh{\"s\n64?8^p\"띰ȸ\\e(PNq[gr&}PhW*r_sPh\nom#.\0@pdW \$ҺQ۽Tl0 HdH)ۏ )PHgUBe\rt:\0)\"t,[(DO\nR8!Ƭ֚lAV4hSq<@}gK]]=90'wA<a~WD|A2XU2yŊ=p)\0P sn3rf\0FvG I@%+_I` \r.NKI[ʖSJaUfSzM %\"Q|9Bcaq\08#Zle5#U@iUG‚n%Ұs;gxLpP?BQ\\b 龒Q=7:ݡQ\r:t:y( \nd)\nX;CaA\rPGH!@9\n\nAl~HV\nsիƯbBr3\rP% ф\r}b/Α\$5PC\"wB_UgAt夅^QUjBvh졄4) +)lj-&`9qPy6\r.y&ảE80kAVT7px)ޡ~M΁!EtP\\ϗm~cB\\\nmv{9`G[~xsL\\IXwy\nuSc1?A*{ Ϳ|9޾/E4/W[ȳ>] rv~B PB`TH>0B)>N!4\"xW-X)0BhA0J2P@>AA)SnnOQbrҦh@ȋ(\nF˜ϖƙ(γP\0No}lVԍp8%2>B m @G(s\$d̜v\"pw6}(V KˠKL ¾W q\r̤ʀQL%PdJHNxK:\n %fn%ҌDM [#T\rr.LL&W/>h6 @E LPvC6O:Yh^ mn6nj>7`z `N\\j\rg\ri2I\$\"@[`hM3q3d \0ֵys\$ `D\$\0QOf1&\"~0 ` \"@ZG) Y:SD.S%͈3 dmU5 .p2Q3VذWBDt Cq#C@IPDT_D:Qf-WX\rpUDt&7@? }O122#UK*)긋0o<>]HƿrLGNW%M^9X:ɥNsE@xy(HƙMd5<52B k!>\r^J`ISN4'ƚ**`>`|0,DJFxb 4lTؕ[[\\Ԡ\\{6\\ޖ (#mJԣ,`IJխl jj֟?֣kGkT9]3ohuJW\rk)\03@x,- 5B=࣐#gf&Z`#o Xf\r Jh5rqnz s,6otDybhCtn9n`X&\r'tpL7Η&lZ-w{ r@iUzM{rxאmSB\r@ H*BD.7(3XCV ʘɆ:6;ZX0 ̢#cMyUi2,qF˚bJ @gG|4gmzW )r|X`Scէ˙c!B/}{4J\0Ýn Kuz @mѮ߭y͞y\")uY睘scy둶y7||{Ϙ*)4Y`ϵ[v^NXW7;_*x\r߼߉xm+m \$\nl);|٠ڙ:N:_8NU5;p+UL \\9 O:IzQT)XGJ{w8ʼnU\$PxTYpjhJÀJ{@ǂZsh˘X\0ۖlӖθY}^@u2S#U;È|P\\#|<\\J۝,\\̚E]Wl,ɖ<Ό>Yn),ΙrԼ⍺] \$qDJ=XI-ŀallõ]\\w(iC׃tkRu\\+>)3PP6M%pԌ A3qmu2fzۯ4s `ێ-kS%6\"IT5~\"Ut_ TuvֽYw0I7L\$1M?e@3q{,\"&ViI?mUWR\"uiTuqj\"G(-By5c? wT`eiJtbgU3@~+\0MG7`\0_- ?\rV?FO6`\noϚIn*pe\"T{[Гp^\nlh@l0[/p oJKX<=9{Ǿ6!OQx{ZVFԎ`~IߖL)Q[TMT*BC~ \ngÈŅp9zKwzO9di^'+Dz4gHALy\nr/%|ȅ̒ގ\$)1P30(\r+\nZ z))\0*\0k2υ(E86stf& +;76&K_(9f,@-4l\$ۂe7\0:lLM7.\0 |oJ۩Zu̺'y{H,#\0vU@9! '&G@_-ٿt;:uDPUцjH 9FBcCiBwMtx PM?p=8lg~ta%]b\$\rra,6tW)\0UF |쓢vhQ*Ol.C\$\\ցRR[j[] KRJ>.;F=Rڌ<rM=Ԓh^Y\\Rmn Nn*gB5^Q҉@OxHIT9)(&}A)P\\/_!́Hڑ\0B\$z4TYuJv\0ꏃ%@32\0Sm--Gi@Q%jY+FuzlSW3ŷOrU\$E;M\\Աu/jeQ,#JXP&|Uс`h2n6I+ né-nD`ɔ@B!;XsmȯpC`p5O%Z/5#CK`XcbQ#Qaqp)G+~ۖ\"lM_^z!EХap86n+oJ,󇢺w\n]̓pR'eJq'ܨ%'nlOh@>NBȊX5,rGrZ l\r(ˑjIl%b;s+נWg7)*e13Le@(p\0ÎdsAD\0Í\\bD\nu/&1XRץE楂5T\r}7A٬k\\͵q2܀Z-wotZ]-yq2j+ՆխënXA\0\0+S+Y6_BV7znZ@̆Էƴ]-UMJc*s\"+\0xB3^0\rc\\j*P-\\Q8ʎlc%XVB},;(`*Q \$r{KC%\rx Q,/v\" p~   J5e E-^X;c\\׬m7?6C*庮,7Hf/9e0[@!bUБ=i.Jocj;B\0]ՔvG8O\\\0NJO\$.& p\\ H1bp:F\"8ŶVxRx=3f1+| \0BkbPLђ\$zc i,Pcb,pn(,`'/~kֵpq-ȱV܆\r  \0 dS+\"鈭1\0(-1~tcfBۑb}ؠ0<1\rL\$2d\"1&ƀBóN\rB\rr\"?vdZ.\".\0?w9o\r0с!dR뤶\0Hra%Њ+\0yrHsϒ4W#,\$ \0*xB\nP| 8@/\02UbΪx! dN3S?P(g\n8ppS 9@' \0y\0y46H<\n`SCYjp:\0N(ӍX4kgDyt{ >\0P`O\\s <?4w~f@z~hBWxhAO'=P֌ײ=c[ysg|掳%M,Q8 'X hlUs ٢ 4qDx*8gNLBȖ;}%e@Yvho!\$NcCX@;YH'@^ Rf^x\0^os_f;pj]:Ԥ.mLl\rV\0@܀\"1%!_@-]8f-a]YWψh`(J@\rY kB(x:5B\\QkO[:0¼ukX\\P\0[xŮ`RIGk5YzPҙ=l=e\02=k` [KB8C}kc{#آldfF.̵-A6KPv'lHiA8C G`Gbyپ- 0Ĭ;[*_mlH{(;Uo*],ċX80CK ! N(I` VDvwrpc,\09~sXnr[ec4dpi \\e2laZCkglbB7x%Żk` \n( @ź5ݘϭċ#tܖE}ńsLvE\nQQ۔76}Orjb%@7۵hw͹nk`Vq~~4{ˁ;8p2mP+ daX8&,=n}!/K&\rtH)/Y6@=}EUlK\\kb[1GM)J xXET /\"-<4xDp(3ʟߴ'+\$\rF܉\\Rپ-nܧ\n?F~a+x\rl,fC+wiG.X!_71ym~ D7 G;gwb/89x@!R9éJqYh'3Ĭ*Xwˮ^  75`:#+ۭ0S@0o7:&~r (ZG1zpdN`/Fz@8t0Z_ 0{LnׇoEÍ=rGj]H ҷAf+Vm7B*q}cw=ۄgwE-H&Rh4M Z_L]WV'զ\"u @-aMs@9L:Ւ]#aoyb\n\0[rp*}Qbw?;Vcʰ .s索XְyR=&drO2j!uxR{N&ѻ5}vy۰1o8Z#{NrQ:BHzW{W{:r}D\$j7)PCvVXdD7፮,h_]^qσܟxO]?p{\"O8Q?xw}J?9kx5bu& o^>wg]h#?+m(/ng 55<;ȅ˳x%;(V;o-˽.enkp_FX9WjQCB اv3R=솦;a][yȻ4/|##v @_ǭ}UM>1\rCMqCdĘU#[ɦm\n\\\r6'> i I;R \0X{~wH/vL\n9?do,x)#>#b`',gT~t Y}/]-'\0( @ϡ/>~olH/qDT~o|a #|F8dϥ/|uVh\n>{ _{G IaE&{VNodFBX׽(IN@Y9ɿ\n-{@Ro۽&o^3Y>|-~/?*`\n?S!Vϩ>}O⟕>RM?b@\nO? 0s\0Iπ+'X,`'?\0K௸CO2t>LOLv3\0[PΛlH\nhlr\$/\0+\0  \r@?K)<#Ps\0?K@@\0ꀱ\0%, p)?#\$\niL3[3? @O\0 A|P\0D? N@\$,/ \$B?0\0 \$\0VLhͅ >#6+>R:p>7#\\гlΓAo<3l pe#7A@)@#AV?h 0*Z\0*\\Au_>kb?>\"c #6>B\"\0>\0ps?DPvA\\ #(>3EP>:<\nO\0d\"@A\0Aꎐ5 # c +@h؀\$\0:M3n3c`„T+I8B3@* @'”\\pM 8OlM c# 7B h`, 6o\\\\.S>DC0ƣS\$2B@&A>Lk 4A ܭ3@ ;>p \r\n3|\0\nOA:6\0 d7@8%`#É[=D\n3uLC9BC:`\$!h\$;B20u[ 8C <篟dP|=q 2pV> |*1\0\rE\0dAovPt'?d,PD*@ /#6CPBO\n8',5ÏE Lq\r?mEq\nzC@+r60C?3/̓\nP܏lHDͤ5\ni)D1(D7u>\n\$Aj4\0?4?LK A>Ͻ?qDI@\$;D8 &?;cJأbP\0 B# 3`‚)O3CMZ50EO6C\0\\\$p[9B#cj<11 B;cDBh? @`*.qbX o?;\0Kp38 RC6/\$>lͤpI ,!*\0+>= ]w\nT^pgź #\0?\$J@ \0*C*7 h\nj?:pAr]YLDbь B4d@(DcE@>\$ 4ؑ </?\n/ĺ>gp>I6i8; Ɖc1AZ6!}œ_ dUкZP4D|;rC[9ꤥ5I5I\0EOB\0{9qC|\"pUZP` GcQCGPJO6(B z>7F0I:vOǑBuE,\\0Ǹr8qgA6>74D0qG>-SE@#G.*\0i\n\\-`*\0q\n\\e\"— )qun@`>D8 \0/@_ڀw#ǍlG>Ԅ-+ߐ6Wl%6l0\$5s&\r*\0e!rqI \"> Ș3EIL\"94G\$/\0 \0 -2>/倘Gg\n/LqBP\"#7zHMԅOO\0̏&2LT^P @Zd=]Q=KCE\0QO\\s0>qCzG> @?0?\\o¿4M d19\0G? m\rD(ԴLd\\KJ8\rE-2 4U 0VAR=Ee5!2mqAEV\$ϕ I9 C&\\G)D 4I#p#C\\xC(\$H:NI(J\0΋\"w\0 ,)PǬϋ4ex-JKPrԂ-`2_7-!\"JؐJH.o-.\$ d\nH\"؆o+sؐ 3+ 6/a.\rnd˨ ?z1\0 ? 7€̄\0?jēVq?\$ 9-2ID9Lg1h[ۏ1sC1sީ9Lz?  LWdovL#9`ͨ0ɦWh>\0> /)DL\$a9*<:C+JKPJ\"L\\*b 164 ja+\0%Qf ;KE`>>7tHwMPn3I:fD \rX\r!\0\nBsVM63KO:Įc5 X!AQ9z%` {:HDE cv!Ν,:X)(%2 a&,l38j1|͇=CRr<\$\"KB3'9:|)`Oj+9 }-S>2UU5BUNNSNO3KNЎ @:/7āQ!@. ( &v9d^ج![.pGc K#?fpÝeOd2\0k6),\r65GmOFVdix,a=O@ sc6`¤\rJ\0;H(*r -.M[BΠ!(MLPbUpJ:1E !:,:YB*KRޤr0جLa6;6+2 )UB`JsV0:0 _B14/AONe)A ~\r ̠NPw,C3殹T3q9}SQ\$APD;!:! Ys6RԁFt#CπQ\\`rXr<'72ؼO-w9Ӥb853{\07\ra\"\nh[jFa)+2<%M|m|\n54p &bUQ8\0Eѥ4AAN,ˍ˝FؕTo(G`OGAGl`:=\0<\0TNϬ=. 6Ζ(SBİ\0,J?.(%,?B.<2hM΃I`Ό4*˯G 'I9RXE%,O\r,ʈs*(}<ڗ@cRj]D`URγ,.dr \\NlR-󓴵˚kQK,I.T@1\0K4/]04KK\nC&F,SF0ԵS.-K2RLe'7L0oK3TS.4T:X̾49/:WR9.62J6S .cSv^ 0O|LMD%34z3Id\n#tPq5h{!7Zۻ2 thʠ!K7Y1Sƺ! 1{ÀӼuEM4{֔4TGa;|5\"SNkS8D?JcU0կRtB { 5qSB,\0pj!\0006K1 ƒX @DV_.(_`-`Dua .X\rFRFDSRxhLU`4\n͌To9vFUm\"uDՀ \rw+\r`V(VPj]K⏜4oT.\$mDĵ Se@3׭;@7m:륥d!ZQ[5P 7;S/B!McGTW(V䯕<7[lt^\ri0Pa|VX̃a[x9 H]^&mҤ\0Xl㤫ހTOXl0(,`oau3U#'0+ӽ8]HT!XX\ryW@\$MQb-)X o\n|`-q-bٶUVc  3N=5vAg\r8\ra^Ю0 \"䱿R,3D2iG5 ?:\rT!wgM[7;[v{֪Cs\rU9d`yh\0h@~qT4_QVvF5 Ps*Mc]I91T0mV)SX[*cdA+1hb:IhM@s>P9vuT>ֽ` O5ccjϏ?QTmq\$=(V6F\rTr~\0|mC)[ՂN,d+;Qm-Ň\$oB-sRN:/8> b.40>,.tںJ\r\rk6 WMm3[x5 qLb6 ;`Lm4I6^d!5`7:aOh4-3HUmڒ^_NTꍱ[PH؝a=UH\rE \rjMSPsN6MXQ 5 \rۭYKqs[s-\0]aNd5?+CfRe^+@[P5GaҵoM@w\0QyoKUe}[_oK@nwxVpEPuo5R8c . Uo5w\0\n(%NpV֮JAqtZ#Ոk6iEVR{qf{3l@PqHr!VS]6'q@> R=E\0S+ UjʔY[źuUոջrp6s]h't mJ8QUUuDm2zЄBKv'Pl]AAfch\"RVpX;U5܎cְzPTuUQYZ5UJen5novs=HuZoaitoUڻuuH5n=jSUPZMNQmobFA>]i\\ G\rTvւ\"2v4γ=]2z\n=:\rh*sfw_Ut8[݄8]+=G7z=nۗJu8|4u] caz׀Ywt]ܪ ^r)w]%i,e}w0<3nLr.iy-7(K&\r_;f[̈\\\rX+Ha=ܳbnc , c!8\$mVvRJ]g -WOsR(5]WHVC\\5@D!s%Β^sd%N97փ{U+I-ռP\0\"FЈS5F[zsk(7Ez1-@x̹>MgWMjԻn\n ^tLUc}AVR@;X-\nXsYn^c{j7:]E\"JVJe~.QHgT3rcVBce3e^Հ98\n Z(䇪 ;tzՍ# q#\0V .\nS/Dk");}else{header("Content-Type: image/gif");switch($_GET["file"]){case"plus.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0!M*)o) qe#L\0;";break;case"cross.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0##\naFo~y._wa1J GL6]\0\0;";break;case"up.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0 MQN\n}a8yaŶ\0\0;";break;case"down.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0 M*)[W\\L&ٜƶ\0\0;";break;case"arrow.gif":echo"GIF89a\0\n\0\0\0!\0\0\0,\0\0\0\0\0\n\0\0iӲ޻\0\0;";break;}}exit;}function -connection(){global$e;return$e;}function -adminer(){global$b;return$b;}function -idf_unescape($Kc){$gd=substr($Kc,-1);return -str_replace($gd.$gd,$gd,substr($Kc,1,-1));}function -escape_string($X){return -substr(q($X),1,-1);}function -number($X){return -preg_replace('~[^0-9]+~','',$X);}function -remove_slashes($Ne,$oc=false){if(get_magic_quotes_gpc()){while(list($y,$X)=each($Ne)){foreach($X -as$ad=>$W){unset($Ne[$y][$ad]);if(is_array($W)){$Ne[$y][stripslashes($ad)]=$W;$Ne[]=&$Ne[$y][stripslashes($ad)];}else$Ne[$y][stripslashes($ad)]=($oc?$W:stripslashes($W));}}}}function -bracket_escape($Kc,$_a=false){static$mg=array(':'=>':1',']'=>':2','['=>':3');return -strtr($Kc,($_a?array_flip($mg):$mg));}function -charset($e){return(version_compare($e->server_info,"5.5.3")>=0?"utf8mb4":"utf8");}function -h($Gf){return -str_replace("\0","�",htmlspecialchars($Gf,ENT_QUOTES,'utf-8'));}function -nbsp($Gf){return(trim($Gf)!=""?h($Gf):" ");}function -nl_br($Gf){return -str_replace("\n","
",$Gf);}function -checkbox($E,$Y,$Na,$ed="",$Zd="",$Ra=""){$K="";return($ed!=""||$Ra?"$K".h($ed)."":$K);}function -optionlist($de,$rf=null,$Eg=false){$K="";foreach($de -as$ad=>$W){$ee=array($ad=>$W);if(is_array($W)){$K.='';$ee=$W;}foreach($ee -as$y=>$X)$K.=''.h($X);if(is_array($W))$K.='';}return$K;}function -html_select($E,$de,$Y="",$Yd=true){if($Yd)return"";$K="";foreach($de -as$y=>$X)$K.="";return$K;}function -select_input($wa,$de,$Y="",$Ae=""){return($de?"
\n";}function -selectOrderPrint($fe,$d,$v){print_fieldset("sort",'Sort',$fe);$s=0;foreach((array)$_GET["order"]as$y=>$X){if($X!=""){echo"
".select_input(" name='order[$s]' onchange='selectFieldChange(this.form);'",$d,$X),checkbox("desc[$s]",1,isset($_GET["desc"][$y]),'descending')."
\n";$s++;}}echo"
".select_input(" name='order[$s]' onchange='selectAddRow(this);'",$d),checkbox("desc[$s]",1,false,'descending')."
\n","
\n";}function -selectLimitPrint($z){echo"
".'Limit'."
";echo"","
\n";}function -selectLengthPrint($ag){if($ag!==null){echo"
".'Text length'."
","","
\n";}}function -selectActionPrint($v){echo"
".'Action'."
",""," ","\n","
\n";}function -selectCommandPrint(){return!information_schema(DB);}function -selectImportPrint(){return!information_schema(DB);}function -selectEmailPrint($Qb,$d){}function -selectColumnsProcess($d,$v){global$yc,$Ac;$N=array();$r=array();foreach((array)$_GET["columns"]as$y=>$X){if($X["fun"]=="count"||($X["col"]!=""&&(!$X["fun"]||in_array($X["fun"],$yc)||in_array($X["fun"],$Ac)))){$N[$y]=apply_sql_function($X["fun"],($X["col"]!=""?idf_escape($X["col"]):"*"));if(!in_array($X["fun"],$Ac))$r[]=$N[$y];}}return -array($N,$r);}function -selectSearchProcess($m,$v){global$e,$x;$K=array();foreach($v -as$s=>$u){if($u["type"]=="FULLTEXT"&&$_GET["fulltext"][$s]!="")$K[]="MATCH (".implode(", ",array_map('idf_escape',$u["columns"])).") AGAINST (".q($_GET["fulltext"][$s]).(isset($_GET["boolean"][$s])?" IN BOOLEAN MODE":"").")";}foreach((array)$_GET["where"]as$X){if("$X[col]$X[val]"!=""&&in_array($X["op"],$this->operators)){$db=" $X[op]";if(preg_match('~IN$~',$X["op"])){$Mc=process_length($X["val"]);$db.=" ".($Mc!=""?$Mc:"(NULL)");}elseif($X["op"]=="SQL")$db=" $X[val]";elseif($X["op"]=="LIKE %%")$db=" LIKE ".$this->processInput($m[$X["col"]],"%$X[val]%");elseif($X["op"]=="ILIKE %%")$db=" ILIKE ".$this->processInput($m[$X["col"]],"%$X[val]%");elseif(!preg_match('~NULL$~',$X["op"]))$db.=" ".$this->processInput($m[$X["col"]],$X["val"]);if($X["col"]!="")$K[]=idf_escape($X["col"]).$db;else{$Ya=array();foreach($m -as$E=>$l){$Yc=preg_match('~char|text|enum|set~',$l["type"]);if((is_numeric($X["val"])||!preg_match('~(^|[^o])int|float|double|decimal|bit~',$l["type"]))&&(!preg_match("~[\x80-\xFF]~",$X["val"])||$Yc)){$E=idf_escape($E);$Ya[]=($x=="sql"&&$Yc&&!preg_match("~^utf8_~",$l["collation"])?"CONVERT($E USING ".charset($e).")":$E);}}$K[]=($Ya?"(".implode("$db OR ",$Ya)."$db)":"0");}}}return$K;}function -selectOrderProcess($m,$v){$K=array();foreach((array)$_GET["order"]as$y=>$X){if($X!="")$K[]=(preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~',$X)?$X:idf_escape($X)).(isset($_GET["desc"][$y])?" DESC":"");}return$K;}function -selectLimitProcess(){return(isset($_GET["limit"])?$_GET["limit"]:"50");}function -selectLengthProcess(){return(isset($_GET["text_length"])?$_GET["text_length"]:"100");}function -selectEmailProcess($Z,$sc){return -false;}function -selectQueryBuild($N,$Z,$r,$fe,$z,$F){return"";}function -messageQuery($I,$bg){global$x;restart_session();$Fc=&get_session("queries");$t="sql-".count($Fc[$_GET["db"]]);if(strlen($I)>1e6)$I=preg_replace('~[\x80-\xFF]+$~','',substr($I,0,1e6))."\n...";$Fc[$_GET["db"]][]=array($I,time(),$bg);return" ".@date("H:i:s")." ".'SQL command'.""."';}function -editFunctions($l){global$Lb;$K=($l["null"]?"NULL/":"");foreach($Lb -as$y=>$yc){if(!$y||(!isset($_GET["call"])&&(isset($_GET["select"])||where($_GET)))){foreach($yc -as$ze=>$X){if(!$ze||preg_match("~$ze~",$l["type"]))$K.="/$X";}if($y&&!preg_match('~set|blob|bytea|raw|file~',$l["type"]))$K.="/SQL";}}if($l["auto_increment"]&&!isset($_GET["select"])&&!where($_GET))$K='Auto Increment';return -explode("/",$K);}function -editInput($Q,$l,$wa,$Y){if($l["type"]=="enum")return(isset($_GET["select"])?" ":"").($l["null"]?" ":"").enum_input("radio",$wa,$l,$Y,0);return"";}function -processInput($l,$Y,$p=""){if($p=="SQL")return$Y;$E=$l["field"];$K=q($Y);if(preg_match('~^(now|getdate|uuid)$~',$p))$K="$p()";elseif(preg_match('~^current_(date|timestamp)$~',$p))$K=$p;elseif(preg_match('~^([+-]|\\|\\|)$~',$p))$K=idf_escape($E)." $p $K";elseif(preg_match('~^[+-] interval$~',$p))$K=idf_escape($E)." $p ".(preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i",$Y)?$Y:$K);elseif(preg_match('~^(addtime|subtime|concat)$~',$p))$K="$p(".idf_escape($E).", $K)";elseif(preg_match('~^(md5|sha1|password|encrypt)$~',$p))$K="$p($K)";return -unconvert_field($l,$K);}function -dumpOutput(){$K=array('text'=>'open','file'=>'save');if(function_exists('gzencode'))$K['gz']='gzip';return$K;}function -dumpFormat(){return -array('sql'=>'SQL','csv'=>'CSV,','csv;'=>'CSV;','tsv'=>'TSV');}function -dumpDatabase($i){}function -dumpTable($Q,$If,$Zc=0){if($_POST["format"]!="sql"){echo"\xef\xbb\xbf";if($If)dump_csv(array_keys(fields($Q)));}else{if($Zc==2){$m=array();foreach(fields($Q)as$E=>$l)$m[]=idf_escape($E)." $l[full_type]";$g="CREATE TABLE ".table($Q)." (".implode(", ",$m).")";}else$g=create_sql($Q,$_POST["auto_increment"]);set_utf8mb4($g);if($If&&$g){if($If=="DROP+CREATE"||$Zc==1)echo"DROP ".($Zc==2?"VIEW":"TABLE")." IF EXISTS ".table($Q).";\n";if($Zc==1)$g=remove_definer($g);echo"$g;\n\n";}}}function -dumpData($Q,$If,$I){global$e,$x;$vd=($x=="sqlite"?0:1048576);if($If){if($_POST["format"]=="sql"){if($If=="TRUNCATE+INSERT")echo -truncate_sql($Q).";\n";$m=fields($Q);}$J=$e->query($I,1);if($J){$Rc="";$Ia="";$bd=array();$Kf="";$lc=($Q!=''?'fetch_assoc':'fetch_row');while($L=$J->$lc()){if(!$bd){$Hg=array();foreach($L -as$X){$l=$J->fetch_field();$bd[]=$l->name;$y=idf_escape($l->name);$Hg[]="$y = VALUES($y)";}$Kf=($If=="INSERT+UPDATE"?"\nON DUPLICATE KEY UPDATE ".implode(", ",$Hg):"").";\n";}if($_POST["format"]!="sql"){if($If=="table"){dump_csv($bd);$If="INSERT";}dump_csv($L);}else{if(!$Rc)$Rc="INSERT INTO ".table($Q)." (".implode(", ",array_map('idf_escape',$bd)).") VALUES";foreach($L -as$y=>$X){$l=$m[$y];$L[$y]=($X!==null?unconvert_field($l,preg_match('~(^|[^o])int|float|double|decimal~',$l["type"])&&$X!=''?$X:q($X)):"NULL");}$mf=($vd?"\n":" ")."(".implode(",\t",$L).")";if(!$Ia)$Ia=$Rc.$mf;elseif(strlen($Ia)+4+strlen($mf)+strlen($Kf)<$vd)$Ia.=",$mf";else{echo$Ia.$Kf;$Ia=$Rc.$mf;}}}if($Ia)echo$Ia.$Kf;}elseif($_POST["format"]=="sql")echo"-- ".str_replace("\n"," ",$e->error)."\n";}}function -dumpFilename($Jc){return -friendly_url($Jc!=""?$Jc:(SERVER!=""?SERVER:"localhost"));}function -dumpHeaders($Jc,$Gd=false){$oe=$_POST["output"];$gc=(preg_match('~sql~',$_POST["format"])?"sql":($Gd?"tar":"csv"));header("Content-Type: ".($oe=="gz"?"application/x-gzip":($gc=="tar"?"application/x-tar":($gc=="sql"||$oe!="file"?"text/plain":"text/csv")."; charset=utf-8")));if($oe=="gz")ob_start('ob_gzencode',1e6);return$gc;}function -homepage(){echo'

-',$this->name(),' ',$ga,' -',(version_compare($ga,$_COOKIE["adminer_version"])<0?h($_COOKIE["adminer_version"]):""),' -

-';if($Fd=="auth"){$pc=true;foreach((array)$_SESSION["pwds"]as$Jg=>$wf){foreach($wf -as$O=>$Fg){foreach($Fg -as$V=>$G){if($G!==null){if($pc){echo"

\n";$pc=false;}$tb=$_SESSION["db"][$Jg][$O][$V];foreach(($tb?array_keys($tb):array(""))as$i)echo"($Eb[$Jg]) ".h($V.($O!=""?"@$O":"").($i!=""?" - $i":""))."
\n";}}}}}else{if($_GET["ns"]!==""&&!$Fd&&DB!=""){$e->select_db(DB);$S=table_status('',true);}if(support("sql")){echo' - -';}$this->databasesPrint($Fd);if(DB==""||!$Fd){echo"

".'No tables.'."\n";else$this->tablesPrint($S);}}}function -databasesPrint($Fd){global$b,$e;$h=$this->databases();echo'

-

-';hidden_fields_get();$rb=" onmousedown='dbMouseDown(event, this);' onchange='dbChange(this);'";echo"DB: ".($h?"":''),"\n";if($Fd!="db"&&DB!=""&&$e->select_db(DB)){}echo(isset($_GET["sql"])?'':(isset($_GET["schema"])?'':(isset($_GET["dump"])?'':(isset($_GET["privileges"])?'':"")))),"

\n";}function -tablesPrint($S){echo"

\n";foreach($S -as$Q=>$Df){echo'".'select'." ";$E=$this->tableName($Df);echo(support("table")||support("indexes")?'$E":"$E")."
\n";}}}$b=(function_exists('adminer_object')?adminer_object():new -Adminer);if($b->operators===null)$b->operators=$be;function -page_header($eg,$k="",$Ha=array(),$fg=""){global$ca,$ga,$b,$Eb,$x;page_headers();if(is_ajax()&&$k){page_messages($k);exit;}$gg=$eg.($fg!=""?": $fg":"");$hg=strip_tags($gg.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$b->name());echo' - - - - - -',$hg,' - - -';if($b->head()){echo' - -';if(file_exists("adminer.css")){echo' -';}}echo' -> - - -

- -
-';if($Ha!==null){$_=substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1);echo'

$gg

\n","\n";restart_session();page_messages($k);$h=&get_session("dbs");if(DB!=""&&$h&&!in_array(DB,$h,true))$h=null;stop_session();define("PAGE_HEADER",1);}function -page_headers(){global$b;header("Content-Type: text/html; charset=utf-8");header("Cache-Control: no-cache");if($b->headers()){header("X-Frame-Options: deny");header("X-XSS-Protection: 0");}}function -page_messages($k){$Bg=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Dd=$_SESSION["messages"][$Bg];if($Dd){echo"
".implode("
\n
",$Dd)."
\n";unset($_SESSION["messages"][$Bg]);}if($k)echo"
$k
\n";}function -page_footer($Fd=""){global$b,$T;echo'
- -';if($Fd!="auth"){echo'
-

- - -

-
-';}echo' - -';}function -int32($D){while($D>=2147483648)$D-=4294967296;while($D<=-2147483649)$D+=4294967296;return(int)$D;}function -long2str($W,$Ng){$mf='';foreach($W -as$X)$mf.=pack('V',$X);if($Ng)return -substr($mf,0,end($W));return$mf;}function -str2long($mf,$Ng){$W=array_values(unpack('V*',str_pad($mf,4*ceil(strlen($mf)/4),"\0")));if($Ng)$W[]=strlen($mf);return$W;}function -xxtea_mx($Sg,$Rg,$Lf,$ad){return -int32((($Sg>>5&0x7FFFFFF)^$Rg<<2)+(($Rg>>3&0x1FFFFFFF)^$Sg<<4))^int32(($Lf^$Rg)+($ad^$Sg));}function -encrypt_string($Ff,$y){if($Ff=="")return"";$y=array_values(unpack("V*",pack("H*",md5($y))));$W=str2long($Ff,true);$D=count($W)-1;$Sg=$W[$D];$Rg=$W[0];$H=floor(6+52/($D+1));$Lf=0;while($H-->0){$Lf=int32($Lf+0x9E3779B9);$Kb=$Lf>>2&3;for($pe=0;$pe<$D;$pe++){$Rg=$W[$pe+1];$Hd=xxtea_mx($Sg,$Rg,$Lf,$y[$pe&3^$Kb]);$Sg=int32($W[$pe]+$Hd);$W[$pe]=$Sg;}$Rg=$W[0];$Hd=xxtea_mx($Sg,$Rg,$Lf,$y[$pe&3^$Kb]);$Sg=int32($W[$D]+$Hd);$W[$D]=$Sg;}return -long2str($W,false);}function -decrypt_string($Ff,$y){if($Ff=="")return"";if(!$y)return -false;$y=array_values(unpack("V*",pack("H*",md5($y))));$W=str2long($Ff,false);$D=count($W)-1;$Sg=$W[$D];$Rg=$W[0];$H=floor(6+52/($D+1));$Lf=int32($H*0x9E3779B9);while($Lf){$Kb=$Lf>>2&3;for($pe=$D;$pe>0;$pe--){$Sg=$W[$pe-1];$Hd=xxtea_mx($Sg,$Rg,$Lf,$y[$pe&3^$Kb]);$Rg=int32($W[$pe]-$Hd);$W[$pe]=$Rg;}$Sg=$W[$D];$Hd=xxtea_mx($Sg,$Rg,$Lf,$y[$pe&3^$Kb]);$Rg=int32($W[0]-$Hd);$W[0]=$Rg;$Lf=int32($Lf-0x9E3779B9);}return -long2str($W,true);}$e='';$Ec=$_SESSION["token"];if(!$Ec)$_SESSION["token"]=rand(1,1e6);$T=get_token();$_e=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$X){list($y)=explode(":",$X);$_e[$y]=$X;}}function -add_invalid_login(){global$b;$nc=get_temp_dir()."/adminer.invalid";$o=@fopen($nc,"r+");if(!$o){$o=@fopen($nc,"w");if(!$o)return;}flock($o,LOCK_EX);$Uc=unserialize(stream_get_contents($o));$bg=time();if($Uc){foreach($Uc -as$Vc=>$X){if($X[0]<$bg)unset($Uc[$Vc]);}}$Tc=&$Uc[$b->bruteForceKey()];if(!$Tc)$Tc=array($bg+30*60,0);$Tc[1]++;$uf=serialize($Uc);rewind($o);fwrite($o,$uf);ftruncate($o,strlen($uf));flock($o,LOCK_UN);fclose($o);}$xa=$_POST["auth"];if($xa){$Uc=unserialize(@file_get_contents(get_temp_dir()."/adminer.invalid"));$Tc=$Uc[$b->bruteForceKey()];$Md=($Tc[1]>30?$Tc[0]-time():0);if($Md>0)auth_error(lang(array('Too many unsuccessful logins, try again in %d minute.','Too many unsuccessful logins, try again in %d minutes.'),ceil($Md/60)));session_regenerate_id();$Jg=$xa["driver"];$O=$xa["server"];$V=$xa["username"];$G=(string)$xa["password"];$i=$xa["db"];set_password($Jg,$O,$V,$G);$_SESSION["db"][$Jg][$O][$V][$i]=true;if($xa["permanent"]){$y=base64_encode($Jg)."-".base64_encode($O)."-".base64_encode($V)."-".base64_encode($i);$Ke=$b->permanentLogin(true);$_e[$y]="$y:".base64_encode($Ke?encrypt_string($G,$Ke):"");cookie("adminer_permanent",implode(" ",$_e));}if(count($_POST)==1||DRIVER!=$Jg||SERVER!=$O||$_GET["username"]!==$V||DB!=$i)redirect(auth_url($Jg,$O,$V,$i));}elseif($_POST["logout"]){if($Ec&&!verify_token()){page_header('Logout','Invalid CSRF token. Send the form again.');page_footer("db");exit;}else{foreach(array("pwds","db","dbs","queries")as$y)set_session($y,null);unset_permanent();redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1),'Logout successful.');}}elseif($_e&&!$_SESSION["pwds"]){session_regenerate_id();$Ke=$b->permanentLogin();foreach($_e -as$y=>$X){list(,$Qa)=explode(":",$X);list($Jg,$O,$V,$i)=array_map('base64_decode',explode("-",$y));set_password($Jg,$O,$V,decrypt_string(base64_decode($Qa),$Ke));$_SESSION["db"][$Jg][$O][$V][$i]=true;}}function -unset_permanent(){global$_e;foreach($_e -as$y=>$X){list($Jg,$O,$V,$i)=array_map('base64_decode',explode("-",$y));if($Jg==DRIVER&&$O==SERVER&&$V==$_GET["username"]&&$i==DB)unset($_e[$y]);}cookie("adminer_permanent",implode(" ",$_e));}function -auth_error($k){global$b,$Ec;$k=h($k);$xf=session_name();if(isset($_GET["username"])){header("HTTP/1.1 403 Forbidden");if(($_COOKIE[$xf]||$_GET[$xf])&&!$Ec)$k='Session expired, please login again.';else{add_invalid_login();$G=get_password();if($G!==null){if($G===false)$k.='
'.sprintf('Master password expired. Implement %s method to make it permanent.','permanentLogin()');set_password(DRIVER,SERVER,$_GET["username"],null);}unset_permanent();}}if(!$_COOKIE[$xf]&&$_GET[$xf]&&ini_bool("session.use_only_cookies"))$k='Session support must be enabled.';$re=session_get_cookie_params();cookie("adminer_key",($_COOKIE["adminer_key"]?$_COOKIE["adminer_key"]:rand_string()),$re["lifetime"]);page_header('Login',$k,null);echo"
\n";$b->loginForm();echo"
";hidden_fields($_POST,array("auth"));echo"
\n","
\n";page_footer("auth");exit;}if(isset($_GET["username"])){if(!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);unset_permanent();page_header('No extension',sprintf('None of the supported PHP extensions (%s) are available.',implode(", ",$Fe)),false);page_footer("auth");exit;}$e=connect();}$j=new -Min_Driver($e);if(!is_object($e)||!$b->login($_GET["username"],get_password()))auth_error((is_string($e)?$e:'Invalid credentials.'));if($xa&&$_POST["token"])$_POST["token"]=$T;$k='';if($_POST){if(!verify_token()){$Oc="max_input_vars";$zd=ini_get($Oc);if(extension_loaded("suhosin")){foreach(array("suhosin.request.max_vars","suhosin.post.max_vars")as$y){$X=ini_get($y);if($X&&(!$zd||$X<$zd)){$Oc=$y;$zd=$X;}}}$k=(!$_POST["token"]&&$zd?sprintf('Maximum number of allowed fields exceeded. Please increase %s.',"'$Oc'"):'Invalid CSRF token. Send the form again.'.' '.'If you did not send this request from Adminer then close this page.');}}elseif($_SERVER["REQUEST_METHOD"]=="POST"){$k=sprintf('Too big POST data. Reduce the data or increase the %s configuration directive.',"'post_max_size'");if(isset($_GET["sql"]))$k.=' '.'You can upload a big SQL file via FTP and import it from server.';}if(!ini_bool("session.use_cookies")||@ini_set("session.use_cookies",false)!==false)session_write_close();function -select($J,$f=null,$ie=array(),$z=0){global$x;$qd=array();$v=array();$d=array();$Fa=array();$tg=array();$K=array();odd('');for($s=0;(!$z||$s<$z)&&($L=$J->fetch_row());$s++){if(!$s){echo"\n","";for($w=0;$wfetch_field();$E=$l->name;$he=$l->orgtable;$ge=$l->orgname;$K[$l->table]=$he;if($ie&&$x=="sql")$qd[$w]=($E=="table"?"table=":($E=="possible_keys"?"indexes=":null));elseif($he!=""){if(!isset($v[$he])){$v[$he]=array();foreach(indexes($he,$f)as$u){if($u["type"]=="PRIMARY"){$v[$he]=array_flip($u["columns"]);break;}}$d[$he]=$v[$he];}if(isset($d[$he][$ge])){unset($d[$he][$ge]);$v[$he][$ge]=$w;$qd[$w]=$he;}}if($l->charsetnr==63)$Fa[$w]=true;$tg[$w]=$l->type;echo"name!=$ge?" title='".h(($he!=""?"$he.":"").$ge)."'":"").">".h($E).($ie?doc_link(array('sql'=>"explain-output.html#explain_".strtolower($E))):"");}echo"\n";}echo"";foreach($L -as$y=>$X){if($X===null)$X="NULL";elseif($Fa[$y]&&!is_utf8($X))$X="".lang(array('%d byte','%d bytes'),strlen($X))."";elseif(!strlen($X))$X=" ";else{$X=h($X);if($tg[$y]==254)$X="$X";}if(isset($qd[$y])&&!$d[$qd[$y]]){if($ie&&$x=="sql"){$Q=$L[array_search("table=",$qd)];$_=$qd[$y].urlencode($ie[$Q]!=""?$ie[$Q]:$Q);}else{$_="edit=".urlencode($qd[$y]);foreach($v[$qd[$y]]as$Ua=>$w)$_.="&where".urlencode("[".bracket_escape($Ua)."]")."=".urlencode($L[$w]);}$X="$X";}echo"
$X";}}echo($s?"
":"

".'No rows.')."\n";return$K;}function -referencable_primary($sf){$K=array();foreach(table_status('',true)as$Pf=>$Q){if($Pf!=$sf&&fk_support($Q)){foreach(fields($Pf)as$l){if($l["primary"]){if($K[$Pf]){unset($K[$Pf]);break;}$K[$Pf]=$l;}}}}return$K;}function -textarea($E,$Y,$M=10,$Ya=80){global$x;echo"";}function -edit_type($y,$l,$Xa,$tc=array()){global$Hf,$tg,$_g,$Xd;$U=$l["type"];echo' -';echo"',($_g?"':''),(isset($l['on_update'])?"':''),($tc?" ":" ");}function -process_length($md){global$Vb;return(preg_match("~^\\s*\\(?\\s*$Vb(?:\\s*,\\s*$Vb)*+\\s*\\)?\\s*\$~",$md)&&preg_match_all("~$Vb~",$md,$td)?"(".implode(",",$td[0]).")":preg_replace('~^[0-9].*~','(\0)',preg_replace('~[^-0-9,+()[\]]~','',$md)));}function -process_type($l,$Va="COLLATE"){global$_g;return" $l[type]".process_length($l["length"]).(preg_match('~(^|[^o])int|float|double|decimal~',$l["type"])&&in_array($l["unsigned"],$_g)?" $l[unsigned]":"").(preg_match('~char|text|enum|set~',$l["type"])&&$l["collation"]?" $Va ".q($l["collation"]):"");}function -process_field($l,$rg){global$x;$vb=$l["default"];return -array(idf_escape(trim($l["field"])),process_type($rg),($l["null"]?" NULL":" NOT NULL"),(isset($vb)?" DEFAULT ".((preg_match('~time~',$l["type"])&&preg_match('~^CURRENT_TIMESTAMP$~i',$vb))||($x=="sqlite"&&preg_match('~^CURRENT_(TIME|TIMESTAMP|DATE)$~i',$vb))||($l["type"]=="bit"&&preg_match("~^([0-9]+|b'[0-1]+')\$~",$vb))||($x=="pgsql"&&preg_match("~^[a-z]+\\(('[^']*')+\\)\$~",$vb))?$vb:q($vb)):""),(preg_match('~timestamp|datetime~',$l["type"])&&$l["on_update"]?" ON UPDATE $l[on_update]":""),(support("comment")&&$l["comment"]!=""?" COMMENT ".q($l["comment"]):""),($l["auto_increment"]?auto_increment():null),);}function -type_class($U){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$y=>$X){if(preg_match("~$y|$X~",$U))return" class='$y'";}}function -edit_fields($m,$Xa,$U="TABLE",$tc=array(),$cb=false){global$e,$Pc;echo' -';if($U=="PROCEDURE"){echo' ';}echo'',($U=="TABLE"?'Column name':'Parameter name'),'Type -Length -Options -';if($U=="TABLE"){echo'NULL -AI',doc_link(array('sql'=>"example-auto-increment.html",'sqlite'=>"autoinc.html",'pgsql'=>"datatype.html#DATATYPE-SERIAL",'mssql'=>"ms186775.aspx",)),'Default value -',(support("comment")?"

".sprintf('%s version: %s through PHP extension %s',$Eb[DRIVER],"".h($e->server_info)."","$e->extension")."\n","

".sprintf('Logged as: %s',"".h(logged_user())."")."\n";$h=$b->databases();if($h){$pf=support("scheme");$Xa=collations();echo"

\n","\n","".(support("database")?"\n";$h=($_GET["dbsize"]?count_tables($h):array_flip($h));foreach($h -as$i=>$S){$if=h(ME)."db=".urlencode($i);echo"".(support("database")?"
 ":"")."".'Database'." - ".'Refresh'.""."".'Collation'."".'Tables'."".'Size'." - ".'Compute'.""."
".checkbox("db[]",$i,in_array($i,(array)$_POST["db"])):""),"".h($i)."";$Wa=nbsp(db_collation($i,$Xa));echo"".(support("database")?"$Wa":$Wa),"".($_GET["dbsize"]?$S:"?")."","".($_GET["dbsize"]?db_size($i):"?"),"\n";}echo"
\n",(support("database")?"
".'Selected'."
\n"."\n"."\n"."
\n":""),"\n","\n","
\n";}}page_footer("db");}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(isset($_GET["import"]))$_GET["sql"]=$_GET["import"];if(!(DB!=""?$e->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect"||$_GET["script"]=="kill")){if(DB!=""||$_GET["refresh"]){restart_session();set_session("dbs",null);}connect_error();exit;}$Xd="RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT";class -TmpFile{var$handler;var$size;function -TmpFile(){$this->handler=tmpfile();}function -write($gb){$this->size+=strlen($gb);fwrite($this->handler,$gb);}function -send(){fseek($this->handler,0);fpassthru($this->handler);fclose($this->handler);}}$Vb="'(?:''|[^'\\\\]|\\\\.)*'";$Pc="IN|OUT|INOUT";if(isset($_GET["select"])&&($_POST["edit"]||$_POST["clone"])&&!$_POST["save"])$_GET["edit"]=$_GET["select"];if(isset($_GET["callf"]))$_GET["call"]=$_GET["callf"];if(isset($_GET["function"]))$_GET["procedure"]=$_GET["function"];if(isset($_GET["download"])){$a=$_GET["download"];$m=fields($a);header("Content-Type: application/octet-stream");header("Content-Disposition: attachment; filename=".friendly_url("$a-".implode("_",$_GET["where"])).".".friendly_url($_GET["field"]));$N=array(idf_escape($_GET["field"]));$J=$j->select($a,$N,array(where($_GET,$m)),$N);$L=($J?$J->fetch_row():array());echo$L[0];exit;}elseif(isset($_GET["table"])){$a=$_GET["table"];$m=fields($a);if(!$m)$k=error();$R=table_status1($a,true);page_header(($m&&is_view($R)?'View':'Table').": ".h($a),$k);$b->selectLinks($R);$bb=$R["Comment"];if($bb!="")echo"

".'Comment'.": ".h($bb)."\n";if($m){echo"\n","\n";foreach($m -as$l){echo"
".'Column'."".'Type'.(support("comment")?"".'Comment':"")."
".h($l["field"]),"".h($l["full_type"])."",($l["null"]?" NULL":""),($l["auto_increment"]?" ".'Auto Increment'."":""),(isset($l["default"])?" [".h($l["default"])."]":""),(support("comment")?"".nbsp($l["comment"]):""),"\n";}echo"
\n";}if(!is_view($R)){if(support("indexes")){echo"

".'Indexes'."

\n";$v=indexes($a);if($v){echo"\n";foreach($v -as$E=>$u){ksort($u["columns"]);$Je=array();foreach($u["columns"]as$y=>$X)$Je[]="".h($X)."".($u["lengths"][$y]?"(".$u["lengths"][$y].")":"").($u["descs"][$y]?" DESC":"");echo"
$u[type]".implode(", ",$Je)."\n";}echo"
\n";}echo'

".'Foreign keys'."

\n";$tc=foreign_keys($a);if($tc){echo"\n","\n";foreach($tc -as$E=>$n){echo"","
".'Source'."".'Target'."".'ON DELETE'."".'ON UPDATE'." 
".implode(", ",array_map('h',$n["source"]))."","".($n["db"]!=""?"".h($n["db"]).".":"").($n["ns"]!=""?"".h($n["ns"]).".":"").h($n["table"])."","(".implode(", ",array_map('h',$n["target"])).")","".nbsp($n["on_delete"])."\n","".nbsp($n["on_update"])."\n",''.'Alter'.'';}echo"
\n";}echo'

".'Triggers'."

\n";$qg=triggers($a);if($qg){echo"\n";foreach($qg -as$y=>$X)echo"
".h($X[0])."".h($X[1])."".h($y)."".'Alter'."\n";echo"
\n";}echo'
- -';foreach($of -as$E=>$Q){echo"
",''.h($E)."";foreach($Q["fields"]as$l){$X=''.h($l["field"]).'';echo"
".($l["primary"]?"$X":$X);}foreach((array)$Q["references"]as$Wf=>$af){foreach($af -as$id=>$We){$jd=$id-$Qf[$E][1];$s=0;foreach($We[0]as$_f)echo"\n
";}}foreach((array)$Ze[$E]as$Wf=>$af){foreach($af -as$id=>$d){$jd=$id-$Qf[$E][1];$s=0;foreach($d -as$Vf)echo"\n
";}}echo"\n
\n";}foreach($of -as$E=>$Q){foreach((array)$Q["references"]as$Wf=>$af){foreach($af -as$id=>$We){$Ed=$kg;$xd=-10;foreach($We[0]as$y=>$_f){$De=$Q["pos"][0]+$Q["fields"][$_f]["pos"];$Ee=$of[$Wf]["pos"][0]+$of[$Wf]["fields"][$We[1][$y]]["pos"];$Ed=min($Ed,$De,$Ee);$xd=max($xd,$De,$Ee);}echo"
\n";}}}echo'
-
- -';$sb=array('','USE','DROP+CREATE','CREATE');$Sf=array('','DROP+CREATE','CREATE');$pb=array('','TRUNCATE+INSERT','INSERT');if($x=="sql")$pb[]='INSERT+UPDATE';parse_str($_COOKIE["adminer_export"],$L);if(!$L)$L=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");if(!isset($L["events"])){$L["routines"]=$L["events"]=($_GET["dump"]=="");$L["triggers"]=$L["table_style"];}echo"
".'Output'."".html_select("output",$b->dumpOutput(),$L["output"],0)."\n";echo"
".'Format'."".html_select("format",$b->dumpFormat(),$L["format"],0)."\n";echo($x=="sqlite"?"":"
".'Database'."".html_select('db_style',$sb,$L["db_style"]).(support("routine")?checkbox("routines",1,$L["routines"],'Routines'):"").(support("event")?checkbox("events",1,$L["events"],'Events'):"")),"
".'Tables'."".html_select('table_style',$Sf,$L["table_style"]).checkbox("auto_increment",1,$L["auto_increment"],'Auto Increment').(support("trigger")?checkbox("triggers",1,$L["triggers"],'Triggers'):""),"
".'Data'."".html_select('data_style',$pb,$L["data_style"]),'
-

- - - -';$He=array();if(DB!=""){$Na=($a!=""?"":" checked");echo"","\n";$Lg="";$Tf=tables_list();foreach($Tf -as$E=>$U){$Ge=preg_replace('~_.*~','',$E);$Na=($a==""||$a==(substr($a,-1)=="%"?"$Ge%":$E));$Je="\n";$h=$b->databases();if($h){foreach($h -as$i){if(!information_schema($i)){$Ge=preg_replace('~_.*~','',$i);echo"
","","
".checkbox("tables[]",$E,$Na,$E,"checkboxClick(event, this); formUncheck('check-tables');","block");if($U!==null&&!preg_match('~table~i',$U))$Lg.="$Je\n";else -echo"$Je\n";$He[$Ge]++;}echo$Lg;if($Tf)echo"\n";}else{echo"
".checkbox("databases[]",$i,$a==""||$a=="$Ge%",$i,"formUncheck('check-databases');","block")."\n";$He[$Ge]++;}}}else -echo"
";}echo'
-

-';$pc=true;foreach($He -as$y=>$X){if($y!=""&&$X>1){echo($pc?"

":" ")."".h($y)."";$pc=false;}}}elseif(isset($_GET["privileges"])){page_header('Privileges');$J=$e->query("SELECT User, Host FROM mysql.".(DB==""?"user":"db WHERE ".q(DB)." LIKE Db")." ORDER BY Host, User");$q=$J;if(!$J)$J=$e->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");echo"

\n";hidden_fields_get();echo"\n",($q?"":"\n"),"\n","\n";while($L=$J->fetch_assoc())echo'
".'Username'."".'Server'." 
'.h($L["User"])."".h($L["Host"]).''.'Edit'."\n";if(!$q||DB!="")echo"\n";echo"
\n","

\n",'
".shorten_utf8(trim($H),1000)."
\n";if(!$_POST["only_errors"]){echo$Je;ob_flush();flush();}$Cf=microtime(true);if($e->multi_query($H)&&is_object($f)&&preg_match("~^$Af*USE\\b~isU",$H))$f->query($H);do{$J=$e->store_result();$bg=" (".format_time($Cf).")".(strlen($H)<1000?" ".'Edit'."":"");if($e->error){echo($_POST["only_errors"]?$Je:""),"

".'Error in query'.($e->errno?" ($e->errno)":"").": ".error()."\n";$Xb[]=" $ab";if($_POST["error_stops"])break -2;}elseif(is_object($J)){$z=$_POST["limit"];$ie=select($J,$f,array(),$z);if(!$_POST["only_errors"]){echo"

\n";$Nd=$J->num_rows;echo"

".($Nd?($z&&$Nd>$z?sprintf('%d / ',$z):"").lang(array('%d row','%d rows'),$Nd):""),$bg;$t="export-$ab";$fc=", ".'Export'."\n";if($f&&preg_match("~^($Af|\\()*SELECT\\b~isU",$H)&&($ec=explain($f,$H))){$t="explain-$ab";echo", EXPLAIN$fc","

\n";}else -echo$fc;echo"
\n";}}else{if(preg_match("~^$Af*(CREATE|DROP|ALTER)$Af+(DATABASE|SCHEMA)\\b~isU",$H)){restart_session();set_session("dbs",null);stop_session();}if(!$_POST["only_errors"])echo"

".lang(array('Query executed OK, %d row affected.','Query executed OK, %d rows affected.'),$e->affected_rows)."$bg\n";}$Cf=microtime(true);}while($e->next_result());$pd+=substr_count($H.$vc,"\n");$I=substr($I,$Qd);$Qd=0;}}}}if($Sb)echo"

".'No commands to execute.'."\n";elseif($_POST["only_errors"]){echo"

".lang(array('%d query executed OK.','%d queries executed OK.'),$ab-count($Xb))," (".format_time($lg).")\n";}elseif($Xb&&$ab>1)echo"

".'Error in query'.": ".implode("",$Xb)."\n";}else -echo"

".upload_error($I)."\n";}echo' -

-';$cc="";if(!isset($_GET["import"])){$H=$_GET["sql"];if($_POST)$H=$_POST["query"];elseif($_GET["history"]=="all")$H=$Fc;elseif($_GET["history"]!="")$H=$Fc[$_GET["history"]][0];echo"

";textarea("query",$H,20);echo($_POST?"":"\n"),"

$cc\n",'Limit rows'.": \n";}else{echo"

".'File upload'."
",(ini_bool("file_uploads")?"SQL (< ".ini_get("upload_max_filesize")."B): \n$cc":'File uploads are disabled.'),"
\n","
".'From server'."
",sprintf('Webserver file %s',"adminer.sql".(extension_loaded("zlib")?"[.gz]":"").""),' ',"
\n","

";}echo -checkbox("error_stops",1,($_POST?$_POST["error_stops"]:isset($_GET["import"])),'Stop on error')."\n",checkbox("only_errors",1,($_POST?$_POST["only_errors"]:isset($_GET["import"])),'Show only errors')."\n","\n";if(!isset($_GET["import"])&&$Fc){print_fieldset("history",'History',$_GET["history"]!="");for($X=end($Fc);$X;$X=prev($Fc)){$y=key($Fc);list($H,$bg,$Nb)=$X;echo''.'Edit'.""." ".@date("H:i:s",$bg).""." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$H)))),80,"").($Nb?" ($Nb)":"")."
\n";}echo"\n","".'Edit all'."\n","\n";}echo'

-';}elseif(isset($_GET["edit"])){$a=$_GET["edit"];$m=fields($a);$Z=(isset($_GET["select"])?(count($_POST["check"])==1?where_check($_POST["check"][0],$m):""):where($_GET,$m));$Ag=(isset($_GET["select"])?$_POST["edit"]:$Z);foreach($m -as$E=>$l){if(!isset($l["privileges"][$Ag?"update":"insert"])||$b->fieldName($l)=="")unset($m[$E]);}if($_POST&&!$k&&!isset($_GET["select"])){$A=$_POST["referer"];if($_POST["insert"])$A=($Ag?null:$_SERVER["REQUEST_URI"]);elseif(!preg_match('~^.+&select=.+$~',$A))$A=ME."select=".urlencode($a);$v=indexes($a);$wg=unique_array($_GET["where"],$v);$Se="\nWHERE $Z";if(isset($_POST["delete"]))queries_redirect($A,'Item has been deleted.',$j->delete($a,$Se,!$wg));else{$P=array();foreach($m -as$E=>$l){$X=process_input($l);if($X!==false&&$X!==null)$P[idf_escape($E)]=$X;}if($Ag){if(!$P)redirect($A);queries_redirect($A,'Item has been updated.',$j->update($a,$P,$Se,!$wg));if(is_ajax()){page_headers();page_messages($k);exit;}}else{$J=$j->insert($a,$P);$hd=($J?last_id():0);queries_redirect($A,sprintf('Item%s has been inserted.',($hd?" $hd":"")),$J);}}}$L=null;if($_POST["save"])$L=(array)$_POST["fields"];elseif($Z){$N=array();foreach($m -as$E=>$l){if(isset($l["privileges"]["select"])){$ua=convert_field($l);if($_POST["clone"]&&$l["auto_increment"])$ua="''";if($x=="sql"&&preg_match("~enum|set~",$l["type"]))$ua="1*".idf_escape($E);$N[]=($ua?"$ua AS ":"").idf_escape($E);}}$L=array();if(!support("table"))$N=array("*");if($N){$J=$j->select($a,$N,array($Z),$N,array(),(isset($_GET["select"])?2:1));$L=$J->fetch_assoc();if(!$L)$L=false;if(isset($_GET["select"])&&(!$L||$J->fetch_assoc()))$L=null;}}if(!support("table")&&!$m){if(!$Z){$J=$j->select($a,array("*"),$Z,array("*"));$L=($J?$J->fetch_assoc():false);if(!$L)$L=array($j->primary=>"");}if($L){foreach($L -as$y=>$X){if(!$Z)$L[$y]=null;$m[$y]=array("field"=>$y,"null"=>($y!=$j->primary),"auto_increment"=>($y==$j->primary));}}}edit_form($a,$m,$L,$Ag);}elseif(isset($_GET["create"])){$a=$_GET["create"];$te=array();foreach(array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST')as$y)$te[$y]=$y;$Ye=referencable_primary($a);$tc=array();foreach($Ye -as$Pf=>$l)$tc[str_replace("`","``",$Pf)."`".str_replace("`","``",$l["field"])]=$Pf;$le=array();$R=array();if($a!=""){$le=fields($a);$R=table_status($a);if(!$R)$k='No tables.';}$L=$_POST;$L["fields"]=(array)$L["fields"];if($L["auto_increment_col"])$L["fields"][$L["auto_increment_col"]]["auto_increment"]=true;if($_POST&&!process_fields($L["fields"])&&!$k){if($_POST["drop"])queries_redirect(substr(ME,0,-1),'Table has been dropped.',drop_tables(array($a)));else{$m=array();$ra=array();$Dg=false;$rc=array();ksort($L["fields"]);$ke=reset($le);$pa=" FIRST";foreach($L["fields"]as$y=>$l){$n=$tc[$l["type"]];$rg=($n!==null?$Ye[$n]:$l);if($l["field"]!=""){if(!$l["has_default"])$l["default"]=null;if($y==$L["auto_increment_col"])$l["auto_increment"]=true;$Oe=process_field($l,$rg);$ra[]=array($l["orig"],$Oe,$pa);if($Oe!=process_field($ke,$ke)){$m[]=array($l["orig"],$Oe,$pa);if($l["orig"]!=""||$pa)$Dg=true;}if($n!==null)$rc[idf_escape($l["field"])]=($a!=""&&$x!="sqlite"?"ADD":" ").format_foreign_key(array('table'=>$tc[$l["type"]],'source'=>array($l["field"]),'target'=>array($rg["field"]),'on_delete'=>$l["on_delete"],));$pa=" AFTER ".idf_escape($l["field"]);}elseif($l["orig"]!=""){$Dg=true;$m[]=array($l["orig"]);}if($l["orig"]!=""){$ke=next($le);if(!$ke)$pa="";}}$ve="";if($te[$L["partition_by"]]){$we=array();if($L["partition_by"]=='RANGE'||$L["partition_by"]=='LIST'){foreach(array_filter($L["partition_names"])as$y=>$X){$Y=$L["partition_values"][$y];$we[]="\n PARTITION ".idf_escape($X)." VALUES ".($L["partition_by"]=='RANGE'?"LESS THAN":"IN").($Y!=""?" ($Y)":" MAXVALUE");}}$ve.="\nPARTITION BY $L[partition_by]($L[partition])".($we?" (".implode(",",$we)."\n)":($L["partitions"]?" PARTITIONS ".(+$L["partitions"]):""));}elseif(support("partitioning")&&preg_match("~partitioned~",$R["Create_options"]))$ve.="\nREMOVE PARTITIONING";$C='Table has been altered.';if($a==""){cookie("adminer_engine",$L["Engine"]);$C='Table has been created.';}$E=trim($L["name"]);queries_redirect(ME.(support("table")?"table=":"select=").urlencode($E),$C,alter_table($a,$E,($x=="sqlite"&&($Dg||$rc)?$ra:$m),$rc,($L["Comment"]!=$R["Comment"]?$L["Comment"]:null),($L["Engine"]&&$L["Engine"]!=$R["Engine"]?$L["Engine"]:""),($L["Collation"]&&$L["Collation"]!=$R["Collation"]?$L["Collation"]:""),($L["Auto_increment"]!=""?number($L["Auto_increment"]):""),$ve));}}page_header(($a!=""?'Alter table':'Create table'),$k,array("table"=>$a),h($a));if(!$_POST){$L=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($tg["int"])?"int":(isset($tg["integer"])?"integer":"")))),"partition_names"=>array(""),);if($a!=""){$L=$R;$L["name"]=$a;$L["fields"]=array();if(!$_GET["auto_increment"])$L["Auto_increment"]="";foreach($le -as$l){$l["has_default"]=isset($l["default"]);$L["fields"][]=$l;}if(support("partitioning")){$xc="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($a);$J=$e->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $xc ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($L["partition_by"],$L["partitions"],$L["partition"])=$J->fetch_row();$we=get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $xc AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");$we[""]="";$L["partition_names"]=array_keys($we);$L["partition_values"]=array_values($we);}}}$Xa=collations();$Ub=engines();foreach($Ub -as$Tb){if(!strcasecmp($Tb,$L["Engine"])){$L["Engine"]=$Tb;break;}}echo' -
-

-';if(support("columns")||$a==""){echo'Table name: -';if($a==""&&!$_POST){?>".optionlist(array(""=>"(".'engine'.")")+$Ub,$L["Engine"])."":""),' ',($Xa&&!preg_match("~sqlite|mssql~",$x)?html_select("Collation",array(""=>"(".'collation'.")")+$Xa,$L["Collation"]):""),' -';}echo' -';if(support("columns")){echo' -';$cb=($_POST?$_POST["comments"]:$L["Comment"]!="");if(!$_POST&&!$cb){foreach($L["fields"]as$l){if($l["comment"]!=""){$cb=true;break;}}}edit_fields($L["fields"],$Xa,"TABLE",$tc,$cb);echo'
-

-Auto Increment: -',checkbox("defaults",1,true,'Default values',"columnShow(this.checked, 5)","jsonly");if(!$_POST["defaults"]){echo'';}echo(support("comment")?"".' ':''),'

- -';}echo' -';if($a!=""){echo'';}if(support("partitioning")){$ue=preg_match('~RANGE|LIST~',$L["partition_by"]);print_fieldset("partition",'Partition by',$L["partition_by"]);echo'

-',"",'() -Partitions: - - -';foreach($L["partition_names"]as$y=>$X){echo'',' - -';}echo' -

-';}elseif(isset($_GET["indexes"])){$a=$_GET["indexes"];$Nc=array("PRIMARY","UNIQUE","INDEX");$R=table_status($a,true);if(preg_match('~MyISAM|M?aria'.($e->server_info>=5.6?'|InnoDB':'').'~i',$R["Engine"]))$Nc[]="FULLTEXT";$v=indexes($a);$Ie=array();if($x=="mongo"){$Ie=$v["_id_"];unset($Nc[0]);unset($v["_id_"]);}$L=$_POST;if($_POST&&!$k&&!$_POST["add"]&&!$_POST["drop_col"]){$sa=array();foreach($L["indexes"]as$u){$E=$u["name"];if(in_array($u["type"],$Nc)){$d=array();$nd=array();$yb=array();$P=array();ksort($u["columns"]);foreach($u["columns"]as$y=>$c){if($c!=""){$md=$u["lengths"][$y];$xb=$u["descs"][$y];$P[]=idf_escape($c).($md?"(".(+$md).")":"").($xb?" DESC":"");$d[]=$c;$nd[]=($md?$md:null);$yb[]=$xb;}}if($d){$dc=$v[$E];if($dc){ksort($dc["columns"]);ksort($dc["lengths"]);ksort($dc["descs"]);if($u["type"]==$dc["type"]&&array_values($dc["columns"])===$d&&(!$dc["lengths"]||array_values($dc["lengths"])===$nd)&&array_values($dc["descs"])===$yb){unset($v[$E]);continue;}}$sa[]=array($u["type"],$E,$P);}}}foreach($v -as$E=>$dc)$sa[]=array($dc["type"],$E,"DROP");if(!$sa)redirect(ME."table=".urlencode($a));queries_redirect(ME."table=".urlencode($a),'Indexes have been altered.',alter_indexes($a,$sa));}page_header('Indexes',$k,array("table"=>$a),h($a));$m=array_keys(fields($a));if($_POST["add"]){foreach($L["indexes"]as$y=>$u){if($u["columns"][count($u["columns"])]!="")$L["indexes"][$y]["columns"][]="";}$u=end($L["indexes"]);if($u["type"]||array_filter($u["columns"],'strlen'))$L["indexes"][]=array("columns"=>array(1=>""));}if(!$L){foreach($v -as$y=>$u){$v[$y]["name"]=$y;$v[$y]["columns"][]="";}$v[]=array("columns"=>array(1=>""));$L["indexes"]=$v;}?> - -
- - - -
Index Type -Column (length) -Name -  -
PRIMARY";foreach($Ie["columns"]as$y=>$c){echo -select_input(" disabled",$m,$c)," ";}echo"\n";}$w=1;foreach($L["indexes"]as$u){if(!$_POST["drop_col"]||$w!=key($_POST["drop_col"])){echo"
".html_select("indexes[$w][type]",array(-1=>"")+$Nc,$u["type"],($w==count($L["indexes"])?"indexesAddRow(this);":1)),"";ksort($u["columns"]);$s=1;foreach($u["columns"]as$y=>$c){echo"".select_input(" name='indexes[$w][columns][$s]' onchange=\"".($s==count($u["columns"])?"indexesAddColumn":"indexesChangeColumn")."(this, '".js_escape($x=="sql"?"":$_GET["indexes"]."_")."');\"",($m?array_combine($m,$m):$m),$c),($x=="sql"||$x=="mssql"?"":""),($x!="sql"?checkbox("indexes[$w][descs][$s]",1,$u["descs"][$y],'descending'):"")," ";$s++;}echo"\n","\n";}$w++;}echo'
-

- - -

-';}elseif(isset($_GET["database"])){$L=$_POST;if($_POST&&!$k&&!isset($_POST["add_x"])){$E=trim($L["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),'Database has been dropped.',drop_databases(array(DB)));}elseif(DB!==$E){if(DB!=""){$_GET["db"]=$E;queries_redirect(preg_replace('~\bdb=[^&]*&~','',ME)."db=".urlencode($E),'Database has been renamed.',rename_database($E,$L["collation"]));}else{$h=explode("\n",str_replace("\r","",$E));$Jf=true;$gd="";foreach($h -as$i){if(count($h)==1||$i!=""){if(!create_database($i,$L["collation"]))$Jf=false;$gd=$i;}}restart_session();set_session("dbs",null);queries_redirect(ME."db=".urlencode($gd),'Database has been created.',$Jf);}}else{if(!$L["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($E).(preg_match('~^[a-z0-9_]+$~i',$L["collation"])?" COLLATE $L[collation]":""),substr(ME,0,-1),'Database has been altered.');}}page_header(DB!=""?'Alter database':'Create database',$k,array(),h(DB));$Xa=collations();$E=DB;if($_POST)$E=$L["name"];elseif(DB!="")$L["collation"]=db_collation(DB,$Xa);elseif($x=="sql"){foreach(get_vals("SHOW GRANTS")as$q){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~',$q,$B)&&$B[1]){$E=stripcslashes(idf_unescape("`$B[2]`"));break;}}}echo' -
-

-',($_POST["add_x"]||strpos($E,"\n")?'
':'')."\n".($Xa?html_select("collation",array(""=>"(".'collation'.")")+$Xa,$L["collation"]).doc_link(array('sql'=>"charset-charsets.html",'mssql'=>"ms187963.aspx",)):"");?> - - -\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo"\n";echo' -

-';}elseif(isset($_GET["call"])){$da=$_GET["call"];page_header('Call'.": ".h($da),$k);$jf=routine($da,(isset($_GET["callf"])?"FUNCTION":"PROCEDURE"));$Mc=array();$ne=array();foreach($jf["fields"]as$s=>$l){if(substr($l["inout"],-3)=="OUT")$ne[$s]="@".idf_escape($l["field"])." AS ".idf_escape($l["field"]);if(!$l["inout"]||substr($l["inout"],0,2)=="IN")$Mc[]=$s;}if(!$k&&$_POST){$Ja=array();foreach($jf["fields"]as$y=>$l){if(in_array($y,$Mc)){$X=process_input($l);if($X===false)$X="''";if(isset($ne[$y]))$e->query("SET @".idf_escape($l["field"])." = $X");}$Ja[]=(isset($ne[$y])?"@".idf_escape($l["field"]):$X);}$I=(isset($_GET["callf"])?"SELECT":"CALL")." ".idf_escape($da)."(".implode(", ",$Ja).")";echo"

".h($I)." ".'Edit'."\n";if(!$e->multi_query($I))echo"

".error()."\n";else{$f=connect();if(is_object($f))$f->select_db(DB);do{$J=$e->store_result();if(is_object($J))select($J,$f);else -echo"

".lang(array('Routine has been called, %d row affected.','Routine has been called, %d rows affected.'),$e->affected_rows)."\n";}while($e->next_result());if($ne)select($e->query("SELECT ".implode(", ",$ne)));}}echo' -

-';if($Mc){echo"\n";foreach($Mc -as$y){$l=$jf["fields"][$y];$E=$l["field"];echo"
".$b->fieldName($l);$Y=$_POST["fields"][$E];if($Y!=""){if($l["type"]=="enum")$Y=+$Y;if($l["type"]=="set")$Y=array_sum($Y);}input($l,$Y,(string)$_POST["function"][$E]);echo"\n";}echo"
\n";}echo'

- - -

-';}elseif(isset($_GET["foreign"])){$a=$_GET["foreign"];$E=$_GET["name"];$L=$_POST;if($_POST&&!$k&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){$C=($_POST["drop"]?'Foreign key has been dropped.':($E!=""?'Foreign key has been altered.':'Foreign key has been created.'));$A=ME."table=".urlencode($a);$L["source"]=array_filter($L["source"],'strlen');ksort($L["source"]);$Vf=array();foreach($L["source"]as$y=>$X)$Vf[$y]=$L["target"][$y];$L["target"]=$Vf;if($x=="sqlite")queries_redirect($A,$C,recreate_table($a,$a,array(),array(),array(" $E"=>($_POST["drop"]?"":" ".format_foreign_key($L)))));else{$sa="ALTER TABLE ".table($a);$Fb="\nDROP ".($x=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($E);if($_POST["drop"])query_redirect($sa.$Fb,$A,$C);else{query_redirect($sa.($E!=""?"$Fb,":"")."\nADD".format_foreign_key($L),$A,$C);$k='Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.'."
$k";}}}page_header('Foreign key',$k,array("table"=>$a),h($a));if($_POST){ksort($L["source"]);if($_POST["add"])$L["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$L["target"]=array();}elseif($E!=""){$tc=foreign_keys($a);$L=$tc[$E];$L["source"][]="";}else{$L["table"]=$a;$L["source"]=array("");}$_f=array_keys(fields($a));$Vf=($a===$L["table"]?$_f:array_keys(fields($L["table"])));$Xe=array_keys(array_filter(table_status('',true),'fk_support'));echo' -
-

-';if($L["db"]==""&&$L["ns"]==""){echo'Target table: -',html_select("table",$Xe,$L["table"],"this.form['change-js'].value = '1'; this.form.submit();"),' -

- - -';$w=0;foreach($L["source"]as$y=>$X){echo"","
SourceTarget
".html_select("source[".(+$y)."]",array(-1=>"")+$_f,$X,($w==count($L["source"])-1?"foreignAddRow(this);":1)),"".html_select("target[".(+$y)."]",$Vf,$L["target"][$y]);$w++;}echo'
-

-ON DELETE: ',html_select("on_delete",array(-1=>"")+explode("|",$Xd),$L["on_delete"]),' ON UPDATE: ',html_select("on_update",array(-1=>"")+explode("|",$Xd),$L["on_update"]),doc_link(array('sql'=>"innodb-foreign-key-constraints.html",'pgsql'=>"sql-createtable.html#SQL-CREATETABLE-REFERENCES",'mssql'=>"ms174979.aspx",'oracle'=>"clauses002.htm#sthref2903",)),'

- -

-';}if($E!=""){echo'';}echo' -

-';}elseif(isset($_GET["view"])){$a=$_GET["view"];$L=$_POST;if($_POST&&!$k){$E=trim($L["name"]);$ua=" AS\n$L[select]";$A=ME."table=".urlencode($E);$C='View has been altered.';if($_GET["materialized"])$U="MATERIALIZED VIEW";else{$U="VIEW";if($x=="pgsql"){$Df=table_status($E);$U=($Df?strtoupper($Df["Engine"]):$U);}}if(!$_POST["drop"]&&$a==$E&&$x!="sqlite"&&$U!="MATERIALIZED VIEW")query_redirect(($x=="mssql"?"ALTER":"CREATE OR REPLACE")." VIEW ".table($E).$ua,$A,$C);else{$Xf=$E."_adminer_".uniqid();drop_create("DROP $U ".table($a),"CREATE $U ".table($E).$ua,"DROP $U ".table($E),"CREATE $U ".table($Xf).$ua,"DROP $U ".table($Xf),($_POST["drop"]?substr(ME,0,-1):$A),'View has been dropped.',$C,'View has been created.',$a,$E);}}if(!$_POST&&$a!=""){$L=view($a);$L["name"]=$a;if(!$k)$k=error();}page_header(($a!=""?'Alter view':'Create view'),$k,array("table"=>$a),h($a));echo' -
-

Name: -

';textarea("select",$L["select"]);echo'

- -';if($_GET["view"]!=""){echo'';}echo' -

-';}elseif(isset($_GET["event"])){$aa=$_GET["event"];$Sc=array("YEAR","QUARTER","MONTH","DAY","HOUR","MINUTE","WEEK","SECOND","YEAR_MONTH","DAY_HOUR","DAY_MINUTE","DAY_SECOND","HOUR_MINUTE","HOUR_SECOND","MINUTE_SECOND");$Ef=array("ENABLED"=>"ENABLE","DISABLED"=>"DISABLE","SLAVESIDE_DISABLED"=>"DISABLE ON SLAVE");$L=$_POST;if($_POST&&!$k){if($_POST["drop"])query_redirect("DROP EVENT ".idf_escape($aa),substr(ME,0,-1),'Event has been dropped.');elseif(in_array($L["INTERVAL_FIELD"],$Sc)&&isset($Ef[$L["STATUS"]])){$nf="\nON SCHEDULE ".($L["INTERVAL_VALUE"]?"EVERY ".q($L["INTERVAL_VALUE"])." $L[INTERVAL_FIELD]".($L["STARTS"]?" STARTS ".q($L["STARTS"]):"").($L["ENDS"]?" ENDS ".q($L["ENDS"]):""):"AT ".q($L["STARTS"]))." ON COMPLETION".($L["ON_COMPLETION"]?"":" NOT")." PRESERVE";queries_redirect(substr(ME,0,-1),($aa!=""?'Event has been altered.':'Event has been created.'),queries(($aa!=""?"ALTER EVENT ".idf_escape($aa).$nf.($aa!=$L["EVENT_NAME"]?"\nRENAME TO ".idf_escape($L["EVENT_NAME"]):""):"CREATE EVENT ".idf_escape($L["EVENT_NAME"]).$nf)."\n".$Ef[$L["STATUS"]]." COMMENT ".q($L["EVENT_COMMENT"]).rtrim(" DO\n$L[EVENT_DEFINITION]",";").";"));}}page_header(($aa!=""?'Alter event'.": ".h($aa):'Create event'),$k);if(!$L&&$aa!=""){$M=get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ".q(DB)." AND EVENT_NAME = ".q($aa));$L=reset($M);}echo' -
- -
Name -
Start -
End -
Every ',html_select("INTERVAL_FIELD",$Sc,$L["INTERVAL_FIELD"]),'
Status',html_select("STATUS",$Ef,$L["STATUS"]),'
Comment -
 ',checkbox("ON_COMPLETION","PRESERVE",$L["ON_COMPLETION"]=="PRESERVE",'On completion preserve'),'
-

';textarea("EVENT_DEFINITION",$L["EVENT_DEFINITION"]);echo'

- -';if($aa!=""){echo'';}echo' -

-';}elseif(isset($_GET["procedure"])){$da=$_GET["procedure"];$jf=(isset($_GET["function"])?"FUNCTION":"PROCEDURE");$L=$_POST;$L["fields"]=(array)$L["fields"];if($_POST&&!process_fields($L["fields"])&&!$k){$Xf="$L[name]_adminer_".uniqid();drop_create("DROP $jf ".idf_escape($da),create_routine($jf,$L),"DROP $jf ".idf_escape($L["name"]),create_routine($jf,array("name"=>$Xf)+$L),"DROP $jf ".idf_escape($Xf),substr(ME,0,-1),'Routine has been dropped.','Routine has been altered.','Routine has been created.',$da,$L["name"]);}page_header(($da!=""?(isset($_GET["function"])?'Alter function':'Alter procedure').": ".h($da):(isset($_GET["function"])?'Create function':'Create procedure')),$k);if(!$_POST&&$da!=""){$L=routine($da,$jf);$L["name"]=$da;}$Xa=get_vals("SHOW CHARACTER SET");sort($Xa);$kf=routine_languages();echo' -
-

Name: -',($kf?'Language'.": ".html_select("language",$kf,$L["language"]):""),' - -';edit_fields($L["fields"],$Xa,$jf);if(isset($_GET["function"])){echo"
".'Return type';edit_type("returns",$L["returns"],$Xa);}echo'
-

';textarea("definition",$L["definition"]);echo'

- -';if($da!=""){echo'';}echo' -

-';}elseif(isset($_GET["trigger"])){$a=$_GET["trigger"];$E=$_GET["name"];$pg=trigger_options();$L=(array)trigger($E)+array("Trigger"=>$a."_bi");if($_POST){if(!$k&&in_array($_POST["Timing"],$pg["Timing"])&&in_array($_POST["Event"],$pg["Event"])&&in_array($_POST["Type"],$pg["Type"])){$Wd=" ON ".table($a);$Fb="DROP TRIGGER ".idf_escape($E).($x=="pgsql"?$Wd:"");$A=ME."table=".urlencode($a);if($_POST["drop"])query_redirect($Fb,$A,'Trigger has been dropped.');else{if($E!="")queries($Fb);queries_redirect($A,($E!=""?'Trigger has been altered.':'Trigger has been created.'),queries(create_trigger($Wd,$_POST)));if($E!="")queries(create_trigger($Wd,$L+array("Type"=>reset($pg["Type"]))));}}$L=$_POST;}page_header(($E!=""?'Alter trigger'.": ".h($E):'Create trigger'),$k,array("table"=>$a));echo' -
- -
Time',html_select("Timing",$pg["Timing"],$L["Timing"],"triggerChange(/^".preg_quote($a,"/")."_[ba][iud]$/, '".js_escape($a)."', this.form);"),'
Event',html_select("Event",$pg["Event"],$L["Event"],"this.form['Timing'].onchange();"),(in_array("UPDATE OF",$pg["Event"])?" ":""),'
Type',html_select("Type",$pg["Type"],$L["Type"]),'
-

Name: " maxlength="64" autocapitalize="off"> - -

- -';if($E!=""){echo'';}echo' -

-';}elseif(isset($_GET["user"])){$fa=$_GET["user"];$Me=array(""=>array("All privileges"=>""));foreach(get_rows("SHOW PRIVILEGES")as$L){foreach(explode(",",($L["Privilege"]=="Grant option"?"":$L["Context"]))as$hb)$Me[$hb][$L["Privilege"]]=$L["Comment"];}$Me["Server Admin"]+=$Me["File access on server"];$Me["Databases"]["Create routine"]=$Me["Procedures"]["Create routine"];unset($Me["Procedures"]["Create routine"]);$Me["Columns"]=array();foreach(array("Select","Insert","Update","References")as$X)$Me["Columns"][$X]=$Me["Tables"][$X];unset($Me["Server Admin"]["Usage"]);foreach($Me["Tables"]as$y=>$X)unset($Me["Databases"][$y]);$Jd=array();if($_POST){foreach($_POST["objects"]as$y=>$X)$Jd[$X]=(array)$Jd[$X]+(array)$_POST["grants"][$y];}$zc=array();$Ud="";if(isset($_GET["host"])&&($J=$e->query("SHOW GRANTS FOR ".q($fa)."@".q($_GET["host"])))){while($L=$J->fetch_row()){if(preg_match('~GRANT (.*) ON (.*) TO ~',$L[0],$B)&&preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~',$B[1],$td,PREG_SET_ORDER)){foreach($td -as$X){if($X[1]!="USAGE")$zc["$B[2]$X[2]"][$X[1]]=true;if(preg_match('~ WITH GRANT OPTION~',$L[0]))$zc["$B[2]$X[2]"]["GRANT OPTION"]=true;}}if(preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~",$L[0],$B))$Ud=$B[1];}}if($_POST&&!$k){$Vd=(isset($_GET["host"])?q($fa)."@".q($_GET["host"]):"''");if($_POST["drop"])query_redirect("DROP USER $Vd",ME."privileges=",'User has been dropped.');else{$Ld=q($_POST["user"])."@".q($_POST["host"]);$xe=$_POST["pass"];if($xe!=''&&!$_POST["hashed"]){$xe=$e->result("SELECT PASSWORD(".q($xe).")");$k=!$xe;}$lb=false;if(!$k){if($Vd!=$Ld){$lb=queries(($e->server_info<5?"GRANT USAGE ON *.* TO":"CREATE USER")." $Ld IDENTIFIED BY PASSWORD ".q($xe));$k=!$lb;}elseif($xe!=$Ud)queries("SET PASSWORD FOR $Ld = ".q($xe));}if(!$k){$gf=array();foreach($Jd -as$Pd=>$q){if(isset($_GET["grant"]))$q=array_filter($q);$q=array_keys($q);if(isset($_GET["grant"]))$gf=array_diff(array_keys(array_filter($Jd[$Pd],'strlen')),$q);elseif($Vd==$Ld){$Sd=array_keys((array)$zc[$Pd]);$gf=array_diff($Sd,$q);$q=array_diff($q,$Sd);unset($zc[$Pd]);}if(preg_match('~^(.+)\\s*(\\(.*\\))?$~U',$Pd,$B)&&(!grant("REVOKE",$gf,$B[2]," ON $B[1] FROM $Ld")||!grant("GRANT",$q,$B[2]," ON $B[1] TO $Ld"))){$k=true;break;}}}if(!$k&&isset($_GET["host"])){if($Vd!=$Ld)queries("DROP USER $Vd");elseif(!isset($_GET["grant"])){foreach($zc -as$Pd=>$gf){if(preg_match('~^(.+)(\\(.*\\))?$~U',$Pd,$B))grant("REVOKE",array_keys($gf),$B[2]," ON $B[1] FROM $Ld");}}}queries_redirect(ME."privileges=",(isset($_GET["host"])?'User has been altered.':'User has been created.'),!$k);if($lb)$e->query("DROP USER $Ld");}}page_header((isset($_GET["host"])?'Username'.": ".h("$fa@$_GET[host]"):'Create user'),$k,array("privileges"=>array('','Privileges')));if($_POST){$L=$_POST;$zc=$Jd;}else{$L=$_GET+array("host"=>$e->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"));$L["pass"]=$Ud;if($Ud!="")$L["hashed"]=true;$zc[(DB==""||$zc?"":idf_escape(addcslashes(DB,"%_\\"))).".*"]=array();}echo'
- -
Server -
Username -
Password -';if(!$L["hashed"]){echo'';}echo -checkbox("hashed",1,$L["hashed"],'Hashed',"typePassword(this.form['pass'], this.checked);"),'
- -';echo"\n","\n";foreach(array(""=>"","Server Admin"=>'Server',"Databases"=>'Database',"Tables"=>'Table',"Columns"=>'Column',"Procedures"=>'Routine',)as$hb=>$xb){foreach((array)$Me[$hb]as$Le=>$bb){echo"$xb'.h($Le);$s=0;foreach($zc -as$Pd=>$q){$E="'grants[$s][".h(strtoupper($Le))."]'";$Y=$q[strtoupper($Le)];if($hb=="Server Admin"&&$Pd!=(isset($zc["*.*"])?"*.*":".*"))echo"
".'Privileges'.doc_link(array('sql'=>"grant.html#priv_level"));$s=0;foreach($zc -as$Pd=>$q){echo''.($Pd!="*.*"?"":"*.*");$s++;}echo"
 ";elseif(isset($_GET["grant"]))echo"";else -echo"";$s++;}}}echo"
\n",'

- -';if(isset($_GET["host"])){echo'';}echo' -

-';}elseif(isset($_GET["processlist"])){if(support("kill")&&$_POST&&!$k){$dd=0;foreach((array)$_POST["kill"]as$X){if(queries("KILL ".number($X)))$dd++;}queries_redirect(ME."processlist=",lang(array('%d process has been killed.','%d processes have been killed.'),$dd),$dd||!$_POST["kill"]);}page_header('Process list',$k);echo' -
- -';$s=-1;foreach(process_list()as$s=>$L){if(!$s){echo"".(support("kill")?"\n";}echo"".(support("kill")?"
 ":"");foreach($L -as$y=>$X)echo"$y".doc_link(array('sql'=>"show-processlist.html#processlist_".strtolower($y),'pgsql'=>"monitoring-stats.html#PG-STAT-ACTIVITY-VIEW",'oracle'=>"../b14237/dynviews_2088.htm",));echo"
".checkbox("kill[]",$L["Id"],0):"");foreach($L -as$y=>$X)echo"".(($x=="sql"&&$y=="Info"&&preg_match("~Query|Killed~",$L["Command"])&&$X!="")||($x=="pgsql"&&$y=="current_query"&&$X!="")||($x=="oracle"&&$y=="sql_text"&&$X!="")?"".shorten_utf8($X,100,"").' '.'Clone'.'':nbsp($X));echo"\n";}echo'
- -

-';if(support("kill")){echo($s+1)."/".sprintf('%d in total',$e->result("SELECT @@max_connections")),"

\n";}echo' -

-';}elseif(isset($_GET["select"])){$a=$_GET["select"];$R=table_status1($a);$v=indexes($a);$m=fields($a);$tc=column_foreign_keys($a);$Rd="";if($R["Oid"]){$Rd=($x=="sqlite"?"rowid":"oid");$v[]=array("type"=>"PRIMARY","columns"=>array($Rd));}parse_str($_COOKIE["adminer_import"],$ma);$hf=array();$d=array();$ag=null;foreach($m -as$y=>$l){$E=$b->fieldName($l);if(isset($l["privileges"]["select"])&&$E!=""){$d[$y]=html_entity_decode(strip_tags($E),ENT_QUOTES);if(is_shortable($l))$ag=$b->selectLengthProcess();}$hf+=$l["privileges"];}list($N,$r)=$b->selectColumnsProcess($d,$v);$Wc=count($r)selectSearchProcess($m,$v);$fe=$b->selectOrderProcess($m,$v);$z=$b->selectLimitProcess();$xc=($N?implode(", ",$N):"*".($Rd?", $Rd":"")).convert_fields($d,$m,$N)."\nFROM ".table($a);$_c=($r&&$Wc?"\nGROUP BY ".implode(", ",$r):"").($fe?"\nORDER BY ".implode(", ",$fe):"");if($_GET["val"]&&is_ajax()){header("Content-Type: text/plain; charset=utf-8");foreach($_GET["val"]as$xg=>$L){$ua=convert_field($m[key($L)]);$N=array($ua?$ua:idf_escape(key($L)));$Z[]=where_check($xg,$m);$K=$j->select($a,$N,$Z,$N);if($K)echo -reset($K->fetch_row());}exit;}if($_POST&&!$k){$Pg=$Z;if(!$_POST["all"]&&is_array($_POST["check"])){$Oa=array();foreach($_POST["check"]as$Ma)$Oa[]=where_check($Ma,$m);$Pg[]="((".implode(") OR (",$Oa)."))";}$Pg=($Pg?"\nWHERE ".implode(" AND ",$Pg):"");$Ie=$zg=null;foreach($v -as$u){if($u["type"]=="PRIMARY"){$Ie=array_flip($u["columns"]);$zg=($N?$Ie:array());break;}}foreach((array)$zg -as$y=>$X){if(in_array(idf_escape($y),$N))unset($zg[$y]);}if($_POST["export"]){cookie("adminer_import","output=".urlencode($_POST["output"])."&format=".urlencode($_POST["format"]));dump_headers($a);$b->dumpTable($a,"");if(!is_array($_POST["check"])||$zg===array())$I="SELECT $xc$Pg$_c";else{$vg=array();foreach($_POST["check"]as$X)$vg[]="(SELECT".limit($xc,"\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$m).$_c,1).")";$I=implode(" UNION ALL ",$vg);}$b->dumpData($a,"table",$I);exit;}if(!$b->selectEmailProcess($Z,$tc)){if($_POST["save"]||$_POST["delete"]){$J=true;$na=0;$P=array();if(!$_POST["delete"]){foreach($d -as$E=>$X){$X=process_input($m[$E]);if($X!==null&&($_POST["clone"]||$X!==false))$P[idf_escape($E)]=($X!==false?$X:idf_escape($E));}}if($_POST["delete"]||$P){if($_POST["clone"])$I="INTO ".table($a)." (".implode(", ",array_keys($P)).")\nSELECT ".implode(", ",$P)."\nFROM ".table($a);if($_POST["all"]||($zg===array()&&is_array($_POST["check"]))||$Wc){$J=($_POST["delete"]?$j->delete($a,$Pg):($_POST["clone"]?queries("INSERT $I$Pg"):$j->update($a,$P,$Pg)));$na=$e->affected_rows;}else{foreach((array)$_POST["check"]as$X){$Og="\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$m);$J=($_POST["delete"]?$j->delete($a,$Og,1):($_POST["clone"]?queries("INSERT".limit1($I,$Og)):$j->update($a,$P,$Og)));if(!$J)break;$na+=$e->affected_rows;}}}$C=lang(array('%d item has been affected.','%d items have been affected.'),$na);if($_POST["clone"]&&$J&&$na==1){$hd=last_id();if($hd)$C=sprintf('Item%s has been inserted.'," $hd");}queries_redirect(remove_from_uri($_POST["all"]&&$_POST["delete"]?"page":""),$C,$J);if(!$_POST["delete"]){edit_form($a,$m,(array)$_POST["fields"],!$_POST["clone"]);page_footer();exit;}}elseif(!$_POST["import"]){if(!$_POST["val"])$k='Ctrl+click on a value to modify it.';else{$J=true;$na=0;foreach($_POST["val"]as$xg=>$L){$P=array();foreach($L -as$y=>$X){$y=bracket_escape($y,1);$P[idf_escape($y)]=(preg_match('~char|text~',$m[$y]["type"])||$X!=""?$b->processInput($m[$y],$X):"NULL");}$J=$j->update($a,$P," WHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($xg,$m),!($Wc||$zg===array())," ");if(!$J)break;$na+=$e->affected_rows;}queries_redirect(remove_from_uri(),lang(array('%d item has been affected.','%d items have been affected.'),$na),$J);}}elseif(!is_string($mc=get_file("csv_file",true)))$k=upload_error($mc);elseif(!preg_match('~~u',$mc))$k='File must be in UTF-8 encoding.';else{cookie("adminer_import","output=".urlencode($ma["output"])."&format=".urlencode($_POST["separator"]));$J=true;$Ya=array_keys($m);preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~',$mc,$td);$na=count($td[0]);$j->begin();$tf=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));$M=array();foreach($td[0]as$y=>$X){preg_match_all("~((?>\"[^\"]*\")+|[^$tf]*)$tf~",$X.$tf,$ud);if(!$y&&!array_diff($ud[1],$Ya)){$Ya=$ud[1];$na--;}else{$P=array();foreach($ud[1]as$s=>$Ua)$P[idf_escape($Ya[$s])]=($Ua==""&&$m[$Ya[$s]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$Ua))));$M[]=$P;}}$J=(!$M||$j->insertUpdate($a,$M,$Ie));if($J)$j->commit();queries_redirect(remove_from_uri("page"),lang(array('%d row has been imported.','%d rows have been imported.'),$na),$J);$j->rollback();}}}$Pf=$b->tableName($R);if(is_ajax()){page_headers();ob_start();}else -page_header('Select'.": $Pf",$k);$P=null;if(isset($hf["insert"])||!support("table")){$P="";foreach((array)$_GET["where"]as$X){if(count($tc[$X["col"]])==1&&($X["op"]=="="||(!$X["op"]&&!preg_match('~[_%]~',$X["val"]))))$P.="&set".urlencode("[".bracket_escape($X["col"])."]")."=".urlencode($X["val"]);}}$b->selectLinks($R,$P);if(!$d&&support("table"))echo"

".'Unable to select the table'.($m?".":": ".error())."\n";else{echo"

\n","
";hidden_fields_get();echo(DB!=""?''.(isset($_GET["ns"])?'':""):"");echo'',"
\n";$b->selectColumnsPrint($N,$d);$b->selectSearchPrint($Z,$d,$v);$b->selectOrderPrint($fe,$d,$v);$b->selectLimitPrint($z);$b->selectLengthPrint($ag);$b->selectActionPrint($v);echo"
\n";$F=$_GET["page"];if($F=="last"){$wc=$e->result(count_rows($a,$Z,$Wc,$r));$F=floor(max(0,$wc-1)/$z);}$qf=$N;if(!$qf){$qf[]="*";if($Rd)$qf[]=$Rd;}$ib=convert_fields($d,$m,$N);if($ib)$qf[]=substr($ib,2);$J=$j->select($a,$qf,$Z,$r,$fe,$z,$F,true);if(!$J)echo"

".error()."\n";else{if($x=="mssql"&&$F)$J->seek($z*$F);$Rb=array();echo"

\n";$M=array();while($L=$J->fetch_assoc()){if($F&&$x=="oracle")unset($L["RNUM"]);$M[]=$L;}if($_GET["page"]!="last"&&+$z&&$r&&$Wc&&$x=="sql")$wc=$e->result(" SELECT FOUND_ROWS()");if(!$M)echo"

".'No rows.'."\n";else{$Ba=$b->backwardKeys($a,$Pf);echo"\n","".(!$r&&$N?"":"\n";if(is_ajax()){if($z%2==1&&$F%2==1)odd();ob_end_clean();}foreach($b->rowDescriptions($M,$tc)as$D=>$L){$wg=unique_array($M[$D],$v);if(!$wg){$wg=array();foreach($M[$D]as$y=>$X){if(!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~',$y))$wg[$y]=$X;}}$xg="";foreach($wg -as$y=>$X){if(($x=="sql"||$x=="pgsql")&&strlen($X)>64){$y=(strpos($y,'(')?$y:idf_escape($y));$y="MD5(".($x=='sql'&&preg_match("~^utf8_~",$m[$y]["collation"])?$y:"CONVERT($y USING ".charset($e).")").")";$X=md5($X);}$xg.="&".($X!==null?urlencode("where[".bracket_escape($y)."]")."=".urlencode($X):"null%5B%5D=".urlencode($y));}echo"".(!$r&&$N?"":"\n";}if(is_ajax())exit;echo"
".'Modify'."");$Id=array();$yc=array();reset($N);$Ue=1;foreach($M[0]as$y=>$X){if($y!=$Rd){$X=$_GET["columns"][key($N)];$l=$m[$N?($X?$X["col"]:current($N)):$y];$E=($l?$b->fieldName($l,$Ue):($X["fun"]?"*":$y));if($E!=""){$Ue++;$Id[$y]=$E;$c=idf_escape($y);$Ic=remove_from_uri('(order|desc)[^=]*|page').'&order%5B0%5D='.urlencode($y);$xb="&desc%5B0%5D=1";echo'','';echo -apply_sql_function($X["fun"],$E)."";echo"";}$yc[$y]=$X["fun"];next($N);}}$nd=array();if($_GET["modify"]){foreach($M -as$L){foreach($L -as$y=>$X)$nd[$y]=max($nd[$y],min(40,strlen(utf8_decode($X))));}}echo($Ba?"".'Relations':"")."
".checkbox("check[]",substr($xg,1),in_array(substr($xg,1),(array)$_POST["check"]),"","this.form['all'].checked = false; formUncheck('all-page');").($Wc||information_schema(DB)?"":" ".'edit'.""));foreach($L -as$y=>$X){if(isset($Id[$y])){$l=$m[$y];if($X!=""&&(!isset($Rb[$y])||$Rb[$y]!=""))$Rb[$y]=(is_mail($X)?$Id[$y]:"");$_="";if(preg_match('~blob|bytea|raw|file~',$l["type"])&&$X!="")$_=ME.'download='.urlencode($a).'&field='.urlencode($y).$xg;if(!$_&&$X!==null){foreach((array)$tc[$y]as$n){if(count($tc[$y])==1||end($n["source"])==$y){$_="";foreach($n["source"]as$s=>$_f)$_.=where_link($s,$n["target"][$s],$M[$D][$_f]);$_=($n["db"]!=""?preg_replace('~([?&]db=)[^&]+~','\\1'.urlencode($n["db"]),ME):ME).'select='.urlencode($n["table"]).$_;if(count($n["source"])==1)break;}}}if($y=="COUNT(*)"){$_=ME."select=".urlencode($a);$s=0;foreach((array)$_GET["where"]as$W){if(!array_key_exists($W["col"],$wg))$_.=where_link($s++,$W["col"],$W["val"],$W["op"]);}foreach($wg -as$ad=>$W)$_.=where_link($s++,$ad,$W);}$X=select_value($X,$_,$l,$ag);$t=h("val[$xg][".bracket_escape($y)."]");$Y=$_POST["val"][$xg][bracket_escape($y)];$Mb=!is_array($L[$y])&&is_utf8($X)&&$M[$D][$y]==$L[$y]&&!$yc[$y];$Zf=preg_match('~text|lob~',$l["type"]);if(($_GET["modify"]&&$Mb)||$Y!==null){$Bc=h($Y!==null?$Y:$L[$y]);echo"".($Zf?"":"");}else{$sd=strpos($X,"...");echo"$X";}}}if($Ba)echo"";$b->backwardKeysPrint($Ba,$M[$D]);echo"
\n";}if(($M||$F)&&!is_ajax()){$bc=true;if($_GET["page"]!="last"){if(!+$z)$wc=count($M);elseif($x!="sql"||!$Wc){$wc=($Wc?false:found_rows($R,$Z));if($wc$z||$F)){echo"

";$wd=($wc===false?$F+(count($M)>=$z?2:1):floor(($wc-1)/$z));if($x!="simpledb"){echo'".'Page'.":",pagination(0,$F).($F>5?" ...":"");for($s=max(1,$F-4);$s0){echo($F+5<$wd?" ...":""),($bc&&$wc!==false?pagination($wd,$F):" ".'last'."");}echo(($wc===false?count($M)+1:$wc-$F*$z)>$z?' '.'Load more data'.'':'');}else{echo'Page'.":",pagination(0,$F).($F>1?" ...":""),($F?pagination($F,$F):""),($wd>$F?pagination($F+1,$F).($wd>$F+1?" ...":""):"");}}echo"

\n",($wc!==false?"(".($bc?"":"~ ").lang(array('%d row','%d rows'),$wc).") ":"");$Bb=($bc?"":"~ ").$wc;echo -checkbox("all",1,0,'whole result',"var checked = formChecked(this, /check/); selectCount('selected', this.checked ? '$Bb' : checked); selectCount('selected2', this.checked || !checked ? '$Bb' : checked);")."\n";if($b->selectCommandPrint()){echo'Modify

- -
-
Selected
- - - -
-';}$uc=$b->dumpFormat();foreach((array)$_GET["columns"]as$c){if($c["fun"]){unset($uc['sql']);break;}}if($uc){print_fieldset("export",'Export'." ");$oe=$b->dumpOutput();echo($oe?html_select("output",$oe,$ma["output"])." ":""),html_select("format",$uc,$ma["format"])," \n","\n";}echo(!$r&&$N?"":"\n");}if($b->selectImportPrint()){print_fieldset("import",'Import',!$M);echo" ",html_select("separator",array("csv"=>"CSV,","csv;"=>"CSV;","tsv"=>"TSV"),$ma["format"],1);echo" ","\n";}$b->selectEmailPrint(array_filter($Rb,'strlen'),$d);echo"

\n","
\n";}}if(is_ajax()){ob_end_clean();exit;}}elseif(isset($_GET["variables"])){$Df=isset($_GET["status"]);page_header($Df?'Status':'Variables');$Ig=($Df?show_status():show_variables());if(!$Ig)echo"

".'No rows.'."\n";else{echo"\n";foreach($Ig -as$y=>$X){echo"","
".h($y)."","".nbsp($X);}echo"
\n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$Mf=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$E=>$R){json_row("Comment-$E",nbsp($R["Comment"]));if(!is_view($R)){foreach(array("Engine","Collation")as$y)json_row("$y-$E",nbsp($R[$y]));foreach($Mf+array("Auto_increment"=>0,"Rows"=>0)as$y=>$X){if($R[$y]!=""){$X=format_number($R[$y]);json_row("$y-$E",($y=="Rows"&&$X&&$R["Engine"]==($Bf=="pgsql"?"table":"InnoDB")?"~ $X":$X));if(isset($Mf[$y]))$Mf[$y]+=($R["Engine"]!="InnoDB"||$y!="Data_free"?$R[$y]:0);}elseif(array_key_exists($y,$R))json_row("$y-$E");}}}foreach($Mf -as$y=>$X)json_row("sum-$y",format_number($X));json_row("");}elseif($_GET["script"]=="kill")$e->query("KILL ".number($_POST["kill"]));else{foreach(count_tables($b->databases())as$i=>$X){json_row("tables-$i",$X);json_row("size-$i",db_size($i));}json_row("");}exit;}else{$Uf=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($Uf&&!$k&&!$_POST["search"]){$J=true;$C="";if($x=="sql"&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"]))queries("SET foreign_key_checks = 0");if($_POST["truncate"]){if($_POST["tables"])$J=truncate_tables($_POST["tables"]);$C='Tables have been truncated.';}elseif($_POST["move"]){$J=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$C='Tables have been moved.';}elseif($_POST["copy"]){$J=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$C='Tables have been copied.';}elseif($_POST["drop"]){if($_POST["views"])$J=drop_views($_POST["views"]);if($J&&$_POST["tables"])$J=drop_tables($_POST["tables"]);$C='Tables have been dropped.';}elseif($x!="sql"){$J=($x=="sqlite"?queries("VACUUM"):apply_queries("VACUUM".($_POST["optimize"]?"":" ANALYZE"),$_POST["tables"]));$C='Tables have been optimized.';}elseif(!$_POST["tables"])$C='No tables.';elseif($J=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"])))){while($L=$J->fetch_assoc())$C.="".h($L["Table"]).": ".h($L["Msg_text"])."
";}queries_redirect(substr(ME,0,-1),$C,$J);}page_header(($_GET["ns"]==""?'Database'.": ".h(DB):'Schema'.": ".h($_GET["ns"])),$k,true);if($b->homepage()){if($_GET["ns"]!==""){echo"

".'Tables and views'."

\n";$Tf=tables_list();if(!$Tf)echo"

".'No tables.'."\n";else{echo"

\n";if(support("table")){echo"
".'Search data in tables'."
"," \n","
\n";if($_POST["search"]&&$_POST["query"]!="")search_tables();}echo"\n",'\n";$S=0;foreach($Tf -as$E=>$U){$Kg=($U!==null&&!preg_match('~table~i',$U));echo'
';$Cb=doc_link(array('sql'=>'show-table-status.html'));echo''.'Table',''.'Engine'.doc_link(array('sql'=>'storage-engines.html')),''.'Collation'.doc_link(array('sql'=>'charset-mysql.html')),''.'Data Length'.$Cb,''.'Index Length'.$Cb,''.'Data Free'.$Cb,''.'Auto Increment'.doc_link(array('sql'=>'example-auto-increment.html')),''.'Rows'.$Cb,(support("comment")?''.'Comment'.$Cb:''),"
'.checkbox(($Kg?"views[]":"tables[]"),$E,in_array($E,$Uf,true),"","formUncheck('check-all');"),''.(support("table")||support("indexes")?''.h($E).'':h($E));if($Kg){echo''.(preg_match('~materialized~i',$U)?'Materialized View':'View').'','?';}else{foreach(array("Engine"=>array(),"Collation"=>array(),"Data_length"=>array("create",'Alter table'),"Index_length"=>array("indexes",'Alter indexes'),"Data_free"=>array("edit",'New item'),"Auto_increment"=>array("auto_increment=1&create",'Alter table'),"Rows"=>array("select",'Select data'),)as$y=>$_){$t=" id='$y-".h($E)."'";echo($_?"".(support("table")||$y=="Rows"||(support("indexes")&&$y!="Data_length")?"?":"?"):" ");}$S++;}echo(support("comment")?" ":"");}echo"
 ".sprintf('%d in total',count($Tf)),"".nbsp($x=="sql"?$e->result("SELECT @@storage_engine"):""),"".nbsp(db_collation(DB,collations()));foreach(array("Data_length","Index_length","Data_free")as$y)echo" ";echo"
\n";if(!information_schema(DB)){$Gg=" ";$ce=" ";echo"
".'Selected'."
".($x=="sqlite"?$Gg:($x=="pgsql"?$Gg.$ce:($x=="sql"?" ".$ce." "." ":"")))." "."\n";$h=(support("scheme")?$b->schemas():$b->databases());if(count($h)!=1&&$x!="sqlite"){$i=(isset($_POST["target"])?$_POST["target"]:(support("scheme")?$_GET["ns"]:DB));echo"

".'Move to other database'.": ",($h?html_select("target",$h,$i):'')," ",(support("copy")?" ":""),"\n";}echo"\n";echo"\n","

\n";}echo"
\n","\n";}echo'

".'Routines'."

\n";$lf=routines();if($lf){echo"\n",'\n";odd('');foreach($lf -as$L){echo'','
'.'Name'.''.'Type'.''.'Return type'." 
'.h($L["ROUTINE_NAME"]).'',''.h($L["ROUTINE_TYPE"]),''.h($L["DTD_IDENTIFIER"]),''.'Alter'."";}echo"
\n";}echo'

".'Events'."

\n";$M=get_rows("SHOW EVENTS");if($M){echo"\n","\n";foreach($M -as$L){echo"","
".'Name'."".'Schedule'."".'Start'."".'End'."
".h($L["Name"]),"".($L["Execute at"]?'At given time'."".$L["Execute at"]:'Every'." ".$L["Interval value"]." ".$L["Interval field"]."$L[Starts]"),"$L[Ends]",''.'Alter'.'';}echo"
\n";$Zb=$e->result("SELECT @@event_scheduler");if($Zb&&$Zb!="ON")echo"

event_scheduler: ".h($Zb)."\n";}echo'