YetiForceCompany/YetiForceCRM

View on GitHub
modules/Settings/MailRbl/actions/GetData.php

Summary

Maintainability
F
4 days
Test Coverage
F
0%
<?php

/**
 * Settings MailRbl get data action file.
 *
 * @package   Settings.Action
 *
 * @copyright YetiForce S.A.
 * @license YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com)
 * @author    Mariusz Krzaczkowski <m.krzaczkowski@yetiforce.com>
 */

/**
 * Settings MailRbl get data action class.
 */
class Settings_MailRbl_GetData_Action extends \App\Controller\Action
{
    use \App\Controller\ExposeMethod;
    use \App\Controller\Traits\SettingsPermission;

    /** {@inheritdoc} */
    public function __construct()
    {
        parent::__construct();
        $this->exposeMethod('forVerification');
        $this->exposeMethod('toSend');
        $this->exposeMethod('request');
        $this->exposeMethod('blackList');
        $this->exposeMethod('whiteList');
        $this->exposeMethod('publicRbl');
        $this->exposeMethod('counters');
    }

    /**
     * Counters mode.
     *
     * @param App\Request $request
     */
    public function counters(App\Request $request)
    {
        $requestQuery = (new \App\Db\Query())->from('s_#__mail_rbl_request');
        $listQuery = (new \App\Db\Query())->from('s_#__mail_rbl_list');
        $response = new Vtiger_Response();
        $response->setResult([
            'forVerification' => $requestQuery->where(['status' => 0])->count(),
            'toSend' => $requestQuery->where(['status' => 1])->count(),
            'request' => $requestQuery->where(null)->count(),
            'blackList' => $listQuery->where(['type' => \App\Mail\Rbl::LIST_TYPE_BLACK_LIST])->count(),
            'whiteList' => $listQuery->where(['type' => \App\Mail\Rbl::LIST_TYPE_WHITE_LIST])->count(),
            'publicRbl' => $listQuery->where(['type' => [\App\Mail\Rbl::LIST_TYPE_PUBLIC_BLACK_LIST, \App\Mail\Rbl::LIST_TYPE_PUBLIC_WHITE_LIST]])->count(),
        ]);
        $response->emit();
    }

    /**
     * For verification mode.
     *
     * @param App\Request $request
     */
    public function forVerification(App\Request $request)
    {
        $rows = [];
        $query = $this->getQuery($request);
        $query->from('s_#__mail_rbl_request')->select(['id',  'type', 'datetime', 'user', 'header']);
        $query->andWhere(['status' => 0]);
        $dataReader = $query->createCommand(\App\Db::getInstance('admin'))->query();
        while ($row = $dataReader->read()) {
            $mailRbl = \App\Mail\Rbl::getInstance($row);
            $mailRbl->parse();
            $type = \App\Mail\Rbl::LIST_TYPES[$row['type']];
            if ($ip = ($mailRbl->getSender()['ip'] ?? '')) {
                $icon = '';
                if ($ips = \App\Mail\Rbl::findIp($ip, true)) {
                    $type = \App\Mail\Rbl::LIST_TYPES[$ips[0]['type']];
                    $icon = "<span class=\"{$type['icon']} mr-2 u-cursor-pointer\" title=\"" . \App\Language::translate('LBL_IP_ALREADY_EXISTS_LIST', 'Settings:MailRbl') . ' ' . \App\Language::translate($type['label'], 'Settings:MailRbl') . '"></span>';
                }
                $ip = $icon . \App\Purifier::encodeHtml($ip);
            }
            $rows[] = [
                'id' => $row['id'],
                'datetime' => \App\Fields\DateTime::formatToDisplay($row['datetime']),
                'user' => \App\Fields\Owner::getUserLabel($row['user']) ?: '',
                'sender' => \App\Purifier::encodeHtml($mailRbl->mailMimeParser->getHeaderValue('from')),
                'recipient' => \App\Purifier::encodeHtml($mailRbl->mailMimeParser->getHeaderValue('to')),
                'ip' => $ip,
                'type' => "<span class=\"{$type['icon']} mr-2\"></span>" . \App\Language::translate($type['label'], 'Settings:MailRbl'),
            ];
        }
        $query->limit(null)->offset(null)->orderBy(null);
        $count = $query->count();
        $result = [
            'draw' => $request->getInteger('draw'),
            'iTotalRecords' => $query->where(['status' => 0])->count(),
            'iTotalDisplayRecords' => $count,
            'aaData' => $rows,
        ];
        header('content-type: text/json; charset=UTF-8');
        echo \App\Json::encode($result);
    }

