OSDN Git Service

Merge branch 'skinnable-master'
[nucleus-jp/nucleus-next.git] / nucleus / libs / ACTION.php
1 <<<<<<< HEAD
2 <?php\r
3 \r
4 /*\r
5  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
6  * Copyright (C) 2002-2009 The Nucleus Group\r
7  *\r
8  * This program is free software; you can redistribute it and/or\r
9  * modify it under the terms of the GNU General Public License\r
10  * as published by the Free Software Foundation; either version 2\r
11  * of the License, or (at your option) any later version.\r
12  * (see nucleus/documentation/index.html#license for more info)\r
13  */\r
14 /**\r
15  * Actions that can be called via action.php\r
16  *\r
17  * @license http://nucleuscms.org/license.txt GNU General Public License\r
18  * @copyright Copyright (C) 2002-2009 The Nucleus Group\r
19  * @version $Id: ACTION.php 1646 2012-01-29 10:47:32Z sakamocchi $\r
20  */\r
21 class Action\r
22 {\r
23         /**\r
24          * Action::__construct()\r
25          *  Constructor for an new ACTION object\r
26          * \r
27          * @param       void\r
28          * @return      void\r
29          */\r
30         public function __construct()\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         public 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                         case 'updateticket':\r
50                                 return $this->updateTicket();\r
51                                 break;\r
52                         case 'addcomment':\r
53                                 return $this->addComment();\r
54                                 break;\r
55                         case 'sendmessage':\r
56                                 return $this->sendMessage();\r
57                                 break;\r
58                         case 'createaccount':\r
59                                 return $this->createAccount();\r
60                                 break;\r
61                         case 'forgotpassword':\r
62                                 return $this->forgotPassword();\r
63                                 break;\r
64                         case 'votepositive':\r
65                                 return $this->doKarma('pos');\r
66                                 break;\r
67                         case 'votenegative':\r
68                                 return $this->doKarma('neg');\r
69                                 break;\r
70                         case 'plugin':\r
71                                 return $this->callPlugin();\r
72                                 break;\r
73                         default:\r
74                                 doError(_ERROR_BADACTION);\r
75                                 break;\r
76                 }\r
77                 return;\r
78         }\r
79         \r
80         /**\r
81          * Action::addComment()\r
82          * Adds a new comment to an item (if IP isn't banned)\r
83          * \r
84          * @param       void\r
85          * @return      void\r
86          */\r
87         private function addComment()\r
88         {\r
89                 global $CONF, $errormessage, $manager;\r
90                 \r
91                 $post['itemid'] = intPostVar('itemid');\r
92                 $post['user']   = postVar('user');\r
93                 $post['userid'] = postVar('userid');\r
94                 $post['email']  = postVar('email');\r
95                 $post['body']   = postVar('body');\r
96                 $post['remember'] = intPostVar('remember');\r
97                 \r
98                 // begin if: "Remember Me" box checked\r
99                 if ( $post['remember'] == 1 )\r
100                 {\r
101                         $lifetime = time() + 2592000;\r
102                         setcookie($CONF['CookiePrefix'] . 'comment_user', $post['user'], $lifetime, '/', '', 0);\r
103                         setcookie($CONF['CookiePrefix'] . 'comment_userid', $post['userid'], $lifetime, '/', '', 0);\r
104                         setcookie($CONF['CookiePrefix'] . 'comment_email', $post['email'], $lifetime, '/', '', 0);\r
105                 }\r
106                 \r
107                 $comments = new Comments($post['itemid']);\r
108                 \r
109                 $blog_id = getBlogIDFromItemID($post['itemid']);\r
110                 $this->checkban($blog_id);\r
111                 $blog =& $manager->getBlog($blog_id);\r
112                 \r
113                 // note: PreAddComment and PostAddComment gets called somewhere inside addComment\r
114                 $errormessage = $comments->addComment($blog->getCorrectTime(), $post);\r
115                 \r
116                 if ( $errormessage != '1' )\r
117                 {\r
118                         // show error message using default skin for blo\r
119                         return array(\r
120                                 'message'       => $errormessage,\r
121                                 'skinid'        => $blog->getDefaultSkin()\r
122                         );\r
123                 }\r
124                 else\r
125                 {\r
126                         // redirect when adding comments succeeded\r
127                         if ( postVar('url') )\r
128                         {\r
129                                 redirect(postVar('url') );\r
130                         }\r
131                         else\r
132                         {\r
133                                 $url = Link::create_item_link($post['itemid']);\r
134                                 redirect($url);\r
135                         }\r
136                 }\r
137                 return;\r
138         }\r
139         \r
140         /**\r
141          * Action::sendMessage()\r
142          * Sends a message from the current member to the member given as argument\r
143          * \r
144          * @param       void\r
145          * @return      void\r
146          */\r
147         private function sendMessage()\r
148         {\r
149                 global $CONF, $member;\r
150                 \r
151                 $error = $this->validateMessage();\r
152                 \r
153                 if ( $error != '' )\r
154                 {\r
155                         return array('message' => $error);\r
156                 }\r
157                 \r
158                 if ( !$member->isLoggedIn() )\r
159                 {\r
160                         $fromMail = postVar('frommail');\r
161                         $fromName = _MMAIL_FROMANON;\r
162                 }\r
163                 else\r
164                 {\r
165                         $fromMail = $member->getEmail();\r
166                         $fromName = $member->getDisplayName();\r
167                 }\r
168                 \r
169                 /* TODO: validation */\r
170                 $memberid = postVar('memberid');\r
171                 $tomem = new Member();\r
172                 $tomem->readFromId($memberid);\r
173                 \r
174                 /* TODO: validation */\r
175                 $message = postVar('message');\r
176                 $message  = _MMAIL_MSG . ' ' . $fromName . "\n"\r
177                         . '(' . _MMAIL_FROMNUC. ' ' . $CONF['IndexURL'] .") \n\n"\r
178                         . _MMAIL_MAIL . " \n\n"\r
179                         . $message;\r
180                 $message .= Notification::get_mail_footer();\r
181                 \r
182                 $title = _MMAIL_TITLE . ' ' . $fromName;\r
183                 Notification::mail($tomem->getEmail(), $title, $message, $fromMail, i18n::get_current_charset());\r
184                 \r
185                 /* TODO: validation */\r
186                 $url = postVar('url');\r
187                 if ( empty($url) )\r
188                 {\r
189                         $CONF['MemberURL'] = $CONF['IndexURL'];\r
190                         \r
191                         if ( $CONF['URLMode'] == 'pathinfo' )\r
192                         {\r
193                                 $data = array(\r
194                                         'memberid'      => $tomem->getID(),\r
195                                         'name'          => $tomem->getDisplayName()\r
196                                 );\r
197                                 $url = Link::create_link('member', $data);\r
198                         }\r
199                         else\r
200                         {\r
201                                 $url = $CONF['IndexURL'] . Link::create_member_link($tomem->getID());\r
202                         }\r
203                 }\r
204                 redirect($url );\r
205                 \r
206                 return;\r
207         }\r
208         \r
209         /**\r
210          * Action::validateMessage()\r
211          *  Checks if a mail to a member is allowed\r
212          *  Returns a string with the error message if the mail is disallowed\r
213          * \r
214          * @param               void\r
215          * @return      String  Null character string\r
216          */\r
217         private function validateMessage()\r
218         {\r
219                 global $CONF, $member, $manager;\r
220                 \r
221                 if ( !$CONF['AllowMemberMail'] )\r
222                 {\r
223                         return _ERROR_MEMBERMAILDISABLED;\r
224                 }\r
225                 \r
226                 if ( !$member->isLoggedIn() && !$CONF['NonmemberMail'] )\r
227                 {\r
228                         return _ERROR_DISALLOWED;\r
229                 }\r
230                 \r
231                 if ( !$member->isLoggedIn() && !Notification::address_validation(postVar('frommail')) )\r
232                 {\r
233                         return _ERROR_BADMAILADDRESS;\r
234                 }\r
235                 \r
236                 /*\r
237                  * let plugins do verification (any plugin which thinks the comment is\r
238                  * invalid can change 'error' to something other than '')\r
239                  */\r
240                 $result = '';\r
241                 $data = array(\r
242                         'type'  => 'membermail',\r
243                         'error' => &$result\r
244                 );\r
245                 $manager->notify('ValidateForm', $data);\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         private function createAccount()\r
258         {\r
259                 global $CONF, $manager;\r
260                 \r
261                 if ( array_key_exists('AllowMemberCreate', $CONF) && !$CONF['AllowMemberCreate'] )\r
262                 {\r
263                         doError(_ERROR_MEMBERCREATEDISABLED);\r
264                 }\r
265                 \r
266                 // evaluate content from FormExtra\r
267                 $result = 1;\r
268                 $data = array(\r
269                         'type'  => 'membermail',\r
270                         'error' => &$result\r
271                 );\r
272                 $manager->notify('ValidateForm', $data);\r
273                 \r
274                 if ( $result != 1 )\r
275                 {\r
276                         return $result;\r
277                 }\r
278                 \r
279                 // even though the member can not log in, set some random initial password. One never knows.\r
280                 srand((double) microtime() * 1000000);\r
281                 $initialPwd = md5(uniqid(rand(), TRUE) );\r
282                 \r
283                 // create member (non admin/can not login/no notes/random string as password)\r
284                 $name           = Entity::shorten(postVar('name'), 32, '');\r
285                 $relname        = postVar('realname');\r
286                 $email          = postVar('email');\r
287                 $url            = postVar('url');\r
288                 \r
289                 $r = Member::create($name, $realname, $initialPwd, $email, $url, 0, 0, '');\r
290                 \r
291                 if ( $r != 1 )\r
292                 {\r
293                         return $r;\r
294                 }\r
295                 \r
296                 // send message containing password.\r
297                 $newmem = new Member();\r
298                 $newmem->readFromName($name);\r
299                 $newmem->sendActivationLink('register');\r
300                 \r
301                 $manager->notify('PostRegister', array('member' => &$newmem) );\r
302                 \r
303                 if ( postVar('desturl') )\r
304                 {\r
305                         redirect(postVar('desturl') );\r
306                 }\r
307                 \r
308                 return 1;\r
309         }\r
310         \r
311         /**\r
312          * Action::forgotPassword()\r
313          * Sends a new password\r
314          * \r
315          * @param       void\r
316          * @return      void\r
317          */\r
318         private function forgotPassword()\r
319         {\r
320                 $membername = trim(postVar('name') );\r
321                 \r
322                 if ( !Member::exists($membername) )\r
323                 {\r
324                         doError(_ERROR_NOSUCHMEMBER);\r
325                 }\r
326                 \r
327                 $mem = Member::createFromName($membername);\r
328                 \r
329                 // check if e-mail address is correct\r
330                 $email = postVar('email');\r
331                 if ( $mem->getEmail() != $email )\r
332                 {\r
333                         doError(_ERROR_INCORRECTEMAIL);\r
334                 }\r
335                 \r
336                 // send activation link\r
337                 $mem->sendActivationLink('forgot');\r
338                 \r
339                 // redirection\r
340                 $url = postVar('url');\r
341                 if ( !empty($url) )\r
342                 {\r
343                         redirect(postVar('url') );\r
344                 }\r
345                 else\r
346                 {\r
347                         echo _MSG_ACTIVATION_SENT;\r
348                         echo "<br />"\r
349                             . "<br />"\r
350                             . "Return to <a href=\"{$CONF['IndexURL']}\" title=\"{$CONF['SiteName']}\">{$CONF['SiteName']}</a>\n";\r
351                 }\r
352                 \r
353                 return;\r
354         }\r
355         \r
356         /**\r
357          * Action::doKarma()\r
358          * Handle karma votes\r
359          * \r
360          * @param       string  $type   pos or neg\r
361          * @return      Void\r
362          */\r
363         private function doKarma($type)\r
364         {\r
365                 global $itemid, $member, $CONF, $manager;\r
366                 \r
367                 // check if itemid exists\r
368                 if ( !$manager->existsItem($itemid, 0, 0) )\r
369                 {\r
370                         doError(_ERROR_NOSUCHITEM);\r
371                 }\r
372                 \r
373                 $blogid = getBlogIDFromItemID($itemid);\r
374                 $this->checkban($blogid);\r
375                 \r
376                 $karma =& $manager->getKarma($itemid);\r
377                 \r
378                 // check if not already voted\r
379                 if ( !$karma->isVoteAllowed(serverVar('REMOTE_ADDR') ) )\r
380                 {\r
381                         doError(_ERROR_VOTEDBEFORE);\r
382                 }\r
383                 \r
384                 // check if item does allow voting\r
385                 $item =& $manager->getItem($itemid, 0, 0);\r
386                 \r
387                 if ( $item['closed'] )\r
388                 {\r
389                         doError(_ERROR_ITEMCLOSED);\r
390                 }\r
391                 \r
392                 switch ( $type )\r
393                 {\r
394                         case 'pos':\r
395                                 $karma->votePositive();\r
396                         break;\r
397                         \r
398                         case 'neg':\r
399                                 $karma->voteNegative();\r
400                         break;\r
401                 }\r
402                 \r
403                 $blog =& $manager->getBlog($blogid);\r
404                 \r
405                 // send email to notification address, if any\r
406                 if ( $blog->getNotifyAddress() && $blog->notifyOnVote() )\r
407                 {\r
408                         $message = _NOTIFY_KV_MSG . ' ' . $itemid . "\n";\r
409                         $itemLink = Link::create_item_link((integer)$itemid);\r
410                         $temp = parse_url($itemLink);\r
411                         \r
412                         if ( !$temp['scheme'] )\r
413                         {\r
414                                 $itemLink = $CONF['IndexURL'] . $itemLink;\r
415                         }\r
416                         \r
417                         $message .= $itemLink . "\n\n";\r
418                         \r
419                         if ( $member->isLoggedIn() )\r
420                         {\r
421                                 $message .= _NOTIFY_MEMBER . ' ' . $member->getDisplayName() . ' (ID=' . $member->getID() . ")\n";\r
422                         }\r
423                         \r
424                         $message .= _NOTIFY_IP . ' ' . serverVar('REMOTE_ADDR') . "\n";\r
425                         $message .= _NOTIFY_HOST . ' ' .  gethostbyaddr(serverVar('REMOTE_ADDR'))  . "\n";\r
426                         $message .= _NOTIFY_VOTE . "\n " . $type . "\n";\r
427                         $message .= Notification::get_mail_footer();\r
428                         \r
429                         $subject = _NOTIFY_KV_TITLE . ' ' . strip_tags($item['title']) . ' (' . $itemid . ')';\r
430                         \r
431                         $from = $member->getNotifyFromMailAddress();\r
432                         \r
433                         Notification::mail($blog->getNotifyAddress(), $subject, $message, $from, i18n::get_current_charset());\r
434                 }\r
435                 \r
436                 $refererUrl = serverVar('HTTP_REFERER');\r
437                 \r
438                 if ( !$refererUrl )\r
439                 {\r
440                         $url = $itemLink;\r
441                 }\r
442                 else\r
443                 {\r
444                         $url = $refererUrl;\r
445                 }\r
446                 \r
447                 redirect($url);\r
448                 return;\r
449         }\r
450         \r
451         /**\r
452          * Action::callPlugin()\r
453          * Calls a plugin action\r
454          * \r
455          * @param       void\r
456          * @return      void\r
457          */\r
458         private function callPlugin()\r
459         {\r
460                 global $manager;\r
461                 \r
462                 $name = requestVar('name');\r
463                 $pluginName = "NP_{$name}";\r
464                 $actionType = requestVar('type');\r
465                 \r
466                 // 1: check if plugin is installed\r
467                 if ( !$manager->pluginInstalled($pluginName) )\r
468                 {\r
469                         doError(_ERROR_NOSUCHPLUGIN);\r
470                 }\r
471                 \r
472                 // 2: call plugin\r
473                 $pluginObject =& $manager->getPlugin($pluginName);\r
474                 if ( !$pluginObject )\r
475                 {\r
476                         $error = 'Could not load plugin (see actionlog)';\r
477                 }\r
478                 else\r
479                 {\r
480                         $error = $pluginObject->doAction($actionType);\r
481                 }\r
482                 \r
483                 /*\r
484                  * doAction returns error when:\r
485                  *  - an error occurred (duh)\r
486                  *  - no actions are allowed (doAction is not implemented)\r
487                  */\r
488                 if ( $error )\r
489                 {\r
490                         doError($error);\r
491                 }\r
492                 \r
493                 return;\r
494         }\r
495         \r
496         /**\r
497          * Action::checkban()\r
498          *  Checks if an IP or IP range is banned\r
499          * \r
500          * @param       integer $blogid\r
501          * @return      void\r
502          */\r
503         private function checkban($blogid)\r
504         {\r
505                 // check if banned\r
506                 $ban = Ban::isBanned($blogid, serverVar('REMOTE_ADDR') );\r
507                 \r
508                 if ( $ban != 0 )\r
509                 {\r
510                         doError(_ERROR_BANNED1 . $ban->iprange . _ERROR_BANNED2 . $ban->message . _ERROR_BANNED3);\r
511                 }\r
512                 \r
513                 return;\r
514         }\r
515         \r
516         /**\r
517          * Action::updateTicket()\r
518          * Gets a new ticket\r
519          * \r
520          * @param       void\r
521          * @return      boolean FALSE\r
522          */\r
523         private function updateTicket()\r
524         {\r
525                 global $manager;\r
526                 \r
527                 if ( !$manager->checkTicket() )\r
528                 {\r
529                         echo _ERROR . ':' . _ERROR_BADTICKET;\r
530                 }\r
531                 else\r
532                 {\r
533                         echo $manager->getNewTicket();\r
534                 }\r
535                 \r
536                 return FALSE;\r
537         }\r
538         \r
539         /**\r
540          * Action::autoDraft()\r
541          * Handles AutoSaveDraft\r
542          * \r
543          * @param       void\r
544          * @return      boolean FALSE\r
545          */\r
546         private function autoDraft()\r
547         {\r
548                 global $manager;\r
549                 \r
550                 if ( !$manager->checkTicket() )\r
551                 {\r
552                         echo _ERROR . ':' . _ERROR_BADTICKET;\r
553                 }\r
554                 else\r
555                 {\r
556                         $manager->loadClass('ITEM');\r
557                         $info = Item::createDraftFromRequest();\r
558                         \r
559                         if ( $info['status'] != 'error' )\r
560                         {\r
561                                 echo $info['draftid'];\r
562                         }\r
563                         else\r
564                         {\r
565                                 echo $info['message'];\r
566                         }\r
567                 }\r
568                 \r
569                 return FALSE;\r
570         }\r
571 }\r
572 \r
573 =======
574 <?php
575
576 /*
577  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
578  * Copyright (C) 2002-2009 The Nucleus Group
579  *
580  * This program is free software; you can redistribute it and/or
581  * modify it under the terms of the GNU General Public License
582  * as published by the Free Software Foundation; either version 2
583  * of the License, or (at your option) any later version.
584  * (see nucleus/documentation/index.html#license for more info)
585  */
586 /**
587  * Actions that can be called via action.php
588  *
589  * @license http://nucleuscms.org/license.txt GNU General Public License
590  * @copyright Copyright (C) 2002-2009 The Nucleus Group
591  * @version $Id: ACTION.php 1646 2012-01-29 10:47:32Z sakamocchi $
592  */
593 class Action
594 {
595         /**
596          * Action::__construct()
597          *  Constructor for an new ACTION object
598          * 
599          * @param       void
600          * @return      void
601          */
602         public function __construct()
603         {
604                 return;
605         }
606         
607         /**
608          * Action::doAction()
609          *  Calls functions that handle an action called from action.php
610          * 
611          * @param       string  $action action type
612          * @return      mixed
613          */
614         public function doAction($action)
615         {
616                 switch ( $action )
617                 {
618                         case 'autodraft':
619                                 return $this->autoDraft();
620                                 break;
621                         case 'updateticket':
622                                 return $this->updateTicket();
623                                 break;
624                         case 'addcomment':
625                                 return $this->addComment();
626                                 break;
627                         case 'sendmessage':
628                                 return $this->sendMessage();
629                                 break;
630                         case 'createaccount':
631                                 return $this->createAccount();
632                                 break;
633                         case 'forgotpassword':
634                                 return $this->forgotPassword();
635                                 break;
636                         case 'votepositive':
637                                 return $this->doKarma('pos');
638                                 break;
639                         case 'votenegative':
640                                 return $this->doKarma('neg');
641                                 break;
642                         case 'plugin':
643                                 return $this->callPlugin();
644                                 break;
645                         default:
646                                 doError(_ERROR_BADACTION);
647                                 break;
648                 }
649                 return;
650         }
651         
652         /**
653          * Action::addComment()
654          * Adds a new comment to an item (if IP isn't banned)
655          * 
656          * @param       void
657          * @return      void
658          */
659         private function addComment()
660         {
661                 global $CONF, $errormessage, $manager;
662                 
663                 $post['itemid'] = intPostVar('itemid');
664                 $post['user']   = postVar('user');
665                 $post['userid'] = postVar('userid');
666                 $post['email']  = postVar('email');
667                 $post['body']   = postVar('body');
668                 $post['remember'] = intPostVar('remember');
669                 
670                 // begin if: "Remember Me" box checked
671                 if ( $post['remember'] == 1 )
672                 {
673                         $lifetime = time() + 2592000;
674                         setcookie($CONF['CookiePrefix'] . 'comment_user', $post['user'], $lifetime, '/', '', 0);
675                         setcookie($CONF['CookiePrefix'] . 'comment_userid', $post['userid'], $lifetime, '/', '', 0);
676                         setcookie($CONF['CookiePrefix'] . 'comment_email', $post['email'], $lifetime, '/', '', 0);
677                 }
678                 
679                 $item =& $manager->getItem($post['itemid'], 0, 0);
680                 $this->checkban($item['blogid']);
681                 $blog =& $manager->getBlog($item['blogid']);
682                 
683                 // note: PreAddComment and PostAddComment gets called somewhere inside addComment
684                 $comments = new Comments($post['itemid']);
685                 $errormessage = $comments->addComment($blog->getCorrectTime(), $post);
686                 
687                 if ( $errormessage != '1' )
688                 {
689                         // show error message using default skin for blo
690                         return array(
691                                 'message'       => $errormessage,
692                                 'skinid'        => $blog->getDefaultSkin()
693                         );
694                 }
695                 else
696                 {
697                         // redirect when adding comments succeeded
698                         if ( postVar('url') )
699                         {
700                                 redirect(postVar('url') );
701                         }
702                         else
703                         {
704                                 $url = Link::create_item_link($post['itemid']);
705                                 redirect($url);
706                         }
707                 }
708                 return;
709         }
710         
711         /**
712          * Action::sendMessage()
713          * Sends a message from the current member to the member given as argument
714          * 
715          * @param       void
716          * @return      void
717          */
718         private function sendMessage()
719         {
720                 global $CONF, $member;
721                 
722                 $error = $this->validateMessage();
723                 
724                 if ( $error != '' )
725                 {
726                         return array('message' => $error);
727                 }
728                 
729                 if ( !$member->isLoggedIn() )
730                 {
731                         $fromMail = postVar('frommail');
732                         $fromName = _MMAIL_FROMANON;
733                 }
734                 else
735                 {
736                         $fromMail = $member->getEmail();
737                         $fromName = $member->getDisplayName();
738                 }
739                 
740                 /* TODO: validation */
741                 $memberid = postVar('memberid');
742                 $tomem = new Member();
743                 $tomem->readFromId($memberid);
744                 
745                 /* TODO: validation */
746                 $message = postVar('message');
747                 $message  = _MMAIL_MSG . ' ' . $fromName . "\n"
748                         . '(' . _MMAIL_FROMNUC. ' ' . $CONF['IndexURL'] .") \n\n"
749                         . _MMAIL_MAIL . " \n\n"
750                         . $message;
751                 $message .= Notification::get_mail_footer();
752                 
753                 $title = _MMAIL_TITLE . ' ' . $fromName;
754                 Notification::mail($tomem->getEmail(), $title, $message, $fromMail, i18n::get_current_charset());
755                 
756                 /* TODO: validation */
757                 $url = postVar('url');
758                 if ( empty($url) )
759                 {
760                         $CONF['MemberURL'] = $CONF['IndexURL'];
761                         
762                         if ( $CONF['URLMode'] == 'pathinfo' )
763                         {
764                                 $data = array(
765                                         'memberid'      => $tomem->getID(),
766                                         'name'          => $tomem->getDisplayName()
767                                 );
768                                 $url = Link::create_link('member', $data);
769                         }
770                         else
771                         {
772                                 $url = $CONF['IndexURL'] . Link::create_member_link($tomem->getID());
773                         }
774                 }
775                 redirect($url );
776                 
777                 return;
778         }
779         
780         /**
781          * Action::validateMessage()
782          *  Checks if a mail to a member is allowed
783          *  Returns a string with the error message if the mail is disallowed
784          * 
785          * @param               void
786          * @return      String  Null character string
787          */
788         private function validateMessage()
789         {
790                 global $CONF, $member, $manager;
791                 
792                 if ( !$CONF['AllowMemberMail'] )
793                 {
794                         return _ERROR_MEMBERMAILDISABLED;
795                 }
796                 
797                 if ( !$member->isLoggedIn() && !$CONF['NonmemberMail'] )
798                 {
799                         return _ERROR_DISALLOWED;
800                 }
801                 
802                 if ( !$member->isLoggedIn() && !Notification::address_validation(postVar('frommail')) )
803                 {
804                         return _ERROR_BADMAILADDRESS;
805                 }
806                 
807                 /*
808                  * let plugins do verification (any plugin which thinks the comment is
809                  * invalid can change 'error' to something other than '')
810                  */
811                 $result = '';
812                 $data = array(
813                         'type'  => 'membermail',
814                         'error' => &$result
815                 );
816                 $manager->notify('ValidateForm', $data);
817                 
818                 return $result;
819         }
820         
821         /**
822          * Action::createAccount()
823          * Creates a new user account
824          *  
825          * @param       void
826          * @return      mixed
827          */
828         private function createAccount()
829         {
830                 global $CONF, $manager;
831                 
832                 if ( array_key_exists('AllowMemberCreate', $CONF) && !$CONF['AllowMemberCreate'] )
833                 {
834                         doError(_ERROR_MEMBERCREATEDISABLED);
835                         return;
836                 }
837                 
838                 // evaluate content from FormExtra
839                 $result = 1;
840                 $data = array(
841                         'type'  => 'membermail',
842                         'error' => &$result
843                 );
844                 $manager->notify('ValidateForm', $data);
845                 
846                 if ( $result != 1 )
847                 {
848                         return $result;
849                 }
850                 
851                 // even though the member can not log in, set some random initial password. One never knows.
852                 srand((double) microtime() * 1000000);
853                 $initialPwd = md5(uniqid(rand(), TRUE) );
854                 
855                 // create member (non admin/can not login/no notes/random string as password)
856                 $name           = Entity::shorten(postVar('name'), 32, '');
857                 $relname        = postVar('realname');
858                 $email          = postVar('email');
859                 $url            = postVar('url');
860                 
861                 $r = Member::create($name, $realname, $initialPwd, $email, $url, 0, 0, '');
862                 
863                 if ( $r != 1 )
864                 {
865                         return $r;
866                 }
867                 
868                 // send message containing password.
869                 $newmem = new Member();
870                 $newmem->readFromName($name);
871                 $newmem->sendActivationLink('register');
872
873                 $data = array('member' => $newmem);
874                 $manager->notify('PostRegister', $data);
875                 
876                 if ( postVar('desturl') )
877                 {
878                         redirect(postVar('desturl') );
879                 }
880                 
881                 return 1;
882         }
883         
884         /**
885          * Action::forgotPassword()
886          * Sends a new password
887          * 
888          * @param       void
889          * @return      void
890          */
891         private function forgotPassword()
892         {
893                 $membername = trim(postVar('name') );
894                 
895                 if ( !Member::exists($membername) )
896                 {
897                         doError(_ERROR_NOSUCHMEMBER);
898                         return;
899                 }
900                 
901                 $mem = Member::createFromName($membername);
902                 
903                 // check if e-mail address is correct
904                 $email = postVar('email');
905                 if ( $mem->getEmail() != $email )
906                 {
907                         doError(_ERROR_INCORRECTEMAIL);
908                         return;
909                 }
910                 
911                 // send activation link
912                 $mem->sendActivationLink('forgot');
913                 
914                 // redirection
915                 $url = postVar('url');
916                 if ( !empty($url) )
917                 {
918                         redirect(postVar('url') );
919                 }
920                 else
921                 {
922                         echo _MSG_ACTIVATION_SENT;
923                         echo "<br />"
924                             . "<br />"
925                             . "Return to <a href=\"{$CONF['IndexURL']}\" title=\"{$CONF['SiteName']}\">{$CONF['SiteName']}</a>\n";
926                 }
927                 
928                 return;
929         }
930         
931         /**
932          * Action::doKarma()
933          * Handle karma votes
934          * 
935          * @param       string  $type   pos or neg
936          * @return      Void
937          */
938         private function doKarma($type)
939         {
940                 global $itemid, $member, $CONF, $manager;
941                 
942                 // check if itemid exists
943                 if ( !$manager->existsItem($itemid, 0, 0) )
944                 {
945                         doError(_ERROR_NOSUCHITEM);
946                         return;
947                 }
948                 
949                 $item =& $manager->getItem($itemid, 0, 0);
950                 $this->checkban($item['blogid']);
951                 
952                 $karma =& $manager->getKarma($itemid);
953                 
954                 // check if not already voted
955                 if ( !$karma->isVoteAllowed(serverVar('REMOTE_ADDR') ) )
956                 {
957                         doError(_ERROR_VOTEDBEFORE);
958                         return;
959                 }
960                 
961                 // check if item does allow voting
962                 $item =& $manager->getItem($itemid, 0, 0);
963                 
964                 if ( $item['closed'] )
965                 {
966                         doError(_ERROR_ITEMCLOSED);
967                         return;
968                 }
969                 
970                 switch ( $type )
971                 {
972                         case 'pos':
973                                 $karma->votePositive();
974                         break;
975                         
976                         case 'neg':
977                                 $karma->voteNegative();
978                         break;
979                 }
980                 
981                 $blog =& $manager->getBlog($blogid);
982                 
983                 // send email to notification address, if any
984                 if ( $blog->getNotifyAddress() && $blog->notifyOnVote() )
985                 {
986                         $message = _NOTIFY_KV_MSG . ' ' . $itemid . "\n";
987                         $itemLink = Link::create_item_link((integer)$itemid);
988                         $temp = parse_url($itemLink);
989                         
990                         if ( !$temp['scheme'] )
991                         {
992                                 $itemLink = $CONF['IndexURL'] . $itemLink;
993                         }
994                         
995                         $message .= $itemLink . "\n\n";
996                         
997                         if ( $member->isLoggedIn() )
998                         {
999                                 $message .= _NOTIFY_MEMBER . ' ' . $member->getDisplayName() . ' (ID=' . $member->getID() . ")\n";
1000                         }
1001                         
1002                         $message .= _NOTIFY_IP . ' ' . serverVar('REMOTE_ADDR') . "\n";
1003                         $message .= _NOTIFY_HOST . ' ' .  gethostbyaddr(serverVar('REMOTE_ADDR'))  . "\n";
1004                         $message .= _NOTIFY_VOTE . "\n " . $type . "\n";
1005                         $message .= Notification::get_mail_footer();
1006                         
1007                         $subject = _NOTIFY_KV_TITLE . ' ' . strip_tags($item['title']) . ' (' . $itemid . ')';
1008                         
1009                         $from = $member->getNotifyFromMailAddress();
1010                         
1011                         Notification::mail($blog->getNotifyAddress(), $subject, $message, $from, i18n::get_current_charset());
1012                 }
1013                 
1014                 $refererUrl = serverVar('HTTP_REFERER');
1015                 
1016                 if ( !$refererUrl )
1017                 {
1018                         $url = $itemLink;
1019                 }
1020                 else
1021                 {
1022                         $url = $refererUrl;
1023                 }
1024                 
1025                 redirect($url);
1026                 return;
1027         }
1028         
1029         /**
1030          * Action::callPlugin()
1031          * Calls a plugin action
1032          * 
1033          * @param       void
1034          * @return      void
1035          */
1036         private function callPlugin()
1037         {
1038                 global $manager;
1039                 
1040                 $name = requestVar('name');
1041                 $pluginName = "NP_{$name}";
1042                 $actionType = requestVar('type');
1043                 
1044                 // 1: check if plugin is installed
1045                 if ( !$manager->pluginInstalled($pluginName) )
1046                 {
1047                         doError(_ERROR_NOSUCHPLUGIN);
1048                         return;
1049                 }
1050                 
1051                 // 2: call plugin
1052                 $pluginObject =& $manager->getPlugin($pluginName);
1053                 if ( !$pluginObject )
1054                 {
1055                         $error = 'Could not load plugin (see actionlog)';
1056                 }
1057                 else
1058                 {
1059                         $error = $pluginObject->doAction($actionType);
1060                 }
1061                 
1062                 /*
1063                  * doAction returns error when:
1064                  *  - an error occurred (duh)
1065                  *  - no actions are allowed (doAction is not implemented)
1066                  */
1067                 if ( $error )
1068                 {
1069                         doError($error);
1070                         return;
1071                 }
1072                 
1073                 return;
1074         }
1075         
1076         /**
1077          * Action::checkban()
1078          *  Checks if an IP or IP range is banned
1079          * 
1080          * @param       integer $blogid
1081          * @return      void
1082          */
1083         private function checkban($blogid)
1084         {
1085                 // check if banned
1086                 $ban = Ban::isBanned($blogid, serverVar('REMOTE_ADDR') );
1087                 
1088                 if ( $ban != 0 )
1089                 {
1090                         doError(_ERROR_BANNED1 . $ban->iprange . _ERROR_BANNED2 . $ban->message . _ERROR_BANNED3);
1091                         return;
1092                 }
1093                 
1094                 return;
1095         }
1096         
1097         /**
1098          * Action::updateTicket()
1099          * Gets a new ticket
1100          * 
1101          * @param       void
1102          * @return      boolean FALSE
1103          */
1104         private function updateTicket()
1105         {
1106                 global $manager;
1107                 
1108                 if ( !$manager->checkTicket() )
1109                 {
1110                         echo _ERROR . ':' . _ERROR_BADTICKET;
1111                 }
1112                 else
1113                 {
1114                         echo $manager->getNewTicket();
1115                 }
1116                 
1117                 return FALSE;
1118         }
1119         
1120         /**
1121          * Action::autoDraft()
1122          * Handles AutoSaveDraft
1123          * 
1124          * @param       void
1125          * @return      boolean FALSE
1126          */
1127         private function autoDraft()
1128         {
1129                 global $manager;
1130                 
1131                 if ( !$manager->checkTicket() )
1132                 {
1133                         echo _ERROR . ':' . _ERROR_BADTICKET;
1134                 }
1135                 else
1136                 {
1137                         $manager->loadClass('ITEM');
1138                         $info = Item::createDraftFromRequest();
1139                         
1140                         if ( $info['status'] != 'error' )
1141                         {
1142                                 echo $info['draftid'];
1143                         }
1144                         else
1145                         {
1146                                 echo $info['message'];
1147                         }
1148                 }
1149                 
1150                 return FALSE;
1151         }
1152 }
1153
1154 >>>>>>> skinnable-master