Completed
Pull Request — master (#29)
by Goffy
01:44
created

subscription.php (6 issues)

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 && 'unsub' !== $op && 'search_subscriptions' !== $op) {
47
    $op = 'save_subscription';
48
}
49
if ('unsub' === $op) {
50
    $subscr_email = Request::getString('email', '');
51
    $op           = 'delete_subscription';
52
    //$GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
53
    $_SESSION['redirect_mail'] = Request::getString('email', '');
54
    $_SESSION['unsub']         = '1';
55
} else {
56
    $_SESSION['redirect_mail'] = '';
57
    $_SESSION['unsub']         = '0';
58
}
59
60
$uid = is_object($xoopsUser) ? (int)$xoopsUser->getVar('uid') : 0;
61
62
//to avoid errors in debug when xn_groups_change_other
63
$subscr_sex       = '';
64
$subscr_firstname = '';
65
$subscr_lastname  = '';
66
67
switch ($op) {
68
    case 'search_subscription':
69
    default:
70
        // if not anonymous subscriber / subscriber is a Xoops user
71
        if ($uid > 0) {
72
            header("Location:{$currentFile}?op=list_subscriptions&subscr_email=" . $subscr_email);
73
            exit();
74
        }
75
        // if anonymous subscriber
76
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
77
        require_once XOOPS_ROOT_PATH . '/header.php';
78
79
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
80
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
81
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
82
        // breadcrumb
83
        $breadcrumb = new Xnewsletter\Breadcrumb();
84
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
85
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
86
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
87
88
        $actionProts_ok      = [];
89
        $actionProts_error   = [];
90
        $actionProts_warning = [];
91
92
        $subscr_email         = '';
93
        $showSubscrSearchForm = true;
94
        $showSubscrForm       = false;
95
96
        // show search subscr form
97
        $xoopsTpl->assign('showSubscrSearchForm', $showSubscrSearchForm);
98
        // show form search
99
        $subscrObj = $helper->getHandler('Subscr')->create();
100
        $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm('subscription.php')->render());
101
102
        break;
103
        
104
    case 'list_subscriptions':
105
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
106
        require_once XOOPS_ROOT_PATH . '/header.php';
107
108
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
109
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
110
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
111
        // breadcrumb
112
        $breadcrumb = new Xnewsletter\Breadcrumb();
113
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
114
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
115
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
116
        // init vars
117
        $actionProts_ok       = [];
118
        $actionProts_warning  = [];
119
        $actionProts_error    = [];
120
        $showSubscrSearchForm = false;
121
        $showSubscrForm       = true;
122
123
        // get newsletters available for current user
124
        /** @var \XoopsGroupPermHandler $grouppermHandler */
125
        $grouppermHandler = xoops_getHandler('groupperm');
126
        $groups           = [0 => XOOPS_GROUP_ANONYMOUS];
127
        if ($uid > 0) {
128
            $groups = $xoopsUser->getGroups();
129
        }
130
131
        $catCriteria = new \CriteriaCompo();
132
        $catCriteria->setSort('cat_id');
133
        $catCriteria->setOrder('ASC');
134
        $catObjs = $helper->getHandler('Cat')->getAll($catCriteria);
135
        $cats_readable = [];
136
        $cats_showlist = [];
137
        foreach ($catObjs as $cat_id => $catObj) {
138 View Code Duplication
            if ($grouppermHandler->checkRight('newsletter_read_cat', $cat_id, $groups, $helper->getModule()->mid())) {
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...
139
                $cats_readable[$cat_id]['cat_id'] = $cat_id;
140
                $cats_readable[$cat_id]['cat_name'] = $catObj->getVar('cat_name');
141
            }
142 View Code Duplication
            if ($grouppermHandler->checkRight('newsletter_list_cat', $cat_id, $groups, $helper->getModule()->mid())) {
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...
143
                $cats_showlist[$cat_id]['cat_id'] = $cat_id;
144
                $cats_showlist[$cat_id]['cat_name'] = $catObj->getVar('cat_name');
145
            }
146
        }
147
        $perm_read_cat = (count($cats_readable) > 0);
148
        $perm_list_cat = (count($cats_showlist) > 0);
149
150
        if ($show_anon) {
151
            // anonymous user with activation key
152
            $search_mail = $subscr_email;
153
        } else if ($uid > 0) {
154
            // not anonymous subscriber
155
            // check whether current user has the right to see list subscribers, then take email from form
156
            if ($perm_list_cat) {
157
                $search_mail = $subscr_email;
158
            } else {
159
                // if user has no right to see list subscribers, then take email from Xoops user
160
                $search_mail = $xoopsUser->email();
161
            }
162
        } else {
163
            // if anonymous subscriber get subscr_email from search form
164
            if ('' != $subscr_email) {
165
                $search_mail = $subscr_email;
166
                // check captcha
167
                xoops_load('xoopscaptcha');
168
                $xoopsCaptcha = XoopsCaptcha::getinstance();
169
                if (!$xoopsCaptcha->verify()) {
170
                    $_SESSION['redirect_mail'] = $subscr_email;
171
                    redirect_header('?op=search_subscription', 3, $xoopsCaptcha->getMessage());
172
                }
173
                // check subscr_email
174
                if (!xnewsletter_checkEmail($subscr_email)) {
175
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
176
                }                
177
            } else {
178
                //redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
179
            }
180
        }
