serverless-offline 8.8.1 → 9.0.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 (235) hide show
  1. package/README.md +3 -3
  2. package/package.json +33 -57
  3. package/src/ServerlessOffline.js +412 -0
  4. package/src/config/commandOptions.js +155 -0
  5. package/src/config/constants.js +22 -0
  6. package/{dist → src}/config/defaultOptions.js +8 -17
  7. package/src/config/index.js +4 -0
  8. package/src/config/supportedRuntimes.js +47 -0
  9. package/src/events/authCanExecuteResource.js +35 -0
  10. package/src/events/authFunctionNameExtractor.js +75 -0
  11. package/src/events/authMatchPolicyResource.js +71 -0
  12. package/src/events/authValidateContext.js +51 -0
  13. package/src/events/http/Endpoint.js +135 -0
  14. package/src/events/http/Http.js +50 -0
  15. package/src/events/http/HttpEventDefinition.js +20 -0
  16. package/src/events/http/HttpServer.js +1277 -0
  17. package/src/events/http/OfflineEndpoint.js +33 -0
  18. package/src/events/http/authJWTSettingsExtractor.js +70 -0
  19. package/src/events/http/createAuthScheme.js +176 -0
  20. package/src/events/http/createJWTAuthScheme.js +106 -0
  21. package/src/events/http/index.js +1 -0
  22. package/src/events/http/javaHelpers.js +102 -0
  23. package/src/events/http/lambda-events/LambdaIntegrationEvent.js +57 -0
  24. package/src/events/http/lambda-events/LambdaProxyIntegrationEvent.js +233 -0
  25. package/src/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +190 -0
  26. package/src/events/http/lambda-events/VelocityContext.js +147 -0
  27. package/src/events/http/lambda-events/index.js +4 -0
  28. package/src/events/http/lambda-events/renderVelocityTemplateObject.js +93 -0
  29. package/{dist → src}/events/http/parseResources.js +73 -78
  30. package/src/events/http/payloadSchemaValidator.js +13 -0
  31. package/{dist → src}/events/http/templates/offline-default.req.vm +0 -0
  32. package/{dist → src}/events/http/templates/offline-default.res.vm +0 -0
  33. package/src/events/schedule/Schedule.js +131 -0
  34. package/src/events/schedule/ScheduleEvent.js +18 -0
  35. package/src/events/schedule/ScheduleEventDefinition.js +21 -0
  36. package/src/events/schedule/index.js +1 -0
  37. package/src/events/websocket/HttpServer.js +69 -0
  38. package/src/events/websocket/WebSocket.js +52 -0
  39. package/src/events/websocket/WebSocketClients.js +462 -0
  40. package/src/events/websocket/WebSocketEventDefinition.js +18 -0
  41. package/src/events/websocket/WebSocketServer.js +73 -0
  42. package/src/events/websocket/http-routes/_catchAll/catchAllRoute.js +16 -0
  43. package/src/events/websocket/http-routes/_catchAll/index.js +1 -0
  44. package/src/events/websocket/http-routes/connections/ConnectionsController.js +28 -0
  45. package/src/events/websocket/http-routes/connections/connectionsRoutes.js +70 -0
  46. package/src/events/websocket/http-routes/connections/index.js +1 -0
  47. package/src/events/websocket/http-routes/index.js +2 -0
  48. package/src/events/websocket/index.js +1 -0
  49. package/src/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +65 -0
  50. package/src/events/websocket/lambda-events/WebSocketConnectEvent.js +68 -0
  51. package/src/events/websocket/lambda-events/WebSocketDisconnectEvent.js +31 -0
  52. package/src/events/websocket/lambda-events/WebSocketEvent.js +29 -0
  53. package/src/events/websocket/lambda-events/WebSocketRequestContext.js +67 -0
  54. package/src/events/websocket/lambda-events/index.js +4 -0
  55. package/src/index.js +12 -0
  56. package/src/lambda/HttpServer.js +108 -0
  57. package/src/lambda/Lambda.js +68 -0
  58. package/src/lambda/LambdaContext.js +33 -0
  59. package/src/lambda/LambdaFunction.js +308 -0
  60. package/src/lambda/LambdaFunctionPool.js +109 -0
  61. package/src/lambda/__tests__/LambdaContext.test.js +30 -0
  62. package/src/lambda/__tests__/LambdaFunction.test.js +196 -0
  63. package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsJSONObject.fixture.js +47 -0
  64. package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsNativeString.fixture.js +46 -0
  65. package/src/lambda/__tests__/fixtures/Lambda/package.json +3 -0
  66. package/src/lambda/__tests__/fixtures/lambdaFunction.fixture.js +145 -0
  67. package/src/lambda/__tests__/fixtures/package.json +3 -0
  68. package/src/lambda/__tests__/routes/invocations/InvocationsController.test.js +42 -0
  69. package/src/lambda/handler-runner/HandlerRunner.js +136 -0
  70. package/src/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +72 -0
  71. package/src/lambda/handler-runner/child-process-runner/childProcessHelper.js +42 -0
  72. package/src/lambda/handler-runner/child-process-runner/index.js +1 -0
  73. package/src/lambda/handler-runner/docker-runner/DockerContainer.js +417 -0
  74. package/src/lambda/handler-runner/docker-runner/DockerImage.js +35 -0
  75. package/src/lambda/handler-runner/docker-runner/DockerRunner.js +63 -0
  76. package/src/lambda/handler-runner/docker-runner/index.js +1 -0
  77. package/src/lambda/handler-runner/go-runner/GoRunner.js +166 -0
  78. package/src/lambda/handler-runner/go-runner/index.js +1 -0
  79. package/src/lambda/handler-runner/in-process-runner/InProcessRunner.js +125 -0
  80. package/src/lambda/handler-runner/in-process-runner/index.js +1 -0
  81. package/src/lambda/handler-runner/index.js +1 -0
  82. package/src/lambda/handler-runner/java-runner/JavaRunner.js +114 -0
  83. package/src/lambda/handler-runner/java-runner/index.js +1 -0
  84. package/src/lambda/handler-runner/python-runner/PythonRunner.js +138 -0
  85. package/src/lambda/handler-runner/python-runner/index.js +1 -0
  86. package/{dist → src}/lambda/handler-runner/python-runner/invoke.py +0 -0
  87. package/src/lambda/handler-runner/ruby-runner/RubyRunner.js +107 -0
  88. package/src/lambda/handler-runner/ruby-runner/index.js +1 -0
  89. package/{dist → src}/lambda/handler-runner/ruby-runner/invoke.rb +0 -0
  90. package/src/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +70 -0
  91. package/src/lambda/handler-runner/worker-thread-runner/index.js +1 -0
  92. package/src/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +29 -0
  93. package/src/lambda/index.js +1 -0
  94. package/src/lambda/routes/index.js +2 -0
  95. package/src/lambda/routes/invocations/InvocationsController.js +102 -0
  96. package/src/lambda/routes/invocations/index.js +1 -0
  97. package/src/lambda/routes/invocations/invocationsRoute.js +77 -0
  98. package/src/lambda/routes/invoke-async/InvokeAsyncController.js +20 -0
  99. package/src/lambda/routes/invoke-async/index.js +1 -0
  100. package/src/lambda/routes/invoke-async/invokeAsyncRoute.js +33 -0
  101. package/src/utils/__tests__/createUniqueId.test.js +18 -0
  102. package/src/utils/__tests__/formatToClfTime.test.js +14 -0
  103. package/src/utils/__tests__/generateHapiPath.test.js +46 -0
  104. package/src/utils/__tests__/lowerCaseKeys.test.js +30 -0
  105. package/src/utils/__tests__/parseHeaders.test.js +13 -0
  106. package/src/utils/__tests__/parseMultiValueHeaders.test.js +24 -0
  107. package/src/utils/__tests__/parseMultiValueQueryStringParameters.test.js +159 -0
  108. package/src/utils/__tests__/parseQueryStringParameters.test.js +15 -0
  109. package/src/utils/__tests__/splitHandlerPathAndName.test.js +54 -0
  110. package/src/utils/__tests__/unflatten.test.js +32 -0
  111. package/src/utils/checkDockerDaemon.js +19 -0
  112. package/src/utils/checkGoVersion.js +16 -0
  113. package/src/utils/createApiKey.js +5 -0
  114. package/src/utils/createUniqueId.js +5 -0
  115. package/src/utils/detectExecutable.js +11 -0
  116. package/{dist → src}/utils/formatToClfTime.js +6 -14
  117. package/src/utils/generateHapiPath.js +26 -0
  118. package/src/utils/getHttpApiCorsConfig.js +28 -0
  119. package/src/utils/index.js +42 -0
  120. package/src/utils/jsonPath.js +13 -0
  121. package/src/utils/logRoutes.js +64 -0
  122. package/src/utils/lowerCaseKeys.js +6 -0
  123. package/src/utils/parseHeaders.js +14 -0
  124. package/src/utils/parseMultiValueHeaders.js +27 -0
  125. package/src/utils/parseMultiValueQueryStringParameters.js +31 -0
  126. package/src/utils/parseQueryStringParameters.js +15 -0
  127. package/src/utils/resolveJoins.js +29 -0
  128. package/src/utils/splitHandlerPathAndName.js +31 -0
  129. package/src/utils/unflatten.js +11 -0
  130. package/CHANGELOG.md +0 -78
  131. package/dist/ServerlessOffline.js +0 -508
  132. package/dist/config/commandOptions.js +0 -149
  133. package/dist/config/constants.js +0 -30
  134. package/dist/config/index.js +0 -55
  135. package/dist/config/supportedRuntimes.js +0 -40
  136. package/dist/debugLog.js +0 -12
  137. package/dist/events/authCanExecuteResource.js +0 -35
  138. package/dist/events/authFunctionNameExtractor.js +0 -87
  139. package/dist/events/authMatchPolicyResource.js +0 -62
  140. package/dist/events/authValidateContext.js +0 -53
  141. package/dist/events/http/Endpoint.js +0 -173
  142. package/dist/events/http/Http.js +0 -77
  143. package/dist/events/http/HttpEventDefinition.js +0 -36
  144. package/dist/events/http/HttpServer.js +0 -1370
  145. package/dist/events/http/OfflineEndpoint.js +0 -38
  146. package/dist/events/http/authJWTSettingsExtractor.js +0 -76
  147. package/dist/events/http/createAuthScheme.js +0 -184
  148. package/dist/events/http/createJWTAuthScheme.js +0 -159
  149. package/dist/events/http/index.js +0 -15
  150. package/dist/events/http/javaHelpers.js +0 -99
  151. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +0 -87
  152. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +0 -246
  153. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +0 -225
  154. package/dist/events/http/lambda-events/VelocityContext.js +0 -170
  155. package/dist/events/http/lambda-events/index.js +0 -39
  156. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +0 -111
  157. package/dist/events/http/payloadSchemaValidator.js +0 -13
  158. package/dist/events/schedule/Schedule.js +0 -183
  159. package/dist/events/schedule/ScheduleEvent.js +0 -27
  160. package/dist/events/schedule/ScheduleEventDefinition.js +0 -36
  161. package/dist/events/schedule/index.js +0 -15
  162. package/dist/events/websocket/HttpServer.js +0 -114
  163. package/dist/events/websocket/WebSocket.js +0 -78
  164. package/dist/events/websocket/WebSocketClients.js +0 -577
  165. package/dist/events/websocket/WebSocketEventDefinition.js +0 -32
  166. package/dist/events/websocket/WebSocketServer.js +0 -139
  167. package/dist/events/websocket/http-routes/_catchAll/catchAllRoute.js +0 -33
  168. package/dist/events/websocket/http-routes/_catchAll/index.js +0 -15
  169. package/dist/events/websocket/http-routes/connections/ConnectionsController.js +0 -45
  170. package/dist/events/websocket/http-routes/connections/connectionsRoutes.js +0 -95
  171. package/dist/events/websocket/http-routes/connections/index.js +0 -15
  172. package/dist/events/websocket/http-routes/index.js +0 -23
  173. package/dist/events/websocket/index.js +0 -15
  174. package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +0 -99
  175. package/dist/events/websocket/lambda-events/WebSocketConnectEvent.js +0 -101
  176. package/dist/events/websocket/lambda-events/WebSocketDisconnectEvent.js +0 -47
  177. package/dist/events/websocket/lambda-events/WebSocketEvent.js +0 -54
  178. package/dist/events/websocket/lambda-events/WebSocketRequestContext.js +0 -98
  179. package/dist/events/websocket/lambda-events/index.js +0 -39
  180. package/dist/index.js +0 -15
  181. package/dist/lambda/HttpServer.js +0 -124
  182. package/dist/lambda/Lambda.js +0 -117
  183. package/dist/lambda/LambdaContext.js +0 -53
  184. package/dist/lambda/LambdaFunction.js +0 -390
  185. package/dist/lambda/LambdaFunctionPool.js +0 -127
  186. package/dist/lambda/handler-runner/HandlerRunner.js +0 -195
  187. package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +0 -124
  188. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +0 -49
  189. package/dist/lambda/handler-runner/child-process-runner/index.js +0 -15
  190. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +0 -515
  191. package/dist/lambda/handler-runner/docker-runner/DockerImage.js +0 -67
  192. package/dist/lambda/handler-runner/docker-runner/DockerRunner.js +0 -74
  193. package/dist/lambda/handler-runner/docker-runner/index.js +0 -15
  194. package/dist/lambda/handler-runner/go-runner/GoRunner.js +0 -230
  195. package/dist/lambda/handler-runner/go-runner/index.js +0 -15
  196. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +0 -228
  197. package/dist/lambda/handler-runner/in-process-runner/index.js +0 -15
  198. package/dist/lambda/handler-runner/index.js +0 -15
  199. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +0 -153
  200. package/dist/lambda/handler-runner/java-runner/index.js +0 -15
  201. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +0 -185
  202. package/dist/lambda/handler-runner/python-runner/index.js +0 -15
  203. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +0 -147
  204. package/dist/lambda/handler-runner/ruby-runner/index.js +0 -15
  205. package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -92
  206. package/dist/lambda/handler-runner/worker-thread-runner/index.js +0 -15
  207. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +0 -31
  208. package/dist/lambda/index.js +0 -15
  209. package/dist/lambda/routes/index.js +0 -23
  210. package/dist/lambda/routes/invocations/InvocationsController.js +0 -142
  211. package/dist/lambda/routes/invocations/index.js +0 -15
  212. package/dist/lambda/routes/invocations/invocationsRoute.js +0 -90
  213. package/dist/lambda/routes/invoke-async/InvokeAsyncController.js +0 -38
  214. package/dist/lambda/routes/invoke-async/index.js +0 -15
  215. package/dist/lambda/routes/invoke-async/invokeAsyncRoute.js +0 -43
  216. package/dist/main.js +0 -11
  217. package/dist/serverlessLog.js +0 -91
  218. package/dist/utils/checkDockerDaemon.js +0 -27
  219. package/dist/utils/checkGoVersion.js +0 -27
  220. package/dist/utils/createApiKey.js +0 -12
  221. package/dist/utils/createUniqueId.js +0 -14
  222. package/dist/utils/detectExecutable.js +0 -21
  223. package/dist/utils/generateHapiPath.js +0 -28
  224. package/dist/utils/getHttpApiCorsConfig.js +0 -40
  225. package/dist/utils/index.js +0 -165
  226. package/dist/utils/jsonPath.js +0 -21
  227. package/dist/utils/lowerCaseKeys.js +0 -14
  228. package/dist/utils/parseHeaders.js +0 -23
  229. package/dist/utils/parseMultiValueHeaders.js +0 -36
  230. package/dist/utils/parseMultiValueQueryStringParameters.js +0 -40
  231. package/dist/utils/parseQueryStringParameters.js +0 -26
  232. package/dist/utils/resolveJoins.js +0 -36
  233. package/dist/utils/satisfiesVersionRange.js +0 -20
  234. package/dist/utils/splitHandlerPathAndName.js +0 -37
  235. package/dist/utils/unflatten.js +0 -18
