hysteria/extras/auth/v2board.go
2023-10-13 18:16:44 +05:30

89 lines
1.5 KiB
Go

package auth
import (
"encoding/json"
"fmt"
"net"
"net/http"
"strconv"
"sync"
"time"
"github.com/apernet/hysteria/core/server"
)
var _ server.Authenticator = &V2boardApiProvider{}
type V2boardApiProvider struct {
Client *http.Client
URL string
}
// 用户列表
var (
users []User
lock sync.Mutex
)
type User struct {
ID int `json:"id"`
UUID string `json:"uuid"`
SpeedLimit *uint32 `json:"speed_limit"`
}
type ResponseData struct {
Users []User `json:"users"`
}
func getUserList(url string) ([]User, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var responseData ResponseData
err = json.NewDecoder(resp.Body).Decode(&responseData)
if err != nil {
return nil, err
}
return responseData.Users, nil
}
func UpdateUsers(url string, interval time.Duration) {
fmt.Println("定时更新用户列表进程已开启")
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
userList, err := getUserList(url)
if err != nil {
fmt.Println("Error:", err)
continue
}
lock.Lock()
users = userList
lock.Unlock()
}
}
}
// 验证代码
func (v *V2boardApiProvider) Authenticate(addr net.Addr, auth string, tx uint64) (ok bool, id string) {
// 获取判断连接用户是否在用户列表内
lock.Lock()
defer lock.Unlock()
for _, s := range users {
if s.UUID == string(auth) {
return true, strconv.Itoa(s.ID)
}
}
return false, ""
}