memory.go 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058
  1. // Copyright (C) 2019-2022 Nicola Murino
  2. //
  3. // This program is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU Affero General Public License as published
  5. // by the Free Software Foundation, version 3.
  6. //
  7. // This program is distributed in the hope that it will be useful,
  8. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. // GNU Affero General Public License for more details.
  11. //
  12. // You should have received a copy of the GNU Affero General Public License
  13. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. package dataprovider
  15. import (
  16. "crypto/x509"
  17. "errors"
  18. "fmt"
  19. "os"
  20. "path/filepath"
  21. "sort"
  22. "sync"
  23. "time"
  24. "github.com/drakkan/sftpgo/v2/logger"
  25. "github.com/drakkan/sftpgo/v2/util"
  26. "github.com/drakkan/sftpgo/v2/vfs"
  27. )
  28. var (
  29. errMemoryProviderClosed = errors.New("memory provider is closed")
  30. )
  31. type memoryProviderHandle struct {
  32. // configuration file to use for loading users
  33. configFile string
  34. sync.Mutex
  35. isClosed bool
  36. // slice with ordered usernames
  37. usernames []string
  38. // map for users, username is the key
  39. users map[string]User
  40. // slice with ordered group names
  41. groupnames []string
  42. // map for group, group name is the key
  43. groups map[string]Group
  44. // map for virtual folders, folder name is the key
  45. vfolders map[string]vfs.BaseVirtualFolder
  46. // slice with ordered folder names
  47. vfoldersNames []string
  48. // map for admins, username is the key
  49. admins map[string]Admin
  50. // slice with ordered admins
  51. adminsUsernames []string
  52. // map for API keys, keyID is the key
  53. apiKeys map[string]APIKey
  54. // slice with ordered API keys KeyID
  55. apiKeysIDs []string
  56. // map for shares, shareID is the key
  57. shares map[string]Share
  58. // slice with ordered shares shareID
  59. sharesIDs []string
  60. }
  61. // MemoryProvider defines the auth provider for a memory store
  62. type MemoryProvider struct {
  63. dbHandle *memoryProviderHandle
  64. }
  65. func initializeMemoryProvider(basePath string) {
  66. configFile := ""
  67. if util.IsFileInputValid(config.Name) {
  68. configFile = config.Name
  69. if !filepath.IsAbs(configFile) {
  70. configFile = filepath.Join(basePath, configFile)
  71. }
  72. }
  73. provider = &MemoryProvider{
  74. dbHandle: &memoryProviderHandle{
  75. isClosed: false,
  76. usernames: []string{},
  77. users: make(map[string]User),
  78. groupnames: []string{},
  79. groups: make(map[string]Group),
  80. vfolders: make(map[string]vfs.BaseVirtualFolder),
  81. vfoldersNames: []string{},
  82. admins: make(map[string]Admin),
  83. adminsUsernames: []string{},
  84. apiKeys: make(map[string]APIKey),
  85. apiKeysIDs: []string{},
  86. shares: make(map[string]Share),
  87. sharesIDs: []string{},
  88. configFile: configFile,
  89. },
  90. }
  91. if err := provider.reloadConfig(); err != nil {
  92. logger.Error(logSender, "", "unable to load initial data: %v", err)
  93. logger.ErrorToConsole("unable to load initial data: %v", err)
  94. }
  95. }
  96. func (p *MemoryProvider) checkAvailability() error {
  97. p.dbHandle.Lock()
  98. defer p.dbHandle.Unlock()
  99. if p.dbHandle.isClosed {
  100. return errMemoryProviderClosed
  101. }
  102. return nil
  103. }
  104. func (p *MemoryProvider) close() error {
  105. p.dbHandle.Lock()
  106. defer p.dbHandle.Unlock()
  107. if p.dbHandle.isClosed {
  108. return errMemoryProviderClosed
  109. }
  110. p.dbHandle.isClosed = true
  111. return nil
  112. }
  113. func (p *MemoryProvider) validateUserAndTLSCert(username, protocol string, tlsCert *x509.Certificate) (User, error) {
  114. var user User
  115. if tlsCert == nil {
  116. return user, errors.New("TLS certificate cannot be null or empty")
  117. }
  118. user, err := p.userExists(username)
  119. if err != nil {
  120. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  121. return user, err
  122. }
  123. return checkUserAndTLSCertificate(&user, protocol, tlsCert)
  124. }
  125. func (p *MemoryProvider) validateUserAndPass(username, password, ip, protocol string) (User, error) {
  126. var user User
  127. if password == "" {
  128. return user, errors.New("credentials cannot be null or empty")
  129. }
  130. user, err := p.userExists(username)
  131. if err != nil {
  132. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  133. return user, err
  134. }
  135. return checkUserAndPass(&user, password, ip, protocol)
  136. }
  137. func (p *MemoryProvider) validateUserAndPubKey(username string, pubKey []byte, isSSHCert bool) (User, string, error) {
  138. var user User
  139. if len(pubKey) == 0 {
  140. return user, "", errors.New("credentials cannot be null or empty")
  141. }
  142. user, err := p.userExists(username)
  143. if err != nil {
  144. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  145. return user, "", err
  146. }
  147. return checkUserAndPubKey(&user, pubKey, isSSHCert)
  148. }
  149. func (p *MemoryProvider) validateAdminAndPass(username, password, ip string) (Admin, error) {
  150. admin, err := p.adminExists(username)
  151. if err != nil {
  152. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  153. return admin, ErrInvalidCredentials
  154. }
  155. err = admin.checkUserAndPass(password, ip)
  156. return admin, err
  157. }
  158. func (p *MemoryProvider) updateAPIKeyLastUse(keyID string) error {
  159. p.dbHandle.Lock()
  160. defer p.dbHandle.Unlock()
  161. if p.dbHandle.isClosed {
  162. return errMemoryProviderClosed
  163. }
  164. apiKey, err := p.apiKeyExistsInternal(keyID)
  165. if err != nil {
  166. return err
  167. }
  168. apiKey.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  169. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey
  170. return nil
  171. }
  172. func (p *MemoryProvider) setUpdatedAt(username string) {
  173. p.dbHandle.Lock()
  174. defer p.dbHandle.Unlock()
  175. if p.dbHandle.isClosed {
  176. return
  177. }
  178. user, err := p.userExistsInternal(username)
  179. if err != nil {
  180. return
  181. }
  182. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  183. p.dbHandle.users[user.Username] = user
  184. setLastUserUpdate()
  185. }
  186. func (p *MemoryProvider) updateLastLogin(username string) error {
  187. p.dbHandle.Lock()
  188. defer p.dbHandle.Unlock()
  189. if p.dbHandle.isClosed {
  190. return errMemoryProviderClosed
  191. }
  192. user, err := p.userExistsInternal(username)
  193. if err != nil {
  194. return err
  195. }
  196. user.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  197. p.dbHandle.users[user.Username] = user
  198. return nil
  199. }
  200. func (p *MemoryProvider) updateAdminLastLogin(username string) error {
  201. p.dbHandle.Lock()
  202. defer p.dbHandle.Unlock()
  203. if p.dbHandle.isClosed {
  204. return errMemoryProviderClosed
  205. }
  206. admin, err := p.adminExistsInternal(username)
  207. if err != nil {
  208. return err
  209. }
  210. admin.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  211. p.dbHandle.admins[admin.Username] = admin
  212. return nil
  213. }
  214. func (p *MemoryProvider) updateTransferQuota(username string, uploadSize, downloadSize int64, reset bool) error {
  215. p.dbHandle.Lock()
  216. defer p.dbHandle.Unlock()
  217. if p.dbHandle.isClosed {
  218. return errMemoryProviderClosed
  219. }
  220. user, err := p.userExistsInternal(username)
  221. if err != nil {
  222. providerLog(logger.LevelError, "unable to update transfer quota for user %#v error: %v", username, err)
  223. return err
  224. }
  225. if reset {
  226. user.UsedUploadDataTransfer = uploadSize
  227. user.UsedDownloadDataTransfer = downloadSize
  228. } else {
  229. user.UsedUploadDataTransfer += uploadSize
  230. user.UsedDownloadDataTransfer += downloadSize
  231. }
  232. user.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  233. providerLog(logger.LevelDebug, "transfer quota updated for user %#v, ul increment: %v dl increment: %v is reset? %v",
  234. username, uploadSize, downloadSize, reset)
  235. p.dbHandle.users[user.Username] = user
  236. return nil
  237. }
  238. func (p *MemoryProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  239. p.dbHandle.Lock()
  240. defer p.dbHandle.Unlock()
  241. if p.dbHandle.isClosed {
  242. return errMemoryProviderClosed
  243. }
  244. user, err := p.userExistsInternal(username)
  245. if err != nil {
  246. providerLog(logger.LevelError, "unable to update quota for user %#v error: %v", username, err)
  247. return err
  248. }
  249. if reset {
  250. user.UsedQuotaSize = sizeAdd
  251. user.UsedQuotaFiles = filesAdd
  252. } else {
  253. user.UsedQuotaSize += sizeAdd
  254. user.UsedQuotaFiles += filesAdd
  255. }
  256. user.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  257. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  258. username, filesAdd, sizeAdd, reset)
  259. p.dbHandle.users[user.Username] = user
  260. return nil
  261. }
  262. func (p *MemoryProvider) getUsedQuota(username string) (int, int64, int64, int64, error) {
  263. p.dbHandle.Lock()
  264. defer p.dbHandle.Unlock()
  265. if p.dbHandle.isClosed {
  266. return 0, 0, 0, 0, errMemoryProviderClosed
  267. }
  268. user, err := p.userExistsInternal(username)
  269. if err != nil {
  270. providerLog(logger.LevelError, "unable to get quota for user %#v error: %v", username, err)
  271. return 0, 0, 0, 0, err
  272. }
  273. return user.UsedQuotaFiles, user.UsedQuotaSize, user.UsedUploadDataTransfer, user.UsedDownloadDataTransfer, err
  274. }
  275. func (p *MemoryProvider) addUser(user *User) error {
  276. // we can query virtual folder while validating a user
  277. // so we have to check without holding the lock
  278. err := ValidateUser(user)
  279. if err != nil {
  280. return err
  281. }
  282. p.dbHandle.Lock()
  283. defer p.dbHandle.Unlock()
  284. if p.dbHandle.isClosed {
  285. return errMemoryProviderClosed
  286. }
  287. _, err = p.userExistsInternal(user.Username)
  288. if err == nil {
  289. return fmt.Errorf("username %#v already exists", user.Username)
  290. }
  291. user.ID = p.getNextID()
  292. user.LastQuotaUpdate = 0
  293. user.UsedQuotaSize = 0
  294. user.UsedQuotaFiles = 0
  295. user.UsedUploadDataTransfer = 0
  296. user.UsedDownloadDataTransfer = 0
  297. user.LastLogin = 0
  298. user.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  299. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  300. user.VirtualFolders = p.joinUserVirtualFoldersFields(user)
  301. for idx := range user.Groups {
  302. if err = p.addUserFromGroupMapping(user.Username, user.Groups[idx].Name); err != nil {
  303. return err
  304. }
  305. }
  306. p.dbHandle.users[user.Username] = user.getACopy()
  307. p.dbHandle.usernames = append(p.dbHandle.usernames, user.Username)
  308. sort.Strings(p.dbHandle.usernames)
  309. return nil
  310. }
  311. func (p *MemoryProvider) updateUser(user *User) error {
  312. // we can query virtual folder while validating a user
  313. // so we have to check without holding the lock
  314. err := ValidateUser(user)
  315. if err != nil {
  316. return err
  317. }
  318. p.dbHandle.Lock()
  319. defer p.dbHandle.Unlock()
  320. if p.dbHandle.isClosed {
  321. return errMemoryProviderClosed
  322. }
  323. u, err := p.userExistsInternal(user.Username)
  324. if err != nil {
  325. return err
  326. }
  327. for _, oldFolder := range u.VirtualFolders {
  328. p.removeRelationFromFolderMapping(oldFolder.Name, u.Username, "")
  329. }
  330. for idx := range u.Groups {
  331. if err = p.removeUserFromGroupMapping(u.Username, u.Groups[idx].Name); err != nil {
  332. return err
  333. }
  334. }
  335. user.VirtualFolders = p.joinUserVirtualFoldersFields(user)
  336. for idx := range user.Groups {
  337. if err = p.addUserFromGroupMapping(user.Username, user.Groups[idx].Name); err != nil {
  338. return err
  339. }
  340. }
  341. user.LastQuotaUpdate = u.LastQuotaUpdate
  342. user.UsedQuotaSize = u.UsedQuotaSize
  343. user.UsedQuotaFiles = u.UsedQuotaFiles
  344. user.UsedUploadDataTransfer = u.UsedUploadDataTransfer
  345. user.UsedDownloadDataTransfer = u.UsedDownloadDataTransfer
  346. user.LastLogin = u.LastLogin
  347. user.CreatedAt = u.CreatedAt
  348. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  349. user.ID = u.ID
  350. // pre-login and external auth hook will use the passed *user so save a copy
  351. p.dbHandle.users[user.Username] = user.getACopy()
  352. setLastUserUpdate()
  353. return nil
  354. }
  355. func (p *MemoryProvider) deleteUser(user User) error {
  356. p.dbHandle.Lock()
  357. defer p.dbHandle.Unlock()
  358. if p.dbHandle.isClosed {
  359. return errMemoryProviderClosed
  360. }
  361. u, err := p.userExistsInternal(user.Username)
  362. if err != nil {
  363. return err
  364. }
  365. for _, oldFolder := range u.VirtualFolders {
  366. p.removeRelationFromFolderMapping(oldFolder.Name, u.Username, "")
  367. }
  368. for idx := range u.Groups {
  369. if err = p.removeUserFromGroupMapping(u.Username, u.Groups[idx].Name); err != nil {
  370. return err
  371. }
  372. }
  373. delete(p.dbHandle.users, user.Username)
  374. // this could be more efficient
  375. p.dbHandle.usernames = make([]string, 0, len(p.dbHandle.users))
  376. for username := range p.dbHandle.users {
  377. p.dbHandle.usernames = append(p.dbHandle.usernames, username)
  378. }
  379. sort.Strings(p.dbHandle.usernames)
  380. p.deleteAPIKeysWithUser(user.Username)
  381. p.deleteSharesWithUser(user.Username)
  382. return nil
  383. }
  384. func (p *MemoryProvider) updateUserPassword(username, password string) error {
  385. p.dbHandle.Lock()
  386. defer p.dbHandle.Unlock()
  387. if p.dbHandle.isClosed {
  388. return errMemoryProviderClosed
  389. }
  390. user, err := p.userExistsInternal(username)
  391. if err != nil {
  392. return err
  393. }
  394. user.Password = password
  395. p.dbHandle.users[username] = user
  396. return nil
  397. }
  398. func (p *MemoryProvider) dumpUsers() ([]User, error) {
  399. p.dbHandle.Lock()
  400. defer p.dbHandle.Unlock()
  401. users := make([]User, 0, len(p.dbHandle.usernames))
  402. var err error
  403. if p.dbHandle.isClosed {
  404. return users, errMemoryProviderClosed
  405. }
  406. for _, username := range p.dbHandle.usernames {
  407. u := p.dbHandle.users[username]
  408. user := u.getACopy()
  409. p.addVirtualFoldersToUser(&user)
  410. users = append(users, user)
  411. }
  412. return users, err
  413. }
  414. func (p *MemoryProvider) dumpFolders() ([]vfs.BaseVirtualFolder, error) {
  415. p.dbHandle.Lock()
  416. defer p.dbHandle.Unlock()
  417. folders := make([]vfs.BaseVirtualFolder, 0, len(p.dbHandle.vfoldersNames))
  418. if p.dbHandle.isClosed {
  419. return folders, errMemoryProviderClosed
  420. }
  421. for _, f := range p.dbHandle.vfolders {
  422. folders = append(folders, f)
  423. }
  424. return folders, nil
  425. }
  426. func (p *MemoryProvider) getRecentlyUpdatedUsers(after int64) ([]User, error) {
  427. if getLastUserUpdate() < after {
  428. return nil, nil
  429. }
  430. p.dbHandle.Lock()
  431. defer p.dbHandle.Unlock()
  432. if p.dbHandle.isClosed {
  433. return nil, errMemoryProviderClosed
  434. }
  435. users := make([]User, 0, 10)
  436. for _, username := range p.dbHandle.usernames {
  437. u := p.dbHandle.users[username]
  438. if u.UpdatedAt < after {
  439. continue
  440. }
  441. user := u.getACopy()
  442. p.addVirtualFoldersToUser(&user)
  443. if len(user.Groups) > 0 {
  444. groupMapping := make(map[string]Group)
  445. for idx := range user.Groups {
  446. group, err := p.groupExistsInternal(user.Groups[idx].Name)
  447. if err != nil {
  448. continue
  449. }
  450. groupMapping[group.Name] = group
  451. }
  452. user.applyGroupSettings(groupMapping)
  453. }
  454. user.SetEmptySecretsIfNil()
  455. users = append(users, user)
  456. }
  457. return users, nil
  458. }
  459. func (p *MemoryProvider) getUsersForQuotaCheck(toFetch map[string]bool) ([]User, error) {
  460. users := make([]User, 0, 30)
  461. p.dbHandle.Lock()
  462. defer p.dbHandle.Unlock()
  463. if p.dbHandle.isClosed {
  464. return users, errMemoryProviderClosed
  465. }
  466. for _, username := range p.dbHandle.usernames {
  467. if needFolders, ok := toFetch[username]; ok {
  468. u := p.dbHandle.users[username]
  469. user := u.getACopy()
  470. if needFolders {
  471. p.addVirtualFoldersToUser(&user)
  472. }
  473. if len(user.Groups) > 0 {
  474. groupMapping := make(map[string]Group)
  475. for idx := range user.Groups {
  476. group, err := p.groupExistsInternal(user.Groups[idx].Name)
  477. if err != nil {
  478. continue
  479. }
  480. groupMapping[group.Name] = group
  481. }
  482. user.applyGroupSettings(groupMapping)
  483. }
  484. user.SetEmptySecretsIfNil()
  485. user.PrepareForRendering()
  486. users = append(users, user)
  487. }
  488. }
  489. return users, nil
  490. }
  491. func (p *MemoryProvider) getUsers(limit int, offset int, order string) ([]User, error) {
  492. users := make([]User, 0, limit)
  493. var err error
  494. p.dbHandle.Lock()
  495. defer p.dbHandle.Unlock()
  496. if p.dbHandle.isClosed {
  497. return users, errMemoryProviderClosed
  498. }
  499. if limit <= 0 {
  500. return users, err
  501. }
  502. itNum := 0
  503. if order == OrderASC {
  504. for _, username := range p.dbHandle.usernames {
  505. itNum++
  506. if itNum <= offset {
  507. continue
  508. }
  509. u := p.dbHandle.users[username]
  510. user := u.getACopy()
  511. p.addVirtualFoldersToUser(&user)
  512. user.PrepareForRendering()
  513. users = append(users, user)
  514. if len(users) >= limit {
  515. break
  516. }
  517. }
  518. } else {
  519. for i := len(p.dbHandle.usernames) - 1; i >= 0; i-- {
  520. itNum++
  521. if itNum <= offset {
  522. continue
  523. }
  524. username := p.dbHandle.usernames[i]
  525. u := p.dbHandle.users[username]
  526. user := u.getACopy()
  527. p.addVirtualFoldersToUser(&user)
  528. user.PrepareForRendering()
  529. users = append(users, user)
  530. if len(users) >= limit {
  531. break
  532. }
  533. }
  534. }
  535. return users, err
  536. }
  537. func (p *MemoryProvider) userExists(username string) (User, error) {
  538. p.dbHandle.Lock()
  539. defer p.dbHandle.Unlock()
  540. if p.dbHandle.isClosed {
  541. return User{}, errMemoryProviderClosed
  542. }
  543. user, err := p.userExistsInternal(username)
  544. if err != nil {
  545. return user, err
  546. }
  547. p.addVirtualFoldersToUser(&user)
  548. return user, nil
  549. }
  550. func (p *MemoryProvider) userExistsInternal(username string) (User, error) {
  551. if val, ok := p.dbHandle.users[username]; ok {
  552. return val.getACopy(), nil
  553. }
  554. return User{}, util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist", username))
  555. }
  556. func (p *MemoryProvider) groupExistsInternal(name string) (Group, error) {
  557. if val, ok := p.dbHandle.groups[name]; ok {
  558. return val.getACopy(), nil
  559. }
  560. return Group{}, util.NewRecordNotFoundError(fmt.Sprintf("group %#v does not exist", name))
  561. }
  562. func (p *MemoryProvider) addAdmin(admin *Admin) error {
  563. p.dbHandle.Lock()
  564. defer p.dbHandle.Unlock()
  565. if p.dbHandle.isClosed {
  566. return errMemoryProviderClosed
  567. }
  568. err := admin.validate()
  569. if err != nil {
  570. return err
  571. }
  572. _, err = p.adminExistsInternal(admin.Username)
  573. if err == nil {
  574. return fmt.Errorf("admin %#v already exists", admin.Username)
  575. }
  576. admin.ID = p.getNextAdminID()
  577. admin.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  578. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  579. admin.LastLogin = 0
  580. p.dbHandle.admins[admin.Username] = admin.getACopy()
  581. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, admin.Username)
  582. sort.Strings(p.dbHandle.adminsUsernames)
  583. return nil
  584. }
  585. func (p *MemoryProvider) updateAdmin(admin *Admin) error {
  586. p.dbHandle.Lock()
  587. defer p.dbHandle.Unlock()
  588. if p.dbHandle.isClosed {
  589. return errMemoryProviderClosed
  590. }
  591. err := admin.validate()
  592. if err != nil {
  593. return err
  594. }
  595. a, err := p.adminExistsInternal(admin.Username)
  596. if err != nil {
  597. return err
  598. }
  599. admin.ID = a.ID
  600. admin.CreatedAt = a.CreatedAt
  601. admin.LastLogin = a.LastLogin
  602. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  603. p.dbHandle.admins[admin.Username] = admin.getACopy()
  604. return nil
  605. }
  606. func (p *MemoryProvider) deleteAdmin(admin Admin) error {
  607. p.dbHandle.Lock()
  608. defer p.dbHandle.Unlock()
  609. if p.dbHandle.isClosed {
  610. return errMemoryProviderClosed
  611. }
  612. _, err := p.adminExistsInternal(admin.Username)
  613. if err != nil {
  614. return err
  615. }
  616. delete(p.dbHandle.admins, admin.Username)
  617. // this could be more efficient
  618. p.dbHandle.adminsUsernames = make([]string, 0, len(p.dbHandle.admins))
  619. for username := range p.dbHandle.admins {
  620. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, username)
  621. }
  622. sort.Strings(p.dbHandle.adminsUsernames)
  623. p.deleteAPIKeysWithAdmin(admin.Username)
  624. return nil
  625. }
  626. func (p *MemoryProvider) adminExists(username string) (Admin, error) {
  627. p.dbHandle.Lock()
  628. defer p.dbHandle.Unlock()
  629. if p.dbHandle.isClosed {
  630. return Admin{}, errMemoryProviderClosed
  631. }
  632. return p.adminExistsInternal(username)
  633. }
  634. func (p *MemoryProvider) adminExistsInternal(username string) (Admin, error) {
  635. if val, ok := p.dbHandle.admins[username]; ok {
  636. return val.getACopy(), nil
  637. }
  638. return Admin{}, util.NewRecordNotFoundError(fmt.Sprintf("admin %#v does not exist", username))
  639. }
  640. func (p *MemoryProvider) dumpAdmins() ([]Admin, error) {
  641. p.dbHandle.Lock()
  642. defer p.dbHandle.Unlock()
  643. admins := make([]Admin, 0, len(p.dbHandle.admins))
  644. if p.dbHandle.isClosed {
  645. return admins, errMemoryProviderClosed
  646. }
  647. for _, admin := range p.dbHandle.admins {
  648. admins = append(admins, admin)
  649. }
  650. return admins, nil
  651. }
  652. func (p *MemoryProvider) getAdmins(limit int, offset int, order string) ([]Admin, error) {
  653. admins := make([]Admin, 0, limit)
  654. p.dbHandle.Lock()
  655. defer p.dbHandle.Unlock()
  656. if p.dbHandle.isClosed {
  657. return admins, errMemoryProviderClosed
  658. }
  659. if limit <= 0 {
  660. return admins, nil
  661. }
  662. itNum := 0
  663. if order == OrderASC {
  664. for _, username := range p.dbHandle.adminsUsernames {
  665. itNum++
  666. if itNum <= offset {
  667. continue
  668. }
  669. a := p.dbHandle.admins[username]
  670. admin := a.getACopy()
  671. admin.HideConfidentialData()
  672. admins = append(admins, admin)
  673. if len(admins) >= limit {
  674. break
  675. }
  676. }
  677. } else {
  678. for i := len(p.dbHandle.adminsUsernames) - 1; i >= 0; i-- {
  679. itNum++
  680. if itNum <= offset {
  681. continue
  682. }
  683. username := p.dbHandle.adminsUsernames[i]
  684. a := p.dbHandle.admins[username]
  685. admin := a.getACopy()
  686. admin.HideConfidentialData()
  687. admins = append(admins, admin)
  688. if len(admins) >= limit {
  689. break
  690. }
  691. }
  692. }
  693. return admins, nil
  694. }
  695. func (p *MemoryProvider) updateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool) error {
  696. p.dbHandle.Lock()
  697. defer p.dbHandle.Unlock()
  698. if p.dbHandle.isClosed {
  699. return errMemoryProviderClosed
  700. }
  701. folder, err := p.folderExistsInternal(name)
  702. if err != nil {
  703. providerLog(logger.LevelError, "unable to update quota for folder %#v error: %v", name, err)
  704. return err
  705. }
  706. if reset {
  707. folder.UsedQuotaSize = sizeAdd
  708. folder.UsedQuotaFiles = filesAdd
  709. } else {
  710. folder.UsedQuotaSize += sizeAdd
  711. folder.UsedQuotaFiles += filesAdd
  712. }
  713. folder.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  714. p.dbHandle.vfolders[name] = folder
  715. return nil
  716. }
  717. func (p *MemoryProvider) getGroups(limit, offset int, order string, minimal bool) ([]Group, error) {
  718. p.dbHandle.Lock()
  719. defer p.dbHandle.Unlock()
  720. if p.dbHandle.isClosed {
  721. return nil, errMemoryProviderClosed
  722. }
  723. if limit <= 0 {
  724. return nil, nil
  725. }
  726. groups := make([]Group, 0, limit)
  727. itNum := 0
  728. if order == OrderASC {
  729. for _, name := range p.dbHandle.groupnames {
  730. itNum++
  731. if itNum <= offset {
  732. continue
  733. }
  734. g := p.dbHandle.groups[name]
  735. group := g.getACopy()
  736. p.addVirtualFoldersToGroup(&group)
  737. group.PrepareForRendering()
  738. groups = append(groups, group)
  739. if len(groups) >= limit {
  740. break
  741. }
  742. }
  743. } else {
  744. for i := len(p.dbHandle.groupnames) - 1; i >= 0; i-- {
  745. itNum++
  746. if itNum <= offset {
  747. continue
  748. }
  749. name := p.dbHandle.groupnames[i]
  750. g := p.dbHandle.groups[name]
  751. group := g.getACopy()
  752. p.addVirtualFoldersToGroup(&group)
  753. group.PrepareForRendering()
  754. groups = append(groups, group)
  755. if len(groups) >= limit {
  756. break
  757. }
  758. }
  759. }
  760. return groups, nil
  761. }
  762. func (p *MemoryProvider) getGroupsWithNames(names []string) ([]Group, error) {
  763. p.dbHandle.Lock()
  764. defer p.dbHandle.Unlock()
  765. if p.dbHandle.isClosed {
  766. return nil, errMemoryProviderClosed
  767. }
  768. groups := make([]Group, 0, len(names))
  769. for _, name := range names {
  770. if val, ok := p.dbHandle.groups[name]; ok {
  771. group := val.getACopy()
  772. p.addVirtualFoldersToGroup(&group)
  773. groups = append(groups, group)
  774. }
  775. }
  776. return groups, nil
  777. }
  778. func (p *MemoryProvider) getUsersInGroups(names []string) ([]string, error) {
  779. p.dbHandle.Lock()
  780. defer p.dbHandle.Unlock()
  781. if p.dbHandle.isClosed {
  782. return nil, errMemoryProviderClosed
  783. }
  784. var users []string
  785. for _, name := range names {
  786. if val, ok := p.dbHandle.groups[name]; ok {
  787. group := val.getACopy()
  788. users = append(users, group.Users...)
  789. }
  790. }
  791. return users, nil
  792. }
  793. func (p *MemoryProvider) groupExists(name string) (Group, error) {
  794. p.dbHandle.Lock()
  795. defer p.dbHandle.Unlock()
  796. if p.dbHandle.isClosed {
  797. return Group{}, errMemoryProviderClosed
  798. }
  799. group, err := p.groupExistsInternal(name)
  800. if err != nil {
  801. return group, err
  802. }
  803. p.addVirtualFoldersToGroup(&group)
  804. return group, nil
  805. }
  806. func (p *MemoryProvider) addGroup(group *Group) error {
  807. if err := group.validate(); err != nil {
  808. return err
  809. }
  810. p.dbHandle.Lock()
  811. defer p.dbHandle.Unlock()
  812. if p.dbHandle.isClosed {
  813. return errMemoryProviderClosed
  814. }
  815. _, err := p.groupExistsInternal(group.Name)
  816. if err == nil {
  817. return fmt.Errorf("group %#v already exists", group.Name)
  818. }
  819. group.ID = p.getNextGroupID()
  820. group.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  821. group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  822. group.VirtualFolders = p.joinGroupVirtualFoldersFields(group)
  823. p.dbHandle.groups[group.Name] = group.getACopy()
  824. p.dbHandle.groupnames = append(p.dbHandle.groupnames, group.Name)
  825. sort.Strings(p.dbHandle.groupnames)
  826. return nil
  827. }
  828. func (p *MemoryProvider) updateGroup(group *Group) error {
  829. if err := group.validate(); err != nil {
  830. return err
  831. }
  832. p.dbHandle.Lock()
  833. defer p.dbHandle.Unlock()
  834. if p.dbHandle.isClosed {
  835. return errMemoryProviderClosed
  836. }
  837. g, err := p.groupExistsInternal(group.Name)
  838. if err != nil {
  839. return err
  840. }
  841. for _, oldFolder := range g.VirtualFolders {
  842. p.removeRelationFromFolderMapping(oldFolder.Name, "", g.Name)
  843. }
  844. group.VirtualFolders = p.joinGroupVirtualFoldersFields(group)
  845. group.CreatedAt = g.CreatedAt
  846. group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  847. group.ID = g.ID
  848. p.dbHandle.groups[group.Name] = group.getACopy()
  849. return nil
  850. }
  851. func (p *MemoryProvider) deleteGroup(group Group) error {
  852. p.dbHandle.Lock()
  853. defer p.dbHandle.Unlock()
  854. if p.dbHandle.isClosed {
  855. return errMemoryProviderClosed
  856. }
  857. g, err := p.groupExistsInternal(group.Name)
  858. if err != nil {
  859. return err
  860. }
  861. if len(g.Users) > 0 {
  862. return util.NewValidationError(fmt.Sprintf("the group %#v is referenced, it cannot be removed", group.Name))
  863. }
  864. for _, oldFolder := range g.VirtualFolders {
  865. p.removeRelationFromFolderMapping(oldFolder.Name, "", g.Name)
  866. }
  867. delete(p.dbHandle.groups, group.Name)
  868. // this could be more efficient
  869. p.dbHandle.groupnames = make([]string, 0, len(p.dbHandle.groups))
  870. for name := range p.dbHandle.groups {
  871. p.dbHandle.groupnames = append(p.dbHandle.groupnames, name)
  872. }
  873. sort.Strings(p.dbHandle.groupnames)
  874. return nil
  875. }
  876. func (p *MemoryProvider) dumpGroups() ([]Group, error) {
  877. p.dbHandle.Lock()
  878. defer p.dbHandle.Unlock()
  879. groups := make([]Group, 0, len(p.dbHandle.groups))
  880. var err error
  881. if p.dbHandle.isClosed {
  882. return groups, errMemoryProviderClosed
  883. }
  884. for _, name := range p.dbHandle.groupnames {
  885. g := p.dbHandle.groups[name]
  886. group := g.getACopy()
  887. p.addVirtualFoldersToGroup(&group)
  888. groups = append(groups, group)
  889. }
  890. return groups, err
  891. }
  892. func (p *MemoryProvider) getUsedFolderQuota(name string) (int, int64, error) {
  893. p.dbHandle.Lock()
  894. defer p.dbHandle.Unlock()
  895. if p.dbHandle.isClosed {
  896. return 0, 0, errMemoryProviderClosed
  897. }
  898. folder, err := p.folderExistsInternal(name)
  899. if err != nil {
  900. providerLog(logger.LevelError, "unable to get quota for folder %#v error: %v", name, err)
  901. return 0, 0, err
  902. }
  903. return folder.UsedQuotaFiles, folder.UsedQuotaSize, err
  904. }
  905. func (p *MemoryProvider) joinGroupVirtualFoldersFields(group *Group) []vfs.VirtualFolder {
  906. var folders []vfs.VirtualFolder
  907. for idx := range group.VirtualFolders {
  908. folder := &group.VirtualFolders[idx]
  909. f, err := p.addOrUpdateFolderInternal(&folder.BaseVirtualFolder, "", group.Name, 0, 0, 0)
  910. if err == nil {
  911. folder.BaseVirtualFolder = f
  912. folders = append(folders, *folder)
  913. }
  914. }
  915. return folders
  916. }
  917. func (p *MemoryProvider) addVirtualFoldersToGroup(group *Group) {
  918. if len(group.VirtualFolders) > 0 {
  919. var folders []vfs.VirtualFolder
  920. for idx := range group.VirtualFolders {
  921. folder := &group.VirtualFolders[idx]
  922. baseFolder, err := p.folderExistsInternal(folder.Name)
  923. if err != nil {
  924. continue
  925. }
  926. folder.BaseVirtualFolder = baseFolder.GetACopy()
  927. folders = append(folders, *folder)
  928. }
  929. group.VirtualFolders = folders
  930. }
  931. }
  932. func (p *MemoryProvider) addUserFromGroupMapping(username, groupname string) error {
  933. g, err := p.groupExistsInternal(groupname)
  934. if err != nil {
  935. return err
  936. }
  937. if !util.Contains(g.Users, username) {
  938. g.Users = append(g.Users, username)
  939. p.dbHandle.groups[groupname] = g
  940. }
  941. return nil
  942. }
  943. func (p *MemoryProvider) removeUserFromGroupMapping(username, groupname string) error {
  944. g, err := p.groupExistsInternal(groupname)
  945. if err != nil {
  946. return err
  947. }
  948. if util.Contains(g.Users, username) {
  949. var users []string
  950. for _, u := range g.Users {
  951. if u != username {
  952. users = append(users, u)
  953. }
  954. }
  955. g.Users = users
  956. p.dbHandle.groups[groupname] = g
  957. }
  958. return nil
  959. }
  960. func (p *MemoryProvider) joinUserVirtualFoldersFields(user *User) []vfs.VirtualFolder {
  961. var folders []vfs.VirtualFolder
  962. for idx := range user.VirtualFolders {
  963. folder := &user.VirtualFolders[idx]
  964. f, err := p.addOrUpdateFolderInternal(&folder.BaseVirtualFolder, user.Username, "", 0, 0, 0)
  965. if err == nil {
  966. folder.BaseVirtualFolder = f
  967. folders = append(folders, *folder)
  968. }
  969. }
  970. return folders
  971. }
  972. func (p *MemoryProvider) addVirtualFoldersToUser(user *User) {
  973. if len(user.VirtualFolders) > 0 {
  974. var folders []vfs.VirtualFolder
  975. for idx := range user.VirtualFolders {
  976. folder := &user.VirtualFolders[idx]
  977. baseFolder, err := p.folderExistsInternal(folder.Name)
  978. if err != nil {
  979. continue
  980. }
  981. folder.BaseVirtualFolder = baseFolder.GetACopy()
  982. folders = append(folders, *folder)
  983. }
  984. user.VirtualFolders = folders
  985. }
  986. }
  987. func (p *MemoryProvider) removeRelationFromFolderMapping(folderName, username, groupname string) {
  988. folder, err := p.folderExistsInternal(folderName)
  989. if err == nil {
  990. if username != "" {
  991. var usernames []string
  992. for _, user := range folder.Users {
  993. if user != username {
  994. usernames = append(usernames, user)
  995. }
  996. }
  997. folder.Users = usernames
  998. }
  999. if groupname != "" {
  1000. var groups []string
  1001. for _, group := range folder.Groups {
  1002. if group != groupname {
  1003. groups = append(groups, group)
  1004. }
  1005. }
  1006. folder.Groups = groups
  1007. }
  1008. p.dbHandle.vfolders[folder.Name] = folder
  1009. }
  1010. }
  1011. func (p *MemoryProvider) updateFoldersMappingInternal(folder vfs.BaseVirtualFolder) {
  1012. p.dbHandle.vfolders[folder.Name] = folder
  1013. if !util.Contains(p.dbHandle.vfoldersNames, folder.Name) {
  1014. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  1015. sort.Strings(p.dbHandle.vfoldersNames)
  1016. }
  1017. }
  1018. func (p *MemoryProvider) addOrUpdateFolderInternal(baseFolder *vfs.BaseVirtualFolder, username, groupname string,
  1019. usedQuotaSize int64, usedQuotaFiles int, lastQuotaUpdate int64,
  1020. ) (vfs.BaseVirtualFolder, error) {
  1021. folder, err := p.folderExistsInternal(baseFolder.Name)
  1022. if err == nil {
  1023. // exists
  1024. folder.MappedPath = baseFolder.MappedPath
  1025. folder.Description = baseFolder.Description
  1026. folder.FsConfig = baseFolder.FsConfig.GetACopy()
  1027. if username != "" && !util.Contains(folder.Users, username) {
  1028. folder.Users = append(folder.Users, username)
  1029. }
  1030. if groupname != "" && !util.Contains(folder.Groups, groupname) {
  1031. folder.Groups = append(folder.Groups, groupname)
  1032. }
  1033. p.updateFoldersMappingInternal(folder)
  1034. return folder, nil
  1035. }
  1036. if _, ok := err.(*util.RecordNotFoundError); ok {
  1037. folder = baseFolder.GetACopy()
  1038. folder.ID = p.getNextFolderID()
  1039. folder.UsedQuotaSize = usedQuotaSize
  1040. folder.UsedQuotaFiles = usedQuotaFiles
  1041. folder.LastQuotaUpdate = lastQuotaUpdate
  1042. if username != "" {
  1043. folder.Users = []string{username}
  1044. }
  1045. if groupname != "" {
  1046. folder.Groups = []string{groupname}
  1047. }
  1048. p.updateFoldersMappingInternal(folder)
  1049. return folder, nil
  1050. }
  1051. return folder, err
  1052. }
  1053. func (p *MemoryProvider) folderExistsInternal(name string) (vfs.BaseVirtualFolder, error) {
  1054. if val, ok := p.dbHandle.vfolders[name]; ok {
  1055. return val, nil
  1056. }
  1057. return vfs.BaseVirtualFolder{}, util.NewRecordNotFoundError(fmt.Sprintf("folder %#v does not exist", name))
  1058. }
  1059. func (p *MemoryProvider) getFolders(limit, offset int, order string, minimal bool) ([]vfs.BaseVirtualFolder, error) {
  1060. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  1061. var err error
  1062. p.dbHandle.Lock()
  1063. defer p.dbHandle.Unlock()
  1064. if p.dbHandle.isClosed {
  1065. return folders, errMemoryProviderClosed
  1066. }
  1067. if limit <= 0 {
  1068. return folders, err
  1069. }
  1070. itNum := 0
  1071. if order == OrderASC {
  1072. for _, name := range p.dbHandle.vfoldersNames {
  1073. itNum++
  1074. if itNum <= offset {
  1075. continue
  1076. }
  1077. f := p.dbHandle.vfolders[name]
  1078. folder := f.GetACopy()
  1079. folder.PrepareForRendering()
  1080. folders = append(folders, folder)
  1081. if len(folders) >= limit {
  1082. break
  1083. }
  1084. }
  1085. } else {
  1086. for i := len(p.dbHandle.vfoldersNames) - 1; i >= 0; i-- {
  1087. itNum++
  1088. if itNum <= offset {
  1089. continue
  1090. }
  1091. name := p.dbHandle.vfoldersNames[i]
  1092. f := p.dbHandle.vfolders[name]
  1093. folder := f.GetACopy()
  1094. folder.PrepareForRendering()
  1095. folders = append(folders, folder)
  1096. if len(folders) >= limit {
  1097. break
  1098. }
  1099. }
  1100. }
  1101. return folders, err
  1102. }
  1103. func (p *MemoryProvider) getFolderByName(name string) (vfs.BaseVirtualFolder, error) {
  1104. p.dbHandle.Lock()
  1105. defer p.dbHandle.Unlock()
  1106. if p.dbHandle.isClosed {
  1107. return vfs.BaseVirtualFolder{}, errMemoryProviderClosed
  1108. }
  1109. folder, err := p.folderExistsInternal(name)
  1110. if err != nil {
  1111. return vfs.BaseVirtualFolder{}, err
  1112. }
  1113. return folder.GetACopy(), nil
  1114. }
  1115. func (p *MemoryProvider) addFolder(folder *vfs.BaseVirtualFolder) error {
  1116. err := ValidateFolder(folder)
  1117. if err != nil {
  1118. return err
  1119. }
  1120. p.dbHandle.Lock()
  1121. defer p.dbHandle.Unlock()
  1122. if p.dbHandle.isClosed {
  1123. return errMemoryProviderClosed
  1124. }
  1125. _, err = p.folderExistsInternal(folder.Name)
  1126. if err == nil {
  1127. return fmt.Errorf("folder %#v already exists", folder.Name)
  1128. }
  1129. folder.ID = p.getNextFolderID()
  1130. folder.Users = nil
  1131. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  1132. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  1133. sort.Strings(p.dbHandle.vfoldersNames)
  1134. return nil
  1135. }
  1136. func (p *MemoryProvider) updateFolder(folder *vfs.BaseVirtualFolder) error {
  1137. err := ValidateFolder(folder)
  1138. if err != nil {
  1139. return err
  1140. }
  1141. p.dbHandle.Lock()
  1142. defer p.dbHandle.Unlock()
  1143. if p.dbHandle.isClosed {
  1144. return errMemoryProviderClosed
  1145. }
  1146. f, err := p.folderExistsInternal(folder.Name)
  1147. if err != nil {
  1148. return err
  1149. }
  1150. folder.ID = f.ID
  1151. folder.LastQuotaUpdate = f.LastQuotaUpdate
  1152. folder.UsedQuotaFiles = f.UsedQuotaFiles
  1153. folder.UsedQuotaSize = f.UsedQuotaSize
  1154. folder.Users = f.Users
  1155. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  1156. // now update the related users
  1157. for _, username := range folder.Users {
  1158. user, err := p.userExistsInternal(username)
  1159. if err == nil {
  1160. var folders []vfs.VirtualFolder
  1161. for idx := range user.VirtualFolders {
  1162. userFolder := &user.VirtualFolders[idx]
  1163. if folder.Name == userFolder.Name {
  1164. userFolder.BaseVirtualFolder = folder.GetACopy()
  1165. }
  1166. folders = append(folders, *userFolder)
  1167. }
  1168. user.VirtualFolders = folders
  1169. p.dbHandle.users[user.Username] = user
  1170. }
  1171. }
  1172. return nil
  1173. }
  1174. func (p *MemoryProvider) deleteFolder(folder vfs.BaseVirtualFolder) error {
  1175. p.dbHandle.Lock()
  1176. defer p.dbHandle.Unlock()
  1177. if p.dbHandle.isClosed {
  1178. return errMemoryProviderClosed
  1179. }
  1180. _, err := p.folderExistsInternal(folder.Name)
  1181. if err != nil {
  1182. return err
  1183. }
  1184. for _, username := range folder.Users {
  1185. user, err := p.userExistsInternal(username)
  1186. if err == nil {
  1187. var folders []vfs.VirtualFolder
  1188. for idx := range user.VirtualFolders {
  1189. userFolder := &user.VirtualFolders[idx]
  1190. if folder.Name != userFolder.Name {
  1191. folders = append(folders, *userFolder)
  1192. }
  1193. }
  1194. user.VirtualFolders = folders
  1195. p.dbHandle.users[user.Username] = user
  1196. }
  1197. }
  1198. for _, groupname := range folder.Groups {
  1199. group, err := p.groupExistsInternal(groupname)
  1200. if err == nil {
  1201. var folders []vfs.VirtualFolder
  1202. for idx := range group.VirtualFolders {
  1203. groupFolder := &group.VirtualFolders[idx]
  1204. if folder.Name != groupFolder.Name {
  1205. folders = append(folders, *groupFolder)
  1206. }
  1207. }
  1208. group.VirtualFolders = folders
  1209. p.dbHandle.groups[group.Name] = group
  1210. }
  1211. }
  1212. delete(p.dbHandle.vfolders, folder.Name)
  1213. p.dbHandle.vfoldersNames = []string{}
  1214. for name := range p.dbHandle.vfolders {
  1215. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, name)
  1216. }
  1217. sort.Strings(p.dbHandle.vfoldersNames)
  1218. return nil
  1219. }
  1220. func (p *MemoryProvider) apiKeyExistsInternal(keyID string) (APIKey, error) {
  1221. if val, ok := p.dbHandle.apiKeys[keyID]; ok {
  1222. return val.getACopy(), nil
  1223. }
  1224. return APIKey{}, util.NewRecordNotFoundError(fmt.Sprintf("API key %#v does not exist", keyID))
  1225. }
  1226. func (p *MemoryProvider) apiKeyExists(keyID string) (APIKey, error) {
  1227. p.dbHandle.Lock()
  1228. defer p.dbHandle.Unlock()
  1229. if p.dbHandle.isClosed {
  1230. return APIKey{}, errMemoryProviderClosed
  1231. }
  1232. return p.apiKeyExistsInternal(keyID)
  1233. }
  1234. func (p *MemoryProvider) addAPIKey(apiKey *APIKey) error {
  1235. err := apiKey.validate()
  1236. if err != nil {
  1237. return err
  1238. }
  1239. p.dbHandle.Lock()
  1240. defer p.dbHandle.Unlock()
  1241. if p.dbHandle.isClosed {
  1242. return errMemoryProviderClosed
  1243. }
  1244. _, err = p.apiKeyExistsInternal(apiKey.KeyID)
  1245. if err == nil {
  1246. return fmt.Errorf("API key %#v already exists", apiKey.KeyID)
  1247. }
  1248. if apiKey.User != "" {
  1249. if _, err := p.userExistsInternal(apiKey.User); err != nil {
  1250. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", apiKey.User))
  1251. }
  1252. }
  1253. if apiKey.Admin != "" {
  1254. if _, err := p.adminExistsInternal(apiKey.Admin); err != nil {
  1255. return util.NewValidationError(fmt.Sprintf("related admin %#v does not exists", apiKey.User))
  1256. }
  1257. }
  1258. apiKey.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1259. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1260. apiKey.LastUseAt = 0
  1261. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey.getACopy()
  1262. p.dbHandle.apiKeysIDs = append(p.dbHandle.apiKeysIDs, apiKey.KeyID)
  1263. sort.Strings(p.dbHandle.apiKeysIDs)
  1264. return nil
  1265. }
  1266. func (p *MemoryProvider) updateAPIKey(apiKey *APIKey) error {
  1267. err := apiKey.validate()
  1268. if err != nil {
  1269. return err
  1270. }
  1271. p.dbHandle.Lock()
  1272. defer p.dbHandle.Unlock()
  1273. if p.dbHandle.isClosed {
  1274. return errMemoryProviderClosed
  1275. }
  1276. k, err := p.apiKeyExistsInternal(apiKey.KeyID)
  1277. if err != nil {
  1278. return err
  1279. }
  1280. if apiKey.User != "" {
  1281. if _, err := p.userExistsInternal(apiKey.User); err != nil {
  1282. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", apiKey.User))
  1283. }
  1284. }
  1285. if apiKey.Admin != "" {
  1286. if _, err := p.adminExistsInternal(apiKey.Admin); err != nil {
  1287. return util.NewValidationError(fmt.Sprintf("related admin %#v does not exists", apiKey.User))
  1288. }
  1289. }
  1290. apiKey.ID = k.ID
  1291. apiKey.KeyID = k.KeyID
  1292. apiKey.Key = k.Key
  1293. apiKey.CreatedAt = k.CreatedAt
  1294. apiKey.LastUseAt = k.LastUseAt
  1295. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1296. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey.getACopy()
  1297. return nil
  1298. }
  1299. func (p *MemoryProvider) deleteAPIKey(apiKey APIKey) error {
  1300. p.dbHandle.Lock()
  1301. defer p.dbHandle.Unlock()
  1302. if p.dbHandle.isClosed {
  1303. return errMemoryProviderClosed
  1304. }
  1305. _, err := p.apiKeyExistsInternal(apiKey.KeyID)
  1306. if err != nil {
  1307. return err
  1308. }
  1309. delete(p.dbHandle.apiKeys, apiKey.KeyID)
  1310. p.updateAPIKeysOrdering()
  1311. return nil
  1312. }
  1313. func (p *MemoryProvider) getAPIKeys(limit int, offset int, order string) ([]APIKey, error) {
  1314. apiKeys := make([]APIKey, 0, limit)
  1315. p.dbHandle.Lock()
  1316. defer p.dbHandle.Unlock()
  1317. if p.dbHandle.isClosed {
  1318. return apiKeys, errMemoryProviderClosed
  1319. }
  1320. if limit <= 0 {
  1321. return apiKeys, nil
  1322. }
  1323. itNum := 0
  1324. if order == OrderDESC {
  1325. for i := len(p.dbHandle.apiKeysIDs) - 1; i >= 0; i-- {
  1326. itNum++
  1327. if itNum <= offset {
  1328. continue
  1329. }
  1330. keyID := p.dbHandle.apiKeysIDs[i]
  1331. k := p.dbHandle.apiKeys[keyID]
  1332. apiKey := k.getACopy()
  1333. apiKey.HideConfidentialData()
  1334. apiKeys = append(apiKeys, apiKey)
  1335. if len(apiKeys) >= limit {
  1336. break
  1337. }
  1338. }
  1339. } else {
  1340. for _, keyID := range p.dbHandle.apiKeysIDs {
  1341. itNum++
  1342. if itNum <= offset {
  1343. continue
  1344. }
  1345. k := p.dbHandle.apiKeys[keyID]
  1346. apiKey := k.getACopy()
  1347. apiKey.HideConfidentialData()
  1348. apiKeys = append(apiKeys, apiKey)
  1349. if len(apiKeys) >= limit {
  1350. break
  1351. }
  1352. }
  1353. }
  1354. return apiKeys, nil
  1355. }
  1356. func (p *MemoryProvider) dumpAPIKeys() ([]APIKey, error) {
  1357. p.dbHandle.Lock()
  1358. defer p.dbHandle.Unlock()
  1359. apiKeys := make([]APIKey, 0, len(p.dbHandle.apiKeys))
  1360. if p.dbHandle.isClosed {
  1361. return apiKeys, errMemoryProviderClosed
  1362. }
  1363. for _, k := range p.dbHandle.apiKeys {
  1364. apiKeys = append(apiKeys, k)
  1365. }
  1366. return apiKeys, nil
  1367. }
  1368. func (p *MemoryProvider) deleteAPIKeysWithUser(username string) {
  1369. found := false
  1370. for k, v := range p.dbHandle.apiKeys {
  1371. if v.User == username {
  1372. delete(p.dbHandle.apiKeys, k)
  1373. found = true
  1374. }
  1375. }
  1376. if found {
  1377. p.updateAPIKeysOrdering()
  1378. }
  1379. }
  1380. func (p *MemoryProvider) deleteAPIKeysWithAdmin(username string) {
  1381. found := false
  1382. for k, v := range p.dbHandle.apiKeys {
  1383. if v.Admin == username {
  1384. delete(p.dbHandle.apiKeys, k)
  1385. found = true
  1386. }
  1387. }
  1388. if found {
  1389. p.updateAPIKeysOrdering()
  1390. }
  1391. }
  1392. func (p *MemoryProvider) deleteSharesWithUser(username string) {
  1393. found := false
  1394. for k, v := range p.dbHandle.shares {
  1395. if v.Username == username {
  1396. delete(p.dbHandle.shares, k)
  1397. found = true
  1398. }
  1399. }
  1400. if found {
  1401. p.updateSharesOrdering()
  1402. }
  1403. }
  1404. func (p *MemoryProvider) updateAPIKeysOrdering() {
  1405. // this could be more efficient
  1406. p.dbHandle.apiKeysIDs = make([]string, 0, len(p.dbHandle.apiKeys))
  1407. for keyID := range p.dbHandle.apiKeys {
  1408. p.dbHandle.apiKeysIDs = append(p.dbHandle.apiKeysIDs, keyID)
  1409. }
  1410. sort.Strings(p.dbHandle.apiKeysIDs)
  1411. }
  1412. func (p *MemoryProvider) updateSharesOrdering() {
  1413. // this could be more efficient
  1414. p.dbHandle.sharesIDs = make([]string, 0, len(p.dbHandle.shares))
  1415. for shareID := range p.dbHandle.shares {
  1416. p.dbHandle.sharesIDs = append(p.dbHandle.sharesIDs, shareID)
  1417. }
  1418. sort.Strings(p.dbHandle.sharesIDs)
  1419. }
  1420. func (p *MemoryProvider) shareExistsInternal(shareID, username string) (Share, error) {
  1421. if val, ok := p.dbHandle.shares[shareID]; ok {
  1422. if username != "" && val.Username != username {
  1423. return Share{}, util.NewRecordNotFoundError(fmt.Sprintf("Share %#v does not exist", shareID))
  1424. }
  1425. return val.getACopy(), nil
  1426. }
  1427. return Share{}, util.NewRecordNotFoundError(fmt.Sprintf("Share %#v does not exist", shareID))
  1428. }
  1429. func (p *MemoryProvider) shareExists(shareID, username string) (Share, error) {
  1430. p.dbHandle.Lock()
  1431. defer p.dbHandle.Unlock()
  1432. if p.dbHandle.isClosed {
  1433. return Share{}, errMemoryProviderClosed
  1434. }
  1435. return p.shareExistsInternal(shareID, username)
  1436. }
  1437. func (p *MemoryProvider) addShare(share *Share) error {
  1438. err := share.validate()
  1439. if err != nil {
  1440. return err
  1441. }
  1442. p.dbHandle.Lock()
  1443. defer p.dbHandle.Unlock()
  1444. if p.dbHandle.isClosed {
  1445. return errMemoryProviderClosed
  1446. }
  1447. _, err = p.shareExistsInternal(share.ShareID, share.Username)
  1448. if err == nil {
  1449. return fmt.Errorf("share %#v already exists", share.ShareID)
  1450. }
  1451. if _, err := p.userExistsInternal(share.Username); err != nil {
  1452. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", share.Username))
  1453. }
  1454. if !share.IsRestore {
  1455. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1456. share.UpdatedAt = share.CreatedAt
  1457. share.LastUseAt = 0
  1458. share.UsedTokens = 0
  1459. }
  1460. if share.CreatedAt == 0 {
  1461. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1462. }
  1463. if share.UpdatedAt == 0 {
  1464. share.UpdatedAt = share.CreatedAt
  1465. }
  1466. p.dbHandle.shares[share.ShareID] = share.getACopy()
  1467. p.dbHandle.sharesIDs = append(p.dbHandle.sharesIDs, share.ShareID)
  1468. sort.Strings(p.dbHandle.sharesIDs)
  1469. return nil
  1470. }
  1471. func (p *MemoryProvider) updateShare(share *Share) error {
  1472. err := share.validate()
  1473. if err != nil {
  1474. return err
  1475. }
  1476. p.dbHandle.Lock()
  1477. defer p.dbHandle.Unlock()
  1478. if p.dbHandle.isClosed {
  1479. return errMemoryProviderClosed
  1480. }
  1481. s, err := p.shareExistsInternal(share.ShareID, share.Username)
  1482. if err != nil {
  1483. return err
  1484. }
  1485. if _, err := p.userExistsInternal(share.Username); err != nil {
  1486. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", share.Username))
  1487. }
  1488. share.ID = s.ID
  1489. share.ShareID = s.ShareID
  1490. if !share.IsRestore {
  1491. share.UsedTokens = s.UsedTokens
  1492. share.CreatedAt = s.CreatedAt
  1493. share.LastUseAt = s.LastUseAt
  1494. share.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1495. }
  1496. if share.CreatedAt == 0 {
  1497. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1498. }
  1499. if share.UpdatedAt == 0 {
  1500. share.UpdatedAt = share.CreatedAt
  1501. }
  1502. p.dbHandle.shares[share.ShareID] = share.getACopy()
  1503. return nil
  1504. }
  1505. func (p *MemoryProvider) deleteShare(share Share) error {
  1506. p.dbHandle.Lock()
  1507. defer p.dbHandle.Unlock()
  1508. if p.dbHandle.isClosed {
  1509. return errMemoryProviderClosed
  1510. }
  1511. _, err := p.shareExistsInternal(share.ShareID, share.Username)
  1512. if err != nil {
  1513. return err
  1514. }
  1515. delete(p.dbHandle.shares, share.ShareID)
  1516. p.updateSharesOrdering()
  1517. return nil
  1518. }
  1519. func (p *MemoryProvider) getShares(limit int, offset int, order, username string) ([]Share, error) {
  1520. p.dbHandle.Lock()
  1521. defer p.dbHandle.Unlock()
  1522. if p.dbHandle.isClosed {
  1523. return []Share{}, errMemoryProviderClosed
  1524. }
  1525. if limit <= 0 {
  1526. return []Share{}, nil
  1527. }
  1528. shares := make([]Share, 0, limit)
  1529. itNum := 0
  1530. if order == OrderDESC {
  1531. for i := len(p.dbHandle.sharesIDs) - 1; i >= 0; i-- {
  1532. shareID := p.dbHandle.sharesIDs[i]
  1533. s := p.dbHandle.shares[shareID]
  1534. if s.Username != username {
  1535. continue
  1536. }
  1537. itNum++
  1538. if itNum <= offset {
  1539. continue
  1540. }
  1541. share := s.getACopy()
  1542. share.HideConfidentialData()
  1543. shares = append(shares, share)
  1544. if len(shares) >= limit {
  1545. break
  1546. }
  1547. }
  1548. } else {
  1549. for _, shareID := range p.dbHandle.sharesIDs {
  1550. s := p.dbHandle.shares[shareID]
  1551. if s.Username != username {
  1552. continue
  1553. }
  1554. itNum++
  1555. if itNum <= offset {
  1556. continue
  1557. }
  1558. share := s.getACopy()
  1559. share.HideConfidentialData()
  1560. shares = append(shares, share)
  1561. if len(shares) >= limit {
  1562. break
  1563. }
  1564. }
  1565. }
  1566. return shares, nil
  1567. }
  1568. func (p *MemoryProvider) dumpShares() ([]Share, error) {
  1569. p.dbHandle.Lock()
  1570. defer p.dbHandle.Unlock()
  1571. shares := make([]Share, 0, len(p.dbHandle.shares))
  1572. if p.dbHandle.isClosed {
  1573. return shares, errMemoryProviderClosed
  1574. }
  1575. for _, s := range p.dbHandle.shares {
  1576. shares = append(shares, s)
  1577. }
  1578. return shares, nil
  1579. }
  1580. func (p *MemoryProvider) updateShareLastUse(shareID string, numTokens int) error {
  1581. p.dbHandle.Lock()
  1582. defer p.dbHandle.Unlock()
  1583. if p.dbHandle.isClosed {
  1584. return errMemoryProviderClosed
  1585. }
  1586. share, err := p.shareExistsInternal(shareID, "")
  1587. if err != nil {
  1588. return err
  1589. }
  1590. share.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1591. share.UsedTokens += numTokens
  1592. p.dbHandle.shares[share.ShareID] = share
  1593. return nil
  1594. }
  1595. func (p *MemoryProvider) getDefenderHosts(from int64, limit int) ([]DefenderEntry, error) {
  1596. return nil, ErrNotImplemented
  1597. }
  1598. func (p *MemoryProvider) getDefenderHostByIP(ip string, from int64) (DefenderEntry, error) {
  1599. return DefenderEntry{}, ErrNotImplemented
  1600. }
  1601. func (p *MemoryProvider) isDefenderHostBanned(ip string) (DefenderEntry, error) {
  1602. return DefenderEntry{}, ErrNotImplemented
  1603. }
  1604. func (p *MemoryProvider) updateDefenderBanTime(ip string, minutes int) error {
  1605. return ErrNotImplemented
  1606. }
  1607. func (p *MemoryProvider) deleteDefenderHost(ip string) error {
  1608. return ErrNotImplemented
  1609. }
  1610. func (p *MemoryProvider) addDefenderEvent(ip string, score int) error {
  1611. return ErrNotImplemented
  1612. }
  1613. func (p *MemoryProvider) setDefenderBanTime(ip string, banTime int64) error {
  1614. return ErrNotImplemented
  1615. }
  1616. func (p *MemoryProvider) cleanupDefender(from int64) error {
  1617. return ErrNotImplemented
  1618. }
  1619. func (p *MemoryProvider) addActiveTransfer(transfer ActiveTransfer) error {
  1620. return ErrNotImplemented
  1621. }
  1622. func (p *MemoryProvider) updateActiveTransferSizes(ulSize, dlSize, transferID int64, connectionID string) error {
  1623. return ErrNotImplemented
  1624. }
  1625. func (p *MemoryProvider) removeActiveTransfer(transferID int64, connectionID string) error {
  1626. return ErrNotImplemented
  1627. }
  1628. func (p *MemoryProvider) cleanupActiveTransfers(before time.Time) error {
  1629. return ErrNotImplemented
  1630. }
  1631. func (p *MemoryProvider) getActiveTransfers(from time.Time) ([]ActiveTransfer, error) {
  1632. return nil, ErrNotImplemented
  1633. }
  1634. func (p *MemoryProvider) addSharedSession(session Session) error {
  1635. return ErrNotImplemented
  1636. }
  1637. func (p *MemoryProvider) deleteSharedSession(key string) error {
  1638. return ErrNotImplemented
  1639. }
  1640. func (p *MemoryProvider) getSharedSession(key string) (Session, error) {
  1641. return Session{}, ErrNotImplemented
  1642. }
  1643. func (p *MemoryProvider) cleanupSharedSessions(sessionType SessionType, before int64) error {
  1644. return ErrNotImplemented
  1645. }
  1646. func (p *MemoryProvider) getNextID() int64 {
  1647. nextID := int64(1)
  1648. for _, v := range p.dbHandle.users {
  1649. if v.ID >= nextID {
  1650. nextID = v.ID + 1
  1651. }
  1652. }
  1653. return nextID
  1654. }
  1655. func (p *MemoryProvider) getNextFolderID() int64 {
  1656. nextID := int64(1)
  1657. for _, v := range p.dbHandle.vfolders {
  1658. if v.ID >= nextID {
  1659. nextID = v.ID + 1
  1660. }
  1661. }
  1662. return nextID
  1663. }
  1664. func (p *MemoryProvider) getNextAdminID() int64 {
  1665. nextID := int64(1)
  1666. for _, a := range p.dbHandle.admins {
  1667. if a.ID >= nextID {
  1668. nextID = a.ID + 1
  1669. }
  1670. }
  1671. return nextID
  1672. }
  1673. func (p *MemoryProvider) getNextGroupID() int64 {
  1674. nextID := int64(1)
  1675. for _, g := range p.dbHandle.groups {
  1676. if g.ID >= nextID {
  1677. nextID = g.ID + 1
  1678. }
  1679. }
  1680. return nextID
  1681. }
  1682. func (p *MemoryProvider) clear() {
  1683. p.dbHandle.Lock()
  1684. defer p.dbHandle.Unlock()
  1685. p.dbHandle.usernames = []string{}
  1686. p.dbHandle.users = make(map[string]User)
  1687. p.dbHandle.vfoldersNames = []string{}
  1688. p.dbHandle.vfolders = make(map[string]vfs.BaseVirtualFolder)
  1689. p.dbHandle.admins = make(map[string]Admin)
  1690. p.dbHandle.adminsUsernames = []string{}
  1691. p.dbHandle.apiKeys = make(map[string]APIKey)
  1692. p.dbHandle.apiKeysIDs = []string{}
  1693. p.dbHandle.shares = make(map[string]Share)
  1694. p.dbHandle.sharesIDs = []string{}
  1695. }
  1696. func (p *MemoryProvider) reloadConfig() error {
  1697. if p.dbHandle.configFile == "" {
  1698. providerLog(logger.LevelDebug, "no dump configuration file defined")
  1699. return nil
  1700. }
  1701. providerLog(logger.LevelDebug, "loading dump from file: %#v", p.dbHandle.configFile)
  1702. fi, err := os.Stat(p.dbHandle.configFile)
  1703. if err != nil {
  1704. providerLog(logger.LevelError, "error loading dump: %v", err)
  1705. return err
  1706. }
  1707. if fi.Size() == 0 {
  1708. err = errors.New("dump configuration file is invalid, its size must be > 0")
  1709. providerLog(logger.LevelError, "error loading dump: %v", err)
  1710. return err
  1711. }
  1712. if fi.Size() > 10485760 {
  1713. err = errors.New("dump configuration file is invalid, its size must be <= 10485760 bytes")
  1714. providerLog(logger.LevelError, "error loading dump: %v", err)
  1715. return err
  1716. }
  1717. content, err := os.ReadFile(p.dbHandle.configFile)
  1718. if err != nil {
  1719. providerLog(logger.LevelError, "error loading dump: %v", err)
  1720. return err
  1721. }
  1722. dump, err := ParseDumpData(content)
  1723. if err != nil {
  1724. providerLog(logger.LevelError, "error loading dump: %v", err)
  1725. return err
  1726. }
  1727. p.clear()
  1728. if err := p.restoreFolders(&dump); err != nil {
  1729. return err
  1730. }
  1731. if err := p.restoreGroups(&dump); err != nil {
  1732. return err
  1733. }
  1734. if err := p.restoreUsers(&dump); err != nil {
  1735. return err
  1736. }
  1737. if err := p.restoreAdmins(&dump); err != nil {
  1738. return err
  1739. }
  1740. if err := p.restoreAPIKeys(&dump); err != nil {
  1741. return err
  1742. }
  1743. if err := p.restoreShares(&dump); err != nil {
  1744. return err
  1745. }
  1746. providerLog(logger.LevelDebug, "config loaded from file: %#v", p.dbHandle.configFile)
  1747. return nil
  1748. }
  1749. func (p *MemoryProvider) restoreShares(dump *BackupData) error {
  1750. for _, share := range dump.Shares {
  1751. s, err := p.shareExists(share.ShareID, "")
  1752. share := share // pin
  1753. share.IsRestore = true
  1754. if err == nil {
  1755. share.ID = s.ID
  1756. err = UpdateShare(&share, ActionExecutorSystem, "")
  1757. if err != nil {
  1758. providerLog(logger.LevelError, "error updating share %#v: %v", share.ShareID, err)
  1759. return err
  1760. }
  1761. } else {
  1762. err = AddShare(&share, ActionExecutorSystem, "")
  1763. if err != nil {
  1764. providerLog(logger.LevelError, "error adding share %#v: %v", share.ShareID, err)
  1765. return err
  1766. }
  1767. }
  1768. }
  1769. return nil
  1770. }
  1771. func (p *MemoryProvider) restoreAPIKeys(dump *BackupData) error {
  1772. for _, apiKey := range dump.APIKeys {
  1773. if apiKey.Key == "" {
  1774. return fmt.Errorf("cannot restore an empty API key: %+v", apiKey)
  1775. }
  1776. k, err := p.apiKeyExists(apiKey.KeyID)
  1777. apiKey := apiKey // pin
  1778. if err == nil {
  1779. apiKey.ID = k.ID
  1780. err = UpdateAPIKey(&apiKey, ActionExecutorSystem, "")
  1781. if err != nil {
  1782. providerLog(logger.LevelError, "error updating API key %#v: %v", apiKey.KeyID, err)
  1783. return err
  1784. }
  1785. } else {
  1786. err = AddAPIKey(&apiKey, ActionExecutorSystem, "")
  1787. if err != nil {
  1788. providerLog(logger.LevelError, "error adding API key %#v: %v", apiKey.KeyID, err)
  1789. return err
  1790. }
  1791. }
  1792. }
  1793. return nil
  1794. }
  1795. func (p *MemoryProvider) restoreAdmins(dump *BackupData) error {
  1796. for _, admin := range dump.Admins {
  1797. admin := admin // pin
  1798. admin.Username = config.convertName(admin.Username)
  1799. a, err := p.adminExists(admin.Username)
  1800. if err == nil {
  1801. admin.ID = a.ID
  1802. err = UpdateAdmin(&admin, ActionExecutorSystem, "")
  1803. if err != nil {
  1804. providerLog(logger.LevelError, "error updating admin %#v: %v", admin.Username, err)
  1805. return err
  1806. }
  1807. } else {
  1808. err = AddAdmin(&admin, ActionExecutorSystem, "")
  1809. if err != nil {
  1810. providerLog(logger.LevelError, "error adding admin %#v: %v", admin.Username, err)
  1811. return err
  1812. }
  1813. }
  1814. }
  1815. return nil
  1816. }
  1817. func (p *MemoryProvider) restoreGroups(dump *BackupData) error {
  1818. for _, group := range dump.Groups {
  1819. group := group // pin
  1820. group.Name = config.convertName(group.Name)
  1821. g, err := p.groupExists(group.Name)
  1822. if err == nil {
  1823. group.ID = g.ID
  1824. err = UpdateGroup(&group, g.Users, ActionExecutorSystem, "")
  1825. if err != nil {
  1826. providerLog(logger.LevelError, "error updating group %#v: %v", group.Name, err)
  1827. return err
  1828. }
  1829. } else {
  1830. group.Users = nil
  1831. err = AddGroup(&group, ActionExecutorSystem, "")
  1832. if err != nil {
  1833. providerLog(logger.LevelError, "error adding group %#v: %v", group.Name, err)
  1834. return err
  1835. }
  1836. }
  1837. }
  1838. return nil
  1839. }
  1840. func (p *MemoryProvider) restoreFolders(dump *BackupData) error {
  1841. for _, folder := range dump.Folders {
  1842. folder := folder // pin
  1843. folder.Name = config.convertName(folder.Name)
  1844. f, err := p.getFolderByName(folder.Name)
  1845. if err == nil {
  1846. folder.ID = f.ID
  1847. err = UpdateFolder(&folder, f.Users, f.Groups, ActionExecutorSystem, "")
  1848. if err != nil {
  1849. providerLog(logger.LevelError, "error updating folder %#v: %v", folder.Name, err)
  1850. return err
  1851. }
  1852. } else {
  1853. folder.Users = nil
  1854. err = AddFolder(&folder)
  1855. if err != nil {
  1856. providerLog(logger.LevelError, "error adding folder %#v: %v", folder.Name, err)
  1857. return err
  1858. }
  1859. }
  1860. }
  1861. return nil
  1862. }
  1863. func (p *MemoryProvider) restoreUsers(dump *BackupData) error {
  1864. for _, user := range dump.Users {
  1865. user := user // pin
  1866. user.Username = config.convertName(user.Username)
  1867. u, err := p.userExists(user.Username)
  1868. if err == nil {
  1869. user.ID = u.ID
  1870. err = UpdateUser(&user, ActionExecutorSystem, "")
  1871. if err != nil {
  1872. providerLog(logger.LevelError, "error updating user %#v: %v", user.Username, err)
  1873. return err
  1874. }
  1875. } else {
  1876. err = AddUser(&user, ActionExecutorSystem, "")
  1877. if err != nil {
  1878. providerLog(logger.LevelError, "error adding user %#v: %v", user.Username, err)
  1879. return err
  1880. }
  1881. }
  1882. }
  1883. return nil
  1884. }
  1885. // initializeDatabase does nothing, no initilization is needed for memory provider
  1886. func (p *MemoryProvider) initializeDatabase() error {
  1887. return ErrNoInitRequired
  1888. }
  1889. func (p *MemoryProvider) migrateDatabase() error {
  1890. return ErrNoInitRequired
  1891. }
  1892. func (p *MemoryProvider) revertDatabase(targetVersion int) error {
  1893. return errors.New("memory provider does not store data, revert not possible")
  1894. }
  1895. func (p *MemoryProvider) resetDatabase() error {
  1896. return errors.New("memory provider does not store data, reset not possible")
  1897. }