sqlqueries.go 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  1. // Copyright (C) 2019-2023 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. "fmt"
  17. "strconv"
  18. "strings"
  19. "github.com/drakkan/sftpgo/v2/internal/vfs"
  20. )
  21. const (
  22. selectUserFields = "u.id,u.username,u.password,u.public_keys,u.home_dir,u.uid,u.gid,u.max_sessions,u.quota_size,u.quota_files," +
  23. "u.permissions,u.used_quota_size,u.used_quota_files,u.last_quota_update,u.upload_bandwidth,u.download_bandwidth," +
  24. "u.expiration_date,u.last_login,u.status,u.filters,u.filesystem,u.additional_info,u.description,u.email,u.created_at," +
  25. "u.updated_at,u.upload_data_transfer,u.download_data_transfer,u.total_data_transfer," +
  26. "u.used_upload_data_transfer,u.used_download_data_transfer,u.deleted_at,u.first_download,u.first_upload,r.name,u.last_password_change"
  27. selectFolderFields = "id,path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem"
  28. selectAdminFields = "a.id,a.username,a.password,a.status,a.email,a.permissions,a.filters,a.additional_info,a.description,a.created_at,a.updated_at,a.last_login,r.name"
  29. selectAPIKeyFields = "key_id,name,api_key,scope,created_at,updated_at,last_use_at,expires_at,description,user_id,admin_id"
  30. selectShareFields = "s.share_id,s.name,s.description,s.scope,s.paths,u.username,s.created_at,s.updated_at,s.last_use_at," +
  31. "s.expires_at,s.password,s.max_tokens,s.used_tokens,s.allow_from"
  32. selectGroupFields = "id,name,description,created_at,updated_at,user_settings"
  33. selectEventActionFields = "id,name,description,type,options"
  34. selectRoleFields = "id,name,description,created_at,updated_at"
  35. selectIPListEntryFields = "type,ipornet,mode,protocols,description,created_at,updated_at,deleted_at"
  36. selectMinimalFields = "id,name"
  37. )
  38. func getSQLPlaceholders() []string {
  39. var placeholders []string
  40. for i := 1; i <= 50; i++ {
  41. if config.Driver == PGSQLDataProviderName || config.Driver == CockroachDataProviderName {
  42. placeholders = append(placeholders, fmt.Sprintf("$%d", i))
  43. } else {
  44. placeholders = append(placeholders, "?")
  45. }
  46. }
  47. return placeholders
  48. }
  49. func getSQLQuotedName(name string) string {
  50. if config.Driver == MySQLDataProviderName {
  51. return fmt.Sprintf("`%s`", name)
  52. }
  53. return fmt.Sprintf(`"%s"`, name)
  54. }
  55. func getSelectEventRuleFields() string {
  56. if config.Driver == MySQLDataProviderName {
  57. return "id,name,description,created_at,updated_at,`trigger`,conditions,deleted_at,status"
  58. }
  59. return `id,name,description,created_at,updated_at,"trigger",conditions,deleted_at,status`
  60. }
  61. func getCoalesceDefaultForRole(role string) string {
  62. if role != "" {
  63. return "0"
  64. }
  65. return "NULL"
  66. }
  67. func getAddSessionQuery() string {
  68. if config.Driver == MySQLDataProviderName {
  69. return fmt.Sprintf("INSERT INTO %s (`key`,`data`,`type`,`timestamp`) VALUES (%s,%s,%s,%s) "+
  70. "ON DUPLICATE KEY UPDATE `data`=VALUES(`data`), `timestamp`=VALUES(`timestamp`)",
  71. sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  72. }
  73. return fmt.Sprintf(`INSERT INTO %s (key,data,type,timestamp) VALUES (%s,%s,%s,%s) ON CONFLICT(key) DO UPDATE SET data=
  74. EXCLUDED.data, timestamp=EXCLUDED.timestamp`,
  75. sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  76. }
  77. func getDeleteSessionQuery() string {
  78. if config.Driver == MySQLDataProviderName {
  79. return fmt.Sprintf("DELETE FROM %s WHERE `key` = %s", sqlTableSharedSessions, sqlPlaceholders[0])
  80. }
  81. return fmt.Sprintf(`DELETE FROM %s WHERE key = %s`, sqlTableSharedSessions, sqlPlaceholders[0])
  82. }
  83. func getSessionQuery() string {
  84. if config.Driver == MySQLDataProviderName {
  85. return fmt.Sprintf("SELECT `key`,`data`,`type`,`timestamp` FROM %s WHERE `key` = %s", sqlTableSharedSessions,
  86. sqlPlaceholders[0])
  87. }
  88. return fmt.Sprintf(`SELECT key,data,type,timestamp FROM %s WHERE key = %s`, sqlTableSharedSessions,
  89. sqlPlaceholders[0])
  90. }
  91. func getCleanupSessionsQuery() string {
  92. return fmt.Sprintf(`DELETE from %s WHERE type = %s AND timestamp < %s`,
  93. sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1])
  94. }
  95. func getAddDefenderHostQuery() string {
  96. if config.Driver == MySQLDataProviderName {
  97. return fmt.Sprintf("INSERT INTO %s (`ip`,`updated_at`,`ban_time`) VALUES (%s,%s,0) ON DUPLICATE KEY UPDATE `updated_at`=VALUES(`updated_at`)",
  98. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  99. }
  100. return fmt.Sprintf(`INSERT INTO %s (ip,updated_at,ban_time) VALUES (%s,%s,0) ON CONFLICT (ip) DO UPDATE SET updated_at = EXCLUDED.updated_at RETURNING id`,
  101. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  102. }
  103. func getAddDefenderEventQuery() string {
  104. return fmt.Sprintf(`INSERT INTO %s (date_time,score,host_id) VALUES (%s,%s,(SELECT id from %s WHERE ip = %s))`,
  105. sqlTableDefenderEvents, sqlPlaceholders[0], sqlPlaceholders[1], sqlTableDefenderHosts, sqlPlaceholders[2])
  106. }
  107. func getDefenderHostsQuery() string {
  108. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %s WHERE updated_at >= %s OR ban_time > 0 ORDER BY updated_at DESC LIMIT %s`,
  109. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  110. }
  111. func getDefenderHostQuery() string {
  112. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %s WHERE ip = %s AND (updated_at >= %s OR ban_time > 0)`,
  113. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  114. }
  115. func getDefenderEventsQuery(hostIDS []int64) string {
  116. var sb strings.Builder
  117. for _, hID := range hostIDS {
  118. if sb.Len() == 0 {
  119. sb.WriteString("(")
  120. } else {
  121. sb.WriteString(",")
  122. }
  123. sb.WriteString(strconv.FormatInt(hID, 10))
  124. }
  125. if sb.Len() > 0 {
  126. sb.WriteString(")")
  127. } else {
  128. sb.WriteString("(0)")
  129. }
  130. return fmt.Sprintf(`SELECT host_id,SUM(score) FROM %s WHERE date_time >= %s AND host_id IN %s GROUP BY host_id`,
  131. sqlTableDefenderEvents, sqlPlaceholders[0], sb.String())
  132. }
  133. func getDefenderIsHostBannedQuery() string {
  134. return fmt.Sprintf(`SELECT id FROM %s WHERE ip = %s AND ban_time >= %s`,
  135. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  136. }
  137. func getDefenderIncrementBanTimeQuery() string {
  138. return fmt.Sprintf(`UPDATE %s SET ban_time = ban_time + %s WHERE ip = %s`,
  139. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  140. }
  141. func getDefenderSetBanTimeQuery() string {
  142. return fmt.Sprintf(`UPDATE %s SET ban_time = %s WHERE ip = %s`,
  143. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  144. }
  145. func getDeleteDefenderHostQuery() string {
  146. return fmt.Sprintf(`DELETE FROM %s WHERE ip = %s`, sqlTableDefenderHosts, sqlPlaceholders[0])
  147. }
  148. func getDefenderHostsCleanupQuery() string {
  149. return fmt.Sprintf(`DELETE FROM %s WHERE ban_time < %s AND NOT EXISTS (
  150. SELECT id FROM %s WHERE %s.host_id = %s.id AND %s.date_time > %s)`,
  151. sqlTableDefenderHosts, sqlPlaceholders[0], sqlTableDefenderEvents, sqlTableDefenderEvents, sqlTableDefenderHosts,
  152. sqlTableDefenderEvents, sqlPlaceholders[1])
  153. }
  154. func getDefenderEventsCleanupQuery() string {
  155. return fmt.Sprintf(`DELETE FROM %s WHERE date_time < %s`, sqlTableDefenderEvents, sqlPlaceholders[0])
  156. }
  157. func getIPListEntryQuery() string {
  158. return fmt.Sprintf(`SELECT %s FROM %s WHERE type = %s AND ipornet = %s AND deleted_at = 0`,
  159. selectIPListEntryFields, sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1])
  160. }
  161. func getIPListEntriesQuery(filter, from, order string, limit int) string {
  162. var sb strings.Builder
  163. var idx int
  164. sb.WriteString("SELECT ")
  165. sb.WriteString(selectIPListEntryFields)
  166. sb.WriteString(" FROM ")
  167. sb.WriteString(sqlTableIPLists)
  168. sb.WriteString(" WHERE type = ")
  169. sb.WriteString(sqlPlaceholders[idx])
  170. idx++
  171. if from != "" {
  172. if order == OrderASC {
  173. sb.WriteString(" AND ipornet > ")
  174. } else {
  175. sb.WriteString(" AND ipornet < ")
  176. }
  177. sb.WriteString(sqlPlaceholders[idx])
  178. idx++
  179. }
  180. if filter != "" {
  181. sb.WriteString(" AND ipornet LIKE ")
  182. sb.WriteString(sqlPlaceholders[idx])
  183. idx++
  184. }
  185. sb.WriteString(" AND deleted_at = 0 ")
  186. sb.WriteString(" ORDER BY ipornet ")
  187. sb.WriteString(order)
  188. if limit > 0 {
  189. sb.WriteString(" LIMIT ")
  190. sb.WriteString(sqlPlaceholders[idx])
  191. }
  192. return sb.String()
  193. }
  194. func getCountIPListEntriesQuery() string {
  195. return fmt.Sprintf(`SELECT count(ipornet) FROM %s WHERE type = %s AND deleted_at = 0`, sqlTableIPLists, sqlPlaceholders[0])
  196. }
  197. func getCountAllIPListEntriesQuery() string {
  198. return fmt.Sprintf(`SELECT count(ipornet) FROM %s WHERE deleted_at = 0`, sqlTableIPLists)
  199. }
  200. func getIPListEntriesForIPQueryPg() string {
  201. return fmt.Sprintf(`SELECT %s FROM %s WHERE type = %s AND deleted_at = 0 AND %s::inet BETWEEN first AND last`,
  202. selectIPListEntryFields, sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1])
  203. }
  204. func getIPListEntriesForIPQueryNoPg() string {
  205. return fmt.Sprintf(`SELECT %s FROM %s WHERE type = %s AND deleted_at = 0 AND ip_type = %s AND %s BETWEEN first AND last`,
  206. selectIPListEntryFields, sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  207. }
  208. func getRecentlyUpdatedIPListQuery() string {
  209. return fmt.Sprintf(`SELECT %s FROM %s WHERE updated_at >= %s OR deleted_at > 0`,
  210. selectIPListEntryFields, sqlTableIPLists, sqlPlaceholders[0])
  211. }
  212. func getDumpListEntriesQuery() string {
  213. return fmt.Sprintf(`SELECT %s FROM %s WHERE deleted_at = 0`, selectIPListEntryFields, sqlTableIPLists)
  214. }
  215. func getAddIPListEntryQuery() string {
  216. return fmt.Sprintf(`INSERT INTO %s (type,ipornet,first,last,ip_type,protocols,description,mode,created_at,updated_at,deleted_at)
  217. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0)`, sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1],
  218. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5],
  219. sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9])
  220. }
  221. func getUpdateIPListEntryQuery() string {
  222. return fmt.Sprintf(`UPDATE %s SET mode=%s,protocols=%s,description=%s,updated_at=%s WHERE type = %s AND ipornet = %s`,
  223. sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3],
  224. sqlPlaceholders[4], sqlPlaceholders[5])
  225. }
  226. func getDeleteIPListEntryQuery(softDelete bool) string {
  227. if softDelete {
  228. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,deleted_at=%s WHERE type = %s AND ipornet = %s`,
  229. sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  230. }
  231. return fmt.Sprintf(`DELETE FROM %s WHERE type = %s AND ipornet = %s`,
  232. sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1])
  233. }
  234. func getRemoveSoftDeletedIPListEntryQuery() string {
  235. return fmt.Sprintf(`DELETE FROM %s WHERE type = %s AND ipornet = %s AND deleted_at > 0`,
  236. sqlTableIPLists, sqlPlaceholders[0], sqlPlaceholders[1])
  237. }
  238. func getRoleByNameQuery() string {
  239. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectRoleFields, sqlTableRoles,
  240. sqlPlaceholders[0])
  241. }
  242. func getRolesQuery(order string, minimal bool) string {
  243. var fieldSelection string
  244. if minimal {
  245. fieldSelection = selectMinimalFields
  246. } else {
  247. fieldSelection = selectRoleFields
  248. }
  249. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection,
  250. sqlTableRoles, order, sqlPlaceholders[0], sqlPlaceholders[1])
  251. }
  252. func getUsersWithRolesQuery(roles []Role) string {
  253. var sb strings.Builder
  254. for _, r := range roles {
  255. if sb.Len() == 0 {
  256. sb.WriteString("(")
  257. } else {
  258. sb.WriteString(",")
  259. }
  260. sb.WriteString(strconv.FormatInt(r.ID, 10))
  261. }
  262. if sb.Len() > 0 {
  263. sb.WriteString(")")
  264. }
  265. return fmt.Sprintf(`SELECT r.id, u.username FROM %s u INNER JOIN %s r ON u.role_id = r.id WHERE u.role_id IN %s`,
  266. sqlTableUsers, sqlTableRoles, sb.String())
  267. }
  268. func getAdminsWithRolesQuery(roles []Role) string {
  269. var sb strings.Builder
  270. for _, r := range roles {
  271. if sb.Len() == 0 {
  272. sb.WriteString("(")
  273. } else {
  274. sb.WriteString(",")
  275. }
  276. sb.WriteString(strconv.FormatInt(r.ID, 10))
  277. }
  278. if sb.Len() > 0 {
  279. sb.WriteString(")")
  280. }
  281. return fmt.Sprintf(`SELECT r.id, a.username FROM %s a INNER JOIN %s r ON a.role_id = r.id WHERE a.role_id IN %s`,
  282. sqlTableAdmins, sqlTableRoles, sb.String())
  283. }
  284. func getDumpRolesQuery() string {
  285. return fmt.Sprintf(`SELECT %s FROM %s`, selectRoleFields, sqlTableRoles)
  286. }
  287. func getAddRoleQuery() string {
  288. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at)
  289. VALUES (%s,%s,%s,%s)`, sqlTableRoles, sqlPlaceholders[0], sqlPlaceholders[1],
  290. sqlPlaceholders[2], sqlPlaceholders[3])
  291. }
  292. func getUpdateRoleQuery() string {
  293. return fmt.Sprintf(`UPDATE %s SET description=%s,updated_at=%s
  294. WHERE name = %s`, sqlTableRoles, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  295. }
  296. func getDeleteRoleQuery() string {
  297. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableRoles, sqlPlaceholders[0])
  298. }
  299. func getGroupByNameQuery() string {
  300. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectGroupFields, getSQLQuotedName(sqlTableGroups),
  301. sqlPlaceholders[0])
  302. }
  303. func getGroupsQuery(order string, minimal bool) string {
  304. var fieldSelection string
  305. if minimal {
  306. fieldSelection = selectMinimalFields
  307. } else {
  308. fieldSelection = selectGroupFields
  309. }
  310. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection,
  311. getSQLQuotedName(sqlTableGroups), order, sqlPlaceholders[0], sqlPlaceholders[1])
  312. }
  313. func getGroupsWithNamesQuery(numArgs int) string {
  314. var sb strings.Builder
  315. for idx := 0; idx < numArgs; idx++ {
  316. if sb.Len() == 0 {
  317. sb.WriteString("(")
  318. } else {
  319. sb.WriteString(",")
  320. }
  321. sb.WriteString(sqlPlaceholders[idx])
  322. }
  323. if sb.Len() > 0 {
  324. sb.WriteString(")")
  325. } else {
  326. sb.WriteString("('')")
  327. }
  328. return fmt.Sprintf(`SELECT %s FROM %s WHERE name in %s`, selectGroupFields, getSQLQuotedName(sqlTableGroups), sb.String())
  329. }
  330. func getUsersInGroupsQuery(numArgs int) string {
  331. var sb strings.Builder
  332. for idx := 0; idx < numArgs; idx++ {
  333. if sb.Len() == 0 {
  334. sb.WriteString("(")
  335. } else {
  336. sb.WriteString(",")
  337. }
  338. sb.WriteString(sqlPlaceholders[idx])
  339. }
  340. if sb.Len() > 0 {
  341. sb.WriteString(")")
  342. } else {
  343. sb.WriteString("('')")
  344. }
  345. return fmt.Sprintf(`SELECT username FROM %s WHERE id IN (SELECT user_id from %s WHERE group_id IN (SELECT id FROM %s WHERE name IN (%s)))`,
  346. sqlTableUsers, sqlTableUsersGroupsMapping, getSQLQuotedName(sqlTableGroups), sb.String())
  347. }
  348. func getDumpGroupsQuery() string {
  349. return fmt.Sprintf(`SELECT %s FROM %s`, selectGroupFields, getSQLQuotedName(sqlTableGroups))
  350. }
  351. func getAddGroupQuery() string {
  352. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at,user_settings)
  353. VALUES (%s,%s,%s,%s,%s)`, getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0], sqlPlaceholders[1],
  354. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  355. }
  356. func getUpdateGroupQuery() string {
  357. return fmt.Sprintf(`UPDATE %s SET description=%s,user_settings=%s,updated_at=%s
  358. WHERE name = %s`, getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  359. sqlPlaceholders[3])
  360. }
  361. func getDeleteGroupQuery() string {
  362. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0])
  363. }
  364. func getAdminByUsernameQuery() string {
  365. return fmt.Sprintf(`SELECT %s FROM %s a LEFT JOIN %s r on r.id = a.role_id WHERE a.username = %s`,
  366. selectAdminFields, sqlTableAdmins, sqlTableRoles, sqlPlaceholders[0])
  367. }
  368. func getAdminsQuery(order string) string {
  369. return fmt.Sprintf(`SELECT %s FROM %s a LEFT JOIN %s r on r.id = a.role_id ORDER BY a.username %s LIMIT %s OFFSET %s`,
  370. selectAdminFields, sqlTableAdmins, sqlTableRoles, order, sqlPlaceholders[0], sqlPlaceholders[1])
  371. }
  372. func getDumpAdminsQuery() string {
  373. return fmt.Sprintf(`SELECT %s FROM %s a LEFT JOIN %s r on r.id = a.role_id`,
  374. selectAdminFields, sqlTableAdmins, sqlTableRoles)
  375. }
  376. func getAddAdminQuery(role string) string {
  377. return fmt.Sprintf(`INSERT INTO %s (username,password,status,email,permissions,filters,additional_info,description,created_at,updated_at,last_login,role_id)
  378. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0,COALESCE((SELECT id from %s WHERE name = %s),%s))`,
  379. sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  380. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  381. sqlTableRoles, sqlPlaceholders[10], getCoalesceDefaultForRole(role))
  382. }
  383. func getUpdateAdminQuery(role string) string {
  384. return fmt.Sprintf(`UPDATE %s SET password=%s,status=%s,email=%s,permissions=%s,filters=%s,additional_info=%s,description=%s,updated_at=%s,
  385. role_id=COALESCE((SELECT id from %s WHERE name = %s),%s) WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0],
  386. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  387. sqlPlaceholders[7], sqlTableRoles, sqlPlaceholders[8], getCoalesceDefaultForRole(role), sqlPlaceholders[9])
  388. }
  389. func getDeleteAdminQuery() string {
  390. return fmt.Sprintf(`DELETE FROM %s WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0])
  391. }
  392. func getShareByIDQuery(filterUser bool) string {
  393. if filterUser {
  394. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id WHERE s.share_id = %s AND u.username = %s`,
  395. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  396. }
  397. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id WHERE s.share_id = %s`,
  398. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0])
  399. }
  400. func getSharesQuery(order string) string {
  401. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id WHERE u.username = %s ORDER BY s.share_id %s LIMIT %s OFFSET %s`,
  402. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], order, sqlPlaceholders[1], sqlPlaceholders[2])
  403. }
  404. func getDumpSharesQuery() string {
  405. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id`,
  406. selectShareFields, sqlTableShares, sqlTableUsers)
  407. }
  408. func getAddShareQuery() string {
  409. return fmt.Sprintf(`INSERT INTO %s (share_id,name,description,scope,paths,created_at,updated_at,last_use_at,
  410. expires_at,password,max_tokens,used_tokens,allow_from,user_id) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)`,
  411. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1],
  412. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  413. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10], sqlPlaceholders[11],
  414. sqlPlaceholders[12], sqlPlaceholders[13])
  415. }
  416. func getUpdateShareRestoreQuery() string {
  417. return fmt.Sprintf(`UPDATE %s SET name=%s,description=%s,scope=%s,paths=%s,created_at=%s,updated_at=%s,
  418. last_use_at=%s,expires_at=%s,password=%s,max_tokens=%s,used_tokens=%s,allow_from=%s,user_id=%s WHERE share_id = %s`, sqlTableShares,
  419. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  420. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  421. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13])
  422. }
  423. func getUpdateShareQuery() string {
  424. return fmt.Sprintf(`UPDATE %s SET name=%s,description=%s,scope=%s,paths=%s,updated_at=%s,expires_at=%s,
  425. password=%s,max_tokens=%s,allow_from=%s,user_id=%s WHERE share_id = %s`, sqlTableShares,
  426. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  427. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  428. sqlPlaceholders[10])
  429. }
  430. func getDeleteShareQuery() string {
  431. return fmt.Sprintf(`DELETE FROM %s WHERE share_id = %s`, sqlTableShares, sqlPlaceholders[0])
  432. }
  433. func getAPIKeyByIDQuery() string {
  434. return fmt.Sprintf(`SELECT %s FROM %s WHERE key_id = %s`, selectAPIKeyFields, sqlTableAPIKeys, sqlPlaceholders[0])
  435. }
  436. func getAPIKeysQuery(order string) string {
  437. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY key_id %s LIMIT %s OFFSET %s`, selectAPIKeyFields, sqlTableAPIKeys,
  438. order, sqlPlaceholders[0], sqlPlaceholders[1])
  439. }
  440. func getDumpAPIKeysQuery() string {
  441. return fmt.Sprintf(`SELECT %s FROM %s`, selectAPIKeyFields, sqlTableAPIKeys)
  442. }
  443. func getAddAPIKeyQuery() string {
  444. return fmt.Sprintf(`INSERT INTO %s (key_id,name,api_key,scope,created_at,updated_at,last_use_at,expires_at,description,user_id,admin_id)
  445. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1],
  446. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  447. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10])
  448. }
  449. func getUpdateAPIKeyQuery() string {
  450. return fmt.Sprintf(`UPDATE %s SET name=%s,scope=%s,expires_at=%s,user_id=%s,admin_id=%s,description=%s,updated_at=%s
  451. WHERE key_id = %s`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  452. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7])
  453. }
  454. func getDeleteAPIKeyQuery() string {
  455. return fmt.Sprintf(`DELETE FROM %s WHERE key_id = %s`, sqlTableAPIKeys, sqlPlaceholders[0])
  456. }
  457. func getRelatedUsersForAPIKeysQuery(apiKeys []APIKey) string {
  458. var sb strings.Builder
  459. for _, k := range apiKeys {
  460. if k.userID == 0 {
  461. continue
  462. }
  463. if sb.Len() == 0 {
  464. sb.WriteString("(")
  465. } else {
  466. sb.WriteString(",")
  467. }
  468. sb.WriteString(strconv.FormatInt(k.userID, 10))
  469. }
  470. if sb.Len() > 0 {
  471. sb.WriteString(")")
  472. } else {
  473. sb.WriteString("(0)")
  474. }
  475. return fmt.Sprintf(`SELECT id,username FROM %s WHERE id IN %s`, sqlTableUsers, sb.String())
  476. }
  477. func getRelatedAdminsForAPIKeysQuery(apiKeys []APIKey) string {
  478. var sb strings.Builder
  479. for _, k := range apiKeys {
  480. if k.adminID == 0 {
  481. continue
  482. }
  483. if sb.Len() == 0 {
  484. sb.WriteString("(")
  485. } else {
  486. sb.WriteString(",")
  487. }
  488. sb.WriteString(strconv.FormatInt(k.adminID, 10))
  489. }
  490. if sb.Len() > 0 {
  491. sb.WriteString(")")
  492. } else {
  493. sb.WriteString("(0)")
  494. }
  495. return fmt.Sprintf(`SELECT id,username FROM %s WHERE id IN %s`, sqlTableAdmins, sb.String())
  496. }
  497. func getUserByUsernameQuery(role string) string {
  498. if role == "" {
  499. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.username = %s AND u.deleted_at = 0`,
  500. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0])
  501. }
  502. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.username = %s AND u.deleted_at = 0
  503. AND u.role_id is NOT NULL AND r.name = %s`,
  504. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0], sqlPlaceholders[1])
  505. }
  506. func getUsersQuery(order, role string) string {
  507. if role == "" {
  508. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE
  509. u.deleted_at = 0 ORDER BY u.username %s LIMIT %s OFFSET %s`,
  510. selectUserFields, sqlTableUsers, sqlTableRoles, order, sqlPlaceholders[0], sqlPlaceholders[1])
  511. }
  512. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE
  513. u.deleted_at = 0 AND u.role_id is NOT NULL AND r.name = %s ORDER BY u.username %s LIMIT %s OFFSET %s`,
  514. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0], order, sqlPlaceholders[1], sqlPlaceholders[2])
  515. }
  516. func getUsersForQuotaCheckQuery(numArgs int) string {
  517. var sb strings.Builder
  518. for idx := 0; idx < numArgs; idx++ {
  519. if sb.Len() == 0 {
  520. sb.WriteString("(")
  521. } else {
  522. sb.WriteString(",")
  523. }
  524. sb.WriteString(sqlPlaceholders[idx])
  525. }
  526. if sb.Len() > 0 {
  527. sb.WriteString(")")
  528. }
  529. return fmt.Sprintf(`SELECT id,username,quota_size,used_quota_size,total_data_transfer,upload_data_transfer,
  530. download_data_transfer,used_upload_data_transfer,used_download_data_transfer,filters FROM %s WHERE username IN %s`,
  531. sqlTableUsers, sb.String())
  532. }
  533. func getRecentlyUpdatedUsersQuery() string {
  534. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.updated_at >= %s OR u.deleted_at > 0`,
  535. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0])
  536. }
  537. func getDumpUsersQuery() string {
  538. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.deleted_at = 0`,
  539. selectUserFields, sqlTableUsers, sqlTableRoles)
  540. }
  541. func getDumpFoldersQuery() string {
  542. return fmt.Sprintf(`SELECT %s FROM %s`, selectFolderFields, sqlTableFolders)
  543. }
  544. func getUpdateTransferQuotaQuery(reset bool) string {
  545. if reset {
  546. return fmt.Sprintf(`UPDATE %s SET used_upload_data_transfer = %s,used_download_data_transfer = %s,last_quota_update = %s
  547. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  548. }
  549. return fmt.Sprintf(`UPDATE %s SET used_upload_data_transfer = used_upload_data_transfer + %s,
  550. used_download_data_transfer = used_download_data_transfer + %s,last_quota_update = %s
  551. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  552. }
  553. func getUpdateQuotaQuery(reset bool) string {
  554. if reset {
  555. return fmt.Sprintf(`UPDATE %s SET used_quota_size = %s,used_quota_files = %s,last_quota_update = %s
  556. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  557. }
  558. return fmt.Sprintf(`UPDATE %s SET used_quota_size = used_quota_size + %s,used_quota_files = used_quota_files + %s,last_quota_update = %s
  559. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  560. }
  561. func getSetUpdateAtQuery() string {
  562. return fmt.Sprintf(`UPDATE %s SET updated_at = %s WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  563. }
  564. func getSetFirstUploadQuery() string {
  565. return fmt.Sprintf(`UPDATE %s SET first_upload = %s WHERE username = %s AND first_upload = 0`,
  566. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  567. }
  568. func getSetFirstDownloadQuery() string {
  569. return fmt.Sprintf(`UPDATE %s SET first_download = %s WHERE username = %s AND first_download = 0`,
  570. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  571. }
  572. func getUpdateLastLoginQuery() string {
  573. return fmt.Sprintf(`UPDATE %s SET last_login = %s WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  574. }
  575. func getUpdateAdminLastLoginQuery() string {
  576. return fmt.Sprintf(`UPDATE %s SET last_login = %s WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1])
  577. }
  578. func getUpdateAPIKeyLastUseQuery() string {
  579. return fmt.Sprintf(`UPDATE %s SET last_use_at = %s WHERE key_id = %s`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1])
  580. }
  581. func getUpdateShareLastUseQuery() string {
  582. return fmt.Sprintf(`UPDATE %s SET last_use_at = %s, used_tokens = used_tokens +%s WHERE share_id = %s`,
  583. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  584. }
  585. func getQuotaQuery() string {
  586. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files,used_upload_data_transfer,
  587. used_download_data_transfer FROM %s WHERE username = %s`,
  588. sqlTableUsers, sqlPlaceholders[0])
  589. }
  590. func getAddUserQuery(role string) string {
  591. return fmt.Sprintf(`INSERT INTO %s (username,password,public_keys,home_dir,uid,gid,max_sessions,quota_size,quota_files,permissions,
  592. used_quota_size,used_quota_files,last_quota_update,upload_bandwidth,download_bandwidth,status,last_login,expiration_date,filters,
  593. filesystem,additional_info,description,email,created_at,updated_at,upload_data_transfer,download_data_transfer,total_data_transfer,
  594. used_upload_data_transfer,used_download_data_transfer,deleted_at,first_download,first_upload,role_id,last_password_change)
  595. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0,0,0,%s,%s,%s,0,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0,0,0,0,0,
  596. COALESCE((SELECT id from %s WHERE name=%s),%s),%s)`,
  597. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  598. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  599. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  600. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  601. sqlPlaceholders[20], sqlPlaceholders[21], sqlPlaceholders[22], sqlPlaceholders[23], sqlTableRoles,
  602. sqlPlaceholders[24], getCoalesceDefaultForRole(role), sqlPlaceholders[25])
  603. }
  604. func getUpdateUserQuery(role string) string {
  605. return fmt.Sprintf(`UPDATE %s SET password=%s,public_keys=%s,home_dir=%s,uid=%s,gid=%s,max_sessions=%s,quota_size=%s,
  606. quota_files=%s,permissions=%s,upload_bandwidth=%s,download_bandwidth=%s,status=%s,expiration_date=%s,filters=%s,filesystem=%s,
  607. additional_info=%s,description=%s,email=%s,updated_at=%s,upload_data_transfer=%s,download_data_transfer=%s,
  608. total_data_transfer=%s,role_id=COALESCE((SELECT id from %s WHERE name=%s),%s),last_password_change=%s WHERE id = %s`,
  609. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  610. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  611. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  612. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  613. sqlPlaceholders[20], sqlPlaceholders[21], sqlTableRoles, sqlPlaceholders[22], getCoalesceDefaultForRole(role),
  614. sqlPlaceholders[23], sqlPlaceholders[24])
  615. }
  616. func getUpdateUserPasswordQuery() string {
  617. return fmt.Sprintf(`UPDATE %s SET password=%s WHERE username = %s`,
  618. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  619. }
  620. func getDeleteUserQuery(softDelete bool) string {
  621. if softDelete {
  622. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,deleted_at=%s WHERE username = %s`,
  623. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  624. }
  625. return fmt.Sprintf(`DELETE FROM %s WHERE id = %s`, sqlTableUsers, sqlPlaceholders[0])
  626. }
  627. func getRemoveSoftDeletedUserQuery() string {
  628. return fmt.Sprintf(`DELETE FROM %s WHERE username = %s AND deleted_at > 0`, sqlTableUsers, sqlPlaceholders[0])
  629. }
  630. func getFolderByNameQuery() string {
  631. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectFolderFields, sqlTableFolders, sqlPlaceholders[0])
  632. }
  633. func getAddFolderQuery() string {
  634. return fmt.Sprintf(`INSERT INTO %s (path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem)
  635. VALUES (%s,%s,%s,%s,%s,%s,%s)`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  636. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  637. }
  638. func getUpdateFolderQuery() string {
  639. return fmt.Sprintf(`UPDATE %s SET path=%s,description=%s,filesystem=%s WHERE name = %s`, sqlTableFolders, sqlPlaceholders[0],
  640. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  641. }
  642. func getDeleteFolderQuery() string {
  643. return fmt.Sprintf(`DELETE FROM %s WHERE id = %s`, sqlTableFolders, sqlPlaceholders[0])
  644. }
  645. func getUpsertFolderQuery() string {
  646. if config.Driver == MySQLDataProviderName {
  647. return fmt.Sprintf("INSERT INTO %s (`path`,`used_quota_size`,`used_quota_files`,`last_quota_update`,`name`,"+
  648. "`description`,`filesystem`) VALUES (%s,%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE "+
  649. "`path`=VALUES(`path`),`description`=VALUES(`description`),`filesystem`=VALUES(`filesystem`)",
  650. sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  651. sqlPlaceholders[5], sqlPlaceholders[6])
  652. }
  653. return fmt.Sprintf(`INSERT INTO %s (path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem)
  654. VALUES (%s,%s,%s,%s,%s,%s,%s) ON CONFLICT (name) DO UPDATE SET path = EXCLUDED.path,description=EXCLUDED.description,
  655. filesystem=EXCLUDED.filesystem`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  656. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  657. }
  658. func getClearUserGroupMappingQuery() string {
  659. return fmt.Sprintf(`DELETE FROM %s WHERE user_id = (SELECT id FROM %s WHERE username = %s)`, sqlTableUsersGroupsMapping,
  660. sqlTableUsers, sqlPlaceholders[0])
  661. }
  662. func getAddUserGroupMappingQuery() string {
  663. return fmt.Sprintf(`INSERT INTO %s (user_id,group_id,group_type) VALUES ((SELECT id FROM %s WHERE username = %s),
  664. (SELECT id FROM %s WHERE name = %s),%s)`,
  665. sqlTableUsersGroupsMapping, sqlTableUsers, sqlPlaceholders[0], getSQLQuotedName(sqlTableGroups),
  666. sqlPlaceholders[1], sqlPlaceholders[2])
  667. }
  668. func getClearAdminGroupMappingQuery() string {
  669. return fmt.Sprintf(`DELETE FROM %s WHERE admin_id = (SELECT id FROM %s WHERE username = %s)`, sqlTableAdminsGroupsMapping,
  670. sqlTableAdmins, sqlPlaceholders[0])
  671. }
  672. func getAddAdminGroupMappingQuery() string {
  673. return fmt.Sprintf(`INSERT INTO %s (admin_id,group_id,options) VALUES ((SELECT id FROM %s WHERE username = %s),
  674. (SELECT id FROM %s WHERE name = %s),%s)`,
  675. sqlTableAdminsGroupsMapping, sqlTableAdmins, sqlPlaceholders[0], getSQLQuotedName(sqlTableGroups),
  676. sqlPlaceholders[1], sqlPlaceholders[2])
  677. }
  678. func getClearGroupFolderMappingQuery() string {
  679. return fmt.Sprintf(`DELETE FROM %s WHERE group_id = (SELECT id FROM %s WHERE name = %s)`, sqlTableGroupsFoldersMapping,
  680. getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0])
  681. }
  682. func getAddGroupFolderMappingQuery() string {
  683. return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,group_id)
  684. VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE name = %s))`,
  685. sqlTableGroupsFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders,
  686. sqlPlaceholders[3], getSQLQuotedName(sqlTableGroups), sqlPlaceholders[4])
  687. }
  688. func getClearUserFolderMappingQuery() string {
  689. return fmt.Sprintf(`DELETE FROM %s WHERE user_id = (SELECT id FROM %s WHERE username = %s)`, sqlTableUsersFoldersMapping,
  690. sqlTableUsers, sqlPlaceholders[0])
  691. }
  692. func getAddUserFolderMappingQuery() string {
  693. return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,user_id)
  694. VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE username = %s))`,
  695. sqlTableUsersFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders,
  696. sqlPlaceholders[3], sqlTableUsers, sqlPlaceholders[4])
  697. }
  698. func getFoldersQuery(order string, minimal bool) string {
  699. var fieldSelection string
  700. if minimal {
  701. fieldSelection = selectMinimalFields
  702. } else {
  703. fieldSelection = selectFolderFields
  704. }
  705. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection, sqlTableFolders,
  706. order, sqlPlaceholders[0], sqlPlaceholders[1])
  707. }
  708. func getUpdateFolderQuotaQuery(reset bool) string {
  709. if reset {
  710. return fmt.Sprintf(`UPDATE %s SET used_quota_size = %s,used_quota_files = %s,last_quota_update = %s
  711. WHERE name = %s`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  712. }
  713. return fmt.Sprintf(`UPDATE %s SET used_quota_size = used_quota_size + %s,used_quota_files = used_quota_files + %s,last_quota_update = %s
  714. WHERE name = %s`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  715. }
  716. func getQuotaFolderQuery() string {
  717. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files FROM %s WHERE name = %s`, sqlTableFolders,
  718. sqlPlaceholders[0])
  719. }
  720. func getRelatedGroupsForUsersQuery(users []User) string {
  721. var sb strings.Builder
  722. for _, u := range users {
  723. if sb.Len() == 0 {
  724. sb.WriteString("(")
  725. } else {
  726. sb.WriteString(",")
  727. }
  728. sb.WriteString(strconv.FormatInt(u.ID, 10))
  729. }
  730. if sb.Len() > 0 {
  731. sb.WriteString(")")
  732. }
  733. return fmt.Sprintf(`SELECT g.name,ug.group_type,ug.user_id FROM %s g INNER JOIN %s ug ON g.id = ug.group_id WHERE
  734. ug.user_id IN %s ORDER BY ug.user_id`, getSQLQuotedName(sqlTableGroups), sqlTableUsersGroupsMapping, sb.String())
  735. }
  736. func getRelatedGroupsForAdminsQuery(admins []Admin) string {
  737. var sb strings.Builder
  738. for _, a := range admins {
  739. if sb.Len() == 0 {
  740. sb.WriteString("(")
  741. } else {
  742. sb.WriteString(",")
  743. }
  744. sb.WriteString(strconv.FormatInt(a.ID, 10))
  745. }
  746. if sb.Len() > 0 {
  747. sb.WriteString(")")
  748. }
  749. return fmt.Sprintf(`SELECT g.name,ag.options,ag.admin_id FROM %s g INNER JOIN %s ag ON g.id = ag.group_id WHERE
  750. ag.admin_id IN %s ORDER BY ag.admin_id`, getSQLQuotedName(sqlTableGroups), sqlTableAdminsGroupsMapping, sb.String())
  751. }
  752. func getRelatedFoldersForUsersQuery(users []User) string {
  753. var sb strings.Builder
  754. for _, u := range users {
  755. if sb.Len() == 0 {
  756. sb.WriteString("(")
  757. } else {
  758. sb.WriteString(",")
  759. }
  760. sb.WriteString(strconv.FormatInt(u.ID, 10))
  761. }
  762. if sb.Len() > 0 {
  763. sb.WriteString(")")
  764. }
  765. return fmt.Sprintf(`SELECT f.id,f.name,f.path,f.used_quota_size,f.used_quota_files,f.last_quota_update,fm.virtual_path,
  766. fm.quota_size,fm.quota_files,fm.user_id,f.filesystem,f.description FROM %s f INNER JOIN %s fm ON f.id = fm.folder_id WHERE
  767. fm.user_id IN %s ORDER BY fm.user_id`, sqlTableFolders, sqlTableUsersFoldersMapping, sb.String())
  768. }
  769. func getRelatedUsersForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  770. var sb strings.Builder
  771. for _, f := range folders {
  772. if sb.Len() == 0 {
  773. sb.WriteString("(")
  774. } else {
  775. sb.WriteString(",")
  776. }
  777. sb.WriteString(strconv.FormatInt(f.ID, 10))
  778. }
  779. if sb.Len() > 0 {
  780. sb.WriteString(")")
  781. }
  782. return fmt.Sprintf(`SELECT fm.folder_id,u.username FROM %s fm INNER JOIN %s u ON fm.user_id = u.id
  783. WHERE fm.folder_id IN %s ORDER BY fm.folder_id`, sqlTableUsersFoldersMapping, sqlTableUsers, sb.String())
  784. }
  785. func getRelatedGroupsForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  786. var sb strings.Builder
  787. for _, f := range folders {
  788. if sb.Len() == 0 {
  789. sb.WriteString("(")
  790. } else {
  791. sb.WriteString(",")
  792. }
  793. sb.WriteString(strconv.FormatInt(f.ID, 10))
  794. }
  795. if sb.Len() > 0 {
  796. sb.WriteString(")")
  797. }
  798. return fmt.Sprintf(`SELECT fm.folder_id,g.name FROM %s fm INNER JOIN %s g ON fm.group_id = g.id
  799. WHERE fm.folder_id IN %s ORDER BY fm.folder_id`, sqlTableGroupsFoldersMapping, getSQLQuotedName(sqlTableGroups),
  800. sb.String())
  801. }
  802. func getRelatedUsersForGroupsQuery(groups []Group) string {
  803. var sb strings.Builder
  804. for _, g := range groups {
  805. if sb.Len() == 0 {
  806. sb.WriteString("(")
  807. } else {
  808. sb.WriteString(",")
  809. }
  810. sb.WriteString(strconv.FormatInt(g.ID, 10))
  811. }
  812. if sb.Len() > 0 {
  813. sb.WriteString(")")
  814. }
  815. return fmt.Sprintf(`SELECT um.group_id,u.username FROM %s um INNER JOIN %s u ON um.user_id = u.id
  816. WHERE um.group_id IN %s ORDER BY um.group_id`, sqlTableUsersGroupsMapping, sqlTableUsers, sb.String())
  817. }
  818. func getRelatedAdminsForGroupsQuery(groups []Group) string {
  819. var sb strings.Builder
  820. for _, g := range groups {
  821. if sb.Len() == 0 {
  822. sb.WriteString("(")
  823. } else {
  824. sb.WriteString(",")
  825. }
  826. sb.WriteString(strconv.FormatInt(g.ID, 10))
  827. }
  828. if sb.Len() > 0 {
  829. sb.WriteString(")")
  830. }
  831. return fmt.Sprintf(`SELECT am.group_id,a.username FROM %s am INNER JOIN %s a ON am.admin_id = a.id
  832. WHERE am.group_id IN %s ORDER BY am.group_id`, sqlTableAdminsGroupsMapping, sqlTableAdmins, sb.String())
  833. }
  834. func getRelatedFoldersForGroupsQuery(groups []Group) string {
  835. var sb strings.Builder
  836. for _, g := range groups {
  837. if sb.Len() == 0 {
  838. sb.WriteString("(")
  839. } else {
  840. sb.WriteString(",")
  841. }
  842. sb.WriteString(strconv.FormatInt(g.ID, 10))
  843. }
  844. if sb.Len() > 0 {
  845. sb.WriteString(")")
  846. }
  847. return fmt.Sprintf(`SELECT f.id,f.name,f.path,f.used_quota_size,f.used_quota_files,f.last_quota_update,fm.virtual_path,
  848. fm.quota_size,fm.quota_files,fm.group_id,f.filesystem,f.description FROM %s f INNER JOIN %s fm ON f.id = fm.folder_id WHERE
  849. fm.group_id IN %s ORDER BY fm.group_id`, sqlTableFolders, sqlTableGroupsFoldersMapping, sb.String())
  850. }
  851. func getActiveTransfersQuery() string {
  852. return fmt.Sprintf(`SELECT transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  853. current_ul_size,current_dl_size,created_at,updated_at FROM %s WHERE updated_at > %s`,
  854. sqlTableActiveTransfers, sqlPlaceholders[0])
  855. }
  856. func getAddActiveTransferQuery() string {
  857. return fmt.Sprintf(`INSERT INTO %s (transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  858. current_ul_size,current_dl_size,created_at,updated_at) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)`,
  859. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3],
  860. sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8],
  861. sqlPlaceholders[9], sqlPlaceholders[10])
  862. }
  863. func getUpdateActiveTransferSizesQuery() string {
  864. return fmt.Sprintf(`UPDATE %s SET current_ul_size=%s,current_dl_size=%s,updated_at=%s WHERE connection_id = %s AND transfer_id = %s`,
  865. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  866. }
  867. func getRemoveActiveTransferQuery() string {
  868. return fmt.Sprintf(`DELETE FROM %s WHERE connection_id = %s AND transfer_id = %s`,
  869. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1])
  870. }
  871. func getCleanupActiveTransfersQuery() string {
  872. return fmt.Sprintf(`DELETE FROM %s WHERE updated_at < %s`, sqlTableActiveTransfers, sqlPlaceholders[0])
  873. }
  874. func getRelatedRulesForActionsQuery(actions []BaseEventAction) string {
  875. var sb strings.Builder
  876. for _, a := range actions {
  877. if sb.Len() == 0 {
  878. sb.WriteString("(")
  879. } else {
  880. sb.WriteString(",")
  881. }
  882. sb.WriteString(strconv.FormatInt(a.ID, 10))
  883. }
  884. if sb.Len() > 0 {
  885. sb.WriteString(")")
  886. }
  887. return fmt.Sprintf(`SELECT am.action_id,r.name FROM %s am INNER JOIN %s r ON am.rule_id = r.id
  888. WHERE am.action_id IN %s ORDER BY r.name ASC`, sqlTableRulesActionsMapping, sqlTableEventsRules, sb.String())
  889. }
  890. func getEventsActionsQuery(order string, minimal bool) string {
  891. var fieldSelection string
  892. if minimal {
  893. fieldSelection = selectMinimalFields
  894. } else {
  895. fieldSelection = selectEventActionFields
  896. }
  897. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection,
  898. sqlTableEventsActions, order, sqlPlaceholders[0], sqlPlaceholders[1])
  899. }
  900. func getDumpEventActionsQuery() string {
  901. return fmt.Sprintf(`SELECT %s FROM %s`, selectEventActionFields, sqlTableEventsActions)
  902. }
  903. func getEventActionByNameQuery() string {
  904. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectEventActionFields, sqlTableEventsActions,
  905. sqlPlaceholders[0])
  906. }
  907. func getAddEventActionQuery() string {
  908. return fmt.Sprintf(`INSERT INTO %s (name,description,type,options) VALUES (%s,%s,%s,%s)`,
  909. sqlTableEventsActions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  910. }
  911. func getUpdateEventActionQuery() string {
  912. return fmt.Sprintf(`UPDATE %s SET description=%s,type=%s,options=%s WHERE name = %s`, sqlTableEventsActions,
  913. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  914. }
  915. func getDeleteEventActionQuery() string {
  916. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableEventsActions, sqlPlaceholders[0])
  917. }
  918. func getEventRulesQuery(order string) string {
  919. return fmt.Sprintf(`SELECT %s FROM %s WHERE deleted_at = 0 ORDER BY name %s LIMIT %s OFFSET %s`,
  920. getSelectEventRuleFields(), sqlTableEventsRules, order, sqlPlaceholders[0], sqlPlaceholders[1])
  921. }
  922. func getDumpEventRulesQuery() string {
  923. return fmt.Sprintf(`SELECT %s FROM %s WHERE deleted_at = 0`, getSelectEventRuleFields(), sqlTableEventsRules)
  924. }
  925. func getRecentlyUpdatedRulesQuery() string {
  926. return fmt.Sprintf(`SELECT %s FROM %s WHERE updated_at >= %s OR deleted_at > 0`, getSelectEventRuleFields(),
  927. sqlTableEventsRules, sqlPlaceholders[0])
  928. }
  929. func getEventRulesByNameQuery() string {
  930. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s AND deleted_at = 0`, getSelectEventRuleFields(), sqlTableEventsRules,
  931. sqlPlaceholders[0])
  932. }
  933. func getAddEventRuleQuery() string {
  934. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at,%s,conditions,deleted_at,status)
  935. VALUES (%s,%s,%s,%s,%s,%s,0,%s)`,
  936. sqlTableEventsRules, getSQLQuotedName("trigger"), sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  937. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  938. }
  939. func getUpdateEventRuleQuery() string {
  940. return fmt.Sprintf(`UPDATE %s SET description=%s,updated_at=%s,%s=%s,conditions=%s,status=%s WHERE name = %s`,
  941. sqlTableEventsRules, sqlPlaceholders[0], sqlPlaceholders[1], getSQLQuotedName("trigger"), sqlPlaceholders[2],
  942. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5])
  943. }
  944. func getDeleteEventRuleQuery(softDelete bool) string {
  945. if softDelete {
  946. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,deleted_at=%s WHERE name = %s`,
  947. sqlTableEventsRules, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  948. }
  949. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableEventsRules, sqlPlaceholders[0])
  950. }
  951. func getRemoveSoftDeletedRuleQuery() string {
  952. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s AND deleted_at > 0`, sqlTableEventsRules, sqlPlaceholders[0])
  953. }
  954. func getClearRuleActionMappingQuery() string {
  955. return fmt.Sprintf(`DELETE FROM %s WHERE rule_id = (SELECT id FROM %s WHERE name = %s)`, sqlTableRulesActionsMapping,
  956. sqlTableEventsRules, sqlPlaceholders[0])
  957. }
  958. func getUpdateRulesTimestampQuery() string {
  959. return fmt.Sprintf(`UPDATE %s SET updated_at=%s WHERE id IN (SELECT rule_id FROM %s WHERE action_id = %s)`,
  960. sqlTableEventsRules, sqlPlaceholders[0], sqlTableRulesActionsMapping, sqlPlaceholders[1])
  961. }
  962. func getRelatedActionsForRulesQuery(rules []EventRule) string {
  963. var sb strings.Builder
  964. for _, r := range rules {
  965. if sb.Len() == 0 {
  966. sb.WriteString("(")
  967. } else {
  968. sb.WriteString(",")
  969. }
  970. sb.WriteString(strconv.FormatInt(r.ID, 10))
  971. }
  972. if sb.Len() > 0 {
  973. sb.WriteString(")")
  974. }
  975. return fmt.Sprintf(`SELECT a.id,a.name,a.description,a.type,a.options,am.options,am.%s,
  976. am.rule_id FROM %s a INNER JOIN %s am ON a.id = am.action_id WHERE am.rule_id IN %s ORDER BY am.%s ASC`,
  977. getSQLQuotedName("order"), sqlTableEventsActions, sqlTableRulesActionsMapping, sb.String(),
  978. getSQLQuotedName("order"))
  979. }
  980. func getAddRuleActionMappingQuery() string {
  981. return fmt.Sprintf(`INSERT INTO %s (rule_id,action_id,%s,options) VALUES ((SELECT id FROM %s WHERE name = %s),
  982. (SELECT id FROM %s WHERE name = %s),%s,%s)`,
  983. sqlTableRulesActionsMapping, getSQLQuotedName("order"), sqlTableEventsRules, sqlPlaceholders[0],
  984. sqlTableEventsActions, sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  985. }
  986. func getTaskByNameQuery() string {
  987. return fmt.Sprintf(`SELECT updated_at,version FROM %s WHERE name = %s`, sqlTableTasks, sqlPlaceholders[0])
  988. }
  989. func getAddTaskQuery() string {
  990. return fmt.Sprintf(`INSERT INTO %s (name,updated_at,version) VALUES (%s,%s,0)`,
  991. sqlTableTasks, sqlPlaceholders[0], sqlPlaceholders[1])
  992. }
  993. func getUpdateTaskQuery() string {
  994. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,version = version + 1 WHERE name = %s AND version = %s`,
  995. sqlTableTasks, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  996. }
  997. func getUpdateTaskTimestampQuery() string {
  998. return fmt.Sprintf(`UPDATE %s SET updated_at=%s WHERE name = %s`,
  999. sqlTableTasks, sqlPlaceholders[0], sqlPlaceholders[1])
  1000. }
  1001. func getDeleteTaskQuery() string {
  1002. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableTasks, sqlPlaceholders[0])
  1003. }
  1004. func getAddNodeQuery() string {
  1005. if config.Driver == MySQLDataProviderName {
  1006. return fmt.Sprintf("INSERT INTO %s (`name`,`data`,created_at,`updated_at`) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE "+
  1007. "`data`=VALUES(`data`), `created_at`=VALUES(`created_at`), `updated_at`=VALUES(`updated_at`)",
  1008. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  1009. }
  1010. return fmt.Sprintf(`INSERT INTO %s (name,data,created_at,updated_at) VALUES (%s,%s,%s,%s) ON CONFLICT(name)
  1011. DO UPDATE SET data=EXCLUDED.data, created_at=EXCLUDED.created_at, updated_at=EXCLUDED.updated_at`,
  1012. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  1013. }
  1014. func getUpdateNodeTimestampQuery() string {
  1015. return fmt.Sprintf(`UPDATE %s SET updated_at=%s WHERE name = %s`,
  1016. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1])
  1017. }
  1018. func getNodeByNameQuery() string {
  1019. return fmt.Sprintf(`SELECT name,data,created_at,updated_at FROM %s WHERE name = %s AND updated_at > %s`,
  1020. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1])
  1021. }
  1022. func getNodesQuery() string {
  1023. return fmt.Sprintf(`SELECT name,data,created_at,updated_at FROM %s WHERE name != %s AND updated_at > %s`,
  1024. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1])
  1025. }
  1026. func getCleanupNodesQuery() string {
  1027. return fmt.Sprintf(`DELETE FROM %s WHERE updated_at < %s`, sqlTableNodes, sqlPlaceholders[0])
  1028. }
  1029. func getDatabaseVersionQuery() string {
  1030. return fmt.Sprintf("SELECT version from %s LIMIT 1", sqlTableSchemaVersion)
  1031. }
  1032. func getUpdateDBVersionQuery() string {
  1033. return fmt.Sprintf(`UPDATE %s SET version=%s`, sqlTableSchemaVersion, sqlPlaceholders[0])
  1034. }