Sunday, February 10, 2013

Node E-Mail Contact Form Submission Rate Limiting With Sessions

Using mongoose and coffee-script, I will layout a simple approach to limiting POST queries by client session id.

There are specific requirements for this POST route:

  • E-mail uses Gmail service account (provided by Node-Mailer)
  • Provide user feedback in real time (res.send)
  • Rate limit user's ability to POST over a defined interval (timestamps)


Lets create our model.  This collection will store our users submissions by session id.


mongoose.model 'submit_users', new Schema
session_id:
type: String
lastVisitedOn:
type: Date
default: Date.now()
lastSubmissionDate:
type: Date
default: Date.now()
Now lets define our app.post function.

contact = (req, res)->
SubmitUsers = mongoose.model 'submit_users'
findObj =
session_id: req.session.id
SubmitUsers.findOne findObj, (err, user)->
if(!user)
userObj =
session_id: req.session.id
lastVisitedOn: Date.now()
lastSubmissionDate: Date.now()
newUser = new SubmitUsers userObj
newUser.save()
sendEmail(req, res)
if(user)
if user.lastSubmissionDate > Date.now() - 10000
# not allowed to submit
user.lastVisitedOn = Date.now()
user.save()
res.send({ success: false })
else
# allowed to submit
user.lastVisitedOn = Date.now()
user.lastSubmissionDate = Date.now()
user.save()
sendEmail(req, res)
return this
module.exports = contact
view raw contact.coffee hosted with ❤ by GitHub