insforge 1.2.10 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +28 -28
  25. package/auth/src/lib/broadcastService.ts +117 -115
  26. package/auth/src/pages/SignInPage.tsx +60 -57
  27. package/auth/src/pages/SignUpPage.tsx +60 -57
  28. package/auth/tsconfig.json +32 -32
  29. package/auth/tsconfig.node.json +11 -11
  30. package/backend/package.json +78 -75
  31. package/backend/src/api/routes/ai/index.routes.ts +3 -3
  32. package/backend/src/api/routes/auth/index.routes.ts +667 -570
  33. package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
  34. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  35. package/backend/src/api/routes/database/index.routes.ts +78 -1
  36. package/backend/src/api/routes/database/records.routes.ts +10 -10
  37. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  38. package/backend/src/api/routes/docs/index.routes.ts +75 -76
  39. package/backend/src/api/routes/email/index.routes.ts +35 -0
  40. package/backend/src/api/routes/functions/index.routes.ts +18 -12
  41. package/backend/src/api/routes/metadata/index.routes.ts +12 -0
  42. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  43. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  44. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  45. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  46. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  47. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  48. package/backend/src/infra/database/database.manager.ts +14 -1
  49. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  50. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  51. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  52. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  53. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  54. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  55. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  56. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  57. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  58. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  59. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  60. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  61. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  62. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  63. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  64. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  65. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  66. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  67. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  68. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  69. package/backend/src/infra/security/token.manager.ts +219 -125
  70. package/backend/src/infra/socket/socket.manager.ts +198 -64
  71. package/backend/src/providers/ai/openrouter.provider.ts +12 -9
  72. package/backend/src/providers/email/base.provider.ts +4 -7
  73. package/backend/src/providers/email/cloud.provider.ts +84 -0
  74. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  75. package/backend/src/providers/oauth/index.ts +1 -0
  76. package/backend/src/server.ts +317 -284
  77. package/backend/src/services/ai/ai-model.service.ts +5 -5
  78. package/backend/src/services/ai/chat-completion.service.ts +4 -4
  79. package/backend/src/services/ai/image-generation.service.ts +3 -3
  80. package/backend/src/services/auth/auth.service.ts +14 -0
  81. package/backend/src/services/database/database-table.service.ts +0 -9
  82. package/backend/src/services/database/database.service.ts +127 -0
  83. package/backend/src/services/email/email.service.ts +5 -7
  84. package/backend/src/services/realtime/index.ts +3 -0
  85. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  86. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  87. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  88. package/backend/src/types/auth.ts +11 -0
  89. package/backend/src/types/realtime.ts +18 -0
  90. package/backend/src/types/socket.ts +7 -31
  91. package/backend/src/utils/cookies.ts +35 -0
  92. package/backend/src/utils/s3-config-loader.ts +64 -0
  93. package/backend/src/utils/seed.ts +301 -298
  94. package/backend/src/utils/sql-parser.ts +90 -0
  95. package/backend/tests/README.md +133 -133
  96. package/backend/tests/cleanup-all-test-data.sh +230 -230
  97. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  98. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  99. package/backend/tests/local/test-ai-config.sh +129 -129
  100. package/backend/tests/local/test-ai-usage.sh +80 -80
  101. package/backend/tests/local/test-auth-router.sh +143 -143
  102. package/backend/tests/local/test-database-router.sh +222 -222
  103. package/backend/tests/local/test-e2e.sh +240 -240
  104. package/backend/tests/local/test-fk-errors.sh +96 -96
  105. package/backend/tests/local/test-functions.sh +123 -123
  106. package/backend/tests/local/test-id-field.sh +200 -200
  107. package/backend/tests/local/test-logs.sh +132 -132
  108. package/backend/tests/local/test-public-bucket.sh +264 -264
  109. package/backend/tests/local/test-secrets.sh +249 -249
  110. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  111. package/backend/tests/local/test-traditional-rest.sh +208 -208
  112. package/backend/tests/manual/README.md +50 -50
  113. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  114. package/backend/tests/manual/seed-large-table.sql +100 -100
  115. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  116. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  117. package/backend/tests/manual/test-database-advance.sh +296 -296
  118. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  119. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  120. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  121. package/backend/tests/manual/test-universal-storage.sh +263 -263
  122. package/backend/tests/manual/test-users.sql +17 -17
  123. package/backend/tests/run-all-tests.sh +139 -139
  124. package/backend/tests/setup.ts +0 -0
  125. package/backend/tests/test-config.sh +338 -338
  126. package/backend/tests/unit/analyze-query.test.ts +697 -0
  127. package/backend/tsconfig.json +22 -22
  128. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  129. package/claude-plugin/README.md +133 -133
  130. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
  131. package/docker-compose.prod.yml +204 -200
  132. package/docker-compose.yml +232 -228
  133. package/docker-init/db/db-init.sql +97 -97
  134. package/docker-init/db/jwt.sql +5 -5
  135. package/docker-init/db/postgresql.conf +16 -16
  136. package/docker-init/logs/vector.yml +236 -236
  137. package/docs/README.md +44 -44
  138. package/docs/agent-docs/real-time.md +269 -0
  139. package/docs/changelog.mdx +119 -67
  140. package/docs/core-concepts/ai/architecture.mdx +372 -372
  141. package/docs/core-concepts/ai/sdk.mdx +213 -213
  142. package/docs/core-concepts/authentication/architecture.mdx +278 -278
  143. package/docs/core-concepts/authentication/sdk.mdx +414 -414
  144. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
  145. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
  146. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
  147. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
  148. package/docs/core-concepts/database/architecture.mdx +255 -255
  149. package/docs/core-concepts/database/sdk.mdx +382 -382
  150. package/docs/core-concepts/email/architecture.mdx +101 -0
  151. package/docs/core-concepts/email/sdk.mdx +53 -0
  152. package/docs/core-concepts/functions/architecture.mdx +105 -105
  153. package/docs/core-concepts/functions/sdk.mdx +184 -184
  154. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  155. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  156. package/docs/core-concepts/storage/architecture.mdx +243 -243
  157. package/docs/core-concepts/storage/sdk.mdx +253 -253
  158. package/docs/deployment/README.md +94 -94
  159. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  160. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  161. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  162. package/docs/deployment/deploy-to-render.md +441 -441
  163. package/docs/deprecated/insforge-auth-api.md +214 -214
  164. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  165. package/docs/deprecated/insforge-db-api.md +358 -358
  166. package/docs/deprecated/insforge-db-sdk.md +139 -139
  167. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  168. package/docs/deprecated/insforge-debug.md +64 -64
  169. package/docs/deprecated/insforge-instructions.md +123 -123
  170. package/docs/deprecated/insforge-project.md +117 -117
  171. package/docs/deprecated/insforge-storage-api.md +278 -278
  172. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  173. package/docs/docs.json +232 -210
  174. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  175. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  176. package/docs/examples/framework-guides/react.mdx +165 -165
  177. package/docs/examples/framework-guides/svelte.mdx +153 -153
  178. package/docs/examples/framework-guides/vue.mdx +159 -159
  179. package/docs/examples/overview.mdx +67 -67
  180. package/docs/favicon.svg +19 -19
  181. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  182. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  183. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  184. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  185. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  186. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  187. package/docs/images/icons/ai.svg +4 -4
  188. package/docs/images/logos/nextjs.svg +4 -4
  189. package/docs/images/logos/nuxt.svg +4 -4
  190. package/docs/images/logos/react.svg +5 -5
  191. package/docs/images/logos/svelte.svg +4 -4
  192. package/docs/images/logos/vue.svg +5 -5
  193. package/docs/insforge-instructions-sdk.md +89 -88
  194. package/docs/introduction.mdx +45 -45
  195. package/docs/logo/dark.svg +22 -22
  196. package/docs/logo/light.svg +20 -20
  197. package/docs/partnership.mdx +651 -646
  198. package/docs/quickstart.mdx +82 -82
  199. package/docs/showcase.mdx +52 -52
  200. package/docs/snippets/sdk-installation.mdx +21 -21
  201. package/docs/snippets/service-icons.mdx +27 -27
  202. package/examples/oauth/frontend-oauth-example.html +250 -250
  203. package/examples/response-examples.md +443 -443
  204. package/frontend/components.json +17 -17
  205. package/frontend/package.json +69 -69
  206. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  207. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  208. package/frontend/src/assets/icons/checked.svg +3 -3
  209. package/frontend/src/assets/icons/connected.svg +3 -3
  210. package/frontend/src/assets/icons/error.svg +3 -3
  211. package/frontend/src/assets/icons/loader.svg +9 -9
  212. package/frontend/src/assets/icons/pencil.svg +4 -4
  213. package/frontend/src/assets/icons/refresh.svg +4 -4
  214. package/frontend/src/assets/icons/step_active.svg +3 -3
  215. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  216. package/frontend/src/assets/icons/warning.svg +3 -3
  217. package/frontend/src/assets/logos/apple.svg +3 -3
  218. package/frontend/src/assets/logos/claude_code.svg +3 -3
  219. package/frontend/src/assets/logos/cline.svg +6 -6
  220. package/frontend/src/assets/logos/cursor.svg +20 -20
  221. package/frontend/src/assets/logos/discord.svg +8 -8
  222. package/frontend/src/assets/logos/facebook.svg +3 -3
  223. package/frontend/src/assets/logos/gemini.svg +19 -19
  224. package/frontend/src/assets/logos/github.svg +5 -5
  225. package/frontend/src/assets/logos/google.svg +13 -13
  226. package/frontend/src/assets/logos/grok.svg +10 -10
  227. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  228. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  229. package/frontend/src/assets/logos/instagram.svg +1 -1
  230. package/frontend/src/assets/logos/linkedin.svg +3 -3
  231. package/frontend/src/assets/logos/openai.svg +10 -10
  232. package/frontend/src/assets/logos/roo_code.svg +9 -9
  233. package/frontend/src/assets/logos/spotify.svg +16 -16
  234. package/frontend/src/assets/logos/tiktok.svg +5 -5
  235. package/frontend/src/assets/logos/trae.svg +3 -3
  236. package/frontend/src/assets/logos/windsurf.svg +10 -10
  237. package/frontend/src/assets/logos/x.svg +3 -3
  238. package/frontend/src/components/layout/AppHeader.tsx +9 -10
  239. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  240. package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
  241. package/frontend/src/features/auth/helpers.tsx +8 -0
  242. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  243. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  244. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  245. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  246. package/frontend/src/features/database/hooks/useTables.ts +32 -28
  247. package/frontend/src/features/database/index.ts +1 -0
  248. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
  249. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
  250. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
  251. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  252. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
  253. package/frontend/src/features/database/services/advance.service.ts +0 -26
  254. package/frontend/src/features/database/services/database.service.ts +55 -0
  255. package/frontend/src/features/database/services/table.service.ts +0 -6
  256. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  257. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
  258. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  259. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  260. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  261. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  262. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  263. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  264. package/frontend/src/features/realtime/index.ts +11 -0
  265. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  266. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  267. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  268. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  269. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  270. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
  271. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
  272. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  273. package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
  274. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  275. package/frontend/src/lib/utils/menuItems.ts +24 -0
  276. package/frontend/src/lib/utils/utils.ts +14 -1
  277. package/frontend/tsconfig.json +25 -25
  278. package/frontend/tsconfig.node.json +9 -9
  279. package/functions/deno.json +24 -24
  280. package/functions/server.ts +315 -315
  281. package/i18n/README.ar.md +130 -130
  282. package/i18n/README.de.md +130 -130
  283. package/i18n/README.es.md +154 -154
  284. package/i18n/README.fr.md +134 -134
  285. package/i18n/README.hi.md +129 -129
  286. package/i18n/README.ja.md +174 -174
  287. package/i18n/README.ko.md +136 -136
  288. package/i18n/README.pt-BR.md +131 -131
  289. package/i18n/README.ru.md +129 -129
  290. package/i18n/README.zh-CN.md +133 -133
  291. package/openapi/ai.yaml +715 -715
  292. package/openapi/auth.yaml +1244 -1244
  293. package/openapi/email.yaml +158 -0
  294. package/openapi/functions.yaml +475 -475
  295. package/openapi/health.yaml +29 -29
  296. package/openapi/logs.yaml +223 -223
  297. package/openapi/metadata.yaml +177 -177
  298. package/openapi/realtime.yaml +699 -0
  299. package/openapi/records.yaml +381 -381
  300. package/openapi/secrets.yaml +370 -370
  301. package/openapi/storage.yaml +875 -875
  302. package/openapi/tables.yaml +463 -463
  303. package/package.json +97 -97
  304. package/shared-schemas/package.json +31 -31
  305. package/shared-schemas/src/ai.schema.ts +63 -59
  306. package/shared-schemas/src/auth-api.schema.ts +352 -339
  307. package/shared-schemas/src/auth.schema.ts +1 -1
  308. package/shared-schemas/src/database-api.schema.ts +32 -1
  309. package/shared-schemas/src/database.schema.ts +39 -0
  310. package/shared-schemas/src/docs.schema.ts +26 -0
  311. package/shared-schemas/src/email-api.schema.ts +30 -0
  312. package/shared-schemas/src/index.ts +4 -0
  313. package/shared-schemas/src/metadata.schema.ts +9 -0
  314. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  315. package/shared-schemas/src/realtime.schema.ts +143 -0
  316. package/shared-schemas/tsconfig.json +21 -21
  317. package/tsconfig.json +7 -7
  318. package/zeabur/README.md +13 -13
  319. package/zeabur/template.yml +1032 -1032
  320. package/.cursor/rules/cursor-rules.mdc +0 -94
  321. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  322. package/test-gemini.sh +0 -35
  323. package/test-usage-admin.sh +0 -57
  324. package/test-usage.sh +0 -50
  325. /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
  326. /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
  327. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  328. /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
  329. /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
  330. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  331. /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
  332. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  333. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  334. /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
  335. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,244 +1,244 @@
