memory.go 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551
  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/internal/logger"
  25. "github.com/drakkan/sftpgo/v2/internal/util"
  26. "github.com/drakkan/sftpgo/v2/internal/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. // map for event actions, name is the key
  61. actions map[string]BaseEventAction
  62. // slice with ordered actions
  63. actionsNames []string
  64. // map for event actions, name is the key
  65. rules map[string]EventRule
  66. // slice with ordered rules
  67. rulesNames []string
  68. }
  69. // MemoryProvider defines the auth provider for a memory store
  70. type MemoryProvider struct {
  71. dbHandle *memoryProviderHandle
  72. }
  73. func initializeMemoryProvider(basePath string) {
  74. configFile := ""
  75. if util.IsFileInputValid(config.Name) {
  76. configFile = config.Name
  77. if !filepath.IsAbs(configFile) {
  78. configFile = filepath.Join(basePath, configFile)
  79. }
  80. }
  81. provider = &MemoryProvider{
  82. dbHandle: &memoryProviderHandle{
  83. isClosed: false,
  84. usernames: []string{},
  85. users: make(map[string]User),
  86. groupnames: []string{},
  87. groups: make(map[string]Group),
  88. vfolders: make(map[string]vfs.BaseVirtualFolder),
  89. vfoldersNames: []string{},
  90. admins: make(map[string]Admin),
  91. adminsUsernames: []string{},
  92. apiKeys: make(map[string]APIKey),
  93. apiKeysIDs: []string{},
  94. shares: make(map[string]Share),
  95. sharesIDs: []string{},
  96. actions: make(map[string]BaseEventAction),
  97. actionsNames: []string{},
  98. rules: make(map[string]EventRule),
  99. rulesNames: []string{},
  100. configFile: configFile,
  101. },
  102. }
  103. if err := provider.reloadConfig(); err != nil {
  104. logger.Error(logSender, "", "unable to load initial data: %v", err)
  105. logger.ErrorToConsole("unable to load initial data: %v", err)
  106. }
  107. }
  108. func (p *MemoryProvider) checkAvailability() error {
  109. p.dbHandle.Lock()
  110. defer p.dbHandle.Unlock()
  111. if p.dbHandle.isClosed {
  112. return errMemoryProviderClosed
  113. }
  114. return nil
  115. }
  116. func (p *MemoryProvider) close() error {
  117. p.dbHandle.Lock()
  118. defer p.dbHandle.Unlock()
  119. if p.dbHandle.isClosed {
  120. return errMemoryProviderClosed
  121. }
  122. p.dbHandle.isClosed = true
  123. return nil
  124. }
  125. func (p *MemoryProvider) validateUserAndTLSCert(username, protocol string, tlsCert *x509.Certificate) (User, error) {
  126. var user User
  127. if tlsCert == nil {
  128. return user, errors.New("TLS certificate 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 checkUserAndTLSCertificate(&user, protocol, tlsCert)
  136. }
  137. func (p *MemoryProvider) validateUserAndPass(username, password, ip, protocol string) (User, error) {
  138. user, err := p.userExists(username)
  139. if err != nil {
  140. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  141. return user, err
  142. }
  143. return checkUserAndPass(&user, password, ip, protocol)
  144. }
  145. func (p *MemoryProvider) validateUserAndPubKey(username string, pubKey []byte, isSSHCert bool) (User, string, error) {
  146. var user User
  147. if len(pubKey) == 0 {
  148. return user, "", errors.New("credentials cannot be null or empty")
  149. }
  150. user, err := p.userExists(username)
  151. if err != nil {
  152. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  153. return user, "", err
  154. }
  155. return checkUserAndPubKey(&user, pubKey, isSSHCert)
  156. }
  157. func (p *MemoryProvider) validateAdminAndPass(username, password, ip string) (Admin, error) {
  158. admin, err := p.adminExists(username)
  159. if err != nil {
  160. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  161. return admin, ErrInvalidCredentials
  162. }
  163. err = admin.checkUserAndPass(password, ip)
  164. return admin, err
  165. }
  166. func (p *MemoryProvider) updateAPIKeyLastUse(keyID string) error {
  167. p.dbHandle.Lock()
  168. defer p.dbHandle.Unlock()
  169. if p.dbHandle.isClosed {
  170. return errMemoryProviderClosed
  171. }
  172. apiKey, err := p.apiKeyExistsInternal(keyID)
  173. if err != nil {
  174. return err
  175. }
  176. apiKey.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  177. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey
  178. return nil
  179. }
  180. func (p *MemoryProvider) setUpdatedAt(username string) {
  181. p.dbHandle.Lock()
  182. defer p.dbHandle.Unlock()
  183. if p.dbHandle.isClosed {
  184. return
  185. }
  186. user, err := p.userExistsInternal(username)
  187. if err != nil {
  188. return
  189. }
  190. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  191. p.dbHandle.users[user.Username] = user
  192. setLastUserUpdate()
  193. }
  194. func (p *MemoryProvider) updateLastLogin(username string) 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. return err
  203. }
  204. user.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  205. p.dbHandle.users[user.Username] = user
  206. return nil
  207. }
  208. func (p *MemoryProvider) updateAdminLastLogin(username string) error {
  209. p.dbHandle.Lock()
  210. defer p.dbHandle.Unlock()
  211. if p.dbHandle.isClosed {
  212. return errMemoryProviderClosed
  213. }
  214. admin, err := p.adminExistsInternal(username)
  215. if err != nil {
  216. return err
  217. }
  218. admin.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  219. p.dbHandle.admins[admin.Username] = admin
  220. return nil
  221. }
  222. func (p *MemoryProvider) updateTransferQuota(username string, uploadSize, downloadSize int64, reset bool) error {
  223. p.dbHandle.Lock()
  224. defer p.dbHandle.Unlock()
  225. if p.dbHandle.isClosed {
  226. return errMemoryProviderClosed
  227. }
  228. user, err := p.userExistsInternal(username)
  229. if err != nil {
  230. providerLog(logger.LevelError, "unable to update transfer quota for user %#v error: %v", username, err)
  231. return err
  232. }
  233. if reset {
  234. user.UsedUploadDataTransfer = uploadSize
  235. user.UsedDownloadDataTransfer = downloadSize
  236. } else {
  237. user.UsedUploadDataTransfer += uploadSize
  238. user.UsedDownloadDataTransfer += downloadSize
  239. }
  240. user.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  241. providerLog(logger.LevelDebug, "transfer quota updated for user %#v, ul increment: %v dl increment: %v is reset? %v",
  242. username, uploadSize, downloadSize, reset)
  243. p.dbHandle.users[user.Username] = user
  244. return nil
  245. }
  246. func (p *MemoryProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  247. p.dbHandle.Lock()
  248. defer p.dbHandle.Unlock()
  249. if p.dbHandle.isClosed {
  250. return errMemoryProviderClosed
  251. }
  252. user, err := p.userExistsInternal(username)
  253. if err != nil {
  254. providerLog(logger.LevelError, "unable to update quota for user %#v error: %v", username, err)
  255. return err
  256. }
  257. if reset {
  258. user.UsedQuotaSize = sizeAdd
  259. user.UsedQuotaFiles = filesAdd
  260. } else {
  261. user.UsedQuotaSize += sizeAdd
  262. user.UsedQuotaFiles += filesAdd
  263. }
  264. user.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  265. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  266. username, filesAdd, sizeAdd, reset)
  267. p.dbHandle.users[user.Username] = user
  268. return nil
  269. }
  270. func (p *MemoryProvider) getUsedQuota(username string) (int, int64, int64, int64, error) {
  271. p.dbHandle.Lock()
  272. defer p.dbHandle.Unlock()
  273. if p.dbHandle.isClosed {
  274. return 0, 0, 0, 0, errMemoryProviderClosed
  275. }
  276. user, err := p.userExistsInternal(username)
  277. if err != nil {
  278. providerLog(logger.LevelError, "unable to get quota for user %#v error: %v", username, err)
  279. return 0, 0, 0, 0, err
  280. }
  281. return user.UsedQuotaFiles, user.UsedQuotaSize, user.UsedUploadDataTransfer, user.UsedDownloadDataTransfer, err
  282. }
  283. func (p *MemoryProvider) addUser(user *User) error {
  284. // we can query virtual folder while validating a user
  285. // so we have to check without holding the lock
  286. err := ValidateUser(user)
  287. if err != nil {
  288. return err
  289. }
  290. p.dbHandle.Lock()
  291. defer p.dbHandle.Unlock()
  292. if p.dbHandle.isClosed {
  293. return errMemoryProviderClosed
  294. }
  295. _, err = p.userExistsInternal(user.Username)
  296. if err == nil {
  297. return fmt.Errorf("username %#v already exists", user.Username)
  298. }
  299. user.ID = p.getNextID()
  300. user.LastQuotaUpdate = 0
  301. user.UsedQuotaSize = 0
  302. user.UsedQuotaFiles = 0
  303. user.UsedUploadDataTransfer = 0
  304. user.UsedDownloadDataTransfer = 0
  305. user.LastLogin = 0
  306. user.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  307. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  308. user.VirtualFolders = p.joinUserVirtualFoldersFields(user)
  309. for idx := range user.Groups {
  310. if err = p.addUserFromGroupMapping(user.Username, user.Groups[idx].Name); err != nil {
  311. return err
  312. }
  313. }
  314. p.dbHandle.users[user.Username] = user.getACopy()
  315. p.dbHandle.usernames = append(p.dbHandle.usernames, user.Username)
  316. sort.Strings(p.dbHandle.usernames)
  317. return nil
  318. }
  319. func (p *MemoryProvider) updateUser(user *User) error {
  320. // we can query virtual folder while validating a user
  321. // so we have to check without holding the lock
  322. err := ValidateUser(user)
  323. if err != nil {
  324. return err
  325. }
  326. p.dbHandle.Lock()
  327. defer p.dbHandle.Unlock()
  328. if p.dbHandle.isClosed {
  329. return errMemoryProviderClosed
  330. }
  331. u, err := p.userExistsInternal(user.Username)
  332. if err != nil {
  333. return err
  334. }
  335. for _, oldFolder := range u.VirtualFolders {
  336. p.removeRelationFromFolderMapping(oldFolder.Name, u.Username, "")
  337. }
  338. for idx := range u.Groups {
  339. if err = p.removeUserFromGroupMapping(u.Username, u.Groups[idx].Name); err != nil {
  340. return err
  341. }
  342. }
  343. user.VirtualFolders = p.joinUserVirtualFoldersFields(user)
  344. for idx := range user.Groups {
  345. if err = p.addUserFromGroupMapping(user.Username, user.Groups[idx].Name); err != nil {
  346. return err
  347. }
  348. }
  349. user.LastQuotaUpdate = u.LastQuotaUpdate
  350. user.UsedQuotaSize = u.UsedQuotaSize
  351. user.UsedQuotaFiles = u.UsedQuotaFiles
  352. user.UsedUploadDataTransfer = u.UsedUploadDataTransfer
  353. user.UsedDownloadDataTransfer = u.UsedDownloadDataTransfer
  354. user.LastLogin = u.LastLogin
  355. user.CreatedAt = u.CreatedAt
  356. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  357. user.ID = u.ID
  358. // pre-login and external auth hook will use the passed *user so save a copy
  359. p.dbHandle.users[user.Username] = user.getACopy()
  360. setLastUserUpdate()
  361. return nil
  362. }
  363. func (p *MemoryProvider) deleteUser(user User, softDelete bool) error {
  364. p.dbHandle.Lock()
  365. defer p.dbHandle.Unlock()
  366. if p.dbHandle.isClosed {
  367. return errMemoryProviderClosed
  368. }
  369. u, err := p.userExistsInternal(user.Username)
  370. if err != nil {
  371. return err
  372. }
  373. for _, oldFolder := range u.VirtualFolders {
  374. p.removeRelationFromFolderMapping(oldFolder.Name, u.Username, "")
  375. }
  376. for idx := range u.Groups {
  377. if err = p.removeUserFromGroupMapping(u.Username, u.Groups[idx].Name); err != nil {
  378. return err
  379. }
  380. }
  381. delete(p.dbHandle.users, user.Username)
  382. // this could be more efficient
  383. p.dbHandle.usernames = make([]string, 0, len(p.dbHandle.users))
  384. for username := range p.dbHandle.users {
  385. p.dbHandle.usernames = append(p.dbHandle.usernames, username)
  386. }
  387. sort.Strings(p.dbHandle.usernames)
  388. p.deleteAPIKeysWithUser(user.Username)
  389. p.deleteSharesWithUser(user.Username)
  390. return nil
  391. }
  392. func (p *MemoryProvider) updateUserPassword(username, password string) error {
  393. p.dbHandle.Lock()
  394. defer p.dbHandle.Unlock()
  395. if p.dbHandle.isClosed {
  396. return errMemoryProviderClosed
  397. }
  398. user, err := p.userExistsInternal(username)
  399. if err != nil {
  400. return err
  401. }
  402. user.Password = password
  403. p.dbHandle.users[username] = user
  404. return nil
  405. }
  406. func (p *MemoryProvider) dumpUsers() ([]User, error) {
  407. p.dbHandle.Lock()
  408. defer p.dbHandle.Unlock()
  409. users := make([]User, 0, len(p.dbHandle.usernames))
  410. var err error
  411. if p.dbHandle.isClosed {
  412. return users, errMemoryProviderClosed
  413. }
  414. for _, username := range p.dbHandle.usernames {
  415. u := p.dbHandle.users[username]
  416. user := u.getACopy()
  417. p.addVirtualFoldersToUser(&user)
  418. users = append(users, user)
  419. }
  420. return users, err
  421. }
  422. func (p *MemoryProvider) dumpFolders() ([]vfs.BaseVirtualFolder, error) {
  423. p.dbHandle.Lock()
  424. defer p.dbHandle.Unlock()
  425. folders := make([]vfs.BaseVirtualFolder, 0, len(p.dbHandle.vfoldersNames))
  426. if p.dbHandle.isClosed {
  427. return folders, errMemoryProviderClosed
  428. }
  429. for _, f := range p.dbHandle.vfolders {
  430. folders = append(folders, f)
  431. }
  432. return folders, nil
  433. }
  434. func (p *MemoryProvider) getRecentlyUpdatedUsers(after int64) ([]User, error) {
  435. if getLastUserUpdate() < after {
  436. return nil, nil
  437. }
  438. p.dbHandle.Lock()
  439. defer p.dbHandle.Unlock()
  440. if p.dbHandle.isClosed {
  441. return nil, errMemoryProviderClosed
  442. }
  443. users := make([]User, 0, 10)
  444. for _, username := range p.dbHandle.usernames {
  445. u := p.dbHandle.users[username]
  446. if u.UpdatedAt < after {
  447. continue
  448. }
  449. user := u.getACopy()
  450. p.addVirtualFoldersToUser(&user)
  451. if len(user.Groups) > 0 {
  452. groupMapping := make(map[string]Group)
  453. for idx := range user.Groups {
  454. group, err := p.groupExistsInternal(user.Groups[idx].Name)
  455. if err != nil {
  456. continue
  457. }
  458. groupMapping[group.Name] = group
  459. }
  460. user.applyGroupSettings(groupMapping)
  461. }
  462. user.SetEmptySecretsIfNil()
  463. users = append(users, user)
  464. }
  465. return users, nil
  466. }
  467. func (p *MemoryProvider) getUsersForQuotaCheck(toFetch map[string]bool) ([]User, error) {
  468. users := make([]User, 0, 30)
  469. p.dbHandle.Lock()
  470. defer p.dbHandle.Unlock()
  471. if p.dbHandle.isClosed {
  472. return users, errMemoryProviderClosed
  473. }
  474. for _, username := range p.dbHandle.usernames {
  475. if needFolders, ok := toFetch[username]; ok {
  476. u := p.dbHandle.users[username]
  477. user := u.getACopy()
  478. if needFolders {
  479. p.addVirtualFoldersToUser(&user)
  480. }
  481. if len(user.Groups) > 0 {
  482. groupMapping := make(map[string]Group)
  483. for idx := range user.Groups {
  484. group, err := p.groupExistsInternal(user.Groups[idx].Name)
  485. if err != nil {
  486. continue
  487. }
  488. groupMapping[group.Name] = group
  489. }
  490. user.applyGroupSettings(groupMapping)
  491. }
  492. user.SetEmptySecretsIfNil()
  493. user.PrepareForRendering()
  494. users = append(users, user)
  495. }
  496. }
  497. return users, nil
  498. }
  499. func (p *MemoryProvider) getUsers(limit int, offset int, order string) ([]User, error) {
  500. users := make([]User, 0, limit)
  501. var err error
  502. p.dbHandle.Lock()
  503. defer p.dbHandle.Unlock()
  504. if p.dbHandle.isClosed {
  505. return users, errMemoryProviderClosed
  506. }
  507. if limit <= 0 {
  508. return users, err
  509. }
  510. itNum := 0
  511. if order == OrderASC {
  512. for _, username := range p.dbHandle.usernames {
  513. itNum++
  514. if itNum <= offset {
  515. continue
  516. }
  517. u := p.dbHandle.users[username]
  518. user := u.getACopy()
  519. p.addVirtualFoldersToUser(&user)
  520. user.PrepareForRendering()
  521. users = append(users, user)
  522. if len(users) >= limit {
  523. break
  524. }
  525. }
  526. } else {
  527. for i := len(p.dbHandle.usernames) - 1; i >= 0; i-- {
  528. itNum++
  529. if itNum <= offset {
  530. continue
  531. }
  532. username := p.dbHandle.usernames[i]
  533. u := p.dbHandle.users[username]
  534. user := u.getACopy()
  535. p.addVirtualFoldersToUser(&user)
  536. user.PrepareForRendering()
  537. users = append(users, user)
  538. if len(users) >= limit {
  539. break
  540. }
  541. }
  542. }
  543. return users, err
  544. }
  545. func (p *MemoryProvider) userExists(username string) (User, error) {
  546. p.dbHandle.Lock()
  547. defer p.dbHandle.Unlock()
  548. if p.dbHandle.isClosed {
  549. return User{}, errMemoryProviderClosed
  550. }
  551. user, err := p.userExistsInternal(username)
  552. if err != nil {
  553. return user, err
  554. }
  555. p.addVirtualFoldersToUser(&user)
  556. return user, nil
  557. }
  558. func (p *MemoryProvider) userExistsInternal(username string) (User, error) {
  559. if val, ok := p.dbHandle.users[username]; ok {
  560. return val.getACopy(), nil
  561. }
  562. return User{}, util.NewRecordNotFoundError(fmt.Sprintf("username %q does not exist", username))
  563. }
  564. func (p *MemoryProvider) groupExistsInternal(name string) (Group, error) {
  565. if val, ok := p.dbHandle.groups[name]; ok {
  566. return val.getACopy(), nil
  567. }
  568. return Group{}, util.NewRecordNotFoundError(fmt.Sprintf("group %q does not exist", name))
  569. }
  570. func (p *MemoryProvider) actionExistsInternal(name string) (BaseEventAction, error) {
  571. if val, ok := p.dbHandle.actions[name]; ok {
  572. return val.getACopy(), nil
  573. }
  574. return BaseEventAction{}, util.NewRecordNotFoundError(fmt.Sprintf("event action %q does not exist", name))
  575. }
  576. func (p *MemoryProvider) ruleExistsInternal(name string) (EventRule, error) {
  577. if val, ok := p.dbHandle.rules[name]; ok {
  578. return val.getACopy(), nil
  579. }
  580. return EventRule{}, util.NewRecordNotFoundError(fmt.Sprintf("event rule %q does not exist", name))
  581. }
  582. func (p *MemoryProvider) addAdmin(admin *Admin) error {
  583. p.dbHandle.Lock()
  584. defer p.dbHandle.Unlock()
  585. if p.dbHandle.isClosed {
  586. return errMemoryProviderClosed
  587. }
  588. err := admin.validate()
  589. if err != nil {
  590. return err
  591. }
  592. _, err = p.adminExistsInternal(admin.Username)
  593. if err == nil {
  594. return fmt.Errorf("admin %#v already exists", admin.Username)
  595. }
  596. admin.ID = p.getNextAdminID()
  597. admin.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  598. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  599. admin.LastLogin = 0
  600. p.dbHandle.admins[admin.Username] = admin.getACopy()
  601. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, admin.Username)
  602. sort.Strings(p.dbHandle.adminsUsernames)
  603. return nil
  604. }
  605. func (p *MemoryProvider) updateAdmin(admin *Admin) error {
  606. p.dbHandle.Lock()
  607. defer p.dbHandle.Unlock()
  608. if p.dbHandle.isClosed {
  609. return errMemoryProviderClosed
  610. }
  611. err := admin.validate()
  612. if err != nil {
  613. return err
  614. }
  615. a, err := p.adminExistsInternal(admin.Username)
  616. if err != nil {
  617. return err
  618. }
  619. admin.ID = a.ID
  620. admin.CreatedAt = a.CreatedAt
  621. admin.LastLogin = a.LastLogin
  622. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  623. p.dbHandle.admins[admin.Username] = admin.getACopy()
  624. return nil
  625. }
  626. func (p *MemoryProvider) deleteAdmin(admin Admin) error {
  627. p.dbHandle.Lock()
  628. defer p.dbHandle.Unlock()
  629. if p.dbHandle.isClosed {
  630. return errMemoryProviderClosed
  631. }
  632. _, err := p.adminExistsInternal(admin.Username)
  633. if err != nil {
  634. return err
  635. }
  636. delete(p.dbHandle.admins, admin.Username)
  637. // this could be more efficient
  638. p.dbHandle.adminsUsernames = make([]string, 0, len(p.dbHandle.admins))
  639. for username := range p.dbHandle.admins {
  640. p.dbHandle.adminsUsernames = append(p.dbHandle.adminsUsernames, username)
  641. }
  642. sort.Strings(p.dbHandle.adminsUsernames)
  643. p.deleteAPIKeysWithAdmin(admin.Username)
  644. return nil
  645. }
  646. func (p *MemoryProvider) adminExists(username string) (Admin, error) {
  647. p.dbHandle.Lock()
  648. defer p.dbHandle.Unlock()
  649. if p.dbHandle.isClosed {
  650. return Admin{}, errMemoryProviderClosed
  651. }
  652. return p.adminExistsInternal(username)
  653. }
  654. func (p *MemoryProvider) adminExistsInternal(username string) (Admin, error) {
  655. if val, ok := p.dbHandle.admins[username]; ok {
  656. return val.getACopy(), nil
  657. }
  658. return Admin{}, util.NewRecordNotFoundError(fmt.Sprintf("admin %#v does not exist", username))
  659. }
  660. func (p *MemoryProvider) dumpAdmins() ([]Admin, error) {
  661. p.dbHandle.Lock()
  662. defer p.dbHandle.Unlock()
  663. admins := make([]Admin, 0, len(p.dbHandle.admins))
  664. if p.dbHandle.isClosed {
  665. return admins, errMemoryProviderClosed
  666. }
  667. for _, admin := range p.dbHandle.admins {
  668. admins = append(admins, admin)
  669. }
  670. return admins, nil
  671. }
  672. func (p *MemoryProvider) getAdmins(limit int, offset int, order string) ([]Admin, error) {
  673. admins := make([]Admin, 0, limit)
  674. p.dbHandle.Lock()
  675. defer p.dbHandle.Unlock()
  676. if p.dbHandle.isClosed {
  677. return admins, errMemoryProviderClosed
  678. }
  679. if limit <= 0 {
  680. return admins, nil
  681. }
  682. itNum := 0
  683. if order == OrderASC {
  684. for _, username := range p.dbHandle.adminsUsernames {
  685. itNum++
  686. if itNum <= offset {
  687. continue
  688. }
  689. a := p.dbHandle.admins[username]
  690. admin := a.getACopy()
  691. admin.HideConfidentialData()
  692. admins = append(admins, admin)
  693. if len(admins) >= limit {
  694. break
  695. }
  696. }
  697. } else {
  698. for i := len(p.dbHandle.adminsUsernames) - 1; i >= 0; i-- {
  699. itNum++
  700. if itNum <= offset {
  701. continue
  702. }
  703. username := p.dbHandle.adminsUsernames[i]
  704. a := p.dbHandle.admins[username]
  705. admin := a.getACopy()
  706. admin.HideConfidentialData()
  707. admins = append(admins, admin)
  708. if len(admins) >= limit {
  709. break
  710. }
  711. }
  712. }
  713. return admins, nil
  714. }
  715. func (p *MemoryProvider) updateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool) error {
  716. p.dbHandle.Lock()
  717. defer p.dbHandle.Unlock()
  718. if p.dbHandle.isClosed {
  719. return errMemoryProviderClosed
  720. }
  721. folder, err := p.folderExistsInternal(name)
  722. if err != nil {
  723. providerLog(logger.LevelError, "unable to update quota for folder %#v error: %v", name, err)
  724. return err
  725. }
  726. if reset {
  727. folder.UsedQuotaSize = sizeAdd
  728. folder.UsedQuotaFiles = filesAdd
  729. } else {
  730. folder.UsedQuotaSize += sizeAdd
  731. folder.UsedQuotaFiles += filesAdd
  732. }
  733. folder.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  734. p.dbHandle.vfolders[name] = folder
  735. return nil
  736. }
  737. func (p *MemoryProvider) getGroups(limit, offset int, order string, minimal bool) ([]Group, error) {
  738. p.dbHandle.Lock()
  739. defer p.dbHandle.Unlock()
  740. if p.dbHandle.isClosed {
  741. return nil, errMemoryProviderClosed
  742. }
  743. if limit <= 0 {
  744. return nil, nil
  745. }
  746. groups := make([]Group, 0, limit)
  747. itNum := 0
  748. if order == OrderASC {
  749. for _, name := range p.dbHandle.groupnames {
  750. itNum++
  751. if itNum <= offset {
  752. continue
  753. }
  754. g := p.dbHandle.groups[name]
  755. group := g.getACopy()
  756. p.addVirtualFoldersToGroup(&group)
  757. group.PrepareForRendering()
  758. groups = append(groups, group)
  759. if len(groups) >= limit {
  760. break
  761. }
  762. }
  763. } else {
  764. for i := len(p.dbHandle.groupnames) - 1; i >= 0; i-- {
  765. itNum++
  766. if itNum <= offset {
  767. continue
  768. }
  769. name := p.dbHandle.groupnames[i]
  770. g := p.dbHandle.groups[name]
  771. group := g.getACopy()
  772. p.addVirtualFoldersToGroup(&group)
  773. group.PrepareForRendering()
  774. groups = append(groups, group)
  775. if len(groups) >= limit {
  776. break
  777. }
  778. }
  779. }
  780. return groups, nil
  781. }
  782. func (p *MemoryProvider) getGroupsWithNames(names []string) ([]Group, error) {
  783. p.dbHandle.Lock()
  784. defer p.dbHandle.Unlock()
  785. if p.dbHandle.isClosed {
  786. return nil, errMemoryProviderClosed
  787. }
  788. groups := make([]Group, 0, len(names))
  789. for _, name := range names {
  790. if val, ok := p.dbHandle.groups[name]; ok {
  791. group := val.getACopy()
  792. p.addVirtualFoldersToGroup(&group)
  793. groups = append(groups, group)
  794. }
  795. }
  796. return groups, nil
  797. }
  798. func (p *MemoryProvider) getUsersInGroups(names []string) ([]string, error) {
  799. p.dbHandle.Lock()
  800. defer p.dbHandle.Unlock()
  801. if p.dbHandle.isClosed {
  802. return nil, errMemoryProviderClosed
  803. }
  804. var users []string
  805. for _, name := range names {
  806. if val, ok := p.dbHandle.groups[name]; ok {
  807. group := val.getACopy()
  808. users = append(users, group.Users...)
  809. }
  810. }
  811. return users, nil
  812. }
  813. func (p *MemoryProvider) groupExists(name string) (Group, error) {
  814. p.dbHandle.Lock()
  815. defer p.dbHandle.Unlock()
  816. if p.dbHandle.isClosed {
  817. return Group{}, errMemoryProviderClosed
  818. }
  819. group, err := p.groupExistsInternal(name)
  820. if err != nil {
  821. return group, err
  822. }
  823. p.addVirtualFoldersToGroup(&group)
  824. return group, nil
  825. }
  826. func (p *MemoryProvider) addGroup(group *Group) error {
  827. if err := group.validate(); err != nil {
  828. return err
  829. }
  830. p.dbHandle.Lock()
  831. defer p.dbHandle.Unlock()
  832. if p.dbHandle.isClosed {
  833. return errMemoryProviderClosed
  834. }
  835. _, err := p.groupExistsInternal(group.Name)
  836. if err == nil {
  837. return fmt.Errorf("group %#v already exists", group.Name)
  838. }
  839. group.ID = p.getNextGroupID()
  840. group.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  841. group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  842. group.VirtualFolders = p.joinGroupVirtualFoldersFields(group)
  843. p.dbHandle.groups[group.Name] = group.getACopy()
  844. p.dbHandle.groupnames = append(p.dbHandle.groupnames, group.Name)
  845. sort.Strings(p.dbHandle.groupnames)
  846. return nil
  847. }
  848. func (p *MemoryProvider) updateGroup(group *Group) error {
  849. if err := group.validate(); err != nil {
  850. return err
  851. }
  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. for _, oldFolder := range g.VirtualFolders {
  862. p.removeRelationFromFolderMapping(oldFolder.Name, "", g.Name)
  863. }
  864. group.VirtualFolders = p.joinGroupVirtualFoldersFields(group)
  865. group.CreatedAt = g.CreatedAt
  866. group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  867. group.ID = g.ID
  868. p.dbHandle.groups[group.Name] = group.getACopy()
  869. return nil
  870. }
  871. func (p *MemoryProvider) deleteGroup(group Group) error {
  872. p.dbHandle.Lock()
  873. defer p.dbHandle.Unlock()
  874. if p.dbHandle.isClosed {
  875. return errMemoryProviderClosed
  876. }
  877. g, err := p.groupExistsInternal(group.Name)
  878. if err != nil {
  879. return err
  880. }
  881. if len(g.Users) > 0 {
  882. return util.NewValidationError(fmt.Sprintf("the group %#v is referenced, it cannot be removed", group.Name))
  883. }
  884. for _, oldFolder := range g.VirtualFolders {
  885. p.removeRelationFromFolderMapping(oldFolder.Name, "", g.Name)
  886. }
  887. delete(p.dbHandle.groups, group.Name)
  888. // this could be more efficient
  889. p.dbHandle.groupnames = make([]string, 0, len(p.dbHandle.groups))
  890. for name := range p.dbHandle.groups {
  891. p.dbHandle.groupnames = append(p.dbHandle.groupnames, name)
  892. }
  893. sort.Strings(p.dbHandle.groupnames)
  894. return nil
  895. }
  896. func (p *MemoryProvider) dumpGroups() ([]Group, error) {
  897. p.dbHandle.Lock()
  898. defer p.dbHandle.Unlock()
  899. groups := make([]Group, 0, len(p.dbHandle.groups))
  900. var err error
  901. if p.dbHandle.isClosed {
  902. return groups, errMemoryProviderClosed
  903. }
  904. for _, name := range p.dbHandle.groupnames {
  905. g := p.dbHandle.groups[name]
  906. group := g.getACopy()
  907. p.addVirtualFoldersToGroup(&group)
  908. groups = append(groups, group)
  909. }
  910. return groups, err
  911. }
  912. func (p *MemoryProvider) getUsedFolderQuota(name string) (int, int64, error) {
  913. p.dbHandle.Lock()
  914. defer p.dbHandle.Unlock()
  915. if p.dbHandle.isClosed {
  916. return 0, 0, errMemoryProviderClosed
  917. }
  918. folder, err := p.folderExistsInternal(name)
  919. if err != nil {
  920. providerLog(logger.LevelError, "unable to get quota for folder %#v error: %v", name, err)
  921. return 0, 0, err
  922. }
  923. return folder.UsedQuotaFiles, folder.UsedQuotaSize, err
  924. }
  925. func (p *MemoryProvider) joinGroupVirtualFoldersFields(group *Group) []vfs.VirtualFolder {
  926. var folders []vfs.VirtualFolder
  927. for idx := range group.VirtualFolders {
  928. folder := &group.VirtualFolders[idx]
  929. f, err := p.addOrUpdateFolderInternal(&folder.BaseVirtualFolder, "", group.Name, 0, 0, 0)
  930. if err == nil {
  931. folder.BaseVirtualFolder = f
  932. folders = append(folders, *folder)
  933. }
  934. }
  935. return folders
  936. }
  937. func (p *MemoryProvider) addVirtualFoldersToGroup(group *Group) {
  938. if len(group.VirtualFolders) > 0 {
  939. var folders []vfs.VirtualFolder
  940. for idx := range group.VirtualFolders {
  941. folder := &group.VirtualFolders[idx]
  942. baseFolder, err := p.folderExistsInternal(folder.Name)
  943. if err != nil {
  944. continue
  945. }
  946. folder.BaseVirtualFolder = baseFolder.GetACopy()
  947. folders = append(folders, *folder)
  948. }
  949. group.VirtualFolders = folders
  950. }
  951. }
  952. func (p *MemoryProvider) addActionsToRule(rule *EventRule) {
  953. var actions []EventAction
  954. for idx := range rule.Actions {
  955. action := &rule.Actions[idx]
  956. baseAction, err := p.actionExistsInternal(action.Name)
  957. if err != nil {
  958. continue
  959. }
  960. baseAction.Options.SetEmptySecretsIfNil()
  961. action.BaseEventAction = baseAction
  962. actions = append(actions, *action)
  963. }
  964. rule.Actions = actions
  965. }
  966. func (p *MemoryProvider) addRuleToActionMapping(ruleName, actionName string) error {
  967. a, err := p.actionExistsInternal(actionName)
  968. if err != nil {
  969. return util.NewGenericError(fmt.Sprintf("action %q does not exist", actionName))
  970. }
  971. if !util.Contains(a.Rules, ruleName) {
  972. a.Rules = append(a.Rules, ruleName)
  973. p.dbHandle.actions[actionName] = a
  974. }
  975. return nil
  976. }
  977. func (p *MemoryProvider) removeRuleFromActionMapping(ruleName, actionName string) error {
  978. a, err := p.actionExistsInternal(actionName)
  979. if err != nil {
  980. providerLog(logger.LevelWarn, "action %q does not exist, cannot remove from mapping", actionName)
  981. return nil
  982. }
  983. if util.Contains(a.Rules, ruleName) {
  984. var rules []string
  985. for _, r := range a.Rules {
  986. if r != ruleName {
  987. rules = append(rules, r)
  988. }
  989. }
  990. a.Rules = rules
  991. p.dbHandle.actions[actionName] = a
  992. }
  993. return nil
  994. }
  995. func (p *MemoryProvider) addUserFromGroupMapping(username, groupname string) error {
  996. g, err := p.groupExistsInternal(groupname)
  997. if err != nil {
  998. return err
  999. }
  1000. if !util.Contains(g.Users, username) {
  1001. g.Users = append(g.Users, username)
  1002. p.dbHandle.groups[groupname] = g
  1003. }
  1004. return nil
  1005. }
  1006. func (p *MemoryProvider) removeUserFromGroupMapping(username, groupname string) error {
  1007. g, err := p.groupExistsInternal(groupname)
  1008. if err != nil {
  1009. return err
  1010. }
  1011. if util.Contains(g.Users, username) {
  1012. var users []string
  1013. for _, u := range g.Users {
  1014. if u != username {
  1015. users = append(users, u)
  1016. }
  1017. }
  1018. g.Users = users
  1019. p.dbHandle.groups[groupname] = g
  1020. }
  1021. return nil
  1022. }
  1023. func (p *MemoryProvider) joinUserVirtualFoldersFields(user *User) []vfs.VirtualFolder {
  1024. var folders []vfs.VirtualFolder
  1025. for idx := range user.VirtualFolders {
  1026. folder := &user.VirtualFolders[idx]
  1027. f, err := p.addOrUpdateFolderInternal(&folder.BaseVirtualFolder, user.Username, "", 0, 0, 0)
  1028. if err == nil {
  1029. folder.BaseVirtualFolder = f
  1030. folders = append(folders, *folder)
  1031. }
  1032. }
  1033. return folders
  1034. }
  1035. func (p *MemoryProvider) addVirtualFoldersToUser(user *User) {
  1036. if len(user.VirtualFolders) > 0 {
  1037. var folders []vfs.VirtualFolder
  1038. for idx := range user.VirtualFolders {
  1039. folder := &user.VirtualFolders[idx]
  1040. baseFolder, err := p.folderExistsInternal(folder.Name)
  1041. if err != nil {
  1042. continue
  1043. }
  1044. folder.BaseVirtualFolder = baseFolder.GetACopy()
  1045. folders = append(folders, *folder)
  1046. }
  1047. user.VirtualFolders = folders
  1048. }
  1049. }
  1050. func (p *MemoryProvider) removeRelationFromFolderMapping(folderName, username, groupname string) {
  1051. folder, err := p.folderExistsInternal(folderName)
  1052. if err == nil {
  1053. if username != "" {
  1054. var usernames []string
  1055. for _, user := range folder.Users {
  1056. if user != username {
  1057. usernames = append(usernames, user)
  1058. }
  1059. }
  1060. folder.Users = usernames
  1061. }
  1062. if groupname != "" {
  1063. var groups []string
  1064. for _, group := range folder.Groups {
  1065. if group != groupname {
  1066. groups = append(groups, group)
  1067. }
  1068. }
  1069. folder.Groups = groups
  1070. }
  1071. p.dbHandle.vfolders[folder.Name] = folder
  1072. }
  1073. }
  1074. func (p *MemoryProvider) updateFoldersMappingInternal(folder vfs.BaseVirtualFolder) {
  1075. p.dbHandle.vfolders[folder.Name] = folder
  1076. if !util.Contains(p.dbHandle.vfoldersNames, folder.Name) {
  1077. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  1078. sort.Strings(p.dbHandle.vfoldersNames)
  1079. }
  1080. }
  1081. func (p *MemoryProvider) addOrUpdateFolderInternal(baseFolder *vfs.BaseVirtualFolder, username, groupname string,
  1082. usedQuotaSize int64, usedQuotaFiles int, lastQuotaUpdate int64,
  1083. ) (vfs.BaseVirtualFolder, error) {
  1084. folder, err := p.folderExistsInternal(baseFolder.Name)
  1085. if err == nil {
  1086. // exists
  1087. folder.MappedPath = baseFolder.MappedPath
  1088. folder.Description = baseFolder.Description
  1089. folder.FsConfig = baseFolder.FsConfig.GetACopy()
  1090. if username != "" && !util.Contains(folder.Users, username) {
  1091. folder.Users = append(folder.Users, username)
  1092. }
  1093. if groupname != "" && !util.Contains(folder.Groups, groupname) {
  1094. folder.Groups = append(folder.Groups, groupname)
  1095. }
  1096. p.updateFoldersMappingInternal(folder)
  1097. return folder, nil
  1098. }
  1099. if _, ok := err.(*util.RecordNotFoundError); ok {
  1100. folder = baseFolder.GetACopy()
  1101. folder.ID = p.getNextFolderID()
  1102. folder.UsedQuotaSize = usedQuotaSize
  1103. folder.UsedQuotaFiles = usedQuotaFiles
  1104. folder.LastQuotaUpdate = lastQuotaUpdate
  1105. if username != "" {
  1106. folder.Users = []string{username}
  1107. }
  1108. if groupname != "" {
  1109. folder.Groups = []string{groupname}
  1110. }
  1111. p.updateFoldersMappingInternal(folder)
  1112. return folder, nil
  1113. }
  1114. return folder, err
  1115. }
  1116. func (p *MemoryProvider) folderExistsInternal(name string) (vfs.BaseVirtualFolder, error) {
  1117. if val, ok := p.dbHandle.vfolders[name]; ok {
  1118. return val, nil
  1119. }
  1120. return vfs.BaseVirtualFolder{}, util.NewRecordNotFoundError(fmt.Sprintf("folder %#v does not exist", name))
  1121. }
  1122. func (p *MemoryProvider) getFolders(limit, offset int, order string, minimal bool) ([]vfs.BaseVirtualFolder, error) {
  1123. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  1124. var err error
  1125. p.dbHandle.Lock()
  1126. defer p.dbHandle.Unlock()
  1127. if p.dbHandle.isClosed {
  1128. return folders, errMemoryProviderClosed
  1129. }
  1130. if limit <= 0 {
  1131. return folders, err
  1132. }
  1133. itNum := 0
  1134. if order == OrderASC {
  1135. for _, name := range p.dbHandle.vfoldersNames {
  1136. itNum++
  1137. if itNum <= offset {
  1138. continue
  1139. }
  1140. f := p.dbHandle.vfolders[name]
  1141. folder := f.GetACopy()
  1142. folder.PrepareForRendering()
  1143. folders = append(folders, folder)
  1144. if len(folders) >= limit {
  1145. break
  1146. }
  1147. }
  1148. } else {
  1149. for i := len(p.dbHandle.vfoldersNames) - 1; i >= 0; i-- {
  1150. itNum++
  1151. if itNum <= offset {
  1152. continue
  1153. }
  1154. name := p.dbHandle.vfoldersNames[i]
  1155. f := p.dbHandle.vfolders[name]
  1156. folder := f.GetACopy()
  1157. folder.PrepareForRendering()
  1158. folders = append(folders, folder)
  1159. if len(folders) >= limit {
  1160. break
  1161. }
  1162. }
  1163. }
  1164. return folders, err
  1165. }
  1166. func (p *MemoryProvider) getFolderByName(name string) (vfs.BaseVirtualFolder, error) {
  1167. p.dbHandle.Lock()
  1168. defer p.dbHandle.Unlock()
  1169. if p.dbHandle.isClosed {
  1170. return vfs.BaseVirtualFolder{}, errMemoryProviderClosed
  1171. }
  1172. folder, err := p.folderExistsInternal(name)
  1173. if err != nil {
  1174. return vfs.BaseVirtualFolder{}, err
  1175. }
  1176. return folder.GetACopy(), nil
  1177. }
  1178. func (p *MemoryProvider) addFolder(folder *vfs.BaseVirtualFolder) error {
  1179. err := ValidateFolder(folder)
  1180. if err != nil {
  1181. return err
  1182. }
  1183. p.dbHandle.Lock()
  1184. defer p.dbHandle.Unlock()
  1185. if p.dbHandle.isClosed {
  1186. return errMemoryProviderClosed
  1187. }
  1188. _, err = p.folderExistsInternal(folder.Name)
  1189. if err == nil {
  1190. return fmt.Errorf("folder %#v already exists", folder.Name)
  1191. }
  1192. folder.ID = p.getNextFolderID()
  1193. folder.Users = nil
  1194. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  1195. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, folder.Name)
  1196. sort.Strings(p.dbHandle.vfoldersNames)
  1197. return nil
  1198. }
  1199. func (p *MemoryProvider) updateFolder(folder *vfs.BaseVirtualFolder) error {
  1200. err := ValidateFolder(folder)
  1201. if err != nil {
  1202. return err
  1203. }
  1204. p.dbHandle.Lock()
  1205. defer p.dbHandle.Unlock()
  1206. if p.dbHandle.isClosed {
  1207. return errMemoryProviderClosed
  1208. }
  1209. f, err := p.folderExistsInternal(folder.Name)
  1210. if err != nil {
  1211. return err
  1212. }
  1213. folder.ID = f.ID
  1214. folder.LastQuotaUpdate = f.LastQuotaUpdate
  1215. folder.UsedQuotaFiles = f.UsedQuotaFiles
  1216. folder.UsedQuotaSize = f.UsedQuotaSize
  1217. folder.Users = f.Users
  1218. p.dbHandle.vfolders[folder.Name] = folder.GetACopy()
  1219. // now update the related users
  1220. for _, username := range folder.Users {
  1221. user, err := p.userExistsInternal(username)
  1222. if err == nil {
  1223. var folders []vfs.VirtualFolder
  1224. for idx := range user.VirtualFolders {
  1225. userFolder := &user.VirtualFolders[idx]
  1226. if folder.Name == userFolder.Name {
  1227. userFolder.BaseVirtualFolder = folder.GetACopy()
  1228. }
  1229. folders = append(folders, *userFolder)
  1230. }
  1231. user.VirtualFolders = folders
  1232. p.dbHandle.users[user.Username] = user
  1233. }
  1234. }
  1235. return nil
  1236. }
  1237. func (p *MemoryProvider) deleteFolder(folder vfs.BaseVirtualFolder) error {
  1238. p.dbHandle.Lock()
  1239. defer p.dbHandle.Unlock()
  1240. if p.dbHandle.isClosed {
  1241. return errMemoryProviderClosed
  1242. }
  1243. _, err := p.folderExistsInternal(folder.Name)
  1244. if err != nil {
  1245. return err
  1246. }
  1247. for _, username := range folder.Users {
  1248. user, err := p.userExistsInternal(username)
  1249. if err == nil {
  1250. var folders []vfs.VirtualFolder
  1251. for idx := range user.VirtualFolders {
  1252. userFolder := &user.VirtualFolders[idx]
  1253. if folder.Name != userFolder.Name {
  1254. folders = append(folders, *userFolder)
  1255. }
  1256. }
  1257. user.VirtualFolders = folders
  1258. p.dbHandle.users[user.Username] = user
  1259. }
  1260. }
  1261. for _, groupname := range folder.Groups {
  1262. group, err := p.groupExistsInternal(groupname)
  1263. if err == nil {
  1264. var folders []vfs.VirtualFolder
  1265. for idx := range group.VirtualFolders {
  1266. groupFolder := &group.VirtualFolders[idx]
  1267. if folder.Name != groupFolder.Name {
  1268. folders = append(folders, *groupFolder)
  1269. }
  1270. }
  1271. group.VirtualFolders = folders
  1272. p.dbHandle.groups[group.Name] = group
  1273. }
  1274. }
  1275. delete(p.dbHandle.vfolders, folder.Name)
  1276. p.dbHandle.vfoldersNames = []string{}
  1277. for name := range p.dbHandle.vfolders {
  1278. p.dbHandle.vfoldersNames = append(p.dbHandle.vfoldersNames, name)
  1279. }
  1280. sort.Strings(p.dbHandle.vfoldersNames)
  1281. return nil
  1282. }
  1283. func (p *MemoryProvider) apiKeyExistsInternal(keyID string) (APIKey, error) {
  1284. if val, ok := p.dbHandle.apiKeys[keyID]; ok {
  1285. return val.getACopy(), nil
  1286. }
  1287. return APIKey{}, util.NewRecordNotFoundError(fmt.Sprintf("API key %#v does not exist", keyID))
  1288. }
  1289. func (p *MemoryProvider) apiKeyExists(keyID string) (APIKey, error) {
  1290. p.dbHandle.Lock()
  1291. defer p.dbHandle.Unlock()
  1292. if p.dbHandle.isClosed {
  1293. return APIKey{}, errMemoryProviderClosed
  1294. }
  1295. return p.apiKeyExistsInternal(keyID)
  1296. }
  1297. func (p *MemoryProvider) addAPIKey(apiKey *APIKey) error {
  1298. err := apiKey.validate()
  1299. if err != nil {
  1300. return err
  1301. }
  1302. p.dbHandle.Lock()
  1303. defer p.dbHandle.Unlock()
  1304. if p.dbHandle.isClosed {
  1305. return errMemoryProviderClosed
  1306. }
  1307. _, err = p.apiKeyExistsInternal(apiKey.KeyID)
  1308. if err == nil {
  1309. return fmt.Errorf("API key %#v already exists", apiKey.KeyID)
  1310. }
  1311. if apiKey.User != "" {
  1312. if _, err := p.userExistsInternal(apiKey.User); err != nil {
  1313. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", apiKey.User))
  1314. }
  1315. }
  1316. if apiKey.Admin != "" {
  1317. if _, err := p.adminExistsInternal(apiKey.Admin); err != nil {
  1318. return util.NewValidationError(fmt.Sprintf("related admin %#v does not exists", apiKey.User))
  1319. }
  1320. }
  1321. apiKey.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1322. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1323. apiKey.LastUseAt = 0
  1324. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey.getACopy()
  1325. p.dbHandle.apiKeysIDs = append(p.dbHandle.apiKeysIDs, apiKey.KeyID)
  1326. sort.Strings(p.dbHandle.apiKeysIDs)
  1327. return nil
  1328. }
  1329. func (p *MemoryProvider) updateAPIKey(apiKey *APIKey) error {
  1330. err := apiKey.validate()
  1331. if err != nil {
  1332. return err
  1333. }
  1334. p.dbHandle.Lock()
  1335. defer p.dbHandle.Unlock()
  1336. if p.dbHandle.isClosed {
  1337. return errMemoryProviderClosed
  1338. }
  1339. k, err := p.apiKeyExistsInternal(apiKey.KeyID)
  1340. if err != nil {
  1341. return err
  1342. }
  1343. if apiKey.User != "" {
  1344. if _, err := p.userExistsInternal(apiKey.User); err != nil {
  1345. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", apiKey.User))
  1346. }
  1347. }
  1348. if apiKey.Admin != "" {
  1349. if _, err := p.adminExistsInternal(apiKey.Admin); err != nil {
  1350. return util.NewValidationError(fmt.Sprintf("related admin %#v does not exists", apiKey.User))
  1351. }
  1352. }
  1353. apiKey.ID = k.ID
  1354. apiKey.KeyID = k.KeyID
  1355. apiKey.Key = k.Key
  1356. apiKey.CreatedAt = k.CreatedAt
  1357. apiKey.LastUseAt = k.LastUseAt
  1358. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1359. p.dbHandle.apiKeys[apiKey.KeyID] = apiKey.getACopy()
  1360. return nil
  1361. }
  1362. func (p *MemoryProvider) deleteAPIKey(apiKey APIKey) error {
  1363. p.dbHandle.Lock()
  1364. defer p.dbHandle.Unlock()
  1365. if p.dbHandle.isClosed {
  1366. return errMemoryProviderClosed
  1367. }
  1368. _, err := p.apiKeyExistsInternal(apiKey.KeyID)
  1369. if err != nil {
  1370. return err
  1371. }
  1372. delete(p.dbHandle.apiKeys, apiKey.KeyID)
  1373. p.updateAPIKeysOrdering()
  1374. return nil
  1375. }
  1376. func (p *MemoryProvider) getAPIKeys(limit int, offset int, order string) ([]APIKey, error) {
  1377. apiKeys := make([]APIKey, 0, limit)
  1378. p.dbHandle.Lock()
  1379. defer p.dbHandle.Unlock()
  1380. if p.dbHandle.isClosed {
  1381. return apiKeys, errMemoryProviderClosed
  1382. }
  1383. if limit <= 0 {
  1384. return apiKeys, nil
  1385. }
  1386. itNum := 0
  1387. if order == OrderDESC {
  1388. for i := len(p.dbHandle.apiKeysIDs) - 1; i >= 0; i-- {
  1389. itNum++
  1390. if itNum <= offset {
  1391. continue
  1392. }
  1393. keyID := p.dbHandle.apiKeysIDs[i]
  1394. k := p.dbHandle.apiKeys[keyID]
  1395. apiKey := k.getACopy()
  1396. apiKey.HideConfidentialData()
  1397. apiKeys = append(apiKeys, apiKey)
  1398. if len(apiKeys) >= limit {
  1399. break
  1400. }
  1401. }
  1402. } else {
  1403. for _, keyID := range p.dbHandle.apiKeysIDs {
  1404. itNum++
  1405. if itNum <= offset {
  1406. continue
  1407. }
  1408. k := p.dbHandle.apiKeys[keyID]
  1409. apiKey := k.getACopy()
  1410. apiKey.HideConfidentialData()
  1411. apiKeys = append(apiKeys, apiKey)
  1412. if len(apiKeys) >= limit {
  1413. break
  1414. }
  1415. }
  1416. }
  1417. return apiKeys, nil
  1418. }
  1419. func (p *MemoryProvider) dumpAPIKeys() ([]APIKey, error) {
  1420. p.dbHandle.Lock()
  1421. defer p.dbHandle.Unlock()
  1422. apiKeys := make([]APIKey, 0, len(p.dbHandle.apiKeys))
  1423. if p.dbHandle.isClosed {
  1424. return apiKeys, errMemoryProviderClosed
  1425. }
  1426. for _, k := range p.dbHandle.apiKeys {
  1427. apiKeys = append(apiKeys, k)
  1428. }
  1429. return apiKeys, nil
  1430. }
  1431. func (p *MemoryProvider) deleteAPIKeysWithUser(username string) {
  1432. found := false
  1433. for k, v := range p.dbHandle.apiKeys {
  1434. if v.User == username {
  1435. delete(p.dbHandle.apiKeys, k)
  1436. found = true
  1437. }
  1438. }
  1439. if found {
  1440. p.updateAPIKeysOrdering()
  1441. }
  1442. }
  1443. func (p *MemoryProvider) deleteAPIKeysWithAdmin(username string) {
  1444. found := false
  1445. for k, v := range p.dbHandle.apiKeys {
  1446. if v.Admin == username {
  1447. delete(p.dbHandle.apiKeys, k)
  1448. found = true
  1449. }
  1450. }
  1451. if found {
  1452. p.updateAPIKeysOrdering()
  1453. }
  1454. }
  1455. func (p *MemoryProvider) deleteSharesWithUser(username string) {
  1456. found := false
  1457. for k, v := range p.dbHandle.shares {
  1458. if v.Username == username {
  1459. delete(p.dbHandle.shares, k)
  1460. found = true
  1461. }
  1462. }
  1463. if found {
  1464. p.updateSharesOrdering()
  1465. }
  1466. }
  1467. func (p *MemoryProvider) updateAPIKeysOrdering() {
  1468. // this could be more efficient
  1469. p.dbHandle.apiKeysIDs = make([]string, 0, len(p.dbHandle.apiKeys))
  1470. for keyID := range p.dbHandle.apiKeys {
  1471. p.dbHandle.apiKeysIDs = append(p.dbHandle.apiKeysIDs, keyID)
  1472. }
  1473. sort.Strings(p.dbHandle.apiKeysIDs)
  1474. }
  1475. func (p *MemoryProvider) updateSharesOrdering() {
  1476. // this could be more efficient
  1477. p.dbHandle.sharesIDs = make([]string, 0, len(p.dbHandle.shares))
  1478. for shareID := range p.dbHandle.shares {
  1479. p.dbHandle.sharesIDs = append(p.dbHandle.sharesIDs, shareID)
  1480. }
  1481. sort.Strings(p.dbHandle.sharesIDs)
  1482. }
  1483. func (p *MemoryProvider) shareExistsInternal(shareID, username string) (Share, error) {
  1484. if val, ok := p.dbHandle.shares[shareID]; ok {
  1485. if username != "" && val.Username != username {
  1486. return Share{}, util.NewRecordNotFoundError(fmt.Sprintf("Share %#v does not exist", shareID))
  1487. }
  1488. return val.getACopy(), nil
  1489. }
  1490. return Share{}, util.NewRecordNotFoundError(fmt.Sprintf("Share %#v does not exist", shareID))
  1491. }
  1492. func (p *MemoryProvider) shareExists(shareID, username string) (Share, error) {
  1493. p.dbHandle.Lock()
  1494. defer p.dbHandle.Unlock()
  1495. if p.dbHandle.isClosed {
  1496. return Share{}, errMemoryProviderClosed
  1497. }
  1498. return p.shareExistsInternal(shareID, username)
  1499. }
  1500. func (p *MemoryProvider) addShare(share *Share) error {
  1501. err := share.validate()
  1502. if err != nil {
  1503. return err
  1504. }
  1505. p.dbHandle.Lock()
  1506. defer p.dbHandle.Unlock()
  1507. if p.dbHandle.isClosed {
  1508. return errMemoryProviderClosed
  1509. }
  1510. _, err = p.shareExistsInternal(share.ShareID, share.Username)
  1511. if err == nil {
  1512. return fmt.Errorf("share %#v already exists", share.ShareID)
  1513. }
  1514. if _, err := p.userExistsInternal(share.Username); err != nil {
  1515. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", share.Username))
  1516. }
  1517. if !share.IsRestore {
  1518. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1519. share.UpdatedAt = share.CreatedAt
  1520. share.LastUseAt = 0
  1521. share.UsedTokens = 0
  1522. }
  1523. if share.CreatedAt == 0 {
  1524. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1525. }
  1526. if share.UpdatedAt == 0 {
  1527. share.UpdatedAt = share.CreatedAt
  1528. }
  1529. p.dbHandle.shares[share.ShareID] = share.getACopy()
  1530. p.dbHandle.sharesIDs = append(p.dbHandle.sharesIDs, share.ShareID)
  1531. sort.Strings(p.dbHandle.sharesIDs)
  1532. return nil
  1533. }
  1534. func (p *MemoryProvider) updateShare(share *Share) error {
  1535. err := share.validate()
  1536. if err != nil {
  1537. return err
  1538. }
  1539. p.dbHandle.Lock()
  1540. defer p.dbHandle.Unlock()
  1541. if p.dbHandle.isClosed {
  1542. return errMemoryProviderClosed
  1543. }
  1544. s, err := p.shareExistsInternal(share.ShareID, share.Username)
  1545. if err != nil {
  1546. return err
  1547. }
  1548. if _, err := p.userExistsInternal(share.Username); err != nil {
  1549. return util.NewValidationError(fmt.Sprintf("related user %#v does not exists", share.Username))
  1550. }
  1551. share.ID = s.ID
  1552. share.ShareID = s.ShareID
  1553. if !share.IsRestore {
  1554. share.UsedTokens = s.UsedTokens
  1555. share.CreatedAt = s.CreatedAt
  1556. share.LastUseAt = s.LastUseAt
  1557. share.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1558. }
  1559. if share.CreatedAt == 0 {
  1560. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1561. }
  1562. if share.UpdatedAt == 0 {
  1563. share.UpdatedAt = share.CreatedAt
  1564. }
  1565. p.dbHandle.shares[share.ShareID] = share.getACopy()
  1566. return nil
  1567. }
  1568. func (p *MemoryProvider) deleteShare(share Share) error {
  1569. p.dbHandle.Lock()
  1570. defer p.dbHandle.Unlock()
  1571. if p.dbHandle.isClosed {
  1572. return errMemoryProviderClosed
  1573. }
  1574. _, err := p.shareExistsInternal(share.ShareID, share.Username)
  1575. if err != nil {
  1576. return err
  1577. }
  1578. delete(p.dbHandle.shares, share.ShareID)
  1579. p.updateSharesOrdering()
  1580. return nil
  1581. }
  1582. func (p *MemoryProvider) getShares(limit int, offset int, order, username string) ([]Share, error) {
  1583. p.dbHandle.Lock()
  1584. defer p.dbHandle.Unlock()
  1585. if p.dbHandle.isClosed {
  1586. return []Share{}, errMemoryProviderClosed
  1587. }
  1588. if limit <= 0 {
  1589. return []Share{}, nil
  1590. }
  1591. shares := make([]Share, 0, limit)
  1592. itNum := 0
  1593. if order == OrderDESC {
  1594. for i := len(p.dbHandle.sharesIDs) - 1; i >= 0; i-- {
  1595. shareID := p.dbHandle.sharesIDs[i]
  1596. s := p.dbHandle.shares[shareID]
  1597. if s.Username != username {
  1598. continue
  1599. }
  1600. itNum++
  1601. if itNum <= offset {
  1602. continue
  1603. }
  1604. share := s.getACopy()
  1605. share.HideConfidentialData()
  1606. shares = append(shares, share)
  1607. if len(shares) >= limit {
  1608. break
  1609. }
  1610. }
  1611. } else {
  1612. for _, shareID := range p.dbHandle.sharesIDs {
  1613. s := p.dbHandle.shares[shareID]
  1614. if s.Username != username {
  1615. continue
  1616. }
  1617. itNum++
  1618. if itNum <= offset {
  1619. continue
  1620. }
  1621. share := s.getACopy()
  1622. share.HideConfidentialData()
  1623. shares = append(shares, share)
  1624. if len(shares) >= limit {
  1625. break
  1626. }
  1627. }
  1628. }
  1629. return shares, nil
  1630. }
  1631. func (p *MemoryProvider) dumpShares() ([]Share, error) {
  1632. p.dbHandle.Lock()
  1633. defer p.dbHandle.Unlock()
  1634. shares := make([]Share, 0, len(p.dbHandle.shares))
  1635. if p.dbHandle.isClosed {
  1636. return shares, errMemoryProviderClosed
  1637. }
  1638. for _, s := range p.dbHandle.shares {
  1639. shares = append(shares, s)
  1640. }
  1641. return shares, nil
  1642. }
  1643. func (p *MemoryProvider) updateShareLastUse(shareID string, numTokens int) error {
  1644. p.dbHandle.Lock()
  1645. defer p.dbHandle.Unlock()
  1646. if p.dbHandle.isClosed {
  1647. return errMemoryProviderClosed
  1648. }
  1649. share, err := p.shareExistsInternal(shareID, "")
  1650. if err != nil {
  1651. return err
  1652. }
  1653. share.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1654. share.UsedTokens += numTokens
  1655. p.dbHandle.shares[share.ShareID] = share
  1656. return nil
  1657. }
  1658. func (p *MemoryProvider) getDefenderHosts(from int64, limit int) ([]DefenderEntry, error) {
  1659. return nil, ErrNotImplemented
  1660. }
  1661. func (p *MemoryProvider) getDefenderHostByIP(ip string, from int64) (DefenderEntry, error) {
  1662. return DefenderEntry{}, ErrNotImplemented
  1663. }
  1664. func (p *MemoryProvider) isDefenderHostBanned(ip string) (DefenderEntry, error) {
  1665. return DefenderEntry{}, ErrNotImplemented
  1666. }
  1667. func (p *MemoryProvider) updateDefenderBanTime(ip string, minutes int) error {
  1668. return ErrNotImplemented
  1669. }
  1670. func (p *MemoryProvider) deleteDefenderHost(ip string) error {
  1671. return ErrNotImplemented
  1672. }
  1673. func (p *MemoryProvider) addDefenderEvent(ip string, score int) error {
  1674. return ErrNotImplemented
  1675. }
  1676. func (p *MemoryProvider) setDefenderBanTime(ip string, banTime int64) error {
  1677. return ErrNotImplemented
  1678. }
  1679. func (p *MemoryProvider) cleanupDefender(from int64) error {
  1680. return ErrNotImplemented
  1681. }
  1682. func (p *MemoryProvider) addActiveTransfer(transfer ActiveTransfer) error {
  1683. return ErrNotImplemented
  1684. }
  1685. func (p *MemoryProvider) updateActiveTransferSizes(ulSize, dlSize, transferID int64, connectionID string) error {
  1686. return ErrNotImplemented
  1687. }
  1688. func (p *MemoryProvider) removeActiveTransfer(transferID int64, connectionID string) error {
  1689. return ErrNotImplemented
  1690. }
  1691. func (p *MemoryProvider) cleanupActiveTransfers(before time.Time) error {
  1692. return ErrNotImplemented
  1693. }
  1694. func (p *MemoryProvider) getActiveTransfers(from time.Time) ([]ActiveTransfer, error) {
  1695. return nil, ErrNotImplemented
  1696. }
  1697. func (p *MemoryProvider) addSharedSession(session Session) error {
  1698. return ErrNotImplemented
  1699. }
  1700. func (p *MemoryProvider) deleteSharedSession(key string) error {
  1701. return ErrNotImplemented
  1702. }
  1703. func (p *MemoryProvider) getSharedSession(key string) (Session, error) {
  1704. return Session{}, ErrNotImplemented
  1705. }
  1706. func (p *MemoryProvider) cleanupSharedSessions(sessionType SessionType, before int64) error {
  1707. return ErrNotImplemented
  1708. }
  1709. func (p *MemoryProvider) getEventActions(limit, offset int, order string, minimal bool) ([]BaseEventAction, error) {
  1710. p.dbHandle.Lock()
  1711. defer p.dbHandle.Unlock()
  1712. if p.dbHandle.isClosed {
  1713. return nil, errMemoryProviderClosed
  1714. }
  1715. if limit <= 0 {
  1716. return nil, nil
  1717. }
  1718. actions := make([]BaseEventAction, 0, limit)
  1719. itNum := 0
  1720. if order == OrderASC {
  1721. for _, name := range p.dbHandle.actionsNames {
  1722. itNum++
  1723. if itNum <= offset {
  1724. continue
  1725. }
  1726. a := p.dbHandle.actions[name]
  1727. action := a.getACopy()
  1728. action.PrepareForRendering()
  1729. actions = append(actions, action)
  1730. if len(actions) >= limit {
  1731. break
  1732. }
  1733. }
  1734. } else {
  1735. for i := len(p.dbHandle.actionsNames) - 1; i >= 0; i-- {
  1736. itNum++
  1737. if itNum <= offset {
  1738. continue
  1739. }
  1740. name := p.dbHandle.actionsNames[i]
  1741. a := p.dbHandle.actions[name]
  1742. action := a.getACopy()
  1743. action.PrepareForRendering()
  1744. actions = append(actions, action)
  1745. if len(actions) >= limit {
  1746. break
  1747. }
  1748. }
  1749. }
  1750. return actions, nil
  1751. }
  1752. func (p *MemoryProvider) dumpEventActions() ([]BaseEventAction, error) {
  1753. p.dbHandle.Lock()
  1754. defer p.dbHandle.Unlock()
  1755. if p.dbHandle.isClosed {
  1756. return nil, errMemoryProviderClosed
  1757. }
  1758. actions := make([]BaseEventAction, 0, len(p.dbHandle.actions))
  1759. for _, name := range p.dbHandle.actionsNames {
  1760. a := p.dbHandle.actions[name]
  1761. action := a.getACopy()
  1762. actions = append(actions, action)
  1763. }
  1764. return actions, nil
  1765. }
  1766. func (p *MemoryProvider) eventActionExists(name string) (BaseEventAction, error) {
  1767. p.dbHandle.Lock()
  1768. defer p.dbHandle.Unlock()
  1769. if p.dbHandle.isClosed {
  1770. return BaseEventAction{}, errMemoryProviderClosed
  1771. }
  1772. return p.actionExistsInternal(name)
  1773. }
  1774. func (p *MemoryProvider) addEventAction(action *BaseEventAction) error {
  1775. err := action.validate()
  1776. if err != nil {
  1777. return err
  1778. }
  1779. p.dbHandle.Lock()
  1780. defer p.dbHandle.Unlock()
  1781. if p.dbHandle.isClosed {
  1782. return errMemoryProviderClosed
  1783. }
  1784. _, err = p.actionExistsInternal(action.Name)
  1785. if err == nil {
  1786. return fmt.Errorf("event action %q already exists", action.Name)
  1787. }
  1788. action.ID = p.getNextActionID()
  1789. action.Rules = nil
  1790. p.dbHandle.actions[action.Name] = action.getACopy()
  1791. p.dbHandle.actionsNames = append(p.dbHandle.actionsNames, action.Name)
  1792. sort.Strings(p.dbHandle.actionsNames)
  1793. return nil
  1794. }
  1795. func (p *MemoryProvider) updateEventAction(action *BaseEventAction) error {
  1796. err := action.validate()
  1797. if err != nil {
  1798. return err
  1799. }
  1800. p.dbHandle.Lock()
  1801. defer p.dbHandle.Unlock()
  1802. if p.dbHandle.isClosed {
  1803. return errMemoryProviderClosed
  1804. }
  1805. oldAction, err := p.actionExistsInternal(action.Name)
  1806. if err != nil {
  1807. return fmt.Errorf("event action %s does not exist", action.Name)
  1808. }
  1809. action.ID = oldAction.ID
  1810. action.Name = oldAction.Name
  1811. action.Rules = nil
  1812. if len(oldAction.Rules) > 0 {
  1813. var relatedRules []string
  1814. for _, ruleName := range oldAction.Rules {
  1815. rule, err := p.ruleExistsInternal(ruleName)
  1816. if err == nil {
  1817. relatedRules = append(relatedRules, ruleName)
  1818. rule.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1819. p.dbHandle.rules[ruleName] = rule
  1820. setLastRuleUpdate()
  1821. }
  1822. }
  1823. action.Rules = relatedRules
  1824. }
  1825. p.dbHandle.actions[action.Name] = action.getACopy()
  1826. return nil
  1827. }
  1828. func (p *MemoryProvider) deleteEventAction(action BaseEventAction) error {
  1829. p.dbHandle.Lock()
  1830. defer p.dbHandle.Unlock()
  1831. if p.dbHandle.isClosed {
  1832. return errMemoryProviderClosed
  1833. }
  1834. oldAction, err := p.actionExistsInternal(action.Name)
  1835. if err != nil {
  1836. return fmt.Errorf("event action %s does not exist", action.Name)
  1837. }
  1838. if len(oldAction.Rules) > 0 {
  1839. return util.NewValidationError(fmt.Sprintf("action %s is referenced, it cannot be removed", oldAction.Name))
  1840. }
  1841. delete(p.dbHandle.actions, action.Name)
  1842. // this could be more efficient
  1843. p.dbHandle.actionsNames = make([]string, 0, len(p.dbHandle.actions))
  1844. for name := range p.dbHandle.actions {
  1845. p.dbHandle.actionsNames = append(p.dbHandle.actionsNames, name)
  1846. }
  1847. sort.Strings(p.dbHandle.actionsNames)
  1848. return nil
  1849. }
  1850. func (p *MemoryProvider) getEventRules(limit, offset int, order string) ([]EventRule, error) {
  1851. p.dbHandle.Lock()
  1852. defer p.dbHandle.Unlock()
  1853. if p.dbHandle.isClosed {
  1854. return nil, errMemoryProviderClosed
  1855. }
  1856. if limit <= 0 {
  1857. return nil, nil
  1858. }
  1859. itNum := 0
  1860. rules := make([]EventRule, 0, limit)
  1861. if order == OrderASC {
  1862. for _, name := range p.dbHandle.rulesNames {
  1863. itNum++
  1864. if itNum <= offset {
  1865. continue
  1866. }
  1867. r := p.dbHandle.rules[name]
  1868. rule := r.getACopy()
  1869. p.addActionsToRule(&rule)
  1870. rule.PrepareForRendering()
  1871. rules = append(rules, rule)
  1872. if len(rules) >= limit {
  1873. break
  1874. }
  1875. }
  1876. } else {
  1877. for i := len(p.dbHandle.rulesNames) - 1; i >= 0; i-- {
  1878. itNum++
  1879. if itNum <= offset {
  1880. continue
  1881. }
  1882. name := p.dbHandle.rulesNames[i]
  1883. r := p.dbHandle.rules[name]
  1884. rule := r.getACopy()
  1885. p.addActionsToRule(&rule)
  1886. rule.PrepareForRendering()
  1887. rules = append(rules, rule)
  1888. if len(rules) >= limit {
  1889. break
  1890. }
  1891. }
  1892. }
  1893. return rules, nil
  1894. }
  1895. func (p *MemoryProvider) dumpEventRules() ([]EventRule, error) {
  1896. p.dbHandle.Lock()
  1897. defer p.dbHandle.Unlock()
  1898. if p.dbHandle.isClosed {
  1899. return nil, errMemoryProviderClosed
  1900. }
  1901. rules := make([]EventRule, 0, len(p.dbHandle.rules))
  1902. for _, name := range p.dbHandle.rulesNames {
  1903. r := p.dbHandle.rules[name]
  1904. rule := r.getACopy()
  1905. p.addActionsToRule(&rule)
  1906. rules = append(rules, rule)
  1907. }
  1908. return rules, nil
  1909. }
  1910. func (p *MemoryProvider) getRecentlyUpdatedRules(after int64) ([]EventRule, error) {
  1911. if getLastRuleUpdate() < after {
  1912. return nil, nil
  1913. }
  1914. p.dbHandle.Lock()
  1915. defer p.dbHandle.Unlock()
  1916. if p.dbHandle.isClosed {
  1917. return nil, errMemoryProviderClosed
  1918. }
  1919. rules := make([]EventRule, 0, 10)
  1920. for _, name := range p.dbHandle.rulesNames {
  1921. r := p.dbHandle.rules[name]
  1922. if r.UpdatedAt < after {
  1923. continue
  1924. }
  1925. rule := r.getACopy()
  1926. p.addActionsToRule(&rule)
  1927. rules = append(rules, rule)
  1928. }
  1929. return rules, nil
  1930. }
  1931. func (p *MemoryProvider) eventRuleExists(name string) (EventRule, error) {
  1932. p.dbHandle.Lock()
  1933. defer p.dbHandle.Unlock()
  1934. if p.dbHandle.isClosed {
  1935. return EventRule{}, errMemoryProviderClosed
  1936. }
  1937. rule, err := p.ruleExistsInternal(name)
  1938. if err != nil {
  1939. return rule, err
  1940. }
  1941. p.addActionsToRule(&rule)
  1942. return rule, nil
  1943. }
  1944. func (p *MemoryProvider) addEventRule(rule *EventRule) error {
  1945. if err := rule.validate(); err != nil {
  1946. return err
  1947. }
  1948. p.dbHandle.Lock()
  1949. defer p.dbHandle.Unlock()
  1950. if p.dbHandle.isClosed {
  1951. return errMemoryProviderClosed
  1952. }
  1953. _, err := p.ruleExistsInternal(rule.Name)
  1954. if err == nil {
  1955. return fmt.Errorf("event rule %q already exists", rule.Name)
  1956. }
  1957. rule.ID = p.getNextRuleID()
  1958. rule.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  1959. rule.UpdatedAt = rule.CreatedAt
  1960. for idx := range rule.Actions {
  1961. if err := p.addRuleToActionMapping(rule.Name, rule.Actions[idx].Name); err != nil {
  1962. return err
  1963. }
  1964. }
  1965. sort.Slice(rule.Actions, func(i, j int) bool {
  1966. return rule.Actions[i].Order < rule.Actions[j].Order
  1967. })
  1968. p.dbHandle.rules[rule.Name] = rule.getACopy()
  1969. p.dbHandle.rulesNames = append(p.dbHandle.rulesNames, rule.Name)
  1970. sort.Strings(p.dbHandle.rulesNames)
  1971. setLastRuleUpdate()
  1972. return nil
  1973. }
  1974. func (p *MemoryProvider) updateEventRule(rule *EventRule) error {
  1975. if err := rule.validate(); err != nil {
  1976. return err
  1977. }
  1978. p.dbHandle.Lock()
  1979. defer p.dbHandle.Unlock()
  1980. if p.dbHandle.isClosed {
  1981. return errMemoryProviderClosed
  1982. }
  1983. oldRule, err := p.ruleExistsInternal(rule.Name)
  1984. if err != nil {
  1985. return err
  1986. }
  1987. for idx := range oldRule.Actions {
  1988. if err = p.removeRuleFromActionMapping(rule.Name, oldRule.Actions[idx].Name); err != nil {
  1989. return err
  1990. }
  1991. }
  1992. for idx := range rule.Actions {
  1993. if err = p.addRuleToActionMapping(rule.Name, rule.Actions[idx].Name); err != nil {
  1994. return err
  1995. }
  1996. }
  1997. rule.ID = oldRule.ID
  1998. rule.CreatedAt = oldRule.CreatedAt
  1999. rule.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  2000. sort.Slice(rule.Actions, func(i, j int) bool {
  2001. return rule.Actions[i].Order < rule.Actions[j].Order
  2002. })
  2003. p.dbHandle.rules[rule.Name] = rule.getACopy()
  2004. setLastRuleUpdate()
  2005. return nil
  2006. }
  2007. func (p *MemoryProvider) deleteEventRule(rule EventRule, softDelete bool) error {
  2008. p.dbHandle.Lock()
  2009. defer p.dbHandle.Unlock()
  2010. if p.dbHandle.isClosed {
  2011. return errMemoryProviderClosed
  2012. }
  2013. oldRule, err := p.ruleExistsInternal(rule.Name)
  2014. if err != nil {
  2015. return err
  2016. }
  2017. if len(oldRule.Actions) > 0 {
  2018. for idx := range oldRule.Actions {
  2019. if err = p.removeRuleFromActionMapping(rule.Name, oldRule.Actions[idx].Name); err != nil {
  2020. return err
  2021. }
  2022. }
  2023. }
  2024. delete(p.dbHandle.rules, rule.Name)
  2025. p.dbHandle.rulesNames = make([]string, 0, len(p.dbHandle.rules))
  2026. for name := range p.dbHandle.rules {
  2027. p.dbHandle.rulesNames = append(p.dbHandle.rulesNames, name)
  2028. }
  2029. sort.Strings(p.dbHandle.rulesNames)
  2030. setLastRuleUpdate()
  2031. return nil
  2032. }
  2033. func (p *MemoryProvider) getTaskByName(name string) (Task, error) {
  2034. return Task{}, ErrNotImplemented
  2035. }
  2036. func (p *MemoryProvider) addTask(name string) error {
  2037. return ErrNotImplemented
  2038. }
  2039. func (p *MemoryProvider) updateTask(name string, version int64) error {
  2040. return ErrNotImplemented
  2041. }
  2042. func (p *MemoryProvider) updateTaskTimestamp(name string) error {
  2043. return ErrNotImplemented
  2044. }
  2045. func (p *MemoryProvider) getNextID() int64 {
  2046. nextID := int64(1)
  2047. for _, v := range p.dbHandle.users {
  2048. if v.ID >= nextID {
  2049. nextID = v.ID + 1
  2050. }
  2051. }
  2052. return nextID
  2053. }
  2054. func (p *MemoryProvider) getNextFolderID() int64 {
  2055. nextID := int64(1)
  2056. for _, v := range p.dbHandle.vfolders {
  2057. if v.ID >= nextID {
  2058. nextID = v.ID + 1
  2059. }
  2060. }
  2061. return nextID
  2062. }
  2063. func (p *MemoryProvider) getNextAdminID() int64 {
  2064. nextID := int64(1)
  2065. for _, a := range p.dbHandle.admins {
  2066. if a.ID >= nextID {
  2067. nextID = a.ID + 1
  2068. }
  2069. }
  2070. return nextID
  2071. }
  2072. func (p *MemoryProvider) getNextGroupID() int64 {
  2073. nextID := int64(1)
  2074. for _, g := range p.dbHandle.groups {
  2075. if g.ID >= nextID {
  2076. nextID = g.ID + 1
  2077. }
  2078. }
  2079. return nextID
  2080. }
  2081. func (p *MemoryProvider) getNextActionID() int64 {
  2082. nextID := int64(1)
  2083. for _, a := range p.dbHandle.actions {
  2084. if a.ID >= nextID {
  2085. nextID = a.ID + 1
  2086. }
  2087. }
  2088. return nextID
  2089. }
  2090. func (p *MemoryProvider) getNextRuleID() int64 {
  2091. nextID := int64(1)
  2092. for _, r := range p.dbHandle.rules {
  2093. if r.ID >= nextID {
  2094. nextID = r.ID + 1
  2095. }
  2096. }
  2097. return nextID
  2098. }
  2099. func (p *MemoryProvider) clear() {
  2100. p.dbHandle.Lock()
  2101. defer p.dbHandle.Unlock()
  2102. p.dbHandle.usernames = []string{}
  2103. p.dbHandle.users = make(map[string]User)
  2104. p.dbHandle.vfoldersNames = []string{}
  2105. p.dbHandle.vfolders = make(map[string]vfs.BaseVirtualFolder)
  2106. p.dbHandle.admins = make(map[string]Admin)
  2107. p.dbHandle.adminsUsernames = []string{}
  2108. p.dbHandle.apiKeys = make(map[string]APIKey)
  2109. p.dbHandle.apiKeysIDs = []string{}
  2110. p.dbHandle.shares = make(map[string]Share)
  2111. p.dbHandle.sharesIDs = []string{}
  2112. }
  2113. func (p *MemoryProvider) reloadConfig() error {
  2114. if p.dbHandle.configFile == "" {
  2115. providerLog(logger.LevelDebug, "no dump configuration file defined")
  2116. return nil
  2117. }
  2118. providerLog(logger.LevelDebug, "loading dump from file: %#v", p.dbHandle.configFile)
  2119. fi, err := os.Stat(p.dbHandle.configFile)
  2120. if err != nil {
  2121. providerLog(logger.LevelError, "error loading dump: %v", err)
  2122. return err
  2123. }
  2124. if fi.Size() == 0 {
  2125. err = errors.New("dump configuration file is invalid, its size must be > 0")
  2126. providerLog(logger.LevelError, "error loading dump: %v", err)
  2127. return err
  2128. }
  2129. if fi.Size() > 10485760 {
  2130. err = errors.New("dump configuration file is invalid, its size must be <= 10485760 bytes")
  2131. providerLog(logger.LevelError, "error loading dump: %v", err)
  2132. return err
  2133. }
  2134. content, err := os.ReadFile(p.dbHandle.configFile)
  2135. if err != nil {
  2136. providerLog(logger.LevelError, "error loading dump: %v", err)
  2137. return err
  2138. }
  2139. dump, err := ParseDumpData(content)
  2140. if err != nil {
  2141. providerLog(logger.LevelError, "error loading dump: %v", err)
  2142. return err
  2143. }
  2144. p.clear()
  2145. if err := p.restoreFolders(dump); err != nil {
  2146. return err
  2147. }
  2148. if err := p.restoreGroups(dump); err != nil {
  2149. return err
  2150. }
  2151. if err := p.restoreUsers(dump); err != nil {
  2152. return err
  2153. }
  2154. if err := p.restoreAdmins(dump); err != nil {
  2155. return err
  2156. }
  2157. if err := p.restoreAPIKeys(dump); err != nil {
  2158. return err
  2159. }
  2160. if err := p.restoreShares(dump); err != nil {
  2161. return err
  2162. }
  2163. if err := p.restoreEventActions(dump); err != nil {
  2164. return err
  2165. }
  2166. if err := p.restoreEventRules(dump); err != nil {
  2167. return err
  2168. }
  2169. providerLog(logger.LevelDebug, "config loaded from file: %#v", p.dbHandle.configFile)
  2170. return nil
  2171. }
  2172. func (p *MemoryProvider) restoreEventActions(dump BackupData) error {
  2173. for _, action := range dump.EventActions {
  2174. a, err := p.eventActionExists(action.Name)
  2175. action := action // pin
  2176. if err == nil {
  2177. action.ID = a.ID
  2178. err = UpdateEventAction(&action, ActionExecutorSystem, "")
  2179. if err != nil {
  2180. providerLog(logger.LevelError, "error updating event action %q: %v", action.Name, err)
  2181. return err
  2182. }
  2183. } else {
  2184. err = AddEventAction(&action, ActionExecutorSystem, "")
  2185. if err != nil {
  2186. providerLog(logger.LevelError, "error adding event action %q: %v", action.Name, err)
  2187. return err
  2188. }
  2189. }
  2190. }
  2191. return nil
  2192. }
  2193. func (p *MemoryProvider) restoreEventRules(dump BackupData) error {
  2194. for _, rule := range dump.EventRules {
  2195. r, err := p.eventRuleExists(rule.Name)
  2196. rule := rule // pin
  2197. if err == nil {
  2198. rule.ID = r.ID
  2199. err = UpdateEventRule(&rule, ActionExecutorSystem, "")
  2200. if err != nil {
  2201. providerLog(logger.LevelError, "error updating event rule %q: %v", rule.Name, err)
  2202. return err
  2203. }
  2204. } else {
  2205. err = AddEventRule(&rule, ActionExecutorSystem, "")
  2206. if err != nil {
  2207. providerLog(logger.LevelError, "error adding event rule %q: %v", rule.Name, err)
  2208. return err
  2209. }
  2210. }
  2211. }
  2212. return nil
  2213. }
  2214. func (p *MemoryProvider) restoreShares(dump BackupData) error {
  2215. for _, share := range dump.Shares {
  2216. s, err := p.shareExists(share.ShareID, "")
  2217. share := share // pin
  2218. share.IsRestore = true
  2219. if err == nil {
  2220. share.ID = s.ID
  2221. err = UpdateShare(&share, ActionExecutorSystem, "")
  2222. if err != nil {
  2223. providerLog(logger.LevelError, "error updating share %#v: %v", share.ShareID, err)
  2224. return err
  2225. }
  2226. } else {
  2227. err = AddShare(&share, ActionExecutorSystem, "")
  2228. if err != nil {
  2229. providerLog(logger.LevelError, "error adding share %#v: %v", share.ShareID, err)
  2230. return err
  2231. }
  2232. }
  2233. }
  2234. return nil
  2235. }
  2236. func (p *MemoryProvider) restoreAPIKeys(dump BackupData) error {
  2237. for _, apiKey := range dump.APIKeys {
  2238. if apiKey.Key == "" {
  2239. return fmt.Errorf("cannot restore an empty API key: %+v", apiKey)
  2240. }
  2241. k, err := p.apiKeyExists(apiKey.KeyID)
  2242. apiKey := apiKey // pin
  2243. if err == nil {
  2244. apiKey.ID = k.ID
  2245. err = UpdateAPIKey(&apiKey, ActionExecutorSystem, "")
  2246. if err != nil {
  2247. providerLog(logger.LevelError, "error updating API key %#v: %v", apiKey.KeyID, err)
  2248. return err
  2249. }
  2250. } else {
  2251. err = AddAPIKey(&apiKey, ActionExecutorSystem, "")
  2252. if err != nil {
  2253. providerLog(logger.LevelError, "error adding API key %#v: %v", apiKey.KeyID, err)
  2254. return err
  2255. }
  2256. }
  2257. }
  2258. return nil
  2259. }
  2260. func (p *MemoryProvider) restoreAdmins(dump BackupData) error {
  2261. for _, admin := range dump.Admins {
  2262. admin := admin // pin
  2263. admin.Username = config.convertName(admin.Username)
  2264. a, err := p.adminExists(admin.Username)
  2265. if err == nil {
  2266. admin.ID = a.ID
  2267. err = UpdateAdmin(&admin, ActionExecutorSystem, "")
  2268. if err != nil {
  2269. providerLog(logger.LevelError, "error updating admin %#v: %v", admin.Username, err)
  2270. return err
  2271. }
  2272. } else {
  2273. err = AddAdmin(&admin, ActionExecutorSystem, "")
  2274. if err != nil {
  2275. providerLog(logger.LevelError, "error adding admin %#v: %v", admin.Username, err)
  2276. return err
  2277. }
  2278. }
  2279. }
  2280. return nil
  2281. }
  2282. func (p *MemoryProvider) restoreGroups(dump BackupData) error {
  2283. for _, group := range dump.Groups {
  2284. group := group // pin
  2285. group.Name = config.convertName(group.Name)
  2286. g, err := p.groupExists(group.Name)
  2287. if err == nil {
  2288. group.ID = g.ID
  2289. err = UpdateGroup(&group, g.Users, ActionExecutorSystem, "")
  2290. if err != nil {
  2291. providerLog(logger.LevelError, "error updating group %#v: %v", group.Name, err)
  2292. return err
  2293. }
  2294. } else {
  2295. group.Users = nil
  2296. err = AddGroup(&group, ActionExecutorSystem, "")
  2297. if err != nil {
  2298. providerLog(logger.LevelError, "error adding group %#v: %v", group.Name, err)
  2299. return err
  2300. }
  2301. }
  2302. }
  2303. return nil
  2304. }
  2305. func (p *MemoryProvider) restoreFolders(dump BackupData) error {
  2306. for _, folder := range dump.Folders {
  2307. folder := folder // pin
  2308. folder.Name = config.convertName(folder.Name)
  2309. f, err := p.getFolderByName(folder.Name)
  2310. if err == nil {
  2311. folder.ID = f.ID
  2312. err = UpdateFolder(&folder, f.Users, f.Groups, ActionExecutorSystem, "")
  2313. if err != nil {
  2314. providerLog(logger.LevelError, "error updating folder %#v: %v", folder.Name, err)
  2315. return err
  2316. }
  2317. } else {
  2318. folder.Users = nil
  2319. err = AddFolder(&folder, ActionExecutorSystem, "")
  2320. if err != nil {
  2321. providerLog(logger.LevelError, "error adding folder %#v: %v", folder.Name, err)
  2322. return err
  2323. }
  2324. }
  2325. }
  2326. return nil
  2327. }
  2328. func (p *MemoryProvider) restoreUsers(dump BackupData) error {
  2329. for _, user := range dump.Users {
  2330. user := user // pin
  2331. user.Username = config.convertName(user.Username)
  2332. u, err := p.userExists(user.Username)
  2333. if err == nil {
  2334. user.ID = u.ID
  2335. err = UpdateUser(&user, ActionExecutorSystem, "")
  2336. if err != nil {
  2337. providerLog(logger.LevelError, "error updating user %#v: %v", user.Username, err)
  2338. return err
  2339. }
  2340. } else {
  2341. err = AddUser(&user, ActionExecutorSystem, "")
  2342. if err != nil {
  2343. providerLog(logger.LevelError, "error adding user %#v: %v", user.Username, err)
  2344. return err
  2345. }
  2346. }
  2347. }
  2348. return nil
  2349. }
  2350. // initializeDatabase does nothing, no initilization is needed for memory provider
  2351. func (p *MemoryProvider) initializeDatabase() error {
  2352. return ErrNoInitRequired
  2353. }
  2354. func (p *MemoryProvider) migrateDatabase() error {
  2355. return ErrNoInitRequired
  2356. }
  2357. func (p *MemoryProvider) revertDatabase(targetVersion int) error {
  2358. return errors.New("memory provider does not store data, revert not possible")
  2359. }
  2360. func (p *MemoryProvider) resetDatabase() error {
  2361. return errors.New("memory provider does not store data, reset not possible")
  2362. }