feat(sftp-server): do not generate host key until first enabled (#7734)

This commit is contained in:
KirCute_ECT 2024-12-30 22:54:37 +08:00 committed by GitHub
parent ed149be84b
commit aa1082a56c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 30 additions and 27 deletions

View File

@ -15,7 +15,6 @@ import (
func Init() { func Init() {
bootstrap.InitConfig() bootstrap.InitConfig()
bootstrap.Log() bootstrap.Log()
bootstrap.InitHostKey()
bootstrap.InitDB() bootstrap.InitDB()
data.InitData() data.InitData()
bootstrap.InitIndex() bootstrap.InitIndex()

View File

@ -1,7 +1,6 @@
package conf package conf
import ( import (
"golang.org/x/crypto/ssh"
"net/url" "net/url"
"regexp" "regexp"
) )
@ -33,5 +32,3 @@ var (
ManageHtml string ManageHtml string
IndexHtml string IndexHtml string
) )
var SSHSigners []ssh.Signer

View File

@ -9,6 +9,7 @@ import (
"github.com/alist-org/alist/v3/internal/setting" "github.com/alist-org/alist/v3/internal/setting"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/alist-org/alist/v3/pkg/utils"
"github.com/alist-org/alist/v3/server/ftp" "github.com/alist-org/alist/v3/server/ftp"
"github.com/alist-org/alist/v3/server/sftp"
"github.com/pkg/errors" "github.com/pkg/errors"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
"net/http" "net/http"
@ -21,6 +22,7 @@ type SftpDriver struct {
} }
func NewSftpDriver() (*SftpDriver, error) { func NewSftpDriver() (*SftpDriver, error) {
sftp.InitHostKey()
header := &http.Header{} header := &http.Header{}
header.Add("User-Agent", setting.GetStr(conf.FTPProxyUserAgent)) header.Add("User-Agent", setting.GetStr(conf.FTPProxyUserAgent))
return &SftpDriver{ return &SftpDriver{
@ -40,7 +42,7 @@ func (d *SftpDriver) GetConfig() *sftpd.Config {
AuthLogCallback: d.AuthLogCallback, AuthLogCallback: d.AuthLogCallback,
BannerCallback: d.GetBanner, BannerCallback: d.GetBanner,
} }
for _, k := range conf.SSHSigners { for _, k := range sftp.SSHSigners {
serverConfig.AddHostKey(k) serverConfig.AddHostKey(k)
} }
d.config = &sftpd.Config{ d.config = &sftpd.Config{
@ -62,7 +64,7 @@ func (d *SftpDriver) GetFileSystem(sc *ssh.ServerConn) (sftpd.FileSystem, error)
ctx = context.WithValue(ctx, "meta_pass", "") ctx = context.WithValue(ctx, "meta_pass", "")
ctx = context.WithValue(ctx, "client_ip", sc.RemoteAddr().String()) ctx = context.WithValue(ctx, "client_ip", sc.RemoteAddr().String())
ctx = context.WithValue(ctx, "proxy_header", d.proxyHeader) ctx = context.WithValue(ctx, "proxy_header", d.proxyHeader)
return &ftp.SftpDriverAdapter{FtpDriver: ftp.NewAferoAdapter(ctx)}, nil return &sftp.DriverAdapter{FtpDriver: ftp.NewAferoAdapter(ctx)}, nil
} }
func (d *SftpDriver) Close() { func (d *SftpDriver) Close() {

View File

@ -1,4 +1,4 @@
package ftp package sftp
// From leffss/sftpd // From leffss/sftpd
const ( const (

View File

@ -1,4 +1,4 @@
package bootstrap package sftp
import ( import (
"crypto/rand" "crypto/rand"
@ -7,14 +7,18 @@ import (
"encoding/pem" "encoding/pem"
"fmt" "fmt"
"github.com/alist-org/alist/v3/cmd/flags" "github.com/alist-org/alist/v3/cmd/flags"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/alist-org/alist/v3/pkg/utils"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
"os" "os"
"path/filepath" "path/filepath"
) )
var SSHSigners []ssh.Signer
func InitHostKey() { func InitHostKey() {
if SSHSigners != nil {
return
}
sshPath := filepath.Join(flags.DataDir, "ssh") sshPath := filepath.Join(flags.DataDir, "ssh")
if !utils.Exists(sshPath) { if !utils.Exists(sshPath) {
err := utils.CreateNestedDirectory(sshPath) err := utils.CreateNestedDirectory(sshPath)
@ -23,9 +27,9 @@ func InitHostKey() {
return return
} }
} }
conf.SSHSigners = make([]ssh.Signer, 0, 4) SSHSigners = make([]ssh.Signer, 0, 4)
if rsaKey, ok := LoadOrGenerateRSAHostKey(sshPath); ok { if rsaKey, ok := LoadOrGenerateRSAHostKey(sshPath); ok {
conf.SSHSigners = append(conf.SSHSigners, rsaKey) SSHSigners = append(SSHSigners, rsaKey)
} }
// TODO Add keys for other encryption algorithms // TODO Add keys for other encryption algorithms
} }

View File

@ -1,44 +1,45 @@
package ftp package sftp
import ( import (
"github.com/KirCute/sftpd-alist" "github.com/KirCute/sftpd-alist"
"github.com/alist-org/alist/v3/internal/errs" "github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/alist-org/alist/v3/pkg/utils"
"github.com/alist-org/alist/v3/server/ftp"
"os" "os"
) )
type SftpDriverAdapter struct { type DriverAdapter struct {
FtpDriver *AferoAdapter FtpDriver *ftp.AferoAdapter
} }
func (s *SftpDriverAdapter) OpenFile(_ string, _ uint32, _ *sftpd.Attr) (sftpd.File, error) { func (s *DriverAdapter) OpenFile(_ string, _ uint32, _ *sftpd.Attr) (sftpd.File, error) {
// See also GetHandle // See also GetHandle
return nil, errs.NotImplement return nil, errs.NotImplement
} }
func (s *SftpDriverAdapter) OpenDir(_ string) (sftpd.Dir, error) { func (s *DriverAdapter) OpenDir(_ string) (sftpd.Dir, error) {
// See also GetHandle // See also GetHandle
return nil, errs.NotImplement return nil, errs.NotImplement
} }
func (s *SftpDriverAdapter) Remove(name string) error { func (s *DriverAdapter) Remove(name string) error {
return s.FtpDriver.Remove(name) return s.FtpDriver.Remove(name)
} }
func (s *SftpDriverAdapter) Rename(old, new string, _ uint32) error { func (s *DriverAdapter) Rename(old, new string, _ uint32) error {
return s.FtpDriver.Rename(old, new) return s.FtpDriver.Rename(old, new)
} }
func (s *SftpDriverAdapter) Mkdir(name string, attr *sftpd.Attr) error { func (s *DriverAdapter) Mkdir(name string, attr *sftpd.Attr) error {
return s.FtpDriver.Mkdir(name, attr.Mode) return s.FtpDriver.Mkdir(name, attr.Mode)
} }
func (s *SftpDriverAdapter) Rmdir(name string) error { func (s *DriverAdapter) Rmdir(name string) error {
return s.Remove(name) return s.Remove(name)
} }
func (s *SftpDriverAdapter) Stat(name string, _ bool) (*sftpd.Attr, error) { func (s *DriverAdapter) Stat(name string, _ bool) (*sftpd.Attr, error) {
stat, err := s.FtpDriver.Stat(name) stat, err := s.FtpDriver.Stat(name)
if err != nil { if err != nil {
return nil, err return nil, err
@ -46,27 +47,27 @@ func (s *SftpDriverAdapter) Stat(name string, _ bool) (*sftpd.Attr, error) {
return fileInfoToSftpAttr(stat), nil return fileInfoToSftpAttr(stat), nil
} }
func (s *SftpDriverAdapter) SetStat(_ string, _ *sftpd.Attr) error { func (s *DriverAdapter) SetStat(_ string, _ *sftpd.Attr) error {
return errs.NotSupport return errs.NotSupport
} }
func (s *SftpDriverAdapter) ReadLink(_ string) (string, error) { func (s *DriverAdapter) ReadLink(_ string) (string, error) {
return "", errs.NotSupport return "", errs.NotSupport
} }
func (s *SftpDriverAdapter) CreateLink(_, _ string, _ uint32) error { func (s *DriverAdapter) CreateLink(_, _ string, _ uint32) error {
return errs.NotSupport return errs.NotSupport
} }
func (s *SftpDriverAdapter) RealPath(path string) (string, error) { func (s *DriverAdapter) RealPath(path string) (string, error) {
return utils.FixAndCleanPath(path), nil return utils.FixAndCleanPath(path), nil
} }
func (s *SftpDriverAdapter) GetHandle(name string, flags uint32, _ *sftpd.Attr, offset uint64) (sftpd.FileTransfer, error) { func (s *DriverAdapter) GetHandle(name string, flags uint32, _ *sftpd.Attr, offset uint64) (sftpd.FileTransfer, error) {
return s.FtpDriver.GetHandle(name, sftpFlagToOpenMode(flags), int64(offset)) return s.FtpDriver.GetHandle(name, sftpFlagToOpenMode(flags), int64(offset))
} }
func (s *SftpDriverAdapter) ReadDir(name string) ([]sftpd.NamedAttr, error) { func (s *DriverAdapter) ReadDir(name string) ([]sftpd.NamedAttr, error) {
dir, err := s.FtpDriver.ReadDir(name) dir, err := s.FtpDriver.ReadDir(name)
if err != nil { if err != nil {
return nil, err return nil, err