sqlcommon.go 90 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184
  1. // Copyright (C) 2019-2022 Nicola Murino
  2. //
  3. // This program is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU Affero General Public License as published
  5. // by the Free Software Foundation, version 3.
  6. //
  7. // This program is distributed in the hope that it will be useful,
  8. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. // GNU Affero General Public License for more details.
  11. //
  12. // You should have received a copy of the GNU Affero General Public License
  13. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. package dataprovider
  15. import (
  16. "context"
  17. "crypto/x509"
  18. "database/sql"
  19. "encoding/json"
  20. "errors"
  21. "fmt"
  22. "runtime/debug"
  23. "strings"
  24. "time"
  25. "github.com/cockroachdb/cockroach-go/v2/crdb"
  26. "github.com/sftpgo/sdk"
  27. "github.com/drakkan/sftpgo/v2/logger"
  28. "github.com/drakkan/sftpgo/v2/util"
  29. "github.com/drakkan/sftpgo/v2/vfs"
  30. )
  31. const (
  32. sqlDatabaseVersion = 19
  33. defaultSQLQueryTimeout = 10 * time.Second
  34. longSQLQueryTimeout = 60 * time.Second
  35. )
  36. var (
  37. errSQLFoldersAssociation = errors.New("unable to associate virtual folders to user")
  38. errSQLGroupsAssociation = errors.New("unable to associate groups to user")
  39. errSQLUsersAssociation = errors.New("unable to associate users to group")
  40. 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")
  41. )
  42. type sqlQuerier interface {
  43. PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
  44. }
  45. type sqlScanner interface {
  46. Scan(dest ...any) error
  47. }
  48. func sqlReplaceAll(sql string) string {
  49. sql = strings.ReplaceAll(sql, "{{schema_version}}", sqlTableSchemaVersion)
  50. sql = strings.ReplaceAll(sql, "{{admins}}", sqlTableAdmins)
  51. sql = strings.ReplaceAll(sql, "{{folders}}", sqlTableFolders)
  52. sql = strings.ReplaceAll(sql, "{{users}}", sqlTableUsers)
  53. sql = strings.ReplaceAll(sql, "{{groups}}", sqlTableGroups)
  54. sql = strings.ReplaceAll(sql, "{{folders_mapping}}", sqlTableFoldersMapping)
  55. sql = strings.ReplaceAll(sql, "{{users_folders_mapping}}", sqlTableUsersFoldersMapping)
  56. sql = strings.ReplaceAll(sql, "{{users_groups_mapping}}", sqlTableUsersGroupsMapping)
  57. sql = strings.ReplaceAll(sql, "{{groups_folders_mapping}}", sqlTableGroupsFoldersMapping)
  58. sql = strings.ReplaceAll(sql, "{{api_keys}}", sqlTableAPIKeys)
  59. sql = strings.ReplaceAll(sql, "{{shares}}", sqlTableShares)
  60. sql = strings.ReplaceAll(sql, "{{defender_events}}", sqlTableDefenderEvents)
  61. sql = strings.ReplaceAll(sql, "{{defender_hosts}}", sqlTableDefenderHosts)
  62. sql = strings.ReplaceAll(sql, "{{active_transfers}}", sqlTableActiveTransfers)
  63. sql = strings.ReplaceAll(sql, "{{shared_sessions}}", sqlTableSharedSessions)
  64. sql = strings.ReplaceAll(sql, "{{prefix}}", config.SQLTablesPrefix)
  65. return sql
  66. }
  67. func sqlCommonGetShareByID(shareID, username string, dbHandle sqlQuerier) (Share, error) {
  68. var share Share
  69. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  70. defer cancel()
  71. filterUser := username != ""
  72. q := getShareByIDQuery(filterUser)
  73. stmt, err := dbHandle.PrepareContext(ctx, q)
  74. if err != nil {
  75. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  76. return share, err
  77. }
  78. defer stmt.Close()
  79. var row *sql.Row
  80. if filterUser {
  81. row = stmt.QueryRowContext(ctx, shareID, username)
  82. } else {
  83. row = stmt.QueryRowContext(ctx, shareID)
  84. }
  85. return getShareFromDbRow(row)
  86. }
  87. func sqlCommonAddShare(share *Share, dbHandle *sql.DB) error {
  88. err := share.validate()
  89. if err != nil {
  90. return err
  91. }
  92. user, err := provider.userExists(share.Username)
  93. if err != nil {
  94. return util.NewValidationError(fmt.Sprintf("unable to validate user %#v", share.Username))
  95. }
  96. paths, err := json.Marshal(share.Paths)
  97. if err != nil {
  98. return err
  99. }
  100. allowFrom := ""
  101. if len(share.AllowFrom) > 0 {
  102. res, err := json.Marshal(share.AllowFrom)
  103. if err == nil {
  104. allowFrom = string(res)
  105. }
  106. }
  107. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  108. defer cancel()
  109. q := getAddShareQuery()
  110. stmt, err := dbHandle.PrepareContext(ctx, q)
  111. if err != nil {
  112. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  113. return err
  114. }
  115. defer stmt.Close()
  116. usedTokens := 0
  117. createdAt := util.GetTimeAsMsSinceEpoch(time.Now())
  118. updatedAt := createdAt
  119. lastUseAt := int64(0)
  120. if share.IsRestore {
  121. usedTokens = share.UsedTokens
  122. if share.CreatedAt > 0 {
  123. createdAt = share.CreatedAt
  124. }
  125. if share.UpdatedAt > 0 {
  126. updatedAt = share.UpdatedAt
  127. }
  128. lastUseAt = share.LastUseAt
  129. }
  130. _, err = stmt.ExecContext(ctx, share.ShareID, share.Name, share.Description, share.Scope,
  131. string(paths), createdAt, updatedAt, lastUseAt, share.ExpiresAt, share.Password,
  132. share.MaxTokens, usedTokens, allowFrom, user.ID)
  133. return err
  134. }
  135. func sqlCommonUpdateShare(share *Share, dbHandle *sql.DB) error {
  136. err := share.validate()
  137. if err != nil {
  138. return err
  139. }
  140. paths, err := json.Marshal(share.Paths)
  141. if err != nil {
  142. return err
  143. }
  144. allowFrom := ""
  145. if len(share.AllowFrom) > 0 {
  146. res, err := json.Marshal(share.AllowFrom)
  147. if err == nil {
  148. allowFrom = string(res)
  149. }
  150. }
  151. user, err := provider.userExists(share.Username)
  152. if err != nil {
  153. return util.NewValidationError(fmt.Sprintf("unable to validate user %#v", share.Username))
  154. }
  155. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  156. defer cancel()
  157. var q string
  158. if share.IsRestore {
  159. q = getUpdateShareRestoreQuery()
  160. } else {
  161. q = getUpdateShareQuery()
  162. }
  163. stmt, err := dbHandle.PrepareContext(ctx, q)
  164. if err != nil {
  165. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  166. return err
  167. }
  168. defer stmt.Close()
  169. if share.IsRestore {
  170. if share.CreatedAt == 0 {
  171. share.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
  172. }
  173. if share.UpdatedAt == 0 {
  174. share.UpdatedAt = share.CreatedAt
  175. }
  176. _, err = stmt.ExecContext(ctx, share.Name, share.Description, share.Scope, string(paths),
  177. share.CreatedAt, share.UpdatedAt, share.LastUseAt, share.ExpiresAt, share.Password, share.MaxTokens,
  178. share.UsedTokens, allowFrom, user.ID, share.ShareID)
  179. } else {
  180. _, err = stmt.ExecContext(ctx, share.Name, share.Description, share.Scope, string(paths),
  181. util.GetTimeAsMsSinceEpoch(time.Now()), share.ExpiresAt, share.Password, share.MaxTokens,
  182. allowFrom, user.ID, share.ShareID)
  183. }
  184. return err
  185. }
  186. func sqlCommonDeleteShare(share Share, dbHandle *sql.DB) error {
  187. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  188. defer cancel()
  189. q := getDeleteShareQuery()
  190. stmt, err := dbHandle.PrepareContext(ctx, q)
  191. if err != nil {
  192. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  193. return err
  194. }
  195. defer stmt.Close()
  196. res, err := stmt.ExecContext(ctx, share.ShareID)
  197. if err != nil {
  198. return err
  199. }
  200. return sqlCommonRequireRowAffected(res)
  201. }
  202. func sqlCommonGetShares(limit, offset int, order, username string, dbHandle sqlQuerier) ([]Share, error) {
  203. shares := make([]Share, 0, limit)
  204. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  205. defer cancel()
  206. q := getSharesQuery(order)
  207. stmt, err := dbHandle.PrepareContext(ctx, q)
  208. if err != nil {
  209. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  210. return nil, err
  211. }
  212. defer stmt.Close()
  213. rows, err := stmt.QueryContext(ctx, username, limit, offset)
  214. if err != nil {
  215. return shares, err
  216. }
  217. defer rows.Close()
  218. for rows.Next() {
  219. s, err := getShareFromDbRow(rows)
  220. if err != nil {
  221. return shares, err
  222. }
  223. s.HideConfidentialData()
  224. shares = append(shares, s)
  225. }
  226. return shares, rows.Err()
  227. }
  228. func sqlCommonDumpShares(dbHandle sqlQuerier) ([]Share, error) {
  229. shares := make([]Share, 0, 30)
  230. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  231. defer cancel()
  232. q := getDumpSharesQuery()
  233. stmt, err := dbHandle.PrepareContext(ctx, q)
  234. if err != nil {
  235. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  236. return nil, err
  237. }
  238. defer stmt.Close()
  239. rows, err := stmt.QueryContext(ctx)
  240. if err != nil {
  241. return shares, err
  242. }
  243. defer rows.Close()
  244. for rows.Next() {
  245. s, err := getShareFromDbRow(rows)
  246. if err != nil {
  247. return shares, err
  248. }
  249. shares = append(shares, s)
  250. }
  251. return shares, rows.Err()
  252. }
  253. func sqlCommonGetAPIKeyByID(keyID string, dbHandle sqlQuerier) (APIKey, error) {
  254. var apiKey APIKey
  255. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  256. defer cancel()
  257. q := getAPIKeyByIDQuery()
  258. stmt, err := dbHandle.PrepareContext(ctx, q)
  259. if err != nil {
  260. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  261. return apiKey, err
  262. }
  263. defer stmt.Close()
  264. row := stmt.QueryRowContext(ctx, keyID)
  265. apiKey, err = getAPIKeyFromDbRow(row)
  266. if err != nil {
  267. return apiKey, err
  268. }
  269. return getAPIKeyWithRelatedFields(ctx, apiKey, dbHandle)
  270. }
  271. func sqlCommonAddAPIKey(apiKey *APIKey, dbHandle *sql.DB) error {
  272. err := apiKey.validate()
  273. if err != nil {
  274. return err
  275. }
  276. userID, adminID, err := sqlCommonGetAPIKeyRelatedIDs(apiKey)
  277. if err != nil {
  278. return err
  279. }
  280. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  281. defer cancel()
  282. q := getAddAPIKeyQuery()
  283. stmt, err := dbHandle.PrepareContext(ctx, q)
  284. if err != nil {
  285. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  286. return err
  287. }
  288. defer stmt.Close()
  289. _, err = stmt.ExecContext(ctx, apiKey.KeyID, apiKey.Name, apiKey.Key, apiKey.Scope, util.GetTimeAsMsSinceEpoch(time.Now()),
  290. util.GetTimeAsMsSinceEpoch(time.Now()), apiKey.LastUseAt, apiKey.ExpiresAt, apiKey.Description,
  291. userID, adminID)
  292. return err
  293. }
  294. func sqlCommonUpdateAPIKey(apiKey *APIKey, dbHandle *sql.DB) error {
  295. err := apiKey.validate()
  296. if err != nil {
  297. return err
  298. }
  299. userID, adminID, err := sqlCommonGetAPIKeyRelatedIDs(apiKey)
  300. if err != nil {
  301. return err
  302. }
  303. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  304. defer cancel()
  305. q := getUpdateAPIKeyQuery()
  306. stmt, err := dbHandle.PrepareContext(ctx, q)
  307. if err != nil {
  308. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  309. return err
  310. }
  311. defer stmt.Close()
  312. _, err = stmt.ExecContext(ctx, apiKey.Name, apiKey.Scope, apiKey.ExpiresAt, userID, adminID,
  313. apiKey.Description, util.GetTimeAsMsSinceEpoch(time.Now()), apiKey.KeyID)
  314. return err
  315. }
  316. func sqlCommonDeleteAPIKey(apiKey APIKey, dbHandle *sql.DB) error {
  317. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  318. defer cancel()
  319. q := getDeleteAPIKeyQuery()
  320. stmt, err := dbHandle.PrepareContext(ctx, q)
  321. if err != nil {
  322. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  323. return err
  324. }
  325. defer stmt.Close()
  326. res, err := stmt.ExecContext(ctx, apiKey.KeyID)
  327. if err != nil {
  328. return err
  329. }
  330. return sqlCommonRequireRowAffected(res)
  331. }
  332. func sqlCommonGetAPIKeys(limit, offset int, order string, dbHandle sqlQuerier) ([]APIKey, error) {
  333. apiKeys := make([]APIKey, 0, limit)
  334. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  335. defer cancel()
  336. q := getAPIKeysQuery(order)
  337. stmt, err := dbHandle.PrepareContext(ctx, q)
  338. if err != nil {
  339. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  340. return nil, err
  341. }
  342. defer stmt.Close()
  343. rows, err := stmt.QueryContext(ctx, limit, offset)
  344. if err != nil {
  345. return apiKeys, err
  346. }
  347. defer rows.Close()
  348. for rows.Next() {
  349. k, err := getAPIKeyFromDbRow(rows)
  350. if err != nil {
  351. return apiKeys, err
  352. }
  353. k.HideConfidentialData()
  354. apiKeys = append(apiKeys, k)
  355. }
  356. err = rows.Err()
  357. if err != nil {
  358. return apiKeys, err
  359. }
  360. apiKeys, err = getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeAdmin)
  361. if err != nil {
  362. return apiKeys, err
  363. }
  364. return getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeUser)
  365. }
  366. func sqlCommonDumpAPIKeys(dbHandle sqlQuerier) ([]APIKey, error) {
  367. apiKeys := make([]APIKey, 0, 30)
  368. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  369. defer cancel()
  370. q := getDumpAPIKeysQuery()
  371. stmt, err := dbHandle.PrepareContext(ctx, q)
  372. if err != nil {
  373. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  374. return nil, err
  375. }
  376. defer stmt.Close()
  377. rows, err := stmt.QueryContext(ctx)
  378. if err != nil {
  379. return apiKeys, err
  380. }
  381. defer rows.Close()
  382. for rows.Next() {
  383. k, err := getAPIKeyFromDbRow(rows)
  384. if err != nil {
  385. return apiKeys, err
  386. }
  387. apiKeys = append(apiKeys, k)
  388. }
  389. err = rows.Err()
  390. if err != nil {
  391. return apiKeys, err
  392. }
  393. apiKeys, err = getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeAdmin)
  394. if err != nil {
  395. return apiKeys, err
  396. }
  397. return getRelatedValuesForAPIKeys(ctx, apiKeys, dbHandle, APIKeyScopeUser)
  398. }
  399. func sqlCommonGetAdminByUsername(username string, dbHandle sqlQuerier) (Admin, error) {
  400. var admin Admin
  401. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  402. defer cancel()
  403. q := getAdminByUsernameQuery()
  404. stmt, err := dbHandle.PrepareContext(ctx, q)
  405. if err != nil {
  406. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  407. return admin, err
  408. }
  409. defer stmt.Close()
  410. row := stmt.QueryRowContext(ctx, username)
  411. return getAdminFromDbRow(row)
  412. }
  413. func sqlCommonValidateAdminAndPass(username, password, ip string, dbHandle *sql.DB) (Admin, error) {
  414. admin, err := sqlCommonGetAdminByUsername(username, dbHandle)
  415. if err != nil {
  416. providerLog(logger.LevelWarn, "error authenticating admin %#v: %v", username, err)
  417. return admin, ErrInvalidCredentials
  418. }
  419. err = admin.checkUserAndPass(password, ip)
  420. return admin, err
  421. }
  422. func sqlCommonAddAdmin(admin *Admin, dbHandle *sql.DB) error {
  423. err := admin.validate()
  424. if err != nil {
  425. return err
  426. }
  427. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  428. defer cancel()
  429. q := getAddAdminQuery()
  430. stmt, err := dbHandle.PrepareContext(ctx, q)
  431. if err != nil {
  432. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  433. return err
  434. }
  435. defer stmt.Close()
  436. perms, err := json.Marshal(admin.Permissions)
  437. if err != nil {
  438. return err
  439. }
  440. filters, err := json.Marshal(admin.Filters)
  441. if err != nil {
  442. return err
  443. }
  444. _, err = stmt.ExecContext(ctx, admin.Username, admin.Password, admin.Status, admin.Email, string(perms),
  445. string(filters), admin.AdditionalInfo, admin.Description, util.GetTimeAsMsSinceEpoch(time.Now()),
  446. util.GetTimeAsMsSinceEpoch(time.Now()))
  447. return err
  448. }
  449. func sqlCommonUpdateAdmin(admin *Admin, dbHandle *sql.DB) error {
  450. err := admin.validate()
  451. if err != nil {
  452. return err
  453. }
  454. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  455. defer cancel()
  456. q := getUpdateAdminQuery()
  457. stmt, err := dbHandle.PrepareContext(ctx, q)
  458. if err != nil {
  459. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  460. return err
  461. }
  462. defer stmt.Close()
  463. perms, err := json.Marshal(admin.Permissions)
  464. if err != nil {
  465. return err
  466. }
  467. filters, err := json.Marshal(admin.Filters)
  468. if err != nil {
  469. return err
  470. }
  471. _, err = stmt.ExecContext(ctx, admin.Password, admin.Status, admin.Email, string(perms), string(filters),
  472. admin.AdditionalInfo, admin.Description, util.GetTimeAsMsSinceEpoch(time.Now()), admin.Username)
  473. return err
  474. }
  475. func sqlCommonDeleteAdmin(admin Admin, dbHandle *sql.DB) error {
  476. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  477. defer cancel()
  478. q := getDeleteAdminQuery()
  479. stmt, err := dbHandle.PrepareContext(ctx, q)
  480. if err != nil {
  481. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  482. return err
  483. }
  484. defer stmt.Close()
  485. res, err := stmt.ExecContext(ctx, admin.Username)
  486. if err != nil {
  487. return err
  488. }
  489. return sqlCommonRequireRowAffected(res)
  490. }
  491. func sqlCommonGetAdmins(limit, offset int, order string, dbHandle sqlQuerier) ([]Admin, error) {
  492. admins := make([]Admin, 0, limit)
  493. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  494. defer cancel()
  495. q := getAdminsQuery(order)
  496. stmt, err := dbHandle.PrepareContext(ctx, q)
  497. if err != nil {
  498. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  499. return nil, err
  500. }
  501. defer stmt.Close()
  502. rows, err := stmt.QueryContext(ctx, limit, offset)
  503. if err != nil {
  504. return admins, err
  505. }
  506. defer rows.Close()
  507. for rows.Next() {
  508. a, err := getAdminFromDbRow(rows)
  509. if err != nil {
  510. return admins, err
  511. }
  512. a.HideConfidentialData()
  513. admins = append(admins, a)
  514. }
  515. return admins, rows.Err()
  516. }
  517. func sqlCommonDumpAdmins(dbHandle sqlQuerier) ([]Admin, error) {
  518. admins := make([]Admin, 0, 30)
  519. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  520. defer cancel()
  521. q := getDumpAdminsQuery()
  522. stmt, err := dbHandle.PrepareContext(ctx, q)
  523. if err != nil {
  524. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  525. return nil, err
  526. }
  527. defer stmt.Close()
  528. rows, err := stmt.QueryContext(ctx)
  529. if err != nil {
  530. return admins, err
  531. }
  532. defer rows.Close()
  533. for rows.Next() {
  534. a, err := getAdminFromDbRow(rows)
  535. if err != nil {
  536. return admins, err
  537. }
  538. admins = append(admins, a)
  539. }
  540. return admins, rows.Err()
  541. }
  542. func sqlCommonGetGroupByName(name string, dbHandle sqlQuerier) (Group, error) {
  543. var group Group
  544. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  545. defer cancel()
  546. q := getGroupByNameQuery()
  547. stmt, err := dbHandle.PrepareContext(ctx, q)
  548. if err != nil {
  549. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  550. return group, err
  551. }
  552. defer stmt.Close()
  553. row := stmt.QueryRowContext(ctx, name)
  554. group, err = getGroupFromDbRow(row)
  555. if err != nil {
  556. return group, err
  557. }
  558. group, err = getGroupWithVirtualFolders(ctx, group, dbHandle)
  559. if err != nil {
  560. return group, err
  561. }
  562. return getGroupWithUsers(ctx, group, dbHandle)
  563. }
  564. func sqlCommonDumpGroups(dbHandle sqlQuerier) ([]Group, error) {
  565. groups := make([]Group, 0, 50)
  566. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  567. defer cancel()
  568. q := getDumpGroupsQuery()
  569. stmt, err := dbHandle.PrepareContext(ctx, q)
  570. if err != nil {
  571. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  572. return nil, err
  573. }
  574. defer stmt.Close()
  575. rows, err := stmt.QueryContext(ctx)
  576. if err != nil {
  577. return groups, err
  578. }
  579. defer rows.Close()
  580. for rows.Next() {
  581. group, err := getGroupFromDbRow(rows)
  582. if err != nil {
  583. return groups, err
  584. }
  585. groups = append(groups, group)
  586. }
  587. err = rows.Err()
  588. if err != nil {
  589. return groups, err
  590. }
  591. return getGroupsWithVirtualFolders(ctx, groups, dbHandle)
  592. }
  593. func sqlCommonGetUsersInGroups(names []string, dbHandle sqlQuerier) ([]string, error) {
  594. if len(names) == 0 {
  595. return nil, nil
  596. }
  597. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  598. defer cancel()
  599. q := getUsersInGroupsQuery(len(names))
  600. stmt, err := dbHandle.PrepareContext(ctx, q)
  601. if err != nil {
  602. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  603. return nil, err
  604. }
  605. defer stmt.Close()
  606. args := make([]any, 0, len(names))
  607. for _, name := range names {
  608. args = append(args, name)
  609. }
  610. usernames := make([]string, 0, len(names))
  611. rows, err := stmt.QueryContext(ctx, args...)
  612. if err != nil {
  613. return nil, err
  614. }
  615. defer rows.Close()
  616. for rows.Next() {
  617. var username string
  618. err = rows.Scan(&username)
  619. if err != nil {
  620. return usernames, err
  621. }
  622. usernames = append(usernames, username)
  623. }
  624. return usernames, rows.Err()
  625. }
  626. func sqlCommonGetGroupsWithNames(names []string, dbHandle sqlQuerier) ([]Group, error) {
  627. if len(names) == 0 {
  628. return nil, nil
  629. }
  630. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  631. defer cancel()
  632. q := getGroupsWithNamesQuery(len(names))
  633. stmt, err := dbHandle.PrepareContext(ctx, q)
  634. if err != nil {
  635. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  636. return nil, err
  637. }
  638. defer stmt.Close()
  639. args := make([]any, 0, len(names))
  640. for _, name := range names {
  641. args = append(args, name)
  642. }
  643. groups := make([]Group, 0, len(names))
  644. rows, err := stmt.QueryContext(ctx, args...)
  645. if err != nil {
  646. return groups, err
  647. }
  648. defer rows.Close()
  649. for rows.Next() {
  650. group, err := getGroupFromDbRow(rows)
  651. if err != nil {
  652. return groups, err
  653. }
  654. groups = append(groups, group)
  655. }
  656. err = rows.Err()
  657. if err != nil {
  658. return groups, err
  659. }
  660. return getGroupsWithVirtualFolders(ctx, groups, dbHandle)
  661. }
  662. func sqlCommonGetGroups(limit int, offset int, order string, minimal bool, dbHandle sqlQuerier) ([]Group, error) {
  663. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  664. defer cancel()
  665. q := getGroupsQuery(order, minimal)
  666. stmt, err := dbHandle.PrepareContext(ctx, q)
  667. if err != nil {
  668. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  669. return nil, err
  670. }
  671. defer stmt.Close()
  672. groups := make([]Group, 0, limit)
  673. rows, err := stmt.QueryContext(ctx, limit, offset)
  674. if err == nil {
  675. defer rows.Close()
  676. for rows.Next() {
  677. var group Group
  678. if minimal {
  679. err = rows.Scan(&group.ID, &group.Name)
  680. } else {
  681. group, err = getGroupFromDbRow(rows)
  682. }
  683. if err != nil {
  684. return groups, err
  685. }
  686. groups = append(groups, group)
  687. }
  688. }
  689. err = rows.Err()
  690. if err != nil {
  691. return groups, err
  692. }
  693. if minimal {
  694. return groups, nil
  695. }
  696. groups, err = getGroupsWithVirtualFolders(ctx, groups, dbHandle)
  697. if err != nil {
  698. return groups, err
  699. }
  700. groups, err = getGroupsWithUsers(ctx, groups, dbHandle)
  701. if err != nil {
  702. return groups, err
  703. }
  704. for idx := range groups {
  705. groups[idx].PrepareForRendering()
  706. }
  707. return groups, nil
  708. }
  709. func sqlCommonAddGroup(group *Group, dbHandle *sql.DB) error {
  710. if err := group.validate(); err != nil {
  711. return err
  712. }
  713. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  714. defer cancel()
  715. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  716. q := getAddGroupQuery()
  717. stmt, err := tx.PrepareContext(ctx, q)
  718. if err != nil {
  719. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  720. return err
  721. }
  722. defer stmt.Close()
  723. settings, err := json.Marshal(group.UserSettings)
  724. if err != nil {
  725. return err
  726. }
  727. _, err = stmt.ExecContext(ctx, group.Name, group.Description, util.GetTimeAsMsSinceEpoch(time.Now()),
  728. util.GetTimeAsMsSinceEpoch(time.Now()), string(settings))
  729. if err != nil {
  730. return err
  731. }
  732. return generateGroupVirtualFoldersMapping(ctx, group, tx)
  733. })
  734. }
  735. func sqlCommonUpdateGroup(group *Group, dbHandle *sql.DB) error {
  736. if err := group.validate(); err != nil {
  737. return err
  738. }
  739. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  740. defer cancel()
  741. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  742. q := getUpdateGroupQuery()
  743. stmt, err := tx.PrepareContext(ctx, q)
  744. if err != nil {
  745. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  746. return err
  747. }
  748. defer stmt.Close()
  749. settings, err := json.Marshal(group.UserSettings)
  750. if err != nil {
  751. return err
  752. }
  753. _, err = stmt.ExecContext(ctx, group.Description, settings, util.GetTimeAsMsSinceEpoch(time.Now()), group.Name)
  754. if err != nil {
  755. return err
  756. }
  757. return generateGroupVirtualFoldersMapping(ctx, group, tx)
  758. })
  759. }
  760. func sqlCommonDeleteGroup(group Group, dbHandle *sql.DB) error {
  761. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  762. defer cancel()
  763. q := getDeleteGroupQuery()
  764. stmt, err := dbHandle.PrepareContext(ctx, q)
  765. if err != nil {
  766. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  767. return err
  768. }
  769. defer stmt.Close()
  770. res, err := stmt.ExecContext(ctx, group.Name)
  771. if err != nil {
  772. return err
  773. }
  774. return sqlCommonRequireRowAffected(res)
  775. }
  776. func sqlCommonGetUserByUsername(username string, dbHandle sqlQuerier) (User, error) {
  777. var user User
  778. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  779. defer cancel()
  780. q := getUserByUsernameQuery()
  781. stmt, err := dbHandle.PrepareContext(ctx, q)
  782. if err != nil {
  783. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  784. return user, err
  785. }
  786. defer stmt.Close()
  787. row := stmt.QueryRowContext(ctx, username)
  788. user, err = getUserFromDbRow(row)
  789. if err != nil {
  790. return user, err
  791. }
  792. user, err = getUserWithVirtualFolders(ctx, user, dbHandle)
  793. if err != nil {
  794. return user, err
  795. }
  796. return getUserWithGroups(ctx, user, dbHandle)
  797. }
  798. func sqlCommonValidateUserAndPass(username, password, ip, protocol string, dbHandle *sql.DB) (User, error) {
  799. var user User
  800. if password == "" {
  801. return user, errors.New("credentials cannot be null or empty")
  802. }
  803. user, err := sqlCommonGetUserByUsername(username, dbHandle)
  804. if err != nil {
  805. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  806. return user, err
  807. }
  808. return checkUserAndPass(&user, password, ip, protocol)
  809. }
  810. func sqlCommonValidateUserAndTLSCertificate(username, protocol string, tlsCert *x509.Certificate, dbHandle *sql.DB) (User, error) {
  811. var user User
  812. if tlsCert == nil {
  813. return user, errors.New("TLS certificate cannot be null or empty")
  814. }
  815. user, err := sqlCommonGetUserByUsername(username, dbHandle)
  816. if err != nil {
  817. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  818. return user, err
  819. }
  820. return checkUserAndTLSCertificate(&user, protocol, tlsCert)
  821. }
  822. func sqlCommonValidateUserAndPubKey(username string, pubKey []byte, isSSHCert bool, dbHandle *sql.DB) (User, string, error) {
  823. var user User
  824. if len(pubKey) == 0 {
  825. return user, "", errors.New("credentials cannot be null or empty")
  826. }
  827. user, err := sqlCommonGetUserByUsername(username, dbHandle)
  828. if err != nil {
  829. providerLog(logger.LevelWarn, "error authenticating user %#v: %v", username, err)
  830. return user, "", err
  831. }
  832. return checkUserAndPubKey(&user, pubKey, isSSHCert)
  833. }
  834. func sqlCommonCheckAvailability(dbHandle *sql.DB) (err error) {
  835. defer func() {
  836. if r := recover(); r != nil {
  837. providerLog(logger.LevelError, "panic in check provider availability, stack trace: %v", string(debug.Stack()))
  838. err = errors.New("unable to check provider status")
  839. }
  840. }()
  841. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  842. defer cancel()
  843. err = dbHandle.PingContext(ctx)
  844. return
  845. }
  846. func sqlCommonUpdateTransferQuota(username string, uploadSize, downloadSize int64, reset bool, dbHandle *sql.DB) error {
  847. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  848. defer cancel()
  849. q := getUpdateTransferQuotaQuery(reset)
  850. stmt, err := dbHandle.PrepareContext(ctx, q)
  851. if err != nil {
  852. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  853. return err
  854. }
  855. defer stmt.Close()
  856. _, err = stmt.ExecContext(ctx, uploadSize, downloadSize, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  857. if err == nil {
  858. providerLog(logger.LevelDebug, "transfer quota updated for user %#v, ul increment: %v dl increment: %v is reset? %v",
  859. username, uploadSize, downloadSize, reset)
  860. } else {
  861. providerLog(logger.LevelError, "error updating quota for user %#v: %v", username, err)
  862. }
  863. return err
  864. }
  865. func sqlCommonUpdateQuota(username string, filesAdd int, sizeAdd int64, reset bool, dbHandle *sql.DB) error {
  866. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  867. defer cancel()
  868. q := getUpdateQuotaQuery(reset)
  869. stmt, err := dbHandle.PrepareContext(ctx, q)
  870. if err != nil {
  871. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  872. return err
  873. }
  874. defer stmt.Close()
  875. _, err = stmt.ExecContext(ctx, sizeAdd, filesAdd, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  876. if err == nil {
  877. providerLog(logger.LevelDebug, "quota updated for user %#v, files increment: %v size increment: %v is reset? %v",
  878. username, filesAdd, sizeAdd, reset)
  879. } else {
  880. providerLog(logger.LevelError, "error updating quota for user %#v: %v", username, err)
  881. }
  882. return err
  883. }
  884. func sqlCommonGetUsedQuota(username string, dbHandle *sql.DB) (int, int64, int64, int64, error) {
  885. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  886. defer cancel()
  887. q := getQuotaQuery()
  888. stmt, err := dbHandle.PrepareContext(ctx, q)
  889. if err != nil {
  890. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  891. return 0, 0, 0, 0, err
  892. }
  893. defer stmt.Close()
  894. var usedFiles int
  895. var usedSize, usedUploadSize, usedDownloadSize int64
  896. err = stmt.QueryRowContext(ctx, username).Scan(&usedSize, &usedFiles, &usedUploadSize, &usedDownloadSize)
  897. if err != nil {
  898. providerLog(logger.LevelError, "error getting quota for user: %v, error: %v", username, err)
  899. return 0, 0, 0, 0, err
  900. }
  901. return usedFiles, usedSize, usedUploadSize, usedDownloadSize, err
  902. }
  903. func sqlCommonUpdateShareLastUse(shareID string, numTokens int, dbHandle *sql.DB) error {
  904. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  905. defer cancel()
  906. q := getUpdateShareLastUseQuery()
  907. stmt, err := dbHandle.PrepareContext(ctx, q)
  908. if err != nil {
  909. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  910. return err
  911. }
  912. defer stmt.Close()
  913. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), numTokens, shareID)
  914. if err == nil {
  915. providerLog(logger.LevelDebug, "last use updated for shared object %#v", shareID)
  916. } else {
  917. providerLog(logger.LevelWarn, "error updating last use for shared object %#v: %v", shareID, err)
  918. }
  919. return err
  920. }
  921. func sqlCommonUpdateAPIKeyLastUse(keyID string, dbHandle *sql.DB) error {
  922. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  923. defer cancel()
  924. q := getUpdateAPIKeyLastUseQuery()
  925. stmt, err := dbHandle.PrepareContext(ctx, q)
  926. if err != nil {
  927. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  928. return err
  929. }
  930. defer stmt.Close()
  931. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), keyID)
  932. if err == nil {
  933. providerLog(logger.LevelDebug, "last use updated for key %#v", keyID)
  934. } else {
  935. providerLog(logger.LevelWarn, "error updating last use for key %#v: %v", keyID, err)
  936. }
  937. return err
  938. }
  939. func sqlCommonUpdateAdminLastLogin(username string, dbHandle *sql.DB) error {
  940. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  941. defer cancel()
  942. q := getUpdateAdminLastLoginQuery()
  943. stmt, err := dbHandle.PrepareContext(ctx, q)
  944. if err != nil {
  945. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  946. return err
  947. }
  948. defer stmt.Close()
  949. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  950. if err == nil {
  951. providerLog(logger.LevelDebug, "last login updated for admin %#v", username)
  952. } else {
  953. providerLog(logger.LevelWarn, "error updating last login for admin %#v: %v", username, err)
  954. }
  955. return err
  956. }
  957. func sqlCommonSetUpdatedAt(username string, dbHandle *sql.DB) {
  958. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  959. defer cancel()
  960. q := getSetUpdateAtQuery()
  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
  965. }
  966. defer stmt.Close()
  967. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  968. if err == nil {
  969. providerLog(logger.LevelDebug, "updated_at set for user %#v", username)
  970. } else {
  971. providerLog(logger.LevelWarn, "error setting updated_at for user %#v: %v", username, err)
  972. }
  973. }
  974. func sqlCommonUpdateLastLogin(username string, dbHandle *sql.DB) error {
  975. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  976. defer cancel()
  977. q := getUpdateLastLoginQuery()
  978. stmt, err := dbHandle.PrepareContext(ctx, q)
  979. if err != nil {
  980. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  981. return err
  982. }
  983. defer stmt.Close()
  984. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), username)
  985. if err == nil {
  986. providerLog(logger.LevelDebug, "last login updated for user %#v", username)
  987. } else {
  988. providerLog(logger.LevelWarn, "error updating last login for user %#v: %v", username, err)
  989. }
  990. return err
  991. }
  992. func sqlCommonAddUser(user *User, dbHandle *sql.DB) error {
  993. err := ValidateUser(user)
  994. if err != nil {
  995. return err
  996. }
  997. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  998. defer cancel()
  999. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  1000. q := getAddUserQuery()
  1001. stmt, err := tx.PrepareContext(ctx, q)
  1002. if err != nil {
  1003. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1004. return err
  1005. }
  1006. defer stmt.Close()
  1007. permissions, err := user.GetPermissionsAsJSON()
  1008. if err != nil {
  1009. return err
  1010. }
  1011. publicKeys, err := user.GetPublicKeysAsJSON()
  1012. if err != nil {
  1013. return err
  1014. }
  1015. filters, err := user.GetFiltersAsJSON()
  1016. if err != nil {
  1017. return err
  1018. }
  1019. fsConfig, err := user.GetFsConfigAsJSON()
  1020. if err != nil {
  1021. return err
  1022. }
  1023. _, err = stmt.ExecContext(ctx, user.Username, user.Password, string(publicKeys), user.HomeDir, user.UID, user.GID,
  1024. user.MaxSessions, user.QuotaSize, user.QuotaFiles, string(permissions), user.UploadBandwidth,
  1025. user.DownloadBandwidth, user.Status, user.ExpirationDate, string(filters), string(fsConfig), user.AdditionalInfo,
  1026. user.Description, user.Email, util.GetTimeAsMsSinceEpoch(time.Now()), util.GetTimeAsMsSinceEpoch(time.Now()),
  1027. user.UploadDataTransfer, user.DownloadDataTransfer, user.TotalDataTransfer)
  1028. if err != nil {
  1029. return err
  1030. }
  1031. if err := generateUserVirtualFoldersMapping(ctx, user, tx); err != nil {
  1032. return err
  1033. }
  1034. return generateUserGroupMapping(ctx, user, tx)
  1035. })
  1036. }
  1037. func sqlCommonUpdateUserPassword(username, password string, dbHandle *sql.DB) error {
  1038. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1039. defer cancel()
  1040. q := getUpdateUserPasswordQuery()
  1041. stmt, err := dbHandle.PrepareContext(ctx, q)
  1042. if err != nil {
  1043. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1044. return err
  1045. }
  1046. defer stmt.Close()
  1047. _, err = stmt.ExecContext(ctx, password, username)
  1048. return err
  1049. }
  1050. func sqlCommonUpdateUser(user *User, dbHandle *sql.DB) error {
  1051. err := ValidateUser(user)
  1052. if err != nil {
  1053. return err
  1054. }
  1055. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1056. defer cancel()
  1057. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  1058. q := getUpdateUserQuery()
  1059. stmt, err := tx.PrepareContext(ctx, q)
  1060. if err != nil {
  1061. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1062. return err
  1063. }
  1064. defer stmt.Close()
  1065. permissions, err := user.GetPermissionsAsJSON()
  1066. if err != nil {
  1067. return err
  1068. }
  1069. publicKeys, err := user.GetPublicKeysAsJSON()
  1070. if err != nil {
  1071. return err
  1072. }
  1073. filters, err := user.GetFiltersAsJSON()
  1074. if err != nil {
  1075. return err
  1076. }
  1077. fsConfig, err := user.GetFsConfigAsJSON()
  1078. if err != nil {
  1079. return err
  1080. }
  1081. _, err = stmt.ExecContext(ctx, user.Password, string(publicKeys), user.HomeDir, user.UID, user.GID, user.MaxSessions,
  1082. user.QuotaSize, user.QuotaFiles, string(permissions), user.UploadBandwidth, user.DownloadBandwidth, user.Status,
  1083. user.ExpirationDate, string(filters), string(fsConfig), user.AdditionalInfo, user.Description, user.Email,
  1084. util.GetTimeAsMsSinceEpoch(time.Now()), user.UploadDataTransfer, user.DownloadDataTransfer, user.TotalDataTransfer,
  1085. user.ID)
  1086. if err != nil {
  1087. return err
  1088. }
  1089. if err := generateUserVirtualFoldersMapping(ctx, user, tx); err != nil {
  1090. return err
  1091. }
  1092. return generateUserGroupMapping(ctx, user, tx)
  1093. })
  1094. }
  1095. func sqlCommonDeleteUser(user User, dbHandle *sql.DB) error {
  1096. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1097. defer cancel()
  1098. q := getDeleteUserQuery()
  1099. stmt, err := dbHandle.PrepareContext(ctx, q)
  1100. if err != nil {
  1101. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1102. return err
  1103. }
  1104. defer stmt.Close()
  1105. res, err := stmt.ExecContext(ctx, user.ID)
  1106. if err != nil {
  1107. return err
  1108. }
  1109. return sqlCommonRequireRowAffected(res)
  1110. }
  1111. func sqlCommonDumpUsers(dbHandle sqlQuerier) ([]User, error) {
  1112. users := make([]User, 0, 100)
  1113. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  1114. defer cancel()
  1115. q := getDumpUsersQuery()
  1116. stmt, err := dbHandle.PrepareContext(ctx, q)
  1117. if err != nil {
  1118. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1119. return nil, err
  1120. }
  1121. defer stmt.Close()
  1122. rows, err := stmt.QueryContext(ctx)
  1123. if err != nil {
  1124. return users, err
  1125. }
  1126. defer rows.Close()
  1127. for rows.Next() {
  1128. u, err := getUserFromDbRow(rows)
  1129. if err != nil {
  1130. return users, err
  1131. }
  1132. users = append(users, u)
  1133. }
  1134. err = rows.Err()
  1135. if err != nil {
  1136. return users, err
  1137. }
  1138. users, err = getUsersWithVirtualFolders(ctx, users, dbHandle)
  1139. if err != nil {
  1140. return users, err
  1141. }
  1142. return getUsersWithGroups(ctx, users, dbHandle)
  1143. }
  1144. func sqlCommonGetRecentlyUpdatedUsers(after int64, dbHandle sqlQuerier) ([]User, error) {
  1145. users := make([]User, 0, 10)
  1146. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1147. defer cancel()
  1148. q := getRecentlyUpdatedUsersQuery()
  1149. stmt, err := dbHandle.PrepareContext(ctx, q)
  1150. if err != nil {
  1151. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1152. return nil, err
  1153. }
  1154. defer stmt.Close()
  1155. rows, err := stmt.QueryContext(ctx, after)
  1156. if err == nil {
  1157. defer rows.Close()
  1158. for rows.Next() {
  1159. u, err := getUserFromDbRow(rows)
  1160. if err != nil {
  1161. return users, err
  1162. }
  1163. users = append(users, u)
  1164. }
  1165. }
  1166. err = rows.Err()
  1167. if err != nil {
  1168. return users, err
  1169. }
  1170. users, err = getUsersWithVirtualFolders(ctx, users, dbHandle)
  1171. if err != nil {
  1172. return users, err
  1173. }
  1174. users, err = getUsersWithGroups(ctx, users, dbHandle)
  1175. if err != nil {
  1176. return users, err
  1177. }
  1178. var groupNames []string
  1179. for _, u := range users {
  1180. for _, g := range u.Groups {
  1181. groupNames = append(groupNames, g.Name)
  1182. }
  1183. }
  1184. groupNames = util.RemoveDuplicates(groupNames, false)
  1185. groups, err := sqlCommonGetGroupsWithNames(groupNames, dbHandle)
  1186. if err != nil {
  1187. return users, err
  1188. }
  1189. if len(groups) == 0 {
  1190. return users, nil
  1191. }
  1192. groupsMapping := make(map[string]Group)
  1193. for idx := range groups {
  1194. groupsMapping[groups[idx].Name] = groups[idx]
  1195. }
  1196. for idx := range users {
  1197. ref := &users[idx]
  1198. ref.applyGroupSettings(groupsMapping)
  1199. }
  1200. return users, nil
  1201. }
  1202. func sqlCommonGetUsersForQuotaCheck(toFetch map[string]bool, dbHandle sqlQuerier) ([]User, error) {
  1203. users := make([]User, 0, 30)
  1204. usernames := make([]string, 0, len(toFetch))
  1205. for k := range toFetch {
  1206. usernames = append(usernames, k)
  1207. }
  1208. maxUsers := 30
  1209. for len(usernames) > 0 {
  1210. if maxUsers > len(usernames) {
  1211. maxUsers = len(usernames)
  1212. }
  1213. usersRange, err := sqlCommonGetUsersRangeForQuotaCheck(usernames[:maxUsers], dbHandle)
  1214. if err != nil {
  1215. return users, err
  1216. }
  1217. users = append(users, usersRange...)
  1218. usernames = usernames[maxUsers:]
  1219. }
  1220. var usersWithFolders []User
  1221. validIdx := 0
  1222. for _, user := range users {
  1223. if toFetch[user.Username] {
  1224. usersWithFolders = append(usersWithFolders, user)
  1225. } else {
  1226. users[validIdx] = user
  1227. validIdx++
  1228. }
  1229. }
  1230. users = users[:validIdx]
  1231. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1232. defer cancel()
  1233. usersWithFolders, err := getUsersWithVirtualFolders(ctx, usersWithFolders, dbHandle)
  1234. if err != nil {
  1235. return users, err
  1236. }
  1237. users = append(users, usersWithFolders...)
  1238. users, err = getUsersWithGroups(ctx, users, dbHandle)
  1239. if err != nil {
  1240. return users, err
  1241. }
  1242. var groupNames []string
  1243. for _, u := range users {
  1244. for _, g := range u.Groups {
  1245. groupNames = append(groupNames, g.Name)
  1246. }
  1247. }
  1248. groupNames = util.RemoveDuplicates(groupNames, false)
  1249. if len(groupNames) == 0 {
  1250. return users, nil
  1251. }
  1252. groups, err := sqlCommonGetGroupsWithNames(groupNames, dbHandle)
  1253. if err != nil {
  1254. return users, err
  1255. }
  1256. groupsMapping := make(map[string]Group)
  1257. for idx := range groups {
  1258. groupsMapping[groups[idx].Name] = groups[idx]
  1259. }
  1260. for idx := range users {
  1261. ref := &users[idx]
  1262. ref.applyGroupSettings(groupsMapping)
  1263. }
  1264. return users, nil
  1265. }
  1266. func sqlCommonGetUsersRangeForQuotaCheck(usernames []string, dbHandle sqlQuerier) ([]User, error) {
  1267. users := make([]User, 0, len(usernames))
  1268. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1269. defer cancel()
  1270. q := getUsersForQuotaCheckQuery(len(usernames))
  1271. stmt, err := dbHandle.PrepareContext(ctx, q)
  1272. if err != nil {
  1273. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1274. return users, err
  1275. }
  1276. defer stmt.Close()
  1277. queryArgs := make([]any, 0, len(usernames))
  1278. for idx := range usernames {
  1279. queryArgs = append(queryArgs, usernames[idx])
  1280. }
  1281. rows, err := stmt.QueryContext(ctx, queryArgs...)
  1282. if err != nil {
  1283. return nil, err
  1284. }
  1285. defer rows.Close()
  1286. for rows.Next() {
  1287. var user User
  1288. var filters sql.NullString
  1289. err = rows.Scan(&user.ID, &user.Username, &user.QuotaSize, &user.UsedQuotaSize, &user.TotalDataTransfer,
  1290. &user.UploadDataTransfer, &user.DownloadDataTransfer, &user.UsedUploadDataTransfer,
  1291. &user.UsedDownloadDataTransfer, &filters)
  1292. if err != nil {
  1293. return users, err
  1294. }
  1295. if filters.Valid {
  1296. var userFilters UserFilters
  1297. err = json.Unmarshal([]byte(filters.String), &userFilters)
  1298. if err == nil {
  1299. user.Filters = userFilters
  1300. }
  1301. }
  1302. users = append(users, user)
  1303. }
  1304. return users, rows.Err()
  1305. }
  1306. func sqlCommonAddActiveTransfer(transfer ActiveTransfer, dbHandle *sql.DB) error {
  1307. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1308. defer cancel()
  1309. q := getAddActiveTransferQuery()
  1310. stmt, err := dbHandle.PrepareContext(ctx, q)
  1311. if err != nil {
  1312. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1313. return err
  1314. }
  1315. defer stmt.Close()
  1316. now := util.GetTimeAsMsSinceEpoch(time.Now())
  1317. _, err = stmt.ExecContext(ctx, transfer.ID, transfer.ConnID, transfer.Type, transfer.Username,
  1318. transfer.FolderName, transfer.IP, transfer.TruncatedSize, transfer.CurrentULSize, transfer.CurrentDLSize,
  1319. now, now)
  1320. return err
  1321. }
  1322. func sqlCommonUpdateActiveTransferSizes(ulSize, dlSize, transferID int64, connectionID string, dbHandle *sql.DB) error {
  1323. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1324. defer cancel()
  1325. q := getUpdateActiveTransferSizesQuery()
  1326. stmt, err := dbHandle.PrepareContext(ctx, q)
  1327. if err != nil {
  1328. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1329. return err
  1330. }
  1331. defer stmt.Close()
  1332. _, err = stmt.ExecContext(ctx, ulSize, dlSize, util.GetTimeAsMsSinceEpoch(time.Now()), connectionID, transferID)
  1333. return err
  1334. }
  1335. func sqlCommonRemoveActiveTransfer(transferID int64, connectionID string, dbHandle *sql.DB) error {
  1336. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1337. defer cancel()
  1338. q := getRemoveActiveTransferQuery()
  1339. stmt, err := dbHandle.PrepareContext(ctx, q)
  1340. if err != nil {
  1341. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1342. return err
  1343. }
  1344. defer stmt.Close()
  1345. _, err = stmt.ExecContext(ctx, connectionID, transferID)
  1346. return err
  1347. }
  1348. func sqlCommonCleanupActiveTransfers(before time.Time, dbHandle *sql.DB) error {
  1349. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1350. defer cancel()
  1351. q := getCleanupActiveTransfersQuery()
  1352. stmt, err := dbHandle.PrepareContext(ctx, q)
  1353. if err != nil {
  1354. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1355. return err
  1356. }
  1357. defer stmt.Close()
  1358. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(before))
  1359. return err
  1360. }
  1361. func sqlCommonGetActiveTransfers(from time.Time, dbHandle sqlQuerier) ([]ActiveTransfer, error) {
  1362. transfers := make([]ActiveTransfer, 0, 30)
  1363. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  1364. defer cancel()
  1365. q := getActiveTransfersQuery()
  1366. stmt, err := dbHandle.PrepareContext(ctx, q)
  1367. if err != nil {
  1368. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1369. return nil, err
  1370. }
  1371. defer stmt.Close()
  1372. rows, err := stmt.QueryContext(ctx, util.GetTimeAsMsSinceEpoch(from))
  1373. if err != nil {
  1374. return nil, err
  1375. }
  1376. defer rows.Close()
  1377. for rows.Next() {
  1378. var transfer ActiveTransfer
  1379. var folderName sql.NullString
  1380. err = rows.Scan(&transfer.ID, &transfer.ConnID, &transfer.Type, &transfer.Username, &folderName, &transfer.IP,
  1381. &transfer.TruncatedSize, &transfer.CurrentULSize, &transfer.CurrentDLSize, &transfer.CreatedAt,
  1382. &transfer.UpdatedAt)
  1383. if err != nil {
  1384. return transfers, err
  1385. }
  1386. if folderName.Valid {
  1387. transfer.FolderName = folderName.String
  1388. }
  1389. transfers = append(transfers, transfer)
  1390. }
  1391. return transfers, rows.Err()
  1392. }
  1393. func sqlCommonGetUsers(limit int, offset int, order string, dbHandle sqlQuerier) ([]User, error) {
  1394. users := make([]User, 0, limit)
  1395. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1396. defer cancel()
  1397. q := getUsersQuery(order)
  1398. stmt, err := dbHandle.PrepareContext(ctx, q)
  1399. if err != nil {
  1400. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1401. return nil, err
  1402. }
  1403. defer stmt.Close()
  1404. rows, err := stmt.QueryContext(ctx, limit, offset)
  1405. if err == nil {
  1406. defer rows.Close()
  1407. for rows.Next() {
  1408. u, err := getUserFromDbRow(rows)
  1409. if err != nil {
  1410. return users, err
  1411. }
  1412. users = append(users, u)
  1413. }
  1414. }
  1415. err = rows.Err()
  1416. if err != nil {
  1417. return users, err
  1418. }
  1419. users, err = getUsersWithVirtualFolders(ctx, users, dbHandle)
  1420. if err != nil {
  1421. return users, err
  1422. }
  1423. users, err = getUsersWithGroups(ctx, users, dbHandle)
  1424. if err != nil {
  1425. return users, err
  1426. }
  1427. for idx := range users {
  1428. users[idx].PrepareForRendering()
  1429. }
  1430. return users, nil
  1431. }
  1432. func sqlCommonGetDefenderHosts(from int64, limit int, dbHandle sqlQuerier) ([]DefenderEntry, error) {
  1433. hosts := make([]DefenderEntry, 0, 100)
  1434. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1435. defer cancel()
  1436. q := getDefenderHostsQuery()
  1437. stmt, err := dbHandle.PrepareContext(ctx, q)
  1438. if err != nil {
  1439. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1440. return nil, err
  1441. }
  1442. defer stmt.Close()
  1443. rows, err := stmt.QueryContext(ctx, from, limit)
  1444. if err != nil {
  1445. providerLog(logger.LevelError, "unable to get defender hosts: %v", err)
  1446. return hosts, err
  1447. }
  1448. defer rows.Close()
  1449. var idForScores []int64
  1450. for rows.Next() {
  1451. var banTime sql.NullInt64
  1452. host := DefenderEntry{}
  1453. err = rows.Scan(&host.ID, &host.IP, &banTime)
  1454. if err != nil {
  1455. providerLog(logger.LevelError, "unable to scan defender host row: %v", err)
  1456. return hosts, err
  1457. }
  1458. var hostBanTime time.Time
  1459. if banTime.Valid && banTime.Int64 > 0 {
  1460. hostBanTime = util.GetTimeFromMsecSinceEpoch(banTime.Int64)
  1461. }
  1462. if hostBanTime.IsZero() || hostBanTime.Before(time.Now()) {
  1463. idForScores = append(idForScores, host.ID)
  1464. } else {
  1465. host.BanTime = hostBanTime
  1466. }
  1467. hosts = append(hosts, host)
  1468. }
  1469. err = rows.Err()
  1470. if err != nil {
  1471. providerLog(logger.LevelError, "unable to iterate over defender host rows: %v", err)
  1472. return hosts, err
  1473. }
  1474. return getDefenderHostsWithScores(ctx, hosts, from, idForScores, dbHandle)
  1475. }
  1476. func sqlCommonIsDefenderHostBanned(ip string, dbHandle sqlQuerier) (DefenderEntry, error) {
  1477. var host DefenderEntry
  1478. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1479. defer cancel()
  1480. q := getDefenderIsHostBannedQuery()
  1481. stmt, err := dbHandle.PrepareContext(ctx, q)
  1482. if err != nil {
  1483. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1484. return host, err
  1485. }
  1486. defer stmt.Close()
  1487. row := stmt.QueryRowContext(ctx, ip, util.GetTimeAsMsSinceEpoch(time.Now()))
  1488. err = row.Scan(&host.ID)
  1489. if err != nil {
  1490. if errors.Is(err, sql.ErrNoRows) {
  1491. return host, util.NewRecordNotFoundError("host not found")
  1492. }
  1493. providerLog(logger.LevelError, "unable to check ban status for host %#v: %v", ip, err)
  1494. return host, err
  1495. }
  1496. return host, nil
  1497. }
  1498. func sqlCommonGetDefenderHostByIP(ip string, from int64, dbHandle sqlQuerier) (DefenderEntry, error) {
  1499. var host DefenderEntry
  1500. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1501. defer cancel()
  1502. q := getDefenderHostQuery()
  1503. stmt, err := dbHandle.PrepareContext(ctx, q)
  1504. if err != nil {
  1505. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1506. return host, err
  1507. }
  1508. defer stmt.Close()
  1509. row := stmt.QueryRowContext(ctx, ip, from)
  1510. var banTime sql.NullInt64
  1511. err = row.Scan(&host.ID, &host.IP, &banTime)
  1512. if err != nil {
  1513. if errors.Is(err, sql.ErrNoRows) {
  1514. return host, util.NewRecordNotFoundError("host not found")
  1515. }
  1516. providerLog(logger.LevelError, "unable to get host for ip %#v: %v", ip, err)
  1517. return host, err
  1518. }
  1519. if banTime.Valid && banTime.Int64 > 0 {
  1520. hostBanTime := util.GetTimeFromMsecSinceEpoch(banTime.Int64)
  1521. if !hostBanTime.IsZero() && hostBanTime.After(time.Now()) {
  1522. host.BanTime = hostBanTime
  1523. return host, nil
  1524. }
  1525. }
  1526. hosts, err := getDefenderHostsWithScores(ctx, []DefenderEntry{host}, from, []int64{host.ID}, dbHandle)
  1527. if err != nil {
  1528. return host, err
  1529. }
  1530. if len(hosts) == 0 {
  1531. return host, util.NewRecordNotFoundError("host not found")
  1532. }
  1533. return hosts[0], nil
  1534. }
  1535. func sqlCommonDefenderIncrementBanTime(ip string, minutesToAdd int, dbHandle *sql.DB) error {
  1536. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1537. defer cancel()
  1538. q := getDefenderIncrementBanTimeQuery()
  1539. stmt, err := dbHandle.PrepareContext(ctx, q)
  1540. if err != nil {
  1541. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1542. return err
  1543. }
  1544. defer stmt.Close()
  1545. _, err = stmt.ExecContext(ctx, minutesToAdd*60000, ip)
  1546. if err == nil {
  1547. providerLog(logger.LevelDebug, "ban time updated for ip %#v, increment (minutes): %v",
  1548. ip, minutesToAdd)
  1549. } else {
  1550. providerLog(logger.LevelError, "error updating ban time for ip %#v: %v", ip, err)
  1551. }
  1552. return err
  1553. }
  1554. func sqlCommonSetDefenderBanTime(ip string, banTime int64, dbHandle *sql.DB) error {
  1555. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1556. defer cancel()
  1557. q := getDefenderSetBanTimeQuery()
  1558. stmt, err := dbHandle.PrepareContext(ctx, q)
  1559. if err != nil {
  1560. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1561. return err
  1562. }
  1563. defer stmt.Close()
  1564. _, err = stmt.ExecContext(ctx, banTime, ip)
  1565. if err == nil {
  1566. providerLog(logger.LevelDebug, "ip %#v banned until %v", ip, util.GetTimeFromMsecSinceEpoch(banTime))
  1567. } else {
  1568. providerLog(logger.LevelError, "error setting ban time for ip %#v: %v", ip, err)
  1569. }
  1570. return err
  1571. }
  1572. func sqlCommonDeleteDefenderHost(ip string, dbHandle sqlQuerier) error {
  1573. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1574. defer cancel()
  1575. q := getDeleteDefenderHostQuery()
  1576. stmt, err := dbHandle.PrepareContext(ctx, q)
  1577. if err != nil {
  1578. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1579. return err
  1580. }
  1581. defer stmt.Close()
  1582. res, err := stmt.ExecContext(ctx, ip)
  1583. if err != nil {
  1584. providerLog(logger.LevelError, "unable to delete defender host %#v: %v", ip, err)
  1585. return err
  1586. }
  1587. return sqlCommonRequireRowAffected(res)
  1588. }
  1589. func sqlCommonAddDefenderHostAndEvent(ip string, score int, dbHandle *sql.DB) error {
  1590. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1591. defer cancel()
  1592. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  1593. if err := sqlCommonAddDefenderHost(ctx, ip, tx); err != nil {
  1594. return err
  1595. }
  1596. return sqlCommonAddDefenderEvent(ctx, ip, score, tx)
  1597. })
  1598. }
  1599. func sqlCommonDefenderCleanup(from int64, dbHandler *sql.DB) error {
  1600. if err := sqlCommonCleanupDefenderEvents(from, dbHandler); err != nil {
  1601. return err
  1602. }
  1603. return sqlCommonCleanupDefenderHosts(from, dbHandler)
  1604. }
  1605. func sqlCommonAddDefenderHost(ctx context.Context, ip string, tx *sql.Tx) error {
  1606. q := getAddDefenderHostQuery()
  1607. stmt, err := tx.PrepareContext(ctx, q)
  1608. if err != nil {
  1609. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1610. return err
  1611. }
  1612. defer stmt.Close()
  1613. _, err = stmt.ExecContext(ctx, ip, util.GetTimeAsMsSinceEpoch(time.Now()))
  1614. if err != nil {
  1615. providerLog(logger.LevelError, "unable to add defender host %#v: %v", ip, err)
  1616. }
  1617. return err
  1618. }
  1619. func sqlCommonAddDefenderEvent(ctx context.Context, ip string, score int, tx *sql.Tx) error {
  1620. q := getAddDefenderEventQuery()
  1621. stmt, err := tx.PrepareContext(ctx, q)
  1622. if err != nil {
  1623. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1624. return err
  1625. }
  1626. defer stmt.Close()
  1627. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), score, ip)
  1628. if err != nil {
  1629. providerLog(logger.LevelError, "unable to add defender event for %#v: %v", ip, err)
  1630. }
  1631. return err
  1632. }
  1633. func sqlCommonCleanupDefenderHosts(from int64, dbHandle *sql.DB) error {
  1634. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1635. defer cancel()
  1636. q := getDefenderHostsCleanupQuery()
  1637. stmt, err := dbHandle.PrepareContext(ctx, q)
  1638. if err != nil {
  1639. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1640. return err
  1641. }
  1642. defer stmt.Close()
  1643. _, err = stmt.ExecContext(ctx, util.GetTimeAsMsSinceEpoch(time.Now()), from)
  1644. if err != nil {
  1645. providerLog(logger.LevelError, "unable to cleanup defender hosts: %v", err)
  1646. }
  1647. return err
  1648. }
  1649. func sqlCommonCleanupDefenderEvents(from int64, dbHandle *sql.DB) error {
  1650. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1651. defer cancel()
  1652. q := getDefenderEventsCleanupQuery()
  1653. stmt, err := dbHandle.PrepareContext(ctx, q)
  1654. if err != nil {
  1655. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1656. return err
  1657. }
  1658. defer stmt.Close()
  1659. _, err = stmt.ExecContext(ctx, from)
  1660. if err != nil {
  1661. providerLog(logger.LevelError, "unable to cleanup defender events: %v", err)
  1662. }
  1663. return err
  1664. }
  1665. func getShareFromDbRow(row sqlScanner) (Share, error) {
  1666. var share Share
  1667. var description, password, allowFrom, paths sql.NullString
  1668. err := row.Scan(&share.ShareID, &share.Name, &description, &share.Scope,
  1669. &paths, &share.Username, &share.CreatedAt, &share.UpdatedAt,
  1670. &share.LastUseAt, &share.ExpiresAt, &password, &share.MaxTokens,
  1671. &share.UsedTokens, &allowFrom)
  1672. if err != nil {
  1673. if errors.Is(err, sql.ErrNoRows) {
  1674. return share, util.NewRecordNotFoundError(err.Error())
  1675. }
  1676. return share, err
  1677. }
  1678. if paths.Valid {
  1679. var list []string
  1680. err = json.Unmarshal([]byte(paths.String), &list)
  1681. if err != nil {
  1682. return share, err
  1683. }
  1684. share.Paths = list
  1685. } else {
  1686. return share, errors.New("unable to decode shared paths")
  1687. }
  1688. if description.Valid {
  1689. share.Description = description.String
  1690. }
  1691. if password.Valid {
  1692. share.Password = password.String
  1693. }
  1694. if allowFrom.Valid {
  1695. var list []string
  1696. err = json.Unmarshal([]byte(allowFrom.String), &list)
  1697. if err == nil {
  1698. share.AllowFrom = list
  1699. }
  1700. }
  1701. return share, nil
  1702. }
  1703. func getAPIKeyFromDbRow(row sqlScanner) (APIKey, error) {
  1704. var apiKey APIKey
  1705. var userID, adminID sql.NullInt64
  1706. var description sql.NullString
  1707. err := row.Scan(&apiKey.KeyID, &apiKey.Name, &apiKey.Key, &apiKey.Scope, &apiKey.CreatedAt, &apiKey.UpdatedAt,
  1708. &apiKey.LastUseAt, &apiKey.ExpiresAt, &description, &userID, &adminID)
  1709. if err != nil {
  1710. if errors.Is(err, sql.ErrNoRows) {
  1711. return apiKey, util.NewRecordNotFoundError(err.Error())
  1712. }
  1713. return apiKey, err
  1714. }
  1715. if userID.Valid {
  1716. apiKey.userID = userID.Int64
  1717. }
  1718. if adminID.Valid {
  1719. apiKey.adminID = adminID.Int64
  1720. }
  1721. if description.Valid {
  1722. apiKey.Description = description.String
  1723. }
  1724. return apiKey, nil
  1725. }
  1726. func getAdminFromDbRow(row sqlScanner) (Admin, error) {
  1727. var admin Admin
  1728. var email, filters, additionalInfo, permissions, description sql.NullString
  1729. err := row.Scan(&admin.ID, &admin.Username, &admin.Password, &admin.Status, &email, &permissions,
  1730. &filters, &additionalInfo, &description, &admin.CreatedAt, &admin.UpdatedAt, &admin.LastLogin)
  1731. if err != nil {
  1732. if errors.Is(err, sql.ErrNoRows) {
  1733. return admin, util.NewRecordNotFoundError(err.Error())
  1734. }
  1735. return admin, err
  1736. }
  1737. if permissions.Valid {
  1738. var perms []string
  1739. err = json.Unmarshal([]byte(permissions.String), &perms)
  1740. if err != nil {
  1741. return admin, err
  1742. }
  1743. admin.Permissions = perms
  1744. }
  1745. if email.Valid {
  1746. admin.Email = email.String
  1747. }
  1748. if filters.Valid {
  1749. var adminFilters AdminFilters
  1750. err = json.Unmarshal([]byte(filters.String), &adminFilters)
  1751. if err == nil {
  1752. admin.Filters = adminFilters
  1753. }
  1754. }
  1755. if additionalInfo.Valid {
  1756. admin.AdditionalInfo = additionalInfo.String
  1757. }
  1758. if description.Valid {
  1759. admin.Description = description.String
  1760. }
  1761. admin.SetEmptySecretsIfNil()
  1762. return admin, nil
  1763. }
  1764. func getGroupFromDbRow(row sqlScanner) (Group, error) {
  1765. var group Group
  1766. var userSettings, description sql.NullString
  1767. err := row.Scan(&group.ID, &group.Name, &description, &group.CreatedAt, &group.UpdatedAt, &userSettings)
  1768. if err != nil {
  1769. if errors.Is(err, sql.ErrNoRows) {
  1770. return group, util.NewRecordNotFoundError(err.Error())
  1771. }
  1772. return group, err
  1773. }
  1774. if description.Valid {
  1775. group.Description = description.String
  1776. }
  1777. if userSettings.Valid {
  1778. var settings GroupUserSettings
  1779. err = json.Unmarshal([]byte(userSettings.String), &settings)
  1780. if err == nil {
  1781. group.UserSettings = settings
  1782. }
  1783. }
  1784. return group, nil
  1785. }
  1786. func getUserFromDbRow(row sqlScanner) (User, error) {
  1787. var user User
  1788. var permissions sql.NullString
  1789. var password sql.NullString
  1790. var publicKey sql.NullString
  1791. var filters sql.NullString
  1792. var fsConfig sql.NullString
  1793. var additionalInfo, description, email sql.NullString
  1794. err := row.Scan(&user.ID, &user.Username, &password, &publicKey, &user.HomeDir, &user.UID, &user.GID, &user.MaxSessions,
  1795. &user.QuotaSize, &user.QuotaFiles, &permissions, &user.UsedQuotaSize, &user.UsedQuotaFiles, &user.LastQuotaUpdate,
  1796. &user.UploadBandwidth, &user.DownloadBandwidth, &user.ExpirationDate, &user.LastLogin, &user.Status, &filters, &fsConfig,
  1797. &additionalInfo, &description, &email, &user.CreatedAt, &user.UpdatedAt, &user.UploadDataTransfer, &user.DownloadDataTransfer,
  1798. &user.TotalDataTransfer, &user.UsedUploadDataTransfer, &user.UsedDownloadDataTransfer)
  1799. if err != nil {
  1800. if errors.Is(err, sql.ErrNoRows) {
  1801. return user, util.NewRecordNotFoundError(err.Error())
  1802. }
  1803. return user, err
  1804. }
  1805. if password.Valid {
  1806. user.Password = password.String
  1807. }
  1808. // we can have a empty string or an invalid json in null string
  1809. // so we do a relaxed test if the field is optional, for example we
  1810. // populate public keys only if unmarshal does not return an error
  1811. if publicKey.Valid {
  1812. var list []string
  1813. err = json.Unmarshal([]byte(publicKey.String), &list)
  1814. if err == nil {
  1815. user.PublicKeys = list
  1816. }
  1817. }
  1818. if permissions.Valid {
  1819. perms := make(map[string][]string)
  1820. err = json.Unmarshal([]byte(permissions.String), &perms)
  1821. if err != nil {
  1822. providerLog(logger.LevelError, "unable to deserialize permissions for user %#v: %v", user.Username, err)
  1823. return user, fmt.Errorf("unable to deserialize permissions for user %#v: %v", user.Username, err)
  1824. }
  1825. user.Permissions = perms
  1826. }
  1827. if filters.Valid {
  1828. var userFilters UserFilters
  1829. err = json.Unmarshal([]byte(filters.String), &userFilters)
  1830. if err == nil {
  1831. user.Filters = userFilters
  1832. }
  1833. }
  1834. if fsConfig.Valid {
  1835. var fs vfs.Filesystem
  1836. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1837. if err == nil {
  1838. user.FsConfig = fs
  1839. }
  1840. }
  1841. if additionalInfo.Valid {
  1842. user.AdditionalInfo = additionalInfo.String
  1843. }
  1844. if description.Valid {
  1845. user.Description = description.String
  1846. }
  1847. if email.Valid {
  1848. user.Email = email.String
  1849. }
  1850. user.SetEmptySecretsIfNil()
  1851. return user, nil
  1852. }
  1853. func sqlCommonGetFolder(ctx context.Context, name string, dbHandle sqlQuerier) (vfs.BaseVirtualFolder, error) {
  1854. var folder vfs.BaseVirtualFolder
  1855. q := getFolderByNameQuery()
  1856. stmt, err := dbHandle.PrepareContext(ctx, q)
  1857. if err != nil {
  1858. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1859. return folder, err
  1860. }
  1861. defer stmt.Close()
  1862. row := stmt.QueryRowContext(ctx, name)
  1863. var mappedPath, description, fsConfig sql.NullString
  1864. err = row.Scan(&folder.ID, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles, &folder.LastQuotaUpdate,
  1865. &folder.Name, &description, &fsConfig)
  1866. if err != nil {
  1867. if errors.Is(err, sql.ErrNoRows) {
  1868. return folder, util.NewRecordNotFoundError(err.Error())
  1869. }
  1870. return folder, err
  1871. }
  1872. if mappedPath.Valid {
  1873. folder.MappedPath = mappedPath.String
  1874. }
  1875. if description.Valid {
  1876. folder.Description = description.String
  1877. }
  1878. if fsConfig.Valid {
  1879. var fs vfs.Filesystem
  1880. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  1881. if err == nil {
  1882. folder.FsConfig = fs
  1883. }
  1884. }
  1885. return folder, err
  1886. }
  1887. func sqlCommonGetFolderByName(ctx context.Context, name string, dbHandle sqlQuerier) (vfs.BaseVirtualFolder, error) {
  1888. folder, err := sqlCommonGetFolder(ctx, name, dbHandle)
  1889. if err != nil {
  1890. return folder, err
  1891. }
  1892. folders, err := getVirtualFoldersWithUsers([]vfs.BaseVirtualFolder{folder}, dbHandle)
  1893. if err != nil {
  1894. return folder, err
  1895. }
  1896. if len(folders) != 1 {
  1897. return folder, fmt.Errorf("unable to associate users with folder %#v", name)
  1898. }
  1899. folders, err = getVirtualFoldersWithGroups([]vfs.BaseVirtualFolder{folders[0]}, dbHandle)
  1900. if err != nil {
  1901. return folder, err
  1902. }
  1903. if len(folders) != 1 {
  1904. return folder, fmt.Errorf("unable to associate groups with folder %#v", name)
  1905. }
  1906. return folders[0], nil
  1907. }
  1908. func sqlCommonAddOrUpdateFolder(ctx context.Context, baseFolder *vfs.BaseVirtualFolder, usedQuotaSize int64,
  1909. usedQuotaFiles int, lastQuotaUpdate int64, dbHandle sqlQuerier,
  1910. ) error {
  1911. fsConfig, err := json.Marshal(baseFolder.FsConfig)
  1912. if err != nil {
  1913. return err
  1914. }
  1915. q := getUpsertFolderQuery()
  1916. stmt, err := dbHandle.PrepareContext(ctx, q)
  1917. if err != nil {
  1918. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1919. return err
  1920. }
  1921. defer stmt.Close()
  1922. _, err = stmt.ExecContext(ctx, baseFolder.MappedPath, usedQuotaSize, usedQuotaFiles,
  1923. lastQuotaUpdate, baseFolder.Name, baseFolder.Description, string(fsConfig))
  1924. return err
  1925. }
  1926. func sqlCommonAddFolder(folder *vfs.BaseVirtualFolder, dbHandle sqlQuerier) error {
  1927. err := ValidateFolder(folder)
  1928. if err != nil {
  1929. return err
  1930. }
  1931. fsConfig, err := json.Marshal(folder.FsConfig)
  1932. if err != nil {
  1933. return err
  1934. }
  1935. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1936. defer cancel()
  1937. q := getAddFolderQuery()
  1938. stmt, err := dbHandle.PrepareContext(ctx, q)
  1939. if err != nil {
  1940. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1941. return err
  1942. }
  1943. defer stmt.Close()
  1944. _, err = stmt.ExecContext(ctx, folder.MappedPath, folder.UsedQuotaSize, folder.UsedQuotaFiles,
  1945. folder.LastQuotaUpdate, folder.Name, folder.Description, string(fsConfig))
  1946. return err
  1947. }
  1948. func sqlCommonUpdateFolder(folder *vfs.BaseVirtualFolder, dbHandle sqlQuerier) error {
  1949. err := ValidateFolder(folder)
  1950. if err != nil {
  1951. return err
  1952. }
  1953. fsConfig, err := json.Marshal(folder.FsConfig)
  1954. if err != nil {
  1955. return err
  1956. }
  1957. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1958. defer cancel()
  1959. q := getUpdateFolderQuery()
  1960. stmt, err := dbHandle.PrepareContext(ctx, q)
  1961. if err != nil {
  1962. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1963. return err
  1964. }
  1965. defer stmt.Close()
  1966. _, err = stmt.ExecContext(ctx, folder.MappedPath, folder.Description, string(fsConfig), folder.Name)
  1967. return err
  1968. }
  1969. func sqlCommonDeleteFolder(folder vfs.BaseVirtualFolder, dbHandle sqlQuerier) error {
  1970. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  1971. defer cancel()
  1972. q := getDeleteFolderQuery()
  1973. stmt, err := dbHandle.PrepareContext(ctx, q)
  1974. if err != nil {
  1975. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1976. return err
  1977. }
  1978. defer stmt.Close()
  1979. res, err := stmt.ExecContext(ctx, folder.ID)
  1980. if err != nil {
  1981. return err
  1982. }
  1983. return sqlCommonRequireRowAffected(res)
  1984. }
  1985. func sqlCommonDumpFolders(dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  1986. folders := make([]vfs.BaseVirtualFolder, 0, 50)
  1987. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  1988. defer cancel()
  1989. q := getDumpFoldersQuery()
  1990. stmt, err := dbHandle.PrepareContext(ctx, q)
  1991. if err != nil {
  1992. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  1993. return nil, err
  1994. }
  1995. defer stmt.Close()
  1996. rows, err := stmt.QueryContext(ctx)
  1997. if err != nil {
  1998. return folders, err
  1999. }
  2000. defer rows.Close()
  2001. for rows.Next() {
  2002. var folder vfs.BaseVirtualFolder
  2003. var mappedPath, description, fsConfig sql.NullString
  2004. err = rows.Scan(&folder.ID, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  2005. &folder.LastQuotaUpdate, &folder.Name, &description, &fsConfig)
  2006. if err != nil {
  2007. return folders, err
  2008. }
  2009. if mappedPath.Valid {
  2010. folder.MappedPath = mappedPath.String
  2011. }
  2012. if description.Valid {
  2013. folder.Description = description.String
  2014. }
  2015. if fsConfig.Valid {
  2016. var fs vfs.Filesystem
  2017. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  2018. if err == nil {
  2019. folder.FsConfig = fs
  2020. }
  2021. }
  2022. folders = append(folders, folder)
  2023. }
  2024. return folders, rows.Err()
  2025. }
  2026. func sqlCommonGetFolders(limit, offset int, order string, minimal bool, dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  2027. folders := make([]vfs.BaseVirtualFolder, 0, limit)
  2028. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2029. defer cancel()
  2030. q := getFoldersQuery(order, minimal)
  2031. stmt, err := dbHandle.PrepareContext(ctx, q)
  2032. if err != nil {
  2033. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2034. return nil, err
  2035. }
  2036. defer stmt.Close()
  2037. rows, err := stmt.QueryContext(ctx, limit, offset)
  2038. if err != nil {
  2039. return folders, err
  2040. }
  2041. defer rows.Close()
  2042. for rows.Next() {
  2043. var folder vfs.BaseVirtualFolder
  2044. if minimal {
  2045. err = rows.Scan(&folder.ID, &folder.Name)
  2046. if err != nil {
  2047. return folders, err
  2048. }
  2049. } else {
  2050. var mappedPath, description, fsConfig sql.NullString
  2051. err = rows.Scan(&folder.ID, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  2052. &folder.LastQuotaUpdate, &folder.Name, &description, &fsConfig)
  2053. if err != nil {
  2054. return folders, err
  2055. }
  2056. if mappedPath.Valid {
  2057. folder.MappedPath = mappedPath.String
  2058. }
  2059. if description.Valid {
  2060. folder.Description = description.String
  2061. }
  2062. if fsConfig.Valid {
  2063. var fs vfs.Filesystem
  2064. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  2065. if err == nil {
  2066. folder.FsConfig = fs
  2067. }
  2068. }
  2069. }
  2070. folder.PrepareForRendering()
  2071. folders = append(folders, folder)
  2072. }
  2073. err = rows.Err()
  2074. if err != nil {
  2075. return folders, err
  2076. }
  2077. if minimal {
  2078. return folders, nil
  2079. }
  2080. folders, err = getVirtualFoldersWithUsers(folders, dbHandle)
  2081. if err != nil {
  2082. return folders, err
  2083. }
  2084. return getVirtualFoldersWithGroups(folders, dbHandle)
  2085. }
  2086. func sqlCommonClearUserFolderMapping(ctx context.Context, user *User, dbHandle sqlQuerier) error {
  2087. q := getClearUserFolderMappingQuery()
  2088. stmt, err := dbHandle.PrepareContext(ctx, q)
  2089. if err != nil {
  2090. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2091. return err
  2092. }
  2093. defer stmt.Close()
  2094. _, err = stmt.ExecContext(ctx, user.Username)
  2095. return err
  2096. }
  2097. func sqlCommonClearGroupFolderMapping(ctx context.Context, group *Group, dbHandle sqlQuerier) error {
  2098. q := getClearGroupFolderMappingQuery()
  2099. stmt, err := dbHandle.PrepareContext(ctx, q)
  2100. if err != nil {
  2101. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2102. return err
  2103. }
  2104. defer stmt.Close()
  2105. _, err = stmt.ExecContext(ctx, group.Name)
  2106. return err
  2107. }
  2108. func sqlCommonClearUserGroupMapping(ctx context.Context, user *User, dbHandle sqlQuerier) error {
  2109. q := getClearUserGroupMappingQuery()
  2110. stmt, err := dbHandle.PrepareContext(ctx, q)
  2111. if err != nil {
  2112. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2113. return err
  2114. }
  2115. defer stmt.Close()
  2116. _, err = stmt.ExecContext(ctx, user.Username)
  2117. return err
  2118. }
  2119. func sqlCommonAddUserFolderMapping(ctx context.Context, user *User, folder *vfs.VirtualFolder, dbHandle sqlQuerier) error {
  2120. q := getAddUserFolderMappingQuery()
  2121. stmt, err := dbHandle.PrepareContext(ctx, q)
  2122. if err != nil {
  2123. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2124. return err
  2125. }
  2126. defer stmt.Close()
  2127. _, err = stmt.ExecContext(ctx, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.Name, user.Username)
  2128. return err
  2129. }
  2130. func sqlCommonAddGroupFolderMapping(ctx context.Context, group *Group, folder *vfs.VirtualFolder, dbHandle sqlQuerier) error {
  2131. q := getAddGroupFolderMappingQuery()
  2132. stmt, err := dbHandle.PrepareContext(ctx, q)
  2133. if err != nil {
  2134. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2135. return err
  2136. }
  2137. defer stmt.Close()
  2138. _, err = stmt.ExecContext(ctx, folder.VirtualPath, folder.QuotaSize, folder.QuotaFiles, folder.Name, group.Name)
  2139. return err
  2140. }
  2141. func sqlCommonAddUserGroupMapping(ctx context.Context, username, groupName string, groupType int, dbHandle sqlQuerier) error {
  2142. q := getAddUserGroupMappingQuery()
  2143. stmt, err := dbHandle.PrepareContext(ctx, q)
  2144. if err != nil {
  2145. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2146. return err
  2147. }
  2148. defer stmt.Close()
  2149. _, err = stmt.ExecContext(ctx, username, groupName, groupType)
  2150. return err
  2151. }
  2152. func generateGroupVirtualFoldersMapping(ctx context.Context, group *Group, dbHandle sqlQuerier) error {
  2153. err := sqlCommonClearGroupFolderMapping(ctx, group, dbHandle)
  2154. if err != nil {
  2155. return err
  2156. }
  2157. for idx := range group.VirtualFolders {
  2158. vfolder := &group.VirtualFolders[idx]
  2159. err = sqlCommonAddOrUpdateFolder(ctx, &vfolder.BaseVirtualFolder, 0, 0, 0, dbHandle)
  2160. if err != nil {
  2161. return err
  2162. }
  2163. err = sqlCommonAddGroupFolderMapping(ctx, group, vfolder, dbHandle)
  2164. if err != nil {
  2165. return err
  2166. }
  2167. }
  2168. return err
  2169. }
  2170. func generateUserVirtualFoldersMapping(ctx context.Context, user *User, dbHandle sqlQuerier) error {
  2171. err := sqlCommonClearUserFolderMapping(ctx, user, dbHandle)
  2172. if err != nil {
  2173. return err
  2174. }
  2175. for idx := range user.VirtualFolders {
  2176. vfolder := &user.VirtualFolders[idx]
  2177. err := sqlCommonAddOrUpdateFolder(ctx, &vfolder.BaseVirtualFolder, 0, 0, 0, dbHandle)
  2178. if err != nil {
  2179. return err
  2180. }
  2181. err = sqlCommonAddUserFolderMapping(ctx, user, vfolder, dbHandle)
  2182. if err != nil {
  2183. return err
  2184. }
  2185. }
  2186. return err
  2187. }
  2188. func generateUserGroupMapping(ctx context.Context, user *User, dbHandle sqlQuerier) error {
  2189. err := sqlCommonClearUserGroupMapping(ctx, user, dbHandle)
  2190. if err != nil {
  2191. return err
  2192. }
  2193. for _, group := range user.Groups {
  2194. err = sqlCommonAddUserGroupMapping(ctx, user.Username, group.Name, group.Type, dbHandle)
  2195. if err != nil {
  2196. return err
  2197. }
  2198. }
  2199. return err
  2200. }
  2201. func getDefenderHostsWithScores(ctx context.Context, hosts []DefenderEntry, from int64, idForScores []int64,
  2202. dbHandle sqlQuerier) (
  2203. []DefenderEntry,
  2204. error,
  2205. ) {
  2206. if len(idForScores) == 0 {
  2207. return hosts, nil
  2208. }
  2209. hostsWithScores := make(map[int64]int)
  2210. q := getDefenderEventsQuery(idForScores)
  2211. stmt, err := dbHandle.PrepareContext(ctx, q)
  2212. if err != nil {
  2213. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2214. return nil, err
  2215. }
  2216. defer stmt.Close()
  2217. rows, err := stmt.QueryContext(ctx, from)
  2218. if err != nil {
  2219. providerLog(logger.LevelError, "unable to get score for hosts with id %+v: %v", idForScores, err)
  2220. return nil, err
  2221. }
  2222. defer rows.Close()
  2223. for rows.Next() {
  2224. var hostID int64
  2225. var score int
  2226. err = rows.Scan(&hostID, &score)
  2227. if err != nil {
  2228. providerLog(logger.LevelError, "error scanning host score row: %v", err)
  2229. return hosts, err
  2230. }
  2231. if score > 0 {
  2232. hostsWithScores[hostID] = score
  2233. }
  2234. }
  2235. err = rows.Err()
  2236. if err != nil {
  2237. return hosts, err
  2238. }
  2239. result := make([]DefenderEntry, 0, len(hosts))
  2240. for idx := range hosts {
  2241. hosts[idx].Score = hostsWithScores[hosts[idx].ID]
  2242. if hosts[idx].Score > 0 || !hosts[idx].BanTime.IsZero() {
  2243. result = append(result, hosts[idx])
  2244. }
  2245. }
  2246. return result, nil
  2247. }
  2248. func getUserWithVirtualFolders(ctx context.Context, user User, dbHandle sqlQuerier) (User, error) {
  2249. users, err := getUsersWithVirtualFolders(ctx, []User{user}, dbHandle)
  2250. if err != nil {
  2251. return user, err
  2252. }
  2253. if len(users) == 0 {
  2254. return user, errSQLFoldersAssociation
  2255. }
  2256. return users[0], err
  2257. }
  2258. func getUsersWithVirtualFolders(ctx context.Context, users []User, dbHandle sqlQuerier) ([]User, error) {
  2259. if len(users) == 0 {
  2260. return users, nil
  2261. }
  2262. var err error
  2263. usersVirtualFolders := make(map[int64][]vfs.VirtualFolder)
  2264. q := getRelatedFoldersForUsersQuery(users)
  2265. stmt, err := dbHandle.PrepareContext(ctx, q)
  2266. if err != nil {
  2267. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2268. return nil, err
  2269. }
  2270. defer stmt.Close()
  2271. rows, err := stmt.QueryContext(ctx)
  2272. if err != nil {
  2273. return nil, err
  2274. }
  2275. defer rows.Close()
  2276. for rows.Next() {
  2277. var folder vfs.VirtualFolder
  2278. var userID int64
  2279. var mappedPath, fsConfig, description sql.NullString
  2280. err = rows.Scan(&folder.ID, &folder.Name, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  2281. &folder.LastQuotaUpdate, &folder.VirtualPath, &folder.QuotaSize, &folder.QuotaFiles, &userID, &fsConfig,
  2282. &description)
  2283. if err != nil {
  2284. return users, err
  2285. }
  2286. if mappedPath.Valid {
  2287. folder.MappedPath = mappedPath.String
  2288. }
  2289. if description.Valid {
  2290. folder.Description = description.String
  2291. }
  2292. if fsConfig.Valid {
  2293. var fs vfs.Filesystem
  2294. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  2295. if err == nil {
  2296. folder.FsConfig = fs
  2297. }
  2298. }
  2299. usersVirtualFolders[userID] = append(usersVirtualFolders[userID], folder)
  2300. }
  2301. err = rows.Err()
  2302. if err != nil {
  2303. return users, err
  2304. }
  2305. if len(usersVirtualFolders) == 0 {
  2306. return users, err
  2307. }
  2308. for idx := range users {
  2309. ref := &users[idx]
  2310. ref.VirtualFolders = usersVirtualFolders[ref.ID]
  2311. }
  2312. return users, err
  2313. }
  2314. func getUserWithGroups(ctx context.Context, user User, dbHandle sqlQuerier) (User, error) {
  2315. users, err := getUsersWithGroups(ctx, []User{user}, dbHandle)
  2316. if err != nil {
  2317. return user, err
  2318. }
  2319. if len(users) == 0 {
  2320. return user, errSQLGroupsAssociation
  2321. }
  2322. return users[0], err
  2323. }
  2324. func getUsersWithGroups(ctx context.Context, users []User, dbHandle sqlQuerier) ([]User, error) {
  2325. if len(users) == 0 {
  2326. return users, nil
  2327. }
  2328. var err error
  2329. usersGroups := make(map[int64][]sdk.GroupMapping)
  2330. q := getRelatedGroupsForUsersQuery(users)
  2331. stmt, err := dbHandle.PrepareContext(ctx, q)
  2332. if err != nil {
  2333. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2334. return nil, err
  2335. }
  2336. defer stmt.Close()
  2337. rows, err := stmt.QueryContext(ctx)
  2338. if err != nil {
  2339. return nil, err
  2340. }
  2341. defer rows.Close()
  2342. for rows.Next() {
  2343. var group sdk.GroupMapping
  2344. var userID int64
  2345. err = rows.Scan(&group.Name, &group.Type, &userID)
  2346. if err != nil {
  2347. return users, err
  2348. }
  2349. usersGroups[userID] = append(usersGroups[userID], group)
  2350. }
  2351. err = rows.Err()
  2352. if err != nil {
  2353. return users, err
  2354. }
  2355. if len(usersGroups) == 0 {
  2356. return users, err
  2357. }
  2358. for idx := range users {
  2359. ref := &users[idx]
  2360. ref.Groups = usersGroups[ref.ID]
  2361. }
  2362. return users, err
  2363. }
  2364. func getGroupWithUsers(ctx context.Context, group Group, dbHandle sqlQuerier) (Group, error) {
  2365. groups, err := getGroupsWithUsers(ctx, []Group{group}, dbHandle)
  2366. if err != nil {
  2367. return group, err
  2368. }
  2369. if len(groups) == 0 {
  2370. return group, errSQLUsersAssociation
  2371. }
  2372. return groups[0], err
  2373. }
  2374. func getGroupWithVirtualFolders(ctx context.Context, group Group, dbHandle sqlQuerier) (Group, error) {
  2375. groups, err := getGroupsWithVirtualFolders(ctx, []Group{group}, dbHandle)
  2376. if err != nil {
  2377. return group, err
  2378. }
  2379. if len(groups) == 0 {
  2380. return group, errSQLFoldersAssociation
  2381. }
  2382. return groups[0], err
  2383. }
  2384. func getGroupsWithVirtualFolders(ctx context.Context, groups []Group, dbHandle sqlQuerier) ([]Group, error) {
  2385. if len(groups) == 0 {
  2386. return groups, nil
  2387. }
  2388. var err error
  2389. q := getRelatedFoldersForGroupsQuery(groups)
  2390. stmt, err := dbHandle.PrepareContext(ctx, q)
  2391. if err != nil {
  2392. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2393. return nil, err
  2394. }
  2395. defer stmt.Close()
  2396. rows, err := stmt.QueryContext(ctx)
  2397. if err != nil {
  2398. return nil, err
  2399. }
  2400. defer rows.Close()
  2401. groupsVirtualFolders := make(map[int64][]vfs.VirtualFolder)
  2402. for rows.Next() {
  2403. var groupID int64
  2404. var folder vfs.VirtualFolder
  2405. var mappedPath, fsConfig, description sql.NullString
  2406. err = rows.Scan(&folder.ID, &folder.Name, &mappedPath, &folder.UsedQuotaSize, &folder.UsedQuotaFiles,
  2407. &folder.LastQuotaUpdate, &folder.VirtualPath, &folder.QuotaSize, &folder.QuotaFiles, &groupID, &fsConfig,
  2408. &description)
  2409. if err != nil {
  2410. return groups, err
  2411. }
  2412. if mappedPath.Valid {
  2413. folder.MappedPath = mappedPath.String
  2414. }
  2415. if description.Valid {
  2416. folder.Description = description.String
  2417. }
  2418. if fsConfig.Valid {
  2419. var fs vfs.Filesystem
  2420. err = json.Unmarshal([]byte(fsConfig.String), &fs)
  2421. if err == nil {
  2422. folder.FsConfig = fs
  2423. }
  2424. }
  2425. groupsVirtualFolders[groupID] = append(groupsVirtualFolders[groupID], folder)
  2426. }
  2427. err = rows.Err()
  2428. if err != nil {
  2429. return groups, err
  2430. }
  2431. if len(groupsVirtualFolders) == 0 {
  2432. return groups, err
  2433. }
  2434. for idx := range groups {
  2435. ref := &groups[idx]
  2436. ref.VirtualFolders = groupsVirtualFolders[ref.ID]
  2437. }
  2438. return groups, err
  2439. }
  2440. func getGroupsWithUsers(ctx context.Context, groups []Group, dbHandle sqlQuerier) ([]Group, error) {
  2441. if len(groups) == 0 {
  2442. return groups, nil
  2443. }
  2444. var err error
  2445. q := getRelatedUsersForGroupsQuery(groups)
  2446. stmt, err := dbHandle.PrepareContext(ctx, q)
  2447. if err != nil {
  2448. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2449. return nil, err
  2450. }
  2451. defer stmt.Close()
  2452. rows, err := stmt.QueryContext(ctx)
  2453. if err != nil {
  2454. return nil, err
  2455. }
  2456. defer rows.Close()
  2457. groupsUsers := make(map[int64][]string)
  2458. for rows.Next() {
  2459. var username string
  2460. var groupID int64
  2461. err = rows.Scan(&groupID, &username)
  2462. if err != nil {
  2463. return groups, err
  2464. }
  2465. groupsUsers[groupID] = append(groupsUsers[groupID], username)
  2466. }
  2467. err = rows.Err()
  2468. if err != nil {
  2469. return groups, err
  2470. }
  2471. if len(groupsUsers) == 0 {
  2472. return groups, err
  2473. }
  2474. for idx := range groups {
  2475. ref := &groups[idx]
  2476. ref.Users = groupsUsers[ref.ID]
  2477. }
  2478. return groups, err
  2479. }
  2480. func getVirtualFoldersWithGroups(folders []vfs.BaseVirtualFolder, dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  2481. if len(folders) == 0 {
  2482. return folders, nil
  2483. }
  2484. var err error
  2485. vFoldersGroups := make(map[int64][]string)
  2486. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2487. defer cancel()
  2488. q := getRelatedGroupsForFoldersQuery(folders)
  2489. stmt, err := dbHandle.PrepareContext(ctx, q)
  2490. if err != nil {
  2491. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2492. return nil, err
  2493. }
  2494. defer stmt.Close()
  2495. rows, err := stmt.QueryContext(ctx)
  2496. if err != nil {
  2497. return nil, err
  2498. }
  2499. defer rows.Close()
  2500. for rows.Next() {
  2501. var name string
  2502. var folderID int64
  2503. err = rows.Scan(&folderID, &name)
  2504. if err != nil {
  2505. return folders, err
  2506. }
  2507. vFoldersGroups[folderID] = append(vFoldersGroups[folderID], name)
  2508. }
  2509. err = rows.Err()
  2510. if err != nil {
  2511. return folders, err
  2512. }
  2513. if len(vFoldersGroups) == 0 {
  2514. return folders, err
  2515. }
  2516. for idx := range folders {
  2517. ref := &folders[idx]
  2518. ref.Groups = vFoldersGroups[ref.ID]
  2519. }
  2520. return folders, err
  2521. }
  2522. func getVirtualFoldersWithUsers(folders []vfs.BaseVirtualFolder, dbHandle sqlQuerier) ([]vfs.BaseVirtualFolder, error) {
  2523. if len(folders) == 0 {
  2524. return folders, nil
  2525. }
  2526. var err error
  2527. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2528. defer cancel()
  2529. q := getRelatedUsersForFoldersQuery(folders)
  2530. stmt, err := dbHandle.PrepareContext(ctx, q)
  2531. if err != nil {
  2532. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2533. return nil, err
  2534. }
  2535. defer stmt.Close()
  2536. rows, err := stmt.QueryContext(ctx)
  2537. if err != nil {
  2538. return nil, err
  2539. }
  2540. defer rows.Close()
  2541. vFoldersUsers := make(map[int64][]string)
  2542. for rows.Next() {
  2543. var username string
  2544. var folderID int64
  2545. err = rows.Scan(&folderID, &username)
  2546. if err != nil {
  2547. return folders, err
  2548. }
  2549. vFoldersUsers[folderID] = append(vFoldersUsers[folderID], username)
  2550. }
  2551. err = rows.Err()
  2552. if err != nil {
  2553. return folders, err
  2554. }
  2555. if len(vFoldersUsers) == 0 {
  2556. return folders, err
  2557. }
  2558. for idx := range folders {
  2559. ref := &folders[idx]
  2560. ref.Users = vFoldersUsers[ref.ID]
  2561. }
  2562. return folders, err
  2563. }
  2564. func sqlCommonUpdateFolderQuota(name string, filesAdd int, sizeAdd int64, reset bool, dbHandle *sql.DB) error {
  2565. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2566. defer cancel()
  2567. q := getUpdateFolderQuotaQuery(reset)
  2568. stmt, err := dbHandle.PrepareContext(ctx, q)
  2569. if err != nil {
  2570. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2571. return err
  2572. }
  2573. defer stmt.Close()
  2574. _, err = stmt.ExecContext(ctx, sizeAdd, filesAdd, util.GetTimeAsMsSinceEpoch(time.Now()), name)
  2575. if err == nil {
  2576. providerLog(logger.LevelDebug, "quota updated for folder %#v, files increment: %v size increment: %v is reset? %v",
  2577. name, filesAdd, sizeAdd, reset)
  2578. } else {
  2579. providerLog(logger.LevelWarn, "error updating quota for folder %#v: %v", name, err)
  2580. }
  2581. return err
  2582. }
  2583. func sqlCommonGetFolderUsedQuota(mappedPath string, dbHandle *sql.DB) (int, int64, error) {
  2584. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2585. defer cancel()
  2586. q := getQuotaFolderQuery()
  2587. stmt, err := dbHandle.PrepareContext(ctx, q)
  2588. if err != nil {
  2589. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2590. return 0, 0, err
  2591. }
  2592. defer stmt.Close()
  2593. var usedFiles int
  2594. var usedSize int64
  2595. err = stmt.QueryRowContext(ctx, mappedPath).Scan(&usedSize, &usedFiles)
  2596. if err != nil {
  2597. providerLog(logger.LevelError, "error getting quota for folder: %v, error: %v", mappedPath, err)
  2598. return 0, 0, err
  2599. }
  2600. return usedFiles, usedSize, err
  2601. }
  2602. func getAPIKeyWithRelatedFields(ctx context.Context, apiKey APIKey, dbHandle sqlQuerier) (APIKey, error) {
  2603. var apiKeys []APIKey
  2604. var err error
  2605. scope := APIKeyScopeAdmin
  2606. if apiKey.userID > 0 {
  2607. scope = APIKeyScopeUser
  2608. }
  2609. apiKeys, err = getRelatedValuesForAPIKeys(ctx, []APIKey{apiKey}, dbHandle, scope)
  2610. if err != nil {
  2611. return apiKey, err
  2612. }
  2613. if len(apiKeys) > 0 {
  2614. apiKey = apiKeys[0]
  2615. }
  2616. return apiKey, nil
  2617. }
  2618. func getRelatedValuesForAPIKeys(ctx context.Context, apiKeys []APIKey, dbHandle sqlQuerier, scope APIKeyScope) ([]APIKey, error) {
  2619. if len(apiKeys) == 0 {
  2620. return apiKeys, nil
  2621. }
  2622. values := make(map[int64]string)
  2623. var q string
  2624. if scope == APIKeyScopeUser {
  2625. q = getRelatedUsersForAPIKeysQuery(apiKeys)
  2626. } else {
  2627. q = getRelatedAdminsForAPIKeysQuery(apiKeys)
  2628. }
  2629. stmt, err := dbHandle.PrepareContext(ctx, q)
  2630. if err != nil {
  2631. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2632. return nil, err
  2633. }
  2634. defer stmt.Close()
  2635. rows, err := stmt.QueryContext(ctx)
  2636. if err != nil {
  2637. return nil, err
  2638. }
  2639. defer rows.Close()
  2640. for rows.Next() {
  2641. var valueID int64
  2642. var valueName string
  2643. err = rows.Scan(&valueID, &valueName)
  2644. if err != nil {
  2645. return apiKeys, err
  2646. }
  2647. values[valueID] = valueName
  2648. }
  2649. err = rows.Err()
  2650. if err != nil {
  2651. return apiKeys, err
  2652. }
  2653. if len(values) == 0 {
  2654. return apiKeys, nil
  2655. }
  2656. for idx := range apiKeys {
  2657. ref := &apiKeys[idx]
  2658. if scope == APIKeyScopeUser {
  2659. ref.User = values[ref.userID]
  2660. } else {
  2661. ref.Admin = values[ref.adminID]
  2662. }
  2663. }
  2664. return apiKeys, nil
  2665. }
  2666. func sqlCommonGetAPIKeyRelatedIDs(apiKey *APIKey) (sql.NullInt64, sql.NullInt64, error) {
  2667. var userID, adminID sql.NullInt64
  2668. if apiKey.User != "" {
  2669. u, err := provider.userExists(apiKey.User)
  2670. if err != nil {
  2671. return userID, adminID, util.NewValidationError(fmt.Sprintf("unable to validate user %v", apiKey.User))
  2672. }
  2673. userID.Valid = true
  2674. userID.Int64 = u.ID
  2675. }
  2676. if apiKey.Admin != "" {
  2677. a, err := provider.adminExists(apiKey.Admin)
  2678. if err != nil {
  2679. return userID, adminID, util.NewValidationError(fmt.Sprintf("unable to validate admin %v", apiKey.Admin))
  2680. }
  2681. adminID.Valid = true
  2682. adminID.Int64 = a.ID
  2683. }
  2684. return userID, adminID, nil
  2685. }
  2686. func sqlCommonAddSession(session Session, dbHandle *sql.DB) error {
  2687. if err := session.validate(); err != nil {
  2688. return err
  2689. }
  2690. data, err := json.Marshal(session.Data)
  2691. if err != nil {
  2692. return err
  2693. }
  2694. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2695. defer cancel()
  2696. q := getAddSessionQuery()
  2697. stmt, err := dbHandle.PrepareContext(ctx, q)
  2698. if err != nil {
  2699. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2700. return err
  2701. }
  2702. defer stmt.Close()
  2703. _, err = stmt.ExecContext(ctx, session.Key, data, session.Type, session.Timestamp)
  2704. return err
  2705. }
  2706. func sqlCommonGetSession(key string, dbHandle sqlQuerier) (Session, error) {
  2707. var session Session
  2708. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2709. defer cancel()
  2710. q := getSessionQuery()
  2711. stmt, err := dbHandle.PrepareContext(ctx, q)
  2712. if err != nil {
  2713. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2714. return session, err
  2715. }
  2716. defer stmt.Close()
  2717. var data []byte // type hint, some driver will use string instead of []byte if the type is any
  2718. err = stmt.QueryRowContext(ctx, key).Scan(&session.Key, &data, &session.Type, &session.Timestamp)
  2719. if err != nil {
  2720. return session, err
  2721. }
  2722. session.Data = data
  2723. return session, nil
  2724. }
  2725. func sqlCommonDeleteSession(key string, dbHandle *sql.DB) error {
  2726. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2727. defer cancel()
  2728. q := getDeleteSessionQuery()
  2729. stmt, err := dbHandle.PrepareContext(ctx, q)
  2730. if err != nil {
  2731. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2732. return err
  2733. }
  2734. defer stmt.Close()
  2735. res, err := stmt.ExecContext(ctx, key)
  2736. if err != nil {
  2737. return err
  2738. }
  2739. return sqlCommonRequireRowAffected(res)
  2740. }
  2741. func sqlCommonCleanupSessions(sessionType SessionType, before int64, dbHandle *sql.DB) error {
  2742. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2743. defer cancel()
  2744. q := getCleanupSessionsQuery()
  2745. stmt, err := dbHandle.PrepareContext(ctx, q)
  2746. if err != nil {
  2747. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2748. return err
  2749. }
  2750. defer stmt.Close()
  2751. _, err = stmt.ExecContext(ctx, sessionType, before)
  2752. return err
  2753. }
  2754. func sqlCommonGetDatabaseVersion(dbHandle sqlQuerier, showInitWarn bool) (schemaVersion, error) {
  2755. var result schemaVersion
  2756. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2757. defer cancel()
  2758. q := getDatabaseVersionQuery()
  2759. stmt, err := dbHandle.PrepareContext(ctx, q)
  2760. if err != nil {
  2761. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2762. if showInitWarn && strings.Contains(err.Error(), sqlTableSchemaVersion) {
  2763. logger.WarnToConsole("database query error, did you forgot to run the \"initprovider\" command?")
  2764. }
  2765. return result, err
  2766. }
  2767. defer stmt.Close()
  2768. row := stmt.QueryRowContext(ctx)
  2769. err = row.Scan(&result.Version)
  2770. return result, err
  2771. }
  2772. func sqlCommonRequireRowAffected(res sql.Result) error {
  2773. // MariaDB/MySQL returns 0 rows affected for updates that don't change anything
  2774. // so we don't check rows affected for updates
  2775. affected, err := res.RowsAffected()
  2776. if err == nil && affected == 0 {
  2777. return util.NewRecordNotFoundError(sql.ErrNoRows.Error())
  2778. }
  2779. return nil
  2780. }
  2781. func sqlCommonUpdateDatabaseVersion(ctx context.Context, dbHandle sqlQuerier, version int) error {
  2782. q := getUpdateDBVersionQuery()
  2783. stmt, err := dbHandle.PrepareContext(ctx, q)
  2784. if err != nil {
  2785. providerLog(logger.LevelError, "error preparing database query %#v: %v", q, err)
  2786. return err
  2787. }
  2788. defer stmt.Close()
  2789. _, err = stmt.ExecContext(ctx, version)
  2790. return err
  2791. }
  2792. func sqlCommonExecSQLAndUpdateDBVersion(dbHandle *sql.DB, sqlQueries []string, newVersion int, isUp bool) error {
  2793. if err := sqlAcquireLock(dbHandle); err != nil {
  2794. return err
  2795. }
  2796. defer sqlReleaseLock(dbHandle)
  2797. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  2798. defer cancel()
  2799. if newVersion > 0 {
  2800. currentVersion, err := sqlCommonGetDatabaseVersion(dbHandle, false)
  2801. if err == nil {
  2802. if (isUp && currentVersion.Version >= newVersion) || (!isUp && currentVersion.Version <= newVersion) {
  2803. providerLog(logger.LevelInfo, "current schema version: %v, requested: %v, did you execute simultaneous migrations?",
  2804. currentVersion.Version, newVersion)
  2805. return nil
  2806. }
  2807. }
  2808. }
  2809. return sqlCommonExecuteTx(ctx, dbHandle, func(tx *sql.Tx) error {
  2810. for _, q := range sqlQueries {
  2811. if strings.TrimSpace(q) == "" {
  2812. continue
  2813. }
  2814. _, err := tx.ExecContext(ctx, q)
  2815. if err != nil {
  2816. return err
  2817. }
  2818. }
  2819. if newVersion == 0 {
  2820. return nil
  2821. }
  2822. return sqlCommonUpdateDatabaseVersion(ctx, tx, newVersion)
  2823. })
  2824. }
  2825. func sqlAcquireLock(dbHandle *sql.DB) error {
  2826. ctx, cancel := context.WithTimeout(context.Background(), longSQLQueryTimeout)
  2827. defer cancel()
  2828. switch config.Driver {
  2829. case PGSQLDataProviderName:
  2830. _, err := dbHandle.ExecContext(ctx, `SELECT pg_advisory_lock(101,1)`)
  2831. if err != nil {
  2832. return fmt.Errorf("unable to get advisory lock: %w", err)
  2833. }
  2834. providerLog(logger.LevelInfo, "acquired database lock")
  2835. case MySQLDataProviderName:
  2836. stmt, err := dbHandle.PrepareContext(ctx, `SELECT GET_LOCK('sftpgo.migration',30)`)
  2837. if err != nil {
  2838. return fmt.Errorf("unable to get lock: %w", err)
  2839. }
  2840. defer stmt.Close()
  2841. var lockResult sql.NullInt64
  2842. err = stmt.QueryRowContext(ctx).Scan(&lockResult)
  2843. if err != nil {
  2844. return fmt.Errorf("unable to get lock: %w", err)
  2845. }
  2846. if !lockResult.Valid {
  2847. return errors.New("unable to get lock: null value returned")
  2848. }
  2849. if lockResult.Int64 != 1 {
  2850. return fmt.Errorf("unable to get lock, result: %v", lockResult.Int64)
  2851. }
  2852. providerLog(logger.LevelInfo, "acquired database lock")
  2853. }
  2854. return nil
  2855. }
  2856. func sqlReleaseLock(dbHandle *sql.DB) {
  2857. ctx, cancel := context.WithTimeout(context.Background(), defaultSQLQueryTimeout)
  2858. defer cancel()
  2859. switch config.Driver {
  2860. case PGSQLDataProviderName:
  2861. _, err := dbHandle.ExecContext(ctx, `SELECT pg_advisory_unlock(101,1)`)
  2862. if err != nil {
  2863. providerLog(logger.LevelWarn, "unable to release lock: %v", err)
  2864. } else {
  2865. providerLog(logger.LevelInfo, "released database lock")
  2866. }
  2867. case MySQLDataProviderName:
  2868. _, err := dbHandle.ExecContext(ctx, `SELECT RELEASE_LOCK('sftpgo.migration')`)
  2869. if err != nil {
  2870. providerLog(logger.LevelWarn, "unable to release lock: %v", err)
  2871. } else {
  2872. providerLog(logger.LevelInfo, "released database lock")
  2873. }
  2874. }
  2875. }
  2876. func sqlCommonExecuteTx(ctx context.Context, dbHandle *sql.DB, txFn func(*sql.Tx) error) error {
  2877. if config.Driver == CockroachDataProviderName {
  2878. return crdb.ExecuteTx(ctx, dbHandle, nil, txFn)
  2879. }
  2880. tx, err := dbHandle.BeginTx(ctx, nil)
  2881. if err != nil {
  2882. return err
  2883. }
  2884. err = txFn(tx)
  2885. if err != nil {
  2886. // we don't change the returned error
  2887. tx.Rollback() //nolint:errcheck
  2888. return err
  2889. }
  2890. return tx.Commit()
  2891. }