Per-user limit that says how many seconds must go between each email.
Outgoing emails are also delayed by this much (or we'd miss it)
name='ResendMessage',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('registeredat', models.DateTimeField(auto_now_add=True)),
+ ('registeredat', models.DateTimeField()),
('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mailarchives.Message')),
('sendto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
class ResendMessage(models.Model):
message = models.ForeignKey(Message, null=False, blank=False)
sendto = models.ForeignKey(User, null=False, blank=False)
- registeredat = models.DateTimeField(null=False, blank=False, auto_now_add=True)
+ registeredat = models.DateTimeField(null=False, blank=False)
class ApiClient(models.Model):
if request.method == 'POST':
if request.POST.get('resend', None) == '1':
- ResendMessage.objects.get_or_create(message=m, sendto=request.user)
+ # Figure out if this user has sent an email recently, and if so refuse it
+ if ResendMessage.objects.filter(sendto=request.user, registeredat__gt=datetime.now()).exists():
+ return HttpResponse("You have already requested an email to be sent in the past {0} seconds. Please try again later.".format(settings.RESEND_RATE_LIMIT_SECONDS))
+
+ ResendMessage.objects.get_or_create(message=m, sendto=request.user, registeredat=datetime.now() + timedelta(seconds=settings.RESEND_RATE_LIMIT_SECONDS))
connection.cursor().execute("NOTIFY archives_resend")
return HttpResponseRedirect('/message-id/resend/{0}/complete'.format(m.messageid))
# Required for lighttpd
FORCE_SCRIPT_NAME = ""
+# Minimum this many seconds between emails sent out to a single user
+RESEND_RATE_LIMIT_SECONDS = 30
+
# Always override!
SEARCH_CLIENTS = ('127.0.0.1',)
API_CLIENTS = ('127.0.0.1',)