181
182
        // look for existing subscriptions
183
        $subscrCriteria = new \CriteriaCompo();
184
        $subscrCriteria->add(new \Criteria('subscr_email', $search_mail));
185
        $subscrCriteria->setSort('subscr_id');
186
        $subscrCriteria->setOrder('ASC');
187
        $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
188
189
        if ('' !== $subscr_email && $subscrCount > 0) {
190
            // there are subscriptions with this email
191
            $subscr_list = '';
192
            $actionProts_ok[] = _MA_XNEWSLETTER_REGISTRATION_EXIST;
193
            $subscrObjs            = $helper->getHandler('Subscr')->getAll($subscrCriteria);
194
            foreach ($subscrObjs as $subscrObj) {
195
                $subscr_array                             = $subscrObj->toArray();
196
                $subscr_array['subscr_created_formatted'] = formatTimestamp($subscr_array['subscr_created'], $helper->getConfig('dateformat'));
197
                // subscr exists but is unactivated
198
                if (0 == $subscr_array['subscr_activated']) {
199
                    $actionProts_warning[] = str_replace('%link', "?op=resend_subscription&subscr_id={$subscr_array['subscr_id']}", _MA_XNEWSLETTER_SUBSCRIPTION_UNFINISHED);
200
                }
201
                $catsubscrCriteria = new \CriteriaCompo();
202
                $catsubscrCriteria->add(new \Criteria('catsubscr_subscrid', $subscr_array['subscr_id']));
203
                $catsubscrCriteria->setSort('catsubscr_id');
204
                $catsubscrCriteria->setOrder('ASC');
205
                $catsubscrCount = $helper->getHandler('Catsubscr')->getCount($catsubscrCriteria);
206
                $catsubscrObjs  = $helper->getHandler('Catsubscr')->getAll($catsubscrCriteria);
207
                foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
208
                    $catsubscr_array              = $catsubscrObj->toArray();
209
                    $catObj                       = $helper->getHandler('Cat')->get($catsubscrObj->getVar('catsubscr_catid'));
210
                    if (is_object($catObj)) {
211
                        $cat_array                    = $catObj->toArray();
212
                        $catsubscr_array['cat']       = $cat_array;
213
                    }
214
                    if ($uid > 0 && $perm_list_cat) {
215
                        $subscr_array['catsubscrs'][] = $catsubscr_array;
216
                    } else {
217
                        $subscr_list .= ' - ' . $cat_array['cat_name'] . " \n";
218
                    }
219
                    unset($catsubscr_array);
220
                    unset($cat_array);
221
                }
222
            }
223
            
224
            // check activation key
225
            $perm_showresult = ($activationKey === $subscr_array['subscr_actkey']);
226
            
227
            if (($uid > 0 && $perm_list_cat) || $perm_showresult) {
228
                //if user is logged in and have right to see list of registration then show corresponding result
229
                $xoopsTpl->append('subscrs', $subscr_array);
230
                $xoopsTpl->assign('subscrCount', $subscrCount);
231
                $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
232
                $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
233
                $xoopsTpl->assign('actionProts_error', $actionProts_error);
234
            } else {
235
                // anonymous, send email with the confirmation code to given email address
236
                $activationKey = $subscr_array['subscr_actkey'];
237
                $xoopsMailer = xoops_getMailer();
238
                $xoopsMailer->reset();
239
                $xoopsMailer->setTemplateDir();
240
                $xoopsMailer->useMail();
241
                $xoopsMailer->setTemplate('subscriptions.tpl');
242
                $xoopsMailer->setToEmails($subscr_email);
243
                if (isset($xoopsConfig['adminmail'])) {
244
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
245
                }
246
                if (isset($xoopsConfig['sitename'])) {
247
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
248
                }
249
                $xoopsMailer->assign('EMAIL', $subscr_email);
250
                $xoopsMailer->assign('SEX', '' != $subscrObj->getVar('subscr_sex') ? $subscrObj->getVar('subscr_sex') : $subscr_sex);
251
                $xoopsMailer->assign('FIRSTNAME', '' != $subscrObj->getVar('subscr_firstname') ? $subscrObj->getVar('subscr_firstname') : $subscr_firstname);
252
                $xoopsMailer->assign('LASTNAME', '' != $subscrObj->getVar('subscr_lastname') ? $subscrObj->getVar('subscr_lastname') : $subscr_lastname);
253
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
254
                $xoopsMailer->assign('RESULT', $subscr_list);
255
                $xoopsMailer->assign('CHANGELINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=anonlistsubscr&subscr_email={$subscr_email}&actkey={$activationKey}");
256
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO . $GLOBALS['xoopsConfig']['sitename']);
257
                if (!$xoopsMailer->send()) {
258
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_ERROR . '<br>' . $xoopsMailer->getErrors();
259
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_ERROR . '<br>' . $xoopsMailer->getErrors());
260
                } else {
261
                    $actionProts_ok = [];
262
                    $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_OK);
