OSDN Git Service

パーミッション変更シミュレーションのjavascript変更
[nucleus-jp/nucleus-jp-ancient.git] / nucleus / libs / MEMBER.php
1 <?php
2
3 /*
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
5  * Copyright (C) 2002-2009 The Nucleus Group
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * (see nucleus/documentation/index.html#license for more info)
12  */
13 /**
14  * A class representing site members
15  *
16  * @license http://nucleuscms.org/license.txt GNU General Public License
17  * @copyright Copyright (C) 2002-2009 The Nucleus Group
18  * @version $Id$
19  * $NucleusJP: MEMBER.php,v 1.6 2006/07/17 20:03:44 kimitake Exp $
20  */
21 class MEMBER {\r
22 \r
23         // 1 when authenticated, 0 when not\r
24         var $loggedin = 0;\r
25         var $password;          // not the actual password, but rather a MD5 hash\r
26 \r
27         var $cookiekey;         // value that should also be in the client cookie to allow authentication\r
28 \r
29         // member info\r
30         var $id = -1;\r
31         var $realname;\r
32         var $displayname;\r
33         var $email;\r
34         var $url;\r
35         var $language = '';             // name of the language file to use (e.g. 'english' -> english.php)\r
36         var $admin = 0;                 // (either 0 or 1)\r
37         var $canlogin = 0;              // (either 0 or 1)\r
38         var $notes;\r
39         var $autosave = 1;              // if the member use the autosave draft function\r
40 \r
41         /**\r
42          * Constructor for a member object\r
43          */             \r
44         function MEMBER() {\r
45                 // do nothing\r
46         }\r
47 \r
48         /**\r
49          * Create a member object for a given displayname\r
50          *\r
51          * @static\r
52          */\r
53         function &createFromName($displayname) {\r
54                 $mem =& new MEMBER();\r
55                 $mem->readFromName($displayname);\r
56                 return $mem;\r
57         }\r
58 \r
59         /**\r
60          * Create a member object for a given ID\r
61          *\r
62          * @static\r
63          */\r
64         function &createFromID($id) {\r
65                 $mem =& new MEMBER();\r
66                 $mem->readFromID($id);\r
67                 return $mem;\r
68         }\r
69 \r
70         function readFromName($displayname) {\r
71                 return $this->read("mname='".addslashes($displayname)."'");\r
72         }\r
73 \r
74         function readFromID($id) {\r
75                 return $this->read("mnumber=" . intval($id));\r
76         }\r
77 \r
78         /**\r
79           * Tries to login as a given user.\r
80           * Returns true when succeeded, returns false when failed\r
81           * 3.40 adds CustomLogin event\r
82           */\r
83         function login($login, $password) {\r
84                 global $manager;\r
85                 $this->loggedin = 0;\r
86                 $success = 0;\r
87                 $allowlocal = 1;\r
88                 $manager->notify('CustomLogin', array('login' => &$login, 'password'=>&$password, 'success'=>&$success, 'allowlocal'=>&$allowlocal) );\r
89                 if ($success && $this->readFromName($login)) {\r
90                         $this->loggedin = 1;\r
91                         return $this->isLoggedIn();\r
92                 } elseif (!$success && $allowlocal) {\r
93                         if (!$this->readFromName($login))\r
94                                 return 0;\r
95                         if (!$this->checkPassword($password))\r
96                                 return 0;\r
97                         $this->loggedin = 1;\r
98                         return $this->isLoggedIn();\r
99                 } else {\r
100                         return 0;\r
101                 }\r
102         }\r
103 \r
104         /**\r
105          * Login using cookie key\r
106          */             \r
107         function cookielogin($login, $cookiekey) {\r
108                 $this->loggedin = 0;\r
109                 if (!$this->readFromName($login))\r
110                         return 0;\r
111                 if (!$this->checkCookieKey($cookiekey))\r
112                         return 0;\r
113                 $this->loggedin = 1;\r
114                 return $this->isLoggedIn();\r
115         }\r
116 \r
117         function logout() {\r
118                 $this->loggedin=0;\r
119         }\r
120 \r
121         function isLoggedIn() {\r
122                 return $this->loggedin;\r
123         }\r
124 \r
125         /**\r
126          * Read member information from the database \r
127          */             \r
128         function read($where) {\r
129                 // read info\r
130                 $query =  'SELECT * FROM '.sql_table('member') . ' WHERE ' . $where;\r
131 \r
132                 $res = sql_query($query);\r
133                 $obj = mysql_fetch_object($res);\r
134 \r
135                 $this->setRealName($obj->mrealname);\r
136                 $this->setEmail($obj->memail);\r
137                 $this->password = $obj->mpassword;\r
138                 $this->setCookieKey($obj->mcookiekey);\r
139                 $this->setURL($obj->murl);\r
140                 $this->setDisplayName($obj->mname);\r
141                 $this->setAdmin($obj->madmin);\r
142                 $this->id = $obj->mnumber;\r
143                 $this->setCanLogin($obj->mcanlogin);\r
144                 $this->setNotes($obj->mnotes);\r
145                 $this->setLanguage($obj->deflang);\r
146                 $this->setAutosave($obj->mautosave);\r
147 \r
148                 return mysql_num_rows($res);\r
149         }\r
150 \r
151 \r
152         /**\r
153           * Returns true if member is an admin for the given blog\r
154           * (returns false if not a team member)\r
155           */\r
156         function isBlogAdmin($blogid) {\r
157                 $query = 'SELECT tadmin FROM '.sql_table('team').' WHERE'\r
158                            . ' tblog=' . intval($blogid)\r
159                            . ' and tmember='. $this->getID();\r
160                 $res = sql_query($query);\r
161                 if (mysql_num_rows($res) == 0)\r
162                         return 0;\r
163                 else\r
164                         return (mysql_result($res,0,0) == 1) ;\r
165         }\r
166 \r
167         function blogAdminRights($blogid) {\r
168                 return ($this->isAdmin() || $this->isBlogAdmin($blogid));\r
169         }\r
170 \r
171 \r
172         function teamRights($blogid) {\r
173                 return ($this->isAdmin() || $this->isTeamMember($blogid));\r
174         }\r
175 \r
176         /**\r
177           * Returns true if this member is a team member of the given blog\r
178           */\r
179         function isTeamMember($blogid) {\r
180                 $query = 'SELECT * FROM '.sql_table('team').' WHERE'\r
181                            . ' tblog=' . intval($blogid)\r
182                            . ' and tmember='. $this->getID();\r
183                 $res = sql_query($query);\r
184                 return (mysql_num_rows($res) != 0);\r
185         }\r
186 \r
187         function canAddItem($catid) {\r
188                 global $manager;\r
189 \r
190                 // if this is a 'newcat' style newcat\r
191                 // no blog admin of destination blog -> NOK\r
192                 // blog admin of destination blog -> OK\r
193                 if (strstr($catid,'newcat')) {\r
194                         // get blogid\r
195                         list($blogid) = sscanf($catid,"newcat-%d");\r
196                         return $this->blogAdminRights($blogid);\r
197                 }\r
198 \r
199                 // category does not exist -> NOK\r
200                 if (!$manager->existsCategory($catid)) return 0;\r
201 \r
202                 $blogid = getBlogIDFromCatID($catid);\r
203 \r
204                 // no team rights for blog -> NOK\r
205                 if (!$this->teamRights($blogid)) return 0;\r
206 \r
207                 // all other cases: OK\r
208                 return 1;\r
209         }\r
210 \r
211         /**\r
212           * Returns true if this member can edit/delete a commentitem. This can be in the\r
213           * following cases:\r
214           *       - member is a super-admin\r
215           *   - member is the author of the comment\r
216           *   - member is admin of the blog associated with the comment\r
217           *   - member is author of the item associated with the comment\r
218           */\r
219         function canAlterComment($commentid) {\r
220                 if ($this->isAdmin()) return 1;\r
221 \r
222                 $query =  'SELECT citem as itemid, iblog as blogid, cmember as cauthor, iauthor'\r
223                            . ' FROM '.sql_table('comment') .', '.sql_table('item').', '.sql_table('blog')\r
224                            . ' WHERE citem=inumber and iblog=bnumber and cnumber=' . intval($commentid);\r
225                 $res = sql_query($query);\r
226                 $obj = mysql_fetch_object($res);\r
227 \r
228                 return ($obj->cauthor == $this->getID()) or $this->isBlogAdmin($obj->blogid) or ($obj->iauthor == $this->getID());\r
229         }\r
230 \r
231         /**\r
232           * Returns true if this member can edit/delete an item. This is true in the following\r
233           * cases: - member is a super-admin\r
234           *            - member is the author of the item\r
235           *        - member is admin of the the associated blog\r
236           */\r
237         function canAlterItem($itemid) {\r
238                 if ($this->isAdmin()) return 1;\r
239 \r
240                 $query =  'SELECT iblog, iauthor FROM '.sql_table('item').' WHERE inumber=' . intval($itemid);\r
241                 $res = sql_query($query);\r
242                 $obj = mysql_fetch_object($res);\r
243                 return ($obj->iauthor == $this->getID()) or $this->isBlogAdmin($obj->iblog);\r
244         }\r
245 \r
246         /**\r
247           * Return true if member can be deleted. This means that there are no items\r
248           * posted by the member left\r
249           */\r
250         function canBeDeleted() {\r
251                 $res = sql_query('SELECT * FROM '.sql_table('item').' WHERE iauthor=' . $this->getID());\r
252                 return (mysql_num_rows($res) == 0);\r
253         }\r
254 \r
255         /**\r
256           * returns true if this member can move/update an item to a given category,\r
257           * false if not (see comments fot the tests that are executed)\r
258           *\r
259           * @param itemid\r
260           * @param newcat (can also be of form 'newcat-x' with x=blogid)\r
261           */\r
262         function canUpdateItem($itemid, $newcat) {\r
263                 global $manager;\r
264 \r
265                 // item does not exists -> NOK\r
266                 if (!$manager->existsItem($itemid,1,1)) return 0;\r
267 \r
268                 // cannot alter item -> NOK\r
269                 if (!$this->canAlterItem($itemid)) return 0;\r
270 \r
271                 // if this is a 'newcat' style newcat\r
272                 // no blog admin of destination blog -> NOK\r
273                 // blog admin of destination blog -> OK\r
274                 if (strstr($newcat,'newcat')) {\r
275                         // get blogid\r
276                         list($blogid) = sscanf($newcat,'newcat-%d');\r
277                         return $this->blogAdminRights($blogid);\r
278                 }\r
279 \r
280                 // category does not exist -> NOK\r
281                 if (!$manager->existsCategory($newcat)) return 0;\r
282 \r
283 \r
284                 // get item\r
285                 $item =& $manager->getItem($itemid,1,1);\r
286 \r
287                 // old catid = new catid -> OK\r
288                 if ($item['catid'] == $newcat) return 1;\r
289 \r
290                 // not a valid category -> NOK\r
291                 $validCat = quickQuery('SELECT COUNT(*) AS result FROM '.sql_table('category').' WHERE catid='.intval($newcat));\r
292                 if (!$validCat) return 0;\r
293 \r
294                 // get destination blog\r
295                 $source_blogid = getBlogIDFromItemID($itemid);\r
296                 $dest_blogid = getBlogIDFromCatID($newcat);\r
297 \r
298                 // not a team member of destination blog -> NOK\r
299                 if (!$this->teamRights($dest_blogid)) return 0;\r
300 \r
301                 // if member is author of item -> OK\r
302                 if ($item['authorid'] == $this->getID()) return 1;\r
303 \r
304                 // if member has admin rights on both blogs: OK\r
305                 if (($this->blogAdminRights($dest_blogid)) && ($this->blogAdminRights($source_blogid))) return 1;\r
306 \r
307                 // all other cases: NOK\r
308                 return 0;\r
309 \r
310         }\r
311 \r
312         /**\r
313           * Sets the cookies for the member\r
314           *\r
315           * @param shared\r
316           *             set this to 1 when using a shared computer. Cookies will expire\r
317           *             at the end of the session in this case.\r
318           */\r
319         function setCookies($shared = 0) {\r
320                 global $CONF;\r
321 \r
322                 if ($CONF['SessionCookie'] || $shared)\r
323                         $lifetime = 0;\r
324                 else\r
325                         $lifetime = (time()+2592000);\r
326 \r
327                 setcookie($CONF['CookiePrefix'] .'user',$this->getDisplayName(),$lifetime,$CONF['CookiePath'],$CONF['CookieDomain'],$CONF['CookieSecure']);\r
328                 setcookie($CONF['CookiePrefix'] .'loginkey', $this->getCookieKey(),$lifetime,$CONF['CookiePath'],$CONF['CookieDomain'],$CONF['CookieSecure']);\r
329 \r
330                 // make sure cookies on shared pcs don't get renewed\r
331                 if ($shared)\r
332                         setcookie($CONF['CookiePrefix'] .'sharedpc', '1',$lifetime,$CONF['CookiePath'],$CONF['CookieDomain'],$CONF['CookieSecure']);\r
333         }\r
334 \r
335         function sendActivationLink($type, $extra='')\r
336         {\r
337                 global $CONF;\r
338 \r
339                 // generate key and URL\r
340                 $key = $this->generateActivationEntry($type, $extra);\r
341                 $url = $CONF['AdminURL'] . 'index.php?action=activate&key=' . $key;\r
342 \r
343                 // choose text to use in mail\r
344                 switch ($type)\r
345                 {\r
346                         case 'register':\r
347                                 $message = _ACTIVATE_REGISTER_MAIL;\r
348                                 $title = _ACTIVATE_REGISTER_MAILTITLE;\r
349                                 break;\r
350                         case 'forgot':\r
351                                 $message = _ACTIVATE_FORGOT_MAIL;\r
352                                 $title = _ACTIVATE_FORGOT_MAILTITLE;\r
353                                 break;\r
354                         case 'addresschange':\r
355                                 $message = _ACTIVATE_CHANGE_MAIL;\r
356                                 $title = _ACTIVATE_CHANGE_MAILTITLE;\r
357                                 break;\r
358                         default;\r
359                 }\r
360 \r
361                 // fill out variables in text\r
362 \r
363                 $aVars = array(\r
364                         'siteName' => $CONF['SiteName'],\r
365                         'siteUrl' => $CONF['IndexURL'],\r
366                         'memberName' => $this->getDisplayName(),\r
367                         'activationUrl' => $url\r
368                 );\r
369 \r
370                 $message = TEMPLATE::fill($message, $aVars);\r
371                 $title = TEMPLATE::fill($title, $aVars);\r
372 \r
373                 // send mail\r
374 \r
375                 mb_language('ja');\r
376                 mb_internal_encoding(_CHARSET);\r
377                 @mb_send_mail($this->getEmail(), $title ,$message,'From: ' . $CONF['AdminEmail']);\r
378 \r
379                 ACTIONLOG::add(INFO, _ACTIONLOG_ACTIVATIONLINK . ' (' . $this->getDisplayName() . ' / type: ' . $type . ')');\r
380 \r
381 \r
382         }\r
383 \r
384         /**\r
385           * Returns an array of all blogids for which member has admin rights\r
386           */\r
387         function getAdminBlogs() {\r
388                 $blogs = array();\r
389 \r
390                 if ($this->isAdmin())\r
391                         $query = 'SELECT bnumber as blogid from '.sql_table('blog');\r
392                 else\r
393                         $query = 'SELECT tblog as blogid from '.sql_table('team').' where tadmin=1 and tmember=' . $this->getID();\r
394 \r
395                 $res = sql_query($query);\r
396                 if (mysql_num_rows($res) > 0) {\r
397                         while ($obj = mysql_fetch_object($res)) {\r
398                                 array_push($blogs, $obj->blogid);\r
399                         }\r
400                 }\r
401 \r
402                 return $blogs;\r
403         }\r
404 \r
405         /**\r
406           * Returns an email address from which notification of commenting/karma voting can\r
407           * be sent. A suggestion can be given for when the member is not logged in\r
408           */\r
409         function getNotifyFromMailAddress($suggest = "") {\r
410                 global $CONF;\r
411                 if ($this->isLoggedIn()) {\r
412                         return $this->getDisplayName() . " <" . $this->getEmail() . ">";\r
413                 } else if (isValidMailAddress($suggest)) {\r
414                         return $suggest;\r
415                 } else {\r
416                         return $CONF['AdminEmail'];\r
417                 }\r
418         }\r
419 \r
420         /**\r
421           * Write data to database\r
422           */\r
423         function write() {\r
424 \r
425                 $query =  'UPDATE '.sql_table('member')\r
426                            . " SET mname='" . addslashes($this->getDisplayName()) . "',"\r
427                            . "     mrealname='". addslashes($this->getRealName()) . "',"\r
428                            . "     mpassword='". addslashes($this->getPassword()) . "',"\r
429                            . "     mcookiekey='". addslashes($this->getCookieKey()) . "',"\r
430                            . "     murl='" . addslashes($this->getURL()) . "',"\r
431                            . "     memail='" . addslashes($this->getEmail()) . "',"\r
432                            . "     madmin=" . $this->isAdmin() . ","\r
433                            . "     mnotes='" . addslashes($this->getNotes()) . "',"\r
434                            . "     mcanlogin=" . $this->canLogin() . ","\r
435                            . "     deflang='" . addslashes($this->getLanguage()) . "',"\r
436                            . "     mautosave=" . addslashes($this->getAutosave()) . ""\r
437                            . " WHERE mnumber=" . $this->getID();\r
438                 sql_query($query);\r
439         }\r
440 \r
441         function checkCookieKey($key) {\r
442                 return (($key != '') && ($key == $this->getCookieKey()));\r
443         }\r
444 \r
445         function checkPassword($pw) {\r
446                 return (md5($pw) == $this->getPassword());\r
447         }\r
448 \r
449         function getRealName() {\r
450                 return $this->realname;\r
451         }\r
452 \r
453         function setRealName($name) {\r
454                 $this->realname = $name;\r
455         }\r
456 \r
457         function getEmail() {\r
458                 return $this->email;\r
459         }\r
460 \r
461         function setEmail($email) {\r
462                 $this->email = $email;\r
463         }\r
464 \r
465         function getPassword() {\r
466                 return $this->password;\r
467         }\r
468 \r
469         function setPassword($pwd) {\r
470                 $this->password = md5($pwd);\r
471         }\r
472 \r
473         function getCookieKey() {\r
474                 return $this->cookiekey;\r
475         }\r
476 \r
477         /**\r
478           * Generate new cookiekey, save it, and return it\r
479           */\r
480         function newCookieKey() {\r
481                 mt_srand( (double) microtime() * 1000000);\r
482                 $this->cookiekey = md5(uniqid(mt_rand()));\r
483                 $this->write();\r
484                 return $this->cookiekey;\r
485         }\r
486 \r
487         function setCookieKey($val) {\r
488                 $this->cookiekey = $val;\r
489         }\r
490 \r
491         function getURL() {\r
492                 return $this->url;\r
493         }\r
494 \r
495         function setURL($site) {\r
496                 $this->url = $site;\r
497         }\r
498 \r
499         function getLanguage() {\r
500                 return $this->language;\r
501         }\r
502 \r
503         function setLanguage($lang) {\r
504                 $this->language = $lang;\r
505         }\r
506 \r
507         function setDisplayName($nick) {\r
508                 $this->displayname = $nick;\r
509         }\r
510 \r
511         function getDisplayName() {\r
512                 return $this->displayname;\r
513         }\r
514 \r
515         function isAdmin() {\r
516                 return $this->admin;\r
517         }\r
518 \r
519         function setAdmin($val) {\r
520                 $this->admin = $val;\r
521         }\r
522 \r
523         function canLogin() {\r
524                 return $this->canlogin;\r
525         }\r
526 \r
527         function setCanLogin($val) {\r
528                 $this->canlogin = $val;\r
529         }\r
530 \r
531         function getNotes() {\r
532                 return $this->notes;\r
533         }\r
534 \r
535         function setNotes($val) {\r
536                 $this->notes = $val;\r
537         }\r
538 \r
539         function getAutosave() {\r
540                 return $this->autosave;\r
541         }\r
542 \r
543         function setAutosave($val) {\r
544                 $this->autosave = $val;\r
545         }\r
546 \r
547         function getID() {\r
548                 return $this->id;\r
549         }\r
550 \r
551         /**\r
552          * Returns true if there is a member with the given login name\r
553          * \r
554          * @static\r
555          */\r
556         function exists($name) {\r
557                 $r = sql_query('select * FROM '.sql_table('member')." WHERE mname='".addslashes($name)."'");\r
558                 return (mysql_num_rows($r) != 0);\r
559         }\r
560 \r
561         /**\r
562          * Returns true if there is a member with the given ID\r
563          *\r
564          * @static\r
565          */\r
566         function existsID($id) {\r
567                 $r = sql_query('select * FROM '.sql_table('member')." WHERE mnumber='".intval($id)."'");\r
568                 return (mysql_num_rows($r) != 0);\r
569         }\r
570 \r
571         /**\r
572          *  Checks if a username is protected. \r
573          *  If so, it can not be used on anonymous comments\r
574          */\r
575         function isNameProtected($name) {\r
576 \r
577                 // extract name\r
578                 $name = strip_tags($name);\r
579                 $name = trim($name);\r
580 \r
581                 return MEMBER::exists($name);\r
582         }\r
583 \r
584         /**\r
585          * Adds a new member\r
586          * \r
587          * @static\r
588          */\r
589         function create($name, $realname, $password, $email, $url, $admin, $canlogin, $notes) {\r
590                 if (!isValidMailAddress($email))\r
591                         return _ERROR_BADMAILADDRESS;\r
592 \r
593                 if (!isValidDisplayName($name))\r
594                         return _ERROR_BADNAME;\r
595 \r
596                 if (MEMBER::exists($name))\r
597                         return _ERROR_NICKNAMEINUSE;\r
598 \r
599                 if (!$realname)\r
600                         return _ERROR_REALNAMEMISSING;\r
601 \r
602                 if (!$password)\r
603                         return _ERROR_PASSWORDMISSING;\r
604 \r
605                 // Sometimes user didn't prefix the URL with http://, this cause a malformed URL. Let's fix it.\r
606                 if (!eregi("^https?://", $url))\r
607                         $url = "http://".$url;\r
608 \r
609                 $name = addslashes($name);\r
610                 $realname = addslashes($realname);\r
611                 $password = addslashes(md5($password));\r
612                 $email = addslashes($email);\r
613                 $url = addslashes($url);\r
614                 $admin = intval($admin);\r
615                 $canlogin = intval($canlogin);\r
616                 $notes = addslashes($notes);\r
617 \r
618                 $query = 'INSERT INTO '.sql_table('member')." (MNAME,MREALNAME,MPASSWORD,MEMAIL,MURL, MADMIN, MCANLOGIN, MNOTES) "\r
619                            . "VALUES ('$name','$realname','$password','$email','$url',$admin, $canlogin, '$notes')";\r
620                 sql_query($query);\r
621 \r
622                 ACTIONLOG::add(INFO, _ACTIONLOG_NEWMEMBER . ' ' . $name);\r
623 \r
624                 return 1;\r
625         }\r
626 \r
627         /**\r
628          * Returns activation info for a certain key (an object with properties vkey, vmember, ...)\r
629          * (static)\r
630          *\r
631          * @author karma\r
632          */\r
633         function getActivationInfo($key)\r
634         {\r
635                 $query = 'SELECT * FROM ' . sql_table('activation') . ' WHERE vkey=\'' . addslashes($key). '\'';\r
636                 $res = sql_query($query);\r
637 \r
638                 if (!$res || (mysql_num_rows($res) == 0))\r
639                         return 0;\r
640                 else\r
641                         return mysql_fetch_object($res);\r
642         }\r
643 \r
644         /**\r
645          * Creates an account activation key\r
646          *\r
647          * @param $type one of the following values (determines what to do when activation expires)\r
648          *                'register' (new member registration)\r
649          *                'forgot' (forgotton password)\r
650          *                'addresschange' (member address has changed)\r
651          * @param $extra extra info (needed when validation link expires)\r
652          *                                addresschange -> old email address\r
653          * @author dekarma\r
654          */\r
655         function generateActivationEntry($type, $extra = '')\r
656         {\r
657                 // clean up old entries\r
658                 $this->cleanupActivationTable();\r
659 \r
660                 // kill any existing entries for the current member (delete is ok)\r
661                 // (only one outstanding activation key can be present for a member)\r
662                 sql_query('DELETE FROM ' . sql_table('activation') . ' WHERE vmember=' . intval($this->getID()));\r
663 \r
664                 $canLoginWhileActive = false; // indicates if the member can log in while the link is active\r
665                 switch ($type)\r
666                 {\r
667                         case 'forgot':\r
668                                 $canLoginWhileActive = true;\r
669                                 break;\r
670                         case 'register':\r
671                                 break;\r
672                         case 'addresschange':\r
673                                 $extra = $extra . '/' . ($this->canLogin() ? '1' : '0');\r
674                                 break;\r
675                 }\r
676 \r
677                 $ok = false;\r
678                 while (!$ok)\r
679                 {\r
680                         // generate a random key\r
681                         srand((double)microtime()*1000000);\r
682                         $key = md5(uniqid(rand(), true));\r
683 \r
684                         // attempt to add entry in database\r
685                         // add in database as non-active\r
686                         $query = 'INSERT INTO ' . sql_table('activation'). ' (vkey, vtime, vmember, vtype, vextra) ';\r
687                         $query .= 'VALUES (\'' . addslashes($key). '\', \'' . date('Y-m-d H:i:s',time()) . '\', \'' . intval($this->getID()). '\', \'' . addslashes($type). '\', \'' . addslashes($extra). '\')';\r
688                         if (sql_query($query))\r
689                                 $ok = true;\r
690                 }\r
691 \r
692                 // mark member as not allowed to log in\r
693                 if (!$canLoginWhileActive)\r
694                 {\r
695                         $this->setCanLogin(0);\r
696                         $this->write();\r
697                 }\r
698 \r
699                 // return the key\r
700                 return $key;\r
701         }\r
702 \r
703         /**\r
704          * Inidicates that an activation link has been clicked and any forms displayed\r
705          * there have been successfully filled out.\r
706          * @author dekarma\r
707          */\r
708         function activate($key)\r
709         {\r
710                 // get activate info\r
711                 $info = MEMBER::getActivationInfo($key);\r
712 \r
713                 // no active key\r
714                 if (!$info)\r
715                         return false;\r
716 \r
717                 switch ($info->vtype)\r
718                 {\r
719                         case 'forgot':\r
720                                 // nothing to do\r
721                                 break;\r
722                         case 'register':\r
723                                 // set canlogin value\r
724                                 global $CONF;\r
725                                 sql_query('UPDATE ' . sql_table('member') . ' SET mcanlogin=' . intval($CONF['NewMemberCanLogon']). ' WHERE mnumber=' . intval($info->vmember));\r
726                                 break;\r
727                         case 'addresschange':\r
728                                 // reset old 'canlogin' value\r
729                                 list($oldEmail, $oldCanLogin) = explode('/', $info->vextra);\r
730                                 sql_query('UPDATE ' . sql_table('member') . ' SET mcanlogin=' . intval($oldCanLogin). ' WHERE mnumber=' . intval($info->vmember));\r
731                                 break;\r
732                 }\r
733 \r
734                 // delete from activation table\r
735                 sql_query('DELETE FROM ' . sql_table('activation') . ' WHERE vkey=\'' . addslashes($key) . '\'');\r
736 \r
737                 // success!\r
738                 return true;\r
739         }\r
740 \r
741         /**\r
742          * Cleans up entries in the activation table. All entries older than 2 days are removed.\r
743          * (static)\r
744          *\r
745          * @author dekarma\r
746          */\r
747         function cleanupActivationTable()\r
748         {\r
749                 $boundary = time() - (60 * 60 * 24 * 2);\r
750 \r
751                 // 1. walk over all entries, and see if special actions need to be performed\r
752                 $res = sql_query('SELECT * FROM ' . sql_table('activation') . ' WHERE vtime < \'' . date('Y-m-d H:i:s',$boundary) . '\'');\r
753 \r
754                 while ($o = mysql_fetch_object($res))\r
755                 {\r
756                         switch ($o->vtype)\r
757                         {\r
758                                 case 'register':\r
759                                         // delete all information about this site member. registration is undone because there was\r
760                                         // no timely activation\r
761                                         include_once($DIR_LIBS . 'ADMIN.php');\r
762                                         ADMIN::deleteOneMember(intval($o->vmember));\r
763                                         break;\r
764                                 case 'addresschange':\r
765                                         // revert the e-mail address of the member back to old address\r
766                                         list($oldEmail, $oldCanLogin) = explode('/', $o->vextra);\r
767                                         sql_query('UPDATE ' . sql_table('member') . ' SET mcanlogin=' . intval($oldCanLogin). ', memail=\'' . addslashes($oldEmail). '\' WHERE mnumber=' . intval($o->vmember));\r
768                                         break;\r
769                                 case 'forgot':\r
770                                         // delete the activation link and ignore. member can request a new password using the\r
771                                         // forgot password link\r
772                                         break;\r
773                         }\r
774                 }\r
775 \r
776                 // 2. delete activation entries for real\r
777                 sql_query('DELETE FROM ' . sql_table('activation') . ' WHERE vtime < \'' . date('Y-m-d H:i:s',$boundary) . '\'');\r
778         }\r
779 \r
780 }\r
781 \r
782 ?>