From 422a78a89e5668635f960e37d082ee2135a140f0 Mon Sep 17 00:00:00 2001 From: printempw Date: Sun, 17 Jan 2016 10:53:10 +0800 Subject: [PATCH] fixed some shit --- admin/install.php | 28 ++++-- ajax.php | 84 +++++++++++++++--- includes/user.class.php | 5 +- includes/utils.class.php | 19 ++-- ...efd076eef0a901cb90d3deae4057fec60c66eb93d2 | Bin 0 -> 484 bytes ...8510fb31da05c53482af23fab7dbfc5bdf9fce2808 | Bin 0 -> 6420 bytes ...81c7d782a9242acc0315159622e9decbc63729d806 | Bin 0 -> 2945 bytes 7 files changed, 112 insertions(+), 24 deletions(-) create mode 100644 textures/2911438e8282d40e6d64fbefd076eef0a901cb90d3deae4057fec60c66eb93d2 create mode 100644 textures/3274a00cd690d586ee1bee8510fb31da05c53482af23fab7dbfc5bdf9fce2808 create mode 100644 textures/c544bea6f7f0cdd29d9d9d81c7d782a9242acc0315159622e9decbc63729d806 diff --git a/admin/install.php b/admin/install.php index 6788a41d..74805a59 100644 --- a/admin/install.php +++ b/admin/install.php @@ -3,7 +3,7 @@ * @Author: printempw * @Date: 2016-01-16 23:01:33 * @Last Modified by: prpr - * @Last Modified time: 2016-01-17 10:18:53 + * @Last Modified time: 2016-01-17 10:47:20 * * Create tables automatically */ @@ -13,6 +13,8 @@ function __autoload($classname) { include_once($filename); } +echo ""; + if (!file_exists("./install.lock")) { require "../config.php"; $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWD); @@ -20,13 +22,13 @@ if (!file_exists("./install.lock")) { echo "

Blessing Skin Server Install

"; if (!$con) { - utils::raise('1', "Can not connect to mysql, check if database info correct in config.php. ".mysql_error()) + utils::raise('1', "Can not connect to mysql, check if database info correct in config.php. ".mysql_error()); } else { echo "Succesfully connected to mysql server.

"; } if(!mysql_select_db(DB_NAME, $con)){ - utils::raise('1', "Can not select database, please check if database '".DB_NAME."' really exists.") + utils::raise('1', "Can not select database, please check if database '".DB_NAME."' really exists."); } echo "Selected database: ".DB_NAME."

"; @@ -46,26 +48,38 @@ if (!file_exists("./install.lock")) { ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15;"; if(!mysql_query($query)) { - die("Creating tables failed. ".mysql_error()); + utils::raise('1', "Creating tables failed. ".mysql_error()); } /** * username: admin * password: 123456 */ - mysql_query("INSERT INTO `users` (`uid`, `username`, `password`, `ip`) VALUES(1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', '127.0.0.1')"); + mysql_query("INSERT INTO `users` (`uid`, `username`, `password`, `ip`, `preference`) VALUES(1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', '127.0.0.1', 'default')"); + + echo "Creating tables successfully

"; + + echo " +
++-----------------------------------------------------------------------------------+
+|  uid  |  username  |  password  |  ip  |  preference  |  skin_hash  |  cape_hash  |
++-----------------------------------------------------------------------------------+
+|   1   |    admin   |   123456   |   *  |    default   |      *      |      *      |
++-----------------------------------------------------------------------------------+
+
+ "; echo "Successfully installed. Index"; - if ($lock = fopen("./install.lock", w)) { + if ($lock = fopen("./install.lock", 'w')) { fwrite($lock, time()); fclose($lock); } else { die("Unable to write 'install.lock'."); } - } else { + echo "
"; echo "It seems that you have already installed. Index

"; echo "May you should delete the file 'install.lock' in ./admin to unlock installing."; } diff --git a/ajax.php b/ajax.php index 45d78645..b84e102c 100644 --- a/ajax.php +++ b/ajax.php @@ -3,12 +3,12 @@ * @Author: printempw * @Date: 2016-01-16 23:01:33 * @Last Modified by: prpr - * @Last Modified time: 2016-01-17 00:17:39 + * @Last Modified time: 2016-01-17 10:51:05 * * All ajax requests will be handled here */ -header('Access-Control-Allow-Origin:*'); +header('Access-Control-Allow-Origin: *'); session_start(); function __autoload($classname) { @@ -20,22 +20,33 @@ $user = new user($_POST['uname']); $action = $_GET['action']; $json = null; -function checkPost() { +function checkInput($type = "login") { global $json; + // generally check username if (!$_POST['uname']) { $json['errno'] = 1; $json['msg'] = 'Empty username!'; return false; - } else if (!$_POST['passwd']) { - $json['errno'] = 1; - $json['msg'] = "Empty password!"; - return false; } - return true; + if ($type == "login" || $type == "register") { + if (!$_POST['passwd']) { + $json['errno'] = 1; + $json['msg'] = "Empty password!"; + return false; + } + return true; + } else if ($type == "upload") { + if (!($_FILES['skin_file'] || $_FILES['cape_file'])) { + $json['errno'] = 1; + $json['msg'] = "No input file selected."; + return false; + } + return true; + } } if ($action == "login") { - if (checkPost()) { + if (checkInput($action)) { if (!$user -> is_registered) { $json['errno'] = 1; $json['msg'] = "Non-existent user."; @@ -44,6 +55,7 @@ if ($action == "login") { $json['errno'] = 0; $json['msg'] = 'Logging in succeed!'; $json['token'] = $user -> getToken(); + $_SESSION['token'] = $user -> getToken(); } else { $json['errno'] = 1; $json['msg'] = "Incorrect usename or password."; @@ -51,9 +63,61 @@ if ($action == "login") { } } } elseif ($action == "register") { + if (checkInput($action)) { + if (!$user -> is_registered) { + if (!empty($_SERVER['HTTP_CLIENT_IP'])) { + $ip = $_SERVER['HTTP_CLIENT_IP']; + } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } else { + $ip = $_SERVER['REMOTE_ADDR']; + } -} elseif ($action == "register") { + if (!utils::select('ip', $ip)) { + // use once md5 to encrypt password + if ($user -> register(md5($_POST['passwd']), $ip)) { + $json['errno'] = 0; + $json['msg'] = "Registered successfully."; + } else { + $json['errno'] = 1; + $json['msg'] = "Uncaught error."; + } + } else { + $json['errno'] = 1; + $json['msg'] = "It seems that you have already register a account with this IP address."; + } + } else { + $json['errno'] = 1; + $json['msg'] = "User already existed."; + } + } +} elseif ($action == "upload") { + if ($_SESSION['token'] == $user -> getToken()) { + if (checkInput($action)) { + if ($file = $_FILES['skin_file']) { + if ($user -> setTexture('skin', $file)) { + $json[0]['errno'] = 0; + $json[0]['msg'] = "Skin uploaded successfully."; + } else { + $json[0]['errno'] = 1; + $json[0]['msg'] = "Uncaught error."; + } + } + if ($file = $_FILES['cape_file']) { + if ($user -> setTexture('cape', $file)) { + $json[1]['errno'] = 0; + $json[1]['msg'] = "Cape uploaded successfully."; + } else { + $json[1]['errno'] = 1; + $json[1]['msg'] = "Uncaught error."; + } + } + } + } else { + $json['errno'] = 1; + $json['msg'] = "Invalid token."; + } } echo json_encode($json); diff --git a/includes/user.class.php b/includes/user.class.php index 6b090f4c..7daf54fd 100644 --- a/includes/user.class.php +++ b/includes/user.class.php @@ -3,7 +3,7 @@ * @Author: printempw * @Date: 2016-01-16 23:01:33 * @Last Modified by: prpr - * @Last Modified time: 2016-01-17 00:18:28 + * @Last Modified time: 2016-01-17 10:10:23 */ class user { @@ -15,7 +15,7 @@ class user { public $is_admin = false; function __construct($uname) { - $this -> uname = $uname; + $this -> uname = utils::convertString($uname); if (utils::select('username', $this -> uname)['uid'] == 1) { $this -> is_admin = true; } @@ -59,6 +59,7 @@ class user { $hash = utils::upload($file); if ($type == "skin") { return utils::update($this -> uname, 'skin_hash', $hash); + echo "shit"; } else if ($type == "cape") { return utils::update($this -> uname, 'cape_hash', $hash); } diff --git a/includes/utils.class.php b/includes/utils.class.php index 915d4056..4b0d7906 100644 --- a/includes/utils.class.php +++ b/includes/utils.class.php @@ -3,7 +3,7 @@ * @Author: printempw * @Date: 2016-01-16 23:01:33 * @Last Modified by: prpr - * @Last Modified time: 2016-01-16 23:52:00 + * @Last Modified time: 2016-01-17 10:09:56 */ require "./config.php"; @@ -48,19 +48,28 @@ class utils { public static function update($uname, $key, $value) { self::connect(); - $query = mysql_query("UPDATE users SET $key='$value' WHERE username='$uname'", self::$connection); + $query = self::query("UPDATE users SET $key='$value' WHERE username='$uname'"); return $query; } public static function upload($file) { - move_uploaded_file($file["tmp_name"],"../textures/tmp.png"); - $hash = hash_file('sha256', "../textures/tmp.png"); - rename("../textures/tmp.png", $hash); + move_uploaded_file($file["tmp_name"], "./textures/tmp.png"); + $hash = hash_file('sha256', "./textures/tmp.png"); + rename("./textures/tmp.png", "./textures/".$hash); return $hash; } public static function convertString($string) { return stripslashes(trim($string)); } + + private static function query($sql) { + $query = mysql_query($sql, self::$connection); + if ($query) { + return $query; + } else { + self::raise('1', mysql_error()); + } + } } ?> diff --git a/textures/2911438e8282d40e6d64fbefd076eef0a901cb90d3deae4057fec60c66eb93d2 b/textures/2911438e8282d40e6d64fbefd076eef0a901cb90d3deae4057fec60c66eb93d2 new file mode 100644 index 0000000000000000000000000000000000000000..4733ad34195de81aa21e13afa34160a9ae11a32b GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=%;U|?MB>EalY(fD?{VbLK20oVPe zGEAaZmXs_k%*>h42B9`m_(cnZfW@NNw@5}8uy`%q-3(;AWP2?;%g+fV#B zYY-Qio%Z$bRw?$VY?jkY-9j0E+e*#!VbE;c{{7icIOBlI`Qy%P;%?m%MD{P-fVYq1kA{I_ZhYVx7#7>kMp@N_xzse=(+1Hs2Hr zEUE0S=wWaO%a7VJWlKT%y7V4Dw?LK<(W7bqnM?F});gbC@wo8$y@KqH$$=7=LcQ98 zDmL&%tW}VcV`TVh9DDS#cJF@sm4e>{iVozl`z&WTaqbvrsm-!AhhwCV$DH55ccS>p zE|yPs_WkS^zv9aDr1J4$yZ5!soC#9$Yu@_CXuI;g)N~SWmDOZzxR*0~Y3S{B}#J!|lNG z7reDCEFPC%&(y6waMV1VB`W)!RD|I5;9qAI7|I#%@GupKAHc!9%l(1>@2@h!8}r*U QfU(Em>FVdQ&MBb@0Lf6wS^xk5 literal 0 HcmV?d00001 diff --git a/textures/3274a00cd690d586ee1bee8510fb31da05c53482af23fab7dbfc5bdf9fce2808 b/textures/3274a00cd690d586ee1bee8510fb31da05c53482af23fab7dbfc5bdf9fce2808 new file mode 100644 index 0000000000000000000000000000000000000000..6a3127287b47819de6d8a0d3beb601ca7f036475 GIT binary patch literal 6420 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 JDe}py{{hpyhb{mB literal 0 HcmV?d00001 diff --git a/textures/c544bea6f7f0cdd29d9d9d81c7d782a9242acc0315159622e9decbc63729d806 b/textures/c544bea6f7f0cdd29d9d9d81c7d782a9242acc0315159622e9decbc63729d806 new file mode 100644 index 0000000000000000000000000000000000000000..f1b3a93574b234e01ec3467c7d6d8b1467c7b3f4 GIT binary patch literal 2945 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 literal 0 HcmV?d00001