263
                    $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
264
                }
265
            }
266
        } else {
267
            // email not in database, show subscr form
268
            if ('' !== $subscr_email) {
269
                $actionProts_warning[] = str_replace('%s', $subscr_email, _MA_XNEWSLETTER_REGISTRATION_NONE);
270
            }
271
            $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
272
            $xoopsTpl->assign('showSubscrForm', true);
273
            $subscrObj = $helper->getHandler('Subscr')->create();
274
            $subscrObj->setVar('subscr_email', $subscr_email);
275
            $form = $subscrObj->getForm($currentFile);
276
            $xoopsTpl->assign('subscrForm', $form->render());
277
        }
278
279
        if (count($cats_showlist) > 0) {
280
            // show search subscr form
281
            $xoopsTpl->assign('showSubscrSearchForm', true);
282
            // render form search
283
            $subscrObj = $helper->getHandler('Subscr')->create();
284
            $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm()->render());
285
        } else {
286
            $xoopsTpl->assign('showSubscrSearchForm', false);
287
        }
288
        break;
289
    case 'resend_subscription':
290
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
291
        require_once XOOPS_ROOT_PATH . '/header.php';
292
293
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
294
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
295
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
296
        // breadcrumb
297
        $breadcrumb = new Xnewsletter\Breadcrumb();
298
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
299
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
300
        // init vars
301
        $actionProts_ok      = [];
302
        $actionProts_warning = [];
303
        $actionProts_error   = [];
304
305
        // check if subscr exists
306
        $subscr_id      = Request::getInt('subscr_id', 0);
307
        $subscrCriteria = new \Criteria('subscr_id', $subscr_id);
308
        $subscrCount    = $helper->getHandler('Subscr')->getCount($subscrCriteria);
309
        if (0 == $subscrCount) {
310
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
311
        }
312
        // get subscr data
313
        $subscrObj    = $helper->getHandler('Subscr')->get($subscr_id);
314
        $subscr_email = $subscrObj->getVar('subscr_email');
315
        // resend the email with the confirmation code
316
        $xoopsMailer = xoops_getMailer();
317
        $xoopsMailer->reset();
318
        $xoopsMailer->setTemplateDir();
319
        $xoopsMailer->useMail();
320
        $xoopsMailer->setTemplate('activate.tpl');
321
        $xoopsMailer->setToEmails($subscr_email);
322
        if (isset($xoopsConfig['adminmail'])) {
323
            $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
324
        }
325
        if (isset($xoopsConfig['sitename'])) {
326
            $xoopsMailer->setFromName($xoopsConfig['sitename']);
327
        }
328
        $xoopsMailer->assign('EMAIL', $subscr_email);
329
        $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
330
        $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
331
        $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
332
        $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
333
        $activationKey = base64_encode(XOOPS_URL . "||addnew||{$subscr_id}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
334
        $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
335
        $subject = _MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename'];
336
        $xoopsMailer->setSubject($subject);
337
        if (!$xoopsMailer->send()) {
338
            $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
339
        } else {
340
            $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_RESENDMAIL_REG_OK);
341
        }
342
343
        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
344
        $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
345
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
346
        break;
347
    case 'add_subscription':
348
    case 'create_subscription':
349
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
350
        require_once XOOPS_ROOT_PATH . '/header.php';
351
352
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
353
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
354
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
355
        // breadcrumb
356
        $breadcrumb = new Xnewsletter\Breadcrumb();
357
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
358
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
359
360
        // get create subscr form
361
        if ('' != $subscr_email) {
362
            // existing email
363
            if (!xnewsletter_checkEmail($subscr_email)) {
364
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
365
            }
366
        } elseif ($uid > 0) {
367
            // take actual xoops user
368
            $subscr_email = $xoopsUser->email();
369
        } else {
370
            $subscr_email = '';
371
        }
372
        $subscrObj = $helper->getHandler('Subscr')->create();
373
        $subscrObj->setVar('subscr_email', $subscr_email);
374
        $subscrForm = $subscrObj->getForm();
375
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
376
        break;
377
    case 'edit_subscription':
378
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
379
        require_once XOOPS_ROOT_PATH . '/header.php';
380
381
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
382
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
383
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
384
        // breadcrumb
385
        $breadcrumb = new Xnewsletter\Breadcrumb();
386
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
387
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
388
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_EDIT, '');
389
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
390
391
        // get edit subscr form
392
        $subscr_id = Request::getInt('subscr_id', 0);
393
        if ($subscr_id <= 0) {
394
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
395
        }
396
        $subscrObj  = $helper->getHandler('Subscr')->get($subscr_id);
397
        $subscrForm = $subscrObj->getForm();
