fix26: полный прод-фикс auth/jwt, import-export peer и frontend flow
This commit is contained in:
+100
-23
@@ -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: "a,
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user