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

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