398
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
399
        break;
400
    case 'save_subscription':
401
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
402
        require_once XOOPS_ROOT_PATH . '/header.php';
403
404
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
405
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
406
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
407
        // breadcrumb
408
        $breadcrumb = new Xnewsletter\Breadcrumb();
409
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
410
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
411
        // init vars
412
        $actionProts_ok       = [];
413
        $actionProts_warning  = [];
414
        $actionProts_error    = [];
415
        $count_ok             = 0;
416
        $count_err            = 0;
417
        $activationKeyIsValid = false;
418
        // check right to subscribe directly
419
        $allowedWithoutActivationKey = false;
420 View Code Duplication
        if ($uid > 0) {
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...
421
            // if not anonymous subscriber / subscriber is a Xoops user
422
            $submitter_email = $xoopsUser->email();
423
            foreach ($xoopsUser->getGroups() as $group) {
424
                if (in_array($group, $helper->getConfig('xn_groups_without_actkey'))
425
                    || XOOPS_GROUP_ADMIN == $group) {
426
                    $allowedWithoutActivationKey = true;
427
                    break;
428
                }
429
            }
430
        }
431
        // if anonymous subscriber
432
        // NOP
433
434
        if ($allowedWithoutActivationKey) {
435
            // 1st case: subscribe WITHOUT confirmation
436
            // check form
437
            if (!$GLOBALS['xoopsSecurity']->check()) {
438
                redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
439
            }
440
            // check email
441
            if ('' == $subscr_email || !xnewsletter_checkEmail($subscr_email)) {
442
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
443
            }
444
            // get or create subscr
445 View Code Duplication
            if ($subscr_id > 0) {
446
                $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
447
                $saveType  = 'update';
448
            } else {
449
                $subscrObj = $helper->getHandler('Subscr')->create();
450
                $saveType  = 'addnew';
451
            }
452
            $subscrObj->setVar('subscr_sex', Request::getString('subscr_sex', ''));
453
            $subscrObj->setVar('subscr_firstname', Request::getString('subscr_firstname', ''));
454
            $subscrObj->setVar('subscr_lastname', Request::getString('subscr_lastname', ''));
455
            $subscrObj->setVar('subscr_email', Request::getString('subscr_email', ''));
456
            // insert subscr
457 View Code Duplication
            if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
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...
458
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br>' . $subscrObj->getHtmlErrors());
459
            }
460
            if ($subscr_id > 0) {
461
                $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
462
            } else {
463
                $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
464
            }
465
            $subscr_id = $subscrObj->getVar('subscr_id');
466
            // create $code_selections string
467
            $catCriteria = new \CriteriaCompo();
468
            $catCriteria->setSort('cat_id');
469
            $catCriteria->setOrder('ASC');
470
            $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
471
            $selections = [];
472 View Code Duplication
            foreach ($catObjs as $cat_id => $catObj) {
473
                // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
474
                $selection      = [];
475
                $selection[0]   = $cat_id;
476
                $selection[1]   = in_array($cat_id, $_REQUEST['cats']) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
477
                $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
478
                $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
479
                $code_selection = implode('-', $selection);
480
                $selections[]   = $code_selection;
481
                unset($selection);
482
            }
483
            $code_selections = implode('|', $selections);
484
        }
