59 lines
1.8 KiB
Go
59 lines
1.8 KiB
Go
package policies
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
|
|
"fiatjaf.com/nostr"
|
|
"fiatjaf.com/nostr/khatru"
|
|
)
|
|
|
|
func EventIPRateLimiter(tokensPerInterval int, interval time.Duration, maxTokens int) func(ctx context.Context, _ nostr.Event) (reject bool, msg string) {
|
|
rl := startRateLimitSystem[string](tokensPerInterval, interval, maxTokens)
|
|
|
|
return func(ctx context.Context, _ nostr.Event) (reject bool, msg string) {
|
|
ip := khatru.GetIP(ctx)
|
|
if ip == "127.0.0.1" || ip == "::1" {
|
|
return false, ""
|
|
}
|
|
return rl(ip), "rate-limited: slow down, please"
|
|
}
|
|
}
|
|
|
|
func EventPubKeyRateLimiter(tokensPerInterval int, interval time.Duration, maxTokens int) func(ctx context.Context, _ nostr.Event) (reject bool, msg string) {
|
|
rl := startRateLimitSystem[string](tokensPerInterval, interval, maxTokens)
|
|
|
|
return func(ctx context.Context, evt nostr.Event) (reject bool, msg string) {
|
|
ip := khatru.GetIP(ctx)
|
|
if ip == "127.0.0.1" || ip == "::1" {
|
|
return false, ""
|
|
}
|
|
return rl(evt.PubKey.Hex()), "rate-limited: slow down, please"
|
|
}
|
|
}
|
|
|
|
func ConnectionRateLimiter(tokensPerInterval int, interval time.Duration, maxTokens int) func(r *http.Request) bool {
|
|
rl := startRateLimitSystem[string](tokensPerInterval, interval, maxTokens)
|
|
|
|
return func(r *http.Request) bool {
|
|
ip := khatru.GetIPFromRequest(r)
|
|
if ip == "127.0.0.1" || ip == "::1" {
|
|
return false
|
|
}
|
|
return rl(ip)
|
|
}
|
|
}
|
|
|
|
func FilterIPRateLimiter(tokensPerInterval int, interval time.Duration, maxTokens int) func(ctx context.Context, _ nostr.Filter) (reject bool, msg string) {
|
|
rl := startRateLimitSystem[string](tokensPerInterval, interval, maxTokens)
|
|
|
|
return func(ctx context.Context, _ nostr.Filter) (reject bool, msg string) {
|
|
ip := khatru.GetIP(ctx)
|
|
if ip == "127.0.0.1" {
|
|
return false, ""
|
|
}
|
|
return rl(ip), "rate-limited: there is a bug in the client, no one should be making so many requests"
|
|
}
|
|
}
|