OSDN Git Service

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