485
486
        if (!$allowedWithoutActivationKey) {
487
            // 2nd case: subscribe WITH confirmation
488
            if ('' == $activationKey) {
489
                // activation key DOESN'T EXIST
490
                // create and send confirmation email
491
                // check form
492
                if (!$GLOBALS['xoopsSecurity']->check()) {
493
                    redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
494
                }
495
                // check email
496
                if ('' == $subscr_email || !xnewsletter_checkEmail($subscr_email)) {
497
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
498
                }
499
                // get subscr fields from form
500
                $subscr_firstname = Request::getString('subscr_firstname', '');
501
                $subscr_lastname  = Request::getString('subscr_lastname', '');
502
                $subscr_sex       = Request::getString('subscr_sex', '');
503
                // create $code_selections string
504
                $catCriteria = new \CriteriaCompo();
505
                $catCriteria->setSort('cat_id');
506
                $catCriteria->setOrder('ASC');
507
                $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
508
                $selections = [];
509 View Code Duplication
                foreach ($catObjs as $cat_id => $catObj) {
510
                    // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
511
                    $selection      = [];
512
                    $selection[0]   = $cat_id;
513
                    $selection[1]   = in_array($cat_id, Request::getArray('cats')) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
514
                    $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
515
                    $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
516
                    $code_selection = implode('-', $selection);
517
                    $selections[]   = $code_selection;
518
                    unset($selection);
519
                }
520
                $code_selections = implode('|', $selections); // string
521
                //
522
                // get or create subscr
523 View Code Duplication
                if ($subscr_id > 0) {
524
                    $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
525
                    $saveType  = 'update';
526
                } else {
527
                    $subscrObj = $helper->getHandler('Subscr')->create();
528
                    $saveType  = 'addnew';
529
                }
530
                // fill subscr
531
                if ($subscr_id <= 0) {
532
                    // form subscr_email
533
                    $subscrObj->setVar('subscr_email', $subscr_email);
534
                    // form subscr_uid
535
                    $subscr_uid = 0;
536
                    $sql        = "SELECT `uid` FROM {$xoopsDB->prefix('users')}";
537
                    $sql        .= " WHERE (`email`='{$subscr_email}')";
538
                    $sql        .= ' LIMIT 1';
539
                    $user       = $xoopsDB->query($sql);
540
                    if ($user) {
541
                        $row_user   = $xoopsDB->fetchRow($user);
542
                        $subscr_uid = $row_user[0];
543
                    }
544
                    $subscrObj->setVar('subscr_uid', $subscr_uid);
545
                    // form subscr_submitter
546
                    $subscrObj->setVar('subscr_submitter', $uid);
547
                }
548
549
                $subscrObj->setVar('subscr_created', time());
550
                $subscrObj->setVar('subscr_ip', xoops_getenv('REMOTE_ADDR'));
551
                $subscr_actkey = xoops_makepass();
552
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
553
                // format subscr_actoptions: selected_newsletters||firstname||lastname||sex
554
                $activationOptions = [
555
                    'code_selections'  => $code_selections,
556
                    'subscr_firstname' => $subscr_firstname,
557
                    'subscr_lastname'  => $subscr_lastname,
558
                    'subscr_sex'       => $subscr_sex,
559
                    'subscr_created'   => $subscrObj->getVar('subscr_created'),
560
                    'subscr_ip'        => $subscrObj->getVar('subscr_ip'),
561
                ];
562
                $subscrObj->setVar('subscr_actoptions', $activationOptions); // XOBJ_DTYPE_ARRAY
563
                // insert subscr
564 View Code Duplication
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
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...
565
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br>' . $subscrObj->getHtmlErrors());
566
                }
567
                if ($subscr_id > 0) {
568
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
569
                } else {
570
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
571
                }
572
                $subscr_id = $subscrObj->getVar('subscr_id');
573
                // send the email with the confirmation code
574
                $xoopsMailer = xoops_getMailer();
575
                $xoopsMailer->reset();
576
                $xoopsMailer->setTemplateDir();
577
                $xoopsMailer->useMail();
578
                $xoopsMailer->setTemplate(('update' === $saveType) ? 'update.tpl' : 'activate.tpl');
579
                $xoopsMailer->setToEmails($subscr_email);
580
                if (isset($xoopsConfig['adminmail'])) {
581
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
582
                }
583
                if (isset($xoopsConfig['sitename'])) {
584
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
585
                }
586
                $xoopsMailer->assign('EMAIL', $subscr_email);
587
                $xoopsMailer->assign('SEX', '' != $subscrObj->getVar('subscr_sex') ? $subscrObj->getVar('subscr_sex') : $subscr_sex);
588
                $xoopsMailer->assign('FIRSTNAME', '' != $subscrObj->getVar('subscr_firstname') ? $subscrObj->getVar('subscr_firstname') : $subscr_firstname);
589
                $xoopsMailer->assign('LASTNAME', '' != $subscrObj->getVar('subscr_lastname') ? $subscrObj->getVar('subscr_lastname') : $subscr_lastname);
590
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
591
                $act           = [
592
                    XOOPS_URL,
593
                    $saveType,
594
                    $subscr_id,
595
                    $subscr_actkey,
596
                    $subscr_email,
597
                ];
598
                $activationKey = base64_encode(implode('||', $act));
599
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
600
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename']);
601 View Code Duplication
                if (!$xoopsMailer->send()) {
602
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
603
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
604
                } else {
605
                    $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_SENDMAIL_REG_OK);
606
                }
607
            } else {
608
                // activation key EXISTS
609
                // check confirmation email
610
                // check activation key
611
                $activationKey_array  = explode('||', base64_decode($activationKey, true));
612
                $activationKeyIsValid = false;
613
                if ((XOOPS_URL == $activationKey_array[0]) && ('' != trim($activationKey_array[1]))
614
                    && ((int)$activationKey_array[2] > 0)
615
                    && ('' != trim($activationKey_array[3]))) {
616
                    $activationKeyIsValid = true;
617
                } else {
618
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
619
                }
620
                $saveType      = trim($activationKey_array[1]);
621
                $subscr_id     = (int)$activationKey_array[2];
622
                $subscr_actkey = trim($activationKey_array[3]);
623
                // check given data with table subscr
624
                $subscrCriteria = new \CriteriaCompo();
625
                $subscrCriteria->add(new \Criteria('subscr_id', $subscr_id));
626
                $subscrCriteria->add(new \Criteria('subscr_actkey', $subscr_actkey));
627
                $subscrCriteria->setLimit(1);
628
                $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
629
                if (0 == $subscrCount) {
630
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NODATAKEY);
631
                }
632
                // get subscr
633
                $subscrObj         = $helper->getHandler('Subscr')->get($subscr_id);