1
- #!/bin/bash
2
-
3
- # Test script for raw SQL endpoints - strict vs relaxed modes
4
- # Tests the differences between /rawsql and /rawsql/unrestricted
5
-
6
- # Configuration
7
- BASE_URL="http://localhost:7130/api/database/advance"
8
- TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDEiLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIiwicm9sZSI6InByb2plY3RfYWRtaW4iLCJpYXQiOjE3NTk5NzkxMjcsImV4cCI6MTc2MDU4MzkyN30.mVFDicZBzrBlPhfccfcjFaE9AcB09U3whRZOsC81ZSw"
9
-
10
- # Colors
11
- RED='\033[0;31m'
12
- GREEN='\033[0;32m'
13
- YELLOW='\033[1;33m'
14
- BLUE='\033[0;34m'
15
- CYAN='\033[0;36m'
16
- NC='\033[0m'
17
-
18
- echo "=============================================="
19
- echo "RAW SQL MODES TEST SCRIPT"
20
- echo "=============================================="
21
- echo "Testing strict vs relaxed sanitization modes"
22
- echo "=============================================="
23
- echo ""
24
-
25
- # Function to test endpoint
26
- test_endpoint() {
27
- local mode="$1"
28
- local endpoint="$2"
29
- local test_name="$3"
30
- local query="$4"
31
- local expected_result="$5" # "pass" or "fail"
32
-
33
- echo -e "${CYAN}[$mode] $test_name${NC}"
34
- echo "Query: $query"
35
- echo "Expected: $expected_result"
36
-
37
- # Make the API request
38
- RESPONSE=$(curl -s -w "\n:HTTP_CODE:%{http_code}" -X POST "$BASE_URL/$endpoint" \
39
- -H "Content-Type: application/json" \
40
- -H "Authorization: Bearer $TOKEN" \
41
- -d "{\"query\": \"$query\"}" 2>&1)
42
-
43
- # Extract HTTP code and response body
44
- HTTP_CODE=$(echo "$RESPONSE" | grep ":HTTP_CODE:" | cut -d: -f3)
45
- RESPONSE_BODY=$(echo "$RESPONSE" | sed '/^:HTTP_CODE:/d')
46
-
47
- # Check result
48
- if [ "$expected_result" = "pass" ]; then
49
- if [ "$HTTP_CODE" = "200" ]; then
50
- echo -e "${GREEN}✓ PASS - Query executed successfully${NC}"
51
- else
52
- echo -e "${RED}✗ FAIL - Expected success but got error${NC}"
53
- echo "Response: $RESPONSE_BODY"
54
- fi
55
- else
56
- if [ "$HTTP_CODE" = "200" ]; then
57
- echo -e "${RED}✗ FAIL - Expected block but query executed${NC}"
58
- echo "Response: $RESPONSE_BODY"
59
- else
60
- echo -e "${GREEN}✓ PASS - Query blocked as expected${NC}"
61
- ERROR_MSG=$(echo "$RESPONSE_BODY" | jq -r '.message' 2>/dev/null || echo "$RESPONSE_BODY")
62
- echo "Error: $ERROR_MSG"
63
- fi
64
- fi
65
-
66
- echo ""
67
- }
68
-
69
- echo -e "${BLUE}=== STRICT MODE TESTS (/rawsql) ===${NC}"
70
- echo ""
71
-
72
- # Test 1: Strict mode allows SELECT from system table (read-only)
73
- test_endpoint \
74
- "STRICT" \
75
- "rawsql" \
76
- "Allow SELECT from system table" \
77
- "SELECT * FROM _secrets LIMIT 1;" \
78
- "pass"
79
-
80
- # Test 2: Strict mode blocks system table INSERT
81
- test_endpoint \
82
- "STRICT" \
83
- "rawsql" \
84
- "Block INSERT into system table" \
85
- "INSERT INTO _secrets (name, value_ciphertext) VALUES ('test', 'value');" \
86
- "fail"
87
-
88
- # Test 3: Strict mode blocks pg_catalog
89
- test_endpoint \
90
- "STRICT" \
91
- "rawsql" \
92
- "Block pg_catalog query" \
93
- "SELECT * FROM pg_catalog.pg_tables LIMIT 1;" \
94
- "fail"
95
-
96
- # Test 4: Strict mode blocks information_schema
97
- test_endpoint \
98
- "STRICT" \
99
- "rawsql" \
100
- "Block information_schema query" \
101
- "SELECT * FROM information_schema.tables LIMIT 1;" \
102
- "fail"
103
-
104
- # Test 5: Strict mode blocks INSERT into users
105
- test_endpoint \
106
- "STRICT" \
107
- "rawsql" \
108
- "Block INSERT into users table" \
109
- "INSERT INTO users (id, nickname) VALUES (gen_random_uuid(), 'testuser');" \
110
- "fail"
111
-
112
- # Test 6: Strict mode allows regular table operations
113
- test_endpoint \
114
- "STRICT" \
115
- "rawsql" \
116
- "Allow SELECT from regular table" \
117
- "SELECT COUNT(*) FROM users;" \
118
- "pass"
119
-
120
- echo -e "${BLUE}=== RELAXED MODE TESTS (/rawsql/unrestricted) ===${NC}"
121
- echo ""
122
-
123
- # Test 7: Relaxed mode allows SELECT from system table
124
- test_endpoint \
125
- "RELAXED" \
126
- "rawsql/unrestricted" \
127
- "Allow SELECT from system table" \
128
- "SELECT * FROM _secrets LIMIT 1;" \
129
- "pass"
130
-
131
- # Test 8: Relaxed mode allows INSERT into system table
132
- test_endpoint \
133
- "RELAXED" \
134
- "rawsql/unrestricted" \
135
- "Allow INSERT into system table" \
136
- "INSERT INTO _audit_logs (actor, action, module) VALUES ('test_actor', 'TEST_ACTION', 'TEST_MODULE');" \
137
- "pass"
138
-
139
- # Test 9: Relaxed mode blocks UPDATE system table
140
- test_endpoint \
141
- "RELAXED" \
142
- "rawsql/unrestricted" \
143
- "Block UPDATE system table" \
144
- "UPDATE _audit_logs SET actor = 'updated' WHERE action = 'TEST_ACTION';" \
145
- "fail"
146
-
147
- # Test 10: Relaxed mode blocks DELETE FROM system table
148
- test_endpoint \
149
- "RELAXED" \
150
- "rawsql/unrestricted" \
151
- "Block DELETE FROM system table" \
152
- "DELETE FROM _audit_logs WHERE action = 'TEST_ACTION';" \
153
- "fail"
154
-
155
- # Test 11: Relaxed mode blocks DROP system table
156
- test_endpoint \
157
- "RELAXED" \
158
- "rawsql/unrestricted" \
159
- "Block DROP system table" \
160
- "DROP TABLE _secrets;" \
161
- "fail"
162
-
163
- # Test 12: Relaxed mode allows SELECT from users (INSERT requires foreign key to _accounts, so skip)
164
- test_endpoint \
165
- "RELAXED" \
166
- "rawsql/unrestricted" \
167
- "Allow SELECT from users table" \
168
- "SELECT COUNT(*) FROM users;" \
169
- "pass"
170
-
171
- # Test 13: Relaxed mode blocks DROP users table
172
- test_endpoint \
173
- "RELAXED" \
174
- "rawsql/unrestricted" \
175
- "Block DROP users table" \
176
- "DROP TABLE users;" \
177
- "fail"
178
-
179
- # Test 14: Relaxed mode blocks RENAME users table
180
- test_endpoint \
181
- "RELAXED" \
182
- "rawsql/unrestricted" \
183
- "Block RENAME users table" \
184
- "ALTER TABLE users RENAME TO users_backup;" \
185
- "fail"
186
-
187
- echo -e "${BLUE}=== BOTH MODES - DATABASE LEVEL BLOCKS ===${NC}"
188
- echo ""
189
-
190
- # Test 15: Strict mode blocks DROP DATABASE
191
- test_endpoint \
192
- "STRICT" \
193
- "rawsql" \
194
- "Block DROP DATABASE" \
195
- "DROP DATABASE testdb;" \
196
- "fail"
197
-
198
- # Test 16: Relaxed mode blocks DROP DATABASE
199
- test_endpoint \
200
- "RELAXED" \
201
- "rawsql/unrestricted" \
202
- "Block DROP DATABASE" \
203
- "DROP DATABASE testdb;" \
204
- "fail"
205
-
206
- # Test 17: Relaxed mode blocks pg_catalog
207
- test_endpoint \
208
- "RELAXED" \
209
- "rawsql/unrestricted" \
210
- "Block pg_catalog access" \
211
- "SELECT * FROM pg_catalog.pg_tables LIMIT 1;" \
212
- "fail"
213
-
214
- # Test 18: Relaxed mode blocks information_schema
215
- test_endpoint \
216
- "RELAXED" \
217
- "rawsql/unrestricted" \
218
- "Block information_schema access" \
219
- "SELECT * FROM information_schema.tables LIMIT 1;" \
220
- "fail"
221
-
222
- echo "=============================================="
223
- echo "TEST SUMMARY"
224
- echo "=============================================="
225
- echo ""
226
- echo -e "${GREEN}STRICT MODE (/rawsql):${NC}"
227
- echo " - ✅ Allows SELECT from system tables (read-only)"
228
- echo " - ❌ Blocks INSERT/UPDATE/DELETE/DROP/ALTER on system tables"
229
- echo " - ❌ Blocks ALL operations on users table"
230
- echo " - ❌ Blocks pg_catalog and information_schema"
231
- echo " - ❌ Blocks database-level operations"
232
- echo ""
233
- echo -e "${GREEN}RELAXED MODE (/rawsql/unrestricted):${NC}"
234
- echo " - ✅ Allows SELECT from system tables"
235
- echo " - ✅ Allows INSERT into system tables"
236
- echo " - ✅ Allows SELECT from users table"
237
- echo " - ❌ Blocks UPDATE of system tables"
238
- echo " - ❌ Blocks DELETE FROM system tables"
239
- echo " - ❌ Blocks DROP/ALTER/TRUNCATE system tables"
240
- echo " - ❌ Blocks DROP/RENAME users table"
241
- echo " - ❌ Blocks pg_catalog and information_schema"
242
- echo " - ❌ Blocks database-level operations"
243
- echo ""
244
- echo -e "${CYAN}All tests completed!${NC}"
1
+ #!/bin/bash
2
+
3
+ # Test script for raw SQL endpoints - strict vs relaxed modes
4
+ # Tests the differences between /rawsql and /rawsql/unrestricted
5
+
6
+ # Configuration
7
+ BASE_URL="http://localhost:7130/api/database/advance"
8
+ TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDEiLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIiwicm9sZSI6InByb2plY3RfYWRtaW4iLCJpYXQiOjE3NTk5NzkxMjcsImV4cCI6MTc2MDU4MzkyN30.mVFDicZBzrBlPhfccfcjFaE9AcB09U3whRZOsC81ZSw"
9
+
10
+ # Colors
11
+ RED='\033[0;31m'
12
+ GREEN='\033[0;32m'
13
+ YELLOW='\033[1;33m'
14
+ BLUE='\033[0;34m'
15
+ CYAN='\033[0;36m'
16
+ NC='\033[0m'
17
+
18
+ echo "=============================================="
19
+ echo "RAW SQL MODES TEST SCRIPT"
20
+ echo "=============================================="
21
+ echo "Testing strict vs relaxed sanitization modes"
22
+ echo "=============================================="
23
+ echo ""
24
+
25
+ # Function to test endpoint
26
+ test_endpoint() {
27
+ local mode="$1"
28
+ local endpoint="$2"
29
+ local test_name="$3"
30
+ local query="$4"
31
+ local expected_result="$5" # "pass" or "fail"
32
+
33
+ echo -e "${CYAN}[$mode] $test_name${NC}"
34
+ echo "Query: $query"
35
+ echo "Expected: $expected_result"
36
+
37
+ # Make the API request
38
+ RESPONSE=$(curl -s -w "\n:HTTP_CODE:%{http_code}" -X POST "$BASE_URL/$endpoint" \
39
+ -H "Content-Type: application/json" \
40
+ -H "Authorization: Bearer $TOKEN" \
41
+ -d "{\"query\": \"$query\"}" 2>&1)
42
+
43
+ # Extract HTTP code and response body
44
+ HTTP_CODE=$(echo "$RESPONSE" | grep ":HTTP_CODE:" | cut -d: -f3)
45
+ RESPONSE_BODY=$(echo "$RESPONSE" | sed '/^:HTTP_CODE:/d')
46
+
47
+ # Check result
48
+ if [ "$expected_result" = "pass" ]; then
49
+ if [ "$HTTP_CODE" = "200" ]; then
50
+ echo -e "${GREEN}✓ PASS - Query executed successfully${NC}"
51
+ else
52
+ echo -e "${RED}✗ FAIL - Expected success but got error${NC}"
53
+ echo "Response: $RESPONSE_BODY"
54
+ fi
55
+ else
56
+ if [ "$HTTP_CODE" = "200" ]; then
57
+ echo -e "${RED}✗ FAIL - Expected block but query executed${NC}"
58
+ echo "Response: $RESPONSE_BODY"
59
+ else
60
+ echo -e "${GREEN}✓ PASS - Query blocked as expected${NC}"
61
+ ERROR_MSG=$(echo "$RESPONSE_BODY" | jq -r '.message' 2>/dev/null || echo "$RESPONSE_BODY")
62
+ echo "Error: $ERROR_MSG"
63
+ fi
64
+ fi
65
+
66
+ echo ""
67
+ }
68
+
69
+ echo -e "${BLUE}=== STRICT MODE TESTS (/rawsql) ===${NC}"
70
+ echo ""
71
+
72
+ # Test 1: Strict mode allows SELECT from system table (read-only)
73
+ test_endpoint \
74
+ "STRICT" \
75
+ "rawsql" \
76
+ "Allow SELECT from system table" \
77
+ "SELECT * FROM _secrets LIMIT 1;" \
78
+ "pass"
79
+
80
+ # Test 2: Strict mode blocks system table INSERT
81
+ test_endpoint \
82
+ "STRICT" \
83
+ "rawsql" \
84
+ "Block INSERT into system table" \
85
+ "INSERT INTO _secrets (name, value_ciphertext) VALUES ('test', 'value');" \
86
+ "fail"
87
+
88
+ # Test 3: Strict mode blocks pg_catalog
89
+ test_endpoint \
90
+ "STRICT" \
91
+ "rawsql" \
92
+ "Block pg_catalog query" \
93
+ "SELECT * FROM pg_catalog.pg_tables LIMIT 1;" \
94
+ "fail"
95
+
96
+ # Test 4: Strict mode blocks information_schema
97
+ test_endpoint \
98
+ "STRICT" \
99
+ "rawsql" \
100
+ "Block information_schema query" \
101
+ "SELECT * FROM information_schema.tables LIMIT 1;" \
102
+ "fail"
103
+
104
+ # Test 5: Strict mode blocks INSERT into users
105
+ test_endpoint \
106
+ "STRICT" \
107
+ "rawsql" \
108
+ "Block INSERT into users table" \
109
+ "INSERT INTO users (id, nickname) VALUES (gen_random_uuid(), 'testuser');" \
110
+ "fail"
111
+
112
+ # Test 6: Strict mode allows regular table operations
113
+ test_endpoint \
114
+ "STRICT" \
115
+ "rawsql" \
116
+ "Allow SELECT from regular table" \
117
+ "SELECT COUNT(*) FROM users;" \
118
+ "pass"
119
+
120
+ echo -e "${BLUE}=== RELAXED MODE TESTS (/rawsql/unrestricted) ===${NC}"
121
+ echo ""
122
+
123
+ # Test 7: Relaxed mode allows SELECT from system table
124
+ test_endpoint \
125
+ "RELAXED" \
126
+ "rawsql/unrestricted" \
127
+ "Allow SELECT from system table" \
128
+ "SELECT * FROM _secrets LIMIT 1;" \
129
+ "pass"
130
+
131
+ # Test 8: Relaxed mode allows INSERT into system table
132
+ test_endpoint \
133
+ "RELAXED" \
134
+ "rawsql/unrestricted" \
135
+ "Allow INSERT into system table" \
136
+ "INSERT INTO _audit_logs (actor, action, module) VALUES ('test_actor', 'TEST_ACTION', 'TEST_MODULE');" \
137
+ "pass"
138
+
139
+ # Test 9: Relaxed mode blocks UPDATE system table
140
+ test_endpoint \
141
+ "RELAXED" \
142
+ "rawsql/unrestricted" \
143
+ "Block UPDATE system table" \
144
+ "UPDATE _audit_logs SET actor = 'updated' WHERE action = 'TEST_ACTION';" \
145
+ "fail"
146
+
147
+ # Test 10: Relaxed mode blocks DELETE FROM system table
148
+ test_endpoint \
149
+ "RELAXED" \
150
+ "rawsql/unrestricted" \
151
+ "Block DELETE FROM system table" \
152
+ "DELETE FROM _audit_logs WHERE action = 'TEST_ACTION';" \
153
+ "fail"
154
+
155
+ # Test 11: Relaxed mode blocks DROP system table
156
+ test_endpoint \
157
+ "RELAXED" \
158
+ "rawsql/unrestricted" \
159
+ "Block DROP system table" \
160
+ "DROP TABLE _secrets;" \
161
+ "fail"
162
+
163
+ # Test 12: Relaxed mode allows SELECT from users (INSERT requires foreign key to _accounts, so skip)
164
+ test_endpoint \
165
+ "RELAXED" \
166
+ "rawsql/unrestricted" \
167
+ "Allow SELECT from users table" \
168
+ "SELECT COUNT(*) FROM users;" \
169
+ "pass"
170
+
171
+ # Test 13: Relaxed mode blocks DROP users table
172
+ test_endpoint \
173
+ "RELAXED" \
174
+ "rawsql/unrestricted" \
175
+ "Block DROP users table" \
176
+ "DROP TABLE users;" \
177
+ "fail"
178
+
179
+ # Test 14: Relaxed mode blocks RENAME users table
180
+ test_endpoint \
181
+ "RELAXED" \
182
+ "rawsql/unrestricted" \
183
+ "Block RENAME users table" \
184
+ "ALTER TABLE users RENAME TO users_backup;" \
185
+ "fail"
186
+
187
+ echo -e "${BLUE}=== BOTH MODES - DATABASE LEVEL BLOCKS ===${NC}"
188
+ echo ""
189
+
190
+ # Test 15: Strict mode blocks DROP DATABASE
191
+ test_endpoint \
192
+ "STRICT" \
193
+ "rawsql" \
194
+ "Block DROP DATABASE" \
195
+ "DROP DATABASE testdb;" \
196
+ "fail"
197
+
198
+ # Test 16: Relaxed mode blocks DROP DATABASE
199
+ test_endpoint \
200
+ "RELAXED" \
201
+ "rawsql/unrestricted" \
202
+ "Block DROP DATABASE" \
203
+ "DROP DATABASE testdb;" \
204
+ "fail"
205
+
206
+ # Test 17: Relaxed mode blocks pg_catalog
207
+ test_endpoint \
208
+ "RELAXED" \
209
+ "rawsql/unrestricted" \
210
+ "Block pg_catalog access" \
211
+ "SELECT * FROM pg_catalog.pg_tables LIMIT 1;" \
212
+ "fail"
213
+
214
+ # Test 18: Relaxed mode blocks information_schema
215
+ test_endpoint \
216
+ "RELAXED" \
217
+ "rawsql/unrestricted" \
218
+ "Block information_schema access" \
219
+ "SELECT * FROM information_schema.tables LIMIT 1;" \
220
+ "fail"
221
+
222
+ echo "=============================================="
223
+ echo "TEST SUMMARY"
224
+ echo "=============================================="
225
+ echo ""
226
+ echo -e "${GREEN}STRICT MODE (/rawsql):${NC}"
227
+ echo " - ✅ Allows SELECT from system tables (read-only)"
228
+ echo " - ❌ Blocks INSERT/UPDATE/DELETE/DROP/ALTER on system tables"
229
+ echo " - ❌ Blocks ALL operations on users table"
230
+ echo " - ❌ Blocks pg_catalog and information_schema"
231
+ echo " - ❌ Blocks database-level operations"
232
+ echo ""
233
+ echo -e "${GREEN}RELAXED MODE (/rawsql/unrestricted):${NC}"
234
+ echo " - ✅ Allows SELECT from system tables"
235
+ echo " - ✅ Allows INSERT into system tables"
236
+ echo " - ✅ Allows SELECT from users table"
237
+ echo " - ❌ Blocks UPDATE of system tables"
238
+ echo " - ❌ Blocks DELETE FROM system tables"
239
+ echo " - ❌ Blocks DROP/ALTER/TRUNCATE system tables"
240
+ echo " - ❌ Blocks DROP/RENAME users table"
241
+ echo " - ❌ Blocks pg_catalog and information_schema"
242
+ echo " - ❌ Blocks database-level operations"
243
+ echo ""
244
+ echo -e "${CYAN}All tests completed!${NC}"