国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

568 lines
17KB

  1. <?php if(!defined('DEDEINC')) exit('Request Error!');
  2. /**
  3. * 会员登录类
  4. *
  5. * @version $Id: userlogin.class.php 1 15:59 2010年7月5日Z tianya $
  6. * @package DedeCMS.Libraries
  7. * @copyright Copyright (c) 2007 - 2018, DesDev, Inc.
  8. * @copyright Copyright (c) 2020, DedeBIZ.COM
  9. * @license https://www.dedebiz.com/license/v6
  10. * @link https://www.dedebiz.com
  11. */
  12. // 使用缓存助手
  13. helper('cache');
  14. /**
  15. * 检查用户名的合法性
  16. *
  17. * @access public
  18. * @param string $uid 用户UID
  19. * @param string $msgtitle 提示标题
  20. * @param string $ckhas 检查是否存在
  21. * @return string
  22. */
  23. function CheckUserID($uid, $msgtitle='用户名', $ckhas=TRUE)
  24. {
  25. global $cfg_mb_notallow,$cfg_mb_idmin,$cfg_md_idurl,$cfg_soft_lang,$dsql;
  26. if($cfg_mb_notallow != '')
  27. {
  28. $nas = explode(',', $cfg_mb_notallow);
  29. if(in_array($uid, $nas))
  30. {
  31. return $msgtitle.'为系统禁止的标识!';
  32. }
  33. }
  34. if($cfg_md_idurl=='Y' && preg_match("/[^a-z0-9]/i",$uid))
  35. {
  36. return $msgtitle.'必须由英文字母或数字组成!';
  37. }
  38. if($cfg_soft_lang=='utf-8')
  39. {
  40. $ck_uid = utf82gb($uid);
  41. }
  42. else
  43. {
  44. $ck_uid = $uid;
  45. }
  46. for($i=0; isset($ck_uid[$i]); $i++)
  47. {
  48. if(ord($ck_uid[$i]) > 0x80)
  49. {
  50. if(isset($ck_uid[$i+1]) && ord($ck_uid[$i+1])>0x40)
  51. {
  52. $i++;
  53. }
  54. else
  55. {
  56. return $msgtitle.'可能含有乱码,建议你改用英文字母和数字组合!';
  57. }
  58. }
  59. else
  60. {
  61. if(preg_match("/[^0-9a-z@\.-]/i",$ck_uid[$i]))
  62. {
  63. return $msgtitle.'不能含有 [@]、[.]、[-]以外的特殊符号!';
  64. }
  65. }
  66. }
  67. if($ckhas)
  68. {
  69. $row = $dsql->GetOne("SELECT * FROM `#@__member` WHERE userid LIKE '$uid' ");
  70. if(is_array($row)) return $msgtitle."已经存在!";
  71. }
  72. return 'ok';
  73. }
  74. /**
  75. * 保存一则消息记录
  76. *
  77. * @access public
  78. * @param string $mid 用户MID
  79. * @param string $mid 用户ID
  80. * @param string $msg 保存消息
  81. * @return string
  82. */
  83. function PutSnsMsg($mid, $userid, $msg)
  84. {
  85. global $dsql;
  86. $msg = addslashes($msg);
  87. $query = "INSERT INTO `#@__member_snsmsg`(`mid`, `userid`, `sendtime`, `msg`) VALUES('$mid', '$userid', '".time()."', '$msg'); ";
  88. $rs = $dsql->ExecuteNoneQuery($query);
  89. return $rs;
  90. }
  91. /**
  92. * 检查用户是否被禁言
  93. *
  94. * @return void
  95. */
  96. function CheckNotAllow()
  97. {
  98. global $dsql, $cfg_ml, $cfg_mb_spacesta;
  99. if(empty($cfg_ml->M_ID)) return ;
  100. if($cfg_ml->M_Spacesta == -2)
  101. {
  102. ShowMsg("你已经被禁言,请与管理员联系!", "-1");
  103. exit();
  104. }else if($cfg_ml->M_Spacesta == -10)
  105. {
  106. ShowMsg("系统开启了邮件审核机制,因此你的帐号需要审核后才能发信息!", "-1");
  107. exit();
  108. }
  109. else if($cfg_ml->M_Spacesta < 0)
  110. {
  111. ShowMsg('系统开启了审核机制,因此你的帐号需要管理员审核后才能发信息!', '-1');
  112. exit();
  113. }
  114. }
  115. function FormatUsername($username)
  116. {
  117. $username = str_replace("`","‘",$username);
  118. $username = str_replace("'","‘",$username);
  119. $username = str_replace("\"","“",$username);
  120. $username = str_replace(",",",",$username);
  121. $username = str_replace("(","(",$username);
  122. $username = str_replace(")",")",$username);
  123. return addslashes($username);
  124. }
  125. /**
  126. * 网站会员登录类
  127. *
  128. * @package MemberLogin
  129. * @subpackage DedeCMS.Libraries
  130. * @link http://www.dedecms.com
  131. */
  132. class MemberLogin
  133. {
  134. var $M_ID;
  135. var $M_LoginID;
  136. var $M_MbType;
  137. var $M_Money;
  138. var $M_Scores;
  139. var $M_UserName;
  140. var $M_Rank;
  141. var $M_Face;
  142. var $M_LoginTime;
  143. var $M_KeepTime;
  144. var $M_Spacesta;
  145. var $fields;
  146. var $isAdmin;
  147. var $M_UpTime;
  148. var $M_ExpTime;
  149. var $M_HasDay;
  150. var $M_JoinTime;
  151. var $M_Honor = '';
  152. var $memberCache='memberlogin';
  153. //php5构造函数
  154. function __construct($kptime = -1, $cache=FALSE)
  155. {
  156. global $dsql;
  157. if($kptime==-1){
  158. $this->M_KeepTime = 3600 * 24 * 7;
  159. }else{
  160. $this->M_KeepTime = $kptime;
  161. }
  162. $formcache = FALSE;
  163. $this->M_ID = $this->GetNum(GetCookie("DedeUserID"));
  164. $this->M_LoginTime = GetCookie("DedeLoginTime");
  165. $this->fields = array();
  166. $this->isAdmin = FALSE;
  167. if(empty($this->M_ID))
  168. {
  169. $this->ResetUser();
  170. }else{
  171. $this->M_ID = intval($this->M_ID);
  172. if ($cache)
  173. {
  174. $this->fields = GetCache($this->memberCache, $this->M_ID);
  175. if( empty($this->fields) )
  176. {
  177. $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' ");
  178. } else {
  179. $formcache = TRUE;
  180. }
  181. } else {
  182. $this->fields = $dsql->GetOne("Select * From `#@__member` where mid='{$this->M_ID}' ");
  183. }
  184. if(is_array($this->fields)){
  185. #api{{
  186. if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php')
  187. {
  188. if($data = uc_get_user($this->fields['userid']))
  189. {
  190. if(uc_check_avatar($data[0]) && !strstr($this->fields['face'],UC_API))
  191. {
  192. $this->fields['face'] = UC_API.'/avatar.php?uid='.$data[0].'&size=middle';
  193. $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET `face`='".$this->fields['face']."' WHERE `mid`='{$this->M_ID}'");
  194. }
  195. }
  196. }
  197. #/aip}}
  198. //间隔一小时更新一次用户登录时间
  199. if(time() - $this->M_LoginTime > 3600)
  200. {
  201. $dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';");
  202. PutCookie("DedeLoginTime",time(),$this->M_KeepTime);
  203. }
  204. $this->M_LoginID = $this->fields['userid'];
  205. $this->M_MbType = $this->fields['mtype'];
  206. $this->M_Money = $this->fields['money'];
  207. $this->M_UserName = FormatUsername($this->fields['uname']);
  208. $this->M_Scores = $this->fields['scores'];
  209. $this->M_Face = $this->fields['face'];
  210. $this->M_Rank = $this->fields['rank'];
  211. $this->M_Spacesta = $this->fields['spacesta'];
  212. $sql = "Select titles From #@__scores where integral<={$this->fields['scores']} order by integral desc";
  213. $scrow = $dsql->GetOne($sql);
  214. $this->fields['honor'] = $scrow['titles'];
  215. $this->M_Honor = $this->fields['honor'];
  216. if($this->fields['matt']==10) $this->isAdmin = TRUE;
  217. $this->M_UpTime = $this->fields['uptime'];
  218. $this->M_ExpTime = $this->fields['exptime'];
  219. $this->M_JoinTime = MyDate('Y-m-d',$this->fields['jointime']);
  220. if($this->M_Rank>10 && $this->M_UpTime>0){
  221. $this->M_HasDay = $this->Judgemember();
  222. }
  223. if( !$formcache )
  224. {
  225. SetCache($this->memberCache, $this->M_ID, $this->fields, 1800);
  226. }
  227. }else{
  228. $this->ResetUser();
  229. }
  230. }
  231. }
  232. function MemberLogin($kptime = -1)
  233. {
  234. $this->__construct($kptime);
  235. }
  236. /**
  237. * 删除缓存,每次登录时和在修改用户资料的地方会清除
  238. *
  239. * @access public
  240. * @param string
  241. * @return string
  242. */
  243. function DelCache($mid)
  244. {
  245. DelCache($this->memberCache, $mid);
  246. }
  247. /**
  248. * 判断会员是否到期
  249. *
  250. * @return string
  251. */
  252. function Judgemember()
  253. {
  254. global $dsql,$cfg_mb_rank;
  255. $nowtime = time();
  256. $mhasDay = $this->M_ExpTime - ceil(($nowtime - $this->M_UpTime)/3600/24) + 1;
  257. if($mhasDay <= 0){
  258. $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET uptime='0',exptime='0',
  259. rank='$cfg_mb_rank' WHERE mid='".$this->fields['mid']."';");
  260. }
  261. return $mhasDay;
  262. }
  263. /**
  264. * 退出cookie的会话
  265. *
  266. * @return void
  267. */
  268. function ExitCookie()
  269. {
  270. $this->ResetUser();
  271. }
  272. /**
  273. * 验证用户是否已经登录
  274. *
  275. * @return bool
  276. */
  277. function IsLogin()
  278. {
  279. if($this->M_ID > 0) return TRUE;
  280. else return FALSE;
  281. }
  282. /**
  283. * 检测用户上传空间
  284. *
  285. * @return int
  286. */
  287. function GetUserSpace()
  288. {
  289. global $dsql;
  290. $uid = $this->M_ID;
  291. $row = $dsql->GetOne("SELECT sum(filesize) AS fs FROM `#@__uploads` WHERE mid='$uid'; ");
  292. return $row['fs'];
  293. }
  294. /**
  295. * 检查用户空间信息
  296. *
  297. * @return void
  298. */
  299. function CheckUserSpace()
  300. {
  301. global $cfg_mb_max;
  302. $uid = $this->M_ID;
  303. $hasuse = $this->GetUserSpace();
  304. $maxSize = $cfg_mb_max * 1024 * 1024;
  305. if($hasuse >= $maxSize)
  306. {
  307. ShowMsg('你的空间已满,不允许上传新文件!','-1');
  308. exit();
  309. }
  310. }
  311. /**
  312. * 更新用户信息统计表
  313. *
  314. * @access public
  315. * @param string $field 字段信息
  316. * @param string $uptype 更新类型
  317. * @return string
  318. */
  319. function UpdateUserTj($field, $uptype='add')
  320. {
  321. global $dsql;
  322. $mid = $this->M_ID;
  323. $arr = $dsql->GetOne("Select * `#@__member_tj` where mid='$mid' ");
  324. if(!is_array($arr))
  325. {
  326. $arr = array('article'=>0,'album'=>0,'archives'=>0,'homecount'=>0,'pagecount'=>0,'feedback'=>0,'friend'=>0,'stow'=>0);
  327. }
  328. extract($arr);
  329. if(isset($$field))
  330. {
  331. if($uptype=='add')
  332. {
  333. $$field++;
  334. }
  335. else if($$field > 0)
  336. {
  337. $$field--;
  338. }
  339. }
  340. $inquery = "INSERT INTO `#@__member_tj` (`mid`,`article`,`album`,`archives`,`homecount`,`pagecount`,`feedback`,`friend`,`stow`)
  341. VALUES ('$mid','$article','$album','$archives','$homecount','$pagecount','$feedback','$friend','$stow'); ";
  342. $dsql->ExecuteNoneQuery("Delete From `#@__member_tj` where mid='$mid' ");
  343. $dsql->ExecuteNoneQuery($inquery);
  344. }
  345. //
  346. /**
  347. * 重置用户信息
  348. *
  349. * @return void
  350. */
  351. function ResetUser()
  352. {
  353. $this->fields = '';
  354. $this->M_ID = 0;
  355. $this->M_LoginID = '';
  356. $this->M_Rank = 0;
  357. $this->M_Face = "";
  358. $this->M_Money = 0;
  359. $this->M_UserName = "";
  360. $this->M_LoginTime = 0;
  361. $this->M_MbType = '';
  362. $this->M_Scores = 0;
  363. $this->M_Spacesta = -2;
  364. $this->M_UpTime = 0;
  365. $this->M_ExpTime = 0;
  366. $this->M_JoinTime = 0;
  367. $this->M_HasDay = 0;
  368. DropCookie('DedeUserID');
  369. DropCookie('DedeLoginTime');
  370. }
  371. /**
  372. * 获取整数值
  373. *
  374. * @access public
  375. * @param string $fnum 处理的数值
  376. * @return string
  377. */
  378. function GetNum($fnum){
  379. $fnum = preg_replace("/[^0-9\.]/", '', $fnum);
  380. return $fnum;
  381. }
  382. /**
  383. * 用户登录
  384. * 把登录密码转为指定长度md5数据
  385. *
  386. * @access public
  387. * @param string $pwd 需要加密的密码
  388. * @return string
  389. */
  390. function GetEncodePwd($pwd)
  391. {
  392. global $cfg_mb_pwdtype;
  393. if(empty($cfg_mb_pwdtype)) $cfg_mb_pwdtype = '32';
  394. switch($cfg_mb_pwdtype)
  395. {
  396. case 'l16':
  397. return substr(md5($pwd), 0, 16);
  398. case 'r16':
  399. return substr(md5($pwd), 16, 16);
  400. case 'm16':
  401. return substr(md5($pwd), 8, 16);
  402. default:
  403. return md5($pwd);
  404. }
  405. }
  406. /**
  407. * 把数据库密码转为特定长度
  408. * 如果数据库密码是明文的,本程序不支持
  409. *
  410. * @access public
  411. * @param string
  412. * @return string
  413. */
  414. function GetShortPwd($dbpwd)
  415. {
  416. global $cfg_mb_pwdtype;
  417. if(empty($cfg_mb_pwdtype)) $cfg_mb_pwdtype = '32';
  418. $dbpwd = trim($dbpwd);
  419. if(strlen($dbpwd)==16)
  420. {
  421. return $dbpwd;
  422. }
  423. else
  424. {
  425. switch($cfg_mb_pwdtype)
  426. {
  427. case 'l16':
  428. return substr($dbpwd, 0, 16);
  429. case 'r16':
  430. return substr($dbpwd, 16, 16);
  431. case 'm16':
  432. return substr($dbpwd, 8, 16);
  433. default:
  434. return $dbpwd;
  435. }
  436. }
  437. }
  438. /**
  439. * 检查用户是否合法
  440. *
  441. * @access public
  442. * @param string $loginuser 登录用户名
  443. * @param string $loginpwd 用户密码
  444. * @return string
  445. */
  446. function CheckUser(&$loginuser, $loginpwd)
  447. {
  448. global $dsql;
  449. //检测用户名的合法性
  450. $rs = CheckUserID($loginuser,'用户名',FALSE);
  451. //用户名不正确时返回验证错误,原登录名通过引用返回错误提示信息
  452. if($rs!='ok')
  453. {
  454. $loginuser = $rs;
  455. return '0';
  456. }
  457. //matt=10 是管理员关连的前台帐号,为了安全起见,这个帐号只能从后台登录,不能直接从前台登录
  458. $row = $dsql->GetOne("SELECT mid,matt,pwd,logintime FROM `#@__member` WHERE userid LIKE '$loginuser' ");
  459. if(is_array($row))
  460. {
  461. if($this->GetShortPwd($row['pwd']) != $this->GetEncodePwd($loginpwd))
  462. {
  463. return -1;
  464. }
  465. else
  466. {
  467. //管理员帐号不允许从前台登录
  468. if($row['matt']==10) {
  469. return -2;
  470. }
  471. else {
  472. $this->PutLoginInfo($row['mid'], $row['logintime']);
  473. return 1;
  474. }
  475. }
  476. }
  477. else
  478. {
  479. return 0;
  480. }
  481. }
  482. /**
  483. * 保存用户cookie
  484. *
  485. * @access public
  486. * @param string $uid 用户ID
  487. * @param string $logintime 登录限制时间
  488. * @return void
  489. */
  490. function PutLoginInfo($uid, $logintime=0)
  491. {
  492. global $cfg_login_adds, $dsql;
  493. //登录增加积分(上一次登录时间必须大于两小时)
  494. if(time() - $logintime > 7200 && $cfg_login_adds > 0)
  495. {
  496. $dsql->ExecuteNoneQuery("Update `#@__member` set `scores`=`scores`+{$cfg_login_adds} where mid='$uid' ");
  497. }
  498. $this->M_ID = $uid;
  499. $this->M_LoginTime = time();
  500. $loginip = GetIP();
  501. $inquery = "UPDATE `#@__member` SET loginip='$loginip',logintime='".$this->M_LoginTime."' WHERE mid='".$uid."'";
  502. $dsql->ExecuteNoneQuery($inquery);
  503. if($this->M_KeepTime > 0)
  504. {
  505. PutCookie('DedeUserID',$uid,$this->M_KeepTime);
  506. PutCookie('DedeLoginTime',$this->M_LoginTime,$this->M_KeepTime);
  507. }
  508. else
  509. {
  510. PutCookie('DedeUserID',$uid);
  511. PutCookie('DedeLoginTime',$this->M_LoginTime);
  512. }
  513. }
  514. /**
  515. * 获得会员目前的状态
  516. *
  517. * @access public
  518. * @param string $dsql 数据库连接
  519. * @return string
  520. */
  521. function GetSta($dsql)
  522. {
  523. $sta = '';
  524. if($this->M_Rank==0)
  525. {
  526. $sta .= "你目前的身份是:普通会员";
  527. }else{
  528. $row = $dsql->GetOne("Select membername From `#@__arcrank` where rank='".$this->M_Rank."'");
  529. $sta .= "你目前的身份是:".$row['membername'];
  530. $rs = $dsql->GetOne("Select id From `#@__admin` where userid='".$this->M_LoginID."'");
  531. if(!is_array($rs)){
  532. if($this->M_Rank>10 && $this->M_HasDay>0) $sta .= " 剩余天数: <font color='red'>".$this->M_HasDay."</font> 天 ";
  533. elseif($this->M_Rank>10) $sta .= " <font color='red'>会员升级已经到期</font> ";
  534. }
  535. }
  536. $sta .= " 拥有金币:{$this->M_Money} 个, 积分:{$this->M_Scores} 分。";
  537. return $sta;
  538. }
  539. }//End Class