Completed
Pull Request — master (#30)
by Goffy
02:25
created

subscription.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * ****************************************************************************
4
 *  - A Project by Developers TEAM For Xoops - ( https://xoops.org )
5
 * ****************************************************************************
6
 *  XNEWSLETTER - MODULE FOR XOOPS
7
 *  Copyright (c) 2007 - 2012
8
 *  Goffy ( wedega.com )
9
 *
10
 *  You may not change or alter any portion of this comment or credits
11
 *  of supporting developers from this source code or any supporting
12
 *  source code which is considered copyrighted (c) material of the
13
 *  original comment or credit authors.
14
 *
15
 *  This program is distributed in the hope that it will be useful,
16
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 *  GNU General Public License for more details.
19
 *  ---------------------------------------------------------------------------
20
 * @copyright  Goffy ( wedega.com )
21
 * @license    GPL 2.0
22
 * @package    xnewsletter
23
 * @author     Goffy ( [email protected] )
24
 *
25
 * ****************************************************************************
26
 */
27
28
use XoopsModules\Xnewsletter;
29
use Xmf\Request;
30
31
$currentFile = basename(__FILE__);
32
require_once __DIR__ . '/header.php';
33
$op            = Request::getString('op', 'list_subscriptions');
34
$activationKey = Request::getString('actkey', '');
35
$subscr_id     = Request::getInt('subscr_id', 0);
36
$subscr_email  = Request::getString('subscr_email', '');
37
38
if (Request::hasVar('addnew', 'REQUEST')) {
39
    $op = 'addnew_subscription';
40
}
41
42
$show_anon = false;
43
if ('' != $activationKey && 'anonlistsubscr' === $op) {
44
    $op = 'list_subscriptions';
45
    $show_anon = true;
46
} else if ('' != $activationKey && ('edit_subscription' === $op || 'delete_subscription' === $op)) {
47
} else if ('' != $activationKey && 'unsub' !== $op && 'search_subscriptions' !== $op) {
48
    $op = 'save_subscription';
49
}
50
if ('unsub' === $op) {
51
    $subscr_email = Request::getString('email', '');
52
    $op           = 'delete_subscription';
53
    //$GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
54
    $_SESSION['redirect_mail'] = Request::getString('email', '');
55
    $_SESSION['unsub']         = '1';
56
} else {
57
    $_SESSION['redirect_mail'] = '';
58
    $_SESSION['unsub']         = '0';
59
}
60
61
$uid = is_object($xoopsUser) ? (int)$xoopsUser->getVar('uid') : 0;
62
63
//to avoid errors in debug when xn_groups_change_other
64
$subscr_sex       = '';
65
$subscr_firstname = '';
66
$subscr_lastname  = '';
67
68
switch ($op) {
69
    case 'search_subscription':
70
    default:
71
        // if not anonymous subscriber / subscriber is a Xoops user
72
        if ($uid > 0) {
73
            header("Location:{$currentFile}?op=list_subscriptions&subscr_email=" . $subscr_email);
74
            exit();
75
        }
76
        // if anonymous subscriber
77
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
78
        require_once XOOPS_ROOT_PATH . '/header.php';
79
80
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
81
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
82
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
83
        // breadcrumb
84
        $breadcrumb = new Xnewsletter\Breadcrumb();
85
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
86
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
87
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
88
89
        $actionProts_ok      = [];
90
        $actionProts_error   = [];
91
        $actionProts_warning = [];
92
93
        $subscr_email         = '';
94
        $showSubscrSearchForm = true;
95
        $showSubscrForm       = false;
96
97
        // show search subscr form
98
        $xoopsTpl->assign('showSubscrSearchForm', $showSubscrSearchForm);
99
        // show form search
100
        $subscrObj = $helper->getHandler('Subscr')->create();
101
        $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm('subscription.php')->render());
102
103
        break;
104
        
105
    case 'list_subscriptions':
106
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
107
        require_once XOOPS_ROOT_PATH . '/header.php';
108
109
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
110
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
111
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
112
        // breadcrumb
113
        $breadcrumb = new Xnewsletter\Breadcrumb();
114
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
115
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
116
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
117
        // init vars
118
        $actionProts_ok       = [];
119
        $actionProts_warning  = [];
120
        $actionProts_error    = [];
121
        $showSubscrSearchForm = false;
122
        $showSubscrForm       = true;
123
124
        // get newsletters available for current user
125
        /** @var \XoopsGroupPermHandler $grouppermHandler */
126
        $grouppermHandler = xoops_getHandler('groupperm');
127
        $groups           = [0 => XOOPS_GROUP_ANONYMOUS];
128
        if ($uid > 0) {
129
            $groups = $xoopsUser->getGroups();
130
        }
131
132
        $catCriteria = new \CriteriaCompo();
133
        $catCriteria->setSort('cat_id');
134
        $catCriteria->setOrder('ASC');
135
        $catObjs = $helper->getHandler('Cat')->getAll($catCriteria);
136
        $cats_readable = [];
137
        $cats_showlist = [];
138
        foreach ($catObjs as $cat_id => $catObj) {
139 View Code Duplication
            if ($grouppermHandler->checkRight('newsletter_read_cat', $cat_id, $groups, $helper->getModule()->mid())) {
140
                $cats_readable[$cat_id]['cat_id'] = $cat_id;
141
                $cats_readable[$cat_id]['cat_name'] = $catObj->getVar('cat_name');
142
            }
143 View Code Duplication
            if ($grouppermHandler->checkRight('newsletter_list_cat', $cat_id, $groups, $helper->getModule()->mid())) {
144
                $cats_showlist[$cat_id]['cat_id'] = $cat_id;
145
                $cats_showlist[$cat_id]['cat_name'] = $catObj->getVar('cat_name');
146
            }
147
        }
148
        $perm_read_cat = (count($cats_readable) > 0);
149
        $perm_list_cat = (count($cats_showlist) > 0);
150
151
        if ($show_anon) {
152
            // anonymous user with activation key
153
            $search_mail = $subscr_email;
154
        } else if ($uid > 0) {
155
            // not anonymous subscriber
156
            // check whether current user has the right to see list subscribers, then take email from form
157
            if ($perm_list_cat) {
158
                $search_mail = $subscr_email;
159
            } else {
160
                // if user has no right to see list subscribers, then take email from Xoops user
161
                $search_mail = $xoopsUser->email();
162
            }
163
        } else {
164
            // if anonymous subscriber get subscr_email from search form
165
            if ('' != $subscr_email) {
166
                $search_mail = $subscr_email;
167
                // check captcha
168
                xoops_load('xoopscaptcha');
169
                $xoopsCaptcha = XoopsCaptcha::getinstance();
170
                if (!$xoopsCaptcha->verify()) {
171
                    $_SESSION['redirect_mail'] = $subscr_email;
172
                    redirect_header('?op=search_subscription', 3, $xoopsCaptcha->getMessage());
173
                }
174
                // check subscr_email
175
                if (!xnewsletter_checkEmail($subscr_email)) {
176
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
177
                }                
178
            } else {
179
                //redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
180
            }
181
        }
182
183
        // look for existing subscriptions
184
        $subscrCriteria = new \CriteriaCompo();
185
        $subscrCriteria->add(new \Criteria('subscr_email', $search_mail));
186
        $subscrCriteria->setSort('subscr_id');
187
        $subscrCriteria->setOrder('ASC');
188
        $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
189
190
        if ('' !== $subscr_email && $subscrCount > 0) {
191
            // there are subscriptions with this email
192
            $subscr_list = '';
193
            $actionProts_ok[] = _MA_XNEWSLETTER_REGISTRATION_EXIST;
194
            $subscrObjs            = $helper->getHandler('Subscr')->getAll($subscrCriteria);
195
            foreach ($subscrObjs as $subscrObj) {
196
                $subscr_array                             = $subscrObj->toArray();
197
                $subscr_array['subscr_created_formatted'] = formatTimestamp($subscr_array['subscr_created'], $helper->getConfig('dateformat'));
198
                // subscr exists but is unactivated
199
                if (0 == $subscr_array['subscr_activated']) {
200
                    $actionProts_warning[] = str_replace('%link', "?op=resend_subscription&subscr_id={$subscr_array['subscr_id']}", _MA_XNEWSLETTER_SUBSCRIPTION_UNFINISHED);
201
                }
202
                $catsubscrCriteria = new \CriteriaCompo();
203
                $catsubscrCriteria->add(new \Criteria('catsubscr_subscrid', $subscr_array['subscr_id']));
204
                $catsubscrCriteria->setSort('catsubscr_id');
205
                $catsubscrCriteria->setOrder('ASC');
206
                $catsubscrCount = $helper->getHandler('Catsubscr')->getCount($catsubscrCriteria);
207
                $catsubscrObjs  = $helper->getHandler('Catsubscr')->getAll($catsubscrCriteria);
208
                foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
209
                    $catsubscr_array              = $catsubscrObj->toArray();
210
                    $catObj                       = $helper->getHandler('Cat')->get($catsubscrObj->getVar('catsubscr_catid'));
211
                    if (is_object($catObj)) {
212
                        $cat_array                    = $catObj->toArray();
213
                        $catsubscr_array['cat']       = $cat_array;
214
                    }
215
                    $subscr_array['catsubscrs'][] = $catsubscr_array;
216
                    $subscr_list .= ' - ' . $cat_array['cat_name'] . " \n";
217
218
                    unset($catsubscr_array);
219
                    unset($cat_array);
220
                }
221
            }
222
            
223
            // check activation key
224
            $perm_showresult = false;
225
            $activationKey_array  = explode('||', base64_decode($activationKey, true));
226
            if (XOOPS_URL === trim($activationKey_array[0]) && $subscr_email === trim($activationKey_array[4]) && $subscr_array['subscr_actkey'] === trim($activationKey_array[3])) {
227
                $perm_showresult = true;
228
            }
229
            
230
            if (($uid > 0 && $perm_list_cat) || $perm_showresult) {
231
                //if user is logged in and have right to see list of registration then show corresponding result
232
                $xoopsTpl->append('subscrs', $subscr_array);
233
                $xoopsTpl->assign('subscrCount', $subscrCount);
234
                $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
235
                $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
236
                $xoopsTpl->assign('actionProts_error', $actionProts_error);
237
                $activationKey = base64_encode(XOOPS_URL . "||update||{$subscrObj->getVar('subscr_id')}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
238
                $xoopsTpl->assign('activationKey', $activationKey);
239
            } else {
240
                // anonymous, send email with the confirmation code to given email address
241
                $activationKey = base64_encode(XOOPS_URL . "||list||{$subscrObj->getVar('subscr_id')}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
242
                $xoopsMailer = xoops_getMailer();
243
                $xoopsMailer->reset();
244
                $xoopsMailer->setTemplateDir();
245
                $xoopsMailer->useMail();
246
                $xoopsMailer->setTemplate('subscriptions.tpl');
247
                $xoopsMailer->setToEmails($subscr_email);
248
                if (isset($xoopsConfig['adminmail'])) {
249
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
250
                }
251
                if (isset($xoopsConfig['sitename'])) {
252
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
253
                }
254
                $xoopsMailer->assign('EMAIL', $subscr_email);
255
                $xoopsMailer->assign('SEX', '' != $subscrObj->getVar('subscr_sex') ? $subscrObj->getVar('subscr_sex') : $subscr_sex);
256
                $xoopsMailer->assign('FIRSTNAME', '' != $subscrObj->getVar('subscr_firstname') ? $subscrObj->getVar('subscr_firstname') : $subscr_firstname);
257
                $xoopsMailer->assign('LASTNAME', '' != $subscrObj->getVar('subscr_lastname') ? $subscrObj->getVar('subscr_lastname') : $subscr_lastname);
258
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
259
                $xoopsMailer->assign('RESULT', $subscr_list);
260
                $xoopsMailer->assign('CHANGELINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=anonlistsubscr&subscr_email={$subscr_email}&actkey={$activationKey}");
261
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO . $GLOBALS['xoopsConfig']['sitename']);
262
                if (!$xoopsMailer->send()) {
263
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_ERROR . '<br>' . $xoopsMailer->getErrors();
264
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_ERROR . '<br>' . $xoopsMailer->getErrors());
265
                } else {
266
                    $actionProts_ok = [];
267
                    $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_OK);
268
                    $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
269
                }
270
            }
271
        } else {
272
            // email not in database, show subscr form
273
            if ('' !== $subscr_email) {
274
                $actionProts_warning[] = str_replace('%s', $subscr_email, _MA_XNEWSLETTER_REGISTRATION_NONE);
275
            }
276
            $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
277
            $xoopsTpl->assign('showSubscrForm', true);
278
            $subscrObj = $helper->getHandler('Subscr')->create();
279
            $subscrObj->setVar('subscr_email', $subscr_email);
280
            $form = $subscrObj->getForm($currentFile);
281
            $xoopsTpl->assign('subscrForm', $form->render());
282
        }
283
284
        if (count($cats_showlist) > 0) {
285
            // show search subscr form
286
            $xoopsTpl->assign('showSubscrSearchForm', true);
287
            // render form search
288
            $subscrObj = $helper->getHandler('Subscr')->create();
289
            $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm()->render());
290
        } else {
291
            $xoopsTpl->assign('showSubscrSearchForm', false);
292
        }
