mambax7/xnewsletter

View on GitHub
admin/bmh.php

Summary

Maintainability
C
1 day
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    GNU General Public License 2.0
 * @package    xnewsletter
 * @author     Goffy ( webmaster@wedega.com )
 *
 * ****************************************************************************
 */

use Xmf\Request;

$currentFile = basename(__FILE__);
require_once __DIR__ . '/admin_header.php';
xoops_cp_header();

// set template
$templateMain = 'xnewsletter_admin_bmh.tpl';

// We recovered the value of the argument op in the URL$
$op          = Request::getString('op', 'list');
$bmh_id      = Request::getInt('bmh_id', 0);
$bmh_measure = Request::getInt('bmh_measure', 0);
$filter      = Request::getInt('bmh_measure_filter', _XNEWSLETTER_BMH_MEASURE_VAL_ALL);

$GLOBALS['xoopsTpl']->assign('xnewsletter_url', XNEWSLETTER_URL);
$GLOBALS['xoopsTpl']->assign('xnewsletter_icons_url', XNEWSLETTER_ICONS_URL);

switch ($op) {
    case 'bmh_delsubscr':
        if (true === Request::getBool('ok', false, 'POST')) {
            $count_err = 0;

            $bmhObj    = $helper->getHandler('Bmh')->get($bmh_id);
            $bmh_email = $bmhObj->getVar('bmh_email');

            $sql = "SELECT subscr_id FROM {$xoopsDB->prefix('xnewsletter_subscr')}";
            $sql .= " WHERE (subscr_email='{$bmh_email}')";
            $sql .= ' LIMIT 1;';
            $user = $xoopsDB->query($sql);
            if ($user) {
                $row_user  = $xoopsDB->fetchRow($user);
                $subscr_id = (int)$row_user[0];
            }
            if (0 == $subscr_id) {
                //set bmh_measure for all entries in bmh with this email
                $sql_upd_measure = "UPDATE {$xoopsDB->prefix('xnewsletter_bmh')} SET `bmh_measure` = '" . _XNEWSLETTER_BMH_MEASURE_VAL_NOTHING . "'";
                $sql_upd_measure .= " WHERE ((`{$xoopsDB->prefix('xnewsletter_bmh')}`.`bmh_email` ='{$bmh_email}') AND (`{$xoopsDB->prefix('xnewsletter_bmh')}`.`bmh_measure` ='0'))";
                $xoopsDB->query($sql_upd_measure);
                redirect_header('?op=list', 3, _AM_XNEWSLETTER_BMH_ERROR_NO_SUBSCRID);
            }
            $subscrObj = $helper->getHandler('Subscr')->get($subscr_id);

            // delete subscriber
            if (!$helper->getHandler('Subscr')->delete($subscrObj, true)) {
                $actionprot_err = $subscrObj->getHtmlErrors() . '<br><br><br>';
                ++$count_err;
            }

            //delete subscription
            $catsubscrCriteria = new \CriteriaCompo();
            $catsubscrCriteria->add(new \Criteria('catsubscr_subscrid', $subscr_id));
            $catsubscrsCount = $helper->getHandler('Catsubscr')->getCount($catsubscrCriteria);
            if ($catsubscrsCount > 0) {
                $catsubscrObjs = $helper->getHandler('Catsubscr')->getAll($catsubscrCriteria);
                foreach ($catsubscrObjs as $catsubscr_id => $catsubscrObj) {
                    $catsubscrObj    = $helper->getHandler('Catsubscr')->get($catsubscrObj->getVar('catsubscr_id'));
                    $catObj          = $helper->getHandler('Cat')->get($catsubscrObj->getVar('catsubscr_catid'));
                    $cat_mailinglist = $catObj->getVar('cat_mailinglist');

                    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 {
                        $actionprot_err .= $catsubscrObj->getHtmlErrors();
                        ++$count_err;
                    }
                }
            }

            if (0 == $count_err) {
                redirect_header("?op=handle_bmh&bmh_id={$bmh_id}&bmh_measure=" . _XNEWSLETTER_BMH_MEASURE_VAL_DELETE . "&filter={$filter}", 3, _AM_XNEWSLETTER_FORMDELOK);
            } else {
                $GLOBALS['xoopsTpl']->assign('error', $actionprot_err);
            }
        } else {
            xoops_confirm(['ok' => true, 'bmh_id' => $bmh_id, 'op' => 'bmh_delsubscr', 'filter' => $filter], $currentFile, sprintf(_AM_XNEWSLETTER_BMH_MEASURE_DELETE_SURE));
        }
        break;
    case 'handle_bmh':
        if (0 == $bmh_id) {
            redirect_header($currentFile, 3, _AM_XNEWSLETTER_ERROR_NO_VALID_ID);
        }
        if (0 == $bmh_measure) {
            redirect_header($currentFile, 3, _AM_XNEWSLETTER_ERROR_NO_VALID_ID);
        }

        $bmhObj = $helper->getHandler('Bmh')->get($bmh_id);

        if (_XNEWSLETTER_BMH_MEASURE_VAL_DELETE == $bmhObj->getVar('bmh_measure')) {
            redirect_header("?op=list&filter={$filter}'", 3, _AM_XNEWSLETTER_BMH_MEASURE_ALREADY_DELETED);
        }

        $bmh_email = $bmhObj->getVar('bmh_email');

        if (_XNEWSLETTER_BMH_MEASURE_VAL_QUIT == $bmh_measure) {
            $sql = "UPDATE `{$xoopsDB->prefix('xnewsletter_subscr')}` INNER JOIN `{$xoopsDB->prefix('xnewsletter_catsubscr')}` ON `subscr_id` = `catsubscr_subscrid`";
            $sql .= ' SET `catsubscr_quited` = ' . time();
            $sql .= " WHERE (((`subscr_email`)='{$bmh_email}'))";
            if (!$result = $xoopsDB->queryF($sql)) {
                die('MySQL-Error: ' . $GLOBALS['xoopsDB']->error());
            }
        }
        //set bmh_measure for all entries in bmh with this email
        $sql_upd = "UPDATE {$xoopsDB->prefix('xnewsletter_bmh')}";
        $sql_upd .= " SET `bmh_measure` = '{$bmh_measure}', `bmh_submitter` = '{$xoopsUser->uid()}', `bmh_created` = '" . time() . "'";
        $sql_upd .= " WHERE ((`{$xoopsDB->prefix('xnewsletter_bmh')}`.`bmh_email` ='{$bmh_email}') AND (`{$xoopsDB->prefix('xnewsletter_bmh')}`.`bmh_measure` ='0'))";
        if (!$result = $xoopsDB->queryF($sql_upd)) {
            die('MySQL-Error: ' . $GLOBALS['xoopsDB']->error());
        }

        redirect_header("?op=list&filter={$filter}", 3, _AM_XNEWSLETTER_FORMOK);
        break;
    case 'run_bmh':
        require_once __DIR__ . '/bmh_callback_database.php';
        require_once XOOPS_ROOT_PATH . '/modules/xnewsletter/include/phpmailer_bmh/class.phpmailer-bmh.php';

        $accountCriteria = new \CriteriaCompo();
        $accountCriteria->add(new \Criteria('accounts_use_bmh', '1'));
        $accountsCount = $helper->getHandler('Accounts')->getCount($accountCriteria);

        if ($accountsCount > 0) {
            $accountObjs = $helper->getHandler('Accounts')->getAll($accountCriteria);
            $result_bmh  = _AM_XNEWSLETTER_BMH_SUCCESSFUL . '<br>';

            foreach ($accountObjs as $account_id => $accountObj) {
                $bmh          = new BounceMailHandler();
                $bmh->verbose = VERBOSE_SIMPLE; //VERBOSE_REPORT; //VERBOSE_DEBUG; //VERBOSE_QUIET; // default is VERBOSE_SIMPLE
                //$bmh->use_fetchstructure = true; // true is default, no need to speficy
                //$bmh->testmode           = true; // false is default, no need to specify
                //$bmh->debug_body_rule    = false; // false is default, no need to specify
                //$bmh->debug_dsn_rule     = false; // false is default, no need to specify
                //$bmh->purge_unprocessed  = false; // false is default, no need to specify
                $bmh->disable_delete = true; // detected mails will be not deleted, default is false

                // for local mailbox (to process .EML files)
                //$bmh->openLocalDirectory('/home/email/temp/mailbox');
                //$bmh->processMailbox();

                // for remote mailbox
                $bmh->mailhost         = $accountObj->getVar('accounts_server_in'); // your mail server
                $bmh->mailbox_username = $accountObj->getVar('accounts_username'); // your mailbox username
                $bmh->mailbox_password = $accountObj->getVar('accounts_password'); // your mailbox password
                $bmh->port             = $accountObj->getVar('accounts_port_in'); // the port to access your mailbox, default is 143
                if (_XNEWSLETTER_ACCOUNTS_TYPE_VAL_POP3 == $accountObj->getVar('accounts_type')) {
                    $bmh->service = 'pop3'; // the service to use (imap or pop3), default is 'imap'
                } else {
                    $bmh->service = 'imap'; // the service to use (imap or pop3), default is 'imap'
                }
                $bmh->service_option = $accountObj->getVar('accounts_securetype_in'); // the service options (none, tls, notls, ssl, etc.), default is 'notls'
                $bmh->boxname        = $accountObj->getVar('accounts_inbox'); // the mailbox to access, default is 'INBOX'
                $verif_movehard      = '1' == $accountObj->getVar('accounts_movehard') ? true : false;
                $bmh->moveHard       = $verif_movehard; // default is false
                $bmh->hardMailbox    = $accountObj->getVar('accounts_hardbox'); // default is 'INBOX.hard' - NOTE: must start with 'INBOX.'
                $verif_movesoft      = '1' == $accountObj->getVar('accounts_movesoft') ? true : false;
                $bmh->moveSoft       = $verif_movesoft; // default is false
                $bmh->softMailbox    = $accountObj->getVar('accounts_softbox'); // default is 'INBOX.soft' - NOTE: must start with 'INBOX.'
                //$bmh->deleteMsgDate      = '2009-01-05'; // format must be as 'yyyy-mm-dd'

                // rest used regardless what type of connection it is
                $bmh->openMailbox();
                $bmh->processMailbox();

                $result_bmh .= str_replace('%b', $accountObj->getVar('accounts_yourmail'), _AM_XNEWSLETTER_BMH_RSLT);
                $result_bmh = str_replace('%r', $bmh->result_total, $result_bmh);
                $result_bmh = str_replace('%a', $bmh->result_processed, $result_bmh);
                $result_bmh = str_replace('%n', $bmh->result_unprocessed, $result_bmh);
                $result_bmh = str_replace('%m', $bmh->result_moved, $result_bmh);
                $result_bmh = str_replace('%d', $bmh->result_deleted, $result_bmh);
            }
            redirect_header($currentFile, 3, $result_bmh);
        } else {
            redirect_header($currentFile, 3, _AM_XNEWSLETTER_BMH_ERROR_NO_ACTIVE);
        }
        break;
    case 'list':
    default:
        $GLOBALS['xoopsTpl']->assign('filter', $filter);

        $adminObject->displayNavigation(basename(__FILE__));
        $adminObject->addItemButton(_AM_XNEWSLETTER_RUNBMH, '?op=run_bmh', 'add');
        $GLOBALS['xoopsTpl']->assign('buttons', $adminObject->renderButton('left'));

        $arr_measure_type = [
            _XNEWSLETTER_BMH_MEASURE_VAL_ALL     => _AM_XNEWSLETTER_BMH_MEASURE_ALL,
            _XNEWSLETTER_BMH_MEASURE_VAL_PENDING => _AM_XNEWSLETTER_BMH_MEASURE_PENDING,
            _XNEWSLETTER_BMH_MEASURE_VAL_NOTHING => _AM_XNEWSLETTER_BMH_MEASURE_NOTHING,
            _XNEWSLETTER_BMH_MEASURE_VAL_QUIT    => _AM_XNEWSLETTER_BMH_MEASURE_QUITED,
            _XNEWSLETTER_BMH_MEASURE_VAL_DELETE  => _AM_XNEWSLETTER_BMH_MEASURE_DELETED,
        ];

        $limit       = $helper->getConfig('adminperpage');
        $bhmCriteria = new \CriteriaCompo();
        if ($filter > -1) {
            $bhmCriteria->add(new \Criteria('bmh_measure', $filter));
        }
        $bhmCriteria->setSort('bmh_id');
        $bhmCriteria->setOrder('DESC');
        $bhmCount = $helper->getHandler('Bmh')->getCount($bhmCriteria);
        $start    = Request::getInt('start', 0);
        $bhmCriteria->setStart($start);
        $bhmCriteria->setLimit($limit);
        $bhmObjs = $helper->getHandler('Bmh')->getAll($bhmCriteria);
        if ($bhmCount > $limit) {
            require_once XOOPS_ROOT_PATH . '/class/pagenav.php';
            $pagenav = new \XoopsPageNav($bhmCount, $limit, $start, 'start', 'op=list');
            $GLOBALS['xoopsTpl']->assign('pagenav', $pagenav->renderNav(4));
        }

        //form to filter result
        $form_filter = "<form id='form_filter' enctype='multipart/form-data' method='post' action='{$currentFile}' name='form_filter'>";

        $checked = (-1 == $filter) ? 'checked' : '';
        $form_filter .= "<input id='bmh_measure_all' type='radio' {$checked} value='-1' title='" . _AM_XNEWSLETTER_BMH_MEASURE . "' name='bmh_measure_filter' onclick='submit()'>
            <label for='bmh_measure_all' name='bmh_measure_all'>" . _AM_XNEWSLETTER_BMH_MEASURE_ALL . '</label>';

        $checked = (_XNEWSLETTER_BMH_MEASURE_VAL_PENDING == $filter) ? 'checked' : '';
        $form_filter .= "<input id='bmh_measure0' type='radio' {$checked} value='" . _XNEWSLETTER_BMH_MEASURE_VAL_PENDING . "' title='" . _AM_XNEWSLETTER_BMH_MEASURE . "' name='bmh_measure_filter' onclick='submit()'>
            <label for='bmh_measure0' name='bmh_measure0'>" . _AM_XNEWSLETTER_BMH_MEASURE_PENDING . '</label>';

        $checked = (_XNEWSLETTER_BMH_MEASURE_VAL_NOTHING == $filter) ? 'checked' : '';
        $form_filter .= "<input id='bmh_measure1' type='radio' {$checked} value='" . _XNEWSLETTER_BMH_MEASURE_VAL_NOTHING . "' title='" . _AM_XNEWSLETTER_BMH_MEASURE . "' name='bmh_measure_filter' onclick='submit()'>
            <label for='bmh_measure1' name='bmh_measure1'>" . _AM_XNEWSLETTER_BMH_MEASURE_NOTHING . '</label>';

        $checked = (_XNEWSLETTER_BMH_MEASURE_VAL_QUIT == $filter) ? 'checked' : '';
        $form_filter .= "<input id='bmh_measure2' type='radio' {$checked} value='" . _XNEWSLETTER_BMH_MEASURE_VAL_QUIT . "' title='" . _AM_XNEWSLETTER_BMH_MEASURE . "' name='bmh_measure_filter' onclick='submit()'>
            <label for='bmh_measure2' name='bmh_measure2'>" . _AM_XNEWSLETTER_BMH_MEASURE_QUITED . '</label>';

        $checked = (_XNEWSLETTER_BMH_MEASURE_VAL_DELETE == $filter) ? 'checked' : '';
        $form_filter .= "<input id='bmh_measure3' type='radio' {$checked} value='" . _XNEWSLETTER_BMH_MEASURE_VAL_DELETE . "' title='" . _AM_XNEWSLETTER_BMH_MEASURE . "' name='bmh_measure_filter' onclick='submit()'>
            <label for='bmh_measure3' name='bmh_measure3'>" . _AM_XNEWSLETTER_BMH_MEASURE_DELETED . '</label>';
        $form_filter .= '</form>';
        $GLOBALS['xoopsTpl']->assign('form_filter', $form_filter);

        if ($bhmCount > 0) {
            $GLOBALS['xoopsTpl']->assign('bhmCount', $bhmCount);

            $class = 'odd';
            foreach ($bhmObjs as $bhm_id => $bhmObj) {
                $bmh_item = $bhmObj->getValuesBmh();
                $GLOBALS['xoopsTpl']->append('bmh_list', $bmh_item);
                unset($bmh_item);
            }
        } else {
            $GLOBALS['xoopsTpl']->assign('show_none', sprintf(_AM_XNEWSLETTER_BMH_MEASURE_SHOW_NONE, $arr_measure_type[$filter]));
        }
        break;
    case 'save_bmh':
        if (!$GLOBALS['xoopsSecurity']->check()) {
            redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
        }

        $bmhObj = $helper->getHandler('Bmh')->get($bmh_id);
        $bmhObj->setVar('bmh_rule_no',    Request::getString('bmh_rule_no', ''));
        $bmhObj->setVar('bmh_rule_cat',   Request::getString('bmh_rule_cat', ''));
        $bmhObj->setVar('bmh_bouncetype', Request::getString('bmh_bouncetype', ''));
        $bmhObj->setVar('bmh_remove',     Request::getString('bmh_remove', ''));
        $bmh_email = Request::getString('bmh_email', '');
        $bmh_email = filter_var($bmh_email, FILTER_SANITIZE_EMAIL);
        $bmh_email = xnewsletter_checkEmail($bmh_email);
        $bmhObj->setVar('bmh_email', $bmh_email);
        $bmhObj->setVar('bmh_subject',    Request::getString('bmh_subject', ''));
        $bmhObj->setVar('bmh_measure',    Request::getInt('bmh_measure', 0));
        $bmhObj->setVar('bmh_submitter',  Request::getInt('bmh_submitter', 0));
        $bmhObj->setVar('bmh_created',    Request::getInt('bmh_created', 0));

        if ($helper->getHandler('Bmh')->insert($bmhObj)) {
            redirect_header('?op=list', 3, _AM_XNEWSLETTER_FORMOK);
        }

        $GLOBALS['xoopsTpl']->assign('error', $bmhObj->getHtmlErrors());
        $form = $bmhObj->getForm();
        $GLOBALS['xoopsTpl']->assign('form', $form->render());
        break;
    case 'edit_bmh':
        $adminObject->displayNavigation(basename(__FILE__));
        $adminObject->addItemButton(_AM_XNEWSLETTER_BMHLIST, '?op=list', 'list');
        $GLOBALS['xoopsTpl']->assign('buttons', $adminObject->renderButton('left'));

        $bmhObj = $helper->getHandler('Bmh')->get($bmh_id);
        $form   = $bmhObj->getForm();
        $GLOBALS['xoopsTpl']->assign('form', $form->render());
        break;
    case 'delete_bmh':
        $bmhObj = $helper->getHandler('Bmh')->get($bmh_id);
        if (true === Request::getBool('ok', false, 'POST')) {
            if (!$GLOBALS['xoopsSecurity']->check()) {
                redirect_header($currentFile, 3, implode(',', $GLOBALS['xoopsSecurity']->getErrors()));
            }
            if ($helper->getHandler('Bmh')->delete($bmhObj)) {
                redirect_header($currentFile, 3, _AM_XNEWSLETTER_FORMDELOK);
            } else {
                $GLOBALS['xoopsTpl']->assign('error', $bmhObj->getHtmlErrors());
            }
        } else {
            xoops_confirm(['ok' => true, 'bmh_id' => $bmh_id, 'op' => 'delete_bmh'], $_SERVER['REQUEST_URI'], sprintf(_AM_XNEWSLETTER_FORMSUREDEL, $bmhObj->getVar('bmh_email')));
        }
        break;
}
require_once __DIR__ . '/admin_footer.php';

/**
 * @return float
 */
function microtime_float()
{
    list($usec, $sec) = explode(' ', microtime());

    return ((float)$usec + (float)$sec);
}