Files
3m-ui/backend/internal/protocol/access_profile.go
T
風雪 6b3a09a09c update
update
update
update
update
update
update
update
update
update
update
update
2026-08-19 12:49:36 +08:00

55 lines
1.5 KiB
Go

package protocol
import (
"strings"
"github.com/kazeyukiro/3m-ui/backend/internal/database/models"
"gorm.io/gorm"
)
// AccessProfile is the public-facing endpoint used when generating share links / client YAML.
// Values are stored as panel settings keys with prefix "access_profile.".
type AccessProfile struct {
PublicHost string `json:"public_host"`
PublicPort string `json:"public_port"`
SNI string `json:"sni"`
ClientFingerprint string `json:"client_fingerprint"`
ALPN []string `json:"alpn"`
}
const (
KeyPublicHost = "access_profile.public_host"
KeyPublicPort = "access_profile.public_port"
KeySNI = "access_profile.sni"
KeyClientFingerprint = "access_profile.client_fingerprint"
KeyALPN = "access_profile.alpn"
)
func LoadAccessProfile(db *gorm.DB) AccessProfile {
ap := AccessProfile{ClientFingerprint: "chrome"}
if db == nil {
return ap
}
var rows []models.PanelSetting
_ = db.Where("key LIKE ?", "access_profile.%").Find(&rows).Error
m := map[string]string{}
for _, r := range rows {
m[r.Key] = r.Value
}
ap.PublicHost = strings.TrimSpace(m[KeyPublicHost])
ap.PublicPort = strings.TrimSpace(m[KeyPublicPort])
ap.SNI = strings.TrimSpace(m[KeySNI])
if v := strings.TrimSpace(m[KeyClientFingerprint]); v != "" {
ap.ClientFingerprint = v
}
if v := strings.TrimSpace(m[KeyALPN]); v != "" {
for _, p := range strings.Split(v, ",") {
p = strings.TrimSpace(p)
if p != "" {
ap.ALPN = append(ap.ALPN, p)
}
}
}
return ap
}