293
        break;
294
    case 'resend_subscription':
295
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
296
        require_once XOOPS_ROOT_PATH . '/header.php';
297
298
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
299
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
300
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
301
        // breadcrumb
302
        $breadcrumb = new Xnewsletter\Breadcrumb();
303
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
304
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
305
        // init vars
306
        $actionProts_ok      = [];
307
        $actionProts_warning = [];
308
        $actionProts_error   = [];
309
310
        // check if subscr exists
311
        $subscr_id      = Request::getInt('subscr_id', 0);
312
        $subscrCriteria = new \Criteria('subscr_id', $subscr_id);
313
        $subscrCount    = $helper->getHandler('Subscr')->getCount($subscrCriteria);
314
        if (0 == $subscrCount) {
315
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
316
        }
317
        // get subscr data
318
        $subscrObj    = $helper->getHandler('Subscr')->get($subscr_id);
319
        $subscr_email = $subscrObj->getVar('subscr_email');
320
        // resend the email with the confirmation code
321
        $xoopsMailer = xoops_getMailer();
322
        $xoopsMailer->reset();
323
        $xoopsMailer->setTemplateDir();
324
        $xoopsMailer->useMail();
325
        $xoopsMailer->setTemplate('activate.tpl');
326
        $xoopsMailer->setToEmails($subscr_email);
