diff options
Diffstat (limited to 'web/php/user.inc.php')
-rw-r--r-- | web/php/user.inc.php | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/web/php/user.inc.php b/web/php/user.inc.php new file mode 100644 index 0000000..46205d7 --- /dev/null +++ b/web/php/user.inc.php @@ -0,0 +1,262 @@ +<?php + +require_once('common.inc.php'); +require_once('/srv/http/phpmailer/class.phpmailer.php'); + +const USERNAME_LEN_MIN = 5; +const USERNAME_LEN_MAX = 20; +const PASSWORD_LEN_MIN = 5; +const PASSWORD_LEN_MAX = 32; +const NICKNAME_LEN_MIN = 1; +const NICKNAME_LEN_MAX = 32; +const EMAIL_LEN_MAX = 100; + +const USER_PER_USER = 0x00000001; +const USER_PER_PROCREATOR = 0x00000002; +const USER_PER_PROADMIN = 0x00000004; + +const USER_LEVEL_USER = 0x00000001; +const USER_LEVEL_PROCREATOR = 0x00000003; +const USER_LEVEL_PROADMIN = 0x00000007; +const USER_LEVEL_ADMIN = 0x0000ffff; +const USER_LEVEL_SUPERADMIN = 0xffffffff; + +class user +{ + public $uid; + public $username; + public $password; + public $nickname; + public $aboutme; + public $avatar; + public $level; + public $email; + + public static function get_from_uid($sqlc, $uid) + { + //return user object of specified uid. False if user doesn't exists. + + $result = pg_query_params($sqlc, 'SELECT * FROM "user" WHERE "uid"=$1 LIMIT 1;', array(intval($uid))) or die ("Eerror_get_user"); + $ret = pg_fetch_object($result, null, 'user'); + pg_free_result($result); + if(!$ret) + return false; + $ret->uid = intval($ret->uid); + $ret->level = intval($ret->level); + return $ret; + } + + public static function get_from_username($sqlc, $username) + { + //return user object of specified username. False if user doesn't exists. + + $result = pg_query_params($sqlc, 'SELECT * FROM "user" WHERE "username"=$1 LIMIT 1;', array($username)); + $ret = pg_fetch_object($result, null, 'user'); + pg_free_result($result); + if(!$ret) + return false; + $ret->uid = intval($ret->uid); + $ret->level = intval($ret->level); + + return $ret; + } + + public static function add($sqlc, $user) + { + //add user to database , with $user the user data object + //return inserted user object. False if failed. + //Assume the insertion is valid!! + //requires member: string username, string nickname, string password, stirng aboutme, string avatar, string email + + $sqlstr = 'INSERT INTO "user" ("username", "nickname", "password", "aboutme", "avatar", "email") VALUES ($1, $2, $3, $4, $5, $6) RETURNING *;'; + $sqlarr = array($user->username, $user->nickname, $user->password, '', '', $user->email); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + if(!$sqlr)return false; + //$sqlr = pg_query($sqlc, 'SELECT SCOPE_IDENTITY();'); + $obj = pg_fetch_object($sqlr, null, 'user'); + pg_free_result($sqlr); + if($obj)$obj->uid = intval($obj->uid); + return $obj; + } + + public static function update($sqlc, $user) + { + //update user data into database, with $user the user data object + //return updated object. False if failed. + //Assume the update is valid!! + //requires member: string nickname, string password, string aboutme, string avatar, string email, int uid + + $sqlstr = 'UPDATE "user" SET "nickname"=$1, "password"=$2, "aboutme"=$3, "avatar"=$4, "email"=$5 WHERE "uid"=$6 RETURNING *;'; + $sqlarr = array($user->nickname, $user->password, $user->aboutme, $user->avatar, $user->email, intval($user->uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + if(!$sqlr)return false; + $obj = pg_fetch_object($sqlr, null, 'user'); + pg_free_result($sqlr); + if($obj)$obj->uid = intval($obj->uid); + return $obj; + } + + /*public static function update_property($sqlc, $user) + { + //update property of given user. + //return updated object. False if failed. + //Assume the update is valid!! + //requires member: int[] property, int uid; + + $sqlstr = 'UPDATE "user" SET "property"=$1 WHERE "uid"=$2 RETURNING *;'; + $sqlarr = array($user->property, intval($user->uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + if(!$sqlr)return false; + $obj = pg_fetch_object($sqlr, null, 'user'); + pg_free_result($sqlr); + if($obj)$obj->uid = intval($obj->uid); + return $obj; + }*/ + + public static function get_username($sqlc, $uid) + { + //return username of given uid. False if not found. + + $sqlstr = 'SELECT "username" FROM "user" WHERE "uid"=$1 LIMIT 1;'; + $sqlarr = array(intval($uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + $ret = pg_fetch_result($sqlr, 0); + pg_free_result($sqlr); + return $ret; + } + + public static function get_nickname($sqlc, $uid) + { + //return nickname of given uid. False if not found. + + $sqlstr = 'SELECT "nickname" FROM "user" WHERE "uid"=$1 LIMIT 1;'; + $sqlarr = array(intval($uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + $ret = pg_fetch_result($sqlr, 0); + pg_free_result($sqlr); + return $ret; + } + + public static function reset_password($sqlc, $uid) + { + //reset password for given uid. False if not found. + + $user = user::get_from_uid($sqlc, $uid); + if(!$user)return false; + $email = $user->email; + if(!$email)return false; + + $passlen = 8; + $newpass = ''; + for($i = 0; $i < $passlen; $i++) + { + $v = rand()%62; + $c = null; + if($v<10)$c = chr(48 + $v); + else if($v<36)$c = chr(65 + $v - 10); + else $c = chr(97 + $v - 36); + $newpass = $newpass.$c; + } + //echo($newpass.'<br>'); + + //email + + $cmail = new PHPMailer(); + $cmail->IsSMTP(); + + $cmail->SMTPAuth = true; + $cmail->SMTPSecure = 'SSL'; + $cmail->Host = 'ssl://'.SMTP_HOST; + $cmail->Port = 465; + $cmail->Username = SMTP_USER; + $cmail->Password = SMTP_PASS; + $cmail->From = 'sprout@csie.ntu.edu.tw'; + $cmail->FromName = 'Taiwan Online Judge'; + + $cmail->AddAddress($email, $user->nickname); + $cmail->WordWrap = 70; + $cmail->Subject = 'TOJ Password Reset Notice'; + $cmail->IsHTML = true; + $cmail->Body = 'Hi '.$user->nickname.' ('.$user->username.') , your new password is '.$newpass.' .'; + if(!$cmail->Send()) + { + //echo($cmail->ErrorInfo.'<br>'); + return false; + } + + + + $user->password = hash('sha512', $newpass); + $nuser = user::update($sqlc, $user); + if(!$nuser)return false; + + return true; + } + + public static function statistic($sqlc, $uid){ + $sqlstr = 'SELECT "proid",MIN("result") AS "result" FROM "submit" WHERE "uid"=$1 GROUP BY "proid" ORDER BY "proid" ASC;'; + $sqlarr = array(intval($uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + $trylist = array(); + while($obj = pg_fetch_object($sqlr)){ + $obj->proid = intval($obj->proid); + $obj->result = intval($obj->result); + array_push($trylist, $obj); + } + pg_free_result($sqlr); + + $sqlstr = 'SELECT "result",COUNT("result") AS "count" FROM "submit" WHERE "uid"=$1 GROUP BY "result" ORDER BY "result";'; + $sqlarr = array(intval($uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + $substatis = array(); + while($obj = pg_fetch_object($sqlr)){ + $obj->result = intval($obj->result); + $obj->count = intval($obj->count); + array_push($substatis, $obj); + } + pg_free_result($sqlr); + + $sqlstr = 'SELECT "result",COUNT("result") AS "count" FROM "submit" WHERE "uid"=$1 GROUP BY "result" ORDER BY "result";'; + $sqlarr = array(intval($uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + $substatis = array(); + while($obj = pg_fetch_object($sqlr)){ + $obj->result = intval($obj->result); + $obj->count = intval($obj->count); + array_push($substatis, $obj); + } + pg_free_result($sqlr); + + $sqlstr = 'SELECT TO_CHAR("submit_time",\'YYYY-MM\') AS "time",COUNT("submit_time") AS "count" FROM "submit" WHERE uid=$1 GROUP BY TO_CHAR("submit_time",\'YYYY-MM\');'; + $sqlarr = array(intval($uid)); + $sqlr = pg_query_params($sqlc, $sqlstr, $sqlarr); + $timesub = array(); + while($obj = pg_fetch_object($sqlr)){ + $obj->count = intval($obj->count); + array_push($timesub, $obj); + } + pg_free_result($sqlr); + + return array( + 'trylist' => $trylist, + 'substatis' => $substatis, + 'timesub' => $timesub + ); + } +} + +function sec_check_level($sqlc, $lv, $uid = null) +{ + $uidnull = false; + if($uid == null) + { + $uid = intval($_COOKIE['uid']); + $uidnull = true; + } + if($uidnull && !sec_is_login()) + return false; + $user = user::get_from_uid($sqlc, $uid); + return (($user->level & $lv) == $lv); +} + +?> |