OSDN Git Service

主だったスクリプトの改行コードを統一
[nucleus-jp/nucleus-next.git] / nucleus / libs / ACTION.php
1 <?php\r
2 \r
3 /*\r
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
5  * Copyright (C) 2002-2009 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  * Actions that can be called via action.php\r
15  *\r
16  * @license http://nucleuscms.org/license.txt GNU General Public License\r
17  * @copyright Copyright (C) 2002-2009 The Nucleus Group\r
18  * @version $Id: ACTION.php 1646 2012-01-29 10:47:32Z sakamocchi $\r
19  */\r
20 class ACTION\r
21 {\r
22         /**\r
23          * ACTION::ACTION()\r
24          *  Constructor for an new ACTION object\r
25          * \r
26          * @param       void\r
27          * @return      void\r
28          * \r
29          */\r
30         function ACTION()\r
31         {\r
32                 return;\r
33         }\r
34         \r
35         /**\r
36          * ACTION::doAction()\r
37          *  Calls functions that handle an action called from action.php\r
38          * \r
39          * @param       string  $action action type\r
40          * @return      mixed\r
41          */\r
42         function doAction($action)\r
43         {\r
44                 switch ( $action )\r
45                 {\r
46                         case 'autodraft':\r
47                                 return $this->autoDraft();\r
48                         break;\r
49                         \r
50                         case 'updateticket':\r
51                                 return $this->updateTicket();\r
52                         break;\r
53                         \r
54                         case 'addcomment':\r
55                                 return $this->addComment();\r
56                         break;\r
57                         \r
58                         case 'sendmessage':\r
59                                 return $this->sendMessage();\r
60                         break;\r
61                         \r
62                         case 'createaccount':\r
63                                 return $this->createAccount();\r
64                         break;\r
65                         \r
66                         case 'forgotpassword':\r
67                                 return $this->forgotPassword();\r
68                         break;\r
69                         \r
70                         case 'votepositive':\r
71                                 return $this->doKarma('pos');\r
72                         break;\r
73                         \r
74                         case 'votenegative':\r
75                                 return $this->doKarma('neg');\r
76                         break;\r
77                         \r
78                         case 'plugin':\r
79                                 return $this->callPlugin();\r
80                         break;\r
81                         \r
82                         default:\r
83                                 doError(_ERROR_BADACTION);\r
84                         break;\r
85                 }\r
86         }\r
87         \r
88         /**\r
89          * ACTION::addComment()\r
90          * Adds a new comment to an item (if IP isn't banned)\r
91          * \r
92          * @param       void\r
93          * @return      void\r
94          * \r
95          */\r
96         function addComment()\r
97         {\r
98                 global $CONF, $errormessage, $manager;\r
99                 \r
100                 $post['itemid'] = intPostVar('itemid');\r
101                 $post['user']           = postVar('user');\r
102                 $post['userid'] = postVar('userid');\r
103                 $post['email']  = postVar('email');\r
104                 $post['body']           = postVar('body');\r
105                 $post['remember']       = intPostVar('remember');\r
106                 \r
107                 // begin if: "Remember Me" box checked\r
108                 if ( $post['remember'] == 1 )\r
109                 {\r
110                         $lifetime = time() + 2592000;\r
111                         setcookie($CONF['CookiePrefix'] . 'comment_user', $post['user'], $lifetime, '/', '', 0);\r
112                         setcookie($CONF['CookiePrefix'] . 'comment_userid', $post['userid'], $lifetime, '/', '', 0);\r
113                         setcookie($CONF['CookiePrefix'] . 'comment_email', $post['email'], $lifetime, '/', '', 0);\r
114                 }\r
115                 \r
116                 $comments = new COMMENTS($post['itemid']);\r
117                 \r
118                 $blog_id = getBlogIDFromItemID($post['itemid']);\r
119                 $this->checkban($blog_id);\r
120                 $blog =& $manager->getBlog($blog_id);\r
121                 \r
122                 // note: PreAddComment and PostAddComment gets called somewhere inside addComment\r
123                 $errormessage = $comments->addComment($blog->getCorrectTime(), $post);\r
124                 \r
125                 if ( $errormessage != '1' )\r
126                 {\r
127                         // show error message using default skin for blo\r
128                         return array(\r
129                                 'message'       => $errormessage,\r
130                                 'skinid'        => $blog->getDefaultSkin()\r
131                         );\r
132                 }\r
133                 else\r
134                 {\r
135                         // redirect when adding comments succeeded\r
136                         if ( postVar('url') )\r
137                         {\r
138                                 redirect(postVar('url') );\r
139                         }\r
140                         else\r
141                         {\r
142                                 $url = LINK::create_item_link($post['itemid']);\r
143                                 redirect($url);\r
144                         }\r
145                 }\r
146                 exit;\r
147         }\r
148         \r
149         /**\r
150          * ACTION::sendMessage()\r
151          * Sends a message from the current member to the member given as argument\r
152          * \r
153          * @param       void\r
154          * @return      void\r
155          * \r
156          */\r
157         function sendMessage()\r
158         {\r
159                 global $CONF, $member;\r
160                 \r
161                 $error = $this->validateMessage();\r
162                 \r
163                 if ( $error != '' )\r
164                 {\r
165                         return array('message' => $error);\r
166                 }\r
167                 \r
168                 if ( !$member->isLoggedIn() )\r
169                 {\r
170                         $fromMail = postVar('frommail');\r
171                         $fromName = _MMAIL_FROMANON;\r
172                 }\r
173                 else\r
174                 {\r
175                         $fromMail = $member->getEmail();\r
176                         $fromName = $member->getDisplayName();\r
177                 }\r
178                 \r
179                 $tomem = new MEMBER();\r
180                 $tomem->readFromId(postVar('memberid') );\r
181                 \r
182                 $message  = _MMAIL_MSG . ' ' . $fromName . "\n"\r
183                         . '(' . _MMAIL_FROMNUC. ' ' . $CONF['IndexURL'] .") \n\n"\r
184                         . _MMAIL_MAIL . " \n\n"\r
185                         . postVar('message');\r
186                 $message .= NOTIFICATION::get_mail_footer();\r
187                 \r
188                 $title = _MMAIL_TITLE . ' ' . $fromName;\r
189                 NOTIFICATION::mail($tomem->getEmail(), $title, $message, $fromMail, i18n::get_current_charset());\r
190                 \r
191                 if ( !postVar('url') )\r
192                 {\r
193                         $CONF['MemberURL'] = $CONF['IndexURL'];\r
194                         \r
195                         if ( $CONF['URLMode'] == 'pathinfo' )\r
196                         {\r
197                                 $url = LINK::create_link('member', array('memberid' => $tomem->getID(), 'name' => $tomem->getDisplayName() ) );\r
198                         }\r
199                         else\r
200                         {\r
201                                 $url = $CONF['IndexURL'] . LINK::create_member_link($tomem->getID());\r
202                         }\r
203                         redirect($url);\r
204                 }\r
205                 else\r
206                 {\r
207                         redirect(postVar('url') );\r
208                 }\r
209                 exit;\r
210         }\r
211         \r
212         /**\r
213          * ACTION::validateMessage()\r
214          *  Checks if a mail to a member is allowed\r
215          *  Returns a string with the error message if the mail is disallowed\r
216          *  \r
217          *  @param              void\r
218          *  @return     String  Null character string\r
219          *  \r
220          */\r
221         function validateMessage()\r
222         {\r
223                 global $CONF, $member, $manager;\r
224                 \r
225                 if ( !$CONF['AllowMemberMail'] )\r
226                 {\r
227                         return _ERROR_MEMBERMAILDISABLED;\r
228                 }\r
229                 \r
230                 if ( !$member->isLoggedIn() && !$CONF['NonmemberMail'] )\r
231                 {\r
232                         return _ERROR_DISALLOWED;\r
233                 }\r
234                 \r
235                 if ( !$member->isLoggedIn() && !NOTIFICATION::address_validation(postVar('frommail')) )\r
236                 {\r
237                         return _ERROR_BADMAILADDRESS;\r
238                 }\r
239                 \r
240                 /*\r
241                  * let plugins do verification (any plugin which thinks the comment is\r
242                  * invalid can change 'error' to something other than '')\r
243                  */\r
244                 $result = '';\r
245                 $manager->notify('ValidateForm', array('type' => 'membermail', 'error' => &$result) );\r
246                 \r
247                 return $result;\r
248         }\r
249         \r
250         /**\r
251          * ACTION::createAccount()\r
252          * Creates a new user account\r
253          *  \r
254          * @param       Void\r
255          * @return      Mixed\r
256          * \r
257          */\r
258         function createAccount()\r
259         {\r
260                 global $CONF, $manager;\r
261                 \r
262                 if ( !$CONF['AllowMemberCreate'] )\r
263                 {\r
264                         doError(_ERROR_MEMBERCREATEDISABLED);\r
265                 }\r
266                 \r
267                 // evaluate content from FormExtra\r
268                 $result = 1;\r
269                 $data = array('type' => 'membermail', 'error' => &$result);\r
270                 $manager->notify('ValidateForm', $data);\r
271                 \r
272                 if ( $result != 1 )\r
273                 {\r
274                         return $result;\r
275                 }\r
276                 \r
277                 // even though the member can not log in, set some random initial password. One never knows.\r
278                 srand( (double) microtime() * 1000000);\r
279                 $initialPwd = md5(uniqid(rand(), TRUE) );\r
280                 \r
281                 // create member (non admin/can not login/no notes/random string as password)\r
282                 $name = ENTITY::shorten(postVar('name'), 32, '');\r
283                 $r = MEMBER::create($name, postVar('realname'), $initialPwd, postVar('email'), postVar('url'), 0, 0, '');\r
284                 \r
285                 if ( $r != 1 )\r
286                 {\r
287                         return $r;\r
288                 }\r
289                 \r
290                 // send message containing password.\r
291                 $newmem = new MEMBER();\r
292                 $newmem->readFromName($name);\r
293                 $newmem->sendActivationLink('register');\r
294                 \r
295                 $manager->notify('PostRegister', array('member' => &$newmem) );\r
296                 \r
297                 if ( postVar('desturl') )\r
298                 {\r
299                         redirect(postVar('desturl') );\r
300                 }\r
301                 return 1;\r
302         }\r
303         \r
304         /**\r
305          * ACTION::forgotPassword()\r
306          * Sends a new password\r
307          * \r
308          * @param       void\r
309          * @return      void\r
310          * \r
311          */\r
312         function forgotPassword()\r
313         {\r
314                 $membername = trim(postVar('name') );\r
315                 \r
316                 if ( !MEMBER::exists($membername) )\r
317                 {\r
318                         doError(_ERROR_NOSUCHMEMBER);\r
319                 }\r
320                 \r
321                 $mem = MEMBER::createFromName($membername);\r
322                 \r
323                 // check if e-mail address is correct\r
324                 if ( $mem->getEmail() != postVar('email') )\r
325                 {\r
326                         doError(_ERROR_INCORRECTEMAIL);\r
327                 }\r
328                 \r
329                 // send activation link\r
330                 $mem->sendActivationLink('forgot');\r
331                 \r
332                 if ( !postVar('url') )\r
333                 {\r
334                         echo _MSG_ACTIVATION_SENT;\r
335                         echo '<br /><br />Return to <a href="'.$CONF['IndexURL'].'" title="'.$CONF['SiteName'].'">'.$CONF['SiteName'].'</a>';\r
336                 }\r
337                 else\r
338                 {\r
339                         redirect(postVar('url') );\r
340                 }\r
341                 exit;\r
342         }\r
343         \r
344         /**\r
345          * ACTION::doKarma()\r
346          * Handle karma votes\r
347          * \r
348          * @param       String  $type   pos or neg\r
349          * @return      Void\r
350          * \r
351          */\r
352         function doKarma($type)\r
353         {\r
354                 global $itemid, $member, $CONF, $manager;\r
355                 \r
356                 // check if itemid exists\r
357                 if ( !$manager->existsItem($itemid, 0, 0) )\r
358                 {\r
359                         doError(_ERROR_NOSUCHITEM);\r
360                 }\r
361                 \r
362                 $blogid = getBlogIDFromItemID($itemid);\r
363                 $this->checkban($blogid);\r
364                 \r
365                 $karma =& $manager->getKarma($itemid);\r
366                 \r
367                 // check if not already voted\r
368                 if ( !$karma->isVoteAllowed(serverVar('REMOTE_ADDR') ) )\r
369                 {\r
370                         doError(_ERROR_VOTEDBEFORE);\r
371                 }\r
372                 \r
373                 // check if item does allow voting\r
374                 $item =& $manager->getItem($itemid, 0, 0);\r
375                 \r
376                 if ( $item['closed'] )\r
377                 {\r
378                         doError(_ERROR_ITEMCLOSED);\r
379                 }\r
380                 \r
381                 switch ( $type )\r
382                 {\r
383                         case 'pos':\r
384                                 $karma->votePositive();\r
385                         break;\r
386                         \r
387                         case 'neg':\r
388                                 $karma->voteNegative();\r
389                         break;\r
390                 }\r
391                 \r
392                 $blog =& $manager->getBlog($blogid);\r
393                 \r
394                 // send email to notification address, if any\r
395                 if ( $blog->getNotifyAddress() && $blog->notifyOnVote() )\r
396                 {\r
397                         $message = _NOTIFY_KV_MSG . ' ' . $itemid . "\n";\r
398                         $itemLink = LINK::create_item_link(intval($itemid) );\r
399                         $temp = parse_url($itemLink);\r
400                         \r
401                         if ( !$temp['scheme'] )\r
402                         {\r
403                                 $itemLink = $CONF['IndexURL'] . $itemLink;\r
404                         }\r
405                         \r
406                         $message .= $itemLink . "\n\n";\r
407                         \r
408                         if ( $member->isLoggedIn() )\r
409                         {\r
410                                 $message .= _NOTIFY_MEMBER . ' ' . $member->getDisplayName() . ' (ID=' . $member->getID() . ")\n";\r
411                         }\r
412                         \r
413                         $message .= _NOTIFY_IP . ' ' . serverVar('REMOTE_ADDR') . "\n";\r
414                         $message .= _NOTIFY_HOST . ' ' .  gethostbyaddr(serverVar('REMOTE_ADDR'))  . "\n";\r
415                         $message .= _NOTIFY_VOTE . "\n " . $type . "\n";\r
416                         $message .= NOTIFICATION::get_mail_footer();\r
417                         \r
418                         $subject = _NOTIFY_KV_TITLE . ' ' . strip_tags($item['title']) . ' (' . $itemid . ')';\r
419                         \r
420                         $from = $member->getNotifyFromMailAddress();\r
421                         \r
422                         NOTIFICATION::mail($blog->getNotifyAddress(), $subject, $message, $from, i18n::get_current_charset());\r
423                 }\r
424                 \r
425                 $refererUrl = serverVar('HTTP_REFERER');\r
426                 \r
427                 if ( !$refererUrl )\r
428                 {\r
429                         $url = $itemLink;\r
430                 }\r
431                 else\r
432                 {\r
433                         $url = $refererUrl;\r
434                 }\r
435                 \r
436                 redirect($url);\r
437                 exit;\r
438         }\r
439         \r
440         /**\r
441          * ACTION::callPlugin()\r
442          * Calls a plugin action\r
443          * \r
444          * @param       void\r
445          * @return      void\r
446          * \r
447          */\r
448         function callPlugin()\r
449         {\r
450                 global $manager;\r
451                 \r
452                 $pluginName = 'NP_' . requestVar('name');\r
453                 $actionType = requestVar('type');\r
454                 \r
455                 // 1: check if plugin is installed\r
456                 if ( !$manager->pluginInstalled($pluginName) )\r
457                 {\r
458                         doError(_ERROR_NOSUCHPLUGIN);\r
459                 }\r
460                 \r
461                 // 2: call plugin\r
462                 $pluginObject =& $manager->getPlugin($pluginName);\r
463                 \r
464                 if ( !$pluginObject )\r
465                 {\r
466                         $error = 'Could not load plugin (see actionlog)';\r
467                 }\r
468                 else\r
469                 {\r
470                         $error = $pluginObject->doAction($actionType);\r
471                 }\r
472                 \r
473                 /*\r
474                  * doAction returns error when:\r
475                  *  - an error occurred (duh)\r
476                  *  - no actions are allowed (doAction is not implemented)\r
477                  */\r
478                 if ( $error )\r
479                 {\r
480                         doError($error);\r
481                 }\r
482                 exit;\r
483         }\r
484         \r
485         /**\r
486          * ACTION::checkban()\r
487          *  Checks if an IP or IP range is banned\r
488          * \r
489          * @param       integer $blogid\r
490          * @return      void\r
491          * \r
492          */\r
493         function checkban($blogid)\r
494         {\r
495                 // check if banned\r
496                 $ban = BAN::isBanned($blogid, serverVar('REMOTE_ADDR') );\r
497                 \r
498                 if ( $ban != 0 )\r
499                 {\r
500                         doError(_ERROR_BANNED1 . $ban->iprange . _ERROR_BANNED2 . $ban->message . _ERROR_BANNED3);\r
501                 }\r
502                 return;\r
503         }\r
504         \r
505         /**\r
506          * ACTION::updateTicket()\r
507          * Gets a new ticket\r
508          * \r
509          * @param       void\r
510          * @return      boolean FALSE\r
511          * \r
512          */\r
513         function updateTicket()\r
514         {\r
515                 global $manager;\r
516 \r
517                 if ( !$manager->checkTicket() )\r
518                 {\r
519                         echo _ERROR . ':' . _ERROR_BADTICKET;\r
520                 }\r
521                 else\r
522                 {\r
523                         echo $manager->getNewTicket();\r
524                 }\r
525                 return FALSE;\r
526         }\r
527         \r
528         /**\r
529          * ACTION::autoDraft()\r
530          * Handles AutoSaveDraft\r
531          * \r
532          * @param       void\r
533          * @return      boolean FALSE\r
534          * \r
535          */\r
536         function autoDraft()\r
537         {\r
538                 global $manager;\r
539                 \r
540                 if ( !$manager->checkTicket() )\r
541                 {\r
542                         echo _ERROR . ':' . _ERROR_BADTICKET;\r
543                 }\r
544                 else\r
545                 {\r
546                         $manager->loadClass('ITEM');\r
547                         $info = ITEM::createDraftFromRequest();\r
548                         \r
549                         if ( $info['status'] != 'error' )\r
550                         {\r
551                                 echo $info['draftid'];\r
552                         }\r
553                         else\r
554                         {\r
555                                 echo $info['message'];\r
556                         }\r
557                 }\r
558                 return FALSE;\r
559         }\r
560 }\r
561 \r