327
        if (isset($xoopsConfig['adminmail'])) {
328
            $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
329
        }
330
        if (isset($xoopsConfig['sitename'])) {
331
            $xoopsMailer->setFromName($xoopsConfig['sitename']);
332
        }
333
        $xoopsMailer->assign('EMAIL', $subscr_email);
334
        $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
335
        $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
336
        $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
337
        $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
338
        $activationKey = base64_encode(XOOPS_URL . "||addnew||{$subscr_id}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
339
        $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
340
        $subject = _MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename'];
341
        $xoopsMailer->setSubject($subject);
342
        if (!$xoopsMailer->send()) {
343
            $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
344
        } else {
345
            $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_RESENDMAIL_REG_OK);
346
        }
347
348
        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
349
        $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
350
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
351
        break;
352
    case 'add_subscription':
353
    case 'create_subscription':
354
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
355
        require_once XOOPS_ROOT_PATH . '/header.php';
356
357
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
358
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
359
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
360
        // breadcrumb
361
        $breadcrumb = new Xnewsletter\Breadcrumb();
362
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
363
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
364
365
        // get create subscr form
366
        if ('' != $subscr_email) {
367
            // existing email
368
            if (!xnewsletter_checkEmail($subscr_email)) {
369
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
370
            }
371
        } elseif ($uid > 0) {
372
            // take actual xoops user
373
            $subscr_email = $xoopsUser->email();
374
        } else {
375
            $subscr_email = '';
376
        }
377
        $subscrObj = $helper->getHandler('Subscr')->create();
378
        $subscrObj->setVar('subscr_email', $subscr_email);
379
        $subscrForm = $subscrObj->getForm();
380
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
381
        break;
382
    case 'edit_subscription':
383
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
384
        require_once XOOPS_ROOT_PATH . '/header.php';
385
386
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
387
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
388
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
389
        // breadcrumb
390
        $breadcrumb = new Xnewsletter\Breadcrumb();
391
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
392
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
393
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_EDIT, '');
394
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
395
396
        // get edit subscr form
397
        $subscr_id = Request::getInt('subscr_id', 0);