    /**
     * To send mode.
     *
     * @param App\Request $request
     */
    public function toSend(App\Request $request)
    {
        $rows = [];
        $query = $this->getQuery($request);
        $query->from('s_#__mail_rbl_request')->select(['id',  'type', 'datetime', 'user', 'header']);
        $query->andWhere(['status' => 1]);
        $dataReader = $query->createCommand(\App\Db::getInstance('admin'))->query();
        while ($row = $dataReader->read()) {
            $mailRbl = \App\Mail\Rbl::getInstance($row);
            $mailRbl->parse();
            $type = \App\Mail\Rbl::LIST_TYPES[$row['type']];
            $rows[] = [
                'id' => $row['id'],
                'datetime' => \App\Fields\DateTime::formatToDisplay($row['datetime']),
                'user' => \App\Fields\Owner::getUserLabel($row['user']) ?: '',
                'sender' => \App\Purifier::encodeHtml($mailRbl->mailMimeParser->getHeaderValue('from')),
                'recipient' => \App\Purifier::encodeHtml($mailRbl->mailMimeParser->getHeaderValue('to')),
                'ip' => \App\Purifier::encodeHtml($mailRbl->getSender()['ip'] ?? ''),
                'type' => "<span class=\"{$type['icon']} mr-2\"></span>" . \App\Language::translate($type['label'], 'Settings:MailRbl'),
            ];
        }
        $query->limit(null)->offset(null)->orderBy(null);
        $count = $query->count();
        $result = [
            'draw' => $request->getInteger('draw'),
            'iTotalRecords' => $query->where(['status' => 1])->count(),
            'iTotalDisplayRecords' => $count,
            'aaData' => $rows,
        ];
        header('content-type: text/json; charset=UTF-8');
        echo \App\Json::encode($result);
    }

    /**
     * Request mode.
     *
     * @param App\Request $request
     */
    public function request(App\Request $request)
    {
        $rows = [];
        $query = $this->getQuery($request);
        $query->from('s_#__mail_rbl_request')->select(['id', 'status', 'type', 'datetime', 'user', 'header', 'body']);
        $dataReader = $query->createCommand(\App\Db::getInstance('admin'))->query();
        while ($row = $dataReader->read()) {
            $mailRbl = \App\Mail\Rbl::getInstance($row);
            $mailRbl->parse();
            $status = \App\Mail\Rbl::REQUEST_STATUS[$row['status']];
            $type = \App\Mail\Rbl::LIST_TYPES[$row['type']];
            if ($ip = ($mailRbl->getSender()['ip'] ?? '')) {
                $icon = '';
                if ($ips = \App\Mail\Rbl::findIp($ip, true)) {
                    $type = \App\Mail\Rbl::LIST_TYPES[$ips[0]['type']];
                    $icon = "<span class=\"{$type['icon']} mr-2 u-cursor-pointer\" title=\"" . \App\Language::translate('LBL_IP_ALREADY_EXISTS_LIST', 'Settings:MailRbl') . ' ' . \App\Language::translate($type['label'], 'Settings:MailRbl') . '"></span>';
                }
                $ip = $icon . \App\Purifier::encodeHtml($ip);
            }
            $rows[] = [
                'id' => $row['id'],
                'datetime' => \App\Fields\DateTime::formatToDisplay($row['datetime']),
                'user' => \App\Fields\Owner::getUserLabel($row['user']) ?: '',
                'sender' => \App\Purifier::encodeHtml($mailRbl->mailMimeParser->getHeaderValue('from')),
                'recipient' => \App\Purifier::encodeHtml($mailRbl->mailMimeParser->getHeaderValue('to')),
                'ip' => $ip,
                'statusId' => $row['status'],
                'status' => "<span class=\"{$status['icon']} mr-2\"></span>" . \App\Language::translate($status['label'], 'Settings:MailRbl'),
                'type' => "<span class=\"{$type['icon']} mr-2\"></span>" . \App\Language::translate($type['label'], 'Settings:MailRbl'),
            ];
        }
        $query->limit(null)->offset(null)->orderBy(null);
        $count = $query->count();
        $result = [
            'draw' => $request->getInteger('draw'),
            'iTotalRecords' => $query->where(null)->count(),
            'iTotalDisplayRecords' => $count,
            'aaData' => $rows,
        ];
        header('content-type: text/json; charset=UTF-8');
        echo \App\Json::encode($result);
    }

    /**
     * Black list mode.
     *
     * @param App\Request $request
     */
    public function blackList(App\Request $request)
    {
        $rows = [];
        $query = $this->getQuery($request);
        $query->from('s_#__mail_rbl_list')->andWhere(['type' => \App\Mail\Rbl::LIST_TYPE_BLACK_LIST]);
        $dataReader = $query->createCommand(\App\Db::getInstance('admin'))->query();
        while ($row = $dataReader->read()) {
            $status = \App\Mail\Rbl::LIST_STATUS[$row['status']];
            $rows[] = [
                'id' => $row['id'],
                'ip' => $row['ip'],
                'statusId' => $row['status'],
                'request' => $row['request'],
                'status' => "<span class=\"{$status['icon']} mr-2\"></span>" . \App\Language::translate($status['label'], 'Settings:MailRbl'),
            ];
        }
        $query->limit(null)->offset(null)->orderBy(null);
        $count = $query->count();
        $result = [
            'draw' => $request->getInteger('draw'),
            'iTotalRecords' => $query->where(['type' => \App\Mail\Rbl::LIST_TYPE_BLACK_LIST])->count(),
            'iTotalDisplayRecords' => $count,
            'aaData' => $rows,
        ];
        header('content-type: text/json; charset=UTF-8');
        echo \App\Json::encode($result);
    }

