| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | package ftpimport (	"errors"	"log"	"strconv"	"strings"	"sync"	ftp "github.com/fclairamb/ftpserverlib"	"imuslab.com/arozos/mod/database"	"imuslab.com/arozos/mod/user")//Handler is the handler for the FTP server defined in arozostype Handler struct {	ServerName    string	Port          int	ServerRunning bool	UPNPEnabled   bool	userHandler   *user.UserHandler	server        *ftp.FtpServer}type mainDriver struct {	setting           ftp.Settings	userHandler       *user.UserHandler	tmpFolder         string	connectedUserList *sync.Map}//NewFTPHandler creates a new handler for FTP Server as a wrapper to the ftpserverlibfunc NewFTPHandler(userHandler *user.UserHandler, ServerName string, Port int, tmpFolder string, PassiveModeIP string) (*Handler, error) {	//Create table for ftp if it doesn't exists	db := userHandler.GetDatabase()	db.NewTable("ftp")	//Create a new FTP Server instance	server := ftp.NewFtpServer(&mainDriver{		setting: ftp.Settings{			ListenAddr: ":" + strconv.Itoa(Port),			PublicHost: strings.TrimSpace(PassiveModeIP),			PassiveTransferPortRange: &ftp.PortRange{				Start: Port + 1,				End:   Port + 2,			},		},		userHandler:       userHandler,		tmpFolder:         tmpFolder,		connectedUserList: &sync.Map{},	})	return &Handler{		ServerName:    ServerName,		Port:          Port,		ServerRunning: false,		userHandler:   userHandler,		UPNPEnabled:   false,		server:        server,	}, nil}//Update which usergroups can access the file system via ftp serverfunc UpdateAccessableGroups(database *database.Database, groups []string) {	database.Write("ftp", "groups", groups)	if len(groups) == 0 {		log.Println("Setting no group access to ftp server!")	}}//ListenAndServe Start Listen and Servefunc (f *Handler) Start() error {	if f.server != nil {		go func(f *Handler) {			log.Println("FTP Server Started, listening at: " + strconv.Itoa(f.Port))			f.server.ListenAndServe()		}(f)		f.ServerRunning = true		return nil	} else {		return errors.New("FTP server not initiated")	}}//Close the FTP Serverfunc (f *Handler) Close() {	if f.server != nil {		f.server.Stop()		f.ServerRunning = false	}}
 |