398
        if ($subscr_id <= 0) {
399
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
400
        }
401
        $subscrObj  = $helper->getHandler('Subscr')->get($subscr_id);
402
403
404
        $activationKey_array  = explode('||', base64_decode($activationKey, true));
405
        $activationKeyIsValid = false;
406
        if ((XOOPS_URL === trim($activationKey_array[0]))
407
            && ($subscr_id === (int)$activationKey_array[2])
408
            && ($subscrObj->getVar('subscr_actkey') === trim($activationKey_array[3]))
409
            && ($subscrObj->getVar('subscr_email') === trim($activationKey_array[4]))) {
410
            $activationKeyIsValid = true;
411
        } else {
412
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
413
        }
414
415
        $subscrForm = $subscrObj->getForm();
416
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
417
        break;
418
    case 'save_subscription':
419
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
420
        require_once XOOPS_ROOT_PATH . '/header.php';
421
422
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
423
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
424
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
425
        // breadcrumb
426
        $breadcrumb = new Xnewsletter\Breadcrumb();
427
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
428
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
429
        // init vars
430
        $actionProts_ok       = [];
431
        $actionProts_warning  = [];
432
        $actionProts_error    = [];
433
        $count_ok             = 0;
434
        $count_err            = 0;
435
        $activationKeyIsValid = false;
436
        // check right to subscribe directly
437
        $allowedWithoutActivationKey = false;
438 View Code Duplication
        if ($uid > 0) {
439
            // if not anonymous subscriber / subscriber is a Xoops user
440
            $submitter_email = $xoopsUser->email();
441
            foreach ($xoopsUser->getGroups() as $group) {
442
                if (in_array($group, $helper->getConfig('xn_groups_without_actkey'))
443
                    || XOOPS_GROUP_ADMIN == $group) {
444
                    $allowedWithoutActivationKey = true;
445
                    break;
446
                }
447
            }
448
        }
449
        // if anonymous subscriber
450
        // NOP
451
452
        if ($allowedWithoutActivationKey) {
453
            // 1st case: subscribe WITHOUT confirmation
454
            // check form
455
            if (!$GLOBALS['xoopsSecurity']->check()) {
456
                redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
457
            }
458
            // check email
459
            if ('' == $subscr_email || !xnewsletter_checkEmail($subscr_email)) {
460
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
461
            }
462
            // get or create subscr
463 View Code Duplication
            if ($subscr_id > 0) {
464
                $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
465
                $saveType  = 'update';
466
            } else {
467
                $subscrObj = $helper->getHandler('Subscr')->create();
468
                $saveType  = 'addnew';
469
            }
470
            $subscrObj->setVar('subscr_sex', Request::getString('subscr_sex', ''));
471
            $subscrObj->setVar('subscr_firstname', Request::getString('subscr_firstname', ''));
472
            $subscrObj->setVar('subscr_lastname', Request::getString('subscr_lastname', ''));
473
            $subscrObj->setVar('subscr_email', Request::getString('subscr_email', ''));
474
            $subscrObj->setVar('subscr_actkey', Request::getString('subscr_actkey', ''));
475
            // insert subscr
476 View Code Duplication
            if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
477
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br>' . $subscrObj->getHtmlErrors());
478
            }
479
            if ($subscr_id > 0) {
480
                $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
481
            } else {
482
                $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
483
            }
484
            $subscr_id = $subscrObj->getVar('subscr_id');
485
            // create $code_selections string
486
            $catCriteria = new \CriteriaCompo();
487
            $catCriteria->setSort('cat_id');
488
            $catCriteria->setOrder('ASC');
489
            $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
490
            $selections = [];
491 View Code Duplication
            foreach ($catObjs as $cat_id => $catObj) {
492
                // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
493
                $selection      = [];
494
                $selection[0]   = $cat_id;
495
                $selection[1]   = in_array($cat_id, $_REQUEST['cats']) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
496
                $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
497
                $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
498
                $code_selection = implode('-', $selection);
499
                $selections[]   = $code_selection;
500
                unset($selection);
501
            }
502
            $code_selections = implode('|', $selections);
503
        }
