46 lines
1.6 KiB
Go
46 lines
1.6 KiB
Go
package policies
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/fiatjaf/khatru"
|
|
"github.com/nbd-wtf/go-nostr"
|
|
)
|
|
|
|
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 == "" {
|
|
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) {
|
|
return rl(evt.PubKey), "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 {
|
|
return rl(khatru.GetIPFromRequest(r))
|
|
}
|
|
}
|
|
|
|
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) {
|
|
return rl(khatru.GetIP(ctx)), "rate-limited: there is a bug in the client, no one should be making so many requests"
|
|
}
|
|
}
|