mambax7/xnewsletter

View on GitHub
subscription.php

Summary

Maintainability
D
2 days
Test Coverage
<?php
/**
 * ****************************************************************************
 *  - A Project by Developers TEAM For Xoops - ( https://xoops.org )
 * ****************************************************************************
 *  XNEWSLETTER - MODULE FOR XOOPS
 *  Copyright (c) 2007 - 2012
 *  Goffy ( wedega.com )
 *
 *  You may not change or alter any portion of this comment or credits
 *  of supporting developers from this source code or any supporting
 *  source code which is considered copyrighted (c) material of the
 *  original comment or credit authors.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *  ---------------------------------------------------------------------------
 * @copyright  Goffy ( wedega.com )
 * @license    GPL 2.0
 * @package    xnewsletter
 * @author     Goffy ( webmaster@wedega.com )
 *
 * ****************************************************************************
 */

use XoopsModules\Xnewsletter;
use Xmf\Request;

$currentFile = basename(__FILE__);
require_once __DIR__ . '/header.php';
$op            = Request::getString('op', 'list_subscriptions');
$activationKey = Request::getString('actkey', '');
$subscr_id     = Request::getInt('subscr_id', 0);
$subscr_email  = Request::getString('subscr_email', '');

if (Request::hasVar('addnew', 'REQUEST')) {
    $op = 'addnew_subscription';
}

$show_anon = false;
if ('' != $activationKey && 'anonlistsubscr' === $op) {
    $op = 'list_subscriptions';
    $show_anon = true;
} else if ('' != $activationKey && ('edit_subscription' === $op || 'delete_subscription' === $op || 'list_subscriptions' === $op)) {
} else if ('' != $activationKey && 'unsub' !== $op && 'search_subscriptions' !== $op) {
    $op = 'save_subscription';
}
if ('unsub' === $op) {
    $subscr_email = Request::getString('email', '');
    $op           = 'delete_subscription';
    //$GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
    $_SESSION['redirect_mail'] = Request::getString('email', '');
    $_SESSION['unsub']         = '1';
} else {
    $_SESSION['redirect_mail'] = '';
    $_SESSION['unsub']         = '0';
}

$uid = is_object($xoopsUser) ? (int)$xoopsUser->getVar('uid') : 0;

//to avoid errors in debug when xn_groups_change_other
$subscr_sex       = '';
$subscr_firstname = '';
$subscr_lastname  = '';

