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

489 lines
15KB

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