Dotclear

source: plugins/antispam/inc/lib.dc.antispam.php @ 3874:ab8368569446

Revision 3874:ab8368569446, 6.4 KB checked in by franck <carnet.franck.paul@…>, 7 years ago (diff)

short notation for array (array() → [])

Line 
1<?php
2/**
3 * @brief antispam, a plugin for Dotclear 2
4 *
5 * @package Dotclear
6 * @subpackage Plugins
7 *
8 * @copyright Olivier Meunier & Association Dotclear
9 * @copyright GPL-2.0-only
10 */
11
12if (!defined('DC_RC_PATH')) {return;}
13
14class dcAntispam
15{
16    public static $filters;
17
18    public static function initFilters()
19    {
20        global $core;
21
22        if (!isset($core->spamfilters)) {
23            return;
24        }
25
26        self::$filters = new dcSpamFilters($core);
27        self::$filters->init($core->spamfilters);
28    }
29
30    public static function isSpam($cur)
31    {
32        self::initFilters();
33        self::$filters->isSpam($cur);
34    }
35
36    public static function trainFilters($blog, $cur, $rs)
37    {
38        $status = null;
39        # From ham to spam
40        if ($rs->comment_status != -2 && $cur->comment_status == -2) {
41            $status = 'spam';
42        }
43
44        # From spam to ham
45        if ($rs->comment_status == -2 && $cur->comment_status == 1) {
46            $status = 'ham';
47        }
48
49        # the status of this comment has changed
50        if ($status) {
51            $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null;
52
53            self::initFilters();
54            self::$filters->trainFilters($rs, $status, $filter_name);
55        }
56    }
57
58    public static function statusMessage($rs)
59    {
60        if ($rs->exists('comment_status') && $rs->comment_status == -2) {
61            $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null;
62
63            self::initFilters();
64
65            return
66            '<p><strong>' . __('This comment is a spam:') . '</strong> ' .
67            self::$filters->statusMessage($rs, $filter_name) . '</p>';
68        }
69    }
70
71    public static function dashboardIcon($core, $icons)
72    {
73        if (($count = self::countSpam($core)) > 0) {
74            $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
75            $icons['comments'][0] .= '</span></a> <a href="' . $core->adminurl->get('admin.comments', ['status' => '-2']) . '"><span class="db-icon-title-spam">' .
76            sprintf($str, $count);
77        }
78    }
79
80    public static function dashboardIconTitle($core)
81    {
82        if (($count = self::countSpam($core)) > 0) {
83            $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
84            return '</span></a> <a href="' . $core->adminurl->get('admin.comments', ['status' => '-2']) . '"><span class="db-icon-title-spam">' .
85            sprintf($str, $count);
86        } else {
87            return '';
88        }
89    }
90
91    public static function dashboardHeaders()
92    {
93        return dcPage::jsLoad(urldecode(dcPage::getPF('antispam/js/dashboard.js')));
94    }
95
96    public static function countSpam($core)
97    {
98        return $core->blog->getComments(['comment_status' => -2], true)->f(0);
99    }
100
101    public static function countPublishedComments($core)
102    {
103        return $core->blog->getComments(['comment_status' => 1], true)->f(0);
104    }
105
106    public static function delAllSpam($core, $beforeDate = null)
107    {
108        $strReq =
109        'SELECT comment_id ' .
110        'FROM ' . $core->prefix . 'comment C ' .
111        'JOIN ' . $core->prefix . 'post P ON P.post_id = C.post_id ' .
112        "WHERE blog_id = '" . $core->con->escape($core->blog->id) . "' " .
113            'AND comment_status = -2 ';
114        if ($beforeDate) {
115            $strReq .= 'AND comment_dt < \'' . $beforeDate . '\' ';
116        }
117
118        $rs = $core->con->select($strReq);
119        $r  = [];
120        while ($rs->fetch()) {
121            $r[] = (integer) $rs->comment_id;
122        }
123
124        if (empty($r)) {
125            return;
126        }
127
128        $strReq =
129        'DELETE FROM ' . $core->prefix . 'comment ' .
130        'WHERE comment_id ' . $core->con->in($r) . ' ';
131
132        $core->con->execute($strReq);
133    }
134
135    public static function getUserCode($core)
136    {
137        $code =
138        pack('a32', $core->auth->userID()) .
139        pack('H*', $core->auth->cryptLegacy($core->auth->getInfo('user_pwd')));
140        return bin2hex($code);
141    }
142
143    public static function checkUserCode($core, $code)
144    {
145        $code = pack('H*', $code);
146
147        $user_id = trim(@pack('a32', substr($code, 0, 32)));
148        $pwd     = @unpack('H*hex', substr($code, 32));
149
150        if ($user_id === false || $pwd === false) {
151            return false;
152        }
153
154        $pwd = $pwd['hex'];
155
156        $strReq = 'SELECT user_id, user_pwd ' .
157        'FROM ' . $core->prefix . 'user ' .
158        "WHERE user_id = '" . $core->con->escape($user_id) . "' ";
159
160        $rs = $core->con->select($strReq);
161
162        if ($rs->isEmpty()) {
163            return false;
164        }
165
166        if ($core->auth->cryptLegacy($rs->user_pwd) != $pwd) {
167            return false;
168        }
169
170        $permissions = $core->getBlogPermissions($core->blog->id);
171
172        if (empty($permissions[$rs->user_id])) {
173            return false;
174        }
175
176        return $rs->user_id;
177    }
178
179    public static function purgeOldSpam($core)
180    {
181        $defaultDateLastPurge = time();
182        $defaultModerationTTL = '7';
183        $init                 = false;
184
185        // settings
186        $core->blog->settings->addNamespace('antispam');
187
188        $dateLastPurge = $core->blog->settings->antispam->antispam_date_last_purge;
189        if ($dateLastPurge === null) {
190            $init = true;
191            $core->blog->settings->antispam->put('antispam_date_last_purge', $defaultDateLastPurge, 'integer', 'Antispam Date Last Purge (unix timestamp)', true, false);
192            $dateLastPurge = $defaultDateLastPurge;
193        }
194        $moderationTTL = $core->blog->settings->antispam->antispam_moderation_ttl;
195        if ($moderationTTL === null) {
196            $core->blog->settings->antispam->put('antispam_moderation_ttl', $defaultModerationTTL, 'integer', 'Antispam Moderation TTL (days)', true, false);
197            $moderationTTL = $defaultModerationTTL;
198        }
199
200        if ($moderationTTL < 0) {
201            // disabled
202            return;
203        }
204
205        // we call the purge every day
206        if ((time() - $dateLastPurge) > (86400)) {
207            // update dateLastPurge
208            if (!$init) {
209                $core->blog->settings->antispam->put('antispam_date_last_purge', time(), null, null, true, false);
210            }
211            $date = date('Y-m-d H:i:s', time() - $moderationTTL * 86400);
212            dcAntispam::delAllSpam($core, $date);
213        }
214    }
215}
Note: See TracBrowser for help on using the repository browser.

Sites map