Dotclear

source: plugins/antispam/inc/lib.dc.antispam.php @ 3231:bf7f869cfed9

Revision 3231:bf7f869cfed9, 5.4 KB checked in by franck <carnet.franck.paul@…>, 9 years ago (diff)

Allow different cryptographic algorithm for user password, choosen algo must provide result longer or equal than 40 characters (as default sha1), closes #1922

The constant DC_CRYPT_ALGO should be defined in config.php, and users will have to use recovery password procedure to set a new one according to the choosen algorithm.

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Antispam, a plugin for Dotclear 2.
5#
6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
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          {
52               $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null;
53
54               self::initFilters();
55               self::$filters->trainFilters($rs,$status,$filter_name);
56          }
57     }
58
59     public static function statusMessage($rs)
60     {
61          if ($rs->exists('comment_status') && $rs->comment_status == -2)
62          {
63               $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null;
64
65               self::initFilters();
66
67               return
68               '<p><strong>'.__('This comment is a spam:').'</strong> '.
69               self::$filters->statusMessage($rs,$filter_name).'</p>';
70          }
71     }
72
73     public static function dashboardIcon($core, $icons)
74     {
75          if (($count = self::countSpam($core)) > 0) {
76               $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
77               $icons['comments'][0] .= '</span></a> <br /><a href="'.$core->adminurl->get('admin.comments',array('status' => '-2')).'"><span>'.
78                    sprintf($str,$count);
79          }
80     }
81
82     public static function dashboardIconTitle($core)
83     {
84          if (($count = self::countSpam($core)) > 0) {
85               $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
86               return '</span></a> <br /><a href="'.$core->adminurl->get('admin.comments',array('status' => '-2')).'"><span>'.
87                    sprintf($str,$count);
88          } else {
89               return '';
90          }
91     }
92
93     public static function countSpam($core)
94     {
95          return $core->blog->getComments(array('comment_status'=>-2),true)->f(0);
96     }
97
98     public static function countPublishedComments($core)
99     {
100          return $core->blog->getComments(array('comment_status'=>1),true)->f(0);
101     }
102
103     public static function delAllSpam($core, $beforeDate = null)
104     {
105          $strReq =
106          'SELECT comment_id '.
107          'FROM '.$core->prefix.'comment C '.
108          'JOIN '.$core->prefix.'post P ON P.post_id = C.post_id '.
109          "WHERE blog_id = '".$core->con->escape($core->blog->id)."' ".
110          'AND comment_status = -2 ';
111          if ($beforeDate) {
112               $strReq .= 'AND comment_dt < \''.$beforeDate.'\' ';
113          }
114
115          $rs = $core->con->select($strReq);
116          $r = array();
117          while ($rs->fetch()) {
118               $r[] = (integer) $rs->comment_id;
119          }
120
121          if (empty($r)) {
122               return;
123          }
124
125          $strReq =
126          'DELETE FROM '.$core->prefix.'comment '.
127          'WHERE comment_id '.$core->con->in($r).' ';
128
129          $core->con->execute($strReq);
130     }
131
132     public static function getUserCode($core)
133     {
134          $code =
135          pack('a32',$core->auth->userID()).
136          pack('H*',$core->auth->crypt($core->auth->getInfo('user_pwd')));
137          return bin2hex($code);
138     }
139
140     public static function checkUserCode($core,$code)
141     {
142          $code = pack('H*',$code);
143
144          $user_id = trim(@pack('a32',substr($code,0,32)));
145          $pwd = @unpack('H*hex',substr($code,32));
146
147          if ($user_id === false || $pwd === false) {
148               return false;
149          }
150
151          $pwd = $pwd['hex'];
152
153          $strReq = 'SELECT user_id, user_pwd '.
154                    'FROM '.$core->prefix.'user '.
155                    "WHERE user_id = '".$core->con->escape($user_id)."' ";
156
157          $rs = $core->con->select($strReq);
158
159          if ($rs->isEmpty()) {
160               return false;
161          }
162
163          if ($core->auth->crypt($rs->user_pwd) != $pwd) {
164               return false;
165          }
166
167          $permissions = $core->getBlogPermissions($core->blog->id);
168
169          if ( empty($permissions[$rs->user_id]) ) {
170               return false;
171          }
172
173          return $rs->user_id;
174     }
175
176     public static function purgeOldSpam($core)
177     {
178          $defaultDateLastPurge = time();
179          $defaultModerationTTL = '7';
180          $init = false;
181
182          // settings
183          $core->blog->settings->addNamespace('antispam');
184
185          $dateLastPurge = $core->blog->settings->antispam->antispam_date_last_purge;
186          if ($dateLastPurge === null) {
187               $init = true;
188               $core->blog->settings->antispam->put('antispam_date_last_purge',$defaultDateLastPurge,'integer','Antispam Date Last Purge (unix timestamp)',true,false);
189               $dateLastPurge = $defaultDateLastPurge;
190          }
191          $moderationTTL = $core->blog->settings->antispam->antispam_moderation_ttl;
192          if ($moderationTTL === null) {
193               $core->blog->settings->antispam->put('antispam_moderation_ttl',$defaultModerationTTL,'integer','Antispam Moderation TTL (days)',true,false);
194               $moderationTTL = $defaultModerationTTL;
195          }
196
197          if ($moderationTTL < 0) {
198               // disabled
199               return;
200          }
201
202          // we call the purge every day
203          if ((time()-$dateLastPurge) > (86400)) {
204               // update dateLastPurge
205               if (!$init) {
206                    $core->blog->settings->antispam->put('antispam_date_last_purge',time(),null,null,true,false);
207               }
208               $date = date('Y-m-d H:i:s', time() - $moderationTTL*86400);
209               dcAntispam::delAllSpam($core, $date);
210          }
211     }
212}
Note: See TracBrowser for help on using the repository browser.

Sites map