504
505
        if (!$allowedWithoutActivationKey) {
506
            // 2nd case: subscribe WITH confirmation
507
            if ('' == $activationKey) {
508
                // activation key DOESN'T EXIST
509
                // create and send confirmation email
510
                // check form
511
                if (!$GLOBALS['xoopsSecurity']->check()) {
512
                    redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
513
                }
514
                // check email
515
                if ('' == $subscr_email || !xnewsletter_checkEmail($subscr_email)) {
516
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
517
                }
518
                // get subscr fields from form
519
                $subscr_firstname = Request::getString('subscr_firstname', '');
520
                $subscr_lastname  = Request::getString('subscr_lastname', '');
521
                $subscr_sex       = Request::getString('subscr_sex', '');
522
                // create $code_selections string
523
                $catCriteria = new \CriteriaCompo();
524
                $catCriteria->setSort('cat_id');
525
                $catCriteria->setOrder('ASC');
526
                $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
527
                $selections = [];
528 View Code Duplication
                foreach ($catObjs as $cat_id => $catObj) {
529
                    // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
530
                    $selection      = [];
531
                    $selection[0]   = $cat_id;
532
                    $selection[1]   = in_array($cat_id, Request::getArray('cats')) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
533
                    $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
534
                    $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
535
                    $code_selection = implode('-', $selection);
536
                    $selections[]   = $code_selection;
537
                    unset($selection);
538
                }
539
                $code_selections = implode('|', $selections); // string
540
                //
541
                // get or create subscr
542 View Code Duplication
                if ($subscr_id > 0) {
543
                    $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
544
                    $saveType  = 'update';
545
                } else {
546
                    $subscrObj = $helper->getHandler('Subscr')->create();
547
                    $saveType  = 'addnew';
548
                }
549
                // fill subscr
550
                if ($subscr_id <= 0) {
551
                    // form subscr_email
552
                    $subscrObj->setVar('subscr_email', $subscr_email);
553
                    // form subscr_uid
554
                    $subscr_uid = 0;
555
                    $sql        = "SELECT `uid` FROM {$xoopsDB->prefix('users')}";
556
                    $sql        .= " WHERE (`email`='{$subscr_email}')";
557
                    $sql        .= ' LIMIT 1';
558
                    $user       = $xoopsDB->query($sql);
559
                    if ($user) {
560
                        $row_user   = $xoopsDB->fetchRow($user);
561
                        $subscr_uid = $row_user[0];
562
                    }
563
                    $subscrObj->setVar('subscr_uid', $subscr_uid);
564
                    // form subscr_submitter
565
                    $subscrObj->setVar('subscr_submitter', $uid);
566
                }
567
568
                $subscrObj->setVar('subscr_created', time());
569
                $subscrObj->setVar('subscr_ip', xoops_getenv('REMOTE_ADDR'));
570
                $subscr_actkey = xoops_makepass();
571
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
572
                // format subscr_actoptions: selected_newsletters||firstname||lastname||sex
573
                $activationOptions = [
574
                    'code_selections'  => $code_selections,
575
                    'subscr_firstname' => $subscr_firstname,
576
                    'subscr_lastname'  => $subscr_lastname,
577
                    'subscr_sex'       => $subscr_sex,
578
                    'subscr_created'   => $subscrObj->getVar('subscr_created'),
579
                    'subscr_ip'        => $subscrObj->getVar('subscr_ip'),
580
                ];
581
                $subscrObj->setVar('subscr_actoptions', $activationOptions); // XOBJ_DTYPE_ARRAY
582
                // insert subscr
583 View Code Duplication
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
584
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br>' . $subscrObj->getHtmlErrors());
585
                }
586
                if ($subscr_id > 0) {
587
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
588
                } else {
589
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
590
                }
591
                $subscr_id = $subscrObj->getVar('subscr_id');
592
                // send the email with the confirmation code
593
                $xoopsMailer = xoops_getMailer();
594
                $xoopsMailer->reset();
595
                $xoopsMailer->setTemplateDir();
596
                $xoopsMailer->useMail();
597
                $xoopsMailer->setTemplate(('update' === $saveType) ? 'update.tpl' : 'activate.tpl');
598
                $xoopsMailer->setToEmails($subscr_email);
599
                if (isset($xoopsConfig['adminmail'])) {
600
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
601
                }
602
                if (isset($xoopsConfig['sitename'])) {
603
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
604
                }
605
                $xoopsMailer->assign('EMAIL', $subscr_email);
606
                $xoopsMailer->assign('SEX', '' != $subscrObj->getVar('subscr_sex') ? $subscrObj->getVar('subscr_sex') : $subscr_sex);
607
                $xoopsMailer->assign('FIRSTNAME', '' != $subscrObj->getVar('subscr_firstname') ? $subscrObj->getVar('subscr_firstname') : $subscr_firstname);
608
                $xoopsMailer->assign('LASTNAME', '' != $subscrObj->getVar('subscr_lastname') ? $subscrObj->getVar('subscr_lastname') : $subscr_lastname);
609
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
610
                $act           = [
611
                    XOOPS_URL,
612
                    $saveType,
613
                    $subscr_id,
614
                    $subscr_actkey,
615
                    $subscr_email,
616
                ];
617
                $activationKey = base64_encode(implode('||', $act));
618
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
619
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename']);
620 View Code Duplication
                if (!$xoopsMailer->send()) {
621
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
622
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
623
                } else {
624
                    $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_SENDMAIL_REG_OK);
625
                }
626
            } else {
627
                // activation key EXISTS
628
                // check confirmation email
629
                // check activation key
630
                $activationKey_array  = explode('||', base64_decode($activationKey, true));
631
                $activationKeyIsValid = false;
632
                if ((XOOPS_URL == $activationKey_array[0]) && ('' != trim($activationKey_array[1]))
633
                    && ((int)$activationKey_array[2] > 0)
634
                    && ('' != trim($activationKey_array[3]))) {
635
                    $activationKeyIsValid = true;
636
                } else {
637
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
638
                }
639
                $saveType      = trim($activationKey_array[1]);
640
                $subscr_id     = (int)$activationKey_array[2];
641
                $subscr_actkey = trim($activationKey_array[3]);
642
                // check given data with table subscr
643
                $subscrCriteria = new \CriteriaCompo();
644
                $subscrCriteria->add(new \Criteria('subscr_id', $subscr_id));
645
                $subscrCriteria->add(new \Criteria('subscr_actkey', $subscr_actkey));
646
                $subscrCriteria->setLimit(1);
647
                $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
648
                if (0 == $subscrCount) {
649
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NODATAKEY);
650
                }
651
                // get subscr
652
                $subscrObj         = $helper->getHandler('Subscr')->get($subscr_id);
653
                $activationOptions = $subscrObj->getVar('subscr_actoptions'); // XOBJ_DTYPE_ARRAY
654
                // check time: confirmation not later than ... hours
