Completed
Pull Request — master (#24)
by Michael
01:52
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 - ( http://www.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
 *  Version : $Id: subscription.php 12559 2014-06-02 08:10:39Z beckmi $
26
 * ****************************************************************************
27
 */
28
29
$currentFile = basename(__FILE__);
30
include_once __DIR__ . '/header.php';
31
32
$op            = XoopsRequest::getString('op', 'list_subscriptions');
33
$activationKey = XoopsRequest::getString('actkey', '');
34
$subscr_id     = XoopsRequest::getInt('subscr_id', 0);
35
$subscr_email  = ($op !== 'unsub') ? XoopsRequest::getString('subscr_email', '') : '';
36
$ip            =  xoops_getenv('REMOTE_ADDR');
37
38
if ($op === 'save_subscription' || $activationKey != '') {
39
    $xoopsOption['template_main'] = 'xnewsletter_subscription_result.tpl';
40
} else {
41
    $xoopsOption['template_main'] = 'xnewsletter_subscription.tpl';
42
}
43
if (isset($_REQUEST['addnew'])) {
44
    $op = 'addnew_subscription';
45
}
46
if ($activationKey && $op !== 'delete_subscription_confirmed' && $op !== 'unsub') {
47
    $op = 'save_subscription';
48
}
49
if ($op === 'delete_subscription_confirmed') {
50
    $op = 'delete_subscription';
51
}
52
if ($op === 'unsub') {
53
    $op = 'list_subscriptions';
54
    $xoopsOption['template_main'] = 'xnewsletter_subscription.tpl';
55
    $_SESSION['redirect_mail'] = XoopsRequest::getString('email', '');
56
    $_SESSION['unsub'] = '1';
57
}
58
59
//to avoid errors in debug when xn_groups_change_other
60
$subscr_sex = '';
61
$subscr_firstname = '';
62
$subscr_lastname = '';
63
64
$count_ok = 0;
65
$count_err = 0;
66
$actionProts_ok = []; // IN PROGRESS: remove from here
67
$actionProts_error = []; // IN PROGRESS: remove from here
68
69
switch ($op) {
70
    case 'resend_subscription' :
71
        $actionProts_ok = [];
72
        $actionProts_error = [];
73
        $xoopsOption['template_main'] = 'xnewsletter_subscription_result.tpl';
74
        include_once XOOPS_ROOT_PATH . '/header.php';
75
76
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
77
        $xoTheme->addMeta('meta', 'keywords', $xnewsletter->getConfig('keywords')); // keywords only for index page
78
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
79
80
        // Breadcrumb
81
        $breadcrumb = new XnewsletterBreadcrumb();
82
        $breadcrumb->addLink($xnewsletter->getModule()->getVar('name'), XNEWSLETTER_URL);
83
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
84
85
        // resend the email with the confirmation code
86
        $subscr_id = XoopsRequest::getInt('subscr_id', 0);
87
        $subscrCriteria = new CriteriaCompo();
88
        $subscrCriteria->add(new Criteria('subscr_id', $subscr_id));
89
        $subscrCount = $xnewsletter->getHandler('subscr')->getCount($subscrCriteria);
90
        if ($subscrCount > 0) {
91
            $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
92
            $subscr_email = $subscrObj->getVar('subscr_email');
93
            $xoopsMailer = xoops_getMailer();
94
            $xoopsMailer->reset();
95
            $xoopsMailer->setTemplateDir();
96
            $xoopsMailer->useMail();
97
            $xoopsMailer->setTemplate('activate.tpl');
98
            $xoopsMailer->setToEmails($subscr_email);
99
            if (isset($xoopsConfig['adminmail'])) $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
100
            if (isset($xoopsConfig['sitename'])) $xoopsMailer->setFromName($xoopsConfig['sitename']);
101
            $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
102
            $xoopsMailer->assign('EMAIL', $subscr_email);
103
            $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
104
            $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
105
            $xoopsMailer->assign('IP', $ip);
106
            $activationKey = base64_encode(XOOPS_URL . "||addnew||{$subscr_id}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
107
            $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
108
            $subject = _MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename'];
109
            $xoopsMailer->setSubject($subject);
110
            if (!$xoopsMailer->send()) {
111
                $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br />' . $xoopsMailer->getErrors();
112
            }
113
            $actionProts_ok[] = str_replace ('%nl', $cat_name, _MA_XNEWSLETTER_SENDMAIL_REG_OK);
114
        } else {
115
            // IN PROGRESS
116
            redirect_header($currentFile, 5, 'IN PROGRESS: error');
117
        }
118
        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
119
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
120
        break;
121
122
    case 'save_subscription' :
123
        include_once XOOPS_ROOT_PATH . '/header.php';
124
125
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
126
        $xoTheme->addMeta('meta', 'keywords', $xnewsletter->getConfig('keywords')); // keywords only for index page
127
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
128
129
        // Breadcrumb
130
        $breadcrumb = new XnewsletterBreadcrumb();
131
        $breadcrumb->addLink($xnewsletter->getModule()->getVar('name'), XNEWSLETTER_URL);
132
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
133
134
        // check right to subscribe directly
135
        $submitterUid = is_object($xoopsUser) ? (int) $xoopsUser->getVar('uid') : 0;
136
        $allowedWithoutActivationKey = false;
137
        if ($submitterUid > 0) {
138
            // user logged in
139
            $submitter_email = $xoopsUser->email();
140 View Code Duplication
            foreach ($xoopsUser->getGroups() as $group) {
141
                if (in_array($group, $xnewsletter->getConfig('xn_groups_without_actkey')) || XOOPS_GROUP_ADMIN == $group) {
142
                    $allowedWithoutActivationKey = true;
143
                    break;
144
                }
145
            }
146
        } else {
147
            // user not logged in
148
            // NOP
149
        }
150
151
        if (!$activationKey) {
152
            // activation key doesn't exist
153
            if (!$GLOBALS['xoopsSecurity']->check()) {
154
                redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
155
            }
156
            if ($subscr_email == '') {
157
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
158
            }
159
            if (!xnewsletter_checkEmail($subscr_email))
160
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
161
162
163
            // read current selections and create code for actkey
164
            $cat_selections = [];
165
            $code_selections = '';
166
            $catCriteria = new CriteriaCompo();
167
            $catCriteria->setSort('cat_id');
168
            $catCriteria->setOrder('ASC');
169
            $catObjs = $xnewsletter->getHandler('cat')->getAll($catCriteria);
170
171
            foreach ($catObjs as $cat_id => $catObj) {
172
                // create selection code: cat_id - cat selected - old catsubcr_id - old catsubscr_quited
173
                $code_selections .= ($code_selections == '') ? '' : '|';
174
                $code_selections .= $cat_id . '-';
175
                $code_selections .= (isset($_REQUEST["letter_cats_{$cat_id}"])) ? '1' : '0';
176
                $code_selections .= '-';
177
                $old_catsubcr_id = XoopsRequest::getInt("letter_cats_old_catsubcr_id_{$cat_id}", 0);
178
                $code_selections .= $old_catsubcr_id;
179
                $code_selections .= '-';
180
                $old_catsubcr_quited = XoopsRequest::getInt("letter_cats_old_catsubscr_quited_{$cat_id}", 0);
181
                $code_selections .= $old_catsubcr_quited;
182
            }
183
184
            // save subscriber first
185
            if ($subscr_id > 0) {
186
                $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
187
                $saveType = 'update';
188
            } else {
189
                $subscrObj = $xnewsletter->getHandler('subscr')->create();
190
                $saveType = 'addnew';
191
            }
192
193
            if ($subscr_id < 1 || $allowedWithoutActivationKey) {
194
                // form subscr_email
195
                $subscrObj->setVar('subscr_email', $subscr_email);
196
                // form subscr_uid
197
                $subscr_uid = 0;
198
                $sql = "SELECT `uid` FROM {$xoopsDB->prefix('users')}";
199
                $sql .= " WHERE (`email`='{$subscr_email}')";
200
                $sql .= ' LIMIT 1';
201 View Code Duplication
                if ($user = $xoopsDB->query($sql)) {
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...
202
                    $row_user = $xoopsDB->fetchRow($user);
203
                    $subscr_uid = $row_user[0];
204
                }
205
                $subscrObj->setVar('subscr_uid', (int) $subscr_uid);
206
                // form subscr_submitter
207
                $subscrObj->setVar('subscr_submitter', $submitterUid);
208
            }
209
210
            $subscr_actkey = xoops_makepass();
211
            $subscrObj->setVar('subscr_actkey', $subscr_actkey);
212
            // form subscr_created
213
            //$subscrObj->setVar("subscr_created", time()); //kann eigentlich immer gespeichert werden
214
            //$subscrObj->setVar("subscr_ip", $ip); //kann eigentlich immer gespeichert werden
215
            //Nicht speichern, sondern nur beim anlegen und 1. Bestaetigen
216
            if ($subscr_id < 1) {
217
                $subscrObj->setVar('subscr_created', time());
218
                $subscrObj->setVar('subscr_ip', $ip);
219
                $subscrObj->setVar('subscr_activated', 0);
220
            }
221
222
            if ($activationKey || $allowedWithoutActivationKey) {
223
                // subscr_firstname
224
                $subscrObj->setVar('subscr_firstname', XoopsRequest::getString('subscr_firstname', ''));
225
                // subscr_lastname
226
                $subscrObj->setVar('subscr_lastname',  XoopsRequest::getString('subscr_lastname', ''));
227
                // subscr_sex
228
                $subscrObj->setVar('subscr_sex', XoopsRequest::getString('subscr_sex', ''));
229
                // subscr_actoptions
230
                $subscrObj->setVar('subscr_actoptions', '');
231
            } else {
232
                //format subscr_actoptions: selected_newsletters||firstname||lastname||sex
233
                $code_options = [];
234
                $code_options[0] = $code_selections;
235
                $code_options[1] = XoopsRequest::getString('subscr_firstname', '');
236
                $code_options[2] = XoopsRequest::getString('subscr_lastname', '');
237
                $code_options[3] = XoopsRequest::getString('subscr_sex', '');
238
                $code_options[4] = time();
239
                $code_options[5] = $ip;
240
                $subscrObj->setVar('subscr_actoptions', serialize($code_options));
241
            }
242
243
            if ($xnewsletter->getHandler('subscr')->insert($subscrObj)) {
244
                if ($subscr_id < 1) {
245
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
246
                } else {
247
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
248
                }
249
                $subscr_id = $subscrObj->getVar('subscr_id');
250
251
                if ($allowedWithoutActivationKey) {
252
                    $isValid = true;
253
                    $cat_selections = explode('|', $code_selections);
254
                } else {
255
                    $isValid = false;
256
                    $xoopsMailer = xoops_getMailer();
257
                    $xoopsMailer->reset();
258
                    $xoopsMailer->setTemplateDir();
259
                    $xoopsMailer->useMail();
260
                    if ($saveType === 'update') {
261
                        $xoopsMailer->setTemplate('update.tpl');
262
                    } else {
263
                        $xoopsMailer->setTemplate('activate.tpl');
264
                    }
265
                    $xoopsMailer->setToEmails($subscr_email);
266
                    if (isset($xoopsConfig['adminmail'])) $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
267
                    if (isset($xoopsConfig['sitename'])) $xoopsMailer->setFromName($xoopsConfig['sitename']);
268
                    $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
269
                    $xoopsMailer->assign('EMAIL', $subscr_email);
270
                    $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
271
                    $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
272
                    $xoopsMailer->assign('IP', $ip);
273
                    $activationKey = base64_encode(XOOPS_URL . "||{$saveType}||{$subscr_id}||{$subscr_actkey}||{$subscr_email}");
274
                    $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
275
                    $subject = _MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename'];
276
                    $xoopsMailer->setSubject($subject);
277
                    if (!$xoopsMailer->send()) {
278
                        redirect_header($currentFile, 10, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br />' . $xoopsMailer->getErrors());
279
                    }
280
                    $actionProts_ok[] = _MA_XNEWSLETTER_SENDMAIL_REG_OK;
281
                }
282
            } else {
283
                redirect_header($currentFile, 20, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br />' . $subscrObj->getHtmlErrors());
284
            }
285
        } else {
286
            // activation key exist
287
            $activationKey_array = explode('||', base64_decode($activationKey));
288
            $isValid = false;
289
            if ($activationKey_array[0] == XOOPS_URL) { // from here
290
                if (trim($activationKey_array[1]) != '') { // savetype ok
291
                    if ((int) $activationKey_array[2] > 0) { // user is ok
292
                        if (trim($activationKey_array[3]) != '') {
293
                            $isValid = true;
294
                        }
295
                    }
296
                }
297
            }
298
299
            if (!$isValid) {
300
                redirect_header($currentFile, 5, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
301
            } else {
302
                $saveType = trim($activationKey_array[1]);
303
                $subscr_id = (int) $activationKey_array[2];
304
                $subscr_actkey = trim($activationKey_array[3]);
305
306
                //check given data with table subscr
307
                $subscrCriteria = new CriteriaCompo();
308
                $subscrCriteria->add(new Criteria('subscr_id', $subscr_id));
309
                $subscrCriteria->add(new Criteria('subscr_actkey', $subscr_actkey));
310
                $subscrCount = $xnewsletter->getHandler('subscr')->getCount($subscrCriteria);
311
                if ($subscrCount == 0)
312
                    redirect_header($currentFile, 5, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NODATAKEY);
313
314
                //read data from table subscr
315
                $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
316
                $actoptions = unserialize(trim($subscrObj->getVar('subscr_actoptions', 'N')));
317
                //format subscr_actoptions:selected_newsletters||firstname||lastname||sex||date||ip
318
                $cat_selections = explode('|', trim($actoptions[0]));
319
                $subscr_firstname = trim($actoptions[1]);
320
                $subscr_lastname = trim($actoptions[2]);
321
                $subscr_sex = trim($actoptions[3]);
322
                if ((int) $actoptions[4] < time() - 86400) { //Zeit checken -> 24 Stunden ??
323
                    //Zeit abgelaufen
324
                    $subscrObj->setVar('subscr_actkey', '');
325
                    $subscrObj->setVar('subscr_actoptions', '');
326
                    $xnewsletter->getHandler('subscr')->insert($subscrObj);
327
                    redirect_header($currentFile, 5, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NODATAKEY);
328
                }
329
            }
330
        }
331
332
        if ($isValid) {
333
            // update xnewsletter_subscr
334
            $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
335
            if (!$allowedWithoutActivationKey) {
336
                if ($subscr_actkey != $subscrObj->getVar('subscr_actkey')) {
337
                    redirect_header($currentFile, 2, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOVALIDKEY);
338
                }
339
            }
340
            if ($subscrObj->getVar('subscr_activated') == 0) {
341
                $subscrObj->setVar('subscr_created', time());
342
                $subscrObj->setVar('subscr_ip', $ip);
343
                $subscrObj->setVar('subscr_activated', 1);
344
            }
345
            $subscrObj->setVar('subscr_actkey', '');
346
            $subscrObj->setVar('subscr_actoptions', '');
347
348
            if ($activationKey) {
349
                $subscrObj->setVar('subscr_sex', $subscr_sex);
350
                $subscrObj->setVar('subscr_firstname', $subscr_firstname);
351
                $subscrObj->setVar('subscr_lastname', $subscr_lastname);
352
            }
353
            if (!$xnewsletter->getHandler('subscr')->insert($subscrObj)) {
354
                redirect_header($currentFile, 2, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
355
            } else {
356
                if ($saveType === 'addnew') {
357
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_CLOSED;
358
                } else {
359
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_UPDATE_CLOSED;
360
                }
361
            }
362
            // handle current selections
363
            foreach ($cat_selections as $sel) {
364
                $selection = [];
365
                if ($sel == '') $sel = '0-0-0-0';
366
                $selection = explode('-', $sel);
367
                $cat_id = $selection[0];
368
                $catsubcr = $selection[1];
369
                $catsubcr_id_old = (int) $selection[2];
370
                $catsubcr_quited_old = (int) $selection[3];
371
                $catObj = $xnewsletter->getHandler('cat')->get($cat_id);
372
                $cat_mailinglist = $catObj->getVar('cat_mailinglist');
373
                $cat_name = $catObj->getVar('cat_name');
374
                if ($catsubcr == '1' && $catsubcr_id_old == 0) {
375
                    // subscribe
376
                    $catsubscrObj = $xnewsletter->getHandler('catsubscr')->create();
377
                    //Form catsubscr_catid
378
                    $catsubscrObj->setVar('catsubscr_catid', $cat_id);
379
                    //Form catsubscr_subscrid
380
                    $catsubscrObj->setVar('catsubscr_subscrid', $subscr_id);
381
                    //Form catsubscr_submitter
382
                    $catsubscrObj->setVar('catsubscr_submitter', $submitterUid);
383
                    //Form catsubscr_submitter
384
                    $catsubscrObj->setVar('catsubscr_created', time());
385
                    if ($xnewsletter->getHandler('catsubscr')->insert($catsubscrObj)) {
386
                        $count_ok++;
387
                        if ($catsubcr_id_old > 0) {
388
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
389
                        } else {
390
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SUBSCRIBE);
391
                        }
392
                        //handle mailinglists
393
                        if ($cat_mailinglist > 0) {
394
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
395
                            subscribingMLHandler(1, $subscr_id, $cat_mailinglist);
396
                        }
397
                    } else {
398
                        $count_err++;
399
                        $actionProts_error[]= _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR . $catsubscrObj->getHtmlErrors();
400
                    }
401
                } elseif ($catsubcr == '0' && $catsubcr_id_old > 0) {
402
                    // unsubscribe / delete old subscription
403
                    $catsubscrObj = $xnewsletter->getHandler('catsubscr')->get($catsubcr_id_old);
404
                    if ($xnewsletter->getHandler('catsubscr')->delete($catsubscrObj, true)) {
405
                        //handle mailinglists
406
                        if ($cat_mailinglist > 0) {
407
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
408
                            subscribingMLHandler(0, $subscr_id, $cat_mailinglist);
409
                        }
410
                    } else {
411
                        $count_err++;
412
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR . $catsubscrObj->getHtmlErrors();
413
                    }
414
415
                    if ($count_err > 0) {
416
                        redirect_header($currentFile, 3, _AM_XNEWSLETTER_FORMDELNOTOK);
417
                    }
418
                    $actionProts_ok[] = str_replace ('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_UNSUBSCRIBE);
419
                } elseif ($catsubcr_id_old > 0 && $catsubcr_quited_old > 0) {
420
                    // newsletter stay selected, but catsubscr_quited will be removed
421
                    $catsubscrObj = $xnewsletter->getHandler('catsubscr')->get($catsubcr_id_old);
422
                    //Form catsubscr_quited
423
                    $catsubscrObj->setVar('catsubscr_quited', '0');
424
425
                    if ($xnewsletter->getHandler('catsubscr')->insert($catsubscrObj)) {
426
                        $count_ok++;
427
                        $actionProts_ok[] = str_replace ('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_DAT_QUITED_REMOVED);
428
                    } else {
429
                        $count_err++;
430
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR . $catsubscrObj->getHtmlErrors();
431
                    }
432
                } elseif ($catsubcr_id_old > 0) {
433
                    // newsletter still subscribed
434
                    $actionProts_ok[] = str_replace ('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
435
                } else {
436
                    // nothing to do
437
                }
438
            }
439
        }
440
441
442
443
        if (isset($submitter_email) && ($submitter_email != '') && ($submitter_email != $subscr_email)) {
444
            //send infomail to subscriber, because current user is not the subscriber
445
            if ($subscr_sex == '' && $subscr_firstname == '' && $subscr_lastname == '') {
446
                $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
447
                $subscr_sex = $subscrObj->getVar('subscr_sex');
448
                $subscr_firstname = $subscrObj->getVar('subscr_firstname');
449
                $subscr_lastname = $subscrObj->getVar('subscr_lastname');
450
            }
451
            $xoopsMailer = xoops_getMailer();
452
            $xoopsMailer->reset();
453
            $xoopsMailer->setTemplateDir();
454
            $xoopsMailer->useMail();
455
            $xoopsMailer->setHTML();
456
            $xoopsMailer->setTemplate('info_change.tpl');
457
            $xoopsMailer->setToEmails($subscr_email);
458
            if (isset($xoopsConfig['adminmail'])) $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
459
            if (isset($xoopsConfig['sitename'])) $xoopsMailer->setFromName($xoopsConfig['sitename']);
460
            $xoopsMailer->assign('SEX', $subscr_sex);
461
            $xoopsMailer->assign('EMAIL', $subscr_email);
462
            $xoopsMailer->assign('FIRSTNAME', $subscr_firstname);
463
            $xoopsMailer->assign('LASTNAME', $subscr_lastname);
464
465
            $xoopsMailer->assign('IP', $ip);
466
            $actlink = XOOPS_URL . "/modules/xnewsletter/{$currentFile}?subscr_email={$subscr_email}";
467
            $xoopsMailer->assign('ACTLINK', $actlink);
468
            $user_link = XOOPS_URL . '/userinfo.php?uid=' . $xoopsUser->uid();
469
            $user_name = $xoopsUser->name();
470
            $xoopsMailer->assign('USERLINK', $user_link);
471
            $xoopsMailer->assign('USERNAME', $user_name);
472
            $subject_change = _MA_XNEWSLETTER_SUBSCRIPTION_SUBJECT_CHANGE . $GLOBALS['xoopsConfig']['sitename'];
473
            $xoopsMailer->setSubject($subject_change);
474
            if ($xoopsMailer->send()) {
475
                $actionProts_ok[] = str_replace('%e', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SENT_INFO);
476
            } else {
477
                redirect_header($currentFile, 10, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br />' . $xoopsMailer->getErrors());
478
            }
479
        }
480
481
        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
482
483
        if ($count_err > 0) {
484
            $xoopsTpl->assign('subscription_result', _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
485
            $xoopsTpl->assign('actionProts_error', $actionProts_error);
486
        } else {
487
            $xoopsTpl->assign('subscription_result', _MA_XNEWSLETTER_SUBSCRIPTION_OK);
488
        }
489
        break;
490
491
492
493
    case 'add_subscription' :
494
    case 'create_subscription' :
495
        $xoopsOption['template_main'] = 'xnewsletter_subscription.tpl';
496
        include_once XOOPS_ROOT_PATH . '/header.php';
497
498
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
499
        $xoTheme->addMeta('meta', 'keywords', $xnewsletter->getConfig('keywords')); // keywords only for index page
500
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
501
502
        // Breadcrumb
503
        $breadcrumb = new XnewsletterBreadcrumb();
504
        $breadcrumb->addLink($xnewsletter->getModule()->getVar('name'), XNEWSLETTER_URL);
505
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
506
507
        // get create subscr form
508
        if ($subscr_email != '') {
509
            //existing email
510
            if (!xnewsletter_checkEmail($subscr_email)) {
511
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
512
            }
513
        } elseif (is_object($xoopsUser) && isset($xoopsUser)) {
514
            //take actual xoops user
515
            $subscr_email = $xoopsUser->email();
516
        } else {
517
            $subscr_email = '';
518
        }
519
        $subscrObj = $xnewsletter->getHandler('subscr')->create();
520
        $subscrObj->setVar('subscr_email', $subscr_email);
521
        $subscrForm = $subscrObj->getForm();
522
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
523
        break;
524
525
526
527
    case 'edit_subscription' :
528
        $xoopsOption['template_main'] = 'xnewsletter_subscription.tpl';
529
        include_once XOOPS_ROOT_PATH . '/header.php';
530
531
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
532
        $xoTheme->addMeta('meta', 'keywords', $xnewsletter->getConfig('keywords')); // keywords only for index page
533
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
534
535
        // Breadcrumb
536
        $breadcrumb = new XnewsletterBreadcrumb();
537
        $breadcrumb->addLink($xnewsletter->getModule()->getVar('name'), XNEWSLETTER_URL);
538
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
539
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_EDIT, '');
540
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
541
542
        // get edit subscr form
543
        $subscr_id = XoopsRequest::getInt('subscr_id', 0);
544
        if ($subscr_id <= 0) {
545
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
546
        }
547
        $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
548
        $subscrForm = $subscrObj->getForm();
549
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
550
        break;
551
552
553
554
    case 'delete_subscription' :
555
        include_once XOOPS_ROOT_PATH . '/header.php';
556
557
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
558
        $xoTheme->addMeta('meta', 'keywords', $xnewsletter->getConfig('keywords')); // keywords only for index page
559
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
560
561
        // Breadcrumb
562
        $breadcrumb = new XnewsletterBreadcrumb();
563
        $breadcrumb->addLink($xnewsletter->getModule()->getVar('name'), XNEWSLETTER_URL);
564
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
565
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
566
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
567
568
        if (!$activationKey) {
569
            if ($subscr_id < 1) {
570
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
571
            }
572
        }
573
574
        if ((isset($_POST['ok']) && $_POST['ok'] == true) || $activationKey) {
575
            $count_err = 0;
576
            $actionProts_error = '';
577
578
            // check right to unsubscribe directly
579
            $submitterUid = is_object($xoopsUser) ? (int) $xoopsUser->getVar('uid') : 0;
580
            if ($submitterUid == 0) {
581
                // user not logged in
582
                $allowedWithoutActivationKey = false;
583
            } else {
584
                // user logged in
585
                $allowedWithoutActivationKey = false;
586 View Code Duplication
                foreach ($xoopsUser->getGroups() as $group) {
587
                    if (in_array($group, $xnewsletter->getConfig('xn_groups_without_actkey')) || XOOPS_GROUP_ADMIN == $group) {
588
                        $allowedWithoutActivationKey = true;
589
                        break;
590
                    }
591
                }
592
            }
593
594
            if ($activationKey || $allowedWithoutActivationKey) {
595
                // got actkey or user is allowed to delete without actkey
596
                $isValid = false;
597
                if ($activationKey) {
598
                    $activationKey_array = explode('||', base64_decode($activationKey));
599
                    $subscr_id = (int) $activationKey_array[1];
600
                    $subscr_actkey = trim($activationKey_array[2]);
601
                    $subscr_email = trim($activationKey_array[3]);
602
                    // check activation key
603
                    if (($activationKey_array[0] == XOOPS_URL) && ((int) $activationKey_array[1] > 0) && (trim($activationKey_array[2]) != ''))
604
                        $isValid = true;
605
                } elseif ($allowedWithoutActivationKey) {
606
                    $isValid = true;
607
                } else {
608
                    $isValid = false;
609
                }
610
611
                if ($isValid) {
612
                    $subscrCriteria = new CriteriaCompo();
613
                    $subscrCriteria->add(new Criteria('subscr_email', $subscr_email));
614
                    $subscrCriteria->add(new Criteria('subscr_id', $subscr_id));
615
                    if ($activationKey)
616
                        $subscrCriteria->add(new Criteria('subscr_actkey', $subscr_actkey));
617
                    $subscrCriteria->setLimit(1);
618
                    $subscrCount = $xnewsletter->getHandler('subscr')->getCount($subscrCriteria);
619
620
                    if ($subscrCount != 1) {
621
                        redirect_header($currentFile, 2, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
622
                    }
623
624
                    $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
625
/*
626
                    $sql = "SELECT subscr_id";
627
                    $sql.= " FROM {$xoopsDB->prefix("xnewsletter_subscr")}";
628
                    $sql.= " WHERE (subscr_email='{$subscr_email}' AND subscr_id={$subscr_id}";
629
                    if ($activationKey)
630
                        $sql .= " AND subscr_actkey='{$code}'";
631
                    $sql .= ") LIMIT 1;";
632
                    $subscr_id_test = 0;
633
                    if ($user = $xoopsDB->query($sql)) {
634
                        $row_user = $xoopsDB->fetchRow($user);
635
                        $subscr_id_test = $row_user[0];
636
                    }
637
                    if ($subscr_id != $subscr_id_test) {
638
                        redirect_header($currentFile, 2, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
639
                    }
640
                    $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
641
*/
642
                    // delete subscriber
643 View Code Duplication
                    if (!$xnewsletter->getHandler('subscr')->delete($subscrObj, true)) {
644
                        $actionProts_error = $subscrObj->getHtmlErrors() . '<br/><br/><br/>';
645
                        $count_err++;
646
                    }
647
                    //delete subscription
648
                    $catsubscrCriteria = new CriteriaCompo();
649
                    $catsubscrCriteria->add(new Criteria('catsubscr_subscrid', $subscr_id));
650
                    $catsubscrCount = $xnewsletter->getHandler('catsubscr')->getCount($catsubscrCriteria);
651 View Code Duplication
                    if ($catsubscrCount > 0) {
652
                        $catsubscrObjs = $xnewsletter->getHandler('catsubscr')->getAll($catsubscrCriteria);
653
                        foreach (array_keys($catsubscrObjs) as $cat) {
654
                            $catsubscrObj = $xnewsletter->getHandler('catsubscr')->get($catsubscrObjs[$cat]->getVar('catsubscr_id'));
655
                            $catObj = $xnewsletter->getHandler('cat')->get($catsubscrObjs[$cat]->getVar('catsubscr_catid'));
656
                            $cat_mailinglist = $catObj->getVar('cat_mailinglist');
657
658
                            if ($xnewsletter->getHandler('catsubscr')->delete($catsubscrObj, true)) {
659
                                //handle mailinglists
660
                                if ($cat_mailinglist > 0) {
661
                                    require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
662
                                    subscribingMLHandler(0, $subscr_id, $cat_mailinglist);
663
                                }
664
                            } else {
665
                                $actionProts_error .= $catsubscrObj->getHtmlErrors();
666
                                $count_err++;
667
                            }
668
                        }
669
                    }
670
                } else {
671
                    redirect_header($currentFile, 2, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
672
                }
673
674
675
                if ($count_err == 0) {
676
                    redirect_header('index.php', 3, _AM_XNEWSLETTER_FORMDELOK);
677
                } else {
678
                    echo $actionProts_error;
679
                }
680
            } else {
681
                if (!$GLOBALS['xoopsSecurity']->check()) {
682
                    redirect_header('subscr.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
683
                }
684
685
                $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
686
                $subscr_actkey = xoops_makepass();
687
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
688
                if (!$xnewsletter->getHandler('subscr')->insert($subscrObj)) {
689
                    redirect_header($currentFile, 2, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
690
                }
691
                if (!$allowedWithoutActivationKey) {
692
                    $xoopsMailer = xoops_getMailer();
693
                    $xoopsMailer->reset();
694
                    $xoopsMailer->setTemplateDir();
695
                    $xoopsMailer->useMail();
696
                    $xoopsMailer->setTemplate('delete.tpl');
697
                    $xoopsMailer->setToEmails($subscrObj->getVar('subscr_email'));
698
                    if (isset($xoopsConfig['adminmail'])) $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
699
                    if (isset($xoopsConfig['sitename'])) $xoopsMailer->setFromName($xoopsConfig['sitename']);
700
                    $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
701
                    $xoopsMailer->assign('EMAIL', $subscrObj->getVar('subscr_email'));
702
                    $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
703
                    $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
704
                    $xoopsMailer->assign('IP', $ip);
705
                    $activationKey = base64_encode(XOOPS_URL . "||{$subscrObj->getVar('subscr_id')}||{$subscrObj->getVar('subscr_actkey')}||{$subscrObj->getVar('subscr_email')}");
706
                    $actLink = XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=delete_subscription_confirmed&actkey={$activationKey}";
707
                    $xoopsMailer->assign('ACTLINK', $actLink);
708
                    $subject_delete = _MA_XNEWSLETTER_DELETESUBJECT . $GLOBALS['xoopsConfig']['sitename'];
709
                    $xoopsMailer->setSubject($subject_delete);
710
                    if (!$xoopsMailer->send()) {
711
                        redirect_header($currentFile, 10, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR . '<br />' . $xoopsMailer->getErrors());
712
                    }
713
                }
714
                redirect_header('index.php', 3, _MA_XNEWSLETTER_SENDMAIL_UNREG_OK);
715
            }
716
        } else {
717
            $subscrObj = $xnewsletter->getHandler('subscr')->get($subscr_id);
718
            xoops_confirm(['ok' => true, 'subscr_id' => $subscr_id, 'subscr_email' => $subscr_email, 'op' => 'delete_subscription'], $currentFile, sprintf(_MA_XNEWSLETTER_SUBSCRIPTION_DELETE_SURE));
719
        }
720
        break;
721
722
    case 'list_subscriptions' :
723
    default :
724
        $xoopsOption['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
725
        include_once XOOPS_ROOT_PATH . '/header.php';
726
727
        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
728
        $xoTheme->addMeta('meta', 'keywords', $xnewsletter->getConfig('keywords')); // keywords only for index page
729
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
730
731
        // Breadcrumb
732
        $breadcrumb = new XnewsletterBreadcrumb();
733
        $breadcrumb->addLink($xnewsletter->getModule()->getVar('name'), XNEWSLETTER_URL);
734
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
735
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
736
737
        $showSubscrSearchForm = true;
738
        $showSubscrForm = false;
739
740
        $subscr_id = 0;
741
        // get subscr email
742
        $subscr_email = XoopsRequest::getString('subscr_email', '');
743
        if ($subscr_email != '') {
744
            // existing email from search form
745
            if (!xnewsletter_checkEmail($subscr_email))
746
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
747
            xoops_load('captcha');
748
            $xoopsCaptcha = XoopsCaptcha::getinstance();
749
            if (!$xoopsCaptcha->verify()) {
750
                $_SESSION['redirect_mail'] = $subscr_email;
751
                redirect_header($currentFile, 3, $xoopsCaptcha->getMessage());
752
            } else {
753
                $showSubscrSearchForm = false;
754
            }
755
        } elseif (is_object($xoopsUser) && isset($xoopsUser)) {
756
            // take actual xoops user email
757
            $subscr_email = $xoopsUser->email();
758
            $showSubscrSearchForm = false;
759
        } else {
760
            $subscr_email = '';
761
        }
762
763
        // show search subscr form
764
        $xoopsTpl->assign('showSubscrSearchForm', $showSubscrSearchForm);
765
        if ($showSubscrSearchForm) {
766
            // show form search
767
            $subscrObj = $xnewsletter->getHandler('subscr')->create();
768
            $redirect_mail = (isset($_SESSION['redirect_mail'])) ? $_SESSION['redirect_mail'] : '';
769
            if ($redirect_mail != '') {
770
                $subscrObj->setVar('subscr_email', $redirect_mail);
771
                $subscr_email = $redirect_mail;
772
            }
773
            $subscrObj->setVar('subscr_email', $subscr_email);
774
            $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm()->render());
775
        }
776
777
        if (isset($_SESSION['redirect_mail'])) {
778
            if (!isset($_SESSION['unsub'])) {
779
                $subscr_email = '';
780
            } else {
781
                unset($_SESSION['unsub']);
782
            }
783
            unset($_SESSION['redirect_mail']);
784
        }
785
786
        if ($subscr_email != '') {
787
            // look for existing subscriptions
788
            $subscrCriteria = new CriteriaCompo();
789
            $subscrCriteria->add(new Criteria('subscr_email', $subscr_email));
790
            $subscrCriteria->setSort('subscr_id');
791
            $subscrCriteria->setOrder('ASC');
792
            $subscrCount = $xnewsletter->getHandler('subscr')->getCount($subscrCriteria);
793
            $xoopsTpl->assign('subscrCount', $subscrCount);
794
795
            if ($subscrCount > 0) {
796
                $subscrObjs = $xnewsletter->getHandler('subscr')->getAll($subscrCriteria);
797
                foreach ($subscrObjs as $subscr_id => $subscrObj) {
798
                    $subscr_array = $subscrObj->toArray();
799
                    $subscr_array['subscr_created_timestamp'] = formatTimestamp($subscrObj->getVar('subscr_created'), $xnewsletter->getConfig('dateformat'));
800
801
                    $catsubscrCriteria = new CriteriaCompo();
802
                    $catsubscrCriteria->add(new Criteria('catsubscr_subscrid', $subscr_id));
803
                    $catsubscrCriteria->setSort('catsubscr_id');
804
                    $catsubscrCriteria->setOrder('ASC');
805
                    $catsubscrCount = $xnewsletter->getHandler('catsubscr')->getCount($catsubscrCriteria);
806
                    $catsubscrObjs = $xnewsletter->getHandler('catsubscr')->getAll($catsubscrCriteria);
807
                    foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
808
                        $catsubscr_array = $catsubscrObj->toArray();
809
                        $catObj = $xnewsletter->getHandler('cat')->get($catsubscrObj->getVar('catsubscr_catid'));
810
                        $cat_array = $catObj->toArray();
811
                        $catsubscr_array['cat'] = $cat_array;
812
                        $subscr_array['catsubscrs'][] = $catsubscr_array;
813
                        unset($catsubscr_array);
814
                        unset($cat_array);
815
                    }
816
                    $xoopsTpl->append('subscrs', $subscr_array);
817
                }
818
            } else {
819
                // show subscr form
820
                $xoopsTpl->assign('showSubscrForm', true);
821
                $subscrObj = $xnewsletter->getHandler('subscr')->create();
822
                $subscrObj->setVar('subscr_email', $subscr_email);
823
                $form = $subscrObj->getForm($currentFile);
824
                $xoopsTpl->assign('subscrForm', $form->render());
825
            }
826
        }
827
        break;
828
}
829
830
include __DIR__ . '/footer.php';
831