国内流行的内容管理系统(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.

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