fix26: полный прод-фикс auth/jwt, import-export peer и frontend flow

This commit is contained in:
2026-05-09 01:18:13 +05:00
parent 7a64d76d08
commit c13841b61a
19 changed files with 390 additions and 90 deletions
+5
View File
@@ -8,6 +8,7 @@ import (
"hy2xs-admin/dao"
"hy2xs-admin/model/bo"
"hy2xs-admin/model/constant"
"hy2xs-admin/model/entity"
"hy2xs-admin/model/vo"
"hy2xs-admin/util"
)
@@ -96,3 +97,7 @@ func ChangeAdminPassword(c *gin.Context, oldPassword string, newPassword string)
})
}
func GetAdminForTokenValidation(id int64) (entity.AdminUser, error) {
return dao.GetAdminUser("id = ?", id)
}
+100 -23
View File
@@ -3,6 +3,7 @@ package service
import (
"errors"
"fmt"
"strings"
"github.com/skip2/go-qrcode"
"hy2xs-admin/dao"
@@ -36,7 +37,8 @@ func PagePeer(peerPageDto dto.PeerPageDto) ([]vo.PeerVo, int64, error) {
BannedUntil: int64Val(p.BannedUntil),
LastConnectionAt: int64Val(p.LastConnectionAt),
}
if v, ok := onlineUsers[item.AuthId]; ok {
authID := strVal(p.AuthId)
if v, ok := onlineUsers[authID]; ok {
item.Online = true
item.OnlineDevices = v
}
@@ -181,6 +183,7 @@ func ListExportPeer(includeSecrets bool) ([]bo.PeerExport, error) {
for _, item := range peers {
ex := bo.PeerExport{
Id: int64Val(item.Id),
AuthId: strVal(item.AuthId),
Name: strVal(item.Name),
Remark: strVal(item.Remark),
QuotaBytes: int64Val(item.QuotaBytes),
@@ -202,32 +205,106 @@ func ListExportPeer(includeSecrets bool) ([]bo.PeerExport, error) {
return out, nil
}
func UpsertPeerLegacy(accounts []entity.Account) error {
for _, account := range accounts {
if account.Id != nil && *account.Id > 0 {
upd := dto.PeerUpdateDto{}
upd.Name = account.Username
upd.Remark = account.Remark
upd.QuotaBytes = account.Quota
upd.ExpiresAt = account.ExpireTime
upd.MaxDevices = account.DeviceNo
upd.Disabled = account.Deleted
if err := UpdatePeer(*account.Id, upd); err != nil {
return err
func UpsertPeerExport(items []bo.PeerExport) error {
for _, item := range items {
name := strings.TrimSpace(item.Name)
if name == "" {
return errors.New(constant.InvalidError)
}
var existing entity.Peer
var err error
authID := strings.TrimSpace(item.AuthId)
if authID != "" {
existing, err = dao.GetPeer("auth_id = ?", authID)
}
if (err != nil || existing.Id == nil) && name != "" {
existing, err = dao.GetPeer("name = ?", name)
}
quota := item.QuotaBytes
expires := item.ExpiresAt
maxDevices := item.MaxDevices
if maxDevices <= 0 {
maxDevices = 3
}
disabled := item.Disabled
remark := item.Remark
if err == nil && existing.Id != nil {
updates := map[string]interface{}{
"name": name,
"remark": remark,
"quota_bytes": quota,
"download_bytes": item.DownloadBytes,
"upload_bytes": item.UploadBytes,
"expires_at": expires,
"max_devices": maxDevices,
"disabled": disabled,
"banned_until": item.BannedUntil,
"last_connection_at": item.LastConnectionAt,
}
if authID != "" {
updates["auth_id"] = authID
}
if strings.TrimSpace(item.Secret) != "" {
digest, derr := PeerSecretDigest(item.Secret)
if derr != nil {
return derr
}
enc, eerr := EncryptPeerSecret(item.Secret)
if eerr != nil {
return eerr
}
updates["secret_digest"] = digest
updates["secret_ciphertext"] = enc
}
if uerr := dao.UpdatePeer([]int64{*existing.Id}, updates); uerr != nil {
return uerr
}
continue
}
save := dto.PeerSaveDto{
Name: account.Username,
Secret: account.ConPass,
QuotaBytes: account.Quota,
ExpiresAt: account.ExpireTime,
MaxDevices: account.DeviceNo,
Disabled: account.Deleted,
Remark: account.Remark,
createSecret := strings.TrimSpace(item.Secret)
if createSecret == "" {
generated, gerr := util.RandomString(24)
if gerr != nil {
return gerr
}
createSecret = fmt.Sprintf("%s.%s", name, generated)
}
if _, err := CreatePeer(save); err != nil {
return err
secretDigest, derr := PeerSecretDigest(createSecret)
if derr != nil {
return derr
}
secretEncrypted, eerr := EncryptPeerSecret(createSecret)
if eerr != nil {
return eerr
}
if authID == "" {
authID, err = util.RandomString(18)
if err != nil {
return err
}
}
peer := entity.Peer{
Name: &name,
Remark: &remark,
AuthId: &authID,
SecretDigest: &secretDigest,
SecretEncrypted: &secretEncrypted,
QuotaBytes: &quota,
DownloadBytes: &item.DownloadBytes,
UploadBytes: &item.UploadBytes,
ExpiresAt: &expires,
MaxDevices: &maxDevices,
Disabled: &disabled,
BannedUntil: &item.BannedUntil,
LastConnectionAt: &item.LastConnectionAt,
}
if _, serr := dao.SavePeer(peer); serr != nil {
return serr
}
}
return nil