bolt.go 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402
  1. //go:build !nobolt
  2. // +build !nobolt
  3. package dataprovider
  4. import (
  5. "crypto/x509"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "path/filepath"
  10. "time"
  11. bolt "go.etcd.io/bbolt"
  12. "github.com/drakkan/sftpgo/v2/logger"
  13. "github.com/drakkan/sftpgo/v2/util"
  14. "github.com/drakkan/sftpgo/v2/version"
  15. "github.com/drakkan/sftpgo/v2/vfs"
  16. )
  17. const (
  18. boltDatabaseVersion = 12
  19. )
  20. var (
  21. usersBucket = []byte("users")
  22. foldersBucket = []byte("folders")
  23. adminsBucket = []byte("admins")
  24. apiKeysBucket = []byte("api_keys")
  25. dbVersionBucket = []byte("db_version")
  26. dbVersionKey = []byte("version")
  27. )
  28. // BoltProvider auth provider for bolt key/value store
  29. type BoltProvider struct {
  30. dbHandle *bolt.DB
  31. }
  32. func init() {
  33. version.AddFeature("+bolt")
  34. }
  35. func initializeBoltProvider(basePath string) error {
  36. var err error
  37. dbPath := config.Name
  38. if !util.IsFileInputValid(dbPath) {
  39. return fmt.Errorf("invalid database path: %#v", dbPath)
  40. }
  41. if !filepath.IsAbs(dbPath) {
  42. dbPath = filepath.Join(basePath, dbPath)
  43. }
  44. dbHandle, err := bolt.Open(dbPath, 0600, &bolt.Options{
  45. NoGrowSync: false,
  46. FreelistType: bolt.FreelistArrayType,
  47. Timeout: 5 * time.Second})
  48. if err == nil {
  49. providerLog(logger.LevelDebug, "bolt key store handle created")
  50. err = dbHandle.Update(func(tx *bolt.Tx) error {
  51. _, e := tx.CreateBucketIfNotExists(usersBucket)
  52. return e
  53. })
  54. if err != nil {
  55. providerLog(logger.LevelWarn, "error creating users bucket: %v", err)
  56. return err
  57. }
  58. if err != nil {
  59. providerLog(logger.LevelWarn, "error creating username idx bucket: %v", err)
  60. return err
  61. }
  62. err = dbHandle.Update(func(tx *bolt.Tx) error {
  63. _, e := tx.CreateBucketIfNotExists(foldersBucket)
  64. return e
  65. })
  66. if err != nil {
  67. providerLog(logger.LevelWarn, "error creating folders bucket: %v", err)
  68. return err
  69. }
  70. err = dbHandle.Update(func(tx *bolt.Tx) error {
  71. _, e := tx.CreateBucketIfNotExists(adminsBucket)
  72. return e
  73. })
  74. if err != nil {
  75. providerLog(logger.LevelWarn, "error creating admins bucket: %v", err)
  76. return err
  77. }
  78. err = dbHandle.Update(func(tx *bolt.Tx) error {
  79. _, e := tx.CreateBucketIfNotExists(apiKeysBucket)
  80. return e
  81. })
  82. if err != nil {
  83. providerLog(logger.LevelWarn, "error creating api keys bucket: %v", err)
  84. return err
  85. }
  86. err = dbHandle.Update(func(tx *bolt.Tx) error {
  87. _, e := tx.CreateBucketIfNotExists(dbVersionBucket)
  88. return e
  89. })
  90. if err != nil {
  91. providerLog(logger.LevelWarn, "error creating database version bucket: %v", err)
  92. return err
  93. }
  94. provider = &BoltProvider{dbHandle: dbHandle}
  95. } else {
  96. providerLog(logger.LevelWarn, "error creating bolt key/value store handler: %v", err)
  97. }
  98. return err
  99. }
  100. func (p *BoltProvider) checkAvailability() error {
  101. _, err := getBoltDatabaseVersion(p.dbHandle)
  102. return err
  103. }
  104. func (p *BoltProvider) validateUserAndTLSCert(username, protocol string, tlsCert *x509.Certificate) (User, error) {
  105. var user User
  106. if tlsCert == nil {
  107. return user, errors.New("TLS certificate cannot be null or empty")
  108. }
  109. user, err := p.userExists(username)
  110. if err != nil {
  111. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  112. return user, err
  113. }
  114. return checkUserAndTLSCertificate(&user, protocol, tlsCert)
  115. }
  116. func (p *BoltProvider) validateUserAndPass(username, password, ip, protocol string) (User, error) {
  117. var user User
  118. if password == "" {
  119. return user, errors.New("credentials cannot be null or empty")
  120. }
  121. user, err := p.userExists(username)
  122. if err != nil {
  123. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  124. return user, err
  125. }
  126. return checkUserAndPass(&user, password, ip, protocol)
  127. }
  128. func (p *BoltProvider) validateAdminAndPass(username, password, ip string) (Admin, error) {
  129. admin, err := p.adminExists(username)
  130. if err != nil {
  131. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  132. return admin, ErrInvalidCredentials
  133. }
  134. err = admin.checkUserAndPass(password, ip)
  135. return admin, err
  136. }
  137. func (p *BoltProvider) validateUserAndPubKey(username string, pubKey []byte) (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)
  148. }
  149. func (p *BoltProvider) updateAPIKeyLastUse(keyID string) error {
  150. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  151. bucket, err := getAPIKeysBucket(tx)
  152. if err != nil {
  153. return err
  154. }
  155. var u []byte
  156. if u = bucket.Get([]byte(keyID)); u == nil {
  157. return util.NewRecordNotFoundError(fmt.Sprintf("key %#v does not exist, unable to update last use", keyID))
  158. }
  159. var apiKey APIKey
  160. err = json.Unmarshal(u, &apiKey)
  161. if err != nil {
  162. return err
  163. }
  164. apiKey.LastUseAt = util.GetTimeAsMsSinceEpoch(time.Now())
  165. buf, err := json.Marshal(apiKey)
  166. if err != nil {
  167. return err
  168. }
  169. err = bucket.Put([]byte(keyID), buf)
  170. if err != nil {
  171. providerLog(logger.LevelWarn, "error updating last use for key %#v: %v", keyID, err)
  172. return err
  173. }
  174. providerLog(logger.LevelDebug, "last use updated for key %#v", keyID)
  175. return nil
  176. })
  177. }
  178. func (p *BoltProvider) setUpdatedAt(username string) {
  179. p.dbHandle.Update(func(tx *bolt.Tx) error { //nolint:errcheck
  180. bucket, err := getUsersBucket(tx)
  181. if err != nil {
  182. return err
  183. }
  184. var u []byte
  185. if u = bucket.Get([]byte(username)); u == nil {
  186. return util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist, unable to update updated at", username))
  187. }
  188. var user User
  189. err = json.Unmarshal(u, &user)
  190. if err != nil {
  191. return err
  192. }
  193. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  194. buf, err := json.Marshal(user)
  195. if err != nil {
  196. return err
  197. }
  198. err = bucket.Put([]byte(username), buf)
  199. if err == nil {
  200. providerLog(logger.LevelDebug, "updated at set for user %#v", username)
  201. } else {
  202. providerLog(logger.LevelWarn, "error setting updated_at for user %#v: %v", username, err)
  203. }
  204. return err
  205. })
  206. }
  207. func (p *BoltProvider) updateLastLogin(username string) error {
  208. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  209. bucket, err := getUsersBucket(tx)
  210. if err != nil {
  211. return err
  212. }
  213. var u []byte
  214. if u = bucket.Get([]byte(username)); u == nil {
  215. return util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist, unable to update last login", username))
  216. }
  217. var user User
  218. err = json.Unmarshal(u, &user)
  219. if err != nil {
  220. return err
  221. }
  222. user.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  223. buf, err := json.Marshal(user)
  224. if err != nil {
  225. return err
  226. }
  227. err = bucket.Put([]byte(username), buf)
  228. if err == nil {
  229. providerLog(logger.LevelDebug, "last login updated for user %#v", username)
  230. } else {
  231. providerLog(logger.LevelWarn, "error updating last login for user %#v: %v", username, err)
  232. }
  233. return err
  234. })
  235. }
  236. func (p *BoltProvider) updateAdminLastLogin(username string) error {
  237. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  238. bucket, err := getAdminsBucket(tx)
  239. if err != nil {
  240. return err
  241. }
  242. var a []byte
  243. if a = bucket.Get([]byte(username)); a == nil {
  244. return util.NewRecordNotFoundError(fmt.Sprintf("admin %#v does not exist, unable to update last login", username))
  245. }
  246. var admin Admin
  247. err = json.Unmarshal(a, &admin)
  248. if err != nil {
  249. return err
  250. }
  251. admin.LastLogin = util.GetTimeAsMsSinceEpoch(time.Now())
  252. buf, err := json.Marshal(admin)
  253. if err != nil {
  254. return err
  255. }
  256. err = bucket.Put([]byte(username), buf)
  257. if err == nil {
  258. providerLog(logger.LevelDebug, "last login updated for admin %#v", username)
  259. return err
  260. }
  261. providerLog(logger.LevelWarn, "error updating last login for admin %#v: %v", username, err)
  262. return err
  263. })
  264. }
  265. func (p *BoltProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  266. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  267. bucket, err := getUsersBucket(tx)
  268. if err != nil {
  269. return err
  270. }
  271. var u []byte
  272. if u = bucket.Get([]byte(username)); u == nil {
  273. return util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist, unable to update quota", username))
  274. }
  275. var user User
  276. err = json.Unmarshal(u, &user)
  277. if err != nil {
  278. return err
  279. }
  280. if reset {
  281. user.UsedQuotaSize = sizeAdd
  282. user.UsedQuotaFiles = filesAdd
  283. } else {
  284. user.UsedQuotaSize += sizeAdd
  285. user.UsedQuotaFiles += filesAdd
  286. }
  287. user.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  288. buf, err := json.Marshal(user)
  289. if err != nil {
  290. return err
  291. }
  292. err = bucket.Put([]byte(username), buf)
  293. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  294. username, filesAdd, sizeAdd, reset)
  295. return err
  296. })
  297. }
  298. func (p *BoltProvider) getUsedQuota(username string) (int, int64, error) {
  299. user, err := p.userExists(username)
  300. if err != nil {
  301. providerLog(logger.LevelWarn, "unable to get quota for user %v error: %v", username, err)
  302. return 0, 0, err
  303. }
  304. return user.UsedQuotaFiles, user.UsedQuotaSize, err
  305. }
  306. func (p *BoltProvider) adminExists(username string) (Admin, error) {
  307. var admin Admin
  308. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  309. bucket, err := getAdminsBucket(tx)
  310. if err != nil {
  311. return err
  312. }
  313. a := bucket.Get([]byte(username))
  314. if a == nil {
  315. return util.NewRecordNotFoundError(fmt.Sprintf("admin %v does not exist", username))
  316. }
  317. return json.Unmarshal(a, &admin)
  318. })
  319. return admin, err
  320. }
  321. func (p *BoltProvider) addAdmin(admin *Admin) error {
  322. err := admin.validate()
  323. if err != nil {
  324. return err
  325. }
  326. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  327. bucket, err := getAdminsBucket(tx)
  328. if err != nil {
  329. return err
  330. }
  331. if a := bucket.Get([]byte(admin.Username)); a != nil {
  332. return fmt.Errorf("admin %v already exists", admin.Username)
  333. }
  334. id, err := bucket.NextSequence()
  335. if err != nil {
  336. return err
  337. }
  338. admin.ID = int64(id)
  339. admin.LastLogin = 0
  340. admin.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  341. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  342. buf, err := json.Marshal(admin)
  343. if err != nil {
  344. return err
  345. }
  346. return bucket.Put([]byte(admin.Username), buf)
  347. })
  348. }
  349. func (p *BoltProvider) updateAdmin(admin *Admin) error {
  350. err := admin.validate()
  351. if err != nil {
  352. return err
  353. }
  354. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  355. bucket, err := getAdminsBucket(tx)
  356. if err != nil {
  357. return err
  358. }
  359. var a []byte
  360. if a = bucket.Get([]byte(admin.Username)); a == nil {
  361. return util.NewRecordNotFoundError(fmt.Sprintf("admin %v does not exist", admin.Username))
  362. }
  363. var oldAdmin Admin
  364. err = json.Unmarshal(a, &oldAdmin)
  365. if err != nil {
  366. return err
  367. }
  368. admin.ID = oldAdmin.ID
  369. admin.CreatedAt = oldAdmin.CreatedAt
  370. admin.LastLogin = oldAdmin.LastLogin
  371. admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  372. buf, err := json.Marshal(admin)
  373. if err != nil {
  374. return err
  375. }
  376. return bucket.Put([]byte(admin.Username), buf)
  377. })
  378. }
  379. func (p *BoltProvider) deleteAdmin(admin *Admin) error {
  380. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  381. bucket, err := getAdminsBucket(tx)
  382. if err != nil {
  383. return err
  384. }
  385. if bucket.Get([]byte(admin.Username)) == nil {
  386. return util.NewRecordNotFoundError(fmt.Sprintf("admin %v does not exist", admin.Username))
  387. }
  388. if err := deleteRelatedAPIKey(tx, admin.Username, APIKeyScopeAdmin); err != nil {
  389. return err
  390. }
  391. return bucket.Delete([]byte(admin.Username))
  392. })
  393. }
  394. func (p *BoltProvider) getAdmins(limit int, offset int, order string) ([]Admin, error) {
  395. admins := make([]Admin, 0, limit)
  396. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  397. bucket, err := getAdminsBucket(tx)
  398. if err != nil {
  399. return err
  400. }
  401. cursor := bucket.Cursor()
  402. itNum := 0
  403. if order == OrderASC {
  404. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  405. itNum++
  406. if itNum <= offset {
  407. continue
  408. }
  409. var admin Admin
  410. err = json.Unmarshal(v, &admin)
  411. if err != nil {
  412. return err
  413. }
  414. admin.HideConfidentialData()
  415. admins = append(admins, admin)
  416. if len(admins) >= limit {
  417. break
  418. }
  419. }
  420. } else {
  421. for k, v := cursor.Last(); k != nil; k, v = cursor.Prev() {
  422. itNum++
  423. if itNum <= offset {
  424. continue
  425. }
  426. var admin Admin
  427. err = json.Unmarshal(v, &admin)
  428. if err != nil {
  429. return err
  430. }
  431. admin.HideConfidentialData()
  432. admins = append(admins, admin)
  433. if len(admins) >= limit {
  434. break
  435. }
  436. }
  437. }
  438. return err
  439. })
  440. return admins, err
  441. }
  442. func (p *BoltProvider) dumpAdmins() ([]Admin, error) {
  443. admins := make([]Admin, 0, 30)
  444. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  445. bucket, err := getAdminsBucket(tx)
  446. if err != nil {
  447. return err
  448. }
  449. cursor := bucket.Cursor()
  450. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  451. var admin Admin
  452. err = json.Unmarshal(v, &admin)
  453. if err != nil {
  454. return err
  455. }
  456. admins = append(admins, admin)
  457. }
  458. return err
  459. })
  460. return admins, err
  461. }
  462. func (p *BoltProvider) userExists(username string) (User, error) {
  463. var user User
  464. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  465. bucket, err := getUsersBucket(tx)
  466. if err != nil {
  467. return err
  468. }
  469. u := bucket.Get([]byte(username))
  470. if u == nil {
  471. return util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist", username))
  472. }
  473. folderBucket, err := getFoldersBucket(tx)
  474. if err != nil {
  475. return err
  476. }
  477. user, err = joinUserAndFolders(u, folderBucket)
  478. return err
  479. })
  480. return user, err
  481. }
  482. func (p *BoltProvider) addUser(user *User) error {
  483. err := ValidateUser(user)
  484. if err != nil {
  485. return err
  486. }
  487. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  488. bucket, err := getUsersBucket(tx)
  489. if err != nil {
  490. return err
  491. }
  492. folderBucket, err := getFoldersBucket(tx)
  493. if err != nil {
  494. return err
  495. }
  496. if u := bucket.Get([]byte(user.Username)); u != nil {
  497. return fmt.Errorf("username %v already exists", user.Username)
  498. }
  499. id, err := bucket.NextSequence()
  500. if err != nil {
  501. return err
  502. }
  503. user.ID = int64(id)
  504. user.LastQuotaUpdate = 0
  505. user.UsedQuotaSize = 0
  506. user.UsedQuotaFiles = 0
  507. user.LastLogin = 0
  508. user.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  509. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  510. for idx := range user.VirtualFolders {
  511. err = addUserToFolderMapping(&user.VirtualFolders[idx].BaseVirtualFolder, user, folderBucket)
  512. if err != nil {
  513. return err
  514. }
  515. }
  516. buf, err := json.Marshal(user)
  517. if err != nil {
  518. return err
  519. }
  520. return bucket.Put([]byte(user.Username), buf)
  521. })
  522. }
  523. func (p *BoltProvider) updateUser(user *User) error {
  524. err := ValidateUser(user)
  525. if err != nil {
  526. return err
  527. }
  528. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  529. bucket, err := getUsersBucket(tx)
  530. if err != nil {
  531. return err
  532. }
  533. folderBucket, err := getFoldersBucket(tx)
  534. if err != nil {
  535. return err
  536. }
  537. var u []byte
  538. if u = bucket.Get([]byte(user.Username)); u == nil {
  539. return util.NewRecordNotFoundError(fmt.Sprintf("username %#v does not exist", user.Username))
  540. }
  541. var oldUser User
  542. err = json.Unmarshal(u, &oldUser)
  543. if err != nil {
  544. return err
  545. }
  546. for idx := range oldUser.VirtualFolders {
  547. err = removeUserFromFolderMapping(&oldUser.VirtualFolders[idx], &oldUser, folderBucket)
  548. if err != nil {
  549. return err
  550. }
  551. }
  552. for idx := range user.VirtualFolders {
  553. err = addUserToFolderMapping(&user.VirtualFolders[idx].BaseVirtualFolder, user, folderBucket)
  554. if err != nil {
  555. return err
  556. }
  557. }
  558. user.ID = oldUser.ID
  559. user.LastQuotaUpdate = oldUser.LastQuotaUpdate
  560. user.UsedQuotaSize = oldUser.UsedQuotaSize
  561. user.UsedQuotaFiles = oldUser.UsedQuotaFiles
  562. user.LastLogin = oldUser.LastLogin
  563. user.CreatedAt = oldUser.CreatedAt
  564. user.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  565. buf, err := json.Marshal(user)
  566. if err != nil {
  567. return err
  568. }
  569. return bucket.Put([]byte(user.Username), buf)
  570. })
  571. }
  572. func (p *BoltProvider) deleteUser(user *User) error {
  573. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  574. bucket, err := getUsersBucket(tx)
  575. if err != nil {
  576. return err
  577. }
  578. exists := bucket.Get([]byte(user.Username))
  579. if exists == nil {
  580. return util.NewRecordNotFoundError(fmt.Sprintf("user %#v does not exist", user.Username))
  581. }
  582. if len(user.VirtualFolders) > 0 {
  583. folderBucket, err := getFoldersBucket(tx)
  584. if err != nil {
  585. return err
  586. }
  587. for idx := range user.VirtualFolders {
  588. err = removeUserFromFolderMapping(&user.VirtualFolders[idx], user, folderBucket)
  589. if err != nil {
  590. return err
  591. }
  592. }
  593. }
  594. if err := deleteRelatedAPIKey(tx, user.Username, APIKeyScopeUser); err != nil {
  595. return err
  596. }
  597. return bucket.Delete([]byte(user.Username))
  598. })
  599. }
  600. func (p *BoltProvider) dumpUsers() ([]User, error) {
  601. users := make([]User, 0, 100)
  602. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  603. bucket, err := getUsersBucket(tx)
  604. if err != nil {
  605. return err
  606. }
  607. folderBucket, err := getFoldersBucket(tx)
  608. if err != nil {
  609. return err
  610. }
  611. cursor := bucket.Cursor()
  612. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  613. user, err := joinUserAndFolders(v, folderBucket)
  614. if err != nil {
  615. return err
  616. }
  617. err = addCredentialsToUser(&user)
  618. if err != nil {
  619. return err
  620. }
  621. users = append(users, user)
  622. }
  623. return err
  624. })
  625. return users, err
  626. }
  627. // bolt provider cannot be shared, so we always return no recently updated users
  628. func (p *BoltProvider) getRecentlyUpdatedUsers(after int64) ([]User, error) {
  629. return nil, nil
  630. }
  631. func (p *BoltProvider) getUsers(limit int, offset int, order string) ([]User, error) {
  632. users := make([]User, 0, limit)
  633. var err error
  634. if limit <= 0 {
  635. return users, err
  636. }
  637. err = p.dbHandle.View(func(tx *bolt.Tx) error {
  638. bucket, err := getUsersBucket(tx)
  639. if err != nil {
  640. return err
  641. }
  642. folderBucket, err := getFoldersBucket(tx)
  643. if err != nil {
  644. return err
  645. }
  646. cursor := bucket.Cursor()
  647. itNum := 0
  648. if order == OrderASC {
  649. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  650. itNum++
  651. if itNum <= offset {
  652. continue
  653. }
  654. user, err := joinUserAndFolders(v, folderBucket)
  655. if err == nil {
  656. user.PrepareForRendering()
  657. users = append(users, user)
  658. }
  659. if len(users) >= limit {
  660. break
  661. }
  662. }
  663. } else {
  664. for k, v := cursor.Last(); k != nil; k, v = cursor.Prev() {
  665. itNum++
  666. if itNum <= offset {
  667. continue
  668. }
  669. user, err := joinUserAndFolders(v, folderBucket)
  670. if err == nil {
  671. user.PrepareForRendering()
  672. users = append(users, user)
  673. }
  674. if len(users) >= limit {
  675. break
  676. }
  677. }
  678. }
  679. return err
  680. })
  681. return users, err
  682. }
  683. func (p *BoltProvider) dumpFolders() ([]vfs.BaseVirtualFolder, error) {
  684. folders := make([]vfs.BaseVirtualFolder, 0, 50)
  685. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  686. bucket, err := getFoldersBucket(tx)
  687. if err != nil {
  688. return err
  689. }
  690. cursor := bucket.Cursor()
  691. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  692. var folder vfs.BaseVirtualFolder
  693. err = json.Unmarshal(v, &folder)
  694. if err != nil {
  695. return err
  696. }
  697. folders = append(folders, folder)
  698. }
  699. return err
  700. })
  701. return folders, err
  702. }
  703. func (p *BoltProvider) getFolders(limit, offset int, order string) ([]vfs.BaseVirtualFolder, error) {
  704. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  705. var err error
  706. if limit <= 0 {
  707. return folders, err
  708. }
  709. err = p.dbHandle.View(func(tx *bolt.Tx) error {
  710. bucket, err := getFoldersBucket(tx)
  711. if err != nil {
  712. return err
  713. }
  714. cursor := bucket.Cursor()
  715. itNum := 0
  716. if order == OrderASC {
  717. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  718. itNum++
  719. if itNum <= offset {
  720. continue
  721. }
  722. var folder vfs.BaseVirtualFolder
  723. err = json.Unmarshal(v, &folder)
  724. if err != nil {
  725. return err
  726. }
  727. folder.PrepareForRendering()
  728. folders = append(folders, folder)
  729. if len(folders) >= limit {
  730. break
  731. }
  732. }
  733. } else {
  734. for k, v := cursor.Last(); k != nil; k, v = cursor.Prev() {
  735. itNum++
  736. if itNum <= offset {
  737. continue
  738. }
  739. var folder vfs.BaseVirtualFolder
  740. err = json.Unmarshal(v, &folder)
  741. if err != nil {
  742. return err
  743. }
  744. folder.PrepareForRendering()
  745. folders = append(folders, folder)
  746. if len(folders) >= limit {
  747. break
  748. }
  749. }
  750. }
  751. return err
  752. })
  753. return folders, err
  754. }
  755. func (p *BoltProvider) getFolderByName(name string) (vfs.BaseVirtualFolder, error) {
  756. var folder vfs.BaseVirtualFolder
  757. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  758. bucket, err := getFoldersBucket(tx)
  759. if err != nil {
  760. return err
  761. }
  762. folder, err = folderExistsInternal(name, bucket)
  763. return err
  764. })
  765. return folder, err
  766. }
  767. func (p *BoltProvider) addFolder(folder *vfs.BaseVirtualFolder) error {
  768. err := ValidateFolder(folder)
  769. if err != nil {
  770. return err
  771. }
  772. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  773. bucket, err := getFoldersBucket(tx)
  774. if err != nil {
  775. return err
  776. }
  777. if f := bucket.Get([]byte(folder.Name)); f != nil {
  778. return fmt.Errorf("folder %v already exists", folder.Name)
  779. }
  780. folder.Users = nil
  781. return addFolderInternal(*folder, bucket)
  782. })
  783. }
  784. func (p *BoltProvider) updateFolder(folder *vfs.BaseVirtualFolder) error {
  785. err := ValidateFolder(folder)
  786. if err != nil {
  787. return err
  788. }
  789. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  790. bucket, err := getFoldersBucket(tx)
  791. if err != nil {
  792. return err
  793. }
  794. var f []byte
  795. if f = bucket.Get([]byte(folder.Name)); f == nil {
  796. return util.NewRecordNotFoundError(fmt.Sprintf("folder %v does not exist", folder.Name))
  797. }
  798. var oldFolder vfs.BaseVirtualFolder
  799. err = json.Unmarshal(f, &oldFolder)
  800. if err != nil {
  801. return err
  802. }
  803. folder.ID = oldFolder.ID
  804. folder.LastQuotaUpdate = oldFolder.LastQuotaUpdate
  805. folder.UsedQuotaFiles = oldFolder.UsedQuotaFiles
  806. folder.UsedQuotaSize = oldFolder.UsedQuotaSize
  807. folder.Users = oldFolder.Users
  808. buf, err := json.Marshal(folder)
  809. if err != nil {
  810. return err
  811. }
  812. return bucket.Put([]byte(folder.Name), buf)
  813. })
  814. }
  815. func (p *BoltProvider) deleteFolder(folder *vfs.BaseVirtualFolder) error {
  816. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  817. bucket, err := getFoldersBucket(tx)
  818. if err != nil {
  819. return err
  820. }
  821. usersBucket, err := getUsersBucket(tx)
  822. if err != nil {
  823. return err
  824. }
  825. var f []byte
  826. if f = bucket.Get([]byte(folder.Name)); f == nil {
  827. return util.NewRecordNotFoundError(fmt.Sprintf("folder %v does not exist", folder.Name))
  828. }
  829. var folder vfs.BaseVirtualFolder
  830. err = json.Unmarshal(f, &folder)
  831. if err != nil {
  832. return err
  833. }
  834. for _, username := range folder.Users {
  835. var u []byte
  836. if u = usersBucket.Get([]byte(username)); u == nil {
  837. continue
  838. }
  839. var user User
  840. err = json.Unmarshal(u, &user)
  841. if err != nil {
  842. return err
  843. }
  844. var folders []vfs.VirtualFolder
  845. for _, userFolder := range user.VirtualFolders {
  846. if folder.Name != userFolder.Name {
  847. folders = append(folders, userFolder)
  848. }
  849. }
  850. user.VirtualFolders = folders
  851. buf, err := json.Marshal(user)
  852. if err != nil {
  853. return err
  854. }
  855. err = usersBucket.Put([]byte(user.Username), buf)
  856. if err != nil {
  857. return err
  858. }
  859. }
  860. return bucket.Delete([]byte(folder.Name))
  861. })
  862. }
  863. func (p *BoltProvider) updateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool) error {
  864. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  865. bucket, err := getFoldersBucket(tx)
  866. if err != nil {
  867. return err
  868. }
  869. var f []byte
  870. if f = bucket.Get([]byte(name)); f == nil {
  871. return util.NewRecordNotFoundError(fmt.Sprintf("folder %#v does not exist, unable to update quota", name))
  872. }
  873. var folder vfs.BaseVirtualFolder
  874. err = json.Unmarshal(f, &folder)
  875. if err != nil {
  876. return err
  877. }
  878. if reset {
  879. folder.UsedQuotaSize = sizeAdd
  880. folder.UsedQuotaFiles = filesAdd
  881. } else {
  882. folder.UsedQuotaSize += sizeAdd
  883. folder.UsedQuotaFiles += filesAdd
  884. }
  885. folder.LastQuotaUpdate = util.GetTimeAsMsSinceEpoch(time.Now())
  886. buf, err := json.Marshal(folder)
  887. if err != nil {
  888. return err
  889. }
  890. return bucket.Put([]byte(folder.Name), buf)
  891. })
  892. }
  893. func (p *BoltProvider) getUsedFolderQuota(name string) (int, int64, error) {
  894. folder, err := p.getFolderByName(name)
  895. if err != nil {
  896. providerLog(logger.LevelWarn, "unable to get quota for folder %#v error: %v", name, err)
  897. return 0, 0, err
  898. }
  899. return folder.UsedQuotaFiles, folder.UsedQuotaSize, err
  900. }
  901. func (p *BoltProvider) apiKeyExists(keyID string) (APIKey, error) {
  902. var apiKey APIKey
  903. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  904. bucket, err := getAPIKeysBucket(tx)
  905. if err != nil {
  906. return err
  907. }
  908. k := bucket.Get([]byte(keyID))
  909. if k == nil {
  910. return util.NewRecordNotFoundError(fmt.Sprintf("API key %v does not exist", keyID))
  911. }
  912. return json.Unmarshal(k, &apiKey)
  913. })
  914. return apiKey, err
  915. }
  916. func (p *BoltProvider) addAPIKey(apiKey *APIKey) error {
  917. err := apiKey.validate()
  918. if err != nil {
  919. return err
  920. }
  921. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  922. bucket, err := getAPIKeysBucket(tx)
  923. if err != nil {
  924. return err
  925. }
  926. if a := bucket.Get([]byte(apiKey.KeyID)); a != nil {
  927. return fmt.Errorf("API key %v already exists", apiKey.KeyID)
  928. }
  929. id, err := bucket.NextSequence()
  930. if err != nil {
  931. return err
  932. }
  933. apiKey.ID = int64(id)
  934. apiKey.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  935. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  936. apiKey.LastUseAt = 0
  937. buf, err := json.Marshal(apiKey)
  938. if err != nil {
  939. return err
  940. }
  941. return bucket.Put([]byte(apiKey.KeyID), buf)
  942. })
  943. }
  944. func (p *BoltProvider) updateAPIKey(apiKey *APIKey) error {
  945. err := apiKey.validate()
  946. if err != nil {
  947. return err
  948. }
  949. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  950. bucket, err := getAPIKeysBucket(tx)
  951. if err != nil {
  952. return err
  953. }
  954. var a []byte
  955. if a = bucket.Get([]byte(apiKey.KeyID)); a == nil {
  956. return util.NewRecordNotFoundError(fmt.Sprintf("API key %v does not exist", apiKey.KeyID))
  957. }
  958. var oldAPIKey APIKey
  959. err = json.Unmarshal(a, &oldAPIKey)
  960. if err != nil {
  961. return err
  962. }
  963. apiKey.ID = oldAPIKey.ID
  964. apiKey.KeyID = oldAPIKey.KeyID
  965. apiKey.Key = oldAPIKey.Key
  966. apiKey.CreatedAt = oldAPIKey.CreatedAt
  967. apiKey.LastUseAt = oldAPIKey.LastUseAt
  968. apiKey.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  969. buf, err := json.Marshal(apiKey)
  970. if err != nil {
  971. return err
  972. }
  973. return bucket.Put([]byte(apiKey.KeyID), buf)
  974. })
  975. }
  976. func (p *BoltProvider) deleteAPIKeys(apiKey *APIKey) error {
  977. return p.dbHandle.Update(func(tx *bolt.Tx) error {
  978. bucket, err := getAPIKeysBucket(tx)
  979. if err != nil {
  980. return err
  981. }
  982. if bucket.Get([]byte(apiKey.KeyID)) == nil {
  983. return util.NewRecordNotFoundError(fmt.Sprintf("API key %v does not exist", apiKey.KeyID))
  984. }
  985. return bucket.Delete([]byte(apiKey.KeyID))
  986. })
  987. }
  988. func (p *BoltProvider) getAPIKeys(limit int, offset int, order string) ([]APIKey, error) {
  989. apiKeys := make([]APIKey, 0, limit)
  990. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  991. bucket, err := getAPIKeysBucket(tx)
  992. if err != nil {
  993. return err
  994. }
  995. cursor := bucket.Cursor()
  996. itNum := 0
  997. if order == OrderASC {
  998. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  999. itNum++
  1000. if itNum <= offset {
  1001. continue
  1002. }
  1003. var apiKey APIKey
  1004. err = json.Unmarshal(v, &apiKey)
  1005. if err != nil {
  1006. return err
  1007. }
  1008. apiKey.HideConfidentialData()
  1009. apiKeys = append(apiKeys, apiKey)
  1010. if len(apiKeys) >= limit {
  1011. break
  1012. }
  1013. }
  1014. return nil
  1015. }
  1016. for k, v := cursor.Last(); k != nil; k, v = cursor.Prev() {
  1017. itNum++
  1018. if itNum <= offset {
  1019. continue
  1020. }
  1021. var apiKey APIKey
  1022. err = json.Unmarshal(v, &apiKey)
  1023. if err != nil {
  1024. return err
  1025. }
  1026. apiKey.HideConfidentialData()
  1027. apiKeys = append(apiKeys, apiKey)
  1028. if len(apiKeys) >= limit {
  1029. break
  1030. }
  1031. }
  1032. return nil
  1033. })
  1034. return apiKeys, err
  1035. }
  1036. func (p *BoltProvider) dumpAPIKeys() ([]APIKey, error) {
  1037. apiKeys := make([]APIKey, 0, 30)
  1038. err := p.dbHandle.View(func(tx *bolt.Tx) error {
  1039. bucket, err := getAPIKeysBucket(tx)
  1040. if err != nil {
  1041. return err
  1042. }
  1043. cursor := bucket.Cursor()
  1044. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  1045. var apiKey APIKey
  1046. err = json.Unmarshal(v, &apiKey)
  1047. if err != nil {
  1048. return err
  1049. }
  1050. apiKeys = append(apiKeys, apiKey)
  1051. }
  1052. return err
  1053. })
  1054. return apiKeys, err
  1055. }
  1056. func (p *BoltProvider) close() error {
  1057. return p.dbHandle.Close()
  1058. }
  1059. func (p *BoltProvider) reloadConfig() error {
  1060. return nil
  1061. }
  1062. // initializeDatabase does nothing, no initilization is needed for bolt provider
  1063. func (p *BoltProvider) initializeDatabase() error {
  1064. return ErrNoInitRequired
  1065. }
  1066. func (p *BoltProvider) migrateDatabase() error {
  1067. dbVersion, err := getBoltDatabaseVersion(p.dbHandle)
  1068. if err != nil {
  1069. return err
  1070. }
  1071. switch version := dbVersion.Version; {
  1072. case version == boltDatabaseVersion:
  1073. providerLog(logger.LevelDebug, "bolt database is up to date, current version: %v", version)
  1074. return ErrNoInitRequired
  1075. case version < 10:
  1076. err = fmt.Errorf("database version %v is too old, please see the upgrading docs", version)
  1077. providerLog(logger.LevelError, "%v", err)
  1078. logger.ErrorToConsole("%v", err)
  1079. return err
  1080. case version == 10:
  1081. return updateBoltDatabaseVersion(p.dbHandle, 12)
  1082. case version == 11:
  1083. return updateBoltDatabaseVersion(p.dbHandle, 12)
  1084. default:
  1085. if version > boltDatabaseVersion {
  1086. providerLog(logger.LevelWarn, "database version %v is newer than the supported one: %v", version,
  1087. boltDatabaseVersion)
  1088. logger.WarnToConsole("database version %v is newer than the supported one: %v", version,
  1089. boltDatabaseVersion)
  1090. return nil
  1091. }
  1092. return fmt.Errorf("database version not handled: %v", version)
  1093. }
  1094. }
  1095. func (p *BoltProvider) revertDatabase(targetVersion int) error {
  1096. dbVersion, err := getBoltDatabaseVersion(p.dbHandle)
  1097. if err != nil {
  1098. return err
  1099. }
  1100. if dbVersion.Version == targetVersion {
  1101. return errors.New("current version match target version, nothing to do")
  1102. }
  1103. switch dbVersion.Version {
  1104. case 12:
  1105. return updateBoltDatabaseVersion(p.dbHandle, 10)
  1106. case 11:
  1107. return updateBoltDatabaseVersion(p.dbHandle, 10)
  1108. default:
  1109. return fmt.Errorf("database version not handled: %v", dbVersion.Version)
  1110. }
  1111. }
  1112. func joinUserAndFolders(u []byte, foldersBucket *bolt.Bucket) (User, error) {
  1113. var user User
  1114. err := json.Unmarshal(u, &user)
  1115. if err != nil {
  1116. return user, err
  1117. }
  1118. if len(user.VirtualFolders) > 0 {
  1119. var folders []vfs.VirtualFolder
  1120. for idx := range user.VirtualFolders {
  1121. folder := &user.VirtualFolders[idx]
  1122. baseFolder, err := folderExistsInternal(folder.Name, foldersBucket)
  1123. if err != nil {
  1124. continue
  1125. }
  1126. folder.BaseVirtualFolder = baseFolder
  1127. folders = append(folders, *folder)
  1128. }
  1129. user.VirtualFolders = folders
  1130. }
  1131. user.SetEmptySecretsIfNil()
  1132. return user, err
  1133. }
  1134. func folderExistsInternal(name string, bucket *bolt.Bucket) (vfs.BaseVirtualFolder, error) {
  1135. var folder vfs.BaseVirtualFolder
  1136. f := bucket.Get([]byte(name))
  1137. if f == nil {
  1138. err := util.NewRecordNotFoundError(fmt.Sprintf("folder %v does not exist", name))
  1139. return folder, err
  1140. }
  1141. err := json.Unmarshal(f, &folder)
  1142. return folder, err
  1143. }
  1144. func addFolderInternal(folder vfs.BaseVirtualFolder, bucket *bolt.Bucket) error {
  1145. id, err := bucket.NextSequence()
  1146. if err != nil {
  1147. return err
  1148. }
  1149. folder.ID = int64(id)
  1150. buf, err := json.Marshal(folder)
  1151. if err != nil {
  1152. return err
  1153. }
  1154. return bucket.Put([]byte(folder.Name), buf)
  1155. }
  1156. func addUserToFolderMapping(baseFolder *vfs.BaseVirtualFolder, user *User, bucket *bolt.Bucket) error {
  1157. f := bucket.Get([]byte(baseFolder.Name))
  1158. if f == nil {
  1159. // folder does not exists, try to create
  1160. baseFolder.LastQuotaUpdate = 0
  1161. baseFolder.UsedQuotaFiles = 0
  1162. baseFolder.UsedQuotaSize = 0
  1163. baseFolder.Users = []string{user.Username}
  1164. return addFolderInternal(*baseFolder, bucket)
  1165. }
  1166. var oldFolder vfs.BaseVirtualFolder
  1167. err := json.Unmarshal(f, &oldFolder)
  1168. if err != nil {
  1169. return err
  1170. }
  1171. baseFolder.ID = oldFolder.ID
  1172. baseFolder.LastQuotaUpdate = oldFolder.LastQuotaUpdate
  1173. baseFolder.UsedQuotaFiles = oldFolder.UsedQuotaFiles
  1174. baseFolder.UsedQuotaSize = oldFolder.UsedQuotaSize
  1175. baseFolder.Users = oldFolder.Users
  1176. if !util.IsStringInSlice(user.Username, baseFolder.Users) {
  1177. baseFolder.Users = append(baseFolder.Users, user.Username)
  1178. }
  1179. buf, err := json.Marshal(baseFolder)
  1180. if err != nil {
  1181. return err
  1182. }
  1183. return bucket.Put([]byte(baseFolder.Name), buf)
  1184. }
  1185. func removeUserFromFolderMapping(folder *vfs.VirtualFolder, user *User, bucket *bolt.Bucket) error {
  1186. var f []byte
  1187. if f = bucket.Get([]byte(folder.Name)); f == nil {
  1188. // the folder does not exists so there is no associated user
  1189. return nil
  1190. }
  1191. var baseFolder vfs.BaseVirtualFolder
  1192. err := json.Unmarshal(f, &baseFolder)
  1193. if err != nil {
  1194. return err
  1195. }
  1196. if util.IsStringInSlice(user.Username, baseFolder.Users) {
  1197. var newUserMapping []string
  1198. for _, u := range baseFolder.Users {
  1199. if u != user.Username {
  1200. newUserMapping = append(newUserMapping, u)
  1201. }
  1202. }
  1203. baseFolder.Users = newUserMapping
  1204. buf, err := json.Marshal(baseFolder)
  1205. if err != nil {
  1206. return err
  1207. }
  1208. return bucket.Put([]byte(folder.Name), buf)
  1209. }
  1210. return err
  1211. }
  1212. func deleteRelatedAPIKey(tx *bolt.Tx, username string, scope APIKeyScope) error {
  1213. bucket, err := getAPIKeysBucket(tx)
  1214. if err != nil {
  1215. return err
  1216. }
  1217. var toRemove []string
  1218. cursor := bucket.Cursor()
  1219. for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
  1220. var apiKey APIKey
  1221. err = json.Unmarshal(v, &apiKey)
  1222. if err != nil {
  1223. return err
  1224. }
  1225. if scope == APIKeyScopeUser {
  1226. if apiKey.User == username {
  1227. toRemove = append(toRemove, apiKey.KeyID)
  1228. }
  1229. } else {
  1230. if apiKey.Admin == username {
  1231. toRemove = append(toRemove, apiKey.KeyID)
  1232. }
  1233. }
  1234. }
  1235. for _, k := range toRemove {
  1236. if err := bucket.Delete([]byte(k)); err != nil {
  1237. return err
  1238. }
  1239. }
  1240. return nil
  1241. }
  1242. func getAPIKeysBucket(tx *bolt.Tx) (*bolt.Bucket, error) {
  1243. var err error
  1244. bucket := tx.Bucket(apiKeysBucket)
  1245. if bucket == nil {
  1246. err = errors.New("unable to find api keys bucket, bolt database structure not correcly defined")
  1247. }
  1248. return bucket, err
  1249. }
  1250. func getAdminsBucket(tx *bolt.Tx) (*bolt.Bucket, error) {
  1251. var err error
  1252. bucket := tx.Bucket(adminsBucket)
  1253. if bucket == nil {
  1254. err = errors.New("unable to find admins bucket, bolt database structure not correcly defined")
  1255. }
  1256. return bucket, err
  1257. }
  1258. func getUsersBucket(tx *bolt.Tx) (*bolt.Bucket, error) {
  1259. var err error
  1260. bucket := tx.Bucket(usersBucket)
  1261. if bucket == nil {
  1262. err = errors.New("unable to find users bucket, bolt database structure not correcly defined")
  1263. }
  1264. return bucket, err
  1265. }
  1266. func getFoldersBucket(tx *bolt.Tx) (*bolt.Bucket, error) {
  1267. var err error
  1268. bucket := tx.Bucket(foldersBucket)
  1269. if bucket == nil {
  1270. err = fmt.Errorf("unable to find folders buckets, bolt database structure not correcly defined")
  1271. }
  1272. return bucket, err
  1273. }
  1274. func getBoltDatabaseVersion(dbHandle *bolt.DB) (schemaVersion, error) {
  1275. var dbVersion schemaVersion
  1276. err := dbHandle.View(func(tx *bolt.Tx) error {
  1277. bucket := tx.Bucket(dbVersionBucket)
  1278. if bucket == nil {
  1279. return fmt.Errorf("unable to find database version bucket")
  1280. }
  1281. v := bucket.Get(dbVersionKey)
  1282. if v == nil {
  1283. dbVersion = schemaVersion{
  1284. Version: 10,
  1285. }
  1286. return nil
  1287. }
  1288. return json.Unmarshal(v, &dbVersion)
  1289. })
  1290. return dbVersion, err
  1291. }
  1292. func updateBoltDatabaseVersion(dbHandle *bolt.DB, version int) error {
  1293. err := dbHandle.Update(func(tx *bolt.Tx) error {
  1294. bucket := tx.Bucket(dbVersionBucket)
  1295. if bucket == nil {
  1296. return fmt.Errorf("unable to find database version bucket")
  1297. }
  1298. newDbVersion := schemaVersion{
  1299. Version: version,
  1300. }
  1301. buf, err := json.Marshal(newDbVersion)
  1302. if err != nil {
  1303. return err
  1304. }
  1305. return bucket.Put(dbVersionKey, buf)
  1306. })
  1307. return err
  1308. }