bolt.go 32 KB

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