655
                if (('update' !== $saveType) && (0 != $helper->getConfig('confirmation_time'))
656
                    && ((int)$activationOptions['subscr_created'] < time() - (3600 + (int)$helper->getConfig('confirmation_time')))) {
657
                    // time expired
658
                    $subscrObj->setVar('subscr_actkey', '');
659
                    $subscrObj->setVar('subscr_actoptions', []);
660
                    $helper->getHandler('Subscr')->insert($subscrObj);
661
                    // IN PROGRESS
662
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_KEYEXPIRED);
663
                }
664
                if ('update' === $saveType) {
665
                    // get subscr fields from form
666
                    $subscr_firstname = Request::getString('subscr_firstname', '');
667
                    $subscr_lastname  = Request::getString('subscr_lastname', '');
668
                    $subscr_sex       = Request::getString('subscr_sex', '');
669
                    // create $code_selections string
670
                    $catCriteria = new \CriteriaCompo();
671
                    $catCriteria->setSort('cat_id');
672
                    $catCriteria->setOrder('ASC');
673
                    $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
674
                    $selections = [];
675 View Code Duplication
                    foreach ($catObjs as $cat_id => $catObj) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
676
                        // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
677
                        $selection      = [];
678
                        $selection[0]   = $cat_id;
679
                        $selection[1]   = in_array($cat_id, Request::getArray('cats')) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
680
                        $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
681
                        $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
682
                        $code_selection = implode('-', $selection);
683
                        $selections[]   = $code_selection;
684
                        unset($selection);
685
                    }
686
                    $code_selections = implode('|', $selections); // string
687
                } else {
688
                    // get subscr fields from subscr_actoptions
689
                    $subscr_sex       = $activationOptions['subscr_sex'];
690
                    $subscr_firstname = $activationOptions['subscr_firstname'];
691
                    $subscr_lastname  = $activationOptions['subscr_lastname'];
692
                    $code_selections = $activationOptions['code_selections']; // string
693
                }
694
                // insert subscr
695
                $subscrObj->setVar('subscr_sex', $subscr_sex);
696
                $subscrObj->setVar('subscr_firstname', $subscr_firstname);
697
                $subscrObj->setVar('subscr_lastname', $subscr_lastname);
698
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
699
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
700
                }
701
702
            }
703
        }
704
        //
705
        //
706
        // subscribe subscr to cat (create/update catsubscr)
707
        if ($activationKeyIsValid || $allowedWithoutActivationKey) {
708
            // update xnewsletter_subscr
709
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
710
            if (0 == $subscrObj->getVar('subscr_activated')) {
711
                $subscrObj->setVar('subscr_created', time());
712
                $subscrObj->setVar('subscr_ip', xoops_getenv('REMOTE_ADDR'));
713
                $subscrObj->setVar('subscr_activated', 1);
714
            }
715
            // reset act fields
716
            $subscrObj->setVar('subscr_actoptions', []);
717
            // insert subscr
718
            if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
719
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
720
            }
721
            // create cat subscr
722
            $selections = explode('|', $code_selections); // array
723
            foreach ($selections as $code_selection) {
724
                if ('' == $code_selection) {
725
                    $code_selection = '0-0-0-0';
726
                }
727
                $selection           = explode('-', $code_selection); // array
728
                $cat_id              = $selection[0];
729
                $catsubcr            = $selection[1];
730
                $catsubcr_id_old     = (int)$selection[2];
731
                $catsubcr_quited_old = (int)$selection[3];
732
                $catObj              = $helper->getHandler('Cat')->get($cat_id);
733
                $cat_mailinglist     = $catObj->getVar('cat_mailinglist');
734
                $cat_name            = $catObj->getVar('cat_name');
735
                if ('1' == $catsubcr && 0 == $catsubcr_id_old) {
736
                    $catsubscrObj = $helper->getHandler('Catsubscr')->create();
737
                    $catsubscrObj->setVar('catsubscr_catid', $cat_id);
738
                    $catsubscrObj->setVar('catsubscr_subscrid', $subscr_id);
739
                    $catsubscrObj->setVar('catsubscr_submitter', $uid);
740
                    $catsubscrObj->setVar('catsubscr_created', time());
741
                    if ($helper->getHandler('Catsubscr')->insert($catsubscrObj)) {
742
                        $count_ok++;
743
                        if ($catsubcr_id_old > 0) {
744
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
745
                        } else {
746
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SUBSCRIBE);
747
                        }
748
                        // handle mailinglists
749
                        if ($cat_mailinglist > 0) {
750
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
751
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_SUBSCRIBE, $subscr_id, $cat_mailinglist);
752
                        }
753
                    } else {
754
                        $count_err++;
755
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
756
                    }
757
                } elseif ('0' == $catsubcr && $catsubcr_id_old > 0) {
758
                    // unsubscribe / delete old subscription
759
                    $catsubscrObj = $helper->getHandler('Catsubscr')->get($catsubcr_id_old);
760 View Code Duplication
                    if ($helper->getHandler('Catsubscr')->delete($catsubscrObj, true)) {
761
                        // handle mailinglists
762
                        if ($cat_mailinglist > 0) {
763
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
764
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_UNSUBSCRIBE, $subscr_id, $cat_mailinglist);
765
                        }
766
                    } else {
767
                        $count_err++;
768
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
769
                    }
770
                    /*
771
                                        if ($count_err > 0) {
772
                                            redirect_header($currentFile, 3, _AM_XNEWSLETTER_FORMDELNOTOK);
773
                                        }
774
                    */
775
                    $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_UNSUBSCRIBE);
776
                } elseif ($catsubcr_id_old > 0 && $catsubcr_quited_old > 0) {
777
                    // newsletter stay selected, but catsubscr_quited will be removed
778
                    $catsubscrObj = $helper->getHandler('Catsubscr')->get($catsubcr_id_old);
779
                    // Form catsubscr_quited
780
                    $catsubscrObj->setVar('catsubscr_quited', '0');
781
                    if ($helper->getHandler('Catsubscr')->insert($catsubscrObj)) {
782
                        $count_ok++;
783
                        $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_DAT_QUITED_REMOVED);
784
                    } else {
785
                        $count_err++;
786
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
787
                    }
