71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package setting
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"sort"
|
|
"sync"
|
|
)
|
|
|
|
var RateLimitUserWhitelist = map[int]struct{}{}
|
|
var RateLimitUserWhitelistMutex sync.RWMutex
|
|
|
|
func RateLimitUserWhitelist2JSONString() string {
|
|
RateLimitUserWhitelistMutex.RLock()
|
|
defer RateLimitUserWhitelistMutex.RUnlock()
|
|
|
|
ids := make([]int, 0, len(RateLimitUserWhitelist))
|
|
for id := range RateLimitUserWhitelist {
|
|
ids = append(ids, id)
|
|
}
|
|
sort.Ints(ids)
|
|
jsonBytes, err := json.Marshal(ids)
|
|
if err != nil {
|
|
return "[]"
|
|
}
|
|
return string(jsonBytes)
|
|
}
|
|
|
|
func UpdateRateLimitUserWhitelistByJSONString(jsonStr string) error {
|
|
var ids []int
|
|
if err := json.Unmarshal([]byte(jsonStr), &ids); err != nil {
|
|
return err
|
|
}
|
|
|
|
next := make(map[int]struct{}, len(ids))
|
|
for _, id := range ids {
|
|
if id <= 0 {
|
|
return fmt.Errorf("invalid user id in whitelist: %d", id)
|
|
}
|
|
next[id] = struct{}{}
|
|
}
|
|
|
|
RateLimitUserWhitelistMutex.Lock()
|
|
defer RateLimitUserWhitelistMutex.Unlock()
|
|
RateLimitUserWhitelist = next
|
|
return nil
|
|
}
|
|
|
|
func CheckRateLimitUserWhitelistJSON(jsonStr string) error {
|
|
var ids []int
|
|
if err := json.Unmarshal([]byte(jsonStr), &ids); err != nil {
|
|
return err
|
|
}
|
|
for _, id := range ids {
|
|
if id <= 0 {
|
|
return fmt.Errorf("invalid user id in whitelist: %d", id)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func IsUserInRateLimitWhitelist(userId int) bool {
|
|
if userId <= 0 {
|
|
return false
|
|
}
|
|
RateLimitUserWhitelistMutex.RLock()
|
|
defer RateLimitUserWhitelistMutex.RUnlock()
|
|
_, ok := RateLimitUserWhitelist[userId]
|
|
return ok
|
|
}
|