]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Limit duplicate notices in a particular time period (default 60s)
authorEvan Prodromou <evan@controlyourself.ca>
Sat, 7 Mar 2009 17:43:50 +0000 (09:43 -0800)
committerEvan Prodromou <evan@controlyourself.ca>
Sat, 7 Mar 2009 17:43:50 +0000 (09:43 -0800)
We disallow posting a notice with duplicate content more than once a
minute.

Conflicts:

config.php.sample

README
classes/Notice.php
config.php.sample
lib/common.php

diff --git a/README b/README
index 388d67ed2a5bf40dfcf62380dbeab4b40147f41b..ec2e2ec4f771f2479e797d778fea60e065db4b3a 100644 (file)
--- a/README
+++ b/README
@@ -879,6 +879,8 @@ notice: A plain string that will appear on every page. A good place
        to put introductory information about your service, or info about
        upgrades and outages, or other community info. Any HTML will
         be escaped.
+dupelimit: Time in which it's not OK for the same person to post the
+           same notice; default = 60 seconds.
 
 db
 --
index 907239b084bf43027c1d95d8f8016d66c886ffc3..eac90ce95b626641c44dd432a3e7d61c19950e9d 100644 (file)
@@ -121,6 +121,8 @@ class Notice extends Memcached_DataObject
 
         $profile = Profile::staticGet($profile_id);
 
+        $final =  common_shorten_links($content);
+
         if (!$profile) {
             common_log(LOG_ERR, 'Problem saving notice. Unknown user.');
             return _('Problem saving notice. Unknown user.');
@@ -131,7 +133,12 @@ class Notice extends Memcached_DataObject
             return _('Too many notices too fast; take a breather and post again in a few minutes.');
         }
 
-        $banned = common_config('profile', 'banned');
+        if (common_config('site', 'dupelimit') > 0 && !Notice::checkDupes($profile_id, $final)) {
+            common_log(LOG_WARNING, 'Dupe posting by profile #' . $profile_id . '; throttled.');
+                       return _('Too many duplicate messages too quickly; take a breather and post again in a few minutes.');
+        }
+
+               $banned = common_config('profile', 'banned');
 
         if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
             common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
@@ -155,12 +162,12 @@ class Notice extends Memcached_DataObject
 
                $notice->query('BEGIN');
 
-        $notice->reply_to = $reply_to;
-        $notice->created = common_sql_now();
-        $notice->content = common_shorten_links($content);
-        $notice->rendered = common_render_content($notice->content, $notice);
-        $notice->source = $source;
-        $notice->uri = $uri;
+               $notice->reply_to = $reply_to;
+               $notice->created = common_sql_now();
+               $notice->content = $final;
+               $notice->rendered = common_render_content($final, $notice);
+               $notice->source = $source;
+               $notice->uri = $uri;
 
         if (Event::handle('StartNoticeSave', array(&$notice))) {
 
@@ -204,6 +211,32 @@ class Notice extends Memcached_DataObject
         return $notice;
     }
 
+    static function checkDupes($profile_id, $content) {
+        $profile = Profile::staticGet($profile_id);
+        if (!$profile) {
+            return false;
+        }
+        $notice = $profile->getNotices(0, NOTICE_CACHE_WINDOW);
+        if ($notice) {
+            $last = 0;
+            while ($notice->fetch()) {
+                if (time() - strtotime($notice->created) >= common_config('site', 'dupelimit')) {
+                    return true;
+                } else if ($notice->content == $content) {
+                    return false;
+                }
+            }
+        }
+        # If we get here, oldest item in cache window is not
+        # old enough for dupe limit; do direct check against DB
+        $notice = new Notice();
+        $notice->profile_id = $profile_id;
+        $notice->content = $content;
+        $notice->whereAdd('now() - created < ' . common_config('notice', 'dupelimit'));
+        $cnt = $notice->count();
+        return ($cnt > 0);
+    }
+
     static function checkEditThrottle($profile_id) {
         $profile = Profile::staticGet($profile_id);
         if (!$profile) {
index a6cada77a27bcf9b2a46f0126f123a1dce6fa733..c2b27408cd52aa2db712a2e34fd9281da4b3f8fa 100644 (file)
@@ -159,3 +159,9 @@ $config['sphinx']['port'] = 3312;
 # Add Google Analytics
 # require_once('plugins/GoogleAnalyticsPlugin.php');
 # $ga = new GoogleAnalyticsPlugin('your secret code');
+
+#Don't allow saying the same thing more than once per hour
+#$config['site']['dupelimit'] = 3600;
+#Don't enforce the dupe limit
+#$config['site']['dupelimit'] = -1;
+
index 0355d01e3abe3a8e643163da7759f6d663e57182..917fdeafa47f9d4dd646fea2d9265695f6307980 100644 (file)
@@ -85,7 +85,8 @@ $config =
               'broughtbyurl' => null,
               'closed' => false,
               'inviteonly' => false,
-              'private' => false),
+              'private' => false,
+              'dupelimit' => 60), # default for same person saying the same thing
         'syslog' =>
         array('appname' => 'laconica', # for syslog
               'priority' => 'debug'), # XXX: currently ignored