github.com/pkg/sftp@v1.13.6/request-interfaces.go (about)

     1  package sftp
     2  
     3  import (
     4  	"io"
     5  	"os"
     6  )
     7  
     8  // WriterAtReaderAt defines the interface to return when a file is to
     9  // be opened for reading and writing
    10  type WriterAtReaderAt interface {
    11  	io.WriterAt
    12  	io.ReaderAt
    13  }
    14  
    15  // Interfaces are differentiated based on required returned values.
    16  // All input arguments are to be pulled from Request (the only arg).
    17  
    18  // The Handler interfaces all take the Request object as its only argument.
    19  // All the data you should need to handle the call are in the Request object.
    20  // The request.Method attribute is initially the most important one as it
    21  // determines which Handler gets called.
    22  
    23  // FileReader should return an io.ReaderAt for the filepath
    24  // Note in cases of an error, the error text will be sent to the client.
    25  // Called for Methods: Get
    26  type FileReader interface {
    27  	Fileread(*Request) (io.ReaderAt, error)
    28  }
    29  
    30  // FileWriter should return an io.WriterAt for the filepath.
    31  //
    32  // The request server code will call Close() on the returned io.WriterAt
    33  // ojbect if an io.Closer type assertion succeeds.
    34  // Note in cases of an error, the error text will be sent to the client.
    35  // Note when receiving an Append flag it is important to not open files using
    36  // O_APPEND if you plan to use WriteAt, as they conflict.
    37  // Called for Methods: Put, Open
    38  type FileWriter interface {
    39  	Filewrite(*Request) (io.WriterAt, error)
    40  }
    41  
    42  // OpenFileWriter is a FileWriter that implements the generic OpenFile method.
    43  // You need to implement this optional interface if you want to be able
    44  // to read and write from/to the same handle.
    45  // Called for Methods: Open
    46  type OpenFileWriter interface {
    47  	FileWriter
    48  	OpenFile(*Request) (WriterAtReaderAt, error)
    49  }
    50  
    51  // FileCmder should return an error
    52  // Note in cases of an error, the error text will be sent to the client.
    53  // Called for Methods: Setstat, Rename, Rmdir, Mkdir, Link, Symlink, Remove
    54  type FileCmder interface {
    55  	Filecmd(*Request) error
    56  }
    57  
    58  // PosixRenameFileCmder is a FileCmder that implements the PosixRename method.
    59  // If this interface is implemented PosixRename requests will call it
    60  // otherwise they will be handled in the same way as Rename
    61  type PosixRenameFileCmder interface {
    62  	FileCmder
    63  	PosixRename(*Request) error
    64  }
    65  
    66  // StatVFSFileCmder is a FileCmder that implements the StatVFS method.
    67  // You need to implement this interface if you want to handle statvfs requests.
    68  // Please also be sure that the statvfs@openssh.com extension is enabled
    69  type StatVFSFileCmder interface {
    70  	FileCmder
    71  	StatVFS(*Request) (*StatVFS, error)
    72  }
    73  
    74  // FileLister should return an object that fulfils the ListerAt interface
    75  // Note in cases of an error, the error text will be sent to the client.
    76  // Called for Methods: List, Stat, Readlink
    77  //
    78  // Since Filelist returns an os.FileInfo, this can make it non-ideal for implementing Readlink.
    79  // This is because the Name receiver method defined by that interface defines that it should only return the base name.
    80  // However, Readlink is required to be capable of returning essentially any arbitrary valid path relative or absolute.
    81  // In order to implement this more expressive requirement, implement [ReadlinkFileLister] which will then be used instead.
    82  type FileLister interface {
    83  	Filelist(*Request) (ListerAt, error)
    84  }
    85  
    86  // LstatFileLister is a FileLister that implements the Lstat method.
    87  // If this interface is implemented Lstat requests will call it
    88  // otherwise they will be handled in the same way as Stat
    89  type LstatFileLister interface {
    90  	FileLister
    91  	Lstat(*Request) (ListerAt, error)
    92  }
    93  
    94  // RealPathFileLister is a FileLister that implements the Realpath method.
    95  // The built-in RealPath implementation does not resolve symbolic links.
    96  // By implementing this interface you can customize the returned path
    97  // and, for example, resolve symbolinc links if needed for your use case.
    98  // You have to return an absolute POSIX path.
    99  //
   100  // Up to v1.13.5 the signature for the RealPath method was:
   101  //
   102  // # RealPath(string) string
   103  //
   104  // we have added a legacyRealPathFileLister that implements the old method
   105  // to ensure that your code does not break.
   106  // You should use the new method signature to avoid future issues
   107  type RealPathFileLister interface {
   108  	FileLister
   109  	RealPath(string) (string, error)
   110  }
   111  
   112  // ReadlinkFileLister is a FileLister that implements the Readlink method.
   113  // By implementing the Readlink method, it is possible to return any arbitrary valid path relative or absolute.
   114  // This allows giving a better response than via the default FileLister (which is limited to os.FileInfo, whose Name method should only return the base name of a file)
   115  type ReadlinkFileLister interface {
   116  	FileLister
   117  	Readlink(string) (string, error)
   118  }
   119  
   120  // This interface is here for backward compatibility only
   121  type legacyRealPathFileLister interface {
   122  	FileLister
   123  	RealPath(string) string
   124  }
   125  
   126  // NameLookupFileLister is a FileLister that implmeents the LookupUsername and LookupGroupName methods.
   127  // If this interface is implemented, then longname ls formatting will use these to convert usernames and groupnames.
   128  type NameLookupFileLister interface {
   129  	FileLister
   130  	LookupUserName(string) string
   131  	LookupGroupName(string) string
   132  }
   133  
   134  // ListerAt does for file lists what io.ReaderAt does for files, i.e. a []os.FileInfo buffer is passed to the ListAt function
   135  // and the entries that are populated in the buffer will be passed to the client.
   136  //
   137  // ListAt should return the number of entries copied and an io.EOF error if at end of list.
   138  // This is testable by comparing how many you copied to how many could be copied (eg. n < len(ls) below).
   139  // The copy() builtin is best for the copying.
   140  //
   141  // Uid and gid information will on unix systems be retrieved from [os.FileInfo.Sys]
   142  // if this function returns a [syscall.Stat_t] when called on a populated entry.
   143  // Alternatively, if the entry implements [FileInfoUidGid], it will be used for uid and gid information.
   144  //
   145  // If a populated entry implements [FileInfoExtendedData], extended attributes will also be returned to the client.
   146  //
   147  // Note in cases of an error, the error text will be sent to the client.
   148  type ListerAt interface {
   149  	ListAt([]os.FileInfo, int64) (int, error)
   150  }
   151  
   152  // TransferError is an optional interface that readerAt and writerAt
   153  // can implement to be notified about the error causing Serve() to exit
   154  // with the request still open
   155  type TransferError interface {
   156  	TransferError(err error)
   157  }