sqlcommon.go 94 KB

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