From 6e13923225afdc6c95b09996636919b67c96d62b Mon Sep 17 00:00:00 2001 From: KirCute <951206789@qq.com> Date: Thu, 27 Mar 2025 23:14:36 +0800 Subject: [PATCH] fix(sftp-server): postgre cannot store control characters (#8188 close #8186) --- internal/op/sshkey.go | 1 - server/handles/sshkey.go | 3 ++- server/sftp.go | 12 ++++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/internal/op/sshkey.go b/internal/op/sshkey.go index 6ed55658..139698e6 100644 --- a/internal/op/sshkey.go +++ b/internal/op/sshkey.go @@ -17,7 +17,6 @@ func CreateSSHPublicKey(k *model.SSHPublicKey) (error, bool) { if err != nil { return err, false } - k.KeyStr = string(pubKey.Marshal()) k.Fingerprint = ssh.FingerprintSHA256(pubKey) k.AddedTime = time.Now() k.LastUsedTime = k.AddedTime diff --git a/server/handles/sshkey.go b/server/handles/sshkey.go index c53b46f2..6f8d46b4 100644 --- a/server/handles/sshkey.go +++ b/server/handles/sshkey.go @@ -6,6 +6,7 @@ import ( "github.com/alist-org/alist/v3/server/common" "github.com/gin-gonic/gin" "strconv" + "strings" ) type SSHKeyAddReq struct { @@ -30,7 +31,7 @@ func AddMyPublicKey(c *gin.Context) { } key := &model.SSHPublicKey{ Title: req.Title, - KeyStr: req.Key, + KeyStr: strings.TrimSpace(req.Key), UserId: userObj.ID, } err, parsed := op.CreateSSHPublicKey(key) diff --git a/server/sftp.go b/server/sftp.go index 0455c962..42c676e8 100644 --- a/server/sftp.go +++ b/server/sftp.go @@ -113,11 +113,15 @@ func (d *SftpDriver) PublicKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s } marshal := string(key.Marshal()) for _, sk := range keys { - if marshal == sk.KeyStr { - sk.LastUsedTime = time.Now() - _ = op.UpdateSSHPublicKey(&sk) - return nil, nil + if marshal != sk.KeyStr { + pubKey, _, _, _, e := ssh.ParseAuthorizedKey([]byte(sk.KeyStr)) + if e != nil || marshal != string(pubKey.Marshal()) { + continue + } } + sk.LastUsedTime = time.Now() + _ = op.UpdateSSHPublicKey(&sk) + return nil, nil } return nil, errors.New("public key refused") }