Skip to content

Commit

Permalink
[+] Simple hashtable rate limiter
Browse files Browse the repository at this point in the history
  • Loading branch information
hykilpikonna authored and Mak1owo committed Mar 7, 2023
1 parent 6db9d16 commit 0a34286
Showing 1 changed file with 40 additions and 5 deletions.
45 changes: 40 additions & 5 deletions src/main/kotlin/org/hydev/back/controller/FlowerController.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package org.hydev.back.controller

import org.hydev.back.P
import org.hydev.back.*
import org.hydev.back.db.Flower
import org.hydev.back.db.FlowerRepo
import org.hydev.back.getIP
import org.hydev.back.str
import org.springframework.web.bind.annotation.CrossOrigin
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.util.*
import javax.servlet.http.HttpServletRequest

@RestController
Expand All @@ -18,6 +17,35 @@ class FlowerController(
private val flowerRepo: FlowerRepo
)
{
private final val LIMIT = 5
private lateinit var day: String
private lateinit var dayLimit: HashMap<String, Int>

init
{
initLimit()
}

final fun initLimit()
{
day = today().yyyymmdd()
dayLimit = HashMap()
}

/**
* Returns true if limit is reached
*/
final fun checkLimit(token: str): bool
{
// Check whether limiter needs an update
if (day != today().yyyymmdd()) initLimit()

// Check limit
dayLimit[token]?.let { if (it >= LIMIT) return true }
dayLimit[token] = (dayLimit[token] ?: 0) + 1
return false
}

@GetMapping("/get")
fun get(@P id: str): Any
{
Expand All @@ -31,7 +59,14 @@ class FlowerController(
fun give(@P id: str, request: HttpServletRequest): Any
{
val id = id.lowercase()
println("[+] Flower added for $id by ${request.getIP()}")
val ip = request.getIP()

if (checkLimit("$id|$ip"))
{
println("[x] Flower rejected for $id by $ip: Daily limit reached")
return "Limit reached"
}
println("[+] Flower added for $id by $ip")

var flower = flowerRepo.queryByPersonId(id)
if (flower == null)
Expand All @@ -44,6 +79,6 @@ class FlowerController(
flower.flowers += 1
flowerRepo.save(flower)
}
return "{}"
return ""
}
}

0 comments on commit 0a34286

Please sign in to comment.