634
                $activationOptions = $subscrObj->getVar('subscr_actoptions'); // XOBJ_DTYPE_ARRAY
635
                // check time: confirmation not later than ... hours
636
                if ((0 != $helper->getConfig('confirmation_time'))
637
                    && ((int)$activationOptions['subscr_created'] < time() - (3600 + (int)$helper->getConfig('confirmation_time')))) {
638
                    // time expired
639
                    $subscrObj->setVar('subscr_actkey', '');
640
                    $subscrObj->setVar('subscr_actoptions', []);
641
                    $helper->getHandler('Subscr')->insert($subscrObj);
642
                    // IN PROGRESS
643
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_KEYEXPIRED);
644
                }
645
                // get subscr fields from subscr_actoptions
646
                $subscr_sex       = $activationOptions['subscr_sex'];
647
                $subscr_firstname = $activationOptions['subscr_firstname'];
648
                $subscr_lastname  = $activationOptions['subscr_lastname'];
649
                // insert subscr
650
                $subscrObj->setVar('subscr_sex', $subscr_sex);
651
                $subscrObj->setVar('subscr_firstname', $subscr_firstname);
652
                $subscrObj->setVar('subscr_lastname', $subscr_lastname);
653
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
654
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
655
                }
656
                $code_selections = $activationOptions['code_selections']; // string
657
            }
658
        }
659
        //
660
        //
661
        // subscribe subscr to cat (create/update catsubscr)
662
        if ($activationKeyIsValid || $allowedWithoutActivationKey) {
663
            // update xnewsletter_subscr
664
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
665
            if (0 == $subscrObj->getVar('subscr_activated')) {
666
                $subscrObj->setVar('subscr_created', time());
667
                $subscrObj->setVar('subscr_ip', xoops_getenv('REMOTE_ADDR'));
668
                $subscrObj->setVar('subscr_activated', 1);
669
            }
670
            // reset act fields
671
            $subscrObj->setVar('subscr_actkey', '');
672
            $subscrObj->setVar('subscr_actoptions', []);
673
            // insert subscr
674
            if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
675
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
676
            }
677
            // create cat subscr
678
            $selections = explode('|', $code_selections); // array
679
            foreach ($selections as $code_selection) {
680
                if ('' == $code_selection) {
681
                    $code_selection = '0-0-0-0';
682
                }
683
                $selection           = explode('-', $code_selection); // array
684
                $cat_id              = $selection[0];
685
                $catsubcr            = $selection[1];
686
                $catsubcr_id_old     = (int)$selection[2];
687
                $catsubcr_quited_old = (int)$selection[3];
688
                $catObj              = $helper->getHandler('Cat')->get($cat_id);
689
                $cat_mailinglist     = $catObj->getVar('cat_mailinglist');
690
                $cat_name            = $catObj->getVar('cat_name');
691
                if ('1' == $catsubcr && 0 == $catsubcr_id_old) {
692
                    $catsubscrObj = $helper->getHandler('Catsubscr')->create();
693
                    $catsubscrObj->setVar('catsubscr_catid', $cat_id);
694
                    $catsubscrObj->setVar('catsubscr_subscrid', $subscr_id);
695
                    $catsubscrObj->setVar('catsubscr_submitter', $uid);
696
                    $catsubscrObj->setVar('catsubscr_created', time());
697
                    if ($helper->getHandler('Catsubscr')->insert($catsubscrObj)) {
698
                        $count_ok++;
699
                        if ($catsubcr_id_old > 0) {
700
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
701
                        } else {
702
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SUBSCRIBE);
703
                        }
704
                        // handle mailinglists
705
                        if ($cat_mailinglist > 0) {
706
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
707
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_SUBSCRIBE, $subscr_id, $cat_mailinglist);
708
                        }
709
                    } else {
710
                        $count_err++;
711
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
712
                    }
713
                } elseif ('0' == $catsubcr && $catsubcr_id_old > 0) {
714
                    // unsubscribe / delete old subscription
715
                    $catsubscrObj = $helper->getHandler('Catsubscr')->get($catsubcr_id_old);
716 View Code Duplication
                    if ($helper->getHandler('Catsubscr')->delete($catsubscrObj, true)) {
717
                        // handle mailinglists
718
                        if ($cat_mailinglist > 0) {
719
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
720
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_UNSUBSCRIBE, $subscr_id, $cat_mailinglist);
721
                        }
722
                    } else {
723
                        $count_err++;
724
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
725
                    }
726
                    /*
727
                                        if ($count_err > 0) {
728
                                            redirect_header($currentFile, 3, _AM_XNEWSLETTER_FORMDELNOTOK);
729
                                        }
730
                    */
731
                    $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_UNSUBSCRIBE);
