xref: /plugin/recommend/action.php (revision 2937e9a57baddb95935c7f34017ae49649250ec7)
14654e4deSAdrian Lang<?php
24654e4deSAdrian Lang
34654e4deSAdrian Langclass action_plugin_recommend extends DokuWiki_Action_Plugin {
44654e4deSAdrian Lang
5*2937e9a5SAnna Dabrowska    public function register(Doku_Event_Handler $controller) {
670f4a435SAdrian Lang        foreach (array('ACTION_ACT_PREPROCESS', 'AJAX_CALL_UNKNOWN',
770f4a435SAdrian Lang                       'TPL_ACT_UNKNOWN') as $event) {
8*2937e9a5SAnna Dabrowska            $controller->register_hook($event, 'BEFORE', $this, 'handle');
94654e4deSAdrian Lang        }
104654e4deSAdrian Lang    }
114654e4deSAdrian Lang
12*2937e9a5SAnna Dabrowska    public function handle(Doku_Event $event) {
13*2937e9a5SAnna Dabrowska        if ($event->data !=='recommend') {
144654e4deSAdrian Lang            return;
154654e4deSAdrian Lang        }
164654e4deSAdrian Lang
174654e4deSAdrian Lang        $event->preventDefault();
184654e4deSAdrian Lang
194654e4deSAdrian Lang        if ($event->name === 'ACTION_ACT_PREPROCESS') {
204654e4deSAdrian Lang            return;
214654e4deSAdrian Lang        }
224654e4deSAdrian Lang
234654e4deSAdrian Lang        $event->stopPropagation();
244654e4deSAdrian Lang
2570f4a435SAdrian Lang        if ($_SERVER['REQUEST_METHOD'] == 'POST' &&
2670f4a435SAdrian Lang            isset($_POST['sectok']) &&
2770f4a435SAdrian Lang            !($err = $this->_handle_post())) {
2870f4a435SAdrian Lang            if ($event->name === 'AJAX_CALL_UNKNOWN') {
2970f4a435SAdrian Lang                /* To signal success to AJAX. */
3070f4a435SAdrian Lang                header('HTTP/1.1 204 No Content');
314654e4deSAdrian Lang                return;
324654e4deSAdrian Lang            }
3370f4a435SAdrian Lang            echo 'Thanks for recommending our site.';
3470f4a435SAdrian Lang            return;
3570f4a435SAdrian Lang        }
3670f4a435SAdrian Lang        /* To display msgs even via AJAX. */
3770f4a435SAdrian Lang        echo ' ';
3870f4a435SAdrian Lang        if (isset($err)) {
3970f4a435SAdrian Lang            msg($err, -1);
4070f4a435SAdrian Lang        }
41*2937e9a5SAnna Dabrowska        echo $this->getForm();
424654e4deSAdrian Lang    }
434654e4deSAdrian Lang
44*2937e9a5SAnna Dabrowska    /**
45*2937e9a5SAnna Dabrowska     * Returns rendered form
46*2937e9a5SAnna Dabrowska     *
47*2937e9a5SAnna Dabrowska     * @return string
48*2937e9a5SAnna Dabrowska     */
49*2937e9a5SAnna Dabrowska    protected function getForm()
50*2937e9a5SAnna Dabrowska    {
51*2937e9a5SAnna Dabrowska        global $INPUT;
52*2937e9a5SAnna Dabrowska
53*2937e9a5SAnna Dabrowska        $id = getID(); // we may run in AJAX context
54*2937e9a5SAnna Dabrowska        if ($id === '') throw new \RuntimeException('No ID given');
55*2937e9a5SAnna Dabrowska
56*2937e9a5SAnna Dabrowska        $form = new \dokuwiki\Form\Form([
57*2937e9a5SAnna Dabrowska            'action' => wl($id, ['do' => 'recommend'], false, '&'),
58*2937e9a5SAnna Dabrowska            'id' => 'recommend__plugin',
59*2937e9a5SAnna Dabrowska        ]);
60*2937e9a5SAnna Dabrowska        $form->setHiddenField('id', $id); // we need it for the ajax call
61*2937e9a5SAnna Dabrowska
62*2937e9a5SAnna Dabrowska        if ($INPUT->server->has('REMOTE_USER')) {
63e596e22bSAdrian Lang            global $USERINFO;
64*2937e9a5SAnna Dabrowska            $form->setHiddenField('s_name', $USERINFO['name']);
65*2937e9a5SAnna Dabrowska            $form->setHiddenField('s_email', $USERINFO['mail']);
66e596e22bSAdrian Lang        } else {
67*2937e9a5SAnna Dabrowska            $form->addTextInput('s_name', $this->getLang('yourname'))->addClass('edit');
68*2937e9a5SAnna Dabrowska            $form->addTextInput('s_email', $this->getLang('youremailaddress'))->addClass('edit');
69e596e22bSAdrian Lang        }
70e596e22bSAdrian Lang
71*2937e9a5SAnna Dabrowska        $form->addTextInput('r_email', $this->getLang('recipients'))->addClass('edit');
72*2937e9a5SAnna Dabrowska        $form->addTextInput('subject', $this->getLang('subject'))->addClass('edit');
73*2937e9a5SAnna Dabrowska        $form->addTextarea('comment', $this->getLang('message'))->attr('rows', '8')->attr('cols', '10')->addClass('edit');
74*2937e9a5SAnna Dabrowska
75*2937e9a5SAnna Dabrowska        /** @var helper_plugin_captcha $captcha */
76*2937e9a5SAnna Dabrowska        $captcha = plugin_load('helper', 'captcha');
77*2937e9a5SAnna Dabrowska        if ($captcha) $form->addHTML($captcha->getHTML());
78*2937e9a5SAnna Dabrowska
79*2937e9a5SAnna Dabrowska        $form->addTagOpen('div')->addClass('buttons');
80*2937e9a5SAnna Dabrowska        $form->addButton('submit', $this->getLang('send'))->attr('type', 'submit');
81*2937e9a5SAnna Dabrowska        $form->addButton('reset', $this->getLang('cancel'))->attr('type', 'reset');
82*2937e9a5SAnna Dabrowska        $form->addTagClose('div');
83*2937e9a5SAnna Dabrowska
84*2937e9a5SAnna Dabrowska        return $form->toHTML();
854654e4deSAdrian Lang    }
864654e4deSAdrian Lang
87*2937e9a5SAnna Dabrowska    /**
88*2937e9a5SAnna Dabrowska     * Handles form submission and returns error state: error message or else false.
89*2937e9a5SAnna Dabrowska     *
90*2937e9a5SAnna Dabrowska     * @return string|false
91*2937e9a5SAnna Dabrowska     * @throws Exception
92*2937e9a5SAnna Dabrowska     */
93*2937e9a5SAnna Dabrowska    protected function _handle_post()
94*2937e9a5SAnna Dabrowska    {
95*2937e9a5SAnna Dabrowska        if (!checkSecurityToken()) {
96*2937e9a5SAnna Dabrowska            throw new \Exception('Security token did not match');
97*2937e9a5SAnna Dabrowska        }
98*2937e9a5SAnna Dabrowska
99*2937e9a5SAnna Dabrowska        global $INPUT;
100*2937e9a5SAnna Dabrowska
101e596e22bSAdrian Lang        $helper = null;
102e596e22bSAdrian Lang        if (@is_dir(DOKU_PLUGIN.'captcha')) $helper = plugin_load('helper','captcha');
103e596e22bSAdrian Lang        if (!is_null($helper) && $helper->isEnabled() && !$helper->check()) {
104e596e22bSAdrian Lang            return 'Wrong captcha';
105e596e22bSAdrian Lang        }
106e596e22bSAdrian Lang
1072cdbf48fSAdrian Lang        /* Validate input. */
108*2937e9a5SAnna Dabrowska        $recipient = $INPUT->str('r_email');
109*2937e9a5SAnna Dabrowska        if (!$recipient || !mail_isvalid($recipient)) {
110e596e22bSAdrian Lang            return 'Invalid recipient email address submitted';
1114654e4deSAdrian Lang        }
112e596e22bSAdrian Lang
113e596e22bSAdrian Lang        if (!isset($_POST['s_email']) || !mail_isvalid($_POST['s_email'])) {
114e596e22bSAdrian Lang            return 'Invalid sender email address submitted';
115e596e22bSAdrian Lang        }
116c18a4184SAdrian Lang        if (!isset($_POST['s_name']) || trim($_POST['s_name']) === '') {
117c18a4184SAdrian Lang            return 'Invalid sender name submitted';
118c18a4184SAdrian Lang        }
119c18a4184SAdrian Lang        $s_name = $_POST['s_name'];
120c18a4184SAdrian Lang        $sender = $s_name . ' <' . $_POST['s_email'] . '>';
1214654e4deSAdrian Lang
122*2937e9a5SAnna Dabrowska        $id = $INPUT->filter('cleanID')->str('id');
123*2937e9a5SAnna Dabrowska        if ($id === '' || !page_exists($id)) throw new \Exception($this->getLang('err_page'));
1244654e4deSAdrian Lang
125*2937e9a5SAnna Dabrowska        $comment = $INPUT->str('comment');
1264654e4deSAdrian Lang
1272cdbf48fSAdrian Lang        /* Prepare mail text. */
1284654e4deSAdrian Lang        $mailtext = file_get_contents(dirname(__FILE__).'/template.txt');
1294654e4deSAdrian Lang
1304654e4deSAdrian Lang        global $conf;
131*2937e9a5SAnna Dabrowska        foreach (array('NAME' => $recipient,
132*2937e9a5SAnna Dabrowska                       'PAGE' => $id,
1334654e4deSAdrian Lang                       'SITE' => $conf['title'],
134*2937e9a5SAnna Dabrowska                       'URL'  => wl($id, '', true),
1354654e4deSAdrian Lang                       'COMMENT' => $comment,
136c18a4184SAdrian Lang                       'AUTHOR' => $s_name) as $var => $val) {
1374654e4deSAdrian Lang            $mailtext = str_replace('@' . $var . '@', $val, $mailtext);
1384654e4deSAdrian Lang        }
1392cdbf48fSAdrian Lang        /* Limit to two empty lines. */
1404654e4deSAdrian Lang        $mailtext = preg_replace('/\n{4,}/', "\n\n\n", $mailtext);
1414654e4deSAdrian Lang
1422cdbf48fSAdrian Lang        /* Perform stuff. */
143*2937e9a5SAnna Dabrowska        $this->sendMail($recipient, $mailtext, $sender);
144*2937e9a5SAnna Dabrowska        /** @var helper_plugin_recommend_log $log */
145*2937e9a5SAnna Dabrowska        $log = new helper_plugin_recommend_log(date('Y-m'));
146*2937e9a5SAnna Dabrowska        $log->writeEntry($id, $sender, $recipient, $comment);
147*2937e9a5SAnna Dabrowska
14870f4a435SAdrian Lang        return false;
1494654e4deSAdrian Lang    }
150*2937e9a5SAnna Dabrowska
151*2937e9a5SAnna Dabrowska    /**
152*2937e9a5SAnna Dabrowska     * @param string $recipient
153*2937e9a5SAnna Dabrowska     * @param string $mailtext
154*2937e9a5SAnna Dabrowska     * @param string $sender
155*2937e9a5SAnna Dabrowska     * @return void
156*2937e9a5SAnna Dabrowska     */
157*2937e9a5SAnna Dabrowska    protected function sendMail($recipient, $mailtext, $sender)
158*2937e9a5SAnna Dabrowska    {
159*2937e9a5SAnna Dabrowska        global $INPUT;
160*2937e9a5SAnna Dabrowska
161*2937e9a5SAnna Dabrowska        $mailer = new Mailer();
162*2937e9a5SAnna Dabrowska        $mailer->bcc($recipient);
163*2937e9a5SAnna Dabrowska        $mailer->from($sender);
164*2937e9a5SAnna Dabrowska
165*2937e9a5SAnna Dabrowska        $subject = $INPUT->str('subject');
166*2937e9a5SAnna Dabrowska        $mailer->subject($subject);
167*2937e9a5SAnna Dabrowska        $mailer->setBody($mailtext);
168*2937e9a5SAnna Dabrowska        $mailer->send();
169*2937e9a5SAnna Dabrowska    }
1704654e4deSAdrian Lang}
171