OSDN Git Service

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