@@ -1,38 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- class OfflineEndpoint {
9
- constructor() {
10
- this.apiKeyRequired = false;
11
- this.authorizationType = 'none';
12
- this.authorizerFunction = false;
13
- this.path = '';
14
- this.requestParameters = {};
15
- this.requestTemplates = {
16
- 'application/json': ''
17
- };
18
- this.responses = {
19
- default: {
20
- 400: {
21
- statusCode: '400'
22
- },
23
- responseModels: {
24
- 'application/json;charset=UTF-8': 'Empty'
25
- },
26
- responseParameters: {},
27
- responseTemplates: {
28
- 'application/json;charset=UTF-8': ''
29
- },
30
- statusCode: 200
31
- }
32
- };
33
- this.type = 'AWS';
34
- }
35
-
36
- }
37
-
38
- exports.default = OfflineEndpoint;
@@ -1,76 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = authJWTSettingsExtractor;
7
-
8
- var _serverlessLog = _interopRequireDefault(require("../../serverlessLog.js"));
9
-
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
-
12
- function authJWTSettingsExtractor(endpoint, provider, ignoreJWTSignature, {
13
- log
14
- }) {
15
- const buildFailureResult = warningMessage => {
16
- if (log) {
17
- log.warning(warningMessage);
18
- } else {
19
- (0, _serverlessLog.default)(`WARNING: ${warningMessage}`);
20
- }
21
-
22
- return {
23
- unsupportedAuth: true
24
- };
25
- };
26
-
27
- const buildSuccessResult = authorizerName => ({
28
- authorizerName
29
- });
30
-
31
- const {
32
- authorizer
33
- } = endpoint;
34
-
35
- if (!authorizer) {
36
- return buildSuccessResult(null);
37
- }
38
-
39
- if (!provider.httpApi || !provider.httpApi.authorizers) {
40
- return buildSuccessResult(null);
41
- } // TODO: add code that will actually validate a JWT.
42
-
43
-
44
- if (!ignoreJWTSignature) {
45
- return buildSuccessResult(null);
46
- }
47
-
48
- if (!authorizer.name) {
49
- return buildFailureResult('Serverless Offline supports only JWT authorizers referenced by name');
50
- }
51
-
52
- const httpApiAuthorizer = provider.httpApi.authorizers[authorizer.name];
53
-
54
- if (!httpApiAuthorizer) {
55
- return buildFailureResult(`JWT authorizer ${authorizer.name} not found`);
56
- }
57
-
58
- if (!httpApiAuthorizer.identitySource) {
59
- return buildFailureResult(`JWT authorizer ${authorizer.name} missing identity source`);
60
- }
61
-
62
- if (!httpApiAuthorizer.issuerUrl) {
63
- return buildFailureResult(`JWT authorizer ${authorizer.name} missing issuer url`);
64
- }
65
-
66
- if (!httpApiAuthorizer.audience || httpApiAuthorizer.audience.length === 0) {
67
- return buildFailureResult(`JWT authorizer ${authorizer.name} missing audience`);
68
- }
69
-
70
- const result = {
71
- authorizerName: authorizer.name,
72
- ...authorizer,
73
- ...httpApiAuthorizer
74
- };
75
- return result;
76
- }
@@ -1,184 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = createAuthScheme;
7
-
8
- var _boom = _interopRequireDefault(require("@hapi/boom"));
9
-
10
- var _authCanExecuteResource = _interopRequireDefault(require("../authCanExecuteResource.js"));
11
-
12
- var _authValidateContext = _interopRequireDefault(require("../authValidateContext.js"));
13
-
14
- var _debugLog = _interopRequireDefault(require("../../debugLog.js"));
15
-
16
- var _serverlessLog = _interopRequireDefault(require("../../serverlessLog.js"));
17
-
18
- var _index = require("../../utils/index.js");
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
- function createAuthScheme(authorizerOptions, provider, lambda, {
23
- log
24
- }) {
25
- const authFunName = authorizerOptions.name;
26
- let identityHeader = 'authorization';
27
-
28
- if (authorizerOptions.type !== 'request') {
29
- const identitySourceMatch = /^method.request.header.((?:\w+-?)+\w+)$/.exec(authorizerOptions.identitySource);
30
-
31
- if (!identitySourceMatch || identitySourceMatch.length !== 2) {
32
- throw new Error(`Serverless Offline only supports retrieving tokens from the headers (λ: ${authFunName})`);
33
- }
34
-
35
- identityHeader = identitySourceMatch[1].toLowerCase();
36
- } // Create Auth Scheme
37
-
38
-
39
- return () => ({
40
- async authenticate(request, h) {
41
- if (log) {
42
- log.notice();
43
- log.notice(`Running Authorization function for ${request.method} ${request.path} (λ: ${authFunName})`);
44
- } else {
45
- console.log(''); // Just to make things a little pretty
46
-
47
- (0, _serverlessLog.default)(`Running Authorization function for ${request.method} ${request.path} (λ: ${authFunName})`);
48
- } // Get Authorization header
49
-
50
-
51
- const {
52
- req
53
- } = request.raw; // Get path params
54
- // aws doesn't auto decode path params - hapi does
55
-
56
- const pathParams = { ...request.params
57
- };
58
- const accountId = 'random-account-id';
59
- const apiId = 'random-api-id';
60
- const httpMethod = request.method.toUpperCase();
61
- const resourcePath = request.route.path.replace(new RegExp(`^/${provider.stage}`), '');
62
- let event = {
63
- enhancedAuthContext: {},
64
- methodArn: `arn:aws:execute-api:${provider.region}:${accountId}:${apiId}/${provider.stage}/${httpMethod}${resourcePath}`,
65
- requestContext: {
66
- accountId,
67
- apiId,
68
- httpMethod,
69
- requestId: 'random-request-id',
70
- resourceId: 'random-resource-id',
71
- resourcePath,
72
- path: request.path,
73
- stage: provider.stage
74
- },
75
- resource: resourcePath
76
- }; // Create event Object for authFunction
77
- // methodArn is the ARN of the function we are running we are authorizing access to (or not)
78
- // Account ID and API ID are not simulated
79
-
80
- if (authorizerOptions.type === 'request') {
81
- const {
82
- rawHeaders,
83
- url
84
- } = req;
85
- event = { ...event,
86
- headers: (0, _index.parseHeaders)(rawHeaders),
87
- httpMethod: request.method.toUpperCase(),
88
- multiValueHeaders: (0, _index.parseMultiValueHeaders)(rawHeaders),
89
- multiValueQueryStringParameters: (0, _index.parseMultiValueQueryStringParameters)(url),
90
- path: request.path,
91
- pathParameters: (0, _index.nullIfEmpty)(pathParams),
92
- queryStringParameters: (0, _index.parseQueryStringParameters)(url),
93
- type: 'REQUEST'
94
- };
95
- } else {
96
- const authorization = req.headers[identityHeader];
97
- const identityValidationExpression = new RegExp(authorizerOptions.identityValidationExpression);
98
- const matchedAuthorization = identityValidationExpression.test(authorization);
99
- const finalAuthorization = matchedAuthorization ? authorization : '';
100
-
101
- if (log) {
102
- log.debug(`Retrieved ${identityHeader} header "${finalAuthorization}"`);
103
- } else {
104
- (0, _debugLog.default)(`Retrieved ${identityHeader} header "${finalAuthorization}"`);
105
- }
106
-
107
- event = { ...event,
108
- authorizationToken: finalAuthorization,
109
- type: 'TOKEN'
110
- };
111
- }
112
-
113
- const lambdaFunction = lambda.get(authFunName);
114
- lambdaFunction.setEvent(event);
115
-
116
- try {
117
- const result = await lambdaFunction.runHandler();
118
- if (result === 'Unauthorized') return _boom.default.unauthorized('Unauthorized'); // Validate that the policy document has the principalId set
119
-
120
- if (!result.principalId) {
121
- if (log) {
122
- log.notice(`Authorization response did not include a principalId: (λ: ${authFunName})`);
123
- } else {
124
- (0, _serverlessLog.default)(`Authorization response did not include a principalId: (λ: ${authFunName})`);
125
- }
126
-
127
- return _boom.default.forbidden('No principalId set on the Response');
128
- }
129
-
130
- if (!(0, _authCanExecuteResource.default)(result.policyDocument, event.methodArn)) {
131
- if (log) {
132
- log.notice(`Authorization response didn't authorize user to access resource: (λ: ${authFunName})`);
133
- } else {
134
- (0, _serverlessLog.default)(`Authorization response didn't authorize user to access resource: (λ: ${authFunName})`);
135
- }
136
-
137
- return _boom.default.forbidden('User is not authorized to access this resource');
138
- } // validate the resulting context, ensuring that all
139
- // values are either string, number, or boolean types
140
-
141
-
142
- if (result.context) {
143
- const validationResult = (0, _authValidateContext.default)(result.context, authFunName);
144
-
145
- if (validationResult instanceof Error) {
146
- return validationResult;
147
- }
148
-
149
- result.context = validationResult;
150
- }
151
-
152
- if (log) {
153
- log.notice(`Authorization function returned a successful response: (λ: ${authFunName})`);
154
- } else {
155
- (0, _serverlessLog.default)(`Authorization function returned a successful response: (λ: ${authFunName})`);
156
- }
157
-
158
- const authorizer = {
159
- integrationLatency: '42',
160
- principalId: result.principalId,
161
- ...result.context
162
- }; // Set the credentials for the rest of the pipeline
163
-
164
- return h.authenticated({
165
- credentials: {
166
- authorizer,
167
- context: result.context,
168
- principalId: result.principalId,
169
- usageIdentifierKey: result.usageIdentifierKey
170
- }
171
- });
172
- } catch (err) {
173
- if (log) {
174
- log.notice(`Authorization function returned an error response: (λ: ${authFunName})`);
175
- } else {
176
- (0, _serverlessLog.default)(`Authorization function returned an error response: (λ: ${authFunName})`);
177
- }
178
-
179
- return _boom.default.unauthorized('Unauthorized');
180
- }
181
- }
182
-
183
- });
184
- }
@@ -1,159 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = createAuthScheme;
7
-
8
- var _boom = _interopRequireDefault(require("@hapi/boom"));
9
-
10
- var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
11
-
12
- var _serverlessLog = _interopRequireDefault(require("../../serverlessLog.js"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- const {
17
- isArray
18
- } = Array;
19
-
20
- function createAuthScheme(jwtOptions, {
21
- log
22
- }) {
23
- const authorizerName = jwtOptions.name;
24
- const identitySourceMatch = /^\$request.header.((?:\w+-?)+\w+)$/.exec(jwtOptions.identitySource);
25
-
26
- if (!identitySourceMatch || identitySourceMatch.length !== 2) {
27
- throw new Error(`Serverless Offline only supports retrieving JWT from the headers (${authorizerName})`);
28
- }
29
-
30
- const identityHeader = identitySourceMatch[1].toLowerCase(); // Create Auth Scheme
31
-
32
- return () => ({
33
- async authenticate(request, h) {
34
- if (log) {
35
- log.notice();
36
- log.notice(`Running JWT Authorization function for ${request.method} ${request.path} (${authorizerName})`);
37
- } else {
38
- console.log(''); // Just to make things a little pretty
39
- // TODO: this only validates specific properties of the JWT
40
- // it does not verify the JWT is correctly signed. That would
41
- // be a great feature to add under an optional flag :)
42
-
43
- (0, _serverlessLog.default)(`Running JWT Authorization function for ${request.method} ${request.path} (${authorizerName})`);
44
- } // Get Authorization header
45
-
46
-
47
- const {
48
- req
49
- } = request.raw;
50
- let jwtToken = req.headers[identityHeader];
51
-
52
- if (jwtToken && jwtToken.split(' ')[0] === 'Bearer') {
53
- ;
54
- [, jwtToken] = jwtToken.split(' ');
55
- }
56
-
57
- try {
58
- const decoded = _jsonwebtoken.default.decode(jwtToken, {
59
- complete: true
60
- });
61
-
62
- if (!decoded) {
63
- return _boom.default.unauthorized('JWT not decoded');
64
- }
65
-
66
- const expirationDate = new Date(decoded.payload.exp * 1000);
67
-
68
- if (expirationDate.valueOf() < Date.now()) {
69
- return _boom.default.unauthorized('JWT Token expired');
70
- }
71
-
72
- const {
73
- iss,
74
- aud,
75
- scope
76
- } = decoded.payload;
77
- const clientId = decoded.payload.client_id;
78
-
79
- if (iss !== jwtOptions.issuerUrl) {
80
- if (log) {
81
- log.notice(`JWT Token not from correct issuer url`);
82
- } else {
83
- (0, _serverlessLog.default)(`JWT Token not from correct issuer url`);
84
- }
85
-
86
- return _boom.default.unauthorized('JWT Token not from correct issuer url');
87
- }
88
-
89
- const validAudiences = isArray(jwtOptions.audience) ? jwtOptions.audience : [jwtOptions.audience];
90
- const providedAudiences = isArray(aud) ? aud : [aud];
91
- const validAudienceProvided = providedAudiences.some(a => validAudiences.includes(a));
92
-
93
- if (!validAudienceProvided && !validAudiences.includes(clientId)) {
94
- if (log) {
95
- log.notice(`JWT Token does not contain correct audience`);
96
- } else {
97
- (0, _serverlessLog.default)(`JWT Token does not contain correct audience`);
98
- }
99
-
100
- return _boom.default.unauthorized('JWT Token does not contain correct audience');
101
- }
102
-
103
- let scopes = null;
104
-
105
- if (jwtOptions.scopes && jwtOptions.scopes.length) {
106
- if (!scope) {
107
- if (log) {
108
- log.notice(`JWT Token missing valid scope`);
109
- } else {
110
- (0, _serverlessLog.default)(`JWT Token missing valid scope`);
111
- }
112
-
113
- return _boom.default.forbidden('JWT Token missing valid scope');
114
- }
115
-
116
- scopes = scope.split(' ');
117
-
118
- if (scopes.every(s => {
119
- return !jwtOptions.scopes.includes(s);
120
- })) {
121
- if (log) {
122
- log.notice(`JWT Token missing valid scope`);
123
- } else {
124
- (0, _serverlessLog.default)(`JWT Token missing valid scope`);
125
- }
126
-
127
- return _boom.default.forbidden('JWT Token missing valid scope');
128
- }
129
- }
130
-
131
- if (log) {
132
- log.notice(`JWT Token validated`);
133
- } else {
134
- (0, _serverlessLog.default)(`JWT Token validated`);
135
- } // Set the credentials for the rest of the pipeline
136
- // return resolve(
137
-
138
-
139
- return h.authenticated({
140
- credentials: {
141
- claims: decoded.payload,
142
- scopes
143
- }
144
- });
145
- } catch (err) {
146
- if (log) {
147
- log.notice(`JWT could not be decoded`);
148
- log.error(err);
149
- } else {
150
- (0, _serverlessLog.default)(`JWT could not be decoded`);
151
- (0, _serverlessLog.default)(err);
152
- }
153
-
154
- return _boom.default.unauthorized('Unauthorized');
155
- }
156
- }
157
-
158
- });
159
- }
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _Http.default;
10
- }
11
- });
12
-
13
- var _Http = _interopRequireDefault(require("./Http.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,99 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = runInPollutedScope;
7
-
8
- // String functions
9
- // For velocity templates to access java functions, to mimick AWS
10
- function javaContains(value) {
11
- return this.includes(value);
12
- }
13
-
14
- function javaEquals(anObject) {
15
- return this.toString() === anObject.toString();
16
- }
17
-
18
- function javaEqualsIgnoreCase(anotherString) {
19
- return anotherString === null ? false : this === anotherString || this.toLowerCase() === anotherString.toLowerCase();
20
- }
21
-
22
- function javaMatches(value) {
23
- return this.match(new RegExp(value, 'm'));
24
- }
25
-
26
- function javaReplaceAll(oldValue, newValue) {
27
- return this.replace(new RegExp(oldValue, 'gm'), newValue);
28
- }
29
-
30
- function javaReplaceFirst(oldValue, newValue) {
31
- return this.replace(new RegExp(oldValue, 'm'), newValue);
32
- } // method has 2 function signatures:
33
- // regionMatches(toffset: number, other: string, ooffset: number, len: number): boolean
34
- // regionMatches(ignoreCase: boolean, toffset: number, other: string, ooffset: number, len: number): boolean
35
-
36
-
37
- function javaRegionMatches(...args) {
38
- let ignoreCase;
39
- let toffset;
40
- let other;
41
- let ooffset;
42
- let len;
43
-
44
- if (args.length === 4) {
45
- ;
46
- [toffset, other, ooffset, len] = args;
47
- ignoreCase = false;
48
- } else {
49
- ;
50
- [ignoreCase, toffset, other, ooffset, len] = args;
51
- } // Note: toffset, ooffset, or len might be near -1>>>1.
52
-
53
-
54
- if (ooffset < 0 || toffset < 0 || toffset > this.length - len || ooffset > other.length - len) {
55
- return false;
56
- }
57
-
58
- let s1 = this.substring(toffset, toffset + len);
59
- let s2 = other.substring(ooffset, ooffset + len);
60
-
61
- if (ignoreCase) {
62
- s1 = s1.toLowerCase();
63
- s2 = s2.toLowerCase();
64
- }
65
-
66
- return s1 === s2;
67
- }
68
-
69
- const {
70
- prototype,
71
- prototype: {
72
- contains,
73
- equals,
74
- equalsIgnoreCase,
75
- matches,
76
- regionMatches,
77
- replaceAll,
78
- replaceFirst
79
- }
80
- } = String;
81
-
82
- function runInPollutedScope(runScope) {
83
- prototype.contains = javaContains;
84
- prototype.equals = javaEquals;
85
- prototype.equalsIgnoreCase = javaEqualsIgnoreCase;
86
- prototype.matches = javaMatches;
87
- prototype.regionMatches = javaRegionMatches;
88
- prototype.replaceAll = javaReplaceAll;
89
- prototype.replaceFirst = javaReplaceFirst;
90
- const result = runScope();
91
- prototype.contains = contains;
92
- prototype.equals = equals;
93
- prototype.equalsIgnoreCase = equalsIgnoreCase;
94
- prototype.matches = matches;
95
- prototype.regionMatches = regionMatches;
96
- prototype.replaceAll = replaceAll;
97
- prototype.replaceFirst = replaceFirst;
98
- return result;
99
- }
@@ -1,87 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _process = require("process");
9
-
10
- var _renderVelocityTemplateObject = _interopRequireDefault(require("./renderVelocityTemplateObject.js"));
11
-
12
- var _VelocityContext = _interopRequireDefault(require("./VelocityContext.js"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
17
-
18
- var id = 0;
19
-
20
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
21
-
22
- const {
23
- parse
24
- } = JSON;
25
-
26
- var _path = /*#__PURE__*/_classPrivateFieldLooseKey("path");
27
-
28
- var _request = /*#__PURE__*/_classPrivateFieldLooseKey("request");
29
-
30
- var _requestTemplate = /*#__PURE__*/_classPrivateFieldLooseKey("requestTemplate");
31
-
32
- var _stage = /*#__PURE__*/_classPrivateFieldLooseKey("stage");
33
-
34
- class LambdaIntegrationEvent {
35
- constructor(request, stage, requestTemplate, path, v3Utils) {
36
- Object.defineProperty(this, _path, {
37
- writable: true,
38
- value: null
39
- });
40
- Object.defineProperty(this, _request, {
41
- writable: true,
42
- value: null
43
- });
44
- Object.defineProperty(this, _requestTemplate, {
45
- writable: true,
46
- value: null
47
- });
48
- Object.defineProperty(this, _stage, {
49
- writable: true,
50
- value: null
51
- });
52
- _classPrivateFieldLooseBase(this, _path)[_path] = path;
53
- _classPrivateFieldLooseBase(this, _request)[_request] = request;
54
- _classPrivateFieldLooseBase(this, _requestTemplate)[_requestTemplate] = requestTemplate;
55
- _classPrivateFieldLooseBase(this, _stage)[_stage] = stage;
56
- this.v3Utils = v3Utils;
57
- }
58
-
59
- create() {
60
- if (_process.env.AUTHORIZER) {
61
- try {
62
- const authorizerContext = parse(_process.env.AUTHORIZER);
63
-
64
- if (authorizerContext) {
65
- _classPrivateFieldLooseBase(this, _request)[_request].auth = { ..._classPrivateFieldLooseBase(this, _request)[_request].auth,
66
- credentials: {
67
- authorizer: authorizerContext
68
- }
69
- };
70
- }
71
- } catch (error) {
72
- if (this.log) {
73
- this.log.error('Could not parse process.env.AUTHORIZER, make sure it is correct JSON');
74
- } else {
75
- console.error('Serverless-offline: Could not parse process.env.AUTHORIZER, make sure it is correct JSON.');
76
- }
77
- }
78
- }
79
-
80
- const velocityContext = new _VelocityContext.default(_classPrivateFieldLooseBase(this, _request)[_request], _classPrivateFieldLooseBase(this, _stage)[_stage], _classPrivateFieldLooseBase(this, _request)[_request].payload || {}, _classPrivateFieldLooseBase(this, _path)[_path]).getContext();
81
- const event = (0, _renderVelocityTemplateObject.default)(_classPrivateFieldLooseBase(this, _requestTemplate)[_requestTemplate], velocityContext, this.v3Utils);
82
- return event;
83
- }
84
-
85
- }
86
-
87
- exports.default = LambdaIntegrationEvent;