788
                } elseif ($catsubcr_id_old > 0) {
789
                    // newsletter still subscribed
790
                    $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
791
                }
792
                // nothing to do
793
            }
794
            //
795
            // send infomail to subscriber if current user (submitter) is not the subscriber (subscr)
796
            if (isset($submitter_email) && ('' != $submitter_email) && ($submitter_email != $subscr_email)) {
797
                if ('' == $subscr_sex && '' == $subscr_firstname && '' == $subscr_lastname) {
798
                    $subscrObj        = $helper->getHandler('Subscr')->get($subscr_id);
799
                    $subscr_sex       = $subscrObj->getVar('subscr_sex');
800
                    $subscr_firstname = $subscrObj->getVar('subscr_firstname');
801
                    $subscr_lastname  = $subscrObj->getVar('subscr_lastname');
802
                }
803
                // send the email with the confirmation code
804
                $xoopsMailer = xoops_getMailer();
805
                $xoopsMailer->reset();
806
                $xoopsMailer->setTemplateDir();
807
                $xoopsMailer->useMail();
808
                $xoopsMailer->setHTML();
809
                $xoopsMailer->setTemplate('info_change.tpl');
810
                $xoopsMailer->setToEmails($subscr_email);
811
                if (isset($xoopsConfig['adminmail'])) {
812
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
813
                }
814
                if (isset($xoopsConfig['sitename'])) {
815
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
816
                }
817
                $xoopsMailer->assign('EMAIL', $subscr_email);
818
                $xoopsMailer->assign('SEX', $subscr_sex);
819
                $xoopsMailer->assign('FIRSTNAME', $subscr_firstname);
820
                $xoopsMailer->assign('LASTNAME', $subscr_lastname);
821
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
822
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?subscr_email={$subscr_email}");
823
                $xoopsMailer->assign('USERLINK', XOOPS_URL . '/userinfo.php?uid=' . $xoopsUser->uid());
824
                $xoopsMailer->assign('USERNAME', $xoopsUser->name());
825
                $subject = _MA_XNEWSLETTER_SUBSCRIPTION_SUBJECT_CHANGE . $GLOBALS['xoopsConfig']['sitename'];
826
                $xoopsMailer->setSubject($subject);
827 View Code Duplication
                if (!$xoopsMailer->send()) {
828
                    $count_err++;
829
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
830
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
831
                } else {
832
                    $actionProts_ok[] = str_replace('%e', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SENT_INFO);
833
                }
834
            }
835
            if (0 == $count_err) {
836
                if ('addnew' === $saveType) {
837
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_CLOSED;
838
                } else {
839
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_UPDATE_CLOSED;
840
                }
841
                //$actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_OK;
842
            }
843
        }
844
845
        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
846
        $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
847
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
848
        break;
849
    case 'delete_subscription':
850
        if ((!$activationKey && $subscr_id <= 0) && ('1' != $_SESSION['unsub'])) {
851
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
852
        }
853
854
        // IN PROGRESS
855
        if ('1' == $_SESSION['unsub']) {
856
            $subscrCriteria = new \CriteriaCompo();
857
            $subscrCriteria->add(new \Criteria('subscr_email', $subscr_email));
858
            $subscrCriteria->setLimit(1);
859
            $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
860
            if (0 == $subscrCount) {
861
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
862
            }
863
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
864
            $subscr_id = $subscrObj->getVar('subscr_id');
865
        }
866
        // IN PROGRESS
