OSDN Git Service

9f08ba9879e1c21ef93c6f5aa2bbe679cc2bbf5a
[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-2004 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   * A class representing site members\r
14   */\r
15 class MEMBER {\r
16 \r
17         // 1 when authenticated, 0 when not\r
18         var $loggedin;\r
19         var $password;          // not the actual password, but rather a MD5 hash       \r
20 \r
21         var $cookiekey;         // value that should also be in the client cookie to allow authentication\r
22         \r
23         // member info\r
24         var $id;\r
25         var $realname;\r
26         var $displayname;\r
27         var $email;\r
28         var $url;\r
29         var $language;          // name of the language file to use (e.g. 'english' -> english.php)\r
30         var $admin;                     // (either 0 or 1)\r
31         var $canlogin;          // (either 0 or 1)\r
32         var $notes;\r
33 \r
34         // (private)\r
35         function MEMBER() {\r
36 \r
37         }\r
38         \r
39         // (static)\r
40         function createFromName($displayname) {\r
41                 $mem = new MEMBER();\r
42                 $mem->readFromName($displayname);\r
43                 return $mem;\r
44         }\r
45         \r
46         // (static)\r
47         function createFromID($id) {\r
48                 $mem = new MEMBER();\r
49                 $mem->readFromID($id);\r
50                 return $mem;\r
51         }\r
52         \r
53         function readFromName($displayname) {\r
54                 return $this->read("mname='".addslashes($displayname)."'");\r
55         }\r
56         \r
57         function readFromID($id) {\r
58                 return $this->read("mnumber=" . intval($id));\r
59         }\r
60         \r
61         /**\r
62           * Tries to login as a given user. Returns true when succeeded, \r
63           * returns false when failed\r
64           */\r
65         function login($login, $password) {\r
66                 $this->loggedin = 0;\r
67                 if (!$this->readFromName($login))\r
68                         return 0;\r
69                 if (!$this->checkPassword($password)) \r
70                         return 0;\r
71                 $this->loggedin = 1;\r
72                 return $this->isLoggedIn();\r
73         }\r
74         \r
75         // login using cookie key\r
76         function cookielogin($login, $cookiekey) {\r
77                 $this->loggedin = 0;\r
78                 if (!$this->readFromName($login))\r
79                         return 0;\r
80                 if (!$this->checkCookieKey($cookiekey))\r
81                         return 0;\r
82                 $this->loggedin = 1;\r
83                 return $this->isLoggedIn();\r
84         }\r
85         \r
86         function logout() {\r
87                 $this->loggedin=0;\r
88         }\r
89         \r
90         function isLoggedIn() {\r
91                 return $this->loggedin;\r
92         }\r
93         \r
94         function read($where) {\r
95                 // read info\r
96                 $query =  'SELECT * FROM '.sql_table('member') . ' WHERE ' . $where;\r
97                 \r
98                 $res = sql_query($query);\r
99                 $obj = mysql_fetch_object($res);\r
100                 \r
101                 $this->setRealName($obj->mrealname);\r
102                 $this->setEmail($obj->memail);\r
103                 $this->password = $obj->mpassword;\r
104                 $this->setCookieKey($obj->mcookiekey);          \r
105                 $this->setURL($obj->murl);\r
106                 $this->setDisplayName($obj->mname);\r
107                 $this->setAdmin($obj->madmin);\r
108                 $this->id = $obj->mnumber;\r
109                 $this->setCanLogin($obj->mcanlogin);\r
110                 $this->setNotes($obj->mnotes);\r
111                 $this->setLanguage($obj->deflang);              \r
112                         \r
113                 return mysql_num_rows($res);\r
114         }\r
115         \r
116         \r
117         /**\r
118           * Returns true if member is an admin for the given blog\r
119           * (returns false if not a team member)\r
120           */\r
121         function isBlogAdmin($blogid) {\r
122                 $query = 'SELECT tadmin FROM '.sql_table('team').' WHERE'\r
123                        . ' tblog=' . intval($blogid)\r
124                        . ' and tmember='. $this->getID();\r
125                 $res = sql_query($query);\r
126                 if (mysql_num_rows($res) == 0)\r
127                         return 0;\r
128                 else\r
129                         return (mysql_result($res,0,0) == 1) ;                 \r
130         }\r
131         \r
132         function blogAdminRights($blogid) {\r
133                 return ($this->isAdmin() || $this->isBlogAdmin($blogid));\r
134         }\r
135 \r
136                 \r
137         function teamRights($blogid) {\r
138                 return ($this->isAdmin() || $this->isTeamMember($blogid));\r
139         }\r
140         \r
141         /**\r
142           * Returns true if this member is a team member of the given blog\r
143           */\r
144         function isTeamMember($blogid) {\r
145                 $query = 'SELECT * FROM '.sql_table('team').' WHERE'\r
146                        . ' tblog=' . intval($blogid)\r
147                        . ' and tmember='. $this->getID();\r
148                 return (mysql_num_rows(sql_query($query)) != 0);\r
149         }\r
150         \r
151         /**\r
152           * Returns true if this member can edit/delete a commentitem. This can be in the\r
153           * following cases:\r
154           *       - member is a super-admin\r
155           *   - member is the author of the comment\r
156           *   - member is admin of the blog associated with the comment\r
157           *   - member is author of the item associated with the comment\r
158           */\r
159         function canAlterComment($commentid) {\r
160                 if ($this->isAdmin()) return 1;\r
161         \r
162                 $query =  'SELECT citem as itemid, iblog as blogid, cmember as cauthor, iauthor'\r
163                        . ' FROM '.sql_table('comment') .', '.sql_table('item').', '.sql_table('blog')\r
164                        . ' WHERE citem=inumber and iblog=bnumber and cnumber=' . intval($commentid);\r
165                 $obj = mysql_fetch_object(sql_query($query));\r
166                 \r
167                 return ($obj->cauthor == $this->getID()) or $this->isBlogAdmin($obj->blogid) or ($obj->iauthor == $this->getID());\r
168         }       \r
169         \r
170         /**\r
171           * Returns true if this member can edit/delete an item. This is true in the following\r
172           * cases: - member is a super-admin\r
173           *            - member is the author of the item\r
174           *        - member is admin of the the associated blog\r
175           */\r
176         function canAlterItem($itemid) {\r
177                 if ($this->isAdmin()) return 1;\r
178                 \r
179                 $query =  'SELECT iblog, iauthor FROM '.sql_table('item').' WHERE inumber=' . intval($itemid);\r
180                 $obj = mysql_fetch_object(sql_query($query));\r
181                 return ($obj->iauthor == $this->getID()) or $this->isBlogAdmin($obj->iblog);\r
182         }\r
183         \r
184         /**\r
185           * returns true if this member can move/update an item to a given category, \r
186           * false if not (see comments fot the tests that are executed)\r
187           *\r
188           * @param itemid\r
189           * @param newcat (can also be of form 'newcat-x' with x=blogid)\r
190           */\r
191         function canUpdateItem($itemid, $newcat) {\r
192                 global $manager;\r
193                 \r
194                 // item does not exists -> NOK\r
195                 if (!$manager->existsItem($itemid,1,1)) return 0;\r
196                 \r
197                 // cannot alter item -> NOK\r
198                 if (!$this->canAlterItem($itemid)) return 0;\r
199                 \r
200                 // if this is a 'newcat' style newcat\r
201                 // no blog admin of destination blog -> NOK\r
202                 // blog admin of destination blog -> OK\r
203                 if (strstr($newcat,'newcat')) {\r
204                         // get blogid \r
205                         list($blogid) = sscanf($newcat,'newcat-%d');\r
206                         return $this->blogAdminRights($blogid);\r
207                 } \r
208 \r
209                 // category does not exist -> NOK\r
210                 if (!$manager->existsCategory($newcat)) return 0;\r
211 \r
212                 \r
213                 // get item\r
214                 $item =& $manager->getItem($itemid,1,1);\r
215                 \r
216                 // old catid = new catid -> OK\r
217                 if ($item['catid'] == $newcat) return 1;\r
218 \r
219                 // not a valid category -> NOK\r
220                 $validCat = quickQuery('SELECT COUNT(*) AS result FROM '.sql_table('category').' WHERE catid='.intval($newcat));\r
221                 if (!$validCat) return 0;\r
222                 \r
223                 // get destination blog\r
224                 $source_blogid = getBlogIDFromItemID($itemid);\r
225                 $dest_blogid = getBlogIDFromCatID($newcat);\r
226                 \r
227                 // not a team member of destination blog -> NOK\r
228                 if (!$this->teamRights($dest_blogid)) return 0;\r
229 \r
230                 // if member is author of item -> OK\r
231                 if ($item['authorid'] == $this->getID()) return 1;\r
232                 \r
233                 // if member has admin rights on both blogs: OK\r
234                 if (($this->blogAdminRights($dest_blogid)) && ($this->blogAdminRights($source_blogid))) return 1;\r
235                 \r
236                 // all other cases: NOK\r
237                 return 0;\r
238                 \r
239         }\r
240         \r
241         function canAddItem($catid) {\r
242                 global $manager;\r
243                 \r
244                 // if this is a 'newcat' style newcat\r
245                 // no blog admin of destination blog -> NOK\r
246                 // blog admin of destination blog -> OK\r
247                 if (strstr($catid,'newcat')) {\r
248                         // get blogid \r
249                         list($blogid) = sscanf($catid,"newcat-%d");\r
250                         return $this->blogAdminRights($blogid);\r
251                 } \r
252                 \r
253                 // category does not exist -> NOK\r
254                 if (!$manager->existsCategory($catid)) return 0;\r
255 \r
256                 $blogid = getBlogIDFromCatID($catid);\r
257 \r
258                 // no team rights for blog -> NOK\r
259                 if (!$this->teamRights($blogid)) return 0;\r
260 \r
261                 // all other cases: OK\r
262                 return 1;\r
263         }\r
264         \r
265         /** \r
266           * Return true if member can be deleted. This means that there are no items or comments\r
267           * posted by the member\r
268           */\r
269         function canBeDeleted() {\r
270                 $res = sql_query('SELECT * FROM '.sql_table('item').' WHERE iauthor=' . $this->getID());\r
271                 $res2 = sql_query('SELECT * FROM '.sql_table('comment').' WHERE cmember=' . $this->getID());\r
272                 return ((mysql_num_rows($res) == 0) and (mysql_num_rows($res2)==0));\r
273         }\r
274 \r
275         /** \r
276           * Sets the cookies for the member\r
277           *\r
278           * @param shared\r
279           *             set this to 1 when using a shared computer. Cookies will expire\r
280           *             at the end of the session in this case.\r
281           */\r
282         function setCookies($shared = 0) {\r
283                 global $CONF;\r
284                 \r
285                 if ($CONF['SessionCookie'] || $shared)\r
286                         $lifetime = 0;\r
287                 else\r
288                         $lifetime = (time()+2592000);\r
289                         \r
290                 setcookie('user',$this->getDisplayName(),$lifetime,$CONF['CookiePath'],$CONF['CookieDomain'],$CONF['CookieSecure']);\r
291                 setcookie('loginkey', $this->getCookieKey(),$lifetime,$CONF['CookiePath'],$CONF['CookieDomain'],$CONF['CookieSecure']);\r
292 \r
293                 // make sure cookies on shared pcs don't get renewed\r
294                 if ($shared)\r
295                         setcookie('sharedpc', '1',$lifetime,$CONF['CookiePath'],$CONF['CookieDomain'],$CONF['CookieSecure']);\r
296         }\r
297         \r
298         /**\r
299           * Sends an email message containing the users password\r
300           */\r
301         function sendPassword($password) {\r
302                 global $CONF;\r
303                 \r
304                 $message = "Someone, possibly you, requested a new password for your account at '" . $CONF['SiteName'] . "' (". $CONF['IndexURL']. ") to be sent out to you.\n Here is your new login information: \n\n";\r
305                 $message .= "\tLogin: " . $this->getDisplayName();\r
306                 $message .= "\n\tPassword: " . $password; \r
307                 $message .= getMailFooter();\r
308                 \r
309                 @mail($this->getEmail(),'Your password',$message,"From: " . $CONF['AdminEmail']);\r
310                 \r
311                 ACTIONLOG::add(INFO, _ACTIONLOG_PWDREMINDERSENT . $this->getDisplayName());\r
312         }\r
313         \r
314         /** \r
315           * Returns an array of all blogids for which member has admin rights\r
316           */\r
317         function getAdminBlogs() {\r
318                 $blogs = array();\r
319                 \r
320                 if ($this->isAdmin())\r
321                         $query = 'SELECT bnumber as blogid from '.sql_table('blog');\r
322                 else\r
323                         $query = 'SELECT tblog as blogid from '.sql_table('team').' where tadmin=1 and tmember=' . $this->getID();\r
324                         \r
325                 $res = sql_query($query);\r
326                 if (mysql_num_rows($res) > 0) {\r
327                         while ($obj = mysql_fetch_object($res)) {\r
328                                 array_push($blogs, $obj->blogid);\r
329                         }\r
330                 }\r
331                 \r
332                 return $blogs;\r
333         }\r
334         \r
335         /**\r
336           * Returns an email address from which notification of commenting/karma voting can\r
337           * be sent. A suggestion can be given for when the member is not logged in\r
338           */\r
339         function getNotifyFromMailAddress($suggest = "") {\r
340                 global $CONF;\r
341                 if ($this->isLoggedIn()) {\r
342                         return $this->getDisplayName() . " <" . $this->getEmail() . ">"; \r
343                 } else if (isValidMailAddress($suggest)) {\r
344                         return $suggest;\r
345                 } else {\r
346                         return $CONF['AdminEmail'];\r
347                 }\r
348         }\r
349 \r
350         /**\r
351           * Write data to database\r
352           */\r
353         function write() {\r
354 \r
355                 $query =  'UPDATE '.sql_table('member')\r
356                        . " SET mname='" . addslashes($this->getDisplayName()) . "',"\r
357                        . "     mrealname='". addslashes($this->getRealName()) . "',"\r
358                        . "     mpassword='". addslashes($this->getPassword()) . "',"\r
359                        . "     mcookiekey='". addslashes($this->getCookieKey()) . "',"                 \r
360                        . "     murl='" . addslashes($this->getURL()) . "',"\r
361                        . "     memail='" . addslashes($this->getEmail()) . "',"\r
362                        . "     madmin=" . $this->isAdmin() . ","\r
363                        . "     mnotes='" . addslashes($this->getNotes()) . "',"\r
364                        . "     mcanlogin=" . $this->canLogin() . ","\r
365                        . "         deflang='" . addslashes($this->getLanguage()) . "'"\r
366                        . " WHERE mnumber=" . $this->getID();\r
367                 sql_query($query);\r
368         }\r
369         \r
370         function checkPassword($pw) {\r
371                 return (md5($pw) == $this->getPassword());\r
372         }\r
373         \r
374         function checkCookieKey($key) {\r
375                 return (($key != '') && ($key == $this->getCookieKey()));\r
376         }\r
377         \r
378         function getRealName() {\r
379                 return $this->realname;\r
380         }\r
381         \r
382         function setRealName($name) {\r
383                 $this->realname = $name;\r
384         }\r
385         \r
386         function getEmail() {\r
387                 return $this->email;\r
388         }\r
389         \r
390         function setEmail($email) {\r
391                 $this->email = $email;\r
392         }\r
393         \r
394         function getPassword() {\r
395                 return $this->password;\r
396         }\r
397         \r
398         function setPassword($pwd) {\r
399                 $this->password = md5($pwd);\r
400         }\r
401         \r
402         function getCookieKey() {\r
403                 return $this->cookiekey;\r
404         }\r
405         \r
406         /**\r
407           * Generate new cookiekey, save it, and return it\r
408           */\r
409         function newCookieKey() {\r
410                 mt_srand( (double) microtime() * 1000000);\r
411                 $this->cookiekey = md5(uniqid(mt_rand()));\r
412                 $this->write();\r
413                 return $this->cookiekey;\r
414         }\r
415         \r
416         function setCookieKey($val) {\r
417                 $this->cookiekey = $val;\r
418         }\r
419 \r
420         function getURL() {\r
421                 return $this->url;\r
422         }\r
423         \r
424         function setURL($site) {\r
425                 $this->url = $site;\r
426         }\r
427         \r
428         function getLanguage() {\r
429                 return $this->language;\r
430         }\r
431         \r
432         function setLanguage($lang) {\r
433                 $this->language = $lang;\r
434         }\r
435         \r
436         function setDisplayName($nick) {\r
437                 $this->displayname = $nick;\r
438         }\r
439         \r
440         function getDisplayName() {\r
441                 return $this->displayname;\r
442         }\r
443         \r
444         function isAdmin() {\r
445                 return $this->admin;\r
446         }\r
447         \r
448         function setAdmin($val) {\r
449                 $this->admin = $val;\r
450         }\r
451         \r
452         function canLogin() {\r
453                 return $this->canlogin;\r
454         }\r
455         \r
456         function setCanLogin($val) {\r
457                 $this->canlogin = $val;\r
458         }\r
459 \r
460         function getNotes() {\r
461                 return $this->notes;\r
462         }\r
463         \r
464         function setNotes($val) {\r
465                 $this->notes = $val;\r
466         }\r
467         \r
468         function getID() {\r
469                 return $this->id;\r
470         }\r
471 \r
472         // returns true if there is a member with the given login name (static)\r
473         function exists($name) {\r
474                 $r = sql_query('select * FROM '.sql_table('member')." WHERE mname='".addslashes($name)."'");\r
475                 return (mysql_num_rows($r) != 0);\r
476         }\r
477 \r
478         // returns true if there is a member with the given ID (static)\r
479         function existsID($id) {\r
480                 $r = sql_query('select * FROM '.sql_table('member')." WHERE mnumber='".intval($id)."'");\r
481                 return (mysql_num_rows($r) != 0);\r
482         }\r
483         \r
484         // checks if a username is protected. If so, it can not be used on anonymous comments\r
485         function isNameProtected($name) {\r
486                 \r
487                 // extract name\r
488                 $name = strip_tags($name);      \r
489                 $name = trim($name);            \r
490                 \r
491                 return MEMBER::exists($name);\r
492         }\r
493         \r
494         // adds a new member (static)\r
495         function create($name, $realname, $password, $email, $url, $admin, $canlogin, $notes) {\r
496                 if (!isValidMailAddress($email))\r
497                         return _ERROR_BADMAILADDRESS;\r
498 \r
499                 if (!isValidDisplayName($name))\r
500                         return _ERROR_BADNAME;\r
501 \r
502                 if (MEMBER::exists($name))\r
503                         return _ERROR_NICKNAMEINUSE;    \r
504 \r
505                 if (!$realname)\r
506                         return _ERROR_REALNAMEMISSING;\r
507 \r
508                 if (!$password)\r
509                         return _ERROR_PASSWORDMISSING;                  \r
510 \r
511                 // Sometimes user didn't prefix the URL with http://, this cause a malformed URL. Let's fix it.\r
512                 if (!eregi("^https?://", $url))\r
513                         $url = "http://".$url;\r
514 \r
515                 $name = addslashes($name);\r
516                 $realname = addslashes($realname);\r
517                 $password = addslashes(md5($password));\r
518                 $email = addslashes($email);\r
519                 $url = addslashes($url);\r
520                 $admin = intval($admin);\r
521                 $canlogin = intval($canlogin);\r
522                 $notes = addslashes($notes);\r
523 \r
524                 $query = 'INSERT INTO '.sql_table('member')." (MNAME,MREALNAME,MPASSWORD,MEMAIL,MURL, MADMIN, MCANLOGIN, MNOTES) "\r
525                        . "VALUES ('$name','$realname','$password','$email','$url',$admin, $canlogin, '$notes')";\r
526                 sql_query($query);\r
527                 \r
528                 ACTIONLOG::add(INFO, _ACTIONLOG_NEWMEMBER . ' ' . $name);               \r
529 \r
530                 return 1;\r
531         }       \r
532 }\r
533 \r
534 ?>\r