    /**
     * White list mode.
     *
     * @param App\Request $request
     */
    public function whiteList(App\Request $request)
    {
        $rows = [];
        $query = $this->getQuery($request);
        $query->from('s_#__mail_rbl_list')->andWhere(['type' => \App\Mail\Rbl::LIST_TYPE_WHITE_LIST]);
        $dataReader = $query->createCommand(\App\Db::getInstance('admin'))->query();
        while ($row = $dataReader->read()) {
            $status = \App\Mail\Rbl::LIST_STATUS[$row['status']];
            $rows[] = [
                'id' => $row['id'],
                'ip' => $row['ip'],
                'statusId' => $row['status'],
                'request' => $row['request'],
                'status' => "<span class=\"{$status['icon']} mr-2\"></span>" . \App\Language::translate($status['label'], 'Settings:MailRbl'),
            ];
        }
        $query->limit(null)->offset(null)->orderBy(null);
        $count = $query->count();
        $result = [
            'draw' => $request->getInteger('draw'),
            'iTotalRecords' => $query->where(['type' => \App\Mail\Rbl::LIST_TYPE_WHITE_LIST])->count(),
            'iTotalDisplayRecords' => $count,
            'aaData' => $rows,
        ];
        header('content-type: text/json; charset=UTF-8');
        echo \App\Json::encode($result);
    }

    /**
     * Public RBL mode.
     *
     * @param App\Request $request
     */
    public function publicRbl(App\Request $request)
    {
        $rows = [];
        $query = $this->getQuery($request);
        $query->from('s_#__mail_rbl_list')->select(['ip', 'status', 'type', 'comment'])->andWhere(['type' => [\App\Mail\Rbl::LIST_TYPE_PUBLIC_BLACK_LIST, \App\Mail\Rbl::LIST_TYPE_PUBLIC_WHITE_LIST]]);
        $dataReader = $query->createCommand(\App\Db::getInstance('admin'))->query();
        while ($row = $dataReader->read()) {
            $status = \App\Mail\Rbl::LIST_STATUS[$row['status']];
            $rows[] = [
                'ip' => $row['ip'],
                'type' => \App\Language::translate((\App\Mail\Rbl::LIST_TYPE_PUBLIC_BLACK_LIST == $row['type'] ? 'LBL_BLACK_LIST' : 'LBL_WHITE_LIST'), 'Settings:MailRbl'),
                'statusId' => $row['status'],
                'status' => "<span class=\"{$status['icon']} mr-2\"></span>" . \App\Language::translate($status['label'], 'Settings:MailRbl'),
                'comment' => \App\Layout::truncateText($row['comment'], 30),
            ];
        }
        $query->limit(null)->offset(null)->orderBy(null);
        $count = $query->count();
        $result = [
            'draw' => $request->getInteger('draw'),
            'iTotalRecords' => $query->where(['type' => [\App\Mail\Rbl::LIST_TYPE_PUBLIC_BLACK_LIST, \App\Mail\Rbl::LIST_TYPE_PUBLIC_WHITE_LIST]])->count(),
            'iTotalDisplayRecords' => $count,
            'aaData' => $rows,
        ];
        header('content-type: text/json; charset=UTF-8');
        echo \App\Json::encode($result);
    }

    /**
     * Get query.
     *
     * @param App\Request $request
     *
     * @return App\Db\Query
     */
    private function getQuery(App\Request $request): App\Db\Query
    {
        $columns = [];
        foreach ($request->getArray('columns') as $key => $value) {
            $columns[$key] = $value['data'];
        }
        $query = (new \App\Db\Query());
        $query->limit($request->getInteger('length'));
        $query->offset($request->getInteger('start'));
        $order = current($request->getArray('order', 'Alnum'));
        if ($order && isset($columns[$order['column']])) {
            $query->orderBy([$columns[$order['column']] => 'asc' === $order['dir'] ? \SORT_ASC : \SORT_DESC]);
        }
        if (!$request->isEmpty('type') && ($type = $request->getArray('type', 'Integer'))) {
            $query->andWhere(['type' => $type]);
        }
        if (!$request->isEmpty('status') && ($status = $request->getArray('status', 'Integer'))) {
            $query->andWhere(['status' => $status]);
        }
        if (!$request->isEmpty('ip') && ($ip = $request->getByType('ip', 'ip'))) {
            $query->andWhere(['ip' => $ip]);
        }
        if (!$request->isEmpty('date') && ($date = $request->getDateRange('date'))) {
            $query->andWhere(['between', 'datetime', $date[0] . ' 00:00:00', $date[1] . ' 23:59:59']);
        }
        if (!$request->isEmpty('users') && ($users = $request->getArray('users', 'Integer'))) {
            $query->andWhere(['user' => $users]);
        }
        return $query;
    }
}