aboutsummaryrefslogtreecommitdiff
path: root/weed/sftpd/sftp_server.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/sftpd/sftp_server.go')
-rw-r--r--weed/sftpd/sftp_server.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/weed/sftpd/sftp_server.go b/weed/sftpd/sftp_server.go
new file mode 100644
index 000000000..be3af6fd1
--- /dev/null
+++ b/weed/sftpd/sftp_server.go
@@ -0,0 +1,59 @@
+// sftp_server.go
+package sftpd
+
+import (
+ "io"
+
+ "github.com/pkg/sftp"
+ "github.com/seaweedfs/seaweedfs/weed/pb"
+ "github.com/seaweedfs/seaweedfs/weed/sftpd/auth"
+ "github.com/seaweedfs/seaweedfs/weed/sftpd/user"
+ "google.golang.org/grpc"
+)
+
+type SftpServer struct {
+ filerAddr pb.ServerAddress
+ grpcDialOption grpc.DialOption
+ dataCenter string
+ filerGroup string
+ user *user.User
+ authManager *auth.Manager
+}
+
+// NewSftpServer constructs the server.
+func NewSftpServer(filerAddr pb.ServerAddress, grpcDialOption grpc.DialOption, dataCenter, filerGroup string, user *user.User) SftpServer {
+ // Create a file system helper for the auth manager
+ fsHelper := NewFileSystemHelper(filerAddr, grpcDialOption, dataCenter, filerGroup)
+
+ // Create an auth manager for permission checking
+ authManager := auth.NewManager(nil, fsHelper, []string{})
+
+ return SftpServer{
+ filerAddr: filerAddr,
+ grpcDialOption: grpcDialOption,
+ dataCenter: dataCenter,
+ filerGroup: filerGroup,
+ user: user,
+ authManager: authManager,
+ }
+}
+
+// Fileread is invoked for “get” requests.
+func (fs *SftpServer) Fileread(req *sftp.Request) (io.ReaderAt, error) {
+ return fs.readFile(req)
+}
+
+// Filewrite is invoked for “put” requests.
+func (fs *SftpServer) Filewrite(req *sftp.Request) (io.WriterAt, error) {
+ return fs.newFileWriter(req)
+}
+
+// Filecmd handles Remove, Rename, Mkdir, Rmdir, etc.
+func (fs *SftpServer) Filecmd(req *sftp.Request) error {
+ return fs.dispatchCmd(req)
+}
+
+// Filelist handles directory listings.
+func (fs *SftpServer) Filelist(req *sftp.Request) (sftp.ListerAt, error) {
+ return fs.listDir(req)
+}