memory.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. package dataprovider
  2. import (
  3. "crypto/x509"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "sort"
  9. "sync"
  10. "time"
  11. "github.com/drakkan/sftpgo/logger"
  12. "github.com/drakkan/sftpgo/utils"
  13. "github.com/drakkan/sftpgo/vfs"
  14. )
  15. var (
  16. errMemoryProviderClosed = errors.New("memory provider is closed")
  17. )
  18. type memoryProviderHandle struct {
  19. // configuration file to use for loading users
  20. configFile string
  21. sync.Mutex
  22. isClosed bool
  23. // slice with ordered usernames
  24. usernames []string
  25. // map for users, username is the key
  26. users map[string]User
  27. // map for virtual folders, folder name is the key
  28. vfolders map[string]vfs.BaseVirtualFolder
  29. // slice with ordered folder names
  30. vfoldersNames []string
  31. // map for admins, username is the key
  32. admins map[string]Admin
  33. // slice with ordered admins
  34. adminsUsernames []string
  35. }
  36. // MemoryProvider auth provider for a memory store
  37. type MemoryProvider struct {
  38. dbHandle *memoryProviderHandle
  39. }
  40. func initializeMemoryProvider(basePath string) {
  41. logSender = fmt.Sprintf("dataprovider_%v", MemoryDataProviderName)
  42. configFile := ""
  43. if utils.IsFileInputValid(config.Name) {
  44. configFile = config.Name
  45. if !filepath.IsAbs(configFile) {
  46. configFile = filepath.Join(basePath, configFile)
  47. }
  48. }
  49. provider = &MemoryProvider{
  50. dbHandle: &memoryProviderHandle{
  51. isClosed: false,
  52. usernames: []string{},
  53. users: make(map[string]User),
  54. vfolders: make(map[string]vfs.BaseVirtualFolder),
  55. vfoldersNames: []string{},
  56. admins: make(map[string]Admin),
  57. adminsUsernames: []string{},
  58. configFile: configFile,
  59. },
  60. }
  61. if err := provider.reloadConfig(); err != nil {
  62. logger.Error(logSender, "", "unable to load initial data: %v", err)
  63. logger.ErrorToConsole("unable to load initial data: %v", err)
  64. }
  65. }
  66. func (p *MemoryProvider) checkAvailability() error {
  67. p.dbHandle.Lock()
  68. defer p.dbHandle.Unlock()
  69. if p.dbHandle.isClosed {
  70. return errMemoryProviderClosed
  71. }
  72. return nil
  73. }
  74. func (p *MemoryProvider) close() error {
  75. p.dbHandle.Lock()
  76. defer p.dbHandle.Unlock()
  77. if p.dbHandle.isClosed {
  78. return errMemoryProviderClosed
  79. }
  80. p.dbHandle.isClosed = true
  81. return nil
  82. }
  83. func (p *MemoryProvider) validateUserAndTLSCert(username, protocol string, tlsCert *x509.Certificate) (User, error) {
  84. var user User
  85. if tlsCert == nil {
  86. return user, errors.New("TLS certificate cannot be null or empty")
  87. }
  88. user, err := p.userExists(username)
  89. if err != nil {
  90. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  91. return user, err
  92. }
  93. return checkUserAndTLSCertificate(&user, protocol, tlsCert)
  94. }
  95. func (p *MemoryProvider) validateUserAndPass(username, password, ip, protocol string) (User, error) {
  96. var user User
  97. if password == "" {
  98. return user, errors.New("Credentials cannot be null or empty")
  99. }
  100. user, err := p.userExists(username)
  101. if err != nil {
  102. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  103. return user, err
  104. }
  105. return checkUserAndPass(&user, password, ip, protocol)
  106. }
  107. func (p *MemoryProvider) validateUserAndPubKey(username string, pubKey []byte) (User, string, error) {
  108. var user User
  109. if len(pubKey) == 0 {
  110. return user, "", errors.New("Credentials cannot be null or empty")
  111. }
  112. user, err := p.userExists(username)
  113. if err != nil {
  114. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  115. return user, "", err
  116. }
  117. return checkUserAndPubKey(&user, pubKey)
  118. }
  119. func (p *MemoryProvider) validateAdminAndPass(username, password, ip string) (Admin, error) {
  120. admin, err := p.adminExists(username)
  121. if err != nil {
  122. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  123. return admin, err
  124. }
  125. err = admin.checkUserAndPass(password, ip)
  126. return admin, err
  127. }
  128. func (p *MemoryProvider) updateLastLogin(username string) error {
  129. p.dbHandle.Lock()
  130. defer p.dbHandle.Unlock()
  131. if p.dbHandle.isClosed {
  132. return errMemoryProviderClosed
  133. }
  134. user, err := p.userExistsInternal(username)
  135. if err != nil {
  136. return err
  137. }
  138. user.LastLogin = utils.GetTimeAsMsSinceEpoch(time.Now())
  139. p.dbHandle.users[user.Username] = user
  140. return nil
  141. }
  142. func (p *MemoryProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  143. p.dbHandle.Lock()
  144. defer p.dbHandle.Unlock()
  145. if p.dbHandle.isClosed {
  146. return errMemoryProviderClosed
  147. }
  148. user, err := p.userExistsInternal(username)
  149. if err != nil {
  150. providerLog(logger.LevelWarn, "unable to update quota for user %#v error: %v", username, err)
  151. return err
  152. }
  153. if reset {
  154. user.UsedQuotaSize = sizeAdd
  155. user.UsedQuotaFiles = filesAdd
  156. } else {
  157. user.UsedQuotaSize += sizeAdd
  158. user.UsedQuotaFiles += filesAdd
  159. }
  160. user.LastQuotaUpdate = utils.GetTimeAsMsSinceEpoch(time.Now())
  161. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  162. username, filesAdd, sizeAdd, reset)
  163. p.dbHandle.users[user.Username] = user
  164. return nil
  165. }
  166. func (p *MemoryProvider) getUsedQuota(username string) (int, int64, error) {
  167. p.dbHandle.Lock()
  168. defer p.dbHandle.Unlock()
  169. if p.dbHandle.isClosed {
  170. return 0, 0, errMemoryProviderClosed
  171. }
  172. user, err := p.userExistsInternal(username)
  173. if err != nil {
  174. providerLog(logger.LevelWarn, "unable to get quota for user %#v error: %v", username, err)
  175. return 0, 0, err
  176. }
  177. return user.UsedQuotaFiles, user.UsedQuotaSize, err
  178. }
  179. func (p *MemoryProvider) addUser(user *User) error {
  180. // we can query virtual folder while validating a user
  181. // so we have to check without holding the lock
  182. err := ValidateUser(user)
  183. if err != nil {
  184. return err
  185. }
  186. p.dbHandle.Lock()
  187. defer p.dbHandle.Unlock()
  188. if p.dbHandle.isClosed {
  189. return errMemoryProviderClosed
  190. }
  191. _, err = p.userExistsInternal(user.Username)
  192. if err == nil {
  193. return fmt.Errorf("username %#v already exists", user.Username)
  194. }
  195. user.ID = p.getNextID()
  196. user.LastQuotaUpdate = 0
  197. user.UsedQuotaSize = 0
  198. user.UsedQuotaFiles = 0
  199. user.LastLogin = 0
  200. user.VirtualFolders = p.joinVirtualFoldersFields(user)
  201. p.dbHandle.users[user.Username] = user.getACopy()
  202. p.dbHandle.usernames = append(p.dbHandle.usernames, user.Username)
  203. sort.Strings(p.dbHandle.usernames)
  204. return nil
  205. }
  206. func (p *MemoryProvider) updateUser(user *User) error {
  207. // we can query virtual folder while validating a user
  208. // so we have to check without holding the lock
  209. err := ValidateUser(user)
  210. if err != nil {
  211. return err
  212. }
  213. p.dbHandle.Lock()
  214. defer p.dbHandle.Unlock()
  215. if p.dbHandle.isClosed {
  216. return errMemoryProviderClosed
  217. }
  218. u, err := p.userExistsInternal(user.Username)
  219. if err != nil {
  220. return err
  221. }
  222. for _, oldFolder := range u.VirtualFolders {
  223. p.removeUserFromFolderMapping(oldFolder.Name, u.Username)
  224. }
  225. user.VirtualFolders = p.joinVirtualFoldersFields(user)
  226. user.LastQuotaUpdate = u.LastQuotaUpdate
  227. user.UsedQuotaSize = u.UsedQuotaSize
  228. user.UsedQuotaFiles = u.UsedQuotaFiles
  229. user.LastLogin = u.LastLogin
  230. user.ID = u.ID
  231. // pre-login and external auth hook will use the passed *user so save a copy
  232. p.dbHandle.users[user.Username] = user.getACopy()
  233. return nil
  234. }
  235. func (p *MemoryProvider) deleteUser(user *User) error {
  236. p.dbHandle.Lock()
  237. defer p.dbHandle.Unlock()
  238. if p.dbHandle.isClosed {
  239. return errMemoryProviderClosed
  240. }
  241. u, err := p.userExistsInternal(user.Username)
  242. if err != nil {
  243. return err
  244. }
  245. for _, oldFolder := range u.VirtualFolders {
  246. p.removeUserFromFolderMapping(oldFolder.Name, u.Username)
  247. }
  248. delete(p.dbHandle.users, user.Username)
  249. // this could be more efficient
  250. p.dbHandle.usernames = make([]string, 0, len(p.dbHandle.users))
  251. for username := range p.dbHandle.users {
  252. p.dbHandle.usernames = append(p.dbHandle.usernames, username)
  253. }
  254. sort.Strings(p.dbHandle.usernames)
  255. return nil
  256. }
  257. func (p *MemoryProvider) dumpUsers() ([]User, error) {
  258. p.dbHandle.Lock()
  259. defer p.dbHandle.Unlock()
  260. users := make([]User, 0, len(p.dbHandle.usernames))
  261. var err error
  262. if p.dbHandle.isClosed {
  263. return users, errMemoryProviderClosed
  264. }
  265. for _, username := range p.dbHandle.usernames {
  266. u := p.dbHandle.users[username]
  267. user := u.getACopy()
  268. err = addCredentialsToUser(&user)
  269. if err != nil {
  270. return users, err
  271. }
  272. users = append(users, user)
  273. }
  274. return users, err
  275. }
  276. func (p *MemoryProvider) dumpFolders() ([]vfs.BaseVirtualFolder, error) {
  277. p.dbHandle.Lock()
  278. defer p.dbHandle.Unlock()
  279. folders := make([]vfs.BaseVirtualFolder, 0, len(p.dbHandle.vfoldersNames))
  280. if p.dbHandle.isClosed {
  281. return folders, errMemoryProviderClosed
  282. }
  283. for _, f := range p.dbHandle.vfolders {
  284. folders = append(folders, f)
  285. }
  286. return folders, nil
  287. }
  288. func (p *MemoryProvider) getUsers(limit int, offset int, order string) ([]User, error) {
  289. users := make([]User, 0, limit)
  290. var err error
  291. p.dbHandle.Lock()
  292. defer p.dbHandle.Unlock()
  293. if p.dbHandle.isClosed {
  294. return users, errMemoryProviderClosed
  295. }
  296. if limit <= 0 {
  297. return users, err
  298. }
  299. itNum := 0
  300. if order == OrderASC {
  301. for _, username := range p.dbHandle.usernames {
  302. itNum++
  303. if itNum <= offset {
  304. continue
  305. }
  306. u := p.dbHandle.users[username]
  307. user := u.getACopy()
  308. user.HideConfidentialData()
  309. users = append(users, user)
  310. if len(users) >= limit {
  311. break
  312. }
  313. }
  314. } else {
  315. for i := len(p.dbHandle.usernames) - 1; i >= 0; i-- {
  316. itNum++
  317. if itNum <= offset {
  318. continue
  319. }
  320. username := p.dbHandle.usernames[i]
  321. u := p.dbHandle.users[username]
  322. user := u.getACopy()
  323. user.HideConfidentialData()
  324. users = append(users, user)
  325. if len(users) >= limit {
  326. break
  327. }
  328. }
  329. }
  330. return users, err
  331. }
  332. func (p *MemoryProvider) userExists(username string) (User, error) {
  333. p.dbHandle.Lock()
  334. defer p.dbHandle.Unlock()
  335. if p.dbHandle.isClosed {
  336. return User{}, errMemoryProviderClosed
  337. }
  338. return p.userExistsInternal(username)
  339. }
  340. func (p *MemoryProvider) userExistsInternal(username string) (User, error) {
  341. if val, ok := p.dbHandle.users[username]; ok {
  342. return val.getACopy(), nil
  343. }
  344. return User{}, &RecordNotFoundError{err: fmt.Sprintf("username %#v does not exist", username)}
  345. }
  346. func (p *MemoryProvider) addAdmin(admin *Admin) error {
  347. p.dbHandle.Lock()
  348. defer p.dbHandle.Unlock()
  349. if p.dbHandle.isClosed {
  350. return errMemoryProviderClosed
  351. }
  352. err := admin.validate()
  353. if err != nil {
  354. return err
  355. }
  356. _, err = p.adminExistsInternal(admin.Username)
  357. if err == nil {
  358. return fmt.Errorf("admin %#v already exists", admin.Username)
  359. }
  360. admin.ID = p.getNextAdminID()
  361. p.dbHandle.admins[admin.Username] = admin.getACopy()
  362. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, admin.Username)
  363. sort.Strings(p.dbHandle.adminsUsernames)
  364. return nil
  365. }
  366. func (p *MemoryProvider) updateAdmin(admin *Admin) error {
  367. p.dbHandle.Lock()
  368. defer p.dbHandle.Unlock()
  369. if p.dbHandle.isClosed {
  370. return errMemoryProviderClosed
  371. }
  372. err := admin.validate()
  373. if err != nil {
  374. return err
  375. }
  376. a, err := p.adminExistsInternal(admin.Username)
  377. if err != nil {
  378. return err
  379. }
  380. admin.ID = a.ID
  381. p.dbHandle.admins[admin.Username] = admin.getACopy()
  382. return nil
  383. }
  384. func (p *MemoryProvider) deleteAdmin(admin *Admin) error {
  385. p.dbHandle.Lock()
  386. defer p.dbHandle.Unlock()
  387. if p.dbHandle.isClosed {
  388. return errMemoryProviderClosed
  389. }
  390. _, err := p.adminExistsInternal(admin.Username)
  391. if err != nil {
  392. return err
  393. }
  394. delete(p.dbHandle.admins, admin.Username)
  395. // this could be more efficient
  396. p.dbHandle.adminsUsernames = make([]string, 0, len(p.dbHandle.admins))
  397. for username := range p.dbHandle.admins {
  398. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, username)
  399. }
  400. sort.Strings(p.dbHandle.adminsUsernames)
  401. return nil
  402. }
  403. func (p *MemoryProvider) adminExists(username string) (Admin, error) {
  404. p.dbHandle.Lock()
  405. defer p.dbHandle.Unlock()
  406. if p.dbHandle.isClosed {
  407. return Admin{}, errMemoryProviderClosed
  408. }
  409. return p.adminExistsInternal(username)
  410. }
  411. func (p *MemoryProvider) adminExistsInternal(username string) (Admin, error) {
  412. if val, ok := p.dbHandle.admins[username]; ok {
  413. return val.getACopy(), nil
  414. }
  415. return Admin{}, &RecordNotFoundError{err: fmt.Sprintf("admin %#v does not exist", username)}
  416. }
  417. func (p *MemoryProvider) dumpAdmins() ([]Admin, error) {
  418. p.dbHandle.Lock()
  419. defer p.dbHandle.Unlock()
  420. admins := make([]Admin, 0, len(p.dbHandle.admins))
  421. if p.dbHandle.isClosed {
  422. return admins, errMemoryProviderClosed
  423. }
  424. for _, admin := range p.dbHandle.admins {
  425. admins = append(admins, admin)
  426. }
  427. return admins, nil
  428. }
  429. func (p *MemoryProvider) getAdmins(limit int, offset int, order string) ([]Admin, error) {
  430. admins := make([]Admin, 0, limit)
  431. p.dbHandle.Lock()
  432. defer p.dbHandle.Unlock()
  433. if p.dbHandle.isClosed {
  434. return admins, errMemoryProviderClosed
  435. }
  436. if limit <= 0 {
  437. return admins, nil
  438. }
  439. itNum := 0
  440. if order == OrderASC {
  441. for _, username := range p.dbHandle.adminsUsernames {
  442. itNum++
  443. if itNum <= offset {
  444. continue
  445. }
  446. a := p.dbHandle.admins[username]
  447. admin := a.getACopy()
  448. admin.HideConfidentialData()
  449. admins = append(admins, admin)
  450. if len(admins) >= limit {
  451. break
  452. }
  453. }
  454. } else {
  455. for i := len(p.dbHandle.adminsUsernames) - 1; i >= 0; i-- {
  456. itNum++
  457. if itNum <= offset {
  458. continue
  459. }
  460. username := p.dbHandle.adminsUsernames[i]
  461. a := p.dbHandle.admins[username]
  462. admin := a.getACopy()
  463. admin.HideConfidentialData()
  464. admins = append(admins, admin)
  465. if len(admins) >= limit {
  466. break
  467. }
  468. }
  469. }
  470. return admins, nil
  471. }
  472. func (p *MemoryProvider) updateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool) error {
  473. p.dbHandle.Lock()
  474. defer p.dbHandle.Unlock()
  475. if p.dbHandle.isClosed {
  476. return errMemoryProviderClosed
  477. }
  478. folder, err := p.folderExistsInternal(name)
  479. if err != nil {
  480. providerLog(logger.LevelWarn, "unable to update quota for folder %#v error: %v", name, err)
  481. return err
  482. }
  483. if reset {
  484. folder.UsedQuotaSize = sizeAdd
  485. folder.UsedQuotaFiles = filesAdd
  486. } else {
  487. folder.UsedQuotaSize += sizeAdd
  488. folder.UsedQuotaFiles += filesAdd
  489. }
  490. folder.LastQuotaUpdate = utils.GetTimeAsMsSinceEpoch(time.Now())
  491. p.dbHandle.vfolders[name] = folder
  492. return nil
  493. }
  494. func (p *MemoryProvider) getUsedFolderQuota(name string) (int, int64, error) {
  495. p.dbHandle.Lock()
  496. defer p.dbHandle.Unlock()
  497. if p.dbHandle.isClosed {
  498. return 0, 0, errMemoryProviderClosed
  499. }
  500. folder, err := p.folderExistsInternal(name)
  501. if err != nil {
  502. providerLog(logger.LevelWarn, "unable to get quota for folder %#v error: %v", name, err)
  503. return 0, 0, err
  504. }
  505. return folder.UsedQuotaFiles, folder.UsedQuotaSize, err
  506. }
  507. func (p *MemoryProvider) joinVirtualFoldersFields(user *User) []vfs.VirtualFolder {
  508. var folders []vfs.VirtualFolder
  509. for _, folder := range user.VirtualFolders {
  510. f, err := p.addOrGetFolderInternal(folder.Name, folder.MappedPath, user.Username)
  511. if err == nil {
  512. folder.UsedQuotaFiles = f.UsedQuotaFiles
  513. folder.UsedQuotaSize = f.UsedQuotaSize
  514. folder.LastQuotaUpdate = f.LastQuotaUpdate
  515. folder.ID = f.ID
  516. folder.MappedPath = f.MappedPath
  517. folders = append(folders, folder)
  518. }
  519. }
  520. return folders
  521. }
  522. func (p *MemoryProvider) removeUserFromFolderMapping(folderName, username string) {
  523. folder, err := p.folderExistsInternal(folderName)
  524. if err == nil {
  525. var usernames []string
  526. for _, user := range folder.Users {
  527. if user != username {
  528. usernames = append(usernames, user)
  529. }
  530. }
  531. folder.Users = usernames
  532. p.dbHandle.vfolders[folder.Name] = folder
  533. }
  534. }
  535. func (p *MemoryProvider) updateFoldersMappingInternal(folder vfs.BaseVirtualFolder) {
  536. p.dbHandle.vfolders[folder.Name] = folder
  537. if !utils.IsStringInSlice(folder.Name, p.dbHandle.vfoldersNames) {
  538. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  539. sort.Strings(p.dbHandle.vfoldersNames)
  540. }
  541. }
  542. func (p *MemoryProvider) addOrGetFolderInternal(folderName, folderMappedPath, username string) (vfs.BaseVirtualFolder, error) {
  543. folder, err := p.folderExistsInternal(folderName)
  544. if _, ok := err.(*RecordNotFoundError); ok {
  545. folder := vfs.BaseVirtualFolder{
  546. ID: p.getNextFolderID(),
  547. Name: folderName,
  548. MappedPath: folderMappedPath,
  549. UsedQuotaSize: 0,
  550. UsedQuotaFiles: 0,
  551. LastQuotaUpdate: 0,
  552. Users: []string{username},
  553. }
  554. p.updateFoldersMappingInternal(folder)
  555. return folder, nil
  556. }
  557. if err == nil && !utils.IsStringInSlice(username, folder.Users) {
  558. folder.Users = append(folder.Users, username)
  559. p.updateFoldersMappingInternal(folder)
  560. }
  561. return folder, err
  562. }
  563. func (p *MemoryProvider) folderExistsInternal(name string) (vfs.BaseVirtualFolder, error) {
  564. if val, ok := p.dbHandle.vfolders[name]; ok {
  565. return val, nil
  566. }
  567. return vfs.BaseVirtualFolder{}, &RecordNotFoundError{err: fmt.Sprintf("folder %#v does not exist", name)}
  568. }
  569. func (p *MemoryProvider) getFolders(limit, offset int, order string) ([]vfs.BaseVirtualFolder, error) {
  570. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  571. var err error
  572. p.dbHandle.Lock()
  573. defer p.dbHandle.Unlock()
  574. if p.dbHandle.isClosed {
  575. return folders, errMemoryProviderClosed
  576. }
  577. if limit <= 0 {
  578. return folders, err
  579. }
  580. itNum := 0
  581. if order == OrderASC {
  582. for _, name := range p.dbHandle.vfoldersNames {
  583. itNum++
  584. if itNum <= offset {
  585. continue
  586. }
  587. folder := p.dbHandle.vfolders[name]
  588. folders = append(folders, folder)
  589. if len(folders) >= limit {
  590. break
  591. }
  592. }
  593. } else {
  594. for i := len(p.dbHandle.vfoldersNames) - 1; i >= 0; i-- {
  595. itNum++
  596. if itNum <= offset {
  597. continue
  598. }
  599. name := p.dbHandle.vfoldersNames[i]
  600. folder := p.dbHandle.vfolders[name]
  601. folders = append(folders, folder)
  602. if len(folders) >= limit {
  603. break
  604. }
  605. }
  606. }
  607. return folders, err
  608. }
  609. func (p *MemoryProvider) getFolderByName(name string) (vfs.BaseVirtualFolder, error) {
  610. p.dbHandle.Lock()
  611. defer p.dbHandle.Unlock()
  612. if p.dbHandle.isClosed {
  613. return vfs.BaseVirtualFolder{}, errMemoryProviderClosed
  614. }
  615. return p.folderExistsInternal(name)
  616. }
  617. func (p *MemoryProvider) addFolder(folder *vfs.BaseVirtualFolder) error {
  618. err := ValidateFolder(folder)
  619. if err != nil {
  620. return err
  621. }
  622. p.dbHandle.Lock()
  623. defer p.dbHandle.Unlock()
  624. if p.dbHandle.isClosed {
  625. return errMemoryProviderClosed
  626. }
  627. _, err = p.folderExistsInternal(folder.Name)
  628. if err == nil {
  629. return fmt.Errorf("folder %#v already exists", folder.Name)
  630. }
  631. folder.ID = p.getNextFolderID()
  632. folder.Users = nil
  633. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  634. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  635. sort.Strings(p.dbHandle.vfoldersNames)
  636. return nil
  637. }
  638. func (p *MemoryProvider) updateFolder(folder *vfs.BaseVirtualFolder) error {
  639. err := ValidateFolder(folder)
  640. if err != nil {
  641. return err
  642. }
  643. p.dbHandle.Lock()
  644. defer p.dbHandle.Unlock()
  645. if p.dbHandle.isClosed {
  646. return errMemoryProviderClosed
  647. }
  648. f, err := p.folderExistsInternal(folder.Name)
  649. if err != nil {
  650. return err
  651. }
  652. folder.ID = f.ID
  653. folder.LastQuotaUpdate = f.LastQuotaUpdate
  654. folder.UsedQuotaFiles = f.UsedQuotaFiles
  655. folder.UsedQuotaSize = f.UsedQuotaSize
  656. folder.Users = f.Users
  657. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  658. return nil
  659. }
  660. func (p *MemoryProvider) deleteFolder(folder *vfs.BaseVirtualFolder) error {
  661. p.dbHandle.Lock()
  662. defer p.dbHandle.Unlock()
  663. if p.dbHandle.isClosed {
  664. return errMemoryProviderClosed
  665. }
  666. _, err := p.folderExistsInternal(folder.Name)
  667. if err != nil {
  668. return err
  669. }
  670. for _, username := range folder.Users {
  671. user, err := p.userExistsInternal(username)
  672. if err == nil {
  673. var folders []vfs.VirtualFolder
  674. for _, userFolder := range user.VirtualFolders {
  675. if folder.Name != userFolder.Name {
  676. folders = append(folders, userFolder)
  677. }
  678. }
  679. user.VirtualFolders = folders
  680. p.dbHandle.users[user.Username] = user
  681. }
  682. }
  683. delete(p.dbHandle.vfolders, folder.Name)
  684. p.dbHandle.vfoldersNames = []string{}
  685. for name := range p.dbHandle.vfolders {
  686. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, name)
  687. }
  688. sort.Strings(p.dbHandle.vfoldersNames)
  689. return nil
  690. }
  691. func (p *MemoryProvider) getNextID() int64 {
  692. nextID := int64(1)
  693. for _, v := range p.dbHandle.users {
  694. if v.ID >= nextID {
  695. nextID = v.ID + 1
  696. }
  697. }
  698. return nextID
  699. }
  700. func (p *MemoryProvider) getNextFolderID() int64 {
  701. nextID := int64(1)
  702. for _, v := range p.dbHandle.vfolders {
  703. if v.ID >= nextID {
  704. nextID = v.ID + 1
  705. }
  706. }
  707. return nextID
  708. }
  709. func (p *MemoryProvider) getNextAdminID() int64 {
  710. nextID := int64(1)
  711. for _, a := range p.dbHandle.admins {
  712. if a.ID >= nextID {
  713. nextID = a.ID + 1
  714. }
  715. }
  716. return nextID
  717. }
  718. func (p *MemoryProvider) clear() {
  719. p.dbHandle.Lock()
  720. defer p.dbHandle.Unlock()
  721. p.dbHandle.usernames = []string{}
  722. p.dbHandle.users = make(map[string]User)
  723. p.dbHandle.vfoldersNames = []string{}
  724. p.dbHandle.vfolders = make(map[string]vfs.BaseVirtualFolder)
  725. p.dbHandle.admins = make(map[string]Admin)
  726. p.dbHandle.adminsUsernames = []string{}
  727. }
  728. func (p *MemoryProvider) reloadConfig() error {
  729. if p.dbHandle.configFile == "" {
  730. providerLog(logger.LevelDebug, "no dump configuration file defined")
  731. return nil
  732. }
  733. providerLog(logger.LevelDebug, "loading dump from file: %#v", p.dbHandle.configFile)
  734. fi, err := os.Stat(p.dbHandle.configFile)
  735. if err != nil {
  736. providerLog(logger.LevelWarn, "error loading dump: %v", err)
  737. return err
  738. }
  739. if fi.Size() == 0 {
  740. err = errors.New("dump configuration file is invalid, its size must be > 0")
  741. providerLog(logger.LevelWarn, "error loading dump: %v", err)
  742. return err
  743. }
  744. if fi.Size() > 10485760 {
  745. err = errors.New("dump configuration file is invalid, its size must be <= 10485760 bytes")
  746. providerLog(logger.LevelWarn, "error loading dump: %v", err)
  747. return err
  748. }
  749. content, err := os.ReadFile(p.dbHandle.configFile)
  750. if err != nil {
  751. providerLog(logger.LevelWarn, "error loading dump: %v", err)
  752. return err
  753. }
  754. dump, err := ParseDumpData(content)
  755. if err != nil {
  756. providerLog(logger.LevelWarn, "error loading dump: %v", err)
  757. return err
  758. }
  759. p.clear()
  760. if err := p.restoreFolders(&dump); err != nil {
  761. return err
  762. }
  763. if err := p.restoreUsers(&dump); err != nil {
  764. return err
  765. }
  766. if err := p.restoreAdmins(&dump); err != nil {
  767. return err
  768. }
  769. providerLog(logger.LevelDebug, "config loaded from file: %#v", p.dbHandle.configFile)
  770. return nil
  771. }
  772. func (p *MemoryProvider) restoreAdmins(dump *BackupData) error {
  773. for _, admin := range dump.Admins {
  774. a, err := p.adminExists(admin.Username)
  775. admin := admin // pin
  776. if err == nil {
  777. admin.ID = a.ID
  778. err = p.updateAdmin(&admin)
  779. if err != nil {
  780. providerLog(logger.LevelWarn, "error updating admin %#v: %v", admin.Username, err)
  781. return err
  782. }
  783. } else {
  784. err = p.addAdmin(&admin)
  785. if err != nil {
  786. providerLog(logger.LevelWarn, "error adding admin %#v: %v", admin.Username, err)
  787. return err
  788. }
  789. }
  790. }
  791. return nil
  792. }
  793. func (p *MemoryProvider) restoreFolders(dump *BackupData) error {
  794. for _, folder := range dump.Folders {
  795. folder := folder // pin
  796. f, err := p.getFolderByName(folder.Name)
  797. if err == nil {
  798. folder.ID = f.ID
  799. err = p.updateFolder(&folder)
  800. if err != nil {
  801. providerLog(logger.LevelWarn, "error updating folder %#v: %v", folder.Name, err)
  802. return err
  803. }
  804. } else {
  805. folder.Users = nil
  806. err = p.addFolder(&folder)
  807. if err != nil {
  808. providerLog(logger.LevelWarn, "error adding folder %#v: %v", folder.Name, err)
  809. return err
  810. }
  811. }
  812. }
  813. return nil
  814. }
  815. func (p *MemoryProvider) restoreUsers(dump *BackupData) error {
  816. for _, user := range dump.Users {
  817. user := user // pin
  818. u, err := p.userExists(user.Username)
  819. if err == nil {
  820. user.ID = u.ID
  821. err = p.updateUser(&user)
  822. if err != nil {
  823. providerLog(logger.LevelWarn, "error updating user %#v: %v", user.Username, err)
  824. return err
  825. }
  826. } else {
  827. err = p.addUser(&user)
  828. if err != nil {
  829. providerLog(logger.LevelWarn, "error adding user %#v: %v", user.Username, err)
  830. return err
  831. }
  832. }
  833. }
  834. return nil
  835. }
  836. // initializeDatabase does nothing, no initilization is needed for memory provider
  837. func (p *MemoryProvider) initializeDatabase() error {
  838. return ErrNoInitRequired
  839. }
  840. func (p *MemoryProvider) migrateDatabase() error {
  841. return ErrNoInitRequired
  842. }
  843. func (p *MemoryProvider) revertDatabase(targetVersion int) error {
  844. return errors.New("memory provider does not store data, revert not possible")
  845. }