OSDN Git Service

applied some bug fixes
[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 = "誰か(おそらくはあなた)が'" . $CONF['SiteName'] . "' (". $CONF['IndexURL']. ") \nにおけるアカウントと新規パスワードの送信を要求しました。\nあなたの新規ログイン情報は以下のとおりです。: \n\n";\r
305                 $message .= "\tLogin: " . $this->getDisplayName();\r
306                 $message .= "\n\tPassword: " . $password; \r
307                 $message .= getMailFooter();\r
308 \r
309                 $title = 'パスワード情報';\r
310                 mb_language('ja');\r
311                 mb_internal_encoding(_CHARSET);\r
312                 @mb_send_mail($this->getEmail(), $title, $message, "From: ". $CONF['AdminEmail']);\r
313                 \r
314                 ACTIONLOG::add(INFO, _ACTIONLOG_PWDREMINDERSENT . $this->getDisplayName());\r
315         }\r
316         \r
317         /** \r
318           * Returns an array of all blogids for which member has admin rights\r
319           */\r
320         function getAdminBlogs() {\r
321                 $blogs = array();\r
322                 \r
323                 if ($this->isAdmin())\r
324                         $query = 'SELECT bnumber as blogid from '.sql_table('blog');\r
325                 else\r
326                         $query = 'SELECT tblog as blogid from '.sql_table('team').' where tadmin=1 and tmember=' . $this->getID();\r
327                         \r
328                 $res = sql_query($query);\r
329                 if (mysql_num_rows($res) > 0) {\r
330                         while ($obj = mysql_fetch_object($res)) {\r
331                                 array_push($blogs, $obj->blogid);\r
332                         }\r
333                 }\r
334                 \r
335                 return $blogs;\r
336         }\r
337         \r
338         /**\r
339           * Returns an email address from which notification of commenting/karma voting can\r
340           * be sent. A suggestion can be given for when the member is not logged in\r
341           */\r
342         function getNotifyFromMailAddress($suggest = "") {\r
343                 global $CONF;\r
344                 if ($this->isLoggedIn()) {\r
345                         return $this->getDisplayName() . " <" . $this->getEmail() . ">"; \r
346                 } else if (isValidMailAddress($suggest)) {\r
347                         return $suggest;\r
348                 } else {\r
349                         return $CONF['AdminEmail'];\r
350                 }\r
351         }\r
352 \r
353         /**\r
354           * Write data to database\r
355           */\r
356         function write() {\r
357 \r
358                 $query =  'UPDATE '.sql_table('member')\r
359                        . " SET mname='" . addslashes($this->getDisplayName()) . "',"\r
360                        . "     mrealname='". addslashes($this->getRealName()) . "',"\r
361                        . "     mpassword='". addslashes($this->getPassword()) . "',"\r
362                        . "     mcookiekey='". addslashes($this->getCookieKey()) . "',"                 \r
363                        . "     murl='" . addslashes($this->getURL()) . "',"\r
364                        . "     memail='" . addslashes($this->getEmail()) . "',"\r
365                        . "     madmin=" . $this->isAdmin() . ","\r
366                        . "     mnotes='" . addslashes($this->getNotes()) . "',"\r
367                        . "     mcanlogin=" . $this->canLogin() . ","\r
368                        . "         deflang='" . addslashes($this->getLanguage()) . "'"\r
369                        . " WHERE mnumber=" . $this->getID();\r
370                 sql_query($query);\r
371         }\r
372         \r
373         function checkPassword($pw) {\r
374                 return (md5($pw) == $this->getPassword());\r
375         }\r
376         \r
377         function checkCookieKey($key) {\r
378                 return (($key != '') && ($key == $this->getCookieKey()));\r
379         }\r
380         \r
381         function getRealName() {\r
382                 return $this->realname;\r
383         }\r
384         \r
385         function setRealName($name) {\r
386                 $this->realname = $name;\r
387         }\r
388         \r
389         function getEmail() {\r
390                 return $this->email;\r
391         }\r
392         \r
393         function setEmail($email) {\r
394                 $this->email = $email;\r
395         }\r
396         \r
397         function getPassword() {\r
398                 return $this->password;\r
399         }\r
400         \r
401         function setPassword($pwd) {\r
402                 $this->password = md5($pwd);\r
403         }\r
404         \r
405         function getCookieKey() {\r
406                 return $this->cookiekey;\r
407         }\r
408         \r
409         /**\r
410           * Generate new cookiekey, save it, and return it\r
411           */\r
412         function newCookieKey() {\r
413                 mt_srand( (double) microtime() * 1000000);\r
414                 $this->cookiekey = md5(uniqid(mt_rand()));\r
415                 $this->write();\r
416                 return $this->cookiekey;\r
417         }\r
418         \r
419         function setCookieKey($val) {\r
420                 $this->cookiekey = $val;\r
421         }\r
422 \r
423         function getURL() {\r
424                 return $this->url;\r
425         }\r
426         \r
427         function setURL($site) {\r
428                 $this->url = $site;\r
429         }\r
430         \r
431         function getLanguage() {\r
432                 return $this->language;\r
433         }\r
434         \r
435         function setLanguage($lang) {\r
436                 $this->language = $lang;\r
437         }\r
438         \r
439         function setDisplayName($nick) {\r
440                 $this->displayname = $nick;\r
441         }\r
442         \r
443         function getDisplayName() {\r
444                 return $this->displayname;\r
445         }\r
446         \r
447         function isAdmin() {\r
448                 return $this->admin;\r
449         }\r
450         \r
451         function setAdmin($val) {\r
452                 $this->admin = $val;\r
453         }\r
454         \r
455         function canLogin() {\r
456                 return $this->canlogin;\r
457         }\r
458         \r
459         function setCanLogin($val) {\r
460                 $this->canlogin = $val;\r
461         }\r
462 \r
463         function getNotes() {\r
464                 return $this->notes;\r
465         }\r
466         \r
467         function setNotes($val) {\r
468                 $this->notes = $val;\r
469         }\r
470         \r
471         function getID() {\r
472                 return $this->id;\r
473         }\r
474 \r
475         // returns true if there is a member with the given login name (static)\r
476         function exists($name) {\r
477                 $r = sql_query('select * FROM '.sql_table('member')." WHERE mname='".addslashes($name)."'");\r
478                 return (mysql_num_rows($r) != 0);\r
479         }\r
480 \r
481         // returns true if there is a member with the given ID (static)\r
482         function existsID($id) {\r
483                 $r = sql_query('select * FROM '.sql_table('member')." WHERE mnumber='".intval($id)."'");\r
484                 return (mysql_num_rows($r) != 0);\r
485         }\r
486 \r
487         // checks if a username is protected. If so, it can not be used on anonymous comments\r
488         function isNameProtected($name) {\r
489                 \r
490                 // extract name\r
491                 $name = strip_tags($name);      \r
492                 $name = trim($name);            \r
493                 \r
494                 return MEMBER::exists($name);\r
495         }\r
496         \r
497         // adds a new member (static)\r
498         function create($name, $realname, $password, $email, $url, $admin, $canlogin, $notes) {\r
499                 if (!isValidMailAddress($email))\r
500                         return _ERROR_BADMAILADDRESS;\r
501 \r
502                 if (!isValidDisplayName($name))\r
503                         return _ERROR_BADNAME;\r
504 \r
505                 if (MEMBER::exists($name))\r
506                         return _ERROR_NICKNAMEINUSE;    \r
507 \r
508                 if (!$realname)\r
509                         return _ERROR_REALNAMEMISSING;\r
510 \r
511                 if (!$password)\r
512                         return _ERROR_PASSWORDMISSING;                  \r
513 \r
514                 // Sometimes user didn't prefix the URL with http://, this cause a malformed URL. Let's fix it.\r
515                 if (!eregi("^https?://", $url))\r
516                         $url = "http://".$url;\r
517 \r
518                 $name = addslashes($name);\r
519                 $realname = addslashes($realname);\r
520                 $password = addslashes(md5($password));\r
521                 $email = addslashes($email);\r
522                 $url = addslashes($url);\r
523                 $admin = intval($admin);\r
524                 $canlogin = intval($canlogin);\r
525                 $notes = addslashes($notes);\r
526 \r
527                 $query = 'INSERT INTO '.sql_table('member')." (MNAME,MREALNAME,MPASSWORD,MEMAIL,MURL, MADMIN, MCANLOGIN, MNOTES) "\r
528                        . "VALUES ('$name','$realname','$password','$email','$url',$admin, $canlogin, '$notes')";\r
529                 sql_query($query);\r
530                 \r
531                 ACTIONLOG::add(INFO, _ACTIONLOG_NEWMEMBER . ' ' . $name);               \r
532 \r
533                 return 1;\r
534         }       \r
535 }\r
536 \r
537 ?>\r