alado 3.2.3 → 3.5.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 (35) hide show
  1. package/README.md +15 -6
  2. package/dist/alado-server/alado-server.js +4 -1
  3. package/dist/alado-server/alado-server.js.map +1 -1
  4. package/dist/constants/http-server.d.ts +1 -0
  5. package/dist/constants/http-server.js +2 -1
  6. package/dist/constants/http-server.js.map +1 -1
  7. package/dist/dto/property-definition.d.ts +1 -0
  8. package/dist/helpers/parser/access-control-checker.js +11 -3
  9. package/dist/helpers/parser/access-control-checker.js.map +1 -1
  10. package/dist/helpers/parser/body-parser.d.ts +14 -0
  11. package/dist/helpers/parser/body-parser.js +76 -17
  12. package/dist/helpers/parser/body-parser.js.map +1 -1
  13. package/dist/helpers/validate/alado-options/validate-alado-options.js +15 -0
  14. package/dist/helpers/validate/alado-options/validate-alado-options.js.map +1 -1
  15. package/dist/helpers/validate/built-in/validator.js +4 -1
  16. package/dist/helpers/validate/built-in/validator.js.map +1 -1
  17. package/dist/helpers/validate/context/file-signature.d.ts +5 -0
  18. package/dist/helpers/validate/context/file-signature.js +57 -0
  19. package/dist/helpers/validate/context/file-signature.js.map +1 -0
  20. package/dist/helpers/validate/context/validate-context.js +4 -1
  21. package/dist/helpers/validate/context/validate-context.js.map +1 -1
  22. package/dist/helpers/validate/context/validate-request-files.js +6 -1
  23. package/dist/helpers/validate/context/validate-request-files.js.map +1 -1
  24. package/dist/helpers/validate/context/validate-request-part.js +126 -49
  25. package/dist/helpers/validate/context/validate-request-part.js.map +1 -1
  26. package/dist/options/alado-server-options.d.ts +2 -0
  27. package/dist/options/request-processor-options.d.ts +1 -0
  28. package/dist/options/router-options.d.ts +1 -0
  29. package/dist/request-processor/request-processor.d.ts +14 -4
  30. package/dist/request-processor/request-processor.js +240 -88
  31. package/dist/request-processor/request-processor.js.map +1 -1
  32. package/dist/router/router.d.ts +14 -0
  33. package/dist/router/router.js +86 -13
  34. package/dist/router/router.js.map +1 -1
  35. package/package.json +1 -1
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateRequestFiles = validateRequestFiles;
4
+ const file_signature_1 = require("./file-signature");
4
5
  function validateRequestFiles(context, request) {
5
6
  const { files } = context.request;
6
7
  if (files) {
7
8
  for (const file in files) {
8
- const { required, mimetypes, maxSize, requiredError, maxSizeError, mimetypeError } = files[file];
9
+ const { required, mimetypes, maxSize, requiredError, maxSizeError, mimetypeError, verifyContent } = files[file];
9
10
  if (required && (!request.files || !request.files[file])) {
10
11
  return requiredError;
11
12
  }
@@ -23,6 +24,10 @@ function validateRequestFiles(context, request) {
23
24
  if (size > maxSize) {
24
25
  return maxSizeError;
25
26
  }
27
+ // the declared type is the client's word; the first bytes have to agree with it
28
+ if (verifyContent !== false && !(0, file_signature_1.matchesFileSignature)(mimetype, file_signature_1.uploadedFileHeads.get(uploaded))) {
29
+ return mimetypeError;
30
+ }
26
31
  }
27
32
  if (!context.options?.allowUnknownFields) {
28
33
  for (const f in request.files) {
@@ -1 +1 @@
1
- {"version":3,"file":"validate-request-files.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-files.ts"],"names":[],"mappings":";;AAEA,oDAiCC;AAjCD,SAAgB,oBAAoB,CAAC,OAAqB,EAAE,OAAY;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACjG,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,aAAa,CAAC;gBACvB,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;gBACnB,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACd,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validate-request-files.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-files.ts"],"names":[],"mappings":";;AAGA,oDAqCC;AAvCD,qDAA2E;AAE3E,SAAgB,oBAAoB,CAAC,OAAqB,EAAE,OAAY;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAChH,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,aAAa,CAAC;gBACvB,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;gBACnB,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,gFAAgF;YAChF,IAAI,aAAa,KAAK,KAAK,IAAI,CAAC,IAAA,qCAAoB,EAAC,QAAQ,EAAE,kCAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAChG,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACd,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -1,76 +1,153 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateRequestPart = validateRequestPart;
4
- const nonProcessingRequestParts = [
4
+ const nonProcessingRequestParts = new Set([
5
5
  'files',
6
6
  'auth',
7
- ];
7
+ ]);
8
+ // parts that keep undeclared fields even when allowUnknownFields is off
9
+ const openRequestParts = new Set([
10
+ 'headers',
11
+ 'rawBody',
12
+ ]);
13
+ const hasOwn = (target, property) => target !== null && target !== undefined && Object.prototype.hasOwnProperty.call(target, property);
14
+ function isThenable(value) {
15
+ return value !== null && typeof value === 'object' && typeof value.then === 'function';
16
+ }
8
17
  function validateRequestPart(key, context, request) {
9
- if (nonProcessingRequestParts.includes(key)) {
18
+ if (nonProcessingRequestParts.has(key)) {
10
19
  return;
11
20
  }
12
- const definitions = context?.request[key] || {};
13
- if (!Object.keys(definitions).length &&
14
- !context.options?.allowUnknownFields &&
15
- ![
16
- 'headers',
17
- 'rawBody',
18
- ].includes(key)) {
19
- request[key] = {};
20
- }
21
+ const definitions = context?.request[key];
21
22
  let hasDefinitions = false;
22
- for (const _ in context.request[key]) {
23
+ for (const _ in definitions) {
23
24
  hasDefinitions = true;
24
25
  break;
25
26
  }
26
27
  if (!hasDefinitions) {
28
+ if (!context.options?.allowUnknownFields && !openRequestParts.has(key)) {
29
+ request[key] = {};
30
+ }
27
31
  return;
28
32
  }
29
33
  return validateDeclaredProperties(key, context, request);
30
34
  }
31
- async function validateDeclaredProperties(key, context, request) {
32
- for (const property in context.request[key]) {
33
- const { validation, transform, isJSON } = context.request[key][property];
34
- const { required, handler, error } = validation;
35
- if (required && (!request[key] || !Object.prototype.hasOwnProperty.apply(request[key], [property]))) {
35
+ /**
36
+ * Validates one declared property. Runs synchronously and only returns a Promise
37
+ * when the validation handler or the transform does, so plain validators cost no microtasks.
38
+ */
39
+ function validateProperty(key, property, definition, request) {
40
+ const { validation, transform, isJSON } = definition;
41
+ const { required, handler, error } = validation;
42
+ const part = request[key];
43
+ const present = hasOwn(part, property);
44
+ if (required && !present) {
45
+ return error;
46
+ }
47
+ if (!handler || !present) {
48
+ return;
49
+ }
50
+ let value = part[property];
51
+ if (isJSON && typeof value === 'string') {
52
+ try {
53
+ value = JSON.parse(value);
54
+ }
55
+ catch {
56
+ // keep the raw string
57
+ }
58
+ }
59
+ // the configured error, never the exception text (it may describe internals)
60
+ const fail = () => error;
61
+ const applyTransform = () => {
62
+ if (!transform) {
63
+ return;
64
+ }
65
+ const transformed = transform.apply(request, [value]);
66
+ if (isThenable(transformed)) {
67
+ return Promise.resolve(transformed).then((v) => {
68
+ request[key][property] = v;
69
+ return undefined;
70
+ }, fail);
71
+ }
72
+ request[key][property] = transformed;
73
+ };
74
+ try {
75
+ const isValid = handler.apply(request, [value]);
76
+ if (isThenable(isValid)) {
77
+ // a rejection or a throwing transform both end up as the configured error
78
+ return Promise.resolve(isValid)
79
+ .then((ok) => (ok ? applyTransform() : error))
80
+ .then(undefined, fail);
81
+ }
82
+ if (!isValid) {
36
83
  return error;
37
84
  }
38
- if (handler && Object.prototype.hasOwnProperty.apply(request[key], [property])) {
39
- try {
40
- let value = request[key][property];
41
- const copiedValue = request[key][property];
42
- if (isJSON && typeof value === 'string') {
43
- try {
44
- value = JSON.parse(value);
45
- }
46
- catch (e) {
47
- value = copiedValue;
48
- }
49
- }
50
- const isValid = await handler.apply(request, [value]);
51
- if (!isValid) {
52
- return error;
53
- }
54
- if (transform) {
55
- request[key][property] = await transform.apply(request, [value]);
56
- }
85
+ return applyTransform();
86
+ }
87
+ catch {
88
+ return error;
89
+ }
90
+ }
91
+ function stripUnknownFields(key, context, request) {
92
+ if (context.options?.allowUnknownFields || openRequestParts.has(key)) {
93
+ return;
94
+ }
95
+ const definitions = context.request[key];
96
+ const part = request[key];
97
+ if (part !== null && typeof part === 'object' && !Array.isArray(part) && definitions) {
98
+ // copy instead of `delete`: deleting keys turns the object into a slow dictionary-mode
99
+ // object, which the handler and JSON.stringify then pay for
100
+ let unknown = false;
101
+ for (const prop in part) {
102
+ if (!Object.prototype.hasOwnProperty.call(definitions, prop)) {
103
+ unknown = true;
104
+ break;
57
105
  }
58
- catch {
59
- // the configured error, never the exception text (it may describe internals)
60
- return error;
106
+ }
107
+ if (unknown) {
108
+ const known = {};
109
+ for (const prop in part) {
110
+ if (Object.prototype.hasOwnProperty.call(definitions, prop)) {
111
+ known[prop] = part[prop];
112
+ }
61
113
  }
114
+ request[key] = known;
62
115
  }
116
+ return;
63
117
  }
64
- if (!context.options?.allowUnknownFields) {
65
- for (const prop in request[key]) {
66
- if (![
67
- 'headers',
68
- 'rawBody',
69
- ].includes(key) &&
70
- (!context.request[key] || !Object.prototype.hasOwnProperty.apply(context.request[key], [prop]))) {
71
- delete request[key][prop];
72
- }
118
+ for (const prop in request[key]) {
119
+ if (!definitions || !Object.prototype.hasOwnProperty.call(definitions, prop)) {
120
+ delete request[key][prop];
121
+ }
122
+ }
123
+ }
124
+ async function finishAsync(key, context, request, properties, index, pending) {
125
+ let error = await pending;
126
+ if (error) {
127
+ return error;
128
+ }
129
+ for (let i = index + 1; i < properties.length; i++) {
130
+ const property = properties[i];
131
+ error = await validateProperty(key, property, context.request[key][property], request);
132
+ if (error) {
133
+ return error;
134
+ }
135
+ }
136
+ stripUnknownFields(key, context, request);
137
+ }
138
+ function validateDeclaredProperties(key, context, request) {
139
+ const definitions = context.request[key];
140
+ const properties = Object.keys(definitions);
141
+ for (let i = 0; i < properties.length; i++) {
142
+ const property = properties[i];
143
+ const result = validateProperty(key, property, definitions[property], request);
144
+ if (isThenable(result)) {
145
+ return finishAsync(key, context, request, properties, i, result);
146
+ }
147
+ if (result) {
148
+ return result;
73
149
  }
74
150
  }
151
+ stripUnknownFields(key, context, request);
75
152
  }
76
153
  //# sourceMappingURL=validate-request-part.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-request-part.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-part.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-request-part.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-part.ts"],"names":[],"mappings":"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"}
@@ -16,4 +16,6 @@ export type AladoServerOptions = {
16
16
  verbose?: boolean;
17
17
  appId?: string;
18
18
  maxBodySizeBytes?: number;
19
+ trustProxy?: boolean | number;
20
+ caseSensitiveRoutes?: boolean;
19
21
  };
@@ -9,4 +9,5 @@ export type RequestProcessorOptions = {
9
9
  logger?: AladoServerLogger;
10
10
  verbose?: boolean;
11
11
  maxBodySizeBytes?: number;
12
+ trustProxy?: boolean | number;
12
13
  };
@@ -5,4 +5,5 @@ export type RouterOptions = {
5
5
  cors: CorsOptions;
6
6
  openApiDoc?: OpenApiDoc;
7
7
  logger?: AladoServerLogger;
8
+ caseSensitiveRoutes?: boolean;
8
9
  };
@@ -2,11 +2,15 @@ import { IncomingMessage, ServerResponse } from 'http';
2
2
  import { RequestProcessorOptions } from '../options/index.js';
3
3
  import { AladoServerError, Response } from '../dto/index.js';
4
4
  /**
5
- * Maps a request URL to a Swagger UI asset name, or undefined if it is not one.
6
- * The result is always an exact entry of the swagger-ui-dist listing, so no
7
- * part of the URL ever reaches the filesystem (no `..`, no subdirectories).
5
+ * Maps a request path (already through clearRoutePath, query string removed) to a Swagger UI
6
+ * file name, or undefined if it is not one. Files are only served under the docs route; the docs
7
+ * page sets <base href="<route>/"> so its relative asset URLs resolve there. Only a docs route of
8
+ * "/" serves files from the root. The result is always an exact entry of the swagger-ui-dist
9
+ * listing, so no part of the URL ever reaches the filesystem (no `..`, no subdirectories).
8
10
  */
9
- export declare function resolveSwaggerUiFile(url: string, docsRoute: string): string | undefined;
11
+ export declare function resolveSwaggerUiFile(pathname: string, docsRoute: string): string | undefined;
12
+ /** Swagger UI's index.html, with a <base> so its relative asset URLs stay under the docs route. */
13
+ export declare function swaggerIndexHtml(html: string, docsRoute: string): string;
10
14
  /**
11
15
  * Errors that carry an HTTP status (thrown on purpose, e.g. `{ statusCode: 404,
12
16
  * message }`, or produced by the body parser) keep their status and message.
@@ -14,11 +18,17 @@ export declare function resolveSwaggerUiFile(url: string, docsRoute: string): st
14
18
  * details only go to the logger.
15
19
  */
16
20
  export declare function toClientError(e: any): AladoServerError;
21
+ export declare function clientIp(req: IncomingMessage, trustProxy?: boolean | number): string;
17
22
  export declare class RequestProcessor {
18
23
  private readonly options;
24
+ private swaggerIndex;
25
+ private swaggerInitializer;
26
+ private corsStatic?;
27
+ private corsMethods;
19
28
  constructor(requestProcessorOptions: RequestProcessorOptions);
20
29
  protected respond(res: ServerResponse, response: Response<any>, backgroundHeaders?: Record<string, string>): void;
21
30
  protected respondError(res: ServerResponse, error: AladoServerError, headers?: Record<string, string>): void;
22
31
  process(req: IncomingMessage, res: ServerResponse): Promise<void>;
32
+ protected corsHeaders(allowedMethods: string[] | undefined, origin: string): Record<string, string>;
23
33
  protected logError(e: Error): void;
24
34
  }