867
868
        if (Request::getBool('ok', false, 'POST') || '' != $activationKey) {
869
            $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
870
            require_once XOOPS_ROOT_PATH . '/header.php';
871
872
            $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
873
            $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
874
            $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
875
            // breadcrumb
876
            $breadcrumb = new Xnewsletter\Breadcrumb();
877
            $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
878
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
879
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
880
            $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
881
            // init vars
882
            $actionProts_ok       = [];
883
            $actionProts_warning  = [];
884
            $actionProts_error    = [];
885
            $count_ok             = 0;
886
            $count_err            = 0;
887
            $activationKeyIsValid = false;
888
            // check right to unsubscribe directly
889
            $allowedWithoutActivationKey = false;
890 View Code Duplication
            if ($uid > 0) {
891
                // if not anonymous subscriber / subscriber is a Xoops user
892
                $submitter_email = $xoopsUser->email();
893
                foreach ($xoopsUser->getGroups() as $group) {
894
                    if (in_array($group, $helper->getConfig('xn_groups_without_actkey'))
895
                        || XOOPS_GROUP_ADMIN == $group) {
896
                        $allowedWithoutActivationKey = true;
897
                        break;
898
                    }
899
                }
900
            }
901
            // if anonymous subscriber
902
            // NOP
903
904
            if ('' != $activationKey || $allowedWithoutActivationKey) {
905
                // 1st case: unsubscribe WITHOUT confirmation
906
                // 2nd case: unsubscribe WITH confirmation & activation key EXISTS
907
                // check given data with table subscr
908
                $subscrCriteria = new \CriteriaCompo();
909
                $subscrCriteria->add(new \Criteria('subscr_email', $subscr_email));
910
                $subscrCriteria->add(new \Criteria('subscr_id', $subscr_id));
911
                // got actkey or user is allowed to delete without actkey
912
                if ('' != $activationKey) {
913
                    // check activation key
914
                    $activationKey_array  = explode('||', base64_decode($activationKey, true));
915
                    $activationKeyIsValid = false;
916
                    $subscr_id            = (int)$activationKey_array[2];
917
                    $subscr_actkey        = trim($activationKey_array[3]);
918
                    $subscr_email         = trim($activationKey_array[4]);
919
                    if ((XOOPS_URL == $activationKey_array[0]) && ((int)$activationKey_array[2] > 0)
920
                        && ('' != trim($activationKey_array[3]))) {
921
                        $activationKeyIsValid = true;
922
                    } else {
923
                        redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
924
                    }
925
                    $subscrCriteria->add(new \Criteria('subscr_actkey', $subscr_actkey));
926
                }
927
                $subscrCriteria->setLimit(1);
928
                $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
929
                if (0 == $subscrCount) {
930
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
931
                }
932
                // delete subscriptions (catsubscrs)
933
                $catsubscrCriteria = new \CriteriaCompo();
934
                $catsubscrCriteria->add(new \Criteria('catsubscr_subscrid', $subscr_id));
935
                $catsubscrCriteria->setSort('catsubscr_id');
936
                $catsubscrCriteria->setOrder('ASC');
937
                $catsubscrObjs  = $helper->getHandler('Catsubscr')->getAll($catsubscrCriteria);
938
                foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
939
                    if ($helper->getHandler('Catsubscr')->delete($catsubscrObj, true)) {
940
                        // handle mailinglists
941
                        $catObj              = $helper->getHandler('Cat')->get($catsubscrObj->getVar('catsubscr_catid'));
942
                        $cat_mailinglist     = $catObj->getVar('cat_mailinglist');
943
                        if ($cat_mailinglist > 0) {
944
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
945
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_UNSUBSCRIBE, $subscr_id, $cat_mailinglist);
946
                        }
947
                    } else {
948
                        $actionProts_error[] = $catsubscrObj->getHtmlErrors();
949
                        redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR . $subscrObj->getHtmlErrors());
950
                    }
951
                }
952
                // delete subscriber (subscr)
953
                $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
954
                if (!$helper->getHandler('Subscr')->delete($subscrObj, true)) {
955
                    $actionProts_error[] = $subscrObj->getHtmlErrors();
956
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR . $subscrObj->getHtmlErrors());
957
                }
958
959
                if (0 == $count_err) {
960
                    $actionProts_ok[] = _AM_XNEWSLETTER_FORMDELOK;
961
                } else {
962
                    $xoopsTpl->assign('actionProts_error', $actionProts_error);
963
                }
964
            } else {
965
                // 2nd case: unsubscribe WITH confirmation & activation key DOESN'T EXIST
966
                // check form
967
                if (!$GLOBALS['xoopsSecurity']->check()) {
968
                    redirect_header('subscr.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
969
                }
970
                $subscrObj     = $helper->getHandler('Subscr')->get($subscr_id);
971
                $subscr_actkey = xoops_makepass();
972
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
973
                // insert subscr
974
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
975
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
976
                }
977
                //                if (!$allowedWithoutActivationKey) {
978
                $xoopsMailer = xoops_getMailer();
979
                $xoopsMailer->reset();
980
                $xoopsMailer->setTemplateDir();
981
                $xoopsMailer->useMail();
982
                $xoopsMailer->setTemplate('delete.tpl');
983
                $xoopsMailer->setToEmails($subscrObj->getVar('subscr_email'));
984
                if (isset($xoopsConfig['adminmail'])) {
985
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
986
                }
987
                if (isset($xoopsConfig['sitename'])) {
988
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
989
                }
990
                $xoopsMailer->assign('EMAIL', $subscrObj->getVar('subscr_email'));
991
                $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
992
                $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
993
                $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
994
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
995
                $act           = [
996
                    XOOPS_URL,
997
                   'delete',
998
                    $subscrObj->getVar('subscr_id'),
999
                    $subscrObj->getVar('subscr_actkey'),
1000
                    $subscrObj->getVar('subscr_email'),
1001
                ];
1002
                $activationKey = base64_encode(implode('||', $act));
1003
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=unsub&email={$subscrObj->getVar('subscr_email')}&actkey={$activationKey}");
1004
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_DELETESUBJECT . $GLOBALS['xoopsConfig']['sitename']);
1005
                if (!$xoopsMailer->send()) {
1006
                    $count_err++;
1007
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
1008
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
1009
                }
1010
                //                }
1011
                if (0 == $count_err) {
1012
                    $actionProts_ok[] = str_replace('%subscr_email', $subscrObj->getVar('subscr_email'), _MA_XNEWSLETTER_SENDMAIL_UNREG_OK);
1013
                }
1014
            }
1015
1016
            $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
1017
            $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
1018
            $xoopsTpl->assign('actionProts_error', $actionProts_error);
1019
        } else {
1020
            $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_empty.tpl';
1021
            require_once XOOPS_ROOT_PATH . '/header.php';
1022
1023
            $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
1024
            $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
1025
            $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
1026
            // breadcrumb
1027
            $breadcrumb = new Xnewsletter\Breadcrumb();
1028
            $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
1029
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
1030
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
1031
            $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
1032
1033
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
1034
            xoops_confirm([
1035
                              'ok'           => true,
1036
                              'subscr_id'    => $subscr_id,
1037
                              'subscr_email' => $subscr_email,
1038
                              'op'           => 'delete_subscription',
1039
                          ], $currentFile, sprintf(_MA_XNEWSLETTER_SUBSCRIPTION_DELETE_SURE));
1040
        }
1041
        break;
1042
}
1043
1044
require_once __DIR__ . '/footer.php';
1045