feat(sftp-server): do not generate host key until first enabled (#7734)
This commit is contained in:
parent
ed149be84b
commit
aa1082a56c
@ -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()
|
||||||
|
@ -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
|
|
||||||
|
@ -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() {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package ftp
|
package sftp
|
||||||
|
|
||||||
// From leffss/sftpd
|
// From leffss/sftpd
|
||||||
const (
|
const (
|
@ -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
|
||||||
}
|
}
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user