diff --git a/README.md b/README.md index a7161a60..dc846493 100644 --- a/README.md +++ b/README.md @@ -81,28 +81,33 @@ Cape: http://example.com/cape/%s.png 这是通过 URL 重写(伪静态)实现的,所以皮肤站目录下没有 `skin` 和 `cape` 目录也不要惊讶哦。 -#### CustomSkinLoader 传统链接: +#### CustomSkinLoader 13.1 版以下: 在 `.minecraft/CustomSkinLoader/skinurls.txt` 中添加如下地址: ``` http://example.com/skin/*.png +http://skins.minecraft.net/MinecraftSkins/*.png +http://minecrack.fr.nf/mc/skinsminecrackd/*.png +http://www.skinme.cc/MinecraftSkins/*.png ``` -在 `.minecraft/CustomSkinLoader/capeurls.txt` 中: +注意你需要将你的皮肤站地址放在配置文件最上方以优先加载。 + +同理在 `.minecraft/CustomSkinLoader/capeurls.txt` 中加入: ``` http://example.com/cape/*.png ``` -#### CustomSkinLoader API +#### CustomSkinLoader 13.1 等待作者发布 常见问题: ------------ -####游戏中皮肤不显示? +#### 游戏中皮肤不显示? 请先确认你的皮肤站 URL 重写规则已经配置正确,并且可以正常获取皮肤图片。 diff --git a/admin/admin_ajax.php b/admin/admin_ajax.php index fb710cf2..603cb02c 100644 --- a/admin/admin_ajax.php +++ b/admin/admin_ajax.php @@ -3,30 +3,12 @@ * @Author: prpr * @Date: 2016-02-04 13:53:55 * @Last Modified by: prpr - * @Last Modified time: 2016-02-05 21:43:29 + * @Last Modified time: 2016-02-06 23:29:34 */ -session_start(); -$dir = dirname(dirname(__FILE__)); -require "$dir/includes/autoload.inc.php"; +require "../includes/session.inc.php"; -if(isset($_COOKIE['uname']) && isset($_COOKIE['token'])) { - $_SESSION['uname'] = $_COOKIE['uname']; - $_SESSION['token'] = $_COOKIE['token']; -} - -/** - * Check token, won't allow non-admin user to access - */ -if (isset($_SESSION['uname'])) { - $admin = new user($_SESSION['uname']); - if ($_SESSION['token'] != $admin->getToken()) { - header('Location: ../index.php?msg=无效的 token,请重新登录。'); - } else if (!$admin->is_admin) { - header('Location: ../index.php?msg=看起来你并不是管理员'); - } -} else { - header('Location: ../index.php?msg=非法访问,请先登录。'); -} +// Check token, won't allow non-admin user to access +if (!$admin->is_admin) header('Location: ../index.php?msg=看起来你并不是管理员'); /* * No protection here, @@ -34,7 +16,7 @@ if (isset($_SESSION['uname'])) { */ if (isset($_GET['action'])) { $action = $_GET['action']; - $user = new user($_GET['uname']); + $user = new User($_GET['uname']); if ($action == "upload") { $type = isset($_GET['type']) ? $_GET['type'] : "skin"; @@ -48,7 +30,7 @@ if (isset($_GET['action'])) { $json['msg'] = "出现了奇怪的错误。。请联系作者"; } } else { - utils::raise(1, '你没有选择任何文件哦'); + Utils::raise(1, '你没有选择任何文件哦'); } } else if ($action == "change") { if (user::checkValidPwd($_POST['passwd'])) { @@ -66,10 +48,10 @@ if (isset($_GET['action'])) { $json['errno'] = 0; $json['msg'] = "成功地将用户 ".$_GET['uname']." 的优先皮肤模型更改为 ".$_POST['model']." 。"; } else { - utils::raise(1, '非法参数。'); + Utils::raise(1, '非法参数。'); } } else { - utils::raise(1, '非法参数。'); + Utils::raise(1, '非法参数。'); } } diff --git a/admin/index.php b/admin/index.php index 714c9233..08a44ea2 100644 --- a/admin/index.php +++ b/admin/index.php @@ -3,30 +3,11 @@ * @Author: prpr * @Date: 2016-02-03 14:39:50 * @Last Modified by: prpr - * @Last Modified time: 2016-02-05 23:15:10 + * @Last Modified time: 2016-02-06 23:29:33 */ - -session_start(); -$dir = dirname(dirname(__FILE__)); -require "$dir/includes/autoload.inc.php"; - -if(isset($_COOKIE['uname']) && isset($_COOKIE['token'])) { - $_SESSION['uname'] = $_COOKIE['uname']; - $_SESSION['token'] = $_COOKIE['token']; -} - -if (isset($_SESSION['uname'])) { - $admin = new user($_SESSION['uname']); - if ($_SESSION['token'] != $admin->getToken()) { - header('Location: ../index.php?msg=无效的 token,请重新登录。'); - } else if (!$admin->is_admin) { - header('Location: ../index.php?msg=看起来你并不是管理员'); - } -} else { - header('Location: ../index.php?msg=非法访问,请先登录。'); -} +require "../includes/session.inc.php"; +if (!$admin->is_admin) header('Location: ../index.php?msg=看起来你并不是管理员'); ?> - @@ -76,7 +57,7 @@ if (isset($_SESSION['uname'])) { query("SELECT * FROM users"); while ($row = $result->fetch_array()) { ?> diff --git a/admin/install.php b/admin/install.php index 40920b41..982a90c7 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-02-05 21:41:55 + * @Last Modified time: 2016-02-06 23:06:23 * * Create tables automatically */ @@ -19,7 +19,7 @@ if (!file_exists("./install.lock")) { echo "

