@c9up/ream 0.2.28 → 0.2.30

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 (293) hide show
  1. package/README.md +5 -6
  2. package/dist/Codemods.d.ts +24 -0
  3. package/dist/Codemods.d.ts.map +1 -1
  4. package/dist/Codemods.js +211 -1
  5. package/dist/Codemods.js.map +1 -1
  6. package/dist/HttpKernel.d.ts.map +1 -1
  7. package/dist/HttpKernel.js +17 -5
  8. package/dist/HttpKernel.js.map +1 -1
  9. package/dist/Ignitor.d.ts +15 -2
  10. package/dist/Ignitor.d.ts.map +1 -1
  11. package/dist/Ignitor.js +33 -23
  12. package/dist/Ignitor.js.map +1 -1
  13. package/dist/bodyparser/BodyParserMiddleware.d.ts +4 -4
  14. package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -1
  15. package/dist/bodyparser/BodyParserMiddleware.js +41 -11
  16. package/dist/bodyparser/BodyParserMiddleware.js.map +1 -1
  17. package/dist/bodyparser/MultipartFile.d.ts +21 -15
  18. package/dist/bodyparser/MultipartFile.d.ts.map +1 -1
  19. package/dist/bodyparser/MultipartFile.js +40 -58
  20. package/dist/bodyparser/MultipartFile.js.map +1 -1
  21. package/dist/bodyparser/parseSize.d.ts +7 -4
  22. package/dist/bodyparser/parseSize.d.ts.map +1 -1
  23. package/dist/bodyparser/parseSize.js +12 -17
  24. package/dist/bodyparser/parseSize.js.map +1 -1
  25. package/dist/bodyparser/qsParse.d.ts +20 -1
  26. package/dist/bodyparser/qsParse.d.ts.map +1 -1
  27. package/dist/bodyparser/qsParse.js +78 -25
  28. package/dist/bodyparser/qsParse.js.map +1 -1
  29. package/dist/codemods/source.d.ts +57 -0
  30. package/dist/codemods/source.d.ts.map +1 -0
  31. package/dist/codemods/source.js +282 -0
  32. package/dist/codemods/source.js.map +1 -0
  33. package/dist/console/prompts.d.ts.map +1 -1
  34. package/dist/console/prompts.js +3 -1
  35. package/dist/console/prompts.js.map +1 -1
  36. package/dist/container/Container.d.ts.map +1 -1
  37. package/dist/container/Container.js +61 -71
  38. package/dist/container/Container.js.map +1 -1
  39. package/dist/events/Emitter.d.ts +12 -0
  40. package/dist/events/Emitter.d.ts.map +1 -1
  41. package/dist/events/Emitter.js +36 -9
  42. package/dist/events/Emitter.js.map +1 -1
  43. package/dist/events/helix/helpers.d.ts.map +1 -1
  44. package/dist/events/helix/helpers.js +19 -9
  45. package/dist/events/helix/helpers.js.map +1 -1
  46. package/dist/graphql/GraphQLEngine.d.ts +8 -0
  47. package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
  48. package/dist/graphql/GraphQLEngine.js +79 -12
  49. package/dist/graphql/GraphQLEngine.js.map +1 -1
  50. package/dist/helpers/MessageBuilder.d.ts +4 -2
  51. package/dist/helpers/MessageBuilder.d.ts.map +1 -1
  52. package/dist/helpers/MessageBuilder.js +4 -2
  53. package/dist/helpers/MessageBuilder.js.map +1 -1
  54. package/dist/helpers/errors.d.ts +11 -0
  55. package/dist/helpers/errors.d.ts.map +1 -0
  56. package/dist/helpers/errors.js +17 -0
  57. package/dist/helpers/errors.js.map +1 -0
  58. package/dist/helpers/napi-loader.d.ts.map +1 -1
  59. package/dist/helpers/napi-loader.js +3 -2
  60. package/dist/helpers/napi-loader.js.map +1 -1
  61. package/dist/http/Exception.d.ts +14 -1
  62. package/dist/http/Exception.d.ts.map +1 -1
  63. package/dist/http/Exception.js +10 -2
  64. package/dist/http/Exception.js.map +1 -1
  65. package/dist/http/HttpContext.d.ts +31 -2
  66. package/dist/http/HttpContext.d.ts.map +1 -1
  67. package/dist/http/HttpContext.js +12 -5
  68. package/dist/http/HttpContext.js.map +1 -1
  69. package/dist/http/RedirectBuilder.d.ts +9 -3
  70. package/dist/http/RedirectBuilder.d.ts.map +1 -1
  71. package/dist/http/RedirectBuilder.js +43 -37
  72. package/dist/http/RedirectBuilder.js.map +1 -1
  73. package/dist/http/Request.d.ts +42 -17
  74. package/dist/http/Request.d.ts.map +1 -1
  75. package/dist/http/Request.js +80 -58
  76. package/dist/http/Request.js.map +1 -1
  77. package/dist/http/Response.d.ts +7 -4
  78. package/dist/http/Response.d.ts.map +1 -1
  79. package/dist/http/Response.js +14 -6
  80. package/dist/http/Response.js.map +1 -1
  81. package/dist/http/SseStream.js +6 -7
  82. package/dist/http/SseStream.js.map +1 -1
  83. package/dist/http/permissions.d.ts +25 -0
  84. package/dist/http/permissions.d.ts.map +1 -0
  85. package/dist/http/permissions.js +38 -0
  86. package/dist/http/permissions.js.map +1 -0
  87. package/dist/http-client/HttpClient.d.ts +111 -0
  88. package/dist/http-client/HttpClient.d.ts.map +1 -0
  89. package/dist/http-client/HttpClient.js +386 -0
  90. package/dist/http-client/HttpClient.js.map +1 -0
  91. package/dist/http-client/addresses.d.ts +14 -0
  92. package/dist/http-client/addresses.d.ts.map +1 -0
  93. package/dist/http-client/addresses.js +57 -0
  94. package/dist/http-client/addresses.js.map +1 -0
  95. package/dist/http-client/fake.d.ts +50 -0
  96. package/dist/http-client/fake.d.ts.map +1 -0
  97. package/dist/http-client/fake.js +95 -0
  98. package/dist/http-client/fake.js.map +1 -0
  99. package/dist/http-client/index.d.ts +7 -0
  100. package/dist/http-client/index.d.ts.map +1 -0
  101. package/dist/http-client/index.js +7 -0
  102. package/dist/http-client/index.js.map +1 -0
  103. package/dist/index.d.ts +4 -3
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +1 -1
  106. package/dist/index.js.map +1 -1
  107. package/dist/middleware/Pipeline.d.ts.map +1 -1
  108. package/dist/middleware/Pipeline.js +6 -3
  109. package/dist/middleware/Pipeline.js.map +1 -1
  110. package/dist/native/generated.d.ts +93 -36
  111. package/dist/native/generated.d.ts.map +1 -1
  112. package/dist/profiler/Profiler.d.ts.map +1 -1
  113. package/dist/profiler/Profiler.js +4 -1
  114. package/dist/profiler/Profiler.js.map +1 -1
  115. package/dist/profiler/client.generated.d.ts +5 -0
  116. package/dist/profiler/client.generated.d.ts.map +1 -0
  117. package/dist/profiler/client.generated.js +6 -0
  118. package/dist/profiler/client.generated.js.map +1 -0
  119. package/dist/profiler/collectors.d.ts +92 -13
  120. package/dist/profiler/collectors.d.ts.map +1 -1
  121. package/dist/profiler/collectors.js +106 -19
  122. package/dist/profiler/collectors.js.map +1 -1
  123. package/dist/profiler/endpoint.d.ts +2 -1
  124. package/dist/profiler/endpoint.d.ts.map +1 -1
  125. package/dist/profiler/endpoint.js +25 -1
  126. package/dist/profiler/endpoint.js.map +1 -1
  127. package/dist/profiler/index.d.ts +8 -4
  128. package/dist/profiler/index.d.ts.map +1 -1
  129. package/dist/profiler/index.js +11 -4
  130. package/dist/profiler/index.js.map +1 -1
  131. package/dist/profiler/middleware.d.ts.map +1 -1
  132. package/dist/profiler/middleware.js +76 -10
  133. package/dist/profiler/middleware.js.map +1 -1
  134. package/dist/profiler/preview.d.ts +17 -0
  135. package/dist/profiler/preview.d.ts.map +1 -0
  136. package/dist/profiler/preview.js +100 -0
  137. package/dist/profiler/preview.js.map +1 -0
  138. package/dist/profiler/toolbar.d.ts +15 -23
  139. package/dist/profiler/toolbar.d.ts.map +1 -1
  140. package/dist/profiler/toolbar.js +25 -91
  141. package/dist/profiler/toolbar.js.map +1 -1
  142. package/dist/profiler/types.d.ts +6 -1
  143. package/dist/profiler/types.d.ts.map +1 -1
  144. package/dist/router/Router.d.ts +6 -0
  145. package/dist/router/Router.d.ts.map +1 -1
  146. package/dist/router/Router.js +115 -12
  147. package/dist/router/Router.js.map +1 -1
  148. package/dist/rpc/RpcProvider.d.ts +6 -0
  149. package/dist/rpc/RpcProvider.d.ts.map +1 -1
  150. package/dist/rpc/RpcProvider.js +4 -1
  151. package/dist/rpc/RpcProvider.js.map +1 -1
  152. package/dist/rpc/RpcRouter.d.ts +27 -14
  153. package/dist/rpc/RpcRouter.d.ts.map +1 -1
  154. package/dist/rpc/RpcRouter.js +97 -40
  155. package/dist/rpc/RpcRouter.js.map +1 -1
  156. package/dist/scheduler/Scheduler.js +1 -1
  157. package/dist/scheduler/Scheduler.js.map +1 -1
  158. package/dist/scheduler/locks/RedisLockBackend.d.ts.map +1 -1
  159. package/dist/scheduler/locks/RedisLockBackend.js +13 -2
  160. package/dist/scheduler/locks/RedisLockBackend.js.map +1 -1
  161. package/dist/security/CookieSigner.d.ts.map +1 -1
  162. package/dist/security/CookieSigner.js +32 -8
  163. package/dist/security/CookieSigner.js.map +1 -1
  164. package/dist/security/SignedUrl.d.ts.map +1 -1
  165. package/dist/security/SignedUrl.js +16 -19
  166. package/dist/security/SignedUrl.js.map +1 -1
  167. package/dist/server/Server.d.ts +44 -12
  168. package/dist/server/Server.d.ts.map +1 -1
  169. package/dist/server/Server.js +31 -10
  170. package/dist/server/Server.js.map +1 -1
  171. package/dist/server/nativeGrpc.d.ts +27 -0
  172. package/dist/server/nativeGrpc.d.ts.map +1 -0
  173. package/dist/server/nativeGrpc.js +47 -0
  174. package/dist/server/nativeGrpc.js.map +1 -0
  175. package/dist/server/nativeLimits.d.ts +57 -0
  176. package/dist/server/nativeLimits.d.ts.map +1 -0
  177. package/dist/server/nativeLimits.js +75 -0
  178. package/dist/server/nativeLimits.js.map +1 -0
  179. package/dist/session/Session.d.ts +12 -0
  180. package/dist/session/Session.d.ts.map +1 -1
  181. package/dist/session/Session.js +13 -4
  182. package/dist/session/Session.js.map +1 -1
  183. package/dist/session/SessionMiddleware.d.ts.map +1 -1
  184. package/dist/session/SessionMiddleware.js +28 -9
  185. package/dist/session/SessionMiddleware.js.map +1 -1
  186. package/dist/session/config.d.ts +5 -0
  187. package/dist/session/config.d.ts.map +1 -1
  188. package/dist/session/config.js +8 -0
  189. package/dist/session/config.js.map +1 -1
  190. package/dist/session/drivers/MemoryDriver.d.ts.map +1 -1
  191. package/dist/session/drivers/MemoryDriver.js +26 -7
  192. package/dist/session/drivers/MemoryDriver.js.map +1 -1
  193. package/dist/session/errors.d.ts +17 -0
  194. package/dist/session/errors.d.ts.map +1 -1
  195. package/dist/session/errors.js +21 -0
  196. package/dist/session/errors.js.map +1 -1
  197. package/dist/session/templateTags.d.ts +14 -0
  198. package/dist/session/templateTags.d.ts.map +1 -1
  199. package/dist/session/templateTags.js +45 -17
  200. package/dist/session/templateTags.js.map +1 -1
  201. package/dist/storage/StaticMiddleware.d.ts.map +1 -1
  202. package/dist/storage/StaticMiddleware.js +49 -27
  203. package/dist/storage/StaticMiddleware.js.map +1 -1
  204. package/dist/testing/ApiResponse.d.ts.map +1 -1
  205. package/dist/testing/ApiResponse.js +7 -1
  206. package/dist/testing/ApiResponse.js.map +1 -1
  207. package/dist/testing/TestClient.d.ts.map +1 -1
  208. package/dist/testing/TestClient.js +16 -4
  209. package/dist/testing/TestClient.js.map +1 -1
  210. package/dist/utils/Macroable.d.ts +1 -1
  211. package/dist/utils/Macroable.js +2 -2
  212. package/dist/utils/Macroable.js.map +1 -1
  213. package/events.darwin-arm64.node +0 -0
  214. package/events.darwin-x64.node +0 -0
  215. package/events.linux-arm64-gnu.node +0 -0
  216. package/events.linux-x64-gnu.node +0 -0
  217. package/events.win32-x64-msvc.node +0 -0
  218. package/index.darwin-arm64.node +0 -0
  219. package/index.darwin-x64.node +0 -0
  220. package/index.linux-arm64-gnu.node +0 -0
  221. package/index.linux-x64-gnu.node +0 -0
  222. package/index.win32-x64-msvc.node +0 -0
  223. package/package.json +11 -3
  224. package/scheduler.darwin-arm64.node +0 -0
  225. package/scheduler.darwin-x64.node +0 -0
  226. package/scheduler.linux-arm64-gnu.node +0 -0
  227. package/scheduler.linux-x64-gnu.node +0 -0
  228. package/scheduler.win32-x64-msvc.node +0 -0
  229. package/src/Codemods.ts +314 -3
  230. package/src/HttpKernel.ts +18 -7
  231. package/src/Ignitor.ts +58 -26
  232. package/src/bodyparser/BodyParserMiddleware.ts +45 -16
  233. package/src/bodyparser/MultipartFile.ts +46 -67
  234. package/src/bodyparser/parseSize.ts +17 -17
  235. package/src/bodyparser/qsParse.ts +96 -26
  236. package/src/codemods/source.ts +303 -0
  237. package/src/console/prompts.ts +3 -1
  238. package/src/container/Container.ts +97 -81
  239. package/src/events/Emitter.ts +37 -10
  240. package/src/events/helix/helpers.ts +24 -19
  241. package/src/graphql/GraphQLEngine.ts +91 -14
  242. package/src/helpers/MessageBuilder.ts +4 -2
  243. package/src/helpers/errors.ts +16 -0
  244. package/src/helpers/napi-loader.ts +3 -2
  245. package/src/http/Exception.ts +17 -2
  246. package/src/http/HttpContext.ts +34 -5
  247. package/src/http/RedirectBuilder.ts +51 -37
  248. package/src/http/Request.ts +102 -58
  249. package/src/http/Response.ts +15 -7
  250. package/src/http/SseStream.ts +6 -7
  251. package/src/http/permissions.ts +47 -0
  252. package/src/http-client/HttpClient.ts +505 -0
  253. package/src/http-client/addresses.ts +58 -0
  254. package/src/http-client/fake.ts +141 -0
  255. package/src/http-client/index.ts +21 -0
  256. package/src/index.ts +6 -1
  257. package/src/middleware/Pipeline.ts +7 -3
  258. package/src/native/generated.ts +106 -48
  259. package/src/profiler/Profiler.ts +4 -1
  260. package/src/profiler/client/toolbar.css +595 -0
  261. package/src/profiler/client/toolbar.js +1299 -0
  262. package/src/profiler/client.generated.ts +7 -0
  263. package/src/profiler/collectors.ts +156 -19
  264. package/src/profiler/endpoint.ts +27 -1
  265. package/src/profiler/index.ts +17 -3
  266. package/src/profiler/middleware.ts +74 -9
  267. package/src/profiler/preview.ts +104 -0
  268. package/src/profiler/toolbar.ts +28 -91
  269. package/src/profiler/types.ts +6 -1
  270. package/src/router/Router.ts +136 -13
  271. package/src/rpc/RpcProvider.ts +10 -1
  272. package/src/rpc/RpcRouter.ts +129 -45
  273. package/src/scheduler/Scheduler.ts +1 -1
  274. package/src/scheduler/locks/RedisLockBackend.ts +12 -4
  275. package/src/security/CookieSigner.ts +30 -8
  276. package/src/security/SignedUrl.ts +18 -17
  277. package/src/server/Server.ts +60 -12
  278. package/src/server/nativeGrpc.ts +59 -0
  279. package/src/server/nativeLimits.ts +111 -0
  280. package/src/session/Session.ts +29 -4
  281. package/src/session/SessionMiddleware.ts +30 -10
  282. package/src/session/config.ts +7 -0
  283. package/src/session/drivers/MemoryDriver.ts +26 -7
  284. package/src/session/errors.ts +31 -0
  285. package/src/session/templateTags.ts +57 -0
  286. package/src/storage/StaticMiddleware.ts +46 -27
  287. package/src/testing/ApiResponse.ts +7 -1
  288. package/src/testing/TestClient.ts +14 -5
  289. package/src/utils/Macroable.ts +2 -2
  290. package/scripts/build-napi-types.mjs +0 -69
  291. package/scripts/copy-napi.mjs +0 -121
  292. package/scripts/generate-mime.mjs +0 -119
  293. package/scripts/generate-napi-types.mjs +0 -187