switch ($op) {
    case 'search_subscription':
    default:
        // if not anonymous subscriber / subscriber is a Xoops user
        if ($uid > 0) {
            header("Location:{$currentFile}?op=list_subscriptions&subscr_email=" . $subscr_email);
            exit();
        }
        // if anonymous subscriber
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
        // breadcrumb
        $breadcrumb = new Xnewsletter\Breadcrumb();
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());

        $actionProts_ok      = [];
        $actionProts_error   = [];
        $actionProts_warning = [];

        $subscr_email         = '';
        $showSubscrSearchForm = true;
        $showSubscrForm       = false;

        // show search subscr form
        $xoopsTpl->assign('showSubscrSearchForm', $showSubscrSearchForm);
        // show form search
        $subscrObj = $helper->getHandler('Subscr')->create();
        $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm('subscription.php')->render());

        break;
        
    case 'list_subscriptions':
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_list_subscriptions.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
        // breadcrumb
        $breadcrumb = new Xnewsletter\Breadcrumb();
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, '');
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
        // init vars
        $actionProts_ok       = [];
        $actionProts_warning  = [];
        $actionProts_error    = [];
        $showSubscrSearchForm = false;
        $showSubscrForm       = true;

        // get newsletters available for current user
        /** @var \XoopsGroupPermHandler $grouppermHandler */
        $grouppermHandler = xoops_getHandler('groupperm');
        $groups           = [0 => XOOPS_GROUP_ANONYMOUS];
        if ($uid > 0) {
            $groups = $xoopsUser->getGroups();
        }

        $catCriteria = new \CriteriaCompo();
        $catCriteria->setSort('cat_id');
        $catCriteria->setOrder('ASC');
        $catObjs = $helper->getHandler('Cat')->getAll($catCriteria);
        $cats_readable = [];
        $cats_showlist = [];
        foreach ($catObjs as $cat_id => $catObj) {
            if ($grouppermHandler->checkRight('newsletter_read_cat', $cat_id, $groups, $helper->getModule()->mid())) {
                $cats_readable[$cat_id]['cat_id'] = $cat_id;
                $cats_readable[$cat_id]['cat_name'] = $catObj->getVar('cat_name');
            }
            if ($grouppermHandler->checkRight('newsletter_list_cat', $cat_id, $groups, $helper->getModule()->mid())) {
                $cats_showlist[$cat_id]['cat_id'] = $cat_id;
                $cats_showlist[$cat_id]['cat_name'] = $catObj->getVar('cat_name');
            }
        }
        $perm_read_cat = (count($cats_readable) > 0);
        $perm_list_cat = (count($cats_showlist) > 0);

        if ($show_anon) {
            // anonymous user with activation key
            $search_mail = $subscr_email;
        } else if ($uid > 0) {
            // not anonymous subscriber
            // check whether current user has the right to see list subscribers, then take email from form
            if ($perm_list_cat) {
                $search_mail = $subscr_email;
            } else {
                // if user has no right to see list subscribers, then take email from Xoops user
                $search_mail = $xoopsUser->email();
            }
        } else {
            // if anonymous subscriber get subscr_email from search form
            if ('' != $subscr_email) {
                $search_mail = $subscr_email;
                // check captcha
                xoops_load('xoopscaptcha');
                $xoopsCaptcha = XoopsCaptcha::getInstance();
                if (!$xoopsCaptcha->verify()) {
                    $_SESSION['redirect_mail'] = $subscr_email;
                    redirect_header('?op=search_subscription', 3, $xoopsCaptcha->getMessage());
                }
                // check subscr_email
                if (!xnewsletter_checkEmail($subscr_email)) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
                }                
            } else {
                //redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
            }
        }

        // look for existing subscriptions
        $subscrCriteria = new \CriteriaCompo();
        $subscrCriteria->add(new \Criteria('subscr_email', $search_mail));
        $subscrCriteria->setSort('subscr_id');
        $subscrCriteria->setOrder('ASC');
        $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);

        if ('' !== $subscr_email && $subscrCount > 0) {
            // there are subscriptions with this email
            $subscr_list = '';
            $actionProts_ok[] = _MA_XNEWSLETTER_REGISTRATION_EXIST;
            $subscrObjs            = $helper->getHandler('Subscr')->getAll($subscrCriteria);
            foreach ($subscrObjs as $subscrObj) {
                $subscr_array                             = $subscrObj->toArray();
                $subscr_array['subscr_created_formatted'] = formatTimestamp($subscr_array['subscr_created'], $helper->getConfig('dateformat'));
                // subscr exists but is unactivated
                if (0 == $subscr_array['subscr_activated']) {
                    $actionProts_warning[] = str_replace('%link', "?op=resend_subscription&subscr_id={$subscr_array['subscr_id']}", _MA_XNEWSLETTER_SUBSCRIPTION_UNFINISHED);
                }
                $catsubscrCriteria = new \CriteriaCompo();
                $catsubscrCriteria->add(new \Criteria('catsubscr_subscrid', $subscr_array['subscr_id']));
                $catsubscrCriteria->setSort('catsubscr_id');
                $catsubscrCriteria->setOrder('ASC');
                $catsubscrCount = $helper->getHandler('Catsubscr')->getCount($catsubscrCriteria);
                $catsubscrObjs  = $helper->getHandler('Catsubscr')->getAll($catsubscrCriteria);
                foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
                    $catsubscr_array              = $catsubscrObj->toArray();
                    $catObj                       = $helper->getHandler('Cat')->get($catsubscrObj->getVar('catsubscr_catid'));
                    if (is_object($catObj)) {
                        $cat_array                    = $catObj->toArray();
                        $catsubscr_array['cat']       = $cat_array;
                    }
                    $subscr_array['catsubscrs'][] = $catsubscr_array;
                    $subscr_list .= ' - ' . $cat_array['cat_name'] . " \n";

                    unset($catsubscr_array);
                    unset($cat_array);
                }
            }
            
            // check activation key
            $perm_showresult = false;
            $activationKey_array  = explode('||', base64_decode($activationKey, true));
            if (XOOPS_URL === trim($activationKey_array[0]) && $subscr_email === trim($activationKey_array[4]) && $subscr_array['subscr_actkey'] === trim($activationKey_array[3])) {
                $perm_showresult = true;
            }
            
            if (($uid > 0 && $perm_list_cat) || $perm_showresult) {
                //if user is logged in and have right to see list of registration then show corresponding result
                $xoopsTpl->append('subscrs', $subscr_array);
                $xoopsTpl->assign('subscrCount', $subscrCount);
                $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
                $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
                $xoopsTpl->assign('actionProts_error', $actionProts_error);
                $activationKey = base64_encode(XOOPS_URL . "||update||{$subscrObj->getVar('subscr_id')}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
                $xoopsTpl->assign('activationKey', $activationKey);
            } else {
                // anonymous, send email with the confirmation code to given email address
                $activationKey = base64_encode(XOOPS_URL . "||list||{$subscrObj->getVar('subscr_id')}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
                $xoopsMailer = xoops_getMailer();
                $xoopsMailer->reset();
                $xoopsMailer->setTemplateDir();
                $xoopsMailer->useMail();
                $xoopsMailer->setTemplate('subscriptions.tpl');
                $xoopsMailer->setToEmails($subscr_email);
                if (isset($xoopsConfig['adminmail'])) {
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
                }
                if (isset($xoopsConfig['sitename'])) {
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
                }
                $xoopsMailer->assign('EMAIL', $subscr_email);
                $xoopsMailer->assign('SEX', '' != $subscrObj->getVar('subscr_sex') ? $subscrObj->getVar('subscr_sex') : $subscr_sex);
                $xoopsMailer->assign('FIRSTNAME', '' != $subscrObj->getVar('subscr_firstname') ? $subscrObj->getVar('subscr_firstname') : $subscr_firstname);
                $xoopsMailer->assign('LASTNAME', '' != $subscrObj->getVar('subscr_lastname') ? $subscrObj->getVar('subscr_lastname') : $subscr_lastname);
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
                $xoopsMailer->assign('RESULT', $subscr_list);
                $xoopsMailer->assign('CHANGELINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=anonlistsubscr&subscr_email={$subscr_email}&actkey={$activationKey}");
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO . $GLOBALS['xoopsConfig']['sitename']);
                if (!$xoopsMailer->send()) {
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_ERROR . '<br>' . $xoopsMailer->getErrors();
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_ERROR . '<br>' . $xoopsMailer->getErrors());
                } else {
                    $actionProts_ok = [];
                    $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_SENDINFO_OK);
                    $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
                }
            }
        } else {
            // email not in database, show subscr form
            if ('' !== $subscr_email) {
                $actionProts_warning[] = str_replace('%s', $subscr_email, _MA_XNEWSLETTER_REGISTRATION_NONE);
            }
            $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
            $xoopsTpl->assign('showSubscrForm', true);
            $subscrObj = $helper->getHandler('Subscr')->create();
            $subscrObj->setVar('subscr_email', $subscr_email);
            $form = $subscrObj->getForm($currentFile);
            $xoopsTpl->assign('subscrForm', $form->render());
        }

        if (count($cats_showlist) > 0) {
            // show search subscr form
            $xoopsTpl->assign('showSubscrSearchForm', true);
            // render form search
            $subscrObj = $helper->getHandler('Subscr')->create();
            $xoopsTpl->assign('subscrSearchForm', $subscrObj->getSearchForm()->render());
        } else {
            $xoopsTpl->assign('showSubscrSearchForm', false);
        }
        break;
    case 'resend_subscription':
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
        // breadcrumb
        $breadcrumb = new Xnewsletter\Breadcrumb();
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
        // init vars
        $actionProts_ok      = [];
        $actionProts_warning = [];
        $actionProts_error   = [];

        // check if subscr exists
        $subscr_id      = Request::getInt('subscr_id', 0);
        $subscrCriteria = new \Criteria('subscr_id', $subscr_id);
        $subscrCount    = $helper->getHandler('Subscr')->getCount($subscrCriteria);
        if (0 == $subscrCount) {
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
        }
        // get subscr data
        $subscrObj    = $helper->getHandler('Subscr')->get($subscr_id);
        $subscr_email = $subscrObj->getVar('subscr_email');
        // resend the email with the confirmation code
        $xoopsMailer = xoops_getMailer();
        $xoopsMailer->reset();
        $xoopsMailer->setTemplateDir();
        $xoopsMailer->useMail();
        $xoopsMailer->setTemplate('activate.tpl');
        $xoopsMailer->setToEmails($subscr_email);
        if (isset($xoopsConfig['adminmail'])) {
            $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
        }
        if (isset($xoopsConfig['sitename'])) {
            $xoopsMailer->setFromName($xoopsConfig['sitename']);
        }
        $xoopsMailer->assign('EMAIL', $subscr_email);
        $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
        $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
        $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
        $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
        $activationKey = base64_encode(XOOPS_URL . "||addnew||{$subscr_id}||{$subscrObj->getVar('subscr_actkey')}||{$subscr_email}");
        $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
        $subject = _MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename'];
        $xoopsMailer->setSubject($subject);
        if (!$xoopsMailer->send()) {
            $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
        } else {
            $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_RESENDMAIL_REG_OK);
        }

        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
        $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
        break;
    case 'add_subscription':
    case 'create_subscription':
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
        // breadcrumb
        $breadcrumb = new Xnewsletter\Breadcrumb();
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());

        // get create subscr form
        if ('' != $subscr_email) {
            // existing email
            if (!xnewsletter_checkEmail($subscr_email)) {
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
            }
        } elseif ($uid > 0) {
            // take actual xoops user
            $subscr_email = $xoopsUser->email();
        } else {
            $subscr_email = '';
        }
        $subscrObj = $helper->getHandler('Subscr')->create();
        $subscrObj->setVar('subscr_email', $subscr_email);
        $subscrForm = $subscrObj->getForm();
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
        break;
    case 'edit_subscription':
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
        // breadcrumb
        $breadcrumb = new Xnewsletter\Breadcrumb();
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
        $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_EDIT, '');
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());

        // get edit subscr form
        $subscr_id = Request::getInt('subscr_id', 0);
        if ($subscr_id <= 0) {
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
        }
        $subscrObj  = $helper->getHandler('Subscr')->get($subscr_id);


        $activationKey_array  = explode('||', base64_decode($activationKey, true));
        $activationKeyIsValid = false;
        if ((XOOPS_URL === trim($activationKey_array[0]))
            && ($subscr_id === (int)$activationKey_array[2])
            && ($subscrObj->getVar('subscr_actkey') === trim($activationKey_array[3]))
            && ($subscrObj->getVar('subscr_email') === trim($activationKey_array[4]))) {
            $activationKeyIsValid = true;
        } else {
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
        }

        $subscrForm = $subscrObj->getForm();
        $xoopsTpl->assign('xnewsletter_content', $subscrForm->render());
        break;
    case 'save_subscription':
        $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
        $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
        $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
        // breadcrumb
        $breadcrumb = new Xnewsletter\Breadcrumb();
        $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
        $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
        // init vars
        $actionProts_ok       = [];
        $actionProts_warning  = [];
        $actionProts_error    = [];
        $count_ok             = 0;
        $count_err            = 0;
        $activationKeyIsValid = false;
        // check right to subscribe directly
        $allowedWithoutActivationKey = false;
        if ($uid > 0) {
            // if not anonymous subscriber / subscriber is a Xoops user
            $submitter_email = $xoopsUser->email();
            foreach ($xoopsUser->getGroups() as $group) {
                if (in_array($group, $helper->getConfig('xn_groups_without_actkey'))
                    || XOOPS_GROUP_ADMIN == $group) {
                    $allowedWithoutActivationKey = true;
                    break;
                }
            }
        }
        // if anonymous subscriber
        // NOP

        if ($allowedWithoutActivationKey) {
            // 1st case: subscribe WITHOUT confirmation
            // check form
            if (!$GLOBALS['xoopsSecurity']->check()) {
                redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
            }
            // check email
            if ('' == $subscr_email || !xnewsletter_checkEmail($subscr_email)) {
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
            }
            // get or create subscr
            if ($subscr_id > 0) {
                $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
                $saveType  = 'update';
            } else {
                $subscrObj = $helper->getHandler('Subscr')->create();
                $saveType  = 'addnew';
            }
            $subscrObj->setVar('subscr_sex', Request::getString('subscr_sex', ''));
            $subscrObj->setVar('subscr_firstname', Request::getString('subscr_firstname', ''));
            $subscrObj->setVar('subscr_lastname', Request::getString('subscr_lastname', ''));
            $subscrObj->setVar('subscr_email', Request::getString('subscr_email', ''));
            $subscr_actkey = ('' === Request::getString('subscr_actkey', '')) ? xoops_makepass() : Request::getString('subscr_actkey', '');
            $subscrObj->setVar('subscr_actkey', $subscr_actkey);
            // insert subscr
            if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br>' . $subscrObj->getHtmlErrors());
            }
            if ($subscr_id > 0) {
                $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
            } else {
                $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
            }
            $subscr_id = $subscrObj->getVar('subscr_id');
            // create $code_selections string
            $catCriteria = new \CriteriaCompo();
            $catCriteria->setSort('cat_id');
            $catCriteria->setOrder('ASC');
            $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
            $selections = [];
            foreach ($catObjs as $cat_id => $catObj) {
                // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
                $selection      = [];
                $selection[0]   = $cat_id;
                $selection[1]   = in_array($cat_id, $_REQUEST['cats']) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
                $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
                $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
                $code_selection = implode('-', $selection);
                $selections[]   = $code_selection;
                unset($selection);
            }
            $code_selections = implode('|', $selections);
        }

        if (!$allowedWithoutActivationKey) {
            // 2nd case: subscribe WITH confirmation
            if ('' == $activationKey) {
                // activation key DOESN'T EXIST
                // create and send confirmation email
                // check form
                if (!$GLOBALS['xoopsSecurity']->check()) {
                    redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
                }
                // check email
                if ('' == $subscr_email || !xnewsletter_checkEmail($subscr_email)) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOEMAIL);
                }
                // get subscr fields from form
                $subscr_firstname = Request::getString('subscr_firstname', '');
                $subscr_lastname  = Request::getString('subscr_lastname', '');
                $subscr_sex       = Request::getString('subscr_sex', '');
                // create $code_selections string
                $catCriteria = new \CriteriaCompo();
                $catCriteria->setSort('cat_id');
                $catCriteria->setOrder('ASC');
                $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
                $selections = [];
                foreach ($catObjs as $cat_id => $catObj) {
                    // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
                    $selection      = [];
                    $selection[0]   = $cat_id;
                    $selection[1]   = in_array($cat_id, Request::getArray('cats')) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
                    $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
                    $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
                    $code_selection = implode('-', $selection);
                    $selections[]   = $code_selection;
                    unset($selection);
                }
                $code_selections = implode('|', $selections); // string
                //
                // get or create subscr
                if ($subscr_id > 0) {
                    $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
                    $saveType  = 'update';
                } else {
                    $subscrObj = $helper->getHandler('Subscr')->create();
                    $saveType  = 'addnew';
                }
                // fill subscr
                if ($subscr_id <= 0) {
                    // form subscr_email
                    $subscrObj->setVar('subscr_email', $subscr_email);
                    // form subscr_uid
                    $subscr_uid = 0;
                    $sql        = "SELECT `uid` FROM {$xoopsDB->prefix('users')}";
                    $sql        .= " WHERE (`email`='{$subscr_email}')";
                    $sql        .= ' LIMIT 1';
                    $user       = $xoopsDB->query($sql);
                    if ($user) {
                        $row_user   = $xoopsDB->fetchRow($user);
                        $subscr_uid = $row_user[0];
                    }
                    $subscrObj->setVar('subscr_uid', $subscr_uid);
                    // form subscr_submitter
                    $subscrObj->setVar('subscr_submitter', $uid);
                }

                $subscrObj->setVar('subscr_created', time());
                $subscrObj->setVar('subscr_ip', xoops_getenv('REMOTE_ADDR'));
                $subscr_actkey = ('' === Request::getString('subscr_actkey', '')) ? xoops_makepass() : Request::getString('subscr_actkey', '');
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
                // format subscr_actoptions: selected_newsletters||firstname||lastname||sex
                $activationOptions = [
                    'code_selections'  => $code_selections,
                    'subscr_firstname' => $subscr_firstname,
                    'subscr_lastname'  => $subscr_lastname,
                    'subscr_sex'       => $subscr_sex,
                    'subscr_created'   => $subscrObj->getVar('subscr_created'),
                    'subscr_ip'        => $subscrObj->getVar('subscr_ip'),
                ];
                $subscrObj->setVar('subscr_actoptions', $activationOptions); // XOBJ_DTYPE_ARRAY
                // insert subscr
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR . '<br>' . $subscrObj->getHtmlErrors());
                }
                if ($subscr_id > 0) {
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_UPDATE_OK;
                } else {
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_OK;
                }
                $subscr_id = $subscrObj->getVar('subscr_id');
                // send the email with the confirmation code
                $xoopsMailer = xoops_getMailer();
                $xoopsMailer->reset();
                $xoopsMailer->setTemplateDir();
                $xoopsMailer->useMail();
                $xoopsMailer->setTemplate(('update' === $saveType) ? 'update.tpl' : 'activate.tpl');
                $xoopsMailer->setToEmails($subscr_email);
                if (isset($xoopsConfig['adminmail'])) {
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
                }
                if (isset($xoopsConfig['sitename'])) {
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
                }
                $xoopsMailer->assign('EMAIL', $subscr_email);
                $xoopsMailer->assign('SEX', '' != $subscrObj->getVar('subscr_sex') ? $subscrObj->getVar('subscr_sex') : $subscr_sex);
                $xoopsMailer->assign('FIRSTNAME', '' != $subscrObj->getVar('subscr_firstname') ? $subscrObj->getVar('subscr_firstname') : $subscr_firstname);
                $xoopsMailer->assign('LASTNAME', '' != $subscrObj->getVar('subscr_lastname') ? $subscrObj->getVar('subscr_lastname') : $subscr_lastname);
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
                $act           = [
                    XOOPS_URL,
                    $saveType,
                    $subscr_id,
                    $subscr_actkey,
                    $subscr_email,
                ];
                $activationKey = base64_encode(implode('||', $act));
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?actkey={$activationKey}");
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_SUBSCRIPTIONSUBJECT . $GLOBALS['xoopsConfig']['sitename']);
                if (!$xoopsMailer->send()) {
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
                } else {
                    $actionProts_ok[] = str_replace('%subscr_email', $subscr_email, _MA_XNEWSLETTER_SENDMAIL_REG_OK);
                }
            } else {
                // activation key EXISTS
                // check confirmation email
                // check activation key
                $activationKey_array  = explode('||', base64_decode($activationKey, true));
                $activationKeyIsValid = false;
                if ((XOOPS_URL == $activationKey_array[0]) && ('' != trim($activationKey_array[1]))
                    && ((int)$activationKey_array[2] > 0)
                    && ('' != trim($activationKey_array[3]))) {
                    $activationKeyIsValid = true;
                } else {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
                }
                $saveType      = trim($activationKey_array[1]);
                $subscr_id     = (int)$activationKey_array[2];
                $subscr_actkey = trim($activationKey_array[3]);
                // check given data with table subscr
                $subscrCriteria = new \CriteriaCompo();
                $subscrCriteria->add(new \Criteria('subscr_id', $subscr_id));
                $subscrCriteria->add(new \Criteria('subscr_actkey', $subscr_actkey));
                $subscrCriteria->setLimit(1);
                $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
                if (0 == $subscrCount) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NODATAKEY);
                }
                // get subscr
                $subscrObj         = $helper->getHandler('Subscr')->get($subscr_id);
                $activationOptions = $subscrObj->getVar('subscr_actoptions'); // XOBJ_DTYPE_ARRAY
                // check time: confirmation not later than ... hours
                if (('update' !== $saveType) && (0 != $helper->getConfig('confirmation_time'))
                    && ((int)$activationOptions['subscr_created'] < time() - (3600 + (int)$helper->getConfig('confirmation_time')))) {
                    // time expired
                    $subscrObj->setVar('subscr_actoptions', []);
                    $helper->getHandler('Subscr')->insert($subscrObj);
                    // IN PROGRESS
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_KEYEXPIRED);
                }
                if ('update' === $saveType) {
                    // get subscr fields from form
                    $subscr_firstname = Request::getString('subscr_firstname', '');
                    $subscr_lastname  = Request::getString('subscr_lastname', '');
                    $subscr_sex       = Request::getString('subscr_sex', '');
                    // create $code_selections string
                    $catCriteria = new \CriteriaCompo();
                    $catCriteria->setSort('cat_id');
                    $catCriteria->setOrder('ASC');
                    $catObjs    = $helper->getHandler('Cat')->getAll($catCriteria);
                    $selections = [];
                    foreach ($catObjs as $cat_id => $catObj) {
                        // create selections: $cat_id-$cat_selected-$old_catsubcr_id-$old_catsubscr_quited
                        $selection      = [];
                        $selection[0]   = $cat_id;
                        $selection[1]   = in_array($cat_id, Request::getArray('cats')) ? '1' : '0'; //isset($_REQUEST["cats_{$cat_id}"]);
                        $selection[2]   = Request::getInt("existing_catsubcr_id_{$cat_id}", 0);
                        $selection[3]   = Request::getInt("existing_catsubscr_quited_{$cat_id}", 0);
                        $code_selection = implode('-', $selection);
                        $selections[]   = $code_selection;
                        unset($selection);
                    }
                    $code_selections = implode('|', $selections); // string
                } else {
                    // get subscr fields from subscr_actoptions
                    $subscr_sex       = $activationOptions['subscr_sex'];
                    $subscr_firstname = $activationOptions['subscr_firstname'];
                    $subscr_lastname  = $activationOptions['subscr_lastname'];
                    $code_selections = $activationOptions['code_selections']; // string
                }
                // insert subscr
                $subscrObj->setVar('subscr_sex', $subscr_sex);
                $subscrObj->setVar('subscr_firstname', $subscr_firstname);
                $subscrObj->setVar('subscr_lastname', $subscr_lastname);
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
                }

            }
        }
        //
        //
        // subscribe subscr to cat (create/update catsubscr)
        if ($activationKeyIsValid || $allowedWithoutActivationKey) {
            // update xnewsletter_subscr
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
            if (0 == $subscrObj->getVar('subscr_activated')) {
                $subscrObj->setVar('subscr_created', time());
                $subscrObj->setVar('subscr_ip', xoops_getenv('REMOTE_ADDR'));
                $subscrObj->setVar('subscr_activated', 1);
            }
            // reset act fields
            $subscrObj->setVar('subscr_actoptions', []);
            // insert subscr
            if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVESUBSCR);
            }
            // create cat subscr
            $selections = explode('|', $code_selections); // array
            foreach ($selections as $code_selection) {
                if ('' == $code_selection) {
                    $code_selection = '0-0-0-0';
                }
                $selection           = explode('-', $code_selection); // array
                $cat_id              = $selection[0];
                $catsubcr            = $selection[1];
                $catsubcr_id_old     = (int)$selection[2];
                $catsubcr_quited_old = (int)$selection[3];
                $catObj              = $helper->getHandler('Cat')->get($cat_id);
                $cat_mailinglist     = $catObj->getVar('cat_mailinglist');
                $cat_name            = $catObj->getVar('cat_name');
                if ('1' == $catsubcr && 0 == $catsubcr_id_old) {
                    $catsubscrObj = $helper->getHandler('Catsubscr')->create();
                    $catsubscrObj->setVar('catsubscr_catid', $cat_id);
                    $catsubscrObj->setVar('catsubscr_subscrid', $subscr_id);
                    $catsubscrObj->setVar('catsubscr_submitter', $uid);
                    $catsubscrObj->setVar('catsubscr_created', time());
                    if ($helper->getHandler('Catsubscr')->insert($catsubscrObj)) {
                        $count_ok++;
                        if ($catsubcr_id_old > 0) {
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
                        } else {
                            $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SUBSCRIBE);
                        }
                        // handle mailinglists
                        if ($cat_mailinglist > 0) {
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_SUBSCRIBE, $subscr_id, $cat_mailinglist);
                        }
                    } else {
                        $count_err++;
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
                    }
                } elseif ('0' == $catsubcr && $catsubcr_id_old > 0) {
                    // unsubscribe / delete old subscription
                    $catsubscrObj = $helper->getHandler('Catsubscr')->get($catsubcr_id_old);
                    if ($helper->getHandler('Catsubscr')->delete($catsubscrObj, true)) {
                        // handle mailinglists
                        if ($cat_mailinglist > 0) {
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_UNSUBSCRIBE, $subscr_id, $cat_mailinglist);
                        }
                    } else {
                        $count_err++;
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
                    }
                    /*
                                        if ($count_err > 0) {
                                            redirect_header($currentFile, 3, _AM_XNEWSLETTER_FORMDELNOTOK);
                                        }
                    */
                    $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_UNSUBSCRIBE);
                } elseif ($catsubcr_id_old > 0 && $catsubcr_quited_old > 0) {
                    // newsletter stay selected, but catsubscr_quited will be removed
                    $catsubscrObj = $helper->getHandler('Catsubscr')->get($catsubcr_id_old);
                    // Form catsubscr_quited
                    $catsubscrObj->setVar('catsubscr_quited', '0');
                    if ($helper->getHandler('Catsubscr')->insert($catsubscrObj)) {
                        $count_ok++;
                        $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_DAT_QUITED_REMOVED);
                    } else {
                        $count_err++;
                        $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SAVECATSUBSCR; //$catsubscrObj->getHtmlErrors();
                    }
                } elseif ($catsubcr_id_old > 0) {
                    // newsletter still subscribed
                    $actionProts_ok[] = str_replace('%nl', $cat_name, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_NO_CHANGE);
                }
                // nothing to do
            }
            //
            // send infomail to subscriber if current user (submitter) is not the subscriber (subscr)
            if (isset($submitter_email) && ('' != $submitter_email) && ($submitter_email != $subscr_email)) {
                if ('' == $subscr_sex && '' == $subscr_firstname && '' == $subscr_lastname) {
                    $subscrObj        = $helper->getHandler('Subscr')->get($subscr_id);
                    $subscr_sex       = $subscrObj->getVar('subscr_sex');
                    $subscr_firstname = $subscrObj->getVar('subscr_firstname');
                    $subscr_lastname  = $subscrObj->getVar('subscr_lastname');
                    $subscr_actkey    = $subscrObj->getVar('subscr_actkey');
                }
                // send the email with the confirmation code
                $xoopsMailer = xoops_getMailer();
                $xoopsMailer->reset();
                $xoopsMailer->setTemplateDir();
                $xoopsMailer->useMail();
                $xoopsMailer->setHTML();
                $xoopsMailer->setTemplate('info_change.tpl');
                $xoopsMailer->setToEmails($subscr_email);
                if (isset($xoopsConfig['adminmail'])) {
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
                }
                if (isset($xoopsConfig['sitename'])) {
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
                }
                $xoopsMailer->assign('EMAIL', $subscr_email);
                $xoopsMailer->assign('SEX', $subscr_sex);
                $xoopsMailer->assign('FIRSTNAME', $subscr_firstname);
                $xoopsMailer->assign('LASTNAME', $subscr_lastname);
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
                $act           = [
                    XOOPS_URL,
                    'list',
                    $subscr_id,
                    $subscr_actkey,
                    $subscr_email,
                ];
                $activationKey = base64_encode(implode('||', $act));
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=anonlistsubscr&subscr_email={$subscr_email}&actkey={$activationKey}");
                $xoopsMailer->assign('USERLINK', XOOPS_URL . '/userinfo.php?uid=' . $xoopsUser->uid());
                $username = $xoopsUser->name() == '' ? $xoopsUser->uname() : $xoopsUser->name();
                $xoopsMailer->assign('USERNAME', $username);
                $subject = _MA_XNEWSLETTER_SUBSCRIPTION_SUBJECT_CHANGE . $GLOBALS['xoopsConfig']['sitename'];
                $xoopsMailer->setSubject($subject);
                if (!$xoopsMailer->send()) {
                    $count_err++;
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>Error:' . $xoopsMailer->getErrors();
                    //redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
                } else {
                    $actionProts_ok[] = str_replace('%e', $subscr_email, _MA_XNEWSLETTER_SUBSCRIPTION_PROT_SENT_INFO);
                }
            }
            if (0 == $count_err) {
                if ('addnew' === $saveType) {
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_CLOSED;
                } else {
                    $actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_REG_UPDATE_CLOSED;
                }
                //$actionProts_ok[] = _MA_XNEWSLETTER_SUBSCRIPTION_OK;
            }
        }

        $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
        $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
        $xoopsTpl->assign('actionProts_error', $actionProts_error);
        break;

    case 'delete_subscription':
        if ((!$activationKey && $subscr_id <= 0) && ('1' != $_SESSION['unsub'])) {
            redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_NOID);
        }

        if ('1' == $_SESSION['unsub']) {
            $subscrCriteria = new \CriteriaCompo();
            $subscrCriteria->add(new \Criteria('subscr_email', $subscr_email));
            $subscrCriteria->setLimit(1);
            $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
            if (0 == $subscrCount) {
                redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
            }
            if ($subscr_id <= 0) {
                $subscrObjs = $helper->getHandler('Subscr')->getAll($subscrCriteria);
                foreach ($subscrObjs as $subscrObj) {
                    $subscr_id = $subscrObj->getVar('subscr_id');
                }
            }
        }

        if (Request::getBool('ok', false, 'POST') || '' != $activationKey) {
            $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_subscription_result.tpl';
            require_once XOOPS_ROOT_PATH . '/header.php';

            $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
            $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
            $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
            // breadcrumb
            $breadcrumb = new Xnewsletter\Breadcrumb();
            $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
            $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());
            // init vars
            $actionProts_ok       = [];
            $actionProts_warning  = [];
            $actionProts_error    = [];
            $count_ok             = 0;
            $count_err            = 0;
            $activationKeyIsValid = false;
            // check right to unsubscribe directly
            $allowedWithoutActivationKey = false;
            if ($uid > 0) {
                // if not anonymous subscriber / subscriber is a Xoops user
                $submitter_email = $xoopsUser->email();
                foreach ($xoopsUser->getGroups() as $group) {
                    if (in_array($group, $helper->getConfig('xn_groups_without_actkey'))
                        || XOOPS_GROUP_ADMIN == $group) {
                        $allowedWithoutActivationKey = true;
                        break;
                    }
                }
            }
            // if anonymous subscriber
            // NOP

            if ('' != $activationKey || $allowedWithoutActivationKey) {
                // 1st case: unsubscribe WITHOUT confirmation
                // 2nd case: unsubscribe WITH confirmation & activation key EXISTS
                // check given data with table subscr
                $subscrCriteria = new \CriteriaCompo();
                $subscrCriteria->add(new \Criteria('subscr_email', $subscr_email));
                $subscrCriteria->add(new \Criteria('subscr_id', $subscr_id));
                // got actkey or user is allowed to delete without actkey
                if ('' != $activationKey) {
                    // check activation key
                    $activationKey_array  = explode('||', base64_decode($activationKey, true));
                    $activationKeyIsValid = false;
                    $subscr_id            = (int)$activationKey_array[2];
                    $subscr_actkey        = trim($activationKey_array[3]);
                    $subscr_email         = trim($activationKey_array[4]);
                    if ((XOOPS_URL == $activationKey_array[0]) && ((int)$activationKey_array[2] > 0)
                        && ('' != trim($activationKey_array[3]))) {
                        $activationKeyIsValid = true;
                    } else {
                        redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_INVALIDKEY);
                    }
                    $subscrCriteria->add(new \Criteria('subscr_actkey', $subscr_actkey));
                }
                $subscrCriteria->setLimit(1);
                $subscrCount = $helper->getHandler('Subscr')->getCount($subscrCriteria);
                if (0 == $subscrCount) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
                }
                // delete subscriptions (catsubscrs)
                $catsubscrCriteria = new \CriteriaCompo();
                $catsubscrCriteria->add(new \Criteria('catsubscr_subscrid', $subscr_id));
                $catsubscrCriteria->setSort('catsubscr_id');
                $catsubscrCriteria->setOrder('ASC');
                $catsubscrObjs  = $helper->getHandler('Catsubscr')->getAll($catsubscrCriteria);
                foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
                    if ($helper->getHandler('Catsubscr')->delete($catsubscrObj, true)) {
                        // handle mailinglists
                        $catObj              = $helper->getHandler('Cat')->get($catsubscrObj->getVar('catsubscr_catid'));
                        $cat_mailinglist     = $catObj->getVar('cat_mailinglist');
                        if ($cat_mailinglist > 0) {
                            require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/mailinglist.php';
                            subscribingMLHandler(_XNEWSLETTER_MAILINGLIST_UNSUBSCRIBE, $subscr_id, $cat_mailinglist);
                        }
                    } else {
                        $actionProts_error[] = $catsubscrObj->getHtmlErrors();
                        redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR . $subscrObj->getHtmlErrors());
                    }
                }
                // delete subscriber (subscr)
                $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
                if (!$helper->getHandler('Subscr')->delete($subscrObj, true)) {
                    $actionProts_error[] = $subscrObj->getHtmlErrors();
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR . $subscrObj->getHtmlErrors());
                }

                if (0 == $count_err) {
                    $actionProts_ok[] = _AM_XNEWSLETTER_FORMDELOK;
                } else {
                    $xoopsTpl->assign('actionProts_error', $actionProts_error);
                }
            } else {
                // 2nd case: unsubscribe WITH confirmation & activation key DOESN'T EXIST
                // check form
                if (!$GLOBALS['xoopsSecurity']->check()) {
                    redirect_header('subscr.php', 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
                }
                $subscrObj     = $helper->getHandler('Subscr')->get($subscr_id);
                $subscr_actkey = xoops_makepass();
                $subscrObj->setVar('subscr_actkey', $subscr_actkey);
                // insert subscr
                if (!$helper->getHandler('Subscr')->insert($subscrObj)) {
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR);
                }
                //                if (!$allowedWithoutActivationKey) {
                $xoopsMailer = xoops_getMailer();
                $xoopsMailer->reset();
                $xoopsMailer->setTemplateDir();
                $xoopsMailer->useMail();
                $xoopsMailer->setTemplate('delete.tpl');
                $xoopsMailer->setToEmails($subscrObj->getVar('subscr_email'));
                if (isset($xoopsConfig['adminmail'])) {
                    $xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
                }
                if (isset($xoopsConfig['sitename'])) {
                    $xoopsMailer->setFromName($xoopsConfig['sitename']);
                }
                $xoopsMailer->assign('EMAIL', $subscrObj->getVar('subscr_email'));
                $xoopsMailer->assign('SEX', $subscrObj->getVar('subscr_sex'));
                $xoopsMailer->assign('FIRSTNAME', $subscrObj->getVar('subscr_firstname'));
                $xoopsMailer->assign('LASTNAME', $subscrObj->getVar('subscr_lastname'));
                $xoopsMailer->assign('IP', xoops_getenv('REMOTE_ADDR'));
                $act           = [
                    XOOPS_URL,
                   'delete',
                    $subscrObj->getVar('subscr_id'),
                    $subscrObj->getVar('subscr_actkey'),
                    $subscrObj->getVar('subscr_email'),
                ];
                $activationKey = base64_encode(implode('||', $act));
                $xoopsMailer->assign('ACTLINK', XOOPS_URL . "/modules/xnewsletter/{$currentFile}?op=unsub&email={$subscrObj->getVar('subscr_email')}&actkey={$activationKey}");
                $xoopsMailer->setSubject(_MA_XNEWSLETTER_DELETESUBJECT . $GLOBALS['xoopsConfig']['sitename']);
                if (!$xoopsMailer->send()) {
                    $count_err++;
                    $actionProts_error[] = _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors();
                    redirect_header($currentFile, 3, _MA_XNEWSLETTER_SUBSCRIPTION_ERROR_SENDACTKEY . '<br>' . $xoopsMailer->getErrors());
                }
                //                }
                if (0 == $count_err) {
                    $actionProts_ok[] = str_replace('%subscr_email', $subscrObj->getVar('subscr_email'), _MA_XNEWSLETTER_SENDMAIL_UNREG_OK);
                }
            }

            $xoopsTpl->assign('actionProts_ok', $actionProts_ok);
            $xoopsTpl->assign('actionProts_warning', $actionProts_warning);
            $xoopsTpl->assign('actionProts_error', $actionProts_error);
        } else {
            $GLOBALS['xoopsOption']['template_main'] = 'xnewsletter_empty.tpl';
            require_once XOOPS_ROOT_PATH . '/header.php';

            $xoTheme->addStylesheet(XNEWSLETTER_URL . '/assets/css/module.css');
            $xoTheme->addMeta('meta', 'keywords', $helper->getConfig('keywords')); // keywords only for index page
            $xoTheme->addMeta('meta', 'description', strip_tags(_MA_XNEWSLETTER_DESC)); // description
            // breadcrumb
            $breadcrumb = new Xnewsletter\Breadcrumb();
            $breadcrumb->addLink($helper->getModule()->getVar('name'), XNEWSLETTER_URL);
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIBE, XNEWSLETTER_URL . '/subscription.php?op=list_subscriptions');
            $breadcrumb->addLink(_MD_XNEWSLETTER_SUBSCRIPTION_DELETE, '');
            $xoopsTpl->assign('xnewsletter_breadcrumb', $breadcrumb->render());

            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);
            xoops_confirm([
                              'ok'           => true,
                              'subscr_id'    => $subscr_id,
                              'subscr_email' => $subscr_email,
                              'op'           => 'delete_subscription',
                          ], $currentFile, sprintf(_MA_XNEWSLETTER_SUBSCRIPTION_DELETE_SURE));
        }
        break;
}

require_once __DIR__ . '/footer.php';