732
                } elseif ($catsubcr_id_old > 0 && $catsubcr_quited_old > 0) {
733
                    // newsletter stay selected, but catsubscr_quited will be removed
734
                    $catsubscrObj = $helper->getHandler('Catsubscr')->get($catsubcr_id_old);
735
                    // Form catsubscr_quited
736
                    $catsubscrObj->setVar('catsubscr_quited', '0');
737
                    if ($helper->getHandler('Catsubscr')->insert($catsubscrObj)) {
738
                        $count_ok++;
739
                        $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_DAT_QUITED_REMOVED);
740
                    } else {
741
                        $count_err++;
742
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
743
                    }
744
                } elseif ($catsubcr_id_old > 0) {
745
                    // newsletter still subscribed
746
                    $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
747
                }
748
                // nothing to do
749
            }
750
            //
751
            // send infomail to subscriber if current user (submitter) is not the subscriber (subscr)
752
            if (isset($submitter_email) && ('' != $submitter_email) && ($submitter_email != $subscr_email)) {
753
                if ('' == $subscr_sex && '' == $subscr_firstname && '' == $subscr_lastname) {
754
                    $subscrObj        = $helper->getHandler('Subscr')->get($subscr_id);
755
                    $subscr_sex       = $subscrObj->getVar('subscr_sex');
756
                    $subscr_firstname = $subscrObj->getVar('subscr_firstname');
757
                    $subscr_lastname  = $subscrObj->getVar('subscr_lastname');
758
                }
759
                // send the email with the confirmation code
760
                $xoopsMailer = xoops_getMailer();
761
                $xoopsMailer->reset();
762
                $xoopsMailer->setTemplateDir();
763
                $xoopsMailer->useMail();
764
                $xoopsMailer->setHTML();
765
                $xoopsMailer->setTemplate('info_change.tpl');
766
                $xoopsMailer->setToEmails($subscr_email);
767
                if (isset($xoopsConfig['adminmail'])) {
768
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
769
                }
770
                if (isset($xoopsConfig['sitename'])) {
771
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
772
                }
773
                $xoopsMailer->assign('EMAIL', $subscr_email);
774
                $xoopsMailer->assign('SEX', $subscr_sex);
775
                $xoopsMailer->assign('FIRSTNAME', $subscr_firstname);
776
                $xoopsMailer->assign('LASTNAME', $subscr_lastname);
777
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
778
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?subscr_email={$subscr_email}");
779
                $xoopsMailer->assign('USERLINK', XOOPS_URL . '/userinfo.php?uid=' . $xoopsUser->uid());
780
                $xoopsMailer->assign('USERNAME', $xoopsUser->name());
781
                $subject = _MA_XNEWSLETTER_SUBSCRIPTION_SUBJECT_CHANGE . $GLOBALS['xoopsConfig']['sitename'];
782
                $xoopsMailer->setSubject($subject);
783 View Code Duplication
                if (!$xoopsMailer->send()) {
784
                    $count_err++;
785
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
786
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
787
                } else {
788
                    $actionProts_ok[] = str_replace('%e', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SENT_INFO);
789
                }
790
            }
791
            if (0 == $count_err) {
792
                if ('addnew' === $saveType) {
793
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_CLOSED;
794
                } else {
795
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_UPDATE_CLOSED;
796
                }
797
                //$actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_OK;
798
            }
799
        }
800
801
        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
802
        $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
803
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
804
        break;
805
    case 'delete_subscription':
806
        if ((!$activationKey && $subscr_id <= 0) && ('1' != $_SESSION['unsub'])) {
807
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
808
        }
809
        // IN PROGRESS
810
        if ('1' == $_SESSION['unsub']) {
811
            $subscrCriteria = new \CriteriaCompo();
812
            $subscrCriteria->add(new \Criteria('subscr_email', $subscr_email));
813
            $subscrCriteria->setLimit(1);
814
            $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
815
            if (0 == $subscrCount) {
816
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
817
            }
818
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
819
            $subscr_id = $subscrObj->getVar('subscr_id');
820
        }
821
        // IN PROGRESS