@@ -8,31 +8,39 @@
8
8
  * response.redirect().withQs({ page: '2' }).toPath('/results')
9
9
  * response.redirect().toRoute('posts.show', { id: '42' })
10
10
  */
11
- function isSameOriginOrRelative(referer, requestUrl, allowedHosts = []) {
11
+ /**
12
+ * AdonisJS `isValidRedirectUrl`: a relative path, or an absolute URL whose host
13
+ * is the request authority or an allowed host.
14
+ */
15
+ function isTrustedRedirect(url, authority, allowedHosts) {
12
16
  // A relative path is trusted only when it starts with a single "/" and has no
13
17
  // backslash: browsers normalise "\" to "/", so "/\evil.com" would become the
14
18
  // protocol-relative "//evil.com" that a lone `!startsWith("//")` check misses.
15
- if (referer.startsWith('/') && !referer.startsWith('//') && !referer.includes('\\'))
19
+ if (url.startsWith('/') && !url.startsWith('//') && !url.includes('\\'))
16
20
  return true;
17
- let ref;
21
+ let parsed;
18
22
  try {
19
- ref = new URL(referer);
23
+ parsed = new URL(url);
20
24
  }
21
25
  catch {
22
26
  return false;
23
27
  }
24
- // An explicitly allowed host is trusted whatever the request's own origin is
25
- // — that is what the list is for (AdonisJS `allowedHosts`).
26
- if (allowedHosts.includes(ref.host))
27
- return true;
28
- if (!requestUrl)
29
- return false;
30
- try {
31
- return ref.origin === new URL(requestUrl).origin;
32
- }
33
- catch {
28
+ // Only a web URL is a redirect target: `javascript://app.test/%0aalert(1)`
29
+ // has the right host and is a script, not a page.
30
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
34
31
  return false;
35
- }
32
+ if (allowedHosts.includes(parsed.host))
33
+ return true;
34
+ // Upstream accepts any absolute URL when it knows no host to compare with;
35
+ // refusing it is the safer reading of an attacker-controlled header.
36
+ return authority !== undefined && parsed.host === authority;
37
+ }
38
+ /** The query string of a path or URL, without the "?". */
39
+ function searchOf(url) {
40
+ if (url === undefined)
41
+ return '';
42
+ const index = url.indexOf('?');
43
+ return index === -1 ? '' : url.slice(index + 1);
36
44
  }
37
45
  export class RedirectBuilder {
38
46
  /**
@@ -48,6 +56,7 @@ export class RedirectBuilder {
48
56
  #forwardQs = false;
49
57
  #requestUrl;
50
58
  #requestReferer;
59
+ #requestAuthority;
51
60
  #routeUrlResolver;
52
61
  #session;
53
62
  #isAjax = false;
@@ -56,6 +65,7 @@ export class RedirectBuilder {
56
65
  this.#response = response;
57
66
  this.#requestUrl = options?.requestUrl;
58
67
  this.#requestReferer = options?.requestReferer;
68
+ this.#requestAuthority = options?.requestAuthority;
59
69
  this.#routeUrlResolver = options?.routeUrlResolver;
60
70
  this.#session = options?.session;
61
71
  this.#isAjax = options?.isAjax ?? false;
@@ -104,14 +114,9 @@ export class RedirectBuilder {
104
114
  #safeIntended(intended, fallback) {
105
115
  if (!intended)
106
116
  return fallback;
107
- if (this.#requestUrl && !isSameOriginOrRelative(intended, this.#requestUrl)) {
108
- return fallback;
109
- }
110
- // A protocol-relative `//evil.com` is absolute to a browser even though it
111
- // looks relative — reject it whether or not a request URL is known.
112
- if (intended.startsWith('//'))
113
- return fallback;
114
- return intended;
117
+ return isTrustedRedirect(intended, this.#requestAuthority, this.allowedHosts)
118
+ ? intended
119
+ : fallback;
115
120
  }
116
121
  /** Set redirect status code. */
117
122
  status(code) {
@@ -142,7 +147,11 @@ export class RedirectBuilder {
142
147
  }
143
148
  /** Redirect to an absolute or relative path. */
144
149
  toPath(path) {
145
- const url = this.#appendQs(path);
150
+ this.#send(path, searchOf(this.#requestUrl));
151
+ }
152
+ /** Redirect with `withQs()` forwarding `forwardedSearch` (a query string without "?"). */
153
+ #send(path, forwardedSearch) {
154
+ const url = this.#appendQs(path, forwardedSearch);
146
155
  this.#response.status(this.#status);
147
156
  this.#response.header('location', url);
148
157
  this.#response.setBody('');
@@ -156,12 +165,13 @@ export class RedirectBuilder {
156
165
  this.toPath(path);
157
166
  }
158
167
  /**
159
- * Redirect back to the previous page (Referer header).
160
- * Only trusts same-origin or relative referers — external URLs fall back
161
- * to `fallback` to prevent open redirect attacks.
168
+ * Redirect back to the previous page (AdonisJS `back`): the path of
169
+ * {@link getPreviousUrl}, so the redirect never leaves the site; `withQs()`
170
+ * forwards the previous page's query string, not the current request's.
162
171
  */
163
172
  back(fallback = '/') {
164
- this.toPath(this.getPreviousUrl(fallback));
173
+ const previous = new URL(this.getPreviousUrl(fallback), 'http://localhost');
174
+ this.#send(previous.pathname, previous.search.slice(1));
165
175
  }
166
176
  /**
167
177
  * Where "back" goes (AdonisJS `getPreviousUrl`).
@@ -173,7 +183,7 @@ export class RedirectBuilder {
173
183
  */
174
184
  getPreviousUrl(fallback = '/') {
175
185
  const referer = this.#requestReferer;
176
- if (referer && isSameOriginOrRelative(referer, this.#requestUrl, this.allowedHosts)) {
186
+ if (referer && isTrustedRedirect(referer, this.#requestAuthority, this.allowedHosts)) {
177
187
  return referer;
178
188
  }
179
189
  return fallback;
@@ -183,15 +193,11 @@ export class RedirectBuilder {
183
193
  * uses, so `withQs()` plus `withQs('page', 2)` overrides an inbound `page`
184
194
  * rather than being overridden by it.
185
195
  */
186
- #appendQs(path) {
196
+ #appendQs(path, forwardedSearch) {
187
197
  const params = new URLSearchParams();
188
- if (this.#forwardQs && this.#requestUrl) {
189
- const qsIdx = this.#requestUrl.indexOf('?');
190
- if (qsIdx !== -1) {
191
- for (const [key, value] of new URLSearchParams(this.#requestUrl.slice(qsIdx + 1))) {
192
- params.append(key, value);
193
- }
194
- }
198
+ if (this.#forwardQs) {
199
+ for (const [key, value] of new URLSearchParams(forwardedSearch))
200
+ params.append(key, value);
195
201
  }
196
202
  for (const [key, value] of Object.entries(this.#qs)) {
197
203
  if (value === undefined || value === null)
@@ -1 +1 @@
1
- {"version":3,"file":"RedirectBuilder.js","sourceRoot":"","sources":["../../src/http/RedirectBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RedirectBuilder.js","sourceRoot":"","sources":["../../src/http/RedirectBuilder.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,26 @@ export interface RawRequest {
27
27
  * `ip()` accessor falls back to legacy header parsing.
28
28
  */
29
29
  ip?: string;
30
+ /**
31
+ * The trusted address chain, closest hop first — the socket peer, then each
32
+ * `X-Forwarded-For` entry the Rust layer walked right to left while the hop
33
+ * before it was a trusted proxy. Its last entry is {@link ip}. Absent in
34
+ * hand-built fixtures, where the chain is the peer alone.
35
+ */
36
+ ips?: string[];
37
+ /**
38
+ * Whether the socket peer is one of the trusted proxies configured with
39
+ * `server.trustedProxies()`, as the Rust layer decided against the same
40
+ * list that resolves {@link ip}. Absent in hand-built fixtures: untrusted.
41
+ */
42
+ peerTrusted?: boolean;
43
+ /**
44
+ * The body was over its content type's limit (`config/bodyparser.ts`): the
45
+ * Rust layer did not keep it, and `body` is empty. Reading the body then
46
+ * throws `E_REQUEST_ENTITY_TOO_LARGE` instead of handing back nothing as if
47
+ * nothing had been sent.
48
+ */
49
+ bodyTooLarge?: boolean;
30
50
  /**
31
51
  * Connection scheme as seen by the server (`http`/`https`), when the Rust
32
52
  * layer ships it. Defaults to `http` in `protocol()` when absent; the
@@ -167,13 +187,6 @@ export declare class Request extends Macroable {
167
187
  * desired resolved value.
168
188
  */
169
189
  ip(): string;
170
- /**
171
- * Enable/disable trusting proxy headers (`X-Forwarded-Proto`/`-Host`/`-For`)
172
- * for `protocol()`/`host()`/`ips()`. OFF by default — turning it on when the
173
- * app is NOT behind a trusted proxy lets clients spoof their scheme/host/IP,
174
- * so it's an explicit opt-in (same stance as {@link setMethodSpoofing}).
175
- */
176
- setTrustProxy(enabled: boolean): void;
177
190
  /**
178
191
  * The HTTP/2 `:authority` pseudo-header, falling back to `Host` (AdonisJS
179
192
  * `authority`).
@@ -187,22 +200,27 @@ export declare class Request extends Macroable {
187
200
  authority(): string | null;
188
201
  /**
189
202
  * The request host including port (AdonisJS `host`). Honours
190
- * `X-Forwarded-Host` ONLY when trust-proxy is enabled; otherwise the `Host`
191
- * header. Returns null when neither is present.
203
+ * `X-Forwarded-Host` ONLY when the request came through a trusted proxy (see
204
+ * `server.trustedProxies()`); otherwise the `Host` header. Returns null when
205
+ * neither is present.
192
206
  */
193
207
  host(): string | null;
194
208
  /**
195
- * The request protocol — `http` or `https` (AdonisJS `protocol`). Honours
196
- * `X-Forwarded-Proto` only under trust-proxy; otherwise the connection scheme
197
- * the Rust layer reported (defaulting to `http`).
209
+ * The request protocol — `http` or `https` (AdonisJS `protocol`). A TLS
210
+ * connection is `https` whatever the headers say. Otherwise
211
+ * `X-Forwarded-Proto` is honoured only when the request came through a
212
+ * trusted proxy (see `server.trustedProxies()`), and the connection scheme
213
+ * the Rust layer reported (defaulting to `http`) is used when it is not.
198
214
  */
199
215
  protocol(): string;
200
216
  /** True when the request protocol is `https` (AdonisJS `secure`). */
201
217
  secure(): boolean;
202
218
  /**
203
- * The client IP chain (AdonisJS `ips`). Under trust-proxy, the parsed
204
- * `X-Forwarded-For` list (left-most = original client); otherwise just the
205
- * single resolved {@link ip}.
219
+ * The trusted address chain, closest hop first (AdonisJS `ips`): the socket
220
+ * peer, then each `X-Forwarded-For` hop a trusted proxy vouched for. The
221
+ * last entry is {@link ip}. Hops added by an untrusted peer are not in it —
222
+ * the Rust layer stops at the first address it does not trust, so the chain
223
+ * goes past the peer only when {@link peerTrusted} holds.
206
224
  */
207
225
  ips(): string[];
208
226
  /** The request hostname without port (AdonisJS `hostname`), or null. */
@@ -282,9 +300,16 @@ export declare class Request extends Macroable {
282
300
  * `purpose`. Returns false without an APP_KEY-backed signer.
283
301
  */
284
302
  hasValidSignature(purpose?: string): boolean;
285
- /** Get the raw body as a string (decoded from base64 if binary). */
303
+ /**
304
+ * Get the raw body as a string (decoded from base64 if binary). Throws
305
+ * `E_REQUEST_ENTITY_TOO_LARGE` (413) when the body was over its limit: what
306
+ * the server kept of it is nothing, and nothing is not the body.
307
+ */
286
308
  raw(): string;
287
- /** Get the raw body as a Buffer (preserves binary integrity for file uploads). */
309
+ /**
310
+ * Get the raw body as a Buffer (preserves binary integrity for file uploads).
311
+ * Throws `E_REQUEST_ENTITY_TOO_LARGE` (413) when the body was over its limit.
312
+ */
288
313
  rawBuffer(): Buffer;
289
314
  /** Get a single request header (case-insensitive), or `defaultValue` when absent. */
290
315
  header(key: string): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/http/Request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/http/Request.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@
9
9
  import { parseQueryString } from '../bodyparser/qsParse.js';
10
10
  import { Macroable } from '../utils/Macroable.js';
11
11
  import { getPath, omitPaths, pickPaths } from '../utils/objectPath.js';
12
+ import { Exception } from './Exception.js';
12
13
  import { RequestValidator } from './RequestValidator.js';
13
14
  import { unpackCookieValue } from './Response.js';
14
15
  export class Request extends Macroable {
@@ -17,7 +18,6 @@ export class Request extends Macroable {
17
18
  #cookieSigner;
18
19
  #signedUrl;
19
20
  #allowMethodSpoofing = false;
20
- #trustProxy = false;
21
21
  #routeInfo;
22
22
  #response;
23
23
  #parsedBody;
@@ -173,13 +173,17 @@ export class Request extends Macroable {
173
173
  return this.#raw.remoteAddr ?? '127.0.0.1';
174
174
  }
175
175
  /**
176
- * Enable/disable trusting proxy headers (`X-Forwarded-Proto`/`-Host`/`-For`)
177
- * for `protocol()`/`host()`/`ips()`. OFF by default — turning it on when the
178
- * app is NOT behind a trusted proxy lets clients spoof their scheme/host/IP,
179
- * so it's an explicit opt-in (same stance as {@link setMethodSpoofing}).
176
+ * Whether the socket peer is one of the trusted proxies configured with
177
+ * `server.trustedProxies()` — the condition under which `X-Forwarded-Proto`
178
+ * and `X-Forwarded-Host` are believed by {@link protocol} and {@link host}.
179
+ *
180
+ * The decision is the Rust layer's (`peerTrusted`), made once per request
181
+ * against the same list that resolves {@link ip}, so a trusted proxy that
182
+ * forwards the scheme or host without an `X-Forwarded-For` is believed too.
183
+ * A request without the flag — a hand-built fixture — is untrusted.
180
184
  */
181
- setTrustProxy(enabled) {
182
- this.#trustProxy = enabled;
185
+ #peerIsTrustedProxy() {
186
+ return this.#raw.peerTrusted === true;
183
187
  }
184
188
  /**
185
189
  * The HTTP/2 `:authority` pseudo-header, falling back to `Host` (AdonisJS
@@ -199,11 +203,12 @@ export class Request extends Macroable {
199
203
  }
200
204
  /**
201
205
  * The request host including port (AdonisJS `host`). Honours
202
- * `X-Forwarded-Host` ONLY when trust-proxy is enabled; otherwise the `Host`
203
- * header. Returns null when neither is present.
206
+ * `X-Forwarded-Host` ONLY when the request came through a trusted proxy (see
207
+ * `server.trustedProxies()`); otherwise the `Host` header. Returns null when
208
+ * neither is present.
204
209
  */
205
210
  host() {
206
- if (this.#trustProxy) {
211
+ if (this.#peerIsTrustedProxy()) {
207
212
  const forwarded = this.#raw.headers['x-forwarded-host'];
208
213
  // The first hop in the list, named rather than indexed: `split` always
209
214
  // yields one element, and saying so beats being told it might not.
@@ -214,12 +219,16 @@ export class Request extends Macroable {
214
219
  return this.#raw.headers.host ?? null;
215
220
  }
216
221
  /**
217
- * The request protocol — `http` or `https` (AdonisJS `protocol`). Honours
218
- * `X-Forwarded-Proto` only under trust-proxy; otherwise the connection scheme
219
- * the Rust layer reported (defaulting to `http`).
222
+ * The request protocol — `http` or `https` (AdonisJS `protocol`). A TLS
223
+ * connection is `https` whatever the headers say. Otherwise
224
+ * `X-Forwarded-Proto` is honoured only when the request came through a
225
+ * trusted proxy (see `server.trustedProxies()`), and the connection scheme
226
+ * the Rust layer reported (defaulting to `http`) is used when it is not.
220
227
  */
221
228
  protocol() {
222
- if (this.#trustProxy) {
229
+ if (this.#raw.scheme === 'https')
230
+ return 'https';
231
+ if (this.#peerIsTrustedProxy()) {
223
232
  const forwarded = this.#raw.headers['x-forwarded-proto'];
224
233
  const [first] = forwarded?.split(',') ?? [];
225
234
  if (first !== undefined)
@@ -232,20 +241,16 @@ export class Request extends Macroable {
232
241
  return this.protocol() === 'https';
233
242
  }
234
243
  /**
235
- * The client IP chain (AdonisJS `ips`). Under trust-proxy, the parsed
236
- * `X-Forwarded-For` list (left-most = original client); otherwise just the
237
- * single resolved {@link ip}.
244
+ * The trusted address chain, closest hop first (AdonisJS `ips`): the socket
245
+ * peer, then each `X-Forwarded-For` hop a trusted proxy vouched for. The
246
+ * last entry is {@link ip}. Hops added by an untrusted peer are not in it —
247
+ * the Rust layer stops at the first address it does not trust, so the chain
248
+ * goes past the peer only when {@link peerTrusted} holds.
238
249
  */
239
250
  ips() {
240
- if (this.#trustProxy) {
241
- const forwarded = this.#raw.headers['x-forwarded-for'];
242
- if (forwarded) {
243
- return forwarded
244
- .split(',')
245
- .map((value) => value.trim())
246
- .filter((value) => value.length > 0);
247
- }
248
- }
251
+ const chain = this.#raw.ips;
252
+ if (chain && chain.length > 0 && this.#peerIsTrustedProxy())
253
+ return [...chain];
249
254
  return [this.ip()];
250
255
  }
251
256
  /** The request hostname without port (AdonisJS `hostname`), or null. */
@@ -334,7 +339,9 @@ export class Request extends Macroable {
334
339
  }
335
340
  encryptedCookie(name, defaultValue) {
336
341
  const raw = this.plainCookie(name, undefined, { encoded: false });
337
- const value = raw === null || !this.#cookieSigner ? null : this.#cookieSigner.decrypt(raw);
342
+ // Decrypted for the purpose it was written under — its own name — so a
343
+ // value issued as another encrypted cookie is refused here.
344
+ const value = raw === null || !this.#cookieSigner ? null : this.#cookieSigner.decrypt(raw, name);
338
345
  return value ?? defaultValue ?? null;
339
346
  }
340
347
  /** @internal Inject the APP_KEY-backed signed-URL helper — wired by HttpContext. */
@@ -354,17 +361,26 @@ export class Request extends Macroable {
354
361
  // the expiry and the signature itself live in the query.
355
362
  return this.#signedUrl.verify(this.url(true), purpose);
356
363
  }
357
- /** Get the raw body as a string (decoded from base64 if binary). */
364
+ /**
365
+ * Get the raw body as a string (decoded from base64 if binary). Throws
366
+ * `E_REQUEST_ENTITY_TOO_LARGE` (413) when the body was over its limit: what
367
+ * the server kept of it is nothing, and nothing is not the body.
368
+ */
358
369
  raw() {
359
370
  if (this.#rawBodyOverride !== undefined)
360
371
  return this.#rawBodyOverride;
372
+ this.#assertBodyKept();
361
373
  if (this.#raw.bodyEncoding === 'base64') {
362
374
  return Buffer.from(this.#raw.body, 'base64').toString('utf8');
363
375
  }
364
376
  return this.#raw.body;
365
377
  }
366
- /** Get the raw body as a Buffer (preserves binary integrity for file uploads). */
378
+ /**
379
+ * Get the raw body as a Buffer (preserves binary integrity for file uploads).
380
+ * Throws `E_REQUEST_ENTITY_TOO_LARGE` (413) when the body was over its limit.
381
+ */
367
382
  rawBuffer() {
383
+ this.#assertBodyKept();
368
384
  if (this.#raw.bodyEncoding === 'base64') {
369
385
  return Buffer.from(this.#raw.body, 'base64');
370
386
  }
@@ -556,7 +572,8 @@ export class Request extends Macroable {
556
572
  id: this.id(),
557
573
  url: this.url(true),
558
574
  query: this.parsedUrl().search?.slice(1) ?? '',
559
- body: this.body(),
575
+ // A dump must not throw: an over-limit body is reported as absent.
576
+ body: this.#bodyWasDropped() ? undefined : this.body(),
560
577
  params: this.params(),
561
578
  headers: this.headers(),
562
579
  method: this.method(),
@@ -564,7 +581,9 @@ export class Request extends Macroable {
564
581
  cookies: this.cookies(),
565
582
  hostname: this.hostname(),
566
583
  ip: this.ip(),
567
- subdomains: this.subdomains(),
584
+ // What the route's domain captured (`ctx.subdomains`), as upstream
585
+ // serialises it — not the host's labels, which `subdomains()` returns.
586
+ subdomains: (this.ctx === undefined ? undefined : Reflect.get(this.ctx, 'subdomains')) ?? {},
568
587
  };
569
588
  }
570
589
  /** Same as {@link serialize} — what `JSON.stringify(request)` uses. */
@@ -871,38 +890,41 @@ export class Request extends Macroable {
871
890
  validated() {
872
891
  return this.#validated;
873
892
  }
893
+ /** The body was over its limit and nothing has replaced it since. */
894
+ #bodyWasDropped() {
895
+ return (this.#raw.bodyTooLarge === true &&
896
+ this.#parsedBody === undefined &&
897
+ this.#rawBodyOverride === undefined);
898
+ }
899
+ /**
900
+ * Refuse to read a body the server did not keep. The same 413 the body
901
+ * parser raises, so a route without it still answers the client properly
902
+ * the moment it reaches for the body — and a route that never does is not
903
+ * charged for it.
904
+ */
905
+ #assertBodyKept() {
906
+ if (this.#raw.bodyTooLarge === true) {
907
+ throw new Exception('request entity too large', {
908
+ status: 413,
909
+ code: 'E_REQUEST_ENTITY_TOO_LARGE',
910
+ });
911
+ }
912
+ }
913
+ /**
914
+ * The body is whatever the body parser decided it is, and `{}` when no
915
+ * parser claimed it. Nothing is parsed here: a JSON body is only JSON when
916
+ * its Content-Type says so. Reading any body as JSON let a foreign page
917
+ * drive a JSON route with a CORS simple request (no Content-Type, or
918
+ * `text/plain`), which a browser sends cross-site with the user's cookies
919
+ * and without a preflight.
920
+ */
874
921
  #ensureParsedBody() {
875
922
  if (this.#parsedBody !== undefined)
876
923
  return;
877
- const raw = this.#raw.body;
878
- if (!raw || raw.length === 0) {
879
- this.#parsedBody = {};
880
- return;
881
- }
882
- try {
883
- const parsed = JSON.parse(raw);
884
- this.#parsedBody = isPlainObject(parsed) ? parsed : { _body: parsed };
885
- }
886
- catch {
887
- this.#parsedBody = {};
888
- }
924
+ this.#assertBodyKept();
925
+ this.#parsedBody = {};
889
926
  }
890
927
  }
891
- /** Parse a query string (key=value&key2=value2) into an object. */
892
- /**
893
- * Test whether an IPv4 address is within a CIDR range. Bare IP entries
894
- * (`10.0.0.42`) are accepted as `/32`. IPv6 falls back to string equality
895
- * — a full v6 implementation isn't required by the current security tests.
896
- */
897
- /**
898
- * Type guard for plain JSON-decoded objects. Excludes `null` (which is
899
- * `typeof === 'object'`) and arrays so consumers can index by string key
900
- * without a separate runtime check.
901
- */
902
- function isPlainObject(value) {
903
- return typeof value === 'object' && value !== null && !Array.isArray(value);
904
- }
905
- /** True for an IPv4 dotted-quad or a (bracketed) IPv6 literal — hosts with no subdomains. */
906
928
  /**
907
929
  * Headers whose VALUE is a credential. Listing them is useful; printing them
908
930
  * hands whoever reads the log a working key.