memory.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. package dataprovider
  2. import (
  3. "errors"
  4. "fmt"
  5. "io/ioutil"
  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. // mapping between ID and username
  26. usersIdx map[int64]string
  27. // map for users, username is the key
  28. users map[string]User
  29. // map for virtual folders, MappedPath is the key
  30. vfolders map[string]vfs.BaseVirtualFolder
  31. // slice with ordered folders mapped path
  32. vfoldersPaths []string
  33. }
  34. // MemoryProvider auth provider for a memory store
  35. type MemoryProvider struct {
  36. dbHandle *memoryProviderHandle
  37. }
  38. func initializeMemoryProvider(basePath string) {
  39. logSender = fmt.Sprintf("dataprovider_%v", MemoryDataProviderName)
  40. configFile := ""
  41. if utils.IsFileInputValid(config.Name) {
  42. configFile = config.Name
  43. if !filepath.IsAbs(configFile) {
  44. configFile = filepath.Join(basePath, configFile)
  45. }
  46. }
  47. provider = MemoryProvider{
  48. dbHandle: &memoryProviderHandle{
  49. isClosed: false,
  50. usernames: []string{},
  51. usersIdx: make(map[int64]string),
  52. users: make(map[string]User),
  53. vfolders: make(map[string]vfs.BaseVirtualFolder),
  54. vfoldersPaths: []string{},
  55. configFile: configFile,
  56. },
  57. }
  58. if err := provider.reloadConfig(); err != nil {
  59. logger.Error(logSender, "", "unable to load initial data: %v", err)
  60. logger.ErrorToConsole("unable to load initial data: %v", err)
  61. }
  62. }
  63. func (p MemoryProvider) checkAvailability() error {
  64. p.dbHandle.Lock()
  65. defer p.dbHandle.Unlock()
  66. if p.dbHandle.isClosed {
  67. return errMemoryProviderClosed
  68. }
  69. return nil
  70. }
  71. func (p MemoryProvider) close() error {
  72. p.dbHandle.Lock()
  73. defer p.dbHandle.Unlock()
  74. if p.dbHandle.isClosed {
  75. return errMemoryProviderClosed
  76. }
  77. p.dbHandle.isClosed = true
  78. return nil
  79. }
  80. func (p MemoryProvider) validateUserAndPass(username, password, ip, protocol string) (User, error) {
  81. var user User
  82. if len(password) == 0 {
  83. return user, errors.New("Credentials cannot be null or empty")
  84. }
  85. user, err := p.userExists(username)
  86. if err != nil {
  87. providerLog(logger.LevelWarn, "error authenticating user %#v, error: %v", username, err)
  88. return user, err
  89. }
  90. return checkUserAndPass(user, password, ip, protocol)
  91. }
  92. func (p MemoryProvider) validateUserAndPubKey(username string, pubKey []byte) (User, string, error) {
  93. var user User
  94. if len(pubKey) == 0 {
  95. return user, "", errors.New("Credentials cannot be null or empty")
  96. }
  97. user, err := p.userExists(username)
  98. if err != nil {
  99. providerLog(logger.LevelWarn, "error authenticating user %#v, error: %v", username, err)
  100. return user, "", err
  101. }
  102. return checkUserAndPubKey(user, pubKey)
  103. }
  104. func (p MemoryProvider) getUserByID(ID int64) (User, error) {
  105. p.dbHandle.Lock()
  106. defer p.dbHandle.Unlock()
  107. if p.dbHandle.isClosed {
  108. return User{}, errMemoryProviderClosed
  109. }
  110. if val, ok := p.dbHandle.usersIdx[ID]; ok {
  111. return p.userExistsInternal(val)
  112. }
  113. return User{}, &RecordNotFoundError{err: fmt.Sprintf("user with ID %v does not exist", ID)}
  114. }
  115. func (p MemoryProvider) updateLastLogin(username string) error {
  116. p.dbHandle.Lock()
  117. defer p.dbHandle.Unlock()
  118. if p.dbHandle.isClosed {
  119. return errMemoryProviderClosed
  120. }
  121. user, err := p.userExistsInternal(username)
  122. if err != nil {
  123. return err
  124. }
  125. user.LastLogin = utils.GetTimeAsMsSinceEpoch(time.Now())
  126. p.dbHandle.users[user.Username] = user
  127. return nil
  128. }
  129. func (p MemoryProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  130. p.dbHandle.Lock()
  131. defer p.dbHandle.Unlock()
  132. if p.dbHandle.isClosed {
  133. return errMemoryProviderClosed
  134. }
  135. user, err := p.userExistsInternal(username)
  136. if err != nil {
  137. providerLog(logger.LevelWarn, "unable to update quota for user %#v error: %v", username, err)
  138. return err
  139. }
  140. if reset {
  141. user.UsedQuotaSize = sizeAdd
  142. user.UsedQuotaFiles = filesAdd
  143. } else {
  144. user.UsedQuotaSize += sizeAdd
  145. user.UsedQuotaFiles += filesAdd
  146. }
  147. user.LastQuotaUpdate = utils.GetTimeAsMsSinceEpoch(time.Now())
  148. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  149. username, filesAdd, sizeAdd, reset)
  150. p.dbHandle.users[user.Username] = user
  151. return nil
  152. }
  153. func (p MemoryProvider) getUsedQuota(username string) (int, int64, error) {
  154. p.dbHandle.Lock()
  155. defer p.dbHandle.Unlock()
  156. if p.dbHandle.isClosed {
  157. return 0, 0, errMemoryProviderClosed
  158. }
  159. user, err := p.userExistsInternal(username)
  160. if err != nil {
  161. providerLog(logger.LevelWarn, "unable to get quota for user %#v error: %v", username, err)
  162. return 0, 0, err
  163. }
  164. return user.UsedQuotaFiles, user.UsedQuotaSize, err
  165. }
  166. func (p MemoryProvider) addUser(user User) error {
  167. p.dbHandle.Lock()
  168. defer p.dbHandle.Unlock()
  169. if p.dbHandle.isClosed {
  170. return errMemoryProviderClosed
  171. }
  172. err := validateUser(&user)
  173. if err != nil {
  174. return err
  175. }
  176. _, err = p.userExistsInternal(user.Username)
  177. if err == nil {
  178. return fmt.Errorf("username %#v already exists", user.Username)
  179. }
  180. user.ID = p.getNextID()
  181. user.LastQuotaUpdate = 0
  182. user.UsedQuotaSize = 0
  183. user.UsedQuotaFiles = 0
  184. user.LastLogin = 0
  185. user.VirtualFolders = p.joinVirtualFoldersFields(user)
  186. p.dbHandle.users[user.Username] = user
  187. p.dbHandle.usersIdx[user.ID] = user.Username
  188. p.dbHandle.usernames = append(p.dbHandle.usernames, user.Username)
  189. sort.Strings(p.dbHandle.usernames)
  190. return nil
  191. }
  192. func (p MemoryProvider) updateUser(user User) error {
  193. p.dbHandle.Lock()
  194. defer p.dbHandle.Unlock()
  195. if p.dbHandle.isClosed {
  196. return errMemoryProviderClosed
  197. }
  198. err := validateUser(&user)
  199. if err != nil {
  200. return err
  201. }
  202. u, err := p.userExistsInternal(user.Username)
  203. if err != nil {
  204. return err
  205. }
  206. for _, oldFolder := range u.VirtualFolders {
  207. p.removeUserFromFolderMapping(oldFolder.MappedPath, u.Username)
  208. }
  209. user.VirtualFolders = p.joinVirtualFoldersFields(user)
  210. user.LastQuotaUpdate = u.LastQuotaUpdate
  211. user.UsedQuotaSize = u.UsedQuotaSize
  212. user.UsedQuotaFiles = u.UsedQuotaFiles
  213. user.LastLogin = u.LastLogin
  214. p.dbHandle.users[user.Username] = user
  215. return nil
  216. }
  217. func (p MemoryProvider) deleteUser(user User) error {
  218. p.dbHandle.Lock()
  219. defer p.dbHandle.Unlock()
  220. if p.dbHandle.isClosed {
  221. return errMemoryProviderClosed
  222. }
  223. u, err := p.userExistsInternal(user.Username)
  224. if err != nil {
  225. return err
  226. }
  227. for _, oldFolder := range u.VirtualFolders {
  228. p.removeUserFromFolderMapping(oldFolder.MappedPath, u.Username)
  229. }
  230. delete(p.dbHandle.users, user.Username)
  231. delete(p.dbHandle.usersIdx, user.ID)
  232. // this could be more efficient
  233. p.dbHandle.usernames = []string{}
  234. for username := range p.dbHandle.users {
  235. p.dbHandle.usernames = append(p.dbHandle.usernames, username)
  236. }
  237. sort.Strings(p.dbHandle.usernames)
  238. return nil
  239. }
  240. func (p MemoryProvider) dumpUsers() ([]User, error) {
  241. p.dbHandle.Lock()
  242. defer p.dbHandle.Unlock()
  243. users := make([]User, 0, len(p.dbHandle.usernames))
  244. var err error
  245. if p.dbHandle.isClosed {
  246. return users, errMemoryProviderClosed
  247. }
  248. for _, username := range p.dbHandle.usernames {
  249. user := p.dbHandle.users[username]
  250. err = addCredentialsToUser(&user)
  251. if err != nil {
  252. return users, err
  253. }
  254. users = append(users, user)
  255. }
  256. return users, err
  257. }
  258. func (p MemoryProvider) dumpFolders() ([]vfs.BaseVirtualFolder, error) {
  259. p.dbHandle.Lock()
  260. defer p.dbHandle.Unlock()
  261. folders := make([]vfs.BaseVirtualFolder, 0, len(p.dbHandle.vfoldersPaths))
  262. if p.dbHandle.isClosed {
  263. return folders, errMemoryProviderClosed
  264. }
  265. for _, f := range p.dbHandle.vfolders {
  266. folders = append(folders, f)
  267. }
  268. return folders, nil
  269. }
  270. func (p MemoryProvider) getUsers(limit int, offset int, order string, username string) ([]User, error) {
  271. users := make([]User, 0, limit)
  272. var err error
  273. p.dbHandle.Lock()
  274. defer p.dbHandle.Unlock()
  275. if p.dbHandle.isClosed {
  276. return users, errMemoryProviderClosed
  277. }
  278. if limit <= 0 {
  279. return users, err
  280. }
  281. if len(username) > 0 {
  282. if offset == 0 {
  283. user, err := p.userExistsInternal(username)
  284. if err == nil {
  285. user.HideConfidentialData()
  286. users = append(users, user)
  287. }
  288. }
  289. return users, err
  290. }
  291. itNum := 0
  292. if order == OrderASC {
  293. for _, username := range p.dbHandle.usernames {
  294. itNum++
  295. if itNum <= offset {
  296. continue
  297. }
  298. user := p.dbHandle.users[username]
  299. user.HideConfidentialData()
  300. users = append(users, user)
  301. if len(users) >= limit {
  302. break
  303. }
  304. }
  305. } else {
  306. for i := len(p.dbHandle.usernames) - 1; i >= 0; i-- {
  307. itNum++
  308. if itNum <= offset {
  309. continue
  310. }
  311. username := p.dbHandle.usernames[i]
  312. user := p.dbHandle.users[username]
  313. user.HideConfidentialData()
  314. users = append(users, user)
  315. if len(users) >= limit {
  316. break
  317. }
  318. }
  319. }
  320. return users, err
  321. }
  322. func (p MemoryProvider) userExists(username string) (User, error) {
  323. p.dbHandle.Lock()
  324. defer p.dbHandle.Unlock()
  325. if p.dbHandle.isClosed {
  326. return User{}, errMemoryProviderClosed
  327. }
  328. return p.userExistsInternal(username)
  329. }
  330. func (p MemoryProvider) userExistsInternal(username string) (User, error) {
  331. if val, ok := p.dbHandle.users[username]; ok {
  332. return val.getACopy(), nil
  333. }
  334. return User{}, &RecordNotFoundError{err: fmt.Sprintf("username %#v does not exist", username)}
  335. }
  336. func (p MemoryProvider) updateFolderQuota(mappedPath string, filesAdd int, sizeAdd int64, reset bool) error {
  337. p.dbHandle.Lock()
  338. defer p.dbHandle.Unlock()
  339. if p.dbHandle.isClosed {
  340. return errMemoryProviderClosed
  341. }
  342. folder, err := p.folderExistsInternal(mappedPath)
  343. if err != nil {
  344. providerLog(logger.LevelWarn, "unable to update quota for folder %#v error: %v", mappedPath, err)
  345. return err
  346. }
  347. if reset {
  348. folder.UsedQuotaSize = sizeAdd
  349. folder.UsedQuotaFiles = filesAdd
  350. } else {
  351. folder.UsedQuotaSize += sizeAdd
  352. folder.UsedQuotaFiles += filesAdd
  353. }
  354. folder.LastQuotaUpdate = utils.GetTimeAsMsSinceEpoch(time.Now())
  355. p.dbHandle.vfolders[mappedPath] = folder
  356. return nil
  357. }
  358. func (p MemoryProvider) getUsedFolderQuota(mappedPath string) (int, int64, error) {
  359. p.dbHandle.Lock()
  360. defer p.dbHandle.Unlock()
  361. if p.dbHandle.isClosed {
  362. return 0, 0, errMemoryProviderClosed
  363. }
  364. folder, err := p.folderExistsInternal(mappedPath)
  365. if err != nil {
  366. providerLog(logger.LevelWarn, "unable to get quota for folder %#v error: %v", mappedPath, err)
  367. return 0, 0, err
  368. }
  369. return folder.UsedQuotaFiles, folder.UsedQuotaSize, err
  370. }
  371. func (p MemoryProvider) joinVirtualFoldersFields(user User) []vfs.VirtualFolder {
  372. var folders []vfs.VirtualFolder
  373. for _, folder := range user.VirtualFolders {
  374. f, err := p.addOrGetFolderInternal(folder.MappedPath, user.Username, folder.UsedQuotaSize, folder.UsedQuotaFiles,
  375. folder.LastQuotaUpdate)
  376. if err == nil {
  377. folder.UsedQuotaFiles = f.UsedQuotaFiles
  378. folder.UsedQuotaSize = f.UsedQuotaSize
  379. folder.LastQuotaUpdate = f.LastQuotaUpdate
  380. folder.ID = f.ID
  381. folders = append(folders, folder)
  382. }
  383. }
  384. return folders
  385. }
  386. func (p MemoryProvider) removeUserFromFolderMapping(mappedPath, username string) {
  387. folder, err := p.folderExistsInternal(mappedPath)
  388. if err == nil {
  389. var usernames []string
  390. for _, user := range folder.Users {
  391. if user != username {
  392. usernames = append(usernames, user)
  393. }
  394. }
  395. folder.Users = usernames
  396. p.dbHandle.vfolders[folder.MappedPath] = folder
  397. }
  398. }
  399. func (p MemoryProvider) updateFoldersMappingInternal(folder vfs.BaseVirtualFolder) {
  400. p.dbHandle.vfolders[folder.MappedPath] = folder
  401. if !utils.IsStringInSlice(folder.MappedPath, p.dbHandle.vfoldersPaths) {
  402. p.dbHandle.vfoldersPaths = append(p.dbHandle.vfoldersPaths, folder.MappedPath)
  403. sort.Strings(p.dbHandle.vfoldersPaths)
  404. }
  405. }
  406. func (p MemoryProvider) addOrGetFolderInternal(mappedPath, username string, usedQuotaSize int64, usedQuotaFiles int, lastQuotaUpdate int64) (vfs.BaseVirtualFolder, error) {
  407. folder, err := p.folderExistsInternal(mappedPath)
  408. if _, ok := err.(*RecordNotFoundError); ok {
  409. folder := vfs.BaseVirtualFolder{
  410. ID: p.getNextFolderID(),
  411. MappedPath: mappedPath,
  412. UsedQuotaSize: usedQuotaSize,
  413. UsedQuotaFiles: usedQuotaFiles,
  414. LastQuotaUpdate: lastQuotaUpdate,
  415. Users: []string{username},
  416. }
  417. p.updateFoldersMappingInternal(folder)
  418. return folder, nil
  419. }
  420. if err == nil && !utils.IsStringInSlice(username, folder.Users) {
  421. folder.Users = append(folder.Users, username)
  422. p.updateFoldersMappingInternal(folder)
  423. }
  424. return folder, err
  425. }
  426. func (p MemoryProvider) folderExistsInternal(mappedPath string) (vfs.BaseVirtualFolder, error) {
  427. if val, ok := p.dbHandle.vfolders[mappedPath]; ok {
  428. return val, nil
  429. }
  430. return vfs.BaseVirtualFolder{}, &RecordNotFoundError{err: fmt.Sprintf("folder %#v does not exist", mappedPath)}
  431. }
  432. func (p MemoryProvider) getFolders(limit, offset int, order, folderPath string) ([]vfs.BaseVirtualFolder, error) {
  433. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  434. var err error
  435. p.dbHandle.Lock()
  436. defer p.dbHandle.Unlock()
  437. if p.dbHandle.isClosed {
  438. return folders, errMemoryProviderClosed
  439. }
  440. if limit <= 0 {
  441. return folders, err
  442. }
  443. if len(folderPath) > 0 {
  444. if offset == 0 {
  445. var folder vfs.BaseVirtualFolder
  446. folder, err = p.folderExistsInternal(folderPath)
  447. if err == nil {
  448. folders = append(folders, folder)
  449. }
  450. }
  451. return folders, err
  452. }
  453. itNum := 0
  454. if order == OrderASC {
  455. for _, mappedPath := range p.dbHandle.vfoldersPaths {
  456. itNum++
  457. if itNum <= offset {
  458. continue
  459. }
  460. folder := p.dbHandle.vfolders[mappedPath]
  461. folders = append(folders, folder)
  462. if len(folders) >= limit {
  463. break
  464. }
  465. }
  466. } else {
  467. for i := len(p.dbHandle.vfoldersPaths) - 1; i >= 0; i-- {
  468. itNum++
  469. if itNum <= offset {
  470. continue
  471. }
  472. mappedPath := p.dbHandle.vfoldersPaths[i]
  473. folder := p.dbHandle.vfolders[mappedPath]
  474. folders = append(folders, folder)
  475. if len(folders) >= limit {
  476. break
  477. }
  478. }
  479. }
  480. return folders, err
  481. }
  482. func (p MemoryProvider) getFolderByPath(mappedPath string) (vfs.BaseVirtualFolder, error) {
  483. p.dbHandle.Lock()
  484. defer p.dbHandle.Unlock()
  485. if p.dbHandle.isClosed {
  486. return vfs.BaseVirtualFolder{}, errMemoryProviderClosed
  487. }
  488. return p.folderExistsInternal(mappedPath)
  489. }
  490. func (p MemoryProvider) addFolder(folder vfs.BaseVirtualFolder) error {
  491. p.dbHandle.Lock()
  492. defer p.dbHandle.Unlock()
  493. if p.dbHandle.isClosed {
  494. return errMemoryProviderClosed
  495. }
  496. err := validateFolder(&folder)
  497. if err != nil {
  498. return err
  499. }
  500. _, err = p.folderExistsInternal(folder.MappedPath)
  501. if err == nil {
  502. return fmt.Errorf("folder %#v already exists", folder.MappedPath)
  503. }
  504. folder.ID = p.getNextFolderID()
  505. p.dbHandle.vfolders[folder.MappedPath] = folder
  506. p.dbHandle.vfoldersPaths = append(p.dbHandle.vfoldersPaths, folder.MappedPath)
  507. sort.Strings(p.dbHandle.vfoldersPaths)
  508. return nil
  509. }
  510. func (p MemoryProvider) deleteFolder(folder vfs.BaseVirtualFolder) error {
  511. p.dbHandle.Lock()
  512. defer p.dbHandle.Unlock()
  513. if p.dbHandle.isClosed {
  514. return errMemoryProviderClosed
  515. }
  516. _, err := p.folderExistsInternal(folder.MappedPath)
  517. if err != nil {
  518. return err
  519. }
  520. for _, username := range folder.Users {
  521. user, err := p.userExistsInternal(username)
  522. if err == nil {
  523. var folders []vfs.VirtualFolder
  524. for _, userFolder := range user.VirtualFolders {
  525. if folder.MappedPath != userFolder.MappedPath {
  526. folders = append(folders, userFolder)
  527. }
  528. }
  529. user.VirtualFolders = folders
  530. p.dbHandle.users[user.Username] = user
  531. }
  532. }
  533. delete(p.dbHandle.vfolders, folder.MappedPath)
  534. p.dbHandle.vfoldersPaths = []string{}
  535. for mappedPath := range p.dbHandle.vfolders {
  536. p.dbHandle.vfoldersPaths = append(p.dbHandle.vfoldersPaths, mappedPath)
  537. }
  538. sort.Strings(p.dbHandle.vfoldersPaths)
  539. return nil
  540. }
  541. func (p MemoryProvider) getNextID() int64 {
  542. nextID := int64(1)
  543. for id := range p.dbHandle.usersIdx {
  544. if id >= nextID {
  545. nextID = id + 1
  546. }
  547. }
  548. return nextID
  549. }
  550. func (p MemoryProvider) getNextFolderID() int64 {
  551. nextID := int64(1)
  552. for _, v := range p.dbHandle.vfolders {
  553. if v.ID >= nextID {
  554. nextID = v.ID + 1
  555. }
  556. }
  557. return nextID
  558. }
  559. func (p MemoryProvider) clear() {
  560. p.dbHandle.Lock()
  561. defer p.dbHandle.Unlock()
  562. p.dbHandle.usernames = []string{}
  563. p.dbHandle.usersIdx = make(map[int64]string)
  564. p.dbHandle.users = make(map[string]User)
  565. p.dbHandle.vfoldersPaths = []string{}
  566. p.dbHandle.vfolders = make(map[string]vfs.BaseVirtualFolder)
  567. }
  568. func (p MemoryProvider) reloadConfig() error {
  569. if p.dbHandle.configFile == "" {
  570. providerLog(logger.LevelDebug, "no users configuration file defined")
  571. return nil
  572. }
  573. providerLog(logger.LevelDebug, "loading users from file: %#v", p.dbHandle.configFile)
  574. fi, err := os.Stat(p.dbHandle.configFile)
  575. if err != nil {
  576. providerLog(logger.LevelWarn, "error loading users: %v", err)
  577. return err
  578. }
  579. if fi.Size() == 0 {
  580. err = errors.New("users configuration file is invalid, its size must be > 0")
  581. providerLog(logger.LevelWarn, "error loading users: %v", err)
  582. return err
  583. }
  584. if fi.Size() > 10485760 {
  585. err = errors.New("users configuration file is invalid, its size must be <= 10485760 bytes")
  586. providerLog(logger.LevelWarn, "error loading users: %v", err)
  587. return err
  588. }
  589. content, err := ioutil.ReadFile(p.dbHandle.configFile)
  590. if err != nil {
  591. providerLog(logger.LevelWarn, "error loading users: %v", err)
  592. return err
  593. }
  594. dump, err := ParseDumpData(content)
  595. if err != nil {
  596. providerLog(logger.LevelWarn, "error loading users: %v", err)
  597. return err
  598. }
  599. p.clear()
  600. for _, folder := range dump.Folders {
  601. _, err := p.getFolderByPath(folder.MappedPath)
  602. if err == nil {
  603. logger.Debug(logSender, "", "folder %#v already exists, restore not needed", folder.MappedPath)
  604. continue
  605. }
  606. folder.Users = nil
  607. err = p.addFolder(folder)
  608. if err != nil {
  609. providerLog(logger.LevelWarn, "error adding folder %#v: %v", folder.MappedPath, err)
  610. return err
  611. }
  612. }
  613. for _, user := range dump.Users {
  614. u, err := p.userExists(user.Username)
  615. if err == nil {
  616. user.ID = u.ID
  617. err = p.updateUser(user)
  618. if err != nil {
  619. providerLog(logger.LevelWarn, "error updating user %#v: %v", user.Username, err)
  620. return err
  621. }
  622. } else {
  623. err = p.addUser(user)
  624. if err != nil {
  625. providerLog(logger.LevelWarn, "error adding user %#v: %v", user.Username, err)
  626. return err
  627. }
  628. }
  629. }
  630. providerLog(logger.LevelDebug, "user and folders loaded from file: %#v", p.dbHandle.configFile)
  631. return nil
  632. }
  633. // initializeDatabase does nothing, no initilization is needed for memory provider
  634. func (p MemoryProvider) initializeDatabase() error {
  635. return ErrNoInitRequired
  636. }
  637. func (p MemoryProvider) migrateDatabase() error {
  638. return ErrNoInitRequired
  639. }
  640. func (p MemoryProvider) revertDatabase(targetVersion int) error {
  641. return errors.New("memory provider does not store data, revert not possible")
  642. }