822
823
        if (Request::getBool('ok', false, 'POST') || '' != $activationKey) {
824
            $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
825
            require_once XOOPS_ROOT_PATH . '/header.php';
826
827
            $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
828
            $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
829
            $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
830
            // breadcrumb
831
            $breadcrumb = new Xnewsletter\Breadcrumb();
832
            $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
833
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
834
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
835
            $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
836
            // init vars
837
            $actionProts_ok       = [];
838
            $actionProts_warning  = [];
839
            $actionProts_error    = [];
840
            $count_ok             = 0;
841
            $count_err            = 0;
842
            $activationKeyIsValid = false;
843
            // check right to unsubscribe directly
844
            $allowedWithoutActivationKey = false;
845 View Code Duplication
            if ($uid > 0) {
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...
846
                // if not anonymous subscriber / subscriber is a Xoops user
847
                $submitter_email = $xoopsUser->email();
848
                foreach ($xoopsUser->getGroups() as $group) {
849
                    if (in_array($group, $helper->getConfig('xn_groups_without_actkey'))
850
                        || XOOPS_GROUP_ADMIN == $group) {
851
                        $allowedWithoutActivationKey = true;
852
                        break;
853
                    }
854
                }
855
            }
856
            // if anonymous subscriber
857
            // NOP
858
859
            if ('' != $activationKey || $allowedWithoutActivationKey) {
860
                // 1st case: unsubscribe WITHOUT confirmation
861
                // 2nd case: unsubscribe WITH confirmation & activation key EXISTS
862
                // check given data with table subscr
863
                $subscrCriteria = new \CriteriaCompo();
864
                $subscrCriteria->add(new \Criteria('subscr_email', $subscr_email));
865
                $subscrCriteria->add(new \Criteria('subscr_id', $subscr_id));
866
                // got actkey or user is allowed to delete without actkey
867
                if ('' != $activationKey) {
868
                    // check activation key
869
                    $activationKey_array  = explode('||', base64_decode($activationKey, true));
870
                    $activationKeyIsValid = false;
871
                    $subscr_id            = (int)$activationKey_array[1];
872
                    $subscr_actkey        = trim($activationKey_array[2]);
873
                    $subscr_email         = trim($activationKey_array[3]);
874
                    if ((XOOPS_URL == $activationKey_array[0]) && ((int)$activationKey_array[1] > 0)
875
                        && ('' != trim($activationKey_array[2]))) {
876
                        $activationKeyIsValid = true;
877
                    } else {
878
                        redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
879
                    }
880
                    $subscrCriteria->add(new \Criteria('subscr_actkey', $subscr_actkey));
881
                }
882
                $subscrCriteria->setLimit(1);
883
                $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
884
                if (0 == $subscrCount) {
885
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
886
                }
887
                $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
888
                // delete subscriber (subscr), subscriptions (catsubscrs) and mailinglist
889
                if (!$helper->getHandler('Subscr')->delete($subscrObj, true)) {
890
                    $actionProts_error[] = $subscrObj->getHtmlErrors();
891
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR . $subscrObj->getHtmlErrors());
892
                }
893
                if (0 == $count_err) {
894
                    $actionProts_ok[] = _AM_XNEWSLETTER_FORMDELOK;
895
                }
896
            } else {
897
                // 2nd case: unsubscribe WITH confirmation & activation key DOESN'T EXIST
898
                // check form
899
                if (!$GLOBALS['xoopsSecurity']->check()) {
900
                    redirect_header('subscr.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
901
                }
902
                $subscrObj     = $helper->getHandler('Subscr')->get($subscr_id);
903
                $subscr_actkey = xoops_makepass();
904
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
905
                // insert subscr
906
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
907
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
908
                }
909
                //                if (!$allowedWithoutActivationKey) {
910
                $xoopsMailer = xoops_getMailer();
911
                $xoopsMailer->reset();
912
                $xoopsMailer->setTemplateDir();
913
                $xoopsMailer->useMail();
914
                $xoopsMailer->setTemplate('delete.tpl');
915
                $xoopsMailer->setToEmails($subscrObj->getVar('subscr_email'));
916
                if (isset($xoopsConfig['adminmail'])) {
917
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
918
                }
919
                if (isset($xoopsConfig['sitename'])) {
920
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
921
                }
922
                $xoopsMailer->assign('EMAIL', $subscrObj->getVar('subscr_email'));
923
                $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
924
                $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
925
                $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
926
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
927
                $act           = [
928
                    XOOPS_URL,
929
                    $subscrObj->getVar('subscr_id'),
930
                    $subscrObj->getVar('subscr_actkey'),
931
                    $subscrObj->getVar('subscr_email'),
932
                ];
933
                $activationKey = base64_encode(implode('||', $act));
934
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=unsub&email={$subscrObj->getVar('subscr_email')}&actkey={$activationKey}");
935
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_DELETESUBJECT . $GLOBALS['xoopsConfig']['sitename']);
936
                if (!$xoopsMailer->send()) {
937
                    $count_err++;
938
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
939
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
940
                }
941
                //                }
942
                if (0 == $count_err) {
943
                    $actionProts_ok[] = str_replace('%subscr_email', $subscrObj->getVar('subscr_email'), _MA_XNEWSLETTER_SENDMAIL_UNREG_OK);
944
                }
945
            }
946
947
            $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
948
            $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
949
            $xoopsTpl->assign('actionProts_error', $actionProts_error);
950
        } else {
951
            $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_empty.tpl';
952
            require_once XOOPS_ROOT_PATH . '/header.php';
953
954
            $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
955
            $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
956
            $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
957
            // breadcrumb
958
            $breadcrumb = new Xnewsletter\Breadcrumb();
959
            $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
960
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
961
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
962
            $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
963
964
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
965
            xoops_confirm([
966
                              'ok'           => true,
967
                              'subscr_id'    => $subscr_id,
968
                              'subscr_email' => $subscr_email,
969
                              'op'           => 'delete_subscription',
970
                          ], $currentFile, sprintf(_MA_XNEWSLETTER_SUBSCRIPTION_DELETE_SURE));
971
        }
972
        break;
973
}
974
975
require_once __DIR__ . '/footer.php';
976