drivers.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package ftp
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "log"
  6. "os"
  7. "time"
  8. ftp "github.com/fclairamb/ftpserverlib"
  9. )
  10. func (m mainDriver) GetSettings() (*ftp.Settings, error) {
  11. return &m.setting, nil
  12. }
  13. func (m mainDriver) ClientConnected(cc ftp.ClientContext) (string, error) {
  14. //log.Println("Client Connected: ", cc.ID(), cc.RemoteAddr())
  15. m.connectedUserList.Store(cc.ID(), "")
  16. return "arozos FTP Endpoint", nil
  17. }
  18. func (m mainDriver) ClientDisconnected(cc ftp.ClientContext) {
  19. //log.Println("Client Disconencted: ", cc.ID(), cc.RemoteAddr())
  20. ////Recalculate user quota if logged in
  21. val, ok := m.connectedUserList.Load(cc.ID())
  22. if ok {
  23. if val != "" {
  24. //Recalculate user storage quota
  25. if m.userHandler.GetAuthAgent().UserExists(val.(string)) {
  26. userinfo, err := m.userHandler.GetUserInfoFromUsername(val.(string))
  27. if err == nil {
  28. //Update the user storage quota
  29. userinfo.StorageQuota.CalculateQuotaUsage()
  30. log.Println("FTP storage quota updated: ", val.(string))
  31. }
  32. } else {
  33. //This user is being delete during his connection to FTP???
  34. }
  35. }
  36. m.connectedUserList.Delete(cc.ID())
  37. }
  38. }
  39. //Authenicate user using arozos authAgent
  40. func (m mainDriver) AuthUser(cc ftp.ClientContext, user string, pass string) (ftp.ClientDriver, error) {
  41. authAgent := m.userHandler.GetAuthAgent()
  42. if authAgent.ValidateUsernameAndPassword(user, pass) {
  43. //OK
  44. userinfo, _ := m.userHandler.GetUserInfoFromUsername(user)
  45. //Check user permission to access ftp endpoint
  46. db := m.userHandler.GetDatabase()
  47. allowedPgs := []string{}
  48. err := db.Read("ftp", "groups", &allowedPgs)
  49. if err != nil {
  50. allowedPgs = []string{}
  51. }
  52. accessOK := userinfo.UserIsInOneOfTheGroupOf(allowedPgs)
  53. if accessOK {
  54. //Check if the request is from a blacklisted ip range
  55. allowAccess, err := m.userHandler.GetAuthAgent().ValidateLoginIpAccess(cc.RemoteAddr().String())
  56. if !allowAccess {
  57. accessOK = false
  58. return nil, err
  59. }
  60. } else {
  61. //log the signin request
  62. m.userHandler.GetAuthAgent().Logger.LogAuthByRequestInfo(user, cc.RemoteAddr().String(), time.Now().Unix(), false, "ftp")
  63. //Disconnect this user as he is not in the group that is allowed to access ftp
  64. log.Println(userinfo.Username + " tries to access FTP endpoint with invalid permission settings.")
  65. return nil, errors.New("User " + userinfo.Username + " has no permission to access FTP endpoint")
  66. }
  67. //Create tmp buffer for this user
  68. tmpFolder := m.tmpFolder + "users/" + userinfo.Username + "/ftpbuf/"
  69. os.MkdirAll(tmpFolder, 0755)
  70. //Record username into connected user list
  71. m.connectedUserList.Store(cc.ID(), userinfo.Username)
  72. //log the signin request
  73. m.userHandler.GetAuthAgent().Logger.LogAuthByRequestInfo(userinfo.Username, cc.RemoteAddr().String(), time.Now().Unix(), true, "ftp")
  74. //Return the aofs object
  75. return aofs{
  76. userinfo: userinfo,
  77. tmpFolder: tmpFolder,
  78. }, nil
  79. } else {
  80. //log the signin request
  81. m.userHandler.GetAuthAgent().Logger.LogAuthByRequestInfo(user, cc.RemoteAddr().String(), time.Now().Unix(), false, "ftp")
  82. return nil, errors.New("Invalid username or password")
  83. }
  84. }
  85. func (m mainDriver) GetTLSConfig() (*tls.Config, error) {
  86. return nil, errors.New("Not Supported")
  87. }