accounts/api/user_agents.go

109 lines
2.6 KiB
Go

package api
import (
"net/http"
"net/url"
"strconv"
"time"
"github.com/gin-gonic/gin"
"account/internal/auth"
)
type vlessNode struct {
Name string `json:"name"`
Address string `json:"address"`
Port int `json:"port,omitempty"`
Users []string `json:"users,omitempty"`
Transport string `json:"transport,omitempty"`
Path string `json:"path,omitempty"`
Mode string `json:"mode,omitempty"`
Security string `json:"security,omitempty"`
Flow string `json:"flow,omitempty"`
}
func (h *handler) listAgentNodes(c *gin.Context) {
// For now, valid nodes are derived from the server's public URL.
// We currently assume the server itself exposes a VLESS/XHTTP endpoint.
// In the future, we might retrieve this from the agent registry if agents report their public IPs.
// Get current user ID to use as VLESS UUID
userID := auth.GetUserID(c)
if userID == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"})
return
}
user, err := h.store.GetUserByID(c.Request.Context(), userID)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to fetch user"})
return
}
if !user.Active {
c.JSON(http.StatusForbidden, gin.H{
"error": "account_paused",
"message": "account is paused",
})
return
}
proxyUUID := user.ProxyUUID
if proxyUUID == "" {
proxyUUID = user.ID
}
if user.ProxyUUIDExpiresAt != nil && time.Now().UTC().After(*user.ProxyUUIDExpiresAt) {
c.JSON(http.StatusForbidden, gin.H{
"error": "proxy_uuid_expired",
"message": "proxy access has expired, please renew",
})
return
}
users := []string{proxyUUID}
nodes := make([]vlessNode, 0)
if h.publicURL != "" {
u, err := url.Parse(h.publicURL)
if err == nil {
hostname := u.Hostname()
portStr := u.Port()
port := 443
if portStr != "" {
if p, err := strconv.Atoi(portStr); err == nil {
port = p
}
} else if u.Scheme == "http" {
port = 80
}
// Add "Global Acceleration (XHTTP)" node
nodes = append(nodes, vlessNode{
Name: "Global Acceleration (XHTTP)",
Address: hostname,
Port: port, // Default port, client will adjust based on transport if needed
Users: users,
Transport: "xhttp",
Path: "/split",
Security: "tls",
Mode: "auto",
})
// Add "Global Acceleration (TCP)" node
nodes = append(nodes, vlessNode{
Name: "Global Acceleration (TCP)",
Address: hostname,
Port: 1443, // Fixed TCP port from template_tcp.json
Users: users,
Transport: "tcp",
Security: "tls",
Flow: "xtls-rprx-vision",
})
}
}
c.JSON(http.StatusOK, nodes)
}