memory.go 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523
  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/v2/logger"
  12. "github.com/drakkan/sftpgo/v2/util"
  13. "github.com/drakkan/sftpgo/v2/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. // map for API keys, keyID is the key
  36. apiKeys map[string]APIKey
  37. // slice with ordered API keys KeyID
  38. apiKeysIDs []string
  39. // map for shares, shareID is the key
  40. shares map[string]Share
  41. // slice with ordered shares shareID
  42. sharesIDs []string
  43. }
  44. // MemoryProvider defines the auth provider for a memory store
  45. type MemoryProvider struct {
  46. dbHandle *memoryProviderHandle
  47. }
  48. func initializeMemoryProvider(basePath string) {
  49. configFile := ""
  50. if util.IsFileInputValid(config.Name) {
  51. configFile = config.Name
  52. if !filepath.IsAbs(configFile) {
  53. configFile = filepath.Join(basePath, configFile)
  54. }
  55. }
  56. provider = &MemoryProvider{
  57. dbHandle: &memoryProviderHandle{
  58. isClosed: false,
  59. usernames: []string{},
  60. users: make(map[string]User),
  61. vfolders: make(map[string]vfs.BaseVirtualFolder),
  62. vfoldersNames: []string{},
  63. admins: make(map[string]Admin),
  64. adminsUsernames: []string{},
  65. apiKeys: make(map[string]APIKey),
  66. apiKeysIDs: []string{},
  67. shares: make(map[string]Share),
  68. sharesIDs: []string{},
  69. configFile: configFile,
  70. },
  71. }
  72. if err := provider.reloadConfig(); err != nil {
  73. logger.Error(logSender, "", "unable to load initial data: %v", err)
  74. logger.ErrorToConsole("unable to load initial data: %v", err)
  75. }
  76. }
  77. func (p *MemoryProvider) checkAvailability() error {
  78. p.dbHandle.Lock()
  79. defer p.dbHandle.Unlock()
  80. if p.dbHandle.isClosed {
  81. return errMemoryProviderClosed
  82. }
  83. return nil
  84. }
  85. func (p *MemoryProvider) close() error {
  86. p.dbHandle.Lock()
  87. defer p.dbHandle.Unlock()
  88. if p.dbHandle.isClosed {
  89. return errMemoryProviderClosed
  90. }
  91. p.dbHandle.isClosed = true
  92. return nil
  93. }
  94. func (p *MemoryProvider) validateUserAndTLSCert(username, protocol string, tlsCert *x509.Certificate) (User, error) {
  95. var user User
  96. if tlsCert == nil {
  97. return user, errors.New("TLS certificate cannot be null or empty")
  98. }
  99. user, err := p.userExists(username)
  100. if err != nil {
  101. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  102. return user, err
  103. }
  104. return checkUserAndTLSCertificate(&user, protocol, tlsCert)
  105. }
  106. func (p *MemoryProvider) validateUserAndPass(username, password, ip, protocol string) (User, error) {
  107. var user User
  108. if password == "" {
  109. return user, errors.New("credentials cannot be null or empty")
  110. }
  111. user, err := p.userExists(username)
  112. if err != nil {
  113. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  114. return user, err
  115. }
  116. return checkUserAndPass(&user, password, ip, protocol)
  117. }
  118. func (p *MemoryProvider) validateUserAndPubKey(username string, pubKey []byte) (User, string, error) {
  119. var user User
  120. if len(pubKey) == 0 {
  121. return user, "", errors.New("credentials cannot be null or empty")
  122. }
  123. user, err := p.userExists(username)
  124. if err != nil {
  125. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  126. return user, "", err
  127. }
  128. return checkUserAndPubKey(&user, pubKey)
  129. }
  130. func (p *MemoryProvider) validateAdminAndPass(username, password, ip string) (Admin, error) {
  131. admin, err := p.adminExists(username)
  132. if err != nil {
  133. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  134. return admin, ErrInvalidCredentials
  135. }
  136. err = admin.checkUserAndPass(password, ip)
  137. return admin, err
  138. }
  139. func (p *MemoryProvider) updateAPIKeyLastUse(keyID string) error {
  140. p.dbHandle.Lock()
  141. defer p.dbHandle.Unlock()
  142. if p.dbHandle.isClosed {
  143. return errMemoryProviderClosed
  144. }
  145. apiKey, err := p.apiKeyExistsInternal(keyID)
  146. if err != nil {
  147. return err
  148. }
  149. apiKey.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  150. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey
  151. return nil
  152. }
  153. func (p *MemoryProvider) setUpdatedAt(username string) {
  154. p.dbHandle.Lock()
  155. defer p.dbHandle.Unlock()
  156. if p.dbHandle.isClosed {
  157. return
  158. }
  159. user, err := p.userExistsInternal(username)
  160. if err != nil {
  161. return
  162. }
  163. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  164. p.dbHandle.users[user.Username] = user
  165. }
  166. func (p *MemoryProvider) updateLastLogin(username string) error {
  167. p.dbHandle.Lock()
  168. defer p.dbHandle.Unlock()
  169. if p.dbHandle.isClosed {
  170. return errMemoryProviderClosed
  171. }
  172. user, err := p.userExistsInternal(username)
  173. if err != nil {
  174. return err
  175. }
  176. user.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  177. p.dbHandle.users[user.Username] = user
  178. return nil
  179. }
  180. func (p *MemoryProvider) updateAdminLastLogin(username string) error {
  181. p.dbHandle.Lock()
  182. defer p.dbHandle.Unlock()
  183. if p.dbHandle.isClosed {
  184. return errMemoryProviderClosed
  185. }
  186. admin, err := p.adminExistsInternal(username)
  187. if err != nil {
  188. return err
  189. }
  190. admin.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  191. p.dbHandle.admins[admin.Username] = admin
  192. return nil
  193. }
  194. func (p *MemoryProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  195. p.dbHandle.Lock()
  196. defer p.dbHandle.Unlock()
  197. if p.dbHandle.isClosed {
  198. return errMemoryProviderClosed
  199. }
  200. user, err := p.userExistsInternal(username)
  201. if err != nil {
  202. providerLog(logger.LevelError, "unable to update quota for user %#v error: %v", username, err)
  203. return err
  204. }
  205. if reset {
  206. user.UsedQuotaSize = sizeAdd
  207. user.UsedQuotaFiles = filesAdd
  208. } else {
  209. user.UsedQuotaSize += sizeAdd
  210. user.UsedQuotaFiles += filesAdd
  211. }
  212. user.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  213. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  214. username, filesAdd, sizeAdd, reset)
  215. p.dbHandle.users[user.Username] = user
  216. return nil
  217. }
  218. func (p *MemoryProvider) getUsedQuota(username string) (int, int64, error) {
  219. p.dbHandle.Lock()
  220. defer p.dbHandle.Unlock()
  221. if p.dbHandle.isClosed {
  222. return 0, 0, errMemoryProviderClosed
  223. }
  224. user, err := p.userExistsInternal(username)
  225. if err != nil {
  226. providerLog(logger.LevelError, "unable to get quota for user %#v error: %v", username, err)
  227. return 0, 0, err
  228. }
  229. return user.UsedQuotaFiles, user.UsedQuotaSize, err
  230. }
  231. func (p *MemoryProvider) addUser(user *User) error {
  232. // we can query virtual folder while validating a user
  233. // so we have to check without holding the lock
  234. err := ValidateUser(user)
  235. if err != nil {
  236. return err
  237. }
  238. p.dbHandle.Lock()
  239. defer p.dbHandle.Unlock()
  240. if p.dbHandle.isClosed {
  241. return errMemoryProviderClosed
  242. }
  243. _, err = p.userExistsInternal(user.Username)
  244. if err == nil {
  245. return fmt.Errorf("username %#v already exists", user.Username)
  246. }
  247. user.ID = p.getNextID()
  248. user.LastQuotaUpdate = 0
  249. user.UsedQuotaSize = 0
  250. user.UsedQuotaFiles = 0
  251. user.LastLogin = 0
  252. user.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  253. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  254. user.VirtualFolders = p.joinVirtualFoldersFields(user)
  255. p.dbHandle.users[user.Username] = user.getACopy()
  256. p.dbHandle.usernames = append(p.dbHandle.usernames, user.Username)
  257. sort.Strings(p.dbHandle.usernames)
  258. return nil
  259. }
  260. func (p *MemoryProvider) updateUser(user *User) error {
  261. // we can query virtual folder while validating a user
  262. // so we have to check without holding the lock
  263. err := ValidateUser(user)
  264. if err != nil {
  265. return err
  266. }
  267. p.dbHandle.Lock()
  268. defer p.dbHandle.Unlock()
  269. if p.dbHandle.isClosed {
  270. return errMemoryProviderClosed
  271. }
  272. u, err := p.userExistsInternal(user.Username)
  273. if err != nil {
  274. return err
  275. }
  276. for _, oldFolder := range u.VirtualFolders {
  277. p.removeUserFromFolderMapping(oldFolder.Name, u.Username)
  278. }
  279. user.VirtualFolders = p.joinVirtualFoldersFields(user)
  280. user.LastQuotaUpdate = u.LastQuotaUpdate
  281. user.UsedQuotaSize = u.UsedQuotaSize
  282. user.UsedQuotaFiles = u.UsedQuotaFiles
  283. user.LastLogin = u.LastLogin
  284. user.CreatedAt = u.CreatedAt
  285. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  286. user.ID = u.ID
  287. // pre-login and external auth hook will use the passed *user so save a copy
  288. p.dbHandle.users[user.Username] = user.getACopy()
  289. return nil
  290. }
  291. func (p *MemoryProvider) deleteUser(user *User) error {
  292. p.dbHandle.Lock()
  293. defer p.dbHandle.Unlock()
  294. if p.dbHandle.isClosed {
  295. return errMemoryProviderClosed
  296. }
  297. u, err := p.userExistsInternal(user.Username)
  298. if err != nil {
  299. return err
  300. }
  301. for _, oldFolder := range u.VirtualFolders {
  302. p.removeUserFromFolderMapping(oldFolder.Name, u.Username)
  303. }
  304. delete(p.dbHandle.users, user.Username)
  305. // this could be more efficient
  306. p.dbHandle.usernames = make([]string, 0, len(p.dbHandle.users))
  307. for username := range p.dbHandle.users {
  308. p.dbHandle.usernames = append(p.dbHandle.usernames, username)
  309. }
  310. sort.Strings(p.dbHandle.usernames)
  311. p.deleteAPIKeysWithUser(user.Username)
  312. p.deleteSharesWithUser(user.Username)
  313. return nil
  314. }
  315. func (p *MemoryProvider) dumpUsers() ([]User, error) {
  316. p.dbHandle.Lock()
  317. defer p.dbHandle.Unlock()
  318. users := make([]User, 0, len(p.dbHandle.usernames))
  319. var err error
  320. if p.dbHandle.isClosed {
  321. return users, errMemoryProviderClosed
  322. }
  323. for _, username := range p.dbHandle.usernames {
  324. u := p.dbHandle.users[username]
  325. user := u.getACopy()
  326. err = addCredentialsToUser(&user)
  327. if err != nil {
  328. return users, err
  329. }
  330. users = append(users, user)
  331. }
  332. return users, err
  333. }
  334. func (p *MemoryProvider) dumpFolders() ([]vfs.BaseVirtualFolder, error) {
  335. p.dbHandle.Lock()
  336. defer p.dbHandle.Unlock()
  337. folders := make([]vfs.BaseVirtualFolder, 0, len(p.dbHandle.vfoldersNames))
  338. if p.dbHandle.isClosed {
  339. return folders, errMemoryProviderClosed
  340. }
  341. for _, f := range p.dbHandle.vfolders {
  342. folders = append(folders, f)
  343. }
  344. return folders, nil
  345. }
  346. // memory provider cannot be shared, so we always return no recently updated users
  347. func (p *MemoryProvider) getRecentlyUpdatedUsers(after int64) ([]User, error) {
  348. return nil, nil
  349. }
  350. func (p *MemoryProvider) getUsers(limit int, offset int, order string) ([]User, error) {
  351. users := make([]User, 0, limit)
  352. var err error
  353. p.dbHandle.Lock()
  354. defer p.dbHandle.Unlock()
  355. if p.dbHandle.isClosed {
  356. return users, errMemoryProviderClosed
  357. }
  358. if limit <= 0 {
  359. return users, err
  360. }
  361. itNum := 0
  362. if order == OrderASC {
  363. for _, username := range p.dbHandle.usernames {
  364. itNum++
  365. if itNum <= offset {
  366. continue
  367. }
  368. u := p.dbHandle.users[username]
  369. user := u.getACopy()
  370. user.PrepareForRendering()
  371. users = append(users, user)
  372. if len(users) >= limit {
  373. break
  374. }
  375. }
  376. } else {
  377. for i := len(p.dbHandle.usernames) - 1; i >= 0; i-- {
  378. itNum++
  379. if itNum <= offset {
  380. continue
  381. }
  382. username := p.dbHandle.usernames[i]
  383. u := p.dbHandle.users[username]
  384. user := u.getACopy()
  385. user.PrepareForRendering()
  386. users = append(users, user)
  387. if len(users) >= limit {
  388. break
  389. }
  390. }
  391. }
  392. return users, err
  393. }
  394. func (p *MemoryProvider) userExists(username string) (User, error) {
  395. p.dbHandle.Lock()
  396. defer p.dbHandle.Unlock()
  397. if p.dbHandle.isClosed {
  398. return User{}, errMemoryProviderClosed
  399. }
  400. return p.userExistsInternal(username)
  401. }
  402. func (p *MemoryProvider) userExistsInternal(username string) (User, error) {
  403. if val, ok := p.dbHandle.users[username]; ok {
  404. return val.getACopy(), nil
  405. }
  406. return User{}, util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist", username))
  407. }
  408. func (p *MemoryProvider) addAdmin(admin *Admin) error {
  409. p.dbHandle.Lock()
  410. defer p.dbHandle.Unlock()
  411. if p.dbHandle.isClosed {
  412. return errMemoryProviderClosed
  413. }
  414. err := admin.validate()
  415. if err != nil {
  416. return err
  417. }
  418. _, err = p.adminExistsInternal(admin.Username)
  419. if err == nil {
  420. return fmt.Errorf("admin %#v already exists", admin.Username)
  421. }
  422. admin.ID = p.getNextAdminID()
  423. admin.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  424. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  425. admin.LastLogin = 0
  426. p.dbHandle.admins[admin.Username] = admin.getACopy()
  427. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, admin.Username)
  428. sort.Strings(p.dbHandle.adminsUsernames)
  429. return nil
  430. }
  431. func (p *MemoryProvider) updateAdmin(admin *Admin) error {
  432. p.dbHandle.Lock()
  433. defer p.dbHandle.Unlock()
  434. if p.dbHandle.isClosed {
  435. return errMemoryProviderClosed
  436. }
  437. err := admin.validate()
  438. if err != nil {
  439. return err
  440. }
  441. a, err := p.adminExistsInternal(admin.Username)
  442. if err != nil {
  443. return err
  444. }
  445. admin.ID = a.ID
  446. admin.CreatedAt = a.CreatedAt
  447. admin.LastLogin = a.LastLogin
  448. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  449. p.dbHandle.admins[admin.Username] = admin.getACopy()
  450. return nil
  451. }
  452. func (p *MemoryProvider) deleteAdmin(admin *Admin) error {
  453. p.dbHandle.Lock()
  454. defer p.dbHandle.Unlock()
  455. if p.dbHandle.isClosed {
  456. return errMemoryProviderClosed
  457. }
  458. _, err := p.adminExistsInternal(admin.Username)
  459. if err != nil {
  460. return err
  461. }
  462. delete(p.dbHandle.admins, admin.Username)
  463. // this could be more efficient
  464. p.dbHandle.adminsUsernames = make([]string, 0, len(p.dbHandle.admins))
  465. for username := range p.dbHandle.admins {
  466. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, username)
  467. }
  468. sort.Strings(p.dbHandle.adminsUsernames)
  469. p.deleteAPIKeysWithAdmin(admin.Username)
  470. return nil
  471. }
  472. func (p *MemoryProvider) adminExists(username string) (Admin, error) {
  473. p.dbHandle.Lock()
  474. defer p.dbHandle.Unlock()
  475. if p.dbHandle.isClosed {
  476. return Admin{}, errMemoryProviderClosed
  477. }
  478. return p.adminExistsInternal(username)
  479. }
  480. func (p *MemoryProvider) adminExistsInternal(username string) (Admin, error) {
  481. if val, ok := p.dbHandle.admins[username]; ok {
  482. return val.getACopy(), nil
  483. }
  484. return Admin{}, util.NewRecordNotFoundError(fmt.Sprintf("admin %#v does not exist", username))
  485. }
  486. func (p *MemoryProvider) dumpAdmins() ([]Admin, error) {
  487. p.dbHandle.Lock()
  488. defer p.dbHandle.Unlock()
  489. admins := make([]Admin, 0, len(p.dbHandle.admins))
  490. if p.dbHandle.isClosed {
  491. return admins, errMemoryProviderClosed
  492. }
  493. for _, admin := range p.dbHandle.admins {
  494. admins = append(admins, admin)
  495. }
  496. return admins, nil
  497. }
  498. func (p *MemoryProvider) getAdmins(limit int, offset int, order string) ([]Admin, error) {
  499. admins := make([]Admin, 0, limit)
  500. p.dbHandle.Lock()
  501. defer p.dbHandle.Unlock()
  502. if p.dbHandle.isClosed {
  503. return admins, errMemoryProviderClosed
  504. }
  505. if limit <= 0 {
  506. return admins, nil
  507. }
  508. itNum := 0
  509. if order == OrderASC {
  510. for _, username := range p.dbHandle.adminsUsernames {
  511. itNum++
  512. if itNum <= offset {
  513. continue
  514. }
  515. a := p.dbHandle.admins[username]
  516. admin := a.getACopy()
  517. admin.HideConfidentialData()
  518. admins = append(admins, admin)
  519. if len(admins) >= limit {
  520. break
  521. }
  522. }
  523. } else {
  524. for i := len(p.dbHandle.adminsUsernames) - 1; i >= 0; i-- {
  525. itNum++
  526. if itNum <= offset {
  527. continue
  528. }
  529. username := p.dbHandle.adminsUsernames[i]
  530. a := p.dbHandle.admins[username]
  531. admin := a.getACopy()
  532. admin.HideConfidentialData()
  533. admins = append(admins, admin)
  534. if len(admins) >= limit {
  535. break
  536. }
  537. }
  538. }
  539. return admins, nil
  540. }
  541. func (p *MemoryProvider) updateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool) error {
  542. p.dbHandle.Lock()
  543. defer p.dbHandle.Unlock()
  544. if p.dbHandle.isClosed {
  545. return errMemoryProviderClosed
  546. }
  547. folder, err := p.folderExistsInternal(name)
  548. if err != nil {
  549. providerLog(logger.LevelError, "unable to update quota for folder %#v error: %v", name, err)
  550. return err
  551. }
  552. if reset {
  553. folder.UsedQuotaSize = sizeAdd
  554. folder.UsedQuotaFiles = filesAdd
  555. } else {
  556. folder.UsedQuotaSize += sizeAdd
  557. folder.UsedQuotaFiles += filesAdd
  558. }
  559. folder.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  560. p.dbHandle.vfolders[name] = folder
  561. return nil
  562. }
  563. func (p *MemoryProvider) getUsedFolderQuota(name string) (int, int64, error) {
  564. p.dbHandle.Lock()
  565. defer p.dbHandle.Unlock()
  566. if p.dbHandle.isClosed {
  567. return 0, 0, errMemoryProviderClosed
  568. }
  569. folder, err := p.folderExistsInternal(name)
  570. if err != nil {
  571. providerLog(logger.LevelError, "unable to get quota for folder %#v error: %v", name, err)
  572. return 0, 0, err
  573. }
  574. return folder.UsedQuotaFiles, folder.UsedQuotaSize, err
  575. }
  576. func (p *MemoryProvider) joinVirtualFoldersFields(user *User) []vfs.VirtualFolder {
  577. var folders []vfs.VirtualFolder
  578. for idx := range user.VirtualFolders {
  579. folder := &user.VirtualFolders[idx]
  580. f, err := p.addOrUpdateFolderInternal(&folder.BaseVirtualFolder, user.Username, 0, 0, 0)
  581. if err == nil {
  582. folder.BaseVirtualFolder = f
  583. folders = append(folders, *folder)
  584. }
  585. }
  586. return folders
  587. }
  588. func (p *MemoryProvider) removeUserFromFolderMapping(folderName, username string) {
  589. folder, err := p.folderExistsInternal(folderName)
  590. if err == nil {
  591. var usernames []string
  592. for _, user := range folder.Users {
  593. if user != username {
  594. usernames = append(usernames, user)
  595. }
  596. }
  597. folder.Users = usernames
  598. p.dbHandle.vfolders[folder.Name] = folder
  599. }
  600. }
  601. func (p *MemoryProvider) updateFoldersMappingInternal(folder vfs.BaseVirtualFolder) {
  602. p.dbHandle.vfolders[folder.Name] = folder
  603. if !util.IsStringInSlice(folder.Name, p.dbHandle.vfoldersNames) {
  604. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  605. sort.Strings(p.dbHandle.vfoldersNames)
  606. }
  607. }
  608. func (p *MemoryProvider) addOrUpdateFolderInternal(baseFolder *vfs.BaseVirtualFolder, username string, usedQuotaSize int64,
  609. usedQuotaFiles int, lastQuotaUpdate int64) (vfs.BaseVirtualFolder, error) {
  610. folder, err := p.folderExistsInternal(baseFolder.Name)
  611. if err == nil {
  612. // exists
  613. folder.MappedPath = baseFolder.MappedPath
  614. folder.Description = baseFolder.Description
  615. folder.FsConfig = baseFolder.FsConfig.GetACopy()
  616. if !util.IsStringInSlice(username, folder.Users) {
  617. folder.Users = append(folder.Users, username)
  618. }
  619. p.updateFoldersMappingInternal(folder)
  620. return folder, nil
  621. }
  622. if _, ok := err.(*util.RecordNotFoundError); ok {
  623. folder = baseFolder.GetACopy()
  624. folder.ID = p.getNextFolderID()
  625. folder.UsedQuotaSize = usedQuotaSize
  626. folder.UsedQuotaFiles = usedQuotaFiles
  627. folder.LastQuotaUpdate = lastQuotaUpdate
  628. folder.Users = []string{username}
  629. p.updateFoldersMappingInternal(folder)
  630. return folder, nil
  631. }
  632. return folder, err
  633. }
  634. func (p *MemoryProvider) folderExistsInternal(name string) (vfs.BaseVirtualFolder, error) {
  635. if val, ok := p.dbHandle.vfolders[name]; ok {
  636. return val, nil
  637. }
  638. return vfs.BaseVirtualFolder{}, util.NewRecordNotFoundError(fmt.Sprintf("folder %#v does not exist", name))
  639. }
  640. func (p *MemoryProvider) getFolders(limit, offset int, order string) ([]vfs.BaseVirtualFolder, error) {
  641. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  642. var err error
  643. p.dbHandle.Lock()
  644. defer p.dbHandle.Unlock()
  645. if p.dbHandle.isClosed {
  646. return folders, errMemoryProviderClosed
  647. }
  648. if limit <= 0 {
  649. return folders, err
  650. }
  651. itNum := 0
  652. if order == OrderASC {
  653. for _, name := range p.dbHandle.vfoldersNames {
  654. itNum++
  655. if itNum <= offset {
  656. continue
  657. }
  658. f := p.dbHandle.vfolders[name]
  659. folder := f.GetACopy()
  660. folder.PrepareForRendering()
  661. folders = append(folders, folder)
  662. if len(folders) >= limit {
  663. break
  664. }
  665. }
  666. } else {
  667. for i := len(p.dbHandle.vfoldersNames) - 1; i >= 0; i-- {
  668. itNum++
  669. if itNum <= offset {
  670. continue
  671. }
  672. name := p.dbHandle.vfoldersNames[i]
  673. f := p.dbHandle.vfolders[name]
  674. folder := f.GetACopy()
  675. folder.PrepareForRendering()
  676. folders = append(folders, folder)
  677. if len(folders) >= limit {
  678. break
  679. }
  680. }
  681. }
  682. return folders, err
  683. }
  684. func (p *MemoryProvider) getFolderByName(name string) (vfs.BaseVirtualFolder, error) {
  685. p.dbHandle.Lock()
  686. defer p.dbHandle.Unlock()
  687. if p.dbHandle.isClosed {
  688. return vfs.BaseVirtualFolder{}, errMemoryProviderClosed
  689. }
  690. folder, err := p.folderExistsInternal(name)
  691. if err != nil {
  692. return vfs.BaseVirtualFolder{}, err
  693. }
  694. return folder.GetACopy(), nil
  695. }
  696. func (p *MemoryProvider) addFolder(folder *vfs.BaseVirtualFolder) error {
  697. err := ValidateFolder(folder)
  698. if err != nil {
  699. return err
  700. }
  701. p.dbHandle.Lock()
  702. defer p.dbHandle.Unlock()
  703. if p.dbHandle.isClosed {
  704. return errMemoryProviderClosed
  705. }
  706. _, err = p.folderExistsInternal(folder.Name)
  707. if err == nil {
  708. return fmt.Errorf("folder %#v already exists", folder.Name)
  709. }
  710. folder.ID = p.getNextFolderID()
  711. folder.Users = nil
  712. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  713. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  714. sort.Strings(p.dbHandle.vfoldersNames)
  715. return nil
  716. }
  717. func (p *MemoryProvider) updateFolder(folder *vfs.BaseVirtualFolder) error {
  718. err := ValidateFolder(folder)
  719. if err != nil {
  720. return err
  721. }
  722. p.dbHandle.Lock()
  723. defer p.dbHandle.Unlock()
  724. if p.dbHandle.isClosed {
  725. return errMemoryProviderClosed
  726. }
  727. f, err := p.folderExistsInternal(folder.Name)
  728. if err != nil {
  729. return err
  730. }
  731. folder.ID = f.ID
  732. folder.LastQuotaUpdate = f.LastQuotaUpdate
  733. folder.UsedQuotaFiles = f.UsedQuotaFiles
  734. folder.UsedQuotaSize = f.UsedQuotaSize
  735. folder.Users = f.Users
  736. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  737. // now update the related users
  738. for _, username := range folder.Users {
  739. user, err := p.userExistsInternal(username)
  740. if err == nil {
  741. var folders []vfs.VirtualFolder
  742. for idx := range user.VirtualFolders {
  743. userFolder := &user.VirtualFolders[idx]
  744. if folder.Name == userFolder.Name {
  745. userFolder.BaseVirtualFolder = folder.GetACopy()
  746. }
  747. folders = append(folders, *userFolder)
  748. }
  749. user.VirtualFolders = folders
  750. p.dbHandle.users[user.Username] = user
  751. }
  752. }
  753. return nil
  754. }
  755. func (p *MemoryProvider) deleteFolder(folder *vfs.BaseVirtualFolder) error {
  756. p.dbHandle.Lock()
  757. defer p.dbHandle.Unlock()
  758. if p.dbHandle.isClosed {
  759. return errMemoryProviderClosed
  760. }
  761. _, err := p.folderExistsInternal(folder.Name)
  762. if err != nil {
  763. return err
  764. }
  765. for _, username := range folder.Users {
  766. user, err := p.userExistsInternal(username)
  767. if err == nil {
  768. var folders []vfs.VirtualFolder
  769. for idx := range user.VirtualFolders {
  770. userFolder := &user.VirtualFolders[idx]
  771. if folder.Name != userFolder.Name {
  772. folders = append(folders, *userFolder)
  773. }
  774. }
  775. user.VirtualFolders = folders
  776. p.dbHandle.users[user.Username] = user
  777. }
  778. }
  779. delete(p.dbHandle.vfolders, folder.Name)
  780. p.dbHandle.vfoldersNames = []string{}
  781. for name := range p.dbHandle.vfolders {
  782. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, name)
  783. }
  784. sort.Strings(p.dbHandle.vfoldersNames)
  785. return nil
  786. }
  787. func (p *MemoryProvider) apiKeyExistsInternal(keyID string) (APIKey, error) {
  788. if val, ok := p.dbHandle.apiKeys[keyID]; ok {
  789. return val.getACopy(), nil
  790. }
  791. return APIKey{}, util.NewRecordNotFoundError(fmt.Sprintf("API key %#v does not exist", keyID))
  792. }
  793. func (p *MemoryProvider) apiKeyExists(keyID string) (APIKey, error) {
  794. p.dbHandle.Lock()
  795. defer p.dbHandle.Unlock()
  796. if p.dbHandle.isClosed {
  797. return APIKey{}, errMemoryProviderClosed
  798. }
  799. return p.apiKeyExistsInternal(keyID)
  800. }
  801. func (p *MemoryProvider) addAPIKey(apiKey *APIKey) error {
  802. err := apiKey.validate()
  803. if err != nil {
  804. return err
  805. }
  806. p.dbHandle.Lock()
  807. defer p.dbHandle.Unlock()
  808. if p.dbHandle.isClosed {
  809. return errMemoryProviderClosed
  810. }
  811. _, err = p.apiKeyExistsInternal(apiKey.KeyID)
  812. if err == nil {
  813. return fmt.Errorf("API key %#v already exists", apiKey.KeyID)
  814. }
  815. if apiKey.User != "" {
  816. if _, err := p.userExistsInternal(apiKey.User); err != nil {
  817. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", apiKey.User))
  818. }
  819. }
  820. if apiKey.Admin != "" {
  821. if _, err := p.adminExistsInternal(apiKey.Admin); err != nil {
  822. return util.NewValidationError(fmt.Sprintf("related admin %#v does not exists", apiKey.User))
  823. }
  824. }
  825. apiKey.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  826. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  827. apiKey.LastUseAt = 0
  828. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey.getACopy()
  829. p.dbHandle.apiKeysIDs = append(p.dbHandle.apiKeysIDs, apiKey.KeyID)
  830. sort.Strings(p.dbHandle.apiKeysIDs)
  831. return nil
  832. }
  833. func (p *MemoryProvider) updateAPIKey(apiKey *APIKey) error {
  834. err := apiKey.validate()
  835. if err != nil {
  836. return err
  837. }
  838. p.dbHandle.Lock()
  839. defer p.dbHandle.Unlock()
  840. if p.dbHandle.isClosed {
  841. return errMemoryProviderClosed
  842. }
  843. k, err := p.apiKeyExistsInternal(apiKey.KeyID)
  844. if err != nil {
  845. return err
  846. }
  847. if apiKey.User != "" {
  848. if _, err := p.userExistsInternal(apiKey.User); err != nil {
  849. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", apiKey.User))
  850. }
  851. }
  852. if apiKey.Admin != "" {
  853. if _, err := p.adminExistsInternal(apiKey.Admin); err != nil {
  854. return util.NewValidationError(fmt.Sprintf("related admin %#v does not exists", apiKey.User))
  855. }
  856. }
  857. apiKey.ID = k.ID
  858. apiKey.KeyID = k.KeyID
  859. apiKey.Key = k.Key
  860. apiKey.CreatedAt = k.CreatedAt
  861. apiKey.LastUseAt = k.LastUseAt
  862. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  863. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey.getACopy()
  864. return nil
  865. }
  866. func (p *MemoryProvider) deleteAPIKey(apiKey *APIKey) error {
  867. p.dbHandle.Lock()
  868. defer p.dbHandle.Unlock()
  869. if p.dbHandle.isClosed {
  870. return errMemoryProviderClosed
  871. }
  872. _, err := p.apiKeyExistsInternal(apiKey.KeyID)
  873. if err != nil {
  874. return err
  875. }
  876. delete(p.dbHandle.apiKeys, apiKey.KeyID)
  877. p.updateAPIKeysOrdering()
  878. return nil
  879. }
  880. func (p *MemoryProvider) getAPIKeys(limit int, offset int, order string) ([]APIKey, error) {
  881. apiKeys := make([]APIKey, 0, limit)
  882. p.dbHandle.Lock()
  883. defer p.dbHandle.Unlock()
  884. if p.dbHandle.isClosed {
  885. return apiKeys, errMemoryProviderClosed
  886. }
  887. if limit <= 0 {
  888. return apiKeys, nil
  889. }
  890. itNum := 0
  891. if order == OrderDESC {
  892. for i := len(p.dbHandle.apiKeysIDs) - 1; i >= 0; i-- {
  893. itNum++
  894. if itNum <= offset {
  895. continue
  896. }
  897. keyID := p.dbHandle.apiKeysIDs[i]
  898. k := p.dbHandle.apiKeys[keyID]
  899. apiKey := k.getACopy()
  900. apiKey.HideConfidentialData()
  901. apiKeys = append(apiKeys, apiKey)
  902. if len(apiKeys) >= limit {
  903. break
  904. }
  905. }
  906. } else {
  907. for _, keyID := range p.dbHandle.apiKeysIDs {
  908. itNum++
  909. if itNum <= offset {
  910. continue
  911. }
  912. k := p.dbHandle.apiKeys[keyID]
  913. apiKey := k.getACopy()
  914. apiKey.HideConfidentialData()
  915. apiKeys = append(apiKeys, apiKey)
  916. if len(apiKeys) >= limit {
  917. break
  918. }
  919. }
  920. }
  921. return apiKeys, nil
  922. }
  923. func (p *MemoryProvider) dumpAPIKeys() ([]APIKey, error) {
  924. p.dbHandle.Lock()
  925. defer p.dbHandle.Unlock()
  926. apiKeys := make([]APIKey, 0, len(p.dbHandle.apiKeys))
  927. if p.dbHandle.isClosed {
  928. return apiKeys, errMemoryProviderClosed
  929. }
  930. for _, k := range p.dbHandle.apiKeys {
  931. apiKeys = append(apiKeys, k)
  932. }
  933. return apiKeys, nil
  934. }
  935. func (p *MemoryProvider) deleteAPIKeysWithUser(username string) {
  936. found := false
  937. for k, v := range p.dbHandle.apiKeys {
  938. if v.User == username {
  939. delete(p.dbHandle.apiKeys, k)
  940. found = true
  941. }
  942. }
  943. if found {
  944. p.updateAPIKeysOrdering()
  945. }
  946. }
  947. func (p *MemoryProvider) deleteAPIKeysWithAdmin(username string) {
  948. found := false
  949. for k, v := range p.dbHandle.apiKeys {
  950. if v.Admin == username {
  951. delete(p.dbHandle.apiKeys, k)
  952. found = true
  953. }
  954. }
  955. if found {
  956. p.updateAPIKeysOrdering()
  957. }
  958. }
  959. func (p *MemoryProvider) deleteSharesWithUser(username string) {
  960. found := false
  961. for k, v := range p.dbHandle.shares {
  962. if v.Username == username {
  963. delete(p.dbHandle.shares, k)
  964. found = true
  965. }
  966. }
  967. if found {
  968. p.updateSharesOrdering()
  969. }
  970. }
  971. func (p *MemoryProvider) updateAPIKeysOrdering() {
  972. // this could be more efficient
  973. p.dbHandle.apiKeysIDs = make([]string, 0, len(p.dbHandle.apiKeys))
  974. for keyID := range p.dbHandle.apiKeys {
  975. p.dbHandle.apiKeysIDs = append(p.dbHandle.apiKeysIDs, keyID)
  976. }
  977. sort.Strings(p.dbHandle.apiKeysIDs)
  978. }
  979. func (p *MemoryProvider) updateSharesOrdering() {
  980. // this could be more efficient
  981. p.dbHandle.sharesIDs = make([]string, 0, len(p.dbHandle.shares))
  982. for shareID := range p.dbHandle.shares {
  983. p.dbHandle.sharesIDs = append(p.dbHandle.sharesIDs, shareID)
  984. }
  985. sort.Strings(p.dbHandle.sharesIDs)
  986. }
  987. func (p *MemoryProvider) shareExistsInternal(shareID, username string) (Share, error) {
  988. if val, ok := p.dbHandle.shares[shareID]; ok {
  989. if username != "" && val.Username != username {
  990. return Share{}, util.NewRecordNotFoundError(fmt.Sprintf("Share %#v does not exist", shareID))
  991. }
  992. return val.getACopy(), nil
  993. }
  994. return Share{}, util.NewRecordNotFoundError(fmt.Sprintf("Share %#v does not exist", shareID))
  995. }
  996. func (p *MemoryProvider) shareExists(shareID, username string) (Share, error) {
  997. p.dbHandle.Lock()
  998. defer p.dbHandle.Unlock()
  999. if p.dbHandle.isClosed {
  1000. return Share{}, errMemoryProviderClosed
  1001. }
  1002. return p.shareExistsInternal(shareID, username)
  1003. }
  1004. func (p *MemoryProvider) addShare(share *Share) error {
  1005. err := share.validate()
  1006. if err != nil {
  1007. return err
  1008. }
  1009. p.dbHandle.Lock()
  1010. defer p.dbHandle.Unlock()
  1011. if p.dbHandle.isClosed {
  1012. return errMemoryProviderClosed
  1013. }
  1014. _, err = p.shareExistsInternal(share.ShareID, share.Username)
  1015. if err == nil {
  1016. return fmt.Errorf("share %#v already exists", share.ShareID)
  1017. }
  1018. if _, err := p.userExistsInternal(share.Username); err != nil {
  1019. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", share.Username))
  1020. }
  1021. if !share.IsRestore {
  1022. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1023. share.UpdatedAt = share.CreatedAt
  1024. share.LastUseAt = 0
  1025. share.UsedTokens = 0
  1026. }
  1027. if share.CreatedAt == 0 {
  1028. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1029. }
  1030. if share.UpdatedAt == 0 {
  1031. share.UpdatedAt = share.CreatedAt
  1032. }
  1033. p.dbHandle.shares[share.ShareID] = share.getACopy()
  1034. p.dbHandle.sharesIDs = append(p.dbHandle.sharesIDs, share.ShareID)
  1035. sort.Strings(p.dbHandle.sharesIDs)
  1036. return nil
  1037. }
  1038. func (p *MemoryProvider) updateShare(share *Share) error {
  1039. err := share.validate()
  1040. if err != nil {
  1041. return err
  1042. }
  1043. p.dbHandle.Lock()
  1044. defer p.dbHandle.Unlock()
  1045. if p.dbHandle.isClosed {
  1046. return errMemoryProviderClosed
  1047. }
  1048. s, err := p.shareExistsInternal(share.ShareID, share.Username)
  1049. if err != nil {
  1050. return err
  1051. }
  1052. if _, err := p.userExistsInternal(share.Username); err != nil {
  1053. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", share.Username))
  1054. }
  1055. share.ID = s.ID
  1056. share.ShareID = s.ShareID
  1057. if !share.IsRestore {
  1058. share.UsedTokens = s.UsedTokens
  1059. share.CreatedAt = s.CreatedAt
  1060. share.LastUseAt = s.LastUseAt
  1061. share.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1062. }
  1063. if share.CreatedAt == 0 {
  1064. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1065. }
  1066. if share.UpdatedAt == 0 {
  1067. share.UpdatedAt = share.CreatedAt
  1068. }
  1069. p.dbHandle.shares[share.ShareID] = share.getACopy()
  1070. return nil
  1071. }
  1072. func (p *MemoryProvider) deleteShare(share *Share) error {
  1073. p.dbHandle.Lock()
  1074. defer p.dbHandle.Unlock()
  1075. if p.dbHandle.isClosed {
  1076. return errMemoryProviderClosed
  1077. }
  1078. _, err := p.shareExistsInternal(share.ShareID, share.Username)
  1079. if err != nil {
  1080. return err
  1081. }
  1082. delete(p.dbHandle.shares, share.ShareID)
  1083. p.updateSharesOrdering()
  1084. return nil
  1085. }
  1086. func (p *MemoryProvider) getShares(limit int, offset int, order, username string) ([]Share, error) {
  1087. p.dbHandle.Lock()
  1088. defer p.dbHandle.Unlock()
  1089. if p.dbHandle.isClosed {
  1090. return []Share{}, errMemoryProviderClosed
  1091. }
  1092. if limit <= 0 {
  1093. return []Share{}, nil
  1094. }
  1095. shares := make([]Share, 0, limit)
  1096. itNum := 0
  1097. if order == OrderDESC {
  1098. for i := len(p.dbHandle.sharesIDs) - 1; i >= 0; i-- {
  1099. shareID := p.dbHandle.sharesIDs[i]
  1100. s := p.dbHandle.shares[shareID]
  1101. if s.Username != username {
  1102. continue
  1103. }
  1104. itNum++
  1105. if itNum <= offset {
  1106. continue
  1107. }
  1108. share := s.getACopy()
  1109. share.HideConfidentialData()
  1110. shares = append(shares, share)
  1111. if len(shares) >= limit {
  1112. break
  1113. }
  1114. }
  1115. } else {
  1116. for _, shareID := range p.dbHandle.sharesIDs {
  1117. s := p.dbHandle.shares[shareID]
  1118. if s.Username != username {
  1119. continue
  1120. }
  1121. itNum++
  1122. if itNum <= offset {
  1123. continue
  1124. }
  1125. share := s.getACopy()
  1126. share.HideConfidentialData()
  1127. shares = append(shares, share)
  1128. if len(shares) >= limit {
  1129. break
  1130. }
  1131. }
  1132. }
  1133. return shares, nil
  1134. }
  1135. func (p *MemoryProvider) dumpShares() ([]Share, error) {
  1136. p.dbHandle.Lock()
  1137. defer p.dbHandle.Unlock()
  1138. shares := make([]Share, 0, len(p.dbHandle.shares))
  1139. if p.dbHandle.isClosed {
  1140. return shares, errMemoryProviderClosed
  1141. }
  1142. for _, s := range p.dbHandle.shares {
  1143. shares = append(shares, s)
  1144. }
  1145. return shares, nil
  1146. }
  1147. func (p *MemoryProvider) updateShareLastUse(shareID string, numTokens int) error {
  1148. p.dbHandle.Lock()
  1149. defer p.dbHandle.Unlock()
  1150. if p.dbHandle.isClosed {
  1151. return errMemoryProviderClosed
  1152. }
  1153. share, err := p.shareExistsInternal(shareID, "")
  1154. if err != nil {
  1155. return err
  1156. }
  1157. share.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1158. share.UsedTokens += numTokens
  1159. p.dbHandle.shares[share.ShareID] = share
  1160. return nil
  1161. }
  1162. func (p *MemoryProvider) getDefenderHosts(from int64, limit int) ([]*DefenderEntry, error) {
  1163. return nil, ErrNotImplemented
  1164. }
  1165. func (p *MemoryProvider) getDefenderHostByIP(ip string, from int64) (*DefenderEntry, error) {
  1166. return nil, ErrNotImplemented
  1167. }
  1168. func (p *MemoryProvider) isDefenderHostBanned(ip string) (*DefenderEntry, error) {
  1169. return nil, ErrNotImplemented
  1170. }
  1171. func (p *MemoryProvider) updateDefenderBanTime(ip string, minutes int) error {
  1172. return ErrNotImplemented
  1173. }
  1174. func (p *MemoryProvider) deleteDefenderHost(ip string) error {
  1175. return ErrNotImplemented
  1176. }
  1177. func (p *MemoryProvider) addDefenderEvent(ip string, score int) error {
  1178. return ErrNotImplemented
  1179. }
  1180. func (p *MemoryProvider) setDefenderBanTime(ip string, banTime int64) error {
  1181. return ErrNotImplemented
  1182. }
  1183. func (p *MemoryProvider) cleanupDefender(from int64) error {
  1184. return ErrNotImplemented
  1185. }
  1186. func (p *MemoryProvider) getNextID() int64 {
  1187. nextID := int64(1)
  1188. for _, v := range p.dbHandle.users {
  1189. if v.ID >= nextID {
  1190. nextID = v.ID + 1
  1191. }
  1192. }
  1193. return nextID
  1194. }
  1195. func (p *MemoryProvider) getNextFolderID() int64 {
  1196. nextID := int64(1)
  1197. for _, v := range p.dbHandle.vfolders {
  1198. if v.ID >= nextID {
  1199. nextID = v.ID + 1
  1200. }
  1201. }
  1202. return nextID
  1203. }
  1204. func (p *MemoryProvider) getNextAdminID() int64 {
  1205. nextID := int64(1)
  1206. for _, a := range p.dbHandle.admins {
  1207. if a.ID >= nextID {
  1208. nextID = a.ID + 1
  1209. }
  1210. }
  1211. return nextID
  1212. }
  1213. func (p *MemoryProvider) clear() {
  1214. p.dbHandle.Lock()
  1215. defer p.dbHandle.Unlock()
  1216. p.dbHandle.usernames = []string{}
  1217. p.dbHandle.users = make(map[string]User)
  1218. p.dbHandle.vfoldersNames = []string{}
  1219. p.dbHandle.vfolders = make(map[string]vfs.BaseVirtualFolder)
  1220. p.dbHandle.admins = make(map[string]Admin)
  1221. p.dbHandle.adminsUsernames = []string{}
  1222. p.dbHandle.apiKeys = make(map[string]APIKey)
  1223. p.dbHandle.apiKeysIDs = []string{}
  1224. p.dbHandle.shares = make(map[string]Share)
  1225. p.dbHandle.sharesIDs = []string{}
  1226. }
  1227. func (p *MemoryProvider) reloadConfig() error {
  1228. if p.dbHandle.configFile == "" {
  1229. providerLog(logger.LevelDebug, "no dump configuration file defined")
  1230. return nil
  1231. }
  1232. providerLog(logger.LevelDebug, "loading dump from file: %#v", p.dbHandle.configFile)
  1233. fi, err := os.Stat(p.dbHandle.configFile)
  1234. if err != nil {
  1235. providerLog(logger.LevelError, "error loading dump: %v", err)
  1236. return err
  1237. }
  1238. if fi.Size() == 0 {
  1239. err = errors.New("dump configuration file is invalid, its size must be > 0")
  1240. providerLog(logger.LevelError, "error loading dump: %v", err)
  1241. return err
  1242. }
  1243. if fi.Size() > 10485760 {
  1244. err = errors.New("dump configuration file is invalid, its size must be <= 10485760 bytes")
  1245. providerLog(logger.LevelError, "error loading dump: %v", err)
  1246. return err
  1247. }
  1248. content, err := os.ReadFile(p.dbHandle.configFile)
  1249. if err != nil {
  1250. providerLog(logger.LevelError, "error loading dump: %v", err)
  1251. return err
  1252. }
  1253. dump, err := ParseDumpData(content)
  1254. if err != nil {
  1255. providerLog(logger.LevelError, "error loading dump: %v", err)
  1256. return err
  1257. }
  1258. p.clear()
  1259. if err := p.restoreFolders(&dump); err != nil {
  1260. return err
  1261. }
  1262. if err := p.restoreUsers(&dump); err != nil {
  1263. return err
  1264. }
  1265. if err := p.restoreAdmins(&dump); err != nil {
  1266. return err
  1267. }
  1268. if err := p.restoreAPIKeys(&dump); err != nil {
  1269. return err
  1270. }
  1271. if err := p.restoreShares(&dump); err != nil {
  1272. return err
  1273. }
  1274. providerLog(logger.LevelDebug, "config loaded from file: %#v", p.dbHandle.configFile)
  1275. return nil
  1276. }
  1277. func (p *MemoryProvider) restoreShares(dump *BackupData) error {
  1278. for _, share := range dump.Shares {
  1279. s, err := p.shareExists(share.ShareID, "")
  1280. share := share // pin
  1281. share.IsRestore = true
  1282. if err == nil {
  1283. share.ID = s.ID
  1284. err = UpdateShare(&share, ActionExecutorSystem, "")
  1285. if err != nil {
  1286. providerLog(logger.LevelError, "error updating share %#v: %v", share.ShareID, err)
  1287. return err
  1288. }
  1289. } else {
  1290. err = AddShare(&share, ActionExecutorSystem, "")
  1291. if err != nil {
  1292. providerLog(logger.LevelError, "error adding share %#v: %v", share.ShareID, err)
  1293. return err
  1294. }
  1295. }
  1296. }
  1297. return nil
  1298. }
  1299. func (p *MemoryProvider) restoreAPIKeys(dump *BackupData) error {
  1300. for _, apiKey := range dump.APIKeys {
  1301. if apiKey.Key == "" {
  1302. return fmt.Errorf("cannot restore an empty API key: %+v", apiKey)
  1303. }
  1304. k, err := p.apiKeyExists(apiKey.KeyID)
  1305. apiKey := apiKey // pin
  1306. if err == nil {
  1307. apiKey.ID = k.ID
  1308. err = UpdateAPIKey(&apiKey, ActionExecutorSystem, "")
  1309. if err != nil {
  1310. providerLog(logger.LevelError, "error updating API key %#v: %v", apiKey.KeyID, err)
  1311. return err
  1312. }
  1313. } else {
  1314. err = AddAPIKey(&apiKey, ActionExecutorSystem, "")
  1315. if err != nil {
  1316. providerLog(logger.LevelError, "error adding API key %#v: %v", apiKey.KeyID, err)
  1317. return err
  1318. }
  1319. }
  1320. }
  1321. return nil
  1322. }
  1323. func (p *MemoryProvider) restoreAdmins(dump *BackupData) error {
  1324. for _, admin := range dump.Admins {
  1325. a, err := p.adminExists(admin.Username)
  1326. admin := admin // pin
  1327. if err == nil {
  1328. admin.ID = a.ID
  1329. err = UpdateAdmin(&admin, ActionExecutorSystem, "")
  1330. if err != nil {
  1331. providerLog(logger.LevelError, "error updating admin %#v: %v", admin.Username, err)
  1332. return err
  1333. }
  1334. } else {
  1335. err = AddAdmin(&admin, ActionExecutorSystem, "")
  1336. if err != nil {
  1337. providerLog(logger.LevelError, "error adding admin %#v: %v", admin.Username, err)
  1338. return err
  1339. }
  1340. }
  1341. }
  1342. return nil
  1343. }
  1344. func (p *MemoryProvider) restoreFolders(dump *BackupData) error {
  1345. for _, folder := range dump.Folders {
  1346. folder := folder // pin
  1347. f, err := p.getFolderByName(folder.Name)
  1348. if err == nil {
  1349. folder.ID = f.ID
  1350. err = UpdateFolder(&folder, f.Users, ActionExecutorSystem, "")
  1351. if err != nil {
  1352. providerLog(logger.LevelError, "error updating folder %#v: %v", folder.Name, err)
  1353. return err
  1354. }
  1355. } else {
  1356. folder.Users = nil
  1357. err = AddFolder(&folder)
  1358. if err != nil {
  1359. providerLog(logger.LevelError, "error adding folder %#v: %v", folder.Name, err)
  1360. return err
  1361. }
  1362. }
  1363. }
  1364. return nil
  1365. }
  1366. func (p *MemoryProvider) restoreUsers(dump *BackupData) error {
  1367. for _, user := range dump.Users {
  1368. user := user // pin
  1369. u, err := p.userExists(user.Username)
  1370. if err == nil {
  1371. user.ID = u.ID
  1372. err = UpdateUser(&user, ActionExecutorSystem, "")
  1373. if err != nil {
  1374. providerLog(logger.LevelError, "error updating user %#v: %v", user.Username, err)
  1375. return err
  1376. }
  1377. } else {
  1378. err = AddUser(&user, ActionExecutorSystem, "")
  1379. if err != nil {
  1380. providerLog(logger.LevelError, "error adding user %#v: %v", user.Username, err)
  1381. return err
  1382. }
  1383. }
  1384. }
  1385. return nil
  1386. }
  1387. // initializeDatabase does nothing, no initilization is needed for memory provider
  1388. func (p *MemoryProvider) initializeDatabase() error {
  1389. return ErrNoInitRequired
  1390. }
  1391. func (p *MemoryProvider) migrateDatabase() error {
  1392. return ErrNoInitRequired
  1393. }
  1394. func (p *MemoryProvider) revertDatabase(targetVersion int) error {
  1395. return errors.New("memory provider does not store data, revert not possible")
  1396. }
  1397. func (p *MemoryProvider) resetDatabase() error {
  1398. return errors.New("memory provider does not store data, reset not possible")
  1399. }