1
0

sqlcommon.go 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282
  1. package dataprovider
  2. import (
  3. "context"
  4. "crypto/x509"
  5. "database/sql"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "strings"
  10. "time"
  11. "github.com/cockroachdb/cockroach-go/v2/crdb"
  12. "github.com/drakkan/sftpgo/v2/logger"
  13. "github.com/drakkan/sftpgo/v2/util"
  14. "github.com/drakkan/sftpgo/v2/vfs"
  15. )
  16. const (
  17. sqlDatabaseVersion = 16
  18. defaultSQLQueryTimeout = 10 * time.Second
  19. longSQLQueryTimeout = 60 * time.Second
  20. )
  21. var (
  22. errSQLFoldersAssosaction = errors.New("unable to associate virtual folders to user")
  23. errSchemaVersionEmpty = errors.New("we can't determine schema version because the schema_migration table is empty. The SFTPGo database might be corrupted. Consider using the \"resetprovider\" sub-command")
  24. )
  25. type sqlQuerier interface {
  26. PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
  27. }
  28. type sqlScanner interface {
  29. Scan(dest ...interface{}) error
  30. }
  31. func sqlCommonGetShareByID(shareID, username string, dbHandle sqlQuerier) (Share, error) {
  32. var share Share
  33. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  34. defer cancel()
  35. filterUser := username != ""
  36. q := getShareByIDQuery(filterUser)
  37. stmt, err := dbHandle.PrepareContext(ctx, q)
  38. if err != nil {
  39. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  40. return share, err
  41. }
  42. defer stmt.Close()
  43. var row *sql.Row
  44. if filterUser {
  45. row = stmt.QueryRowContext(ctx, shareID, username)
  46. } else {
  47. row = stmt.QueryRowContext(ctx, shareID)
  48. }
  49. return getShareFromDbRow(row)
  50. }
  51. func sqlCommonAddShare(share *Share, dbHandle *sql.DB) error {
  52. err := share.validate()
  53. if err != nil {
  54. return err
  55. }
  56. user, err := provider.userExists(share.Username)
  57. if err != nil {
  58. return util.NewValidationError(fmt.Sprintf("unable to validate user %#v", share.Username))
  59. }
  60. paths, err := json.Marshal(share.Paths)
  61. if err != nil {
  62. return err
  63. }
  64. allowFrom := ""
  65. if len(share.AllowFrom) > 0 {
  66. res, err := json.Marshal(share.AllowFrom)
  67. if err == nil {
  68. allowFrom = string(res)
  69. }
  70. }
  71. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  72. defer cancel()
  73. q := getAddShareQuery()
  74. stmt, err := dbHandle.PrepareContext(ctx, q)
  75. if err != nil {
  76. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  77. return err
  78. }
  79. defer stmt.Close()
  80. usedTokens := 0
  81. createdAt := util.GetTimeAsMsSinceEpoch(time.Now())
  82. updatedAt := createdAt
  83. lastUseAt := int64(0)
  84. if share.IsRestore {
  85. usedTokens = share.UsedTokens
  86. if share.CreatedAt > 0 {
  87. createdAt = share.CreatedAt
  88. }
  89. if share.UpdatedAt > 0 {
  90. updatedAt = share.UpdatedAt
  91. }
  92. lastUseAt = share.LastUseAt
  93. }
  94. _, err = stmt.ExecContext(ctx, share.ShareID, share.Name, share.Description, share.Scope,
  95. string(paths), createdAt, updatedAt, lastUseAt, share.ExpiresAt, share.Password,
  96. share.MaxTokens, usedTokens, allowFrom, user.ID)
  97. return err
  98. }
  99. func sqlCommonUpdateShare(share *Share, dbHandle *sql.DB) error {
  100. err := share.validate()
  101. if err != nil {
  102. return err
  103. }
  104. paths, err := json.Marshal(share.Paths)
  105. if err != nil {
  106. return err
  107. }
  108. allowFrom := ""
  109. if len(share.AllowFrom) > 0 {
  110. res, err := json.Marshal(share.AllowFrom)
  111. if err == nil {
  112. allowFrom = string(res)
  113. }
  114. }
  115. user, err := provider.userExists(share.Username)
  116. if err != nil {
  117. return util.NewValidationError(fmt.Sprintf("unable to validate user %#v", share.Username))
  118. }
  119. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  120. defer cancel()
  121. var q string
  122. if share.IsRestore {
  123. q = getUpdateShareRestoreQuery()
  124. } else {
  125. q = getUpdateShareQuery()
  126. }
  127. stmt, err := dbHandle.PrepareContext(ctx, q)
  128. if err != nil {
  129. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  130. return err
  131. }
  132. defer stmt.Close()
  133. if share.IsRestore {
  134. if share.CreatedAt == 0 {
  135. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  136. }
  137. if share.UpdatedAt == 0 {
  138. share.UpdatedAt = share.CreatedAt
  139. }
  140. _, err = stmt.ExecContext(ctx, share.Name, share.Description, share.Scope, string(paths),
  141. share.CreatedAt, share.UpdatedAt, share.LastUseAt, share.ExpiresAt, share.Password, share.MaxTokens,
  142. share.UsedTokens, allowFrom, user.ID, share.ShareID)
  143. } else {
  144. _, err = stmt.ExecContext(ctx, share.Name, share.Description, share.Scope, string(paths),
  145. util.GetTimeAsMsSinceEpoch(time.Now()), share.ExpiresAt, share.Password, share.MaxTokens,
  146. allowFrom, user.ID, share.ShareID)
  147. }
  148. return err
  149. }
  150. func sqlCommonDeleteShare(share *Share, dbHandle *sql.DB) error {
  151. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  152. defer cancel()
  153. q := getDeleteShareQuery()
  154. stmt, err := dbHandle.PrepareContext(ctx, q)
  155. if err != nil {
  156. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  157. return err
  158. }
  159. defer stmt.Close()
  160. _, err = stmt.ExecContext(ctx, share.ShareID)
  161. return err
  162. }
  163. func sqlCommonGetShares(limit, offset int, order, username string, dbHandle sqlQuerier) ([]Share, error) {
  164. shares := make([]Share, 0, limit)
  165. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  166. defer cancel()
  167. q := getSharesQuery(order)
  168. stmt, err := dbHandle.PrepareContext(ctx, q)
  169. if err != nil {
  170. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  171. return nil, err
  172. }
  173. defer stmt.Close()
  174. rows, err := stmt.QueryContext(ctx, username, limit, offset)
  175. if err != nil {
  176. return shares, err
  177. }
  178. defer rows.Close()
  179. for rows.Next() {
  180. s, err := getShareFromDbRow(rows)
  181. if err != nil {
  182. return shares, err
  183. }
  184. s.HideConfidentialData()
  185. shares = append(shares, s)
  186. }
  187. return shares, rows.Err()
  188. }
  189. func sqlCommonDumpShares(dbHandle sqlQuerier) ([]Share, error) {
  190. shares := make([]Share, 0, 30)
  191. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  192. defer cancel()
  193. q := getDumpSharesQuery()
  194. stmt, err := dbHandle.PrepareContext(ctx, q)
  195. if err != nil {
  196. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  197. return nil, err
  198. }
  199. defer stmt.Close()
  200. rows, err := stmt.QueryContext(ctx)
  201. if err != nil {
  202. return shares, err
  203. }
  204. defer rows.Close()
  205. for rows.Next() {
  206. s, err := getShareFromDbRow(rows)
  207. if err != nil {
  208. return shares, err
  209. }
  210. shares = append(shares, s)
  211. }
  212. return shares, rows.Err()
  213. }
  214. func sqlCommonGetAPIKeyByID(keyID string, dbHandle sqlQuerier) (APIKey, error) {
  215. var apiKey APIKey
  216. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  217. defer cancel()
  218. q := getAPIKeyByIDQuery()
  219. stmt, err := dbHandle.PrepareContext(ctx, q)
  220. if err != nil {
  221. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  222. return apiKey, err
  223. }
  224. defer stmt.Close()
  225. row := stmt.QueryRowContext(ctx, keyID)
  226. apiKey, err = getAPIKeyFromDbRow(row)
  227. if err != nil {
  228. return apiKey, err
  229. }
  230. return getAPIKeyWithRelatedFields(ctx, apiKey, dbHandle)
  231. }
  232. func sqlCommonAddAPIKey(apiKey *APIKey, dbHandle *sql.DB) error {
  233. err := apiKey.validate()
  234. if err != nil {
  235. return err
  236. }
  237. userID, adminID, err := sqlCommonGetAPIKeyRelatedIDs(apiKey)
  238. if err != nil {
  239. return err
  240. }
  241. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  242. defer cancel()
  243. q := getAddAPIKeyQuery()
  244. stmt, err := dbHandle.PrepareContext(ctx, q)
  245. if err != nil {
  246. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  247. return err
  248. }
  249. defer stmt.Close()
  250. _, err = stmt.ExecContext(ctx, apiKey.KeyID, apiKey.Name, apiKey.Key, apiKey.Scope, util.GetTimeAsMsSinceEpoch(time.Now()),
  251. util.GetTimeAsMsSinceEpoch(time.Now()), apiKey.LastUseAt, apiKey.ExpiresAt, apiKey.Description,
  252. userID, adminID)
  253. return err
  254. }
  255. func sqlCommonUpdateAPIKey(apiKey *APIKey, dbHandle *sql.DB) error {
  256. err := apiKey.validate()
  257. if err != nil {
  258. return err
  259. }
  260. userID, adminID, err := sqlCommonGetAPIKeyRelatedIDs(apiKey)
  261. if err != nil {
  262. return err
  263. }
  264. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  265. defer cancel()
  266. q := getUpdateAPIKeyQuery()
  267. stmt, err := dbHandle.PrepareContext(ctx, q)
  268. if err != nil {
  269. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  270. return err
  271. }
  272. defer stmt.Close()
  273. _, err = stmt.ExecContext(ctx, apiKey.Name, apiKey.Scope, apiKey.ExpiresAt, userID, adminID,
  274. apiKey.Description, util.GetTimeAsMsSinceEpoch(time.Now()), apiKey.KeyID)
  275. return err
  276. }
  277. func sqlCommonDeleteAPIKey(apiKey *APIKey, dbHandle *sql.DB) error {
  278. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  279. defer cancel()
  280. q := getDeleteAPIKeyQuery()
  281. stmt, err := dbHandle.PrepareContext(ctx, q)
  282. if err != nil {
  283. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  284. return err
  285. }
  286. defer stmt.Close()
  287. _, err = stmt.ExecContext(ctx, apiKey.KeyID)
  288. return err
  289. }
  290. func sqlCommonGetAPIKeys(limit, offset int, order string, dbHandle sqlQuerier) ([]APIKey, error) {
  291. apiKeys := make([]APIKey, 0, limit)
  292. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  293. defer cancel()
  294. q := getAPIKeysQuery(order)
  295. stmt, err := dbHandle.PrepareContext(ctx, q)
  296. if err != nil {
  297. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  298. return nil, err
  299. }
  300. defer stmt.Close()
  301. rows, err := stmt.QueryContext(ctx, limit, offset)
  302. if err != nil {
  303. return apiKeys, err
  304. }
  305. defer rows.Close()
  306. for rows.Next() {
  307. k, err := getAPIKeyFromDbRow(rows)
  308. if err != nil {
  309. return apiKeys, err
  310. }
  311. k.HideConfidentialData()
  312. apiKeys = append(apiKeys, k)
  313. }
  314. err = rows.Err()
  315. if err != nil {
  316. return apiKeys, err
  317. }
  318. apiKeys, err = getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeAdmin)
  319. if err != nil {
  320. return apiKeys, err
  321. }
  322. return getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeUser)
  323. }
  324. func sqlCommonDumpAPIKeys(dbHandle sqlQuerier) ([]APIKey, error) {
  325. apiKeys := make([]APIKey, 0, 30)
  326. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  327. defer cancel()
  328. q := getDumpAPIKeysQuery()
  329. stmt, err := dbHandle.PrepareContext(ctx, q)
  330. if err != nil {
  331. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  332. return nil, err
  333. }
  334. defer stmt.Close()
  335. rows, err := stmt.QueryContext(ctx)
  336. if err != nil {
  337. return apiKeys, err
  338. }
  339. defer rows.Close()
  340. for rows.Next() {
  341. k, err := getAPIKeyFromDbRow(rows)
  342. if err != nil {
  343. return apiKeys, err
  344. }
  345. apiKeys = append(apiKeys, k)
  346. }
  347. err = rows.Err()
  348. if err != nil {
  349. return apiKeys, err
  350. }
  351. apiKeys, err = getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeAdmin)
  352. if err != nil {
  353. return apiKeys, err
  354. }
  355. return getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeUser)
  356. }
  357. func sqlCommonGetAdminByUsername(username string, dbHandle sqlQuerier) (Admin, error) {
  358. var admin Admin
  359. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  360. defer cancel()
  361. q := getAdminByUsernameQuery()
  362. stmt, err := dbHandle.PrepareContext(ctx, q)
  363. if err != nil {
  364. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  365. return admin, err
  366. }
  367. defer stmt.Close()
  368. row := stmt.QueryRowContext(ctx, username)
  369. return getAdminFromDbRow(row)
  370. }
  371. func sqlCommonValidateAdminAndPass(username, password, ip string, dbHandle *sql.DB) (Admin, error) {
  372. admin, err := sqlCommonGetAdminByUsername(username, dbHandle)
  373. if err != nil {
  374. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  375. return admin, ErrInvalidCredentials
  376. }
  377. err = admin.checkUserAndPass(password, ip)
  378. return admin, err
  379. }
  380. func sqlCommonAddAdmin(admin *Admin, dbHandle *sql.DB) error {
  381. err := admin.validate()
  382. if err != nil {
  383. return err
  384. }
  385. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  386. defer cancel()
  387. q := getAddAdminQuery()
  388. stmt, err := dbHandle.PrepareContext(ctx, q)
  389. if err != nil {
  390. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  391. return err
  392. }
  393. defer stmt.Close()
  394. perms, err := json.Marshal(admin.Permissions)
  395. if err != nil {
  396. return err
  397. }
  398. filters, err := json.Marshal(admin.Filters)
  399. if err != nil {
  400. return err
  401. }
  402. _, err = stmt.ExecContext(ctx, admin.Username, admin.Password, admin.Status, admin.Email, string(perms),
  403. string(filters), admin.AdditionalInfo, admin.Description, util.GetTimeAsMsSinceEpoch(time.Now()),
  404. util.GetTimeAsMsSinceEpoch(time.Now()))
  405. return err
  406. }
  407. func sqlCommonUpdateAdmin(admin *Admin, dbHandle *sql.DB) error {
  408. err := admin.validate()
  409. if err != nil {
  410. return err
  411. }
  412. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  413. defer cancel()
  414. q := getUpdateAdminQuery()
  415. stmt, err := dbHandle.PrepareContext(ctx, q)
  416. if err != nil {
  417. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  418. return err
  419. }
  420. defer stmt.Close()
  421. perms, err := json.Marshal(admin.Permissions)
  422. if err != nil {
  423. return err
  424. }
  425. filters, err := json.Marshal(admin.Filters)
  426. if err != nil {
  427. return err
  428. }
  429. _, err = stmt.ExecContext(ctx, admin.Password, admin.Status, admin.Email, string(perms), string(filters),
  430. admin.AdditionalInfo, admin.Description, util.GetTimeAsMsSinceEpoch(time.Now()), admin.Username)
  431. return err
  432. }
  433. func sqlCommonDeleteAdmin(admin *Admin, dbHandle *sql.DB) error {
  434. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  435. defer cancel()
  436. q := getDeleteAdminQuery()
  437. stmt, err := dbHandle.PrepareContext(ctx, q)
  438. if err != nil {
  439. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  440. return err
  441. }
  442. defer stmt.Close()
  443. _, err = stmt.ExecContext(ctx, admin.Username)
  444. return err
  445. }
  446. func sqlCommonGetAdmins(limit, offset int, order string, dbHandle sqlQuerier) ([]Admin, error) {
  447. admins := make([]Admin, 0, limit)
  448. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  449. defer cancel()
  450. q := getAdminsQuery(order)
  451. stmt, err := dbHandle.PrepareContext(ctx, q)
  452. if err != nil {
  453. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  454. return nil, err
  455. }
  456. defer stmt.Close()
  457. rows, err := stmt.QueryContext(ctx, limit, offset)
  458. if err != nil {
  459. return admins, err
  460. }
  461. defer rows.Close()
  462. for rows.Next() {
  463. a, err := getAdminFromDbRow(rows)
  464. if err != nil {
  465. return admins, err
  466. }
  467. a.HideConfidentialData()
  468. admins = append(admins, a)
  469. }
  470. return admins, rows.Err()
  471. }
  472. func sqlCommonDumpAdmins(dbHandle sqlQuerier) ([]Admin, error) {
  473. admins := make([]Admin, 0, 30)
  474. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  475. defer cancel()
  476. q := getDumpAdminsQuery()
  477. stmt, err := dbHandle.PrepareContext(ctx, q)
  478. if err != nil {
  479. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  480. return nil, err
  481. }
  482. defer stmt.Close()
  483. rows, err := stmt.QueryContext(ctx)
  484. if err != nil {
  485. return admins, err
  486. }
  487. defer rows.Close()
  488. for rows.Next() {
  489. a, err := getAdminFromDbRow(rows)
  490. if err != nil {
  491. return admins, err
  492. }
  493. admins = append(admins, a)
  494. }
  495. return admins, rows.Err()
  496. }
  497. func sqlCommonGetUserByUsername(username string, dbHandle sqlQuerier) (User, error) {
  498. var user User
  499. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  500. defer cancel()
  501. q := getUserByUsernameQuery()
  502. stmt, err := dbHandle.PrepareContext(ctx, q)
  503. if err != nil {
  504. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  505. return user, err
  506. }
  507. defer stmt.Close()
  508. row := stmt.QueryRowContext(ctx, username)
  509. user, err = getUserFromDbRow(row)
  510. if err != nil {
  511. return user, err
  512. }
  513. return getUserWithVirtualFolders(ctx, user, dbHandle)
  514. }
  515. func sqlCommonValidateUserAndPass(username, password, ip, protocol string, dbHandle *sql.DB) (User, error) {
  516. var user User
  517. if password == "" {
  518. return user, errors.New("credentials cannot be null or empty")
  519. }
  520. user, err := sqlCommonGetUserByUsername(username, dbHandle)
  521. if err != nil {
  522. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  523. return user, err
  524. }
  525. return checkUserAndPass(&user, password, ip, protocol)
  526. }
  527. func sqlCommonValidateUserAndTLSCertificate(username, protocol string, tlsCert *x509.Certificate, dbHandle *sql.DB) (User, error) {
  528. var user User
  529. if tlsCert == nil {
  530. return user, errors.New("TLS certificate cannot be null or empty")
  531. }
  532. user, err := sqlCommonGetUserByUsername(username, dbHandle)
  533. if err != nil {
  534. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  535. return user, err
  536. }
  537. return checkUserAndTLSCertificate(&user, protocol, tlsCert)
  538. }
  539. func sqlCommonValidateUserAndPubKey(username string, pubKey []byte, dbHandle *sql.DB) (User, string, error) {
  540. var user User
  541. if len(pubKey) == 0 {
  542. return user, "", errors.New("credentials cannot be null or empty")
  543. }
  544. user, err := sqlCommonGetUserByUsername(username, dbHandle)
  545. if err != nil {
  546. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  547. return user, "", err
  548. }
  549. return checkUserAndPubKey(&user, pubKey)
  550. }
  551. func sqlCommonCheckAvailability(dbHandle *sql.DB) error {
  552. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  553. defer cancel()
  554. return dbHandle.PingContext(ctx)
  555. }
  556. func sqlCommonUpdateTransferQuota(username string, uploadSize, downloadSize int64, reset bool, dbHandle *sql.DB) error {
  557. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  558. defer cancel()
  559. q := getUpdateTransferQuotaQuery(reset)
  560. stmt, err := dbHandle.PrepareContext(ctx, q)
  561. if err != nil {
  562. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  563. return err
  564. }
  565. defer stmt.Close()
  566. _, err = stmt.ExecContext(ctx, uploadSize, downloadSize, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  567. if err == nil {
  568. providerLog(logger.LevelDebug, "transfer quota updated for user %#v, ul increment: %v dl increment: %v is reset? %v",
  569. username, uploadSize, downloadSize, reset)
  570. } else {
  571. providerLog(logger.LevelError, "error updating quota for user %#v: %v", username, err)
  572. }
  573. return err
  574. }
  575. func sqlCommonUpdateQuota(username string, filesAdd int, sizeAdd int64, reset bool, dbHandle *sql.DB) error {
  576. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  577. defer cancel()
  578. q := getUpdateQuotaQuery(reset)
  579. stmt, err := dbHandle.PrepareContext(ctx, q)
  580. if err != nil {
  581. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  582. return err
  583. }
  584. defer stmt.Close()
  585. _, err = stmt.ExecContext(ctx, sizeAdd, filesAdd, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  586. if err == nil {
  587. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  588. username, filesAdd, sizeAdd, reset)
  589. } else {
  590. providerLog(logger.LevelError, "error updating quota for user %#v: %v", username, err)
  591. }
  592. return err
  593. }
  594. func sqlCommonGetUsedQuota(username string, dbHandle *sql.DB) (int, int64, int64, int64, error) {
  595. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  596. defer cancel()
  597. q := getQuotaQuery()
  598. stmt, err := dbHandle.PrepareContext(ctx, q)
  599. if err != nil {
  600. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  601. return 0, 0, 0, 0, err
  602. }
  603. defer stmt.Close()
  604. var usedFiles int
  605. var usedSize, usedUploadSize, usedDownloadSize int64
  606. err = stmt.QueryRowContext(ctx, username).Scan(&usedSize, &usedFiles, &usedUploadSize, &usedDownloadSize)
  607. if err != nil {
  608. providerLog(logger.LevelError, "error getting quota for user: %v, error: %v", username, err)
  609. return 0, 0, 0, 0, err
  610. }
  611. return usedFiles, usedSize, usedUploadSize, usedDownloadSize, err
  612. }
  613. func sqlCommonUpdateShareLastUse(shareID string, numTokens int, dbHandle *sql.DB) error {
  614. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  615. defer cancel()
  616. q := getUpdateShareLastUseQuery()
  617. stmt, err := dbHandle.PrepareContext(ctx, q)
  618. if err != nil {
  619. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  620. return err
  621. }
  622. defer stmt.Close()
  623. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), numTokens, shareID)
  624. if err == nil {
  625. providerLog(logger.LevelDebug, "last use updated for shared object %#v", shareID)
  626. } else {
  627. providerLog(logger.LevelWarn, "error updating last use for shared object %#v: %v", shareID, err)
  628. }
  629. return err
  630. }
  631. func sqlCommonUpdateAPIKeyLastUse(keyID string, dbHandle *sql.DB) error {
  632. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  633. defer cancel()
  634. q := getUpdateAPIKeyLastUseQuery()
  635. stmt, err := dbHandle.PrepareContext(ctx, q)
  636. if err != nil {
  637. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  638. return err
  639. }
  640. defer stmt.Close()
  641. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), keyID)
  642. if err == nil {
  643. providerLog(logger.LevelDebug, "last use updated for key %#v", keyID)
  644. } else {
  645. providerLog(logger.LevelWarn, "error updating last use for key %#v: %v", keyID, err)
  646. }
  647. return err
  648. }
  649. func sqlCommonUpdateAdminLastLogin(username string, dbHandle *sql.DB) error {
  650. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  651. defer cancel()
  652. q := getUpdateAdminLastLoginQuery()
  653. stmt, err := dbHandle.PrepareContext(ctx, q)
  654. if err != nil {
  655. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  656. return err
  657. }
  658. defer stmt.Close()
  659. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  660. if err == nil {
  661. providerLog(logger.LevelDebug, "last login updated for admin %#v", username)
  662. } else {
  663. providerLog(logger.LevelWarn, "error updating last login for admin %#v: %v", username, err)
  664. }
  665. return err
  666. }
  667. func sqlCommonSetUpdatedAt(username string, dbHandle *sql.DB) {
  668. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  669. defer cancel()
  670. q := getSetUpdateAtQuery()
  671. stmt, err := dbHandle.PrepareContext(ctx, q)
  672. if err != nil {
  673. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  674. return
  675. }
  676. defer stmt.Close()
  677. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  678. if err == nil {
  679. providerLog(logger.LevelDebug, "updated_at set for user %#v", username)
  680. } else {
  681. providerLog(logger.LevelWarn, "error setting updated_at for user %#v: %v", username, err)
  682. }
  683. }
  684. func sqlCommonUpdateLastLogin(username string, dbHandle *sql.DB) error {
  685. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  686. defer cancel()
  687. q := getUpdateLastLoginQuery()
  688. stmt, err := dbHandle.PrepareContext(ctx, q)
  689. if err != nil {
  690. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  691. return err
  692. }
  693. defer stmt.Close()
  694. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  695. if err == nil {
  696. providerLog(logger.LevelDebug, "last login updated for user %#v", username)
  697. } else {
  698. providerLog(logger.LevelWarn, "error updating last login for user %#v: %v", username, err)
  699. }
  700. return err
  701. }
  702. func sqlCommonAddUser(user *User, dbHandle *sql.DB) error {
  703. err := ValidateUser(user)
  704. if err != nil {
  705. return err
  706. }
  707. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  708. defer cancel()
  709. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  710. q := getAddUserQuery()
  711. stmt, err := tx.PrepareContext(ctx, q)
  712. if err != nil {
  713. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  714. return err
  715. }
  716. defer stmt.Close()
  717. permissions, err := user.GetPermissionsAsJSON()
  718. if err != nil {
  719. return err
  720. }
  721. publicKeys, err := user.GetPublicKeysAsJSON()
  722. if err != nil {
  723. return err
  724. }
  725. filters, err := user.GetFiltersAsJSON()
  726. if err != nil {
  727. return err
  728. }
  729. fsConfig, err := user.GetFsConfigAsJSON()
  730. if err != nil {
  731. return err
  732. }
  733. _, err = stmt.ExecContext(ctx, user.Username, user.Password, string(publicKeys), user.HomeDir, user.UID, user.GID,
  734. user.MaxSessions, user.QuotaSize, user.QuotaFiles, string(permissions), user.UploadBandwidth,
  735. user.DownloadBandwidth, user.Status, user.ExpirationDate, string(filters), string(fsConfig), user.AdditionalInfo,
  736. user.Description, user.Email, util.GetTimeAsMsSinceEpoch(time.Now()), util.GetTimeAsMsSinceEpoch(time.Now()),
  737. user.UploadDataTransfer, user.DownloadDataTransfer, user.TotalDataTransfer)
  738. if err != nil {
  739. return err
  740. }
  741. return generateVirtualFoldersMapping(ctx, user, tx)
  742. })
  743. }
  744. func sqlCommonUpdateUser(user *User, dbHandle *sql.DB) error {
  745. err := ValidateUser(user)
  746. if err != nil {
  747. return err
  748. }
  749. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  750. defer cancel()
  751. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  752. q := getUpdateUserQuery()
  753. stmt, err := tx.PrepareContext(ctx, q)
  754. if err != nil {
  755. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  756. return err
  757. }
  758. defer stmt.Close()
  759. permissions, err := user.GetPermissionsAsJSON()
  760. if err != nil {
  761. return err
  762. }
  763. publicKeys, err := user.GetPublicKeysAsJSON()
  764. if err != nil {
  765. return err
  766. }
  767. filters, err := user.GetFiltersAsJSON()
  768. if err != nil {
  769. return err
  770. }
  771. fsConfig, err := user.GetFsConfigAsJSON()
  772. if err != nil {
  773. return err
  774. }
  775. _, err = stmt.ExecContext(ctx, user.Password, string(publicKeys), user.HomeDir, user.UID, user.GID, user.MaxSessions,
  776. user.QuotaSize, user.QuotaFiles, string(permissions), user.UploadBandwidth, user.DownloadBandwidth, user.Status,
  777. user.ExpirationDate, string(filters), string(fsConfig), user.AdditionalInfo, user.Description, user.Email,
  778. util.GetTimeAsMsSinceEpoch(time.Now()), user.UploadDataTransfer, user.DownloadDataTransfer, user.TotalDataTransfer,
  779. user.ID)
  780. if err != nil {
  781. return err
  782. }
  783. return generateVirtualFoldersMapping(ctx, user, tx)
  784. })
  785. }
  786. func sqlCommonDeleteUser(user *User, dbHandle *sql.DB) error {
  787. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  788. defer cancel()
  789. q := getDeleteUserQuery()
  790. stmt, err := dbHandle.PrepareContext(ctx, q)
  791. if err != nil {
  792. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  793. return err
  794. }
  795. defer stmt.Close()
  796. _, err = stmt.ExecContext(ctx, user.ID)
  797. return err
  798. }
  799. func sqlCommonDumpUsers(dbHandle sqlQuerier) ([]User, error) {
  800. users := make([]User, 0, 100)
  801. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  802. defer cancel()
  803. q := getDumpUsersQuery()
  804. stmt, err := dbHandle.PrepareContext(ctx, q)
  805. if err != nil {
  806. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  807. return nil, err
  808. }
  809. defer stmt.Close()
  810. rows, err := stmt.QueryContext(ctx)
  811. if err != nil {
  812. return users, err
  813. }
  814. defer rows.Close()
  815. for rows.Next() {
  816. u, err := getUserFromDbRow(rows)
  817. if err != nil {
  818. return users, err
  819. }
  820. err = addCredentialsToUser(&u)
  821. if err != nil {
  822. return users, err
  823. }
  824. users = append(users, u)
  825. }
  826. err = rows.Err()
  827. if err != nil {
  828. return users, err
  829. }
  830. return getUsersWithVirtualFolders(ctx, users, dbHandle)
  831. }
  832. func sqlCommonGetRecentlyUpdatedUsers(after int64, dbHandle sqlQuerier) ([]User, error) {
  833. users := make([]User, 0, 10)
  834. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  835. defer cancel()
  836. q := getRecentlyUpdatedUsersQuery()
  837. stmt, err := dbHandle.PrepareContext(ctx, q)
  838. if err != nil {
  839. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  840. return nil, err
  841. }
  842. defer stmt.Close()
  843. rows, err := stmt.QueryContext(ctx, after)
  844. if err == nil {
  845. defer rows.Close()
  846. for rows.Next() {
  847. u, err := getUserFromDbRow(rows)
  848. if err != nil {
  849. return users, err
  850. }
  851. users = append(users, u)
  852. }
  853. }
  854. err = rows.Err()
  855. if err != nil {
  856. return users, err
  857. }
  858. return getUsersWithVirtualFolders(ctx, users, dbHandle)
  859. }
  860. func sqlCommonGetUsersForQuotaCheck(toFetch map[string]bool, dbHandle sqlQuerier) ([]User, error) {
  861. users := make([]User, 0, 30)
  862. usernames := make([]string, 0, len(toFetch))
  863. for k := range toFetch {
  864. usernames = append(usernames, k)
  865. }
  866. maxUsers := 30
  867. for len(usernames) > 0 {
  868. if maxUsers > len(usernames) {
  869. maxUsers = len(usernames)
  870. }
  871. usersRange, err := sqlCommonGetUsersRangeForQuotaCheck(usernames[:maxUsers], dbHandle)
  872. if err != nil {
  873. return users, err
  874. }
  875. users = append(users, usersRange...)
  876. usernames = usernames[maxUsers:]
  877. }
  878. var usersWithFolders []User
  879. validIdx := 0
  880. for _, user := range users {
  881. if toFetch[user.Username] {
  882. usersWithFolders = append(usersWithFolders, user)
  883. } else {
  884. users[validIdx] = user
  885. validIdx++
  886. }
  887. }
  888. users = users[:validIdx]
  889. if len(usersWithFolders) == 0 {
  890. return users, nil
  891. }
  892. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  893. defer cancel()
  894. usersWithFolders, err := getUsersWithVirtualFolders(ctx, usersWithFolders, dbHandle)
  895. if err != nil {
  896. return users, err
  897. }
  898. users = append(users, usersWithFolders...)
  899. return users, nil
  900. }
  901. func sqlCommonGetUsersRangeForQuotaCheck(usernames []string, dbHandle sqlQuerier) ([]User, error) {
  902. users := make([]User, 0, len(usernames))
  903. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  904. defer cancel()
  905. q := getUsersForQuotaCheckQuery(len(usernames))
  906. stmt, err := dbHandle.PrepareContext(ctx, q)
  907. if err != nil {
  908. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  909. return users, err
  910. }
  911. defer stmt.Close()
  912. queryArgs := make([]interface{}, 0, len(usernames))
  913. for idx := range usernames {
  914. queryArgs = append(queryArgs, usernames[idx])
  915. }
  916. rows, err := stmt.QueryContext(ctx, queryArgs...)
  917. if err != nil {
  918. return nil, err
  919. }
  920. defer rows.Close()
  921. for rows.Next() {
  922. var user User
  923. var filters sql.NullString
  924. err = rows.Scan(&user.ID, &user.Username, &user.QuotaSize, &user.UsedQuotaSize, &user.TotalDataTransfer,
  925. &user.UploadDataTransfer, &user.DownloadDataTransfer, &user.UsedUploadDataTransfer,
  926. &user.UsedDownloadDataTransfer, &filters)
  927. if err != nil {
  928. return users, err
  929. }
  930. if filters.Valid {
  931. var userFilters UserFilters
  932. err = json.Unmarshal([]byte(filters.String), &userFilters)
  933. if err == nil {
  934. user.Filters = userFilters
  935. }
  936. }
  937. users = append(users, user)
  938. }
  939. return users, rows.Err()
  940. }
  941. func sqlCommonAddActiveTransfer(transfer ActiveTransfer, dbHandle *sql.DB) error {
  942. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  943. defer cancel()
  944. q := getAddActiveTransferQuery()
  945. stmt, err := dbHandle.PrepareContext(ctx, q)
  946. if err != nil {
  947. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  948. return err
  949. }
  950. defer stmt.Close()
  951. now := util.GetTimeAsMsSinceEpoch(time.Now())
  952. _, err = stmt.ExecContext(ctx, transfer.ID, transfer.ConnID, transfer.Type, transfer.Username,
  953. transfer.FolderName, transfer.IP, transfer.TruncatedSize, transfer.CurrentULSize, transfer.CurrentDLSize,
  954. now, now)
  955. return err
  956. }
  957. func sqlCommonUpdateActiveTransferSizes(ulSize, dlSize, transferID int64, connectionID string, dbHandle *sql.DB) error {
  958. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  959. defer cancel()
  960. q := getUpdateActiveTransferSizesQuery()
  961. stmt, err := dbHandle.PrepareContext(ctx, q)
  962. if err != nil {
  963. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  964. return err
  965. }
  966. defer stmt.Close()
  967. _, err = stmt.ExecContext(ctx, ulSize, dlSize, util.GetTimeAsMsSinceEpoch(time.Now()), connectionID, transferID)
  968. return err
  969. }
  970. func sqlCommonRemoveActiveTransfer(transferID int64, connectionID string, dbHandle *sql.DB) error {
  971. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  972. defer cancel()
  973. q := getRemoveActiveTransferQuery()
  974. stmt, err := dbHandle.PrepareContext(ctx, q)
  975. if err != nil {
  976. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  977. return err
  978. }
  979. defer stmt.Close()
  980. _, err = stmt.ExecContext(ctx, connectionID, transferID)
  981. return err
  982. }
  983. func sqlCommonCleanupActiveTransfers(before time.Time, dbHandle *sql.DB) error {
  984. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  985. defer cancel()
  986. q := getCleanupActiveTransfersQuery()
  987. stmt, err := dbHandle.PrepareContext(ctx, q)
  988. if err != nil {
  989. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  990. return err
  991. }
  992. defer stmt.Close()
  993. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(before))
  994. return err
  995. }
  996. func sqlCommonGetActiveTransfers(from time.Time, dbHandle sqlQuerier) ([]ActiveTransfer, error) {
  997. transfers := make([]ActiveTransfer, 0, 30)
  998. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  999. defer cancel()
  1000. q := getActiveTransfersQuery()
  1001. stmt, err := dbHandle.PrepareContext(ctx, q)
  1002. if err != nil {
  1003. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1004. return nil, err
  1005. }
  1006. defer stmt.Close()
  1007. rows, err := stmt.QueryContext(ctx, util.GetTimeAsMsSinceEpoch(from))
  1008. if err != nil {
  1009. return nil, err
  1010. }
  1011. defer rows.Close()
  1012. for rows.Next() {
  1013. var transfer ActiveTransfer
  1014. var folderName sql.NullString
  1015. err = rows.Scan(&transfer.ID, &transfer.ConnID, &transfer.Type, &transfer.Username, &folderName, &transfer.IP,
  1016. &transfer.TruncatedSize, &transfer.CurrentULSize, &transfer.CurrentDLSize, &transfer.CreatedAt,
  1017. &transfer.UpdatedAt)
  1018. if err != nil {
  1019. return transfers, err
  1020. }
  1021. if folderName.Valid {
  1022. transfer.FolderName = folderName.String
  1023. }
  1024. transfers = append(transfers, transfer)
  1025. }
  1026. return transfers, rows.Err()
  1027. }
  1028. func sqlCommonGetUsers(limit int, offset int, order string, dbHandle sqlQuerier) ([]User, error) {
  1029. users := make([]User, 0, limit)
  1030. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1031. defer cancel()
  1032. q := getUsersQuery(order)
  1033. stmt, err := dbHandle.PrepareContext(ctx, q)
  1034. if err != nil {
  1035. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1036. return nil, err
  1037. }
  1038. defer stmt.Close()
  1039. rows, err := stmt.QueryContext(ctx, limit, offset)
  1040. if err == nil {
  1041. defer rows.Close()
  1042. for rows.Next() {
  1043. u, err := getUserFromDbRow(rows)
  1044. if err != nil {
  1045. return users, err
  1046. }
  1047. u.PrepareForRendering()
  1048. users = append(users, u)
  1049. }
  1050. }
  1051. err = rows.Err()
  1052. if err != nil {
  1053. return users, err
  1054. }
  1055. return getUsersWithVirtualFolders(ctx, users, dbHandle)
  1056. }
  1057. func sqlCommonGetDefenderHosts(from int64, limit int, dbHandle sqlQuerier) ([]DefenderEntry, error) {
  1058. hosts := make([]DefenderEntry, 0, 100)
  1059. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1060. defer cancel()
  1061. q := getDefenderHostsQuery()
  1062. stmt, err := dbHandle.PrepareContext(ctx, q)
  1063. if err != nil {
  1064. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1065. return nil, err
  1066. }
  1067. defer stmt.Close()
  1068. rows, err := stmt.QueryContext(ctx, from, limit)
  1069. if err != nil {
  1070. providerLog(logger.LevelError, "unable to get defender hosts: %v", err)
  1071. return hosts, err
  1072. }
  1073. defer rows.Close()
  1074. var idForScores []int64
  1075. for rows.Next() {
  1076. var banTime sql.NullInt64
  1077. host := DefenderEntry{}
  1078. err = rows.Scan(&host.ID, &host.IP, &banTime)
  1079. if err != nil {
  1080. providerLog(logger.LevelError, "unable to scan defender host row: %v", err)
  1081. return hosts, err
  1082. }
  1083. var hostBanTime time.Time
  1084. if banTime.Valid && banTime.Int64 > 0 {
  1085. hostBanTime = util.GetTimeFromMsecSinceEpoch(banTime.Int64)
  1086. }
  1087. if hostBanTime.IsZero() || hostBanTime.Before(time.Now()) {
  1088. idForScores = append(idForScores, host.ID)
  1089. } else {
  1090. host.BanTime = hostBanTime
  1091. }
  1092. hosts = append(hosts, host)
  1093. }
  1094. err = rows.Err()
  1095. if err != nil {
  1096. providerLog(logger.LevelError, "unable to iterate over defender host rows: %v", err)
  1097. return hosts, err
  1098. }
  1099. return getDefenderHostsWithScores(ctx, hosts, from, idForScores, dbHandle)
  1100. }
  1101. func sqlCommonIsDefenderHostBanned(ip string, dbHandle sqlQuerier) (DefenderEntry, error) {
  1102. var host DefenderEntry
  1103. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1104. defer cancel()
  1105. q := getDefenderIsHostBannedQuery()
  1106. stmt, err := dbHandle.PrepareContext(ctx, q)
  1107. if err != nil {
  1108. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1109. return host, err
  1110. }
  1111. defer stmt.Close()
  1112. row := stmt.QueryRowContext(ctx, ip, util.GetTimeAsMsSinceEpoch(time.Now()))
  1113. err = row.Scan(&host.ID)
  1114. if err != nil {
  1115. if errors.Is(err, sql.ErrNoRows) {
  1116. return host, util.NewRecordNotFoundError("host not found")
  1117. }
  1118. providerLog(logger.LevelError, "unable to check ban status for host %#v: %v", ip, err)
  1119. return host, err
  1120. }
  1121. return host, nil
  1122. }
  1123. func sqlCommonGetDefenderHostByIP(ip string, from int64, dbHandle sqlQuerier) (DefenderEntry, error) {
  1124. var host DefenderEntry
  1125. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1126. defer cancel()
  1127. q := getDefenderHostQuery()
  1128. stmt, err := dbHandle.PrepareContext(ctx, q)
  1129. if err != nil {
  1130. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1131. return host, err
  1132. }
  1133. defer stmt.Close()
  1134. row := stmt.QueryRowContext(ctx, ip, from)
  1135. var banTime sql.NullInt64
  1136. err = row.Scan(&host.ID, &host.IP, &banTime)
  1137. if err != nil {
  1138. if errors.Is(err, sql.ErrNoRows) {
  1139. return host, util.NewRecordNotFoundError("host not found")
  1140. }
  1141. providerLog(logger.LevelError, "unable to get host for ip %#v: %v", ip, err)
  1142. return host, err
  1143. }
  1144. if banTime.Valid && banTime.Int64 > 0 {
  1145. hostBanTime := util.GetTimeFromMsecSinceEpoch(banTime.Int64)
  1146. if !hostBanTime.IsZero() && hostBanTime.After(time.Now()) {
  1147. host.BanTime = hostBanTime
  1148. return host, nil
  1149. }
  1150. }
  1151. hosts, err := getDefenderHostsWithScores(ctx, []DefenderEntry{host}, from, []int64{host.ID}, dbHandle)
  1152. if err != nil {
  1153. return host, err
  1154. }
  1155. if len(hosts) == 0 {
  1156. return host, util.NewRecordNotFoundError("host not found")
  1157. }
  1158. return hosts[0], nil
  1159. }
  1160. func sqlCommonDefenderIncrementBanTime(ip string, minutesToAdd int, dbHandle *sql.DB) error {
  1161. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1162. defer cancel()
  1163. q := getDefenderIncrementBanTimeQuery()
  1164. stmt, err := dbHandle.PrepareContext(ctx, q)
  1165. if err != nil {
  1166. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1167. return err
  1168. }
  1169. defer stmt.Close()
  1170. _, err = stmt.ExecContext(ctx, minutesToAdd*60000, ip)
  1171. if err == nil {
  1172. providerLog(logger.LevelDebug, "ban time updated for ip %#v, increment (minutes): %v",
  1173. ip, minutesToAdd)
  1174. } else {
  1175. providerLog(logger.LevelError, "error updating ban time for ip %#v: %v", ip, err)
  1176. }
  1177. return err
  1178. }
  1179. func sqlCommonSetDefenderBanTime(ip string, banTime int64, dbHandle *sql.DB) error {
  1180. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1181. defer cancel()
  1182. q := getDefenderSetBanTimeQuery()
  1183. stmt, err := dbHandle.PrepareContext(ctx, q)
  1184. if err != nil {
  1185. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1186. return err
  1187. }
  1188. defer stmt.Close()
  1189. _, err = stmt.ExecContext(ctx, banTime, ip)
  1190. if err == nil {
  1191. providerLog(logger.LevelDebug, "ip %#v banned until %v", ip, util.GetTimeFromMsecSinceEpoch(banTime))
  1192. } else {
  1193. providerLog(logger.LevelError, "error setting ban time for ip %#v: %v", ip, err)
  1194. }
  1195. return err
  1196. }
  1197. func sqlCommonDeleteDefenderHost(ip string, dbHandle sqlQuerier) error {
  1198. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1199. defer cancel()
  1200. q := getDeleteDefenderHostQuery()
  1201. stmt, err := dbHandle.PrepareContext(ctx, q)
  1202. if err != nil {
  1203. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1204. return err
  1205. }
  1206. defer stmt.Close()
  1207. _, err = stmt.ExecContext(ctx, ip)
  1208. if err != nil {
  1209. providerLog(logger.LevelError, "unable to delete defender host %#v: %v", ip, err)
  1210. }
  1211. return err
  1212. }
  1213. func sqlCommonAddDefenderHostAndEvent(ip string, score int, dbHandle *sql.DB) error {
  1214. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1215. defer cancel()
  1216. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  1217. if err := sqlCommonAddDefenderHost(ctx, ip, tx); err != nil {
  1218. return err
  1219. }
  1220. return sqlCommonAddDefenderEvent(ctx, ip, score, tx)
  1221. })
  1222. }
  1223. func sqlCommonDefenderCleanup(from int64, dbHandler *sql.DB) error {
  1224. if err := sqlCommonCleanupDefenderEvents(from, dbHandler); err != nil {
  1225. return err
  1226. }
  1227. return sqlCommonCleanupDefenderHosts(from, dbHandler)
  1228. }
  1229. func sqlCommonAddDefenderHost(ctx context.Context, ip string, tx *sql.Tx) error {
  1230. q := getAddDefenderHostQuery()
  1231. stmt, err := tx.PrepareContext(ctx, q)
  1232. if err != nil {
  1233. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1234. return err
  1235. }
  1236. defer stmt.Close()
  1237. _, err = stmt.ExecContext(ctx, ip, util.GetTimeAsMsSinceEpoch(time.Now()))
  1238. if err != nil {
  1239. providerLog(logger.LevelError, "unable to add defender host %#v: %v", ip, err)
  1240. }
  1241. return err
  1242. }
  1243. func sqlCommonAddDefenderEvent(ctx context.Context, ip string, score int, tx *sql.Tx) error {
  1244. q := getAddDefenderEventQuery()
  1245. stmt, err := tx.PrepareContext(ctx, q)
  1246. if err != nil {
  1247. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1248. return err
  1249. }
  1250. defer stmt.Close()
  1251. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), score, ip)
  1252. if err != nil {
  1253. providerLog(logger.LevelError, "unable to add defender event for %#v: %v", ip, err)
  1254. }
  1255. return err
  1256. }
  1257. func sqlCommonCleanupDefenderHosts(from int64, dbHandle *sql.DB) error {
  1258. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1259. defer cancel()
  1260. q := getDefenderHostsCleanupQuery()
  1261. stmt, err := dbHandle.PrepareContext(ctx, q)
  1262. if err != nil {
  1263. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1264. return err
  1265. }
  1266. defer stmt.Close()
  1267. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), from)
  1268. if err != nil {
  1269. providerLog(logger.LevelError, "unable to cleanup defender hosts: %v", err)
  1270. }
  1271. return err
  1272. }
  1273. func sqlCommonCleanupDefenderEvents(from int64, dbHandle *sql.DB) error {
  1274. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1275. defer cancel()
  1276. q := getDefenderEventsCleanupQuery()
  1277. stmt, err := dbHandle.PrepareContext(ctx, q)
  1278. if err != nil {
  1279. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1280. return err
  1281. }
  1282. defer stmt.Close()
  1283. _, err = stmt.ExecContext(ctx, from)
  1284. if err != nil {
  1285. providerLog(logger.LevelError, "unable to cleanup defender events: %v", err)
  1286. }
  1287. return err
  1288. }
  1289. func getShareFromDbRow(row sqlScanner) (Share, error) {
  1290. var share Share
  1291. var description, password, allowFrom, paths sql.NullString
  1292. err := row.Scan(&share.ShareID, &share.Name, &description, &share.Scope,
  1293. &paths, &share.Username, &share.CreatedAt, &share.UpdatedAt,
  1294. &share.LastUseAt, &share.ExpiresAt, &password, &share.MaxTokens,
  1295. &share.UsedTokens, &allowFrom)
  1296. if err != nil {
  1297. if errors.Is(err, sql.ErrNoRows) {
  1298. return share, util.NewRecordNotFoundError(err.Error())
  1299. }
  1300. return share, err
  1301. }
  1302. if paths.Valid {
  1303. var list []string
  1304. err = json.Unmarshal([]byte(paths.String), &list)
  1305. if err != nil {
  1306. return share, err
  1307. }
  1308. share.Paths = list
  1309. } else {
  1310. return share, errors.New("unable to decode shared paths")
  1311. }
  1312. if description.Valid {
  1313. share.Description = description.String
  1314. }
  1315. if password.Valid {
  1316. share.Password = password.String
  1317. }
  1318. if allowFrom.Valid {
  1319. var list []string
  1320. err = json.Unmarshal([]byte(allowFrom.String), &list)
  1321. if err == nil {
  1322. share.AllowFrom = list
  1323. }
  1324. }
  1325. return share, nil
  1326. }
  1327. func getAPIKeyFromDbRow(row sqlScanner) (APIKey, error) {
  1328. var apiKey APIKey
  1329. var userID, adminID sql.NullInt64
  1330. var description sql.NullString
  1331. err := row.Scan(&apiKey.KeyID, &apiKey.Name, &apiKey.Key, &apiKey.Scope, &apiKey.CreatedAt, &apiKey.UpdatedAt,
  1332. &apiKey.LastUseAt, &apiKey.ExpiresAt, &description, &userID, &adminID)
  1333. if err != nil {
  1334. if errors.Is(err, sql.ErrNoRows) {
  1335. return apiKey, util.NewRecordNotFoundError(err.Error())
  1336. }
  1337. return apiKey, err
  1338. }
  1339. if userID.Valid {
  1340. apiKey.userID = userID.Int64
  1341. }
  1342. if adminID.Valid {
  1343. apiKey.adminID = adminID.Int64
  1344. }
  1345. if description.Valid {
  1346. apiKey.Description = description.String
  1347. }
  1348. return apiKey, nil
  1349. }
  1350. func getAdminFromDbRow(row sqlScanner) (Admin, error) {
  1351. var admin Admin
  1352. var email, filters, additionalInfo, permissions, description sql.NullString
  1353. err := row.Scan(&admin.ID, &admin.Username, &admin.Password, &admin.Status, &email, &permissions,
  1354. &filters, &additionalInfo, &description, &admin.CreatedAt, &admin.UpdatedAt, &admin.LastLogin)
  1355. if err != nil {
  1356. if errors.Is(err, sql.ErrNoRows) {
  1357. return admin, util.NewRecordNotFoundError(err.Error())
  1358. }
  1359. return admin, err
  1360. }
  1361. if permissions.Valid {
  1362. var perms []string
  1363. err = json.Unmarshal([]byte(permissions.String), &perms)
  1364. if err != nil {
  1365. return admin, err
  1366. }
  1367. admin.Permissions = perms
  1368. }
  1369. if email.Valid {
  1370. admin.Email = email.String
  1371. }
  1372. if filters.Valid {
  1373. var adminFilters AdminFilters
  1374. err = json.Unmarshal([]byte(filters.String), &adminFilters)
  1375. if err == nil {
  1376. admin.Filters = adminFilters
  1377. }
  1378. }
  1379. if additionalInfo.Valid {
  1380. admin.AdditionalInfo = additionalInfo.String
  1381. }
  1382. if description.Valid {
  1383. admin.Description = description.String
  1384. }
  1385. admin.SetEmptySecretsIfNil()
  1386. return admin, nil
  1387. }
  1388. func getUserFromDbRow(row sqlScanner) (User, error) {
  1389. var user User
  1390. var permissions sql.NullString
  1391. var password sql.NullString
  1392. var publicKey sql.NullString
  1393. var filters sql.NullString
  1394. var fsConfig sql.NullString
  1395. var additionalInfo, description, email sql.NullString
  1396. err := row.Scan(&user.ID, &user.Username, &password, &publicKey, &user.HomeDir, &user.UID, &user.GID, &user.MaxSessions,
  1397. &user.QuotaSize, &user.QuotaFiles, &permissions, &user.UsedQuotaSize, &user.UsedQuotaFiles, &user.LastQuotaUpdate,
  1398. &user.UploadBandwidth, &user.DownloadBandwidth, &user.ExpirationDate, &user.LastLogin, &user.Status, &filters, &fsConfig,
  1399. &additionalInfo, &description, &email, &user.CreatedAt, &user.UpdatedAt, &user.UploadDataTransfer, &user.DownloadDataTransfer,
  1400. &user.TotalDataTransfer, &user.UsedUploadDataTransfer, &user.UsedDownloadDataTransfer)
  1401. if err != nil {
  1402. if errors.Is(err, sql.ErrNoRows) {
  1403. return user, util.NewRecordNotFoundError(err.Error())
  1404. }
  1405. return user, err
  1406. }
  1407. if password.Valid {
  1408. user.Password = password.String
  1409. }
  1410. // we can have a empty string or an invalid json in null string
  1411. // so we do a relaxed test if the field is optional, for example we
  1412. // populate public keys only if unmarshal does not return an error
  1413. if publicKey.Valid {
  1414. var list []string
  1415. err = json.Unmarshal([]byte(publicKey.String), &list)
  1416. if err == nil {
  1417. user.PublicKeys = list
  1418. }
  1419. }
  1420. if permissions.Valid {
  1421. perms := make(map[string][]string)
  1422. err = json.Unmarshal([]byte(permissions.String), &perms)
  1423. if err != nil {
  1424. providerLog(logger.LevelError, "unable to deserialize permissions for user %#v: %v", user.Username, err)
  1425. return user, fmt.Errorf("unable to deserialize permissions for user %#v: %v", user.Username, err)
  1426. }
  1427. user.Permissions = perms
  1428. }
  1429. if filters.Valid {
  1430. var userFilters UserFilters
  1431. err = json.Unmarshal([]byte(filters.String), &userFilters)
  1432. if err == nil {
  1433. user.Filters = userFilters
  1434. }
  1435. }
  1436. if fsConfig.Valid {
  1437. var fs vfs.Filesystem
  1438. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1439. if err == nil {
  1440. user.FsConfig = fs
  1441. }
  1442. }
  1443. if additionalInfo.Valid {
  1444. user.AdditionalInfo = additionalInfo.String
  1445. }
  1446. if description.Valid {
  1447. user.Description = description.String
  1448. }
  1449. if email.Valid {
  1450. user.Email = email.String
  1451. }
  1452. user.SetEmptySecretsIfNil()
  1453. return user, nil
  1454. }
  1455. func sqlCommonCheckFolderExists(ctx context.Context, name string, dbHandle sqlQuerier) error {
  1456. var folderName string
  1457. q := checkFolderNameQuery()
  1458. stmt, err := dbHandle.PrepareContext(ctx, q)
  1459. if err != nil {
  1460. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1461. return err
  1462. }
  1463. defer stmt.Close()
  1464. row := stmt.QueryRowContext(ctx, name)
  1465. return row.Scan(&folderName)
  1466. }
  1467. func sqlCommonGetFolder(ctx context.Context, name string, dbHandle sqlQuerier) (vfs.BaseVirtualFolder, error) {
  1468. var folder vfs.BaseVirtualFolder
  1469. q := getFolderByNameQuery()
  1470. stmt, err := dbHandle.PrepareContext(ctx, q)
  1471. if err != nil {
  1472. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1473. return folder, err
  1474. }
  1475. defer stmt.Close()
  1476. row := stmt.QueryRowContext(ctx, name)
  1477. var mappedPath, description, fsConfig sql.NullString
  1478. err = row.Scan(&folder.ID, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles, &folder.LastQuotaUpdate,
  1479. &folder.Name, &description, &fsConfig)
  1480. if err != nil {
  1481. if errors.Is(err, sql.ErrNoRows) {
  1482. return folder, util.NewRecordNotFoundError(err.Error())
  1483. }
  1484. return folder, err
  1485. }
  1486. if mappedPath.Valid {
  1487. folder.MappedPath = mappedPath.String
  1488. }
  1489. if description.Valid {
  1490. folder.Description = description.String
  1491. }
  1492. if fsConfig.Valid {
  1493. var fs vfs.Filesystem
  1494. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1495. if err == nil {
  1496. folder.FsConfig = fs
  1497. }
  1498. }
  1499. return folder, err
  1500. }
  1501. func sqlCommonGetFolderByName(ctx context.Context, name string, dbHandle sqlQuerier) (vfs.BaseVirtualFolder, error) {
  1502. folder, err := sqlCommonGetFolder(ctx, name, dbHandle)
  1503. if err != nil {
  1504. return folder, err
  1505. }
  1506. folders, err := getVirtualFoldersWithUsers([]vfs.BaseVirtualFolder{folder}, dbHandle)
  1507. if err != nil {
  1508. return folder, err
  1509. }
  1510. if len(folders) != 1 {
  1511. return folder, fmt.Errorf("unable to associate users with folder %#v", name)
  1512. }
  1513. return folders[0], nil
  1514. }
  1515. func sqlCommonAddOrUpdateFolder(ctx context.Context, baseFolder *vfs.BaseVirtualFolder, usedQuotaSize int64,
  1516. usedQuotaFiles int, lastQuotaUpdate int64, dbHandle sqlQuerier) (vfs.BaseVirtualFolder, error) {
  1517. var folder vfs.BaseVirtualFolder
  1518. // FIXME: we could use an UPSERT here, this SELECT could be racy
  1519. err := sqlCommonCheckFolderExists(ctx, baseFolder.Name, dbHandle)
  1520. switch err {
  1521. case nil:
  1522. err = sqlCommonUpdateFolder(baseFolder, dbHandle)
  1523. if err != nil {
  1524. return folder, err
  1525. }
  1526. case sql.ErrNoRows:
  1527. baseFolder.UsedQuotaFiles = usedQuotaFiles
  1528. baseFolder.UsedQuotaSize = usedQuotaSize
  1529. baseFolder.LastQuotaUpdate = lastQuotaUpdate
  1530. err = sqlCommonAddFolder(baseFolder, dbHandle)
  1531. if err != nil {
  1532. return folder, err
  1533. }
  1534. default:
  1535. return folder, err
  1536. }
  1537. return sqlCommonGetFolder(ctx, baseFolder.Name, dbHandle)
  1538. }
  1539. func sqlCommonAddFolder(folder *vfs.BaseVirtualFolder, dbHandle sqlQuerier) error {
  1540. err := ValidateFolder(folder)
  1541. if err != nil {
  1542. return err
  1543. }
  1544. fsConfig, err := json.Marshal(folder.FsConfig)
  1545. if err != nil {
  1546. return err
  1547. }
  1548. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1549. defer cancel()
  1550. q := getAddFolderQuery()
  1551. stmt, err := dbHandle.PrepareContext(ctx, q)
  1552. if err != nil {
  1553. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1554. return err
  1555. }
  1556. defer stmt.Close()
  1557. _, err = stmt.ExecContext(ctx, folder.MappedPath, folder.UsedQuotaSize, folder.UsedQuotaFiles,
  1558. folder.LastQuotaUpdate, folder.Name, folder.Description, string(fsConfig))
  1559. return err
  1560. }
  1561. func sqlCommonUpdateFolder(folder *vfs.BaseVirtualFolder, dbHandle sqlQuerier) error {
  1562. err := ValidateFolder(folder)
  1563. if err != nil {
  1564. return err
  1565. }
  1566. fsConfig, err := json.Marshal(folder.FsConfig)
  1567. if err != nil {
  1568. return err
  1569. }
  1570. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1571. defer cancel()
  1572. q := getUpdateFolderQuery()
  1573. stmt, err := dbHandle.PrepareContext(ctx, q)
  1574. if err != nil {
  1575. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1576. return err
  1577. }
  1578. defer stmt.Close()
  1579. _, err = stmt.ExecContext(ctx, folder.MappedPath, folder.Description, string(fsConfig), folder.Name)
  1580. return err
  1581. }
  1582. func sqlCommonDeleteFolder(folder *vfs.BaseVirtualFolder, dbHandle sqlQuerier) error {
  1583. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1584. defer cancel()
  1585. q := getDeleteFolderQuery()
  1586. stmt, err := dbHandle.PrepareContext(ctx, q)
  1587. if err != nil {
  1588. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1589. return err
  1590. }
  1591. defer stmt.Close()
  1592. _, err = stmt.ExecContext(ctx, folder.ID)
  1593. return err
  1594. }
  1595. func sqlCommonDumpFolders(dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  1596. folders := make([]vfs.BaseVirtualFolder, 0, 50)
  1597. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  1598. defer cancel()
  1599. q := getDumpFoldersQuery()
  1600. stmt, err := dbHandle.PrepareContext(ctx, q)
  1601. if err != nil {
  1602. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1603. return nil, err
  1604. }
  1605. defer stmt.Close()
  1606. rows, err := stmt.QueryContext(ctx)
  1607. if err != nil {
  1608. return folders, err
  1609. }
  1610. defer rows.Close()
  1611. for rows.Next() {
  1612. var folder vfs.BaseVirtualFolder
  1613. var mappedPath, description, fsConfig sql.NullString
  1614. err = rows.Scan(&folder.ID, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  1615. &folder.LastQuotaUpdate, &folder.Name, &description, &fsConfig)
  1616. if err != nil {
  1617. return folders, err
  1618. }
  1619. if mappedPath.Valid {
  1620. folder.MappedPath = mappedPath.String
  1621. }
  1622. if description.Valid {
  1623. folder.Description = description.String
  1624. }
  1625. if fsConfig.Valid {
  1626. var fs vfs.Filesystem
  1627. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1628. if err == nil {
  1629. folder.FsConfig = fs
  1630. }
  1631. }
  1632. folders = append(folders, folder)
  1633. }
  1634. err = rows.Err()
  1635. if err != nil {
  1636. return folders, err
  1637. }
  1638. return getVirtualFoldersWithUsers(folders, dbHandle)
  1639. }
  1640. func sqlCommonGetFolders(limit, offset int, order string, dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  1641. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  1642. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1643. defer cancel()
  1644. q := getFoldersQuery(order)
  1645. stmt, err := dbHandle.PrepareContext(ctx, q)
  1646. if err != nil {
  1647. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1648. return nil, err
  1649. }
  1650. defer stmt.Close()
  1651. rows, err := stmt.QueryContext(ctx, limit, offset)
  1652. if err != nil {
  1653. return folders, err
  1654. }
  1655. defer rows.Close()
  1656. for rows.Next() {
  1657. var folder vfs.BaseVirtualFolder
  1658. var mappedPath, description, fsConfig sql.NullString
  1659. err = rows.Scan(&folder.ID, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  1660. &folder.LastQuotaUpdate, &folder.Name, &description, &fsConfig)
  1661. if err != nil {
  1662. return folders, err
  1663. }
  1664. if mappedPath.Valid {
  1665. folder.MappedPath = mappedPath.String
  1666. }
  1667. if description.Valid {
  1668. folder.Description = description.String
  1669. }
  1670. if fsConfig.Valid {
  1671. var fs vfs.Filesystem
  1672. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1673. if err == nil {
  1674. folder.FsConfig = fs
  1675. }
  1676. }
  1677. folder.PrepareForRendering()
  1678. folders = append(folders, folder)
  1679. }
  1680. err = rows.Err()
  1681. if err != nil {
  1682. return folders, err
  1683. }
  1684. return getVirtualFoldersWithUsers(folders, dbHandle)
  1685. }
  1686. func sqlCommonClearFolderMapping(ctx context.Context, user *User, dbHandle sqlQuerier) error {
  1687. q := getClearFolderMappingQuery()
  1688. stmt, err := dbHandle.PrepareContext(ctx, q)
  1689. if err != nil {
  1690. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1691. return err
  1692. }
  1693. defer stmt.Close()
  1694. _, err = stmt.ExecContext(ctx, user.Username)
  1695. return err
  1696. }
  1697. func sqlCommonAddFolderMapping(ctx context.Context, user *User, folder *vfs.VirtualFolder, dbHandle sqlQuerier) error {
  1698. q := getAddFolderMappingQuery()
  1699. stmt, err := dbHandle.PrepareContext(ctx, q)
  1700. if err != nil {
  1701. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1702. return err
  1703. }
  1704. defer stmt.Close()
  1705. _, err = stmt.ExecContext(ctx, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.ID, user.Username)
  1706. return err
  1707. }
  1708. func generateVirtualFoldersMapping(ctx context.Context, user *User, dbHandle sqlQuerier) error {
  1709. err := sqlCommonClearFolderMapping(ctx, user, dbHandle)
  1710. if err != nil {
  1711. return err
  1712. }
  1713. for idx := range user.VirtualFolders {
  1714. vfolder := &user.VirtualFolders[idx]
  1715. f, err := sqlCommonAddOrUpdateFolder(ctx, &vfolder.BaseVirtualFolder, 0, 0, 0, dbHandle)
  1716. if err != nil {
  1717. return err
  1718. }
  1719. vfolder.BaseVirtualFolder = f
  1720. err = sqlCommonAddFolderMapping(ctx, user, vfolder, dbHandle)
  1721. if err != nil {
  1722. return err
  1723. }
  1724. }
  1725. return err
  1726. }
  1727. func getUserWithVirtualFolders(ctx context.Context, user User, dbHandle sqlQuerier) (User, error) {
  1728. users, err := getUsersWithVirtualFolders(ctx, []User{user}, dbHandle)
  1729. if err != nil {
  1730. return user, err
  1731. }
  1732. if len(users) == 0 {
  1733. return user, errSQLFoldersAssosaction
  1734. }
  1735. return users[0], err
  1736. }
  1737. func getDefenderHostsWithScores(ctx context.Context, hosts []DefenderEntry, from int64, idForScores []int64,
  1738. dbHandle sqlQuerier) (
  1739. []DefenderEntry,
  1740. error,
  1741. ) {
  1742. if len(idForScores) == 0 {
  1743. return hosts, nil
  1744. }
  1745. hostsWithScores := make(map[int64]int)
  1746. q := getDefenderEventsQuery(idForScores)
  1747. stmt, err := dbHandle.PrepareContext(ctx, q)
  1748. if err != nil {
  1749. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1750. return nil, err
  1751. }
  1752. defer stmt.Close()
  1753. rows, err := stmt.QueryContext(ctx, from)
  1754. if err != nil {
  1755. providerLog(logger.LevelError, "unable to get score for hosts with id %+v: %v", idForScores, err)
  1756. return nil, err
  1757. }
  1758. defer rows.Close()
  1759. for rows.Next() {
  1760. var hostID int64
  1761. var score int
  1762. err = rows.Scan(&hostID, &score)
  1763. if err != nil {
  1764. providerLog(logger.LevelError, "error scanning host score row: %v", err)
  1765. return hosts, err
  1766. }
  1767. if score > 0 {
  1768. hostsWithScores[hostID] = score
  1769. }
  1770. }
  1771. err = rows.Err()
  1772. if err != nil {
  1773. return hosts, err
  1774. }
  1775. result := make([]DefenderEntry, 0, len(hosts))
  1776. for idx := range hosts {
  1777. hosts[idx].Score = hostsWithScores[hosts[idx].ID]
  1778. if hosts[idx].Score > 0 || !hosts[idx].BanTime.IsZero() {
  1779. result = append(result, hosts[idx])
  1780. }
  1781. }
  1782. return result, nil
  1783. }
  1784. func getUsersWithVirtualFolders(ctx context.Context, users []User, dbHandle sqlQuerier) ([]User, error) {
  1785. if len(users) == 0 {
  1786. return users, nil
  1787. }
  1788. var err error
  1789. usersVirtualFolders := make(map[int64][]vfs.VirtualFolder)
  1790. q := getRelatedFoldersForUsersQuery(users)
  1791. stmt, err := dbHandle.PrepareContext(ctx, q)
  1792. if err != nil {
  1793. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1794. return nil, err
  1795. }
  1796. defer stmt.Close()
  1797. rows, err := stmt.QueryContext(ctx)
  1798. if err != nil {
  1799. return nil, err
  1800. }
  1801. defer rows.Close()
  1802. for rows.Next() {
  1803. var folder vfs.VirtualFolder
  1804. var userID int64
  1805. var mappedPath, fsConfig, description sql.NullString
  1806. err = rows.Scan(&folder.ID, &folder.Name, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  1807. &folder.LastQuotaUpdate, &folder.VirtualPath, &folder.QuotaSize, &folder.QuotaFiles, &userID, &fsConfig,
  1808. &description)
  1809. if err != nil {
  1810. return users, err
  1811. }
  1812. if mappedPath.Valid {
  1813. folder.MappedPath = mappedPath.String
  1814. }
  1815. if description.Valid {
  1816. folder.Description = description.String
  1817. }
  1818. if fsConfig.Valid {
  1819. var fs vfs.Filesystem
  1820. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1821. if err == nil {
  1822. folder.FsConfig = fs
  1823. }
  1824. }
  1825. usersVirtualFolders[userID] = append(usersVirtualFolders[userID], folder)
  1826. }
  1827. err = rows.Err()
  1828. if err != nil {
  1829. return users, err
  1830. }
  1831. if len(usersVirtualFolders) == 0 {
  1832. return users, err
  1833. }
  1834. for idx := range users {
  1835. ref := &users[idx]
  1836. ref.VirtualFolders = usersVirtualFolders[ref.ID]
  1837. }
  1838. return users, err
  1839. }
  1840. func getVirtualFoldersWithUsers(folders []vfs.BaseVirtualFolder, dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  1841. if len(folders) == 0 {
  1842. return folders, nil
  1843. }
  1844. var err error
  1845. vFoldersUsers := make(map[int64][]string)
  1846. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1847. defer cancel()
  1848. q := getRelatedUsersForFoldersQuery(folders)
  1849. stmt, err := dbHandle.PrepareContext(ctx, q)
  1850. if err != nil {
  1851. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1852. return nil, err
  1853. }
  1854. defer stmt.Close()
  1855. rows, err := stmt.QueryContext(ctx)
  1856. if err != nil {
  1857. return nil, err
  1858. }
  1859. defer rows.Close()
  1860. for rows.Next() {
  1861. var username string
  1862. var folderID int64
  1863. err = rows.Scan(&folderID, &username)
  1864. if err != nil {
  1865. return folders, err
  1866. }
  1867. vFoldersUsers[folderID] = append(vFoldersUsers[folderID], username)
  1868. }
  1869. err = rows.Err()
  1870. if err != nil {
  1871. return folders, err
  1872. }
  1873. if len(vFoldersUsers) == 0 {
  1874. return folders, err
  1875. }
  1876. for idx := range folders {
  1877. ref := &folders[idx]
  1878. ref.Users = vFoldersUsers[ref.ID]
  1879. }
  1880. return folders, err
  1881. }
  1882. func sqlCommonUpdateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool, dbHandle *sql.DB) error {
  1883. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1884. defer cancel()
  1885. q := getUpdateFolderQuotaQuery(reset)
  1886. stmt, err := dbHandle.PrepareContext(ctx, q)
  1887. if err != nil {
  1888. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1889. return err
  1890. }
  1891. defer stmt.Close()
  1892. _, err = stmt.ExecContext(ctx, sizeAdd, filesAdd, util.GetTimeAsMsSinceEpoch(time.Now()), name)
  1893. if err == nil {
  1894. providerLog(logger.LevelDebug, "quota updated for folder %#v, files increment: %v size increment: %v is reset? %v",
  1895. name, filesAdd, sizeAdd, reset)
  1896. } else {
  1897. providerLog(logger.LevelWarn, "error updating quota for folder %#v: %v", name, err)
  1898. }
  1899. return err
  1900. }
  1901. func sqlCommonGetFolderUsedQuota(mappedPath string, dbHandle *sql.DB) (int, int64, error) {
  1902. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1903. defer cancel()
  1904. q := getQuotaFolderQuery()
  1905. stmt, err := dbHandle.PrepareContext(ctx, q)
  1906. if err != nil {
  1907. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1908. return 0, 0, err
  1909. }
  1910. defer stmt.Close()
  1911. var usedFiles int
  1912. var usedSize int64
  1913. err = stmt.QueryRowContext(ctx, mappedPath).Scan(&usedSize, &usedFiles)
  1914. if err != nil {
  1915. providerLog(logger.LevelError, "error getting quota for folder: %v, error: %v", mappedPath, err)
  1916. return 0, 0, err
  1917. }
  1918. return usedFiles, usedSize, err
  1919. }
  1920. func getAPIKeyWithRelatedFields(ctx context.Context, apiKey APIKey, dbHandle sqlQuerier) (APIKey, error) {
  1921. var apiKeys []APIKey
  1922. var err error
  1923. scope := APIKeyScopeAdmin
  1924. if apiKey.userID > 0 {
  1925. scope = APIKeyScopeUser
  1926. }
  1927. apiKeys, err = getRelatedValuesForAPIKeys(ctx, []APIKey{apiKey}, dbHandle, scope)
  1928. if err != nil {
  1929. return apiKey, err
  1930. }
  1931. if len(apiKeys) > 0 {
  1932. apiKey = apiKeys[0]
  1933. }
  1934. return apiKey, nil
  1935. }
  1936. func getRelatedValuesForAPIKeys(ctx context.Context, apiKeys []APIKey, dbHandle sqlQuerier, scope APIKeyScope) ([]APIKey, error) {
  1937. if len(apiKeys) == 0 {
  1938. return apiKeys, nil
  1939. }
  1940. values := make(map[int64]string)
  1941. var q string
  1942. if scope == APIKeyScopeUser {
  1943. q = getRelatedUsersForAPIKeysQuery(apiKeys)
  1944. } else {
  1945. q = getRelatedAdminsForAPIKeysQuery(apiKeys)
  1946. }
  1947. stmt, err := dbHandle.PrepareContext(ctx, q)
  1948. if err != nil {
  1949. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1950. return nil, err
  1951. }
  1952. defer stmt.Close()
  1953. rows, err := stmt.QueryContext(ctx)
  1954. if err != nil {
  1955. return nil, err
  1956. }
  1957. defer rows.Close()
  1958. for rows.Next() {
  1959. var valueID int64
  1960. var valueName string
  1961. err = rows.Scan(&valueID, &valueName)
  1962. if err != nil {
  1963. return apiKeys, err
  1964. }
  1965. values[valueID] = valueName
  1966. }
  1967. err = rows.Err()
  1968. if err != nil {
  1969. return apiKeys, err
  1970. }
  1971. if len(values) == 0 {
  1972. return apiKeys, nil
  1973. }
  1974. for idx := range apiKeys {
  1975. ref := &apiKeys[idx]
  1976. if scope == APIKeyScopeUser {
  1977. ref.User = values[ref.userID]
  1978. } else {
  1979. ref.Admin = values[ref.adminID]
  1980. }
  1981. }
  1982. return apiKeys, nil
  1983. }
  1984. func sqlCommonGetAPIKeyRelatedIDs(apiKey *APIKey) (sql.NullInt64, sql.NullInt64, error) {
  1985. var userID, adminID sql.NullInt64
  1986. if apiKey.User != "" {
  1987. u, err := provider.userExists(apiKey.User)
  1988. if err != nil {
  1989. return userID, adminID, util.NewValidationError(fmt.Sprintf("unable to validate user %v", apiKey.User))
  1990. }
  1991. userID.Valid = true
  1992. userID.Int64 = u.ID
  1993. }
  1994. if apiKey.Admin != "" {
  1995. a, err := provider.adminExists(apiKey.Admin)
  1996. if err != nil {
  1997. return userID, adminID, util.NewValidationError(fmt.Sprintf("unable to validate admin %v", apiKey.Admin))
  1998. }
  1999. adminID.Valid = true
  2000. adminID.Int64 = a.ID
  2001. }
  2002. return userID, adminID, nil
  2003. }
  2004. func sqlCommonGetDatabaseVersion(dbHandle *sql.DB, showInitWarn bool) (schemaVersion, error) {
  2005. var result schemaVersion
  2006. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2007. defer cancel()
  2008. q := getDatabaseVersionQuery()
  2009. stmt, err := dbHandle.PrepareContext(ctx, q)
  2010. if err != nil {
  2011. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2012. if showInitWarn && strings.Contains(err.Error(), sqlTableSchemaVersion) {
  2013. logger.WarnToConsole("database query error, did you forgot to run the \"initprovider\" command?")
  2014. }
  2015. return result, err
  2016. }
  2017. defer stmt.Close()
  2018. row := stmt.QueryRowContext(ctx)
  2019. err = row.Scan(&result.Version)
  2020. return result, err
  2021. }
  2022. func sqlCommonUpdateDatabaseVersion(ctx context.Context, dbHandle sqlQuerier, version int) error {
  2023. q := getUpdateDBVersionQuery()
  2024. stmt, err := dbHandle.PrepareContext(ctx, q)
  2025. if err != nil {
  2026. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2027. return err
  2028. }
  2029. defer stmt.Close()
  2030. _, err = stmt.ExecContext(ctx, version)
  2031. return err
  2032. }
  2033. func sqlCommonExecSQLAndUpdateDBVersion(dbHandle *sql.DB, sqlQueries []string, newVersion int) error {
  2034. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  2035. defer cancel()
  2036. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  2037. for _, q := range sqlQueries {
  2038. if strings.TrimSpace(q) == "" {
  2039. continue
  2040. }
  2041. _, err := tx.ExecContext(ctx, q)
  2042. if err != nil {
  2043. return err
  2044. }
  2045. }
  2046. if newVersion == 0 {
  2047. return nil
  2048. }
  2049. return sqlCommonUpdateDatabaseVersion(ctx, tx, newVersion)
  2050. })
  2051. }
  2052. func sqlCommonExecuteTx(ctx context.Context, dbHandle *sql.DB, txFn func(*sql.Tx) error) error {
  2053. if config.Driver == CockroachDataProviderName {
  2054. return crdb.ExecuteTx(ctx, dbHandle, nil, txFn)
  2055. }
  2056. tx, err := dbHandle.BeginTx(ctx, nil)
  2057. if err != nil {
  2058. return err
  2059. }
  2060. err = txFn(tx)
  2061. if err != nil {
  2062. // we don't change the returned error
  2063. tx.Rollback() //nolint:errcheck
  2064. return err
  2065. }
  2066. return tx.Commit()
  2067. }