Blessing Skin Server 安装程序

"; if ($conn->connect_error) { - utils::raise(-1, "无法连接至 MySQL 服务器,确定你在 config.php 填写的数据库信息正确吗?".$conn->connect_error); + Utils::raise(-1, "无法连接至 MySQL 服务器,确定你在 config.php 填写的数据库信息正确吗?".$conn->connect_error); } else { echo "成功连接至 MySQL 服务器 ".DB_USER."@".DB_HOST."。

"; } diff --git a/ajax.php b/ajax.php index 3d48abd2..e6d80878 100644 --- a/ajax.php +++ b/ajax.php @@ -3,7 +3,7 @@ * @Author: printempw * @Date: 2016-01-16 23:01:33 * @Last Modified by: prpr - * @Last Modified time: 2016-02-05 21:23:27 + * @Last Modified time: 2016-02-06 23:12:17 * * - login, register, logout * - upload, change, delete @@ -17,17 +17,17 @@ header('Content-type: application/json'); $dir = dirname(__FILE__); require "$dir/includes/autoload.inc.php"; -database::checkConfig(); +Database::checkConfig(); if (isset($_POST['uname'])) { $uname = $_POST['uname']; if (user::checkValidUname($uname)) { - $user = new user($_POST['uname']); + $user = new User($_POST['uname']); } else { - utils::raise(1, '无效的用户名。用户名只能包含数字,字母以及下划线。'); + Utils::raise(1, '无效的用户名。用户名只能包含数字,字母以及下划线。'); } } else { - utils::raise('1', '空用户名。'); + Utils::raise('1', '空用户名。'); } $action = isset($_GET['action']) ? $_GET['action'] : null; $json = null; @@ -100,9 +100,9 @@ function checkPost() { * Handle request from user/index.php */ if ($action == "upload") { - if (utils::getValue('token', $_SESSION) == $user->getToken()) { + if (Utils::getValue('token', $_SESSION) == $user->getToken()) { if (checkFile()) { - if ($file = utils::getValue('skin_file', $_FILES)) { + if ($file = Utils::getValue('skin_file', $_FILES)) { $model = (isset($_GET['model']) && $_GET['model'] == "steve") ? "steve" : "alex"; if ($user->setTexture($model, $file)) { $json['skin']['errno'] = 0; @@ -112,7 +112,7 @@ if ($action == "upload") { $json['skin']['msg'] = "出现了奇怪的错误。。请联系作者 :("; } } - if ($file = utils::getValue('cape_file', $_FILES)) { + if ($file = Utils::getValue('cape_file', $_FILES)) { if ($user->setTexture('cape', $file)) { $json['cape']['errno'] = 0; $json['cape']['msg'] = "披风上传成功!"; @@ -127,7 +127,7 @@ if ($action == "upload") { $json['msg'] = "无效的 token,请先登录。"; } } else if ($action == "model") { - if (utils::getValue('token', $_SESSION) == $user->getToken()) { + if (Utils::getValue('token', $_SESSION) == $user->getToken()) { $new_model = ($user->getPreference() == "default") ? "slim" : "default"; $user->setPreference($new_model); $json['errno'] = 0; @@ -141,7 +141,7 @@ if ($action == "upload") { function checkFile() { global $json; - if (!(utils::getValue('skin_file', $_FILES) || utils::getValue('cape_file', $_FILES))) { + if (!(Utils::getValue('skin_file', $_FILES) || Utils::getValue('cape_file', $_FILES))) { $json['errno'] = 1; $json['msg'] = "什么文件都没有诶?"; return false; @@ -149,15 +149,16 @@ function checkFile() { /** * Check for skin_file */ - if ((utils::getValue('skin_file', $_FILES)["type"] == "image/png") || (utils::getValue('skin_file', $_FILES)["type"] == "image/x-png")) { + if ((Utils::getValue('skin_file', $_FILES)["type"] == "image/png") || + (Utils::getValue('skin_file', $_FILES)["type"] == "image/x-png")) { // if error occured while uploading file - if (utils::getValue('skin_file', $_FILES)["error"] > 0) { + if (Utils::getValue('skin_file', $_FILES)["error"] > 0) { $json['errno'] = 1; - $json['msg'] = utils::getValue('skin_file', $_FILES)["error"]; + $json['msg'] = Utils::getValue('skin_file', $_FILES)["error"]; return false; } } else { - if (utils::getValue('skin_file', $_FILES)) { + if (Utils::getValue('skin_file', $_FILES)) { $json['errno'] = 1; $json['msg'] = '错误的皮肤文件类型。'; return false; @@ -170,15 +171,16 @@ function checkFile() { /** * Check for cape_file */ - if ((utils::getValue('cape_file', $_FILES)["type"] == "image/png") || (utils::getValue('cape_file', $_FILES)["type"] == "image/x-png")) { + if ((Utils::getValue('cape_file', $_FILES)["type"] == "image/png") || + (Utils::getValue('cape_file', $_FILES)["type"] == "image/x-png")) { // if error occured while uploading file - if (utils::getValue('cape_file', $_FILES)["error"] > 0) { + if (Utils::getValue('cape_file', $_FILES)["error"] > 0) { $json['errno'] = 1; - $json['msg'] = utils::getValue('cape_file', $_FILES)["error"]; + $json['msg'] = Utils::getValue('cape_file', $_FILES)["error"]; return false; } } else { - if (utils::getValue('cape_file', $_FILES)) { + if (Utils::getValue('cape_file', $_FILES)) { $json['errno'] = 1; $json['msg'] = '错误的披风文件类型。'; return false; @@ -228,7 +230,7 @@ if ($action == "change") { $json['msg'] = "无效的 token,请先登录。"; } } else if ($action == "logout") { - if (utils::getValue('token', $_SESSION)) { + if (Utils::getValue('token', $_SESSION)) { session_destroy(); $json['errno'] = 0; $json['msg'] = 'Session 成功销毁。'; diff --git a/get.php b/get.php index bdde6825..744ddcb1 100644 --- a/get.php +++ b/get.php @@ -3,7 +3,7 @@ * @Author: prpr * @Date: 2016-02-02 20:56:42 * @Last Modified by: prpr - * @Last Modified time: 2016-02-06 21:51:19 + * @Last Modified time: 2016-02-06 23:06:26 * * All textures requests of legacy link will be handle here. */ @@ -12,8 +12,8 @@ $dir = dirname(__FILE__); require "$dir/includes/autoload.inc.php"; if (isset($_GET['type']) && isset($_GET['uname'])) { - $user = new user($_GET['uname']); - if (!$user->is_registered) utils::raise(1, 'Non-existent user.'); + $user = new User($_GET['uname']); + if (!$user->is_registered) Utils::raise(1, 'Non-existent user.'); // Cache friendly $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : null; @@ -36,8 +36,8 @@ if (isset($_GET['type']) && isset($_GET['uname'])) { echo $user->getJsonProfile(API_TYPE); } } else { - utils::raise(1, 'Illegal parameters.'); + Utils::raise(1, 'Illegal parameters.'); } } else { - utils::raise(1, 'Illegal parameters.'); + Utils::raise(1, 'Illegal parameters.'); } diff --git a/includes/database.class.php b/includes/database.class.php index 4f38e8fc..e016f29a 100644 --- a/includes/database.class.php +++ b/includes/database.class.php @@ -3,10 +3,10 @@ * @Author: printempw * @Date: 2016-02-02 21:59:06 * @Last Modified by: prpr - * @Last Modified time: 2016-02-03 15:55:17 + * @Last Modified time: 2016-02-06 23:06:30 */ -class database +class Database { private $connection = null; @@ -17,16 +17,16 @@ class database public static function checkConfig() { $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWD, DB_NAME); if ($conn->connect_error) { - utils::raise(-1, "Can not connect to mysql, check if database info correct in config.php. ". + Utils::raise(-1, "Can not connect to mysql, check if database info correct in config.php. ". $conn->connect_error); } if (!self::checkTableExist($conn)) { - utils::raise(-1, "Looks like that there is no `users` table in your database. ". + Utils::raise(-1, "Looks like that there is no `users` table in your database. ". "Please run `/admin/install.php` first."); } $dir = dirname(dirname(__FILE__)); if (!is_dir("$dir/textures/")) { - utils::raise(-1, "No `textures` directory exists. Please run `/admin/install.php` ". + Utils::raise(-1, "No `textures` directory exists. Please run `/admin/install.php` ". "or put one manually."); } return $conn; @@ -44,7 +44,7 @@ class database if (!$this->connection->error) { return $result; } - utils::raise(-1, "Database query error: ".$this->connection->error); + Utils::raise(-1, "Database query error: ".$this->connection->error); } public function fetchArray($sql) { diff --git a/includes/session.inc.php b/includes/session.inc.php new file mode 100644 index 00000000..c4daf810 --- /dev/null +++ b/includes/session.inc.php @@ -0,0 +1,24 @@ +getToken()) { + header('Location: ../index.php?msg=无效的 token,请重新登录。'); + } +} else { + header('Location: ../index.php?msg=非法访问,请先登录。'); +} diff --git a/includes/user.class.php b/includes/user.class.php index a4d7b0c8..92ed6905 100644 --- a/includes/user.class.php +++ b/includes/user.class.php @@ -3,10 +3,10 @@ * @Author: printempw * @Date: 2016-01-16 23:01:33 * @Last Modified by: prpr - * @Last Modified time: 2016-02-06 21:34:21 + * @Last Modified time: 2016-02-06 23:32:13 */ -class user +class User { private $uname = ""; private $passwd = ""; @@ -17,8 +17,8 @@ class user public $is_admin = false; function __construct($uname) { - $this->uname = utils::convertString($uname); - $this->db = new database(); + $this->uname = Utils::convertString($uname); + $this->db = new Database(); if ($this->db->checkRecordExist('username', $this->uname)) { $this->passwd = $this->db->select('username', $this->uname)['password']; $this->token = md5($this->uname . $this->passwd.SALT); @@ -43,9 +43,9 @@ class user public static function checkValidPwd($passwd) { if (strlen($passwd) > 16 || strlen($passwd) < 5) { - utils::raise(1, '无效的密码。密码长度应该大于 6 并小于 15。'); - } else if (utils::convertString($passwd) != $passwd) { - utils::raise(1, '无效的密码。密码中包含了奇怪的字符。'); + Utils::raise(1, '无效的密码。密码长度应该大于 6 并小于 15。'); + } else if (Utils::convertString($passwd) != $passwd) { + Utils::raise(1, '无效的密码。密码中包含了奇怪的字符。'); } return true; } @@ -68,11 +68,11 @@ class user public function unRegister() { if ($this->getTexture('steve') != "") - utils::remove("./textures/".$this->getTexture('steve')); + Utils::remove("./textures/".$this->getTexture('steve')); if ($this->getTexture('alex') != "") - utils::remove("./textures/".$this->getTexture('alex')); + Utils::remove("./textures/".$this->getTexture('alex')); if ($this->getTexture('cape') != "") - utils::remove("./textures/".$this->getTexture('cape')); + Utils::remove("./textures/".$this->getTexture('cape')); return $this->db->delete($this->uname); } @@ -96,17 +96,17 @@ class user // Cache friendly header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $this->getLastModified()).' GMT'); header('Content-Length: '.filesize($filename)); - return utils::fread($filename); + return Utils::fread($filename); } else { - utils::raise(-1, 'Texture no longer exists.'); + Utils::raise(-1, 'Texture no longer exists.'); } } public function setTexture($type, $file) { - $hash = utils::upload($file); + $hash = Utils::upload($file); // Remove the original texture first if ($this->getTexture($type) != "") - utils::remove("./textures/".$this->getTexture($type)); + Utils::remove("./textures/".$this->getTexture($type)); $this->updateLastModified(); if ($type == "steve" | $type == "alex" | $type == "cape") return $this->db->update($this->uname, 'hash_'.$type, $hash); @@ -147,13 +147,13 @@ class user $json['skins'][$sec_model] = $this->getTexture($sec_model == "default" ? "steve" : "alex"); $json['cape'] = $this->getTexture('cape'); } else { - utils::raise(-1, '配置文件错误:不支持的 API_TYPE。'); + Utils::raise(-1, '配置文件错误:不支持的 API_TYPE。'); } } else { $json['errno'] = 1; $json['msg'] = "Non-existent user."; } - return json_encode($json); + return json_encode($json, JSON_PRETTY_PRINT); } public function updateLastModified() { diff --git a/index.php b/index.php index b759a5a2..b771bb53 100755 --- a/index.php +++ b/index.php @@ -3,16 +3,16 @@ * @Author: printempw * @Date: 2016-01-17 13:55:20 * @Last Modified by: prpr - * @Last Modified time: 2016-02-05 23:14:59 + * @Last Modified time: 2016-02-06 23:06:24 */ session_start(); $dir = dirname(__FILE__); require "$dir/includes/autoload.inc.php"; -database::checkConfig(); +Database::checkConfig(); // Auto load cookie value to session if (isset($_COOKIE['uname']) && isset($_COOKIE['token'])) { - $user = new user($_COOKIE['uname']); + $user = new User($_COOKIE['uname']); if ($_COOKIE['token'] == $user->getToken()) { $_SESSION['uname'] = $_COOKIE['uname']; $_SESSION['token'] = $user->getToken(); @@ -62,7 +62,7 @@ if (isset($_COOKIE['uname']) && isset($_COOKIE['token'])) {

开源的 PHP Minecraft 皮肤站

- +

现在注册

@@ -109,7 +109,7 @@ if (isset($_COOKIE['uname']) && isset($_COOKIE['token'])) { +if ($msg = Utils::getValue('msg', $_GET)) { ?> diff --git a/user/index.php b/user/index.php index d39f4fe5..8419f70a 100644 --- a/user/index.php +++ b/user/index.php @@ -5,25 +5,8 @@ * @Last Modified by: prpr * @Last Modified time: 2016-01-21 20:40:04 */ -session_start(); -$dir = dirname(dirname(__FILE__)); -require "$dir/includes/autoload.inc.php"; - +require "../includes/session.inc.php"; $action = isset($_GET['action']) ? $_GET['action'] : ""; - -if(isset($_COOKIE['uname']) && isset($_COOKIE['token'])) { - $_SESSION['uname'] = $_COOKIE['uname']; - $_SESSION['token'] = $_COOKIE['token']; -} - -if (isset($_SESSION['uname'])) { - $user = new user($_SESSION['uname']); - if ($_SESSION['token'] != $user->getToken()) { - header('Location: ../index.php?msg=无效的 token,请重新登录。'); - } -} else { - header('Location: ../index.php?msg=非法访问,请先登录。'); -} ?> diff --git a/user/preview.php b/user/preview.php index c6e2cd48..d5d0799b 100644 --- a/user/preview.php +++ b/user/preview.php @@ -3,10 +3,9 @@ * @Author: prpr * @Date: 2016-02-04 19:37:21 * @Last Modified by: prpr - * @Last Modified time: 2016-02-05 15:02:52 + * @Last Modified time: 2016-02-06 23:24:56 */ ?> -
@@ -22,4 +21,4 @@ echo ""; if ($user->getTexture('cape')) { echo ""; echo ""; -} ?> +} diff --git a/user/profile.php b/user/profile.php index 4df1c55c..ac52123a 100644 --- a/user/profile.php +++ b/user/profile.php @@ -3,26 +3,9 @@ * @Author: prpr * @Date: 2016-02-03 16:12:45 * @Last Modified by: prpr - * @Last Modified time: 2016-02-05 23:14:47 + * @Last Modified time: 2016-02-06 23:29:32 */ - -session_start(); -$dir = dirname(dirname(__FILE__)); -require "$dir/includes/autoload.inc.php"; - -if(isset($_COOKIE['uname']) && isset($_COOKIE['token'])) { - $_SESSION['uname'] = $_COOKIE['uname']; - $_SESSION['token'] = $_COOKIE['token']; -} - -if (isset($_SESSION['uname'])) { - $user = new user($_SESSION['uname']); - if ($_SESSION['token'] != $user->getToken()) { - header('Location: ../index.php?msg=无效的 token,请重新登录。'); - } -} else { - header('Location: ../index.php?msg=非法访问,请先登录。'); -} +require "../includes/session.inc.php"; ?>