Files
H2Node/app/utils.go
2026-03-05 12:21:32 +03:00

78 lines
1.8 KiB
Go

package app
import (
"encoding/base64"
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
"github.com/golang-jwt/jwt/v5"
)
func encodeURL(user User) string {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": user.ID, "name": user.Username, "pass": user.Password, "iat": time.Now().Unix(),
})
tokenString, err := token.SignedString([]byte(os.Getenv("JWT_SECRET")))
if err != nil {
return ""
}
tokenString = base64.RawURLEncoding.EncodeToString([]byte(tokenString))
return tokenString
}
func decodeURL(tokenString string) (User, error) {
var zero User
tokenBytes, err := base64.RawURLEncoding.DecodeString(tokenString)
if err != nil {
return zero, err
}
token, err := jwt.Parse(string(tokenBytes), func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return []byte(os.Getenv("JWT_SECRET")), nil
})
if err != nil {
return zero, err
}
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
id := int(claims["id"].(float64))
name := claims["name"].(string)
pass := claims["pass"].(string)
return User{ID: id, Username: name, Password: pass}, nil
}
return zero, nil
}
var ip string
func LoadIP() string {
res, err := http.Get("https://api.ipify.org")
if err != nil {
panic(err)
}
defer res.Body.Close()
data, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}
ip = string(data)
return ip
}
func formatConfigName(format string, user User) string {
s := strings.ReplaceAll(format, "{username}", user.Username)
s = strings.ReplaceAll(s, "{host}", ip)
return s
}
func Ptr[T any](t T) *T { return &t }
func Val[T any](t *T, def T) T {
if t == nil {
return def
}
return *t
}