add option reply-to-self, defaults to false

pull/38/head
Martin Zimmermann 11 years ago
parent 70b426d770
commit d4e7ee134d

@ -187,6 +187,7 @@ for IPv4, ``/48`` for IPv6).
enabled = true enabled = true
ratelimit = 2 ratelimit = 2
direct-reply = 3 direct-reply = 3
reply-to-self = false
enabled enabled
enable guard, recommended in production. Not useful for debugging enable guard, recommended in production. Not useful for debugging
@ -199,6 +200,11 @@ direct-reply
how many comments directly to the thread (prevent a simple how many comments directly to the thread (prevent a simple
`while true; do curl ...; done`. `while true; do curl ...; done`.
reply-to-self
allow commenters to reply to their own comments when they could still edit
the comment. After the editing timeframe is gone, commenters can reply to
their own comments anyways.
Appendum Appendum
--------- ---------

@ -120,7 +120,8 @@ class Config:
"[guard]", "[guard]",
"enabled = true", "enabled = true",
"ratelimit = 2", "ratelimit = 2",
"direct-reply = 3" "direct-reply = 3",
"reply-to-self = false"
] ]
@classmethod @classmethod

@ -10,6 +10,7 @@ class Guard:
self.db = db self.db = db
self.conf = db.conf.section("guard") self.conf = db.conf.section("guard")
self.max_age = db.conf.getint("general", "max-age")
def validate(self, uri, comment): def validate(self, uri, comment):
@ -49,6 +50,18 @@ class Guard:
if len(rv) >= self.conf.getint("direct-reply"): if len(rv) >= self.conf.getint("direct-reply"):
return False, "%i direct responses to %s" % (len(rv), uri) return False, "%i direct responses to %s" % (len(rv), uri)
elif self.conf.getboolean("reply-to-self") == False:
rv = self.db.execute([
'SELECT id FROM comments WHERE'
' remote_addr = ?',
'AND id = ?',
'AND ? - created < ?'
], (comment["remote_addr"], comment["parent"],
time.time(), self.max_age)).fetchall()
if len(rv) > 0:
return False, "edit time frame is still open"
return True, "" return True, ""
def _spam(self, uri, comment): def _spam(self, uri, comment):

@ -23,13 +23,14 @@ class TestGuard(unittest.TestCase):
def setUp(self): def setUp(self):
self.path = tempfile.NamedTemporaryFile().name self.path = tempfile.NamedTemporaryFile().name
def makeClient(self, ip, ratelimit=2, direct_reply=3): def makeClient(self, ip, ratelimit=2, direct_reply=3, self_reply=False):
conf = core.Config.load(None) conf = core.Config.load(None)
conf.set("general", "dbpath", self.path) conf.set("general", "dbpath", self.path)
conf.set("guard", "enabled", "true") conf.set("guard", "enabled", "true")
conf.set("guard", "ratelimit", str(ratelimit)) conf.set("guard", "ratelimit", str(ratelimit))
conf.set("guard", "direct-reply", str(direct_reply)) conf.set("guard", "direct-reply", str(direct_reply))
conf.set("guard", "reply-to-self", "1" if self_reply else "0")
class App(Isso, core.Mixin): class App(Isso, core.Mixin):
pass pass
@ -78,3 +79,24 @@ class TestGuard(unittest.TestCase):
assert rv.status_code == 403 assert rv.status_code == 403
assert "direct responses to" in rv.data assert "direct responses to" in rv.data
def testSelfReply(self):
payload = lambda id: json.dumps({"text": "...", "parent": id})
client = self.makeClient("127.0.0.1", self_reply=False)
assert client.post("/new?uri=test", data=self.data).status_code == 201
assert client.post("/new?uri=test", data=payload(1)).status_code == 403
client.application.db.execute([
"UPDATE comments SET",
" created = created - ?",
"WHERE id = 1"
], (client.application.conf.getint("general", "max-age"), ))
assert client.post("/new?uri=test", data=payload(1)).status_code == 201
client = self.makeClient("128.0.0.1", ratelimit=3, self_reply=False)
assert client.post("/new?uri=test", data=self.data).status_code == 201
assert client.post("/new?uri=test", data=payload(1)).status_code == 201
assert client.post("/new?uri=test", data=payload(2)).status_code == 201

Loading…
Cancel
Save