414 lines
12 KiB
PHP
414 lines
12 KiB
PHP
![]() |
<?php
|
|||
|
|
|||
|
/*
|
|||
|
* @link http://kodcloud.com/
|
|||
|
* @author warlee | e-mail:kodcloud@qq.com
|
|||
|
* @copyright warlee 2014.(Shanghai)Co.,Ltd
|
|||
|
* @license http://kodcloud.com/tools/license/license.txt
|
|||
|
*/
|
|||
|
|
|||
|
class userSetting extends Controller {
|
|||
|
public $user;
|
|||
|
public function __construct() {
|
|||
|
parent::__construct();
|
|||
|
$this->user = Session::get('kodUser');
|
|||
|
$this->model = Model('User');
|
|||
|
$this->imageExt = array('png','jpg','jpeg','gif','webp','bmp','ico');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 参数设置
|
|||
|
* 可以同时修改多个:key=a,b,c&value=1,2,3
|
|||
|
* 防xss 做过滤
|
|||
|
*/
|
|||
|
public function setConfig() {
|
|||
|
$optionKey = array_keys($this->config['settingDefault']);
|
|||
|
$data = Input::getArray(array(
|
|||
|
"key" => array("check"=>"in","param"=>$optionKey),
|
|||
|
"value" => array("check"=>"require"),
|
|||
|
));
|
|||
|
Model('UserOption')->set($data['key'],$data['value']);
|
|||
|
|
|||
|
// listType,listSort 显示模式,排序方式跟随文件夹配置记录;
|
|||
|
if(isset($this->in['listViewPath']) && $this->in['listViewPath']){
|
|||
|
Action('explorer.listView')->dataSave($this->in);
|
|||
|
}
|
|||
|
show_json(LNG('explorer.settingSuccess'));
|
|||
|
}
|
|||
|
public function getConfig(){
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 个人中心-账号设置保存
|
|||
|
*/
|
|||
|
public function setUserInfo() {
|
|||
|
$limit = array('nickName', 'email', 'phone', 'password');
|
|||
|
$data = Input::getArray(array(
|
|||
|
"type" => array("check" => "in", "param" => $limit),
|
|||
|
"msgCode" => array("default" => null),
|
|||
|
));
|
|||
|
if($data['type'] != 'password') {
|
|||
|
$input = Input::get('input','require');
|
|||
|
$input = trim(rawurldecode($input));
|
|||
|
}
|
|||
|
$input = html2txt($input);
|
|||
|
$userID = $this->user['userID'];
|
|||
|
if(in_array($data['type'], array('email', 'phone'))){
|
|||
|
if(!isset($data['msgCode'])){$data['msgCode'] = '000';}
|
|||
|
$this->userMsgCheck($input, $data); // 修改邮箱/手机号,需要验证码校验;
|
|||
|
if($input == $this->user[$data['type']]){
|
|||
|
show_json(LNG('common.' . $data['type']) . LNG('user.binded'), false);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 昵称校验——更新时校验
|
|||
|
// 密码校验
|
|||
|
if ($data['type'] == 'password') {
|
|||
|
$input = $this->userPwdCheck($data);
|
|||
|
}
|
|||
|
|
|||
|
// 更新用户信息
|
|||
|
$res = $this->model->userEdit($userID, array($data['type'] => $input));
|
|||
|
if ($res <= 0) {
|
|||
|
$msg = $this->model->errorLang($res);
|
|||
|
show_json(($msg ? $msg : LNG('explorer.error')), false);
|
|||
|
}
|
|||
|
Action('user.index')->refreshUser($userID);
|
|||
|
$userInfo = Model('User')->getInfo($userID);
|
|||
|
show_json(LNG('explorer.success'), true, $userInfo);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* (图片)验证码校验
|
|||
|
* @param type $code
|
|||
|
*/
|
|||
|
public function checkImgCode($code){
|
|||
|
$checkCode = Session::get('checkCode');
|
|||
|
Session::remove('checkCode');
|
|||
|
if (!$checkCode || strtolower($checkCode) !== strtolower($code)) {
|
|||
|
show_json(LNG('user.codeError'), false, ERROR_IMG_CODE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 手机、邮箱验证码存储、验证
|
|||
|
* @param type $type email、phone
|
|||
|
* @param type $code
|
|||
|
* @param type $data {type: [source], input: ''}
|
|||
|
* @param type $set 首次存储验证码(检测错误次数)
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function checkMsgCode($type, $code, $data = array(), $set = false) {
|
|||
|
$typeList = array('setting', 'regist', 'findpwd'); // 个人设置、注册、找回密码
|
|||
|
if(!in_array($data['type'], $typeList)){
|
|||
|
show_json(LNG('common.invalid') . LNG('explorer.file.action'), false);
|
|||
|
}
|
|||
|
$name = md5("{$data['type']}_{$type}_{$data['input']}_msgcode");
|
|||
|
// 1. 存储
|
|||
|
if ($set) {
|
|||
|
$sess = array(
|
|||
|
'code' => $code,
|
|||
|
'cnt' => 0,
|
|||
|
'time' => time()
|
|||
|
);
|
|||
|
return Session::set($name, $sess);
|
|||
|
}
|
|||
|
// 2. 验证
|
|||
|
$type = $type == 'phone' ? 'sms' : $type;
|
|||
|
if (!$sess = Session::get($name)) {
|
|||
|
$msg = LNG('common.invalid') . LNG('common.' . $type) . LNG('user.code');
|
|||
|
show_json($msg, false);
|
|||
|
}
|
|||
|
// 超过20分钟
|
|||
|
if (($sess['time'] + 60 * 20) < time()) {
|
|||
|
Session::remove($name);
|
|||
|
show_json(LNG('common.' . $type) . LNG('user.codeExpired'), false);
|
|||
|
}
|
|||
|
// 错误次数过多,锁定一段时间——没有锁定,重新获取
|
|||
|
if ($sess['cnt'] >= 10) {
|
|||
|
Session::remove($name);
|
|||
|
show_json(LNG('common.' . $type) . LNG('user.codeErrorTooMany'), false);
|
|||
|
}
|
|||
|
if (strtolower($sess['code']) != strtolower($code)) {
|
|||
|
$sess['cnt'] ++;
|
|||
|
Session::set($name, $sess);
|
|||
|
show_json(LNG('common.' . $type) . LNG('user.codeError'), false);
|
|||
|
}
|
|||
|
Session::remove($name);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 消息发送频率检查
|
|||
|
* [type/input/source]
|
|||
|
* @param [type] $data
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
public function checkMsgFreq($data, $set=false){
|
|||
|
$cckey = md5("{$data['type']}_{$data['input']}_{$data['source']}_msgtime");
|
|||
|
$cache = Cache::get($cckey);
|
|||
|
// 保存
|
|||
|
if ($set) {
|
|||
|
$cnt = intval(_get($cache,'cnt',0));
|
|||
|
$cache = array('time' => time(), 'cnt' => $cnt++);
|
|||
|
return Cache::set($cckey, $cache);
|
|||
|
}
|
|||
|
// 获取
|
|||
|
if (!$cache) return;
|
|||
|
$time = $data['type'] == 'email' ? 60 : 90;
|
|||
|
if(($cache['time'] + $time) > time()) {
|
|||
|
show_json(LNG('user.codeErrorFreq'), false);
|
|||
|
}
|
|||
|
// if($cache['cnt'] >= 10) {
|
|||
|
// show_json(sprintf(LNG('user.codeErrorCnt'), $hours), false);
|
|||
|
// }
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* (短信、邮箱)验证码校验
|
|||
|
* @param type $input
|
|||
|
* @param type $data
|
|||
|
*/
|
|||
|
private function userMsgCheck($input, $data) {
|
|||
|
$type = $data['type'];
|
|||
|
// 判断邮箱、手机号是否已被绑定
|
|||
|
if($this->user[$type] == $input) return;
|
|||
|
|
|||
|
$where = array($type=> $input);
|
|||
|
if ($res = Model('User')->userSearch($where, 'name,nickName')) {
|
|||
|
$typeTit = $type . ($type == 'phone' ? 'Number' : '');
|
|||
|
show_json(LNG('common.' . $typeTit) . LNG('common.error'), false);
|
|||
|
}
|
|||
|
// 判断邮箱、短信验证码
|
|||
|
$param = array(
|
|||
|
'type' => 'setting',
|
|||
|
'input' => $input
|
|||
|
);
|
|||
|
$this->checkMsgCode($type, $data['msgCode'], $param);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 修改密码检测
|
|||
|
* @param type $data
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
private function userPwdCheck($data) {
|
|||
|
$newpwd = Input::get('newpwd','require');
|
|||
|
$salt = Input::get('salt',null, 0);
|
|||
|
// 密码为空则不检查原密码
|
|||
|
$info = Model('User')->getInfoSimple($this->user['userID']);
|
|||
|
if(empty($info['password'])) {
|
|||
|
return !$salt ? $newpwd : $this->decodePwd($newpwd);
|
|||
|
}
|
|||
|
$oldpwd = Input::get('oldpwd','require');
|
|||
|
if ($salt == 1) {
|
|||
|
$oldpwd = $this->decodePwd($oldpwd);
|
|||
|
$newpwd = $this->decodePwd($newpwd);
|
|||
|
}
|
|||
|
if (!$this->model->userPasswordCheck($this->user['userID'], $oldpwd)) {
|
|||
|
show_json(LNG('user.oldPwdError'), false);
|
|||
|
}
|
|||
|
if( !ActionCall('filter.userCheck.password',$newpwd) ){
|
|||
|
return ActionCall('filter.userCheck.passwordTips');
|
|||
|
}
|
|||
|
return $newpwd;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 解析密码
|
|||
|
*/
|
|||
|
public function decodePwd($password) {
|
|||
|
$pwd = rawurldecode($password);
|
|||
|
$key = substr($pwd, 0, 5) . "2&$%@(*@(djfhj1923";
|
|||
|
return Mcrypt::decode(substr($pwd, 5), $key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 用户头像(上传)
|
|||
|
*/
|
|||
|
public function uploadHeadImage(){
|
|||
|
$ext = get_path_ext(Uploader::fileName());
|
|||
|
if(!in_array($ext,$this->imageExt)){
|
|||
|
show_json("only support image",false);
|
|||
|
}
|
|||
|
|
|||
|
$path = KodIO::systemFolder('avataImage');
|
|||
|
$image = 'avata-'.USER_ID.'.jpg';
|
|||
|
$pathInfo = IO::infoFullSimple($path.'/'.$image);
|
|||
|
if($pathInfo){
|
|||
|
IO::remove($pathInfo['path'], false);
|
|||
|
}
|
|||
|
|
|||
|
// pr($imagePath,$path,IO::infoFull($imagePath));exit;
|
|||
|
$this->in['fullPath'] = '';
|
|||
|
$this->in['name'] = $image;
|
|||
|
$this->in['path'] = $path;
|
|||
|
Action('explorer.upload')->fileUpload();
|
|||
|
}
|
|||
|
/**
|
|||
|
* 用户头像(设置)
|
|||
|
*/
|
|||
|
public function setHeadImage() {
|
|||
|
$link = Input::get('link', 'require');
|
|||
|
if(strpos($link, APP_HOST) !== 0) {
|
|||
|
show_json(LNG('common.illegalRequest'), false);
|
|||
|
}
|
|||
|
$userID = USER_ID;
|
|||
|
$link = str_replace(APP_HOST, './', $link);
|
|||
|
if(!$this->model->userEdit($userID, array("avatar" => $link))) {
|
|||
|
show_json(LNG('explorer.upload.error'), false);
|
|||
|
}
|
|||
|
Action('user.index')->refreshUser($userID);
|
|||
|
$userInfo = Model('User')->getInfo($userID);
|
|||
|
show_json($link, true, $userInfo);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 重置密码
|
|||
|
*/
|
|||
|
public function changePassword() {
|
|||
|
if (empty($this->user['email']) && empty($this->user['phone'])) {
|
|||
|
show_json('请先绑定邮箱或手机号!', false);
|
|||
|
}
|
|||
|
show_json('', true);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 找回密码
|
|||
|
*/
|
|||
|
public function findPassword() {
|
|||
|
$token = Input::get('token', null, null);
|
|||
|
if(!$token){
|
|||
|
$res = $this->findPwdCheck();
|
|||
|
}else{
|
|||
|
$res = $this->findPwdReset();
|
|||
|
}
|
|||
|
show_json($res, true);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 找回密码 step1:根据账号检测并获取用户信息
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
private function findPwdCheck() {
|
|||
|
$data = Input::getArray(array(
|
|||
|
'type' => array('check' => 'in','default'=>'','param'=>array('phone','email')),
|
|||
|
'input' => array('check' => 'require'),
|
|||
|
'msgCode' => array('check' => 'require')
|
|||
|
));
|
|||
|
// 是否绑定
|
|||
|
$res = Model('User')->userSearch(array($data['type'] => $data['input']), 'userID');
|
|||
|
if (empty($res)) {
|
|||
|
show_json(LNG('user.notBind'), false);
|
|||
|
}
|
|||
|
$param = array(
|
|||
|
'type' => 'findpwd',
|
|||
|
'input' => $data['input']
|
|||
|
);
|
|||
|
$this->checkMsgCode($data['type'], $data['msgCode'], $param);
|
|||
|
|
|||
|
$data = array(
|
|||
|
'type' => $data['type'],
|
|||
|
'input' => $data['input'],
|
|||
|
'userID' => $res['userID'],
|
|||
|
'time' => time()
|
|||
|
);
|
|||
|
$pass = md5('findpwd_' . implode('_', $data));
|
|||
|
Cache::set($pass, $data, 60 * 20); // 有效期20分钟
|
|||
|
return $pass;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 找回密码 step1:更新密码
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
private function findPwdReset() {
|
|||
|
$data = Input::getArray(array(
|
|||
|
'token' => array('check' => 'require'),
|
|||
|
'password' => array('check' => 'require'),
|
|||
|
'salt' => array('default' => null)
|
|||
|
));
|
|||
|
// 检测token是否有效
|
|||
|
$cache = Cache::get($data['token']);
|
|||
|
if(!$cache) show_json(LNG('common.errorExpiredRequest'), false);
|
|||
|
if(!isset($cache['type']) || !isset($cache['input']) || !isset($cache['userID']) || !isset($cache['time'])){
|
|||
|
show_json(LNG('common.illegalRequest'), false);
|
|||
|
}
|
|||
|
if($cache['time'] < time() - 60 * 10){
|
|||
|
show_json(LNG('common.expiredRequest'), false);
|
|||
|
}
|
|||
|
$res = Model('User')->userSearch(array($cache['type'] => $cache['input']), 'userID');
|
|||
|
if(empty($res) || $res['userID'] != $cache['userID']){
|
|||
|
show_json(LNG('common.illegalRequest'), false);
|
|||
|
}
|
|||
|
if (!Action('user.authRole')->authCanUser('user.edit',$res['userID'])) {
|
|||
|
show_json(LNG('explorer.noPermissionAction'),false,1004);
|
|||
|
}
|
|||
|
if (isset($data['salt'])) {
|
|||
|
$data['password'] = $this->decodePwd($data['password']);
|
|||
|
}
|
|||
|
if( !ActionCall('filter.userCheck.password',$data['password']) ){
|
|||
|
return ActionCall('filter.userCheck.passwordTips');
|
|||
|
}
|
|||
|
Cache::remove($data['token']);
|
|||
|
if (!$this->model->userEdit($res['userID'], array('password' => $data['password']))) {
|
|||
|
show_json(LNG('explorer.error'), false);
|
|||
|
}
|
|||
|
return LNG('explorer.success');
|
|||
|
}
|
|||
|
|
|||
|
// 个人空间使用统计
|
|||
|
public function userChart(){
|
|||
|
ActionCall('admin.analysis.chart');
|
|||
|
}
|
|||
|
// 个人操作日志
|
|||
|
public function userLog(){
|
|||
|
$type = Input::get('type', null, null);
|
|||
|
if(!$type){
|
|||
|
return ActionCall('admin.log.userLog');
|
|||
|
}
|
|||
|
if($type == 'user.index.loginSubmit'){
|
|||
|
return ActionCall('admin.log.userLogLogin');
|
|||
|
}
|
|||
|
}
|
|||
|
// 个人登录设备
|
|||
|
public function userDevice(){
|
|||
|
$fromTime = time() - 3600 * 24 * 30 * 3;//最近3个月;
|
|||
|
$res = Model('SystemLog')->deviceList(USER_ID,$fromTime);
|
|||
|
show_json($res);
|
|||
|
}
|
|||
|
|
|||
|
// 当前账号在线设备列表;
|
|||
|
public function userLoginList(){
|
|||
|
$sign = Session::sign();
|
|||
|
$arr = Action("filter.userLoginState")->userListLoad(USER_ID);
|
|||
|
$arr[$sign]['isSelf'] = true;
|
|||
|
foreach ($arr as $key => $item) {
|
|||
|
$arr[$key]['address'] = IpLocation::get($item['ip']);
|
|||
|
}
|
|||
|
show_json(array_values($arr));
|
|||
|
}
|
|||
|
// 踢下线某个登录设备;
|
|||
|
public function userLogoutSet(){
|
|||
|
$sign = Input::get('sign', null, null);
|
|||
|
Action("filter.userLoginState")->userLogoutTrigger(USER_ID,$sign);
|
|||
|
show_json(LNG('explorer.success'));
|
|||
|
}
|
|||
|
|
|||
|
public function taskList(){ActionCall('admin.task.taskList',USER_ID);}
|
|||
|
public function taskKillAll(){ActionCall('admin.task.taskKillAll',USER_ID);}
|
|||
|
public function taskAction(){
|
|||
|
$result = ActionCall('admin.task.taskActionRun',false);
|
|||
|
if( !is_array($result['taskInfo'])){show_json(LNG('common.notExists'),false,'taskEmpty');}
|
|||
|
if( $result['taskInfo']['userID'] != USER_ID){show_json('User error',false);}
|
|||
|
show_json($result['result'],true);
|
|||
|
}
|
|||
|
public function notice(){
|
|||
|
$data = Input::getArray(array(
|
|||
|
'id' => array('default' => false),
|
|||
|
'action' => array('check' => 'in','param' => array('get','edit','remove')),
|
|||
|
));
|
|||
|
$action = 'admin.notice.notice' . ucfirst($data['action']);
|
|||
|
ActionCall($action, $data['id']);
|
|||
|
}
|
|||
|
}
|