samlesa 2.12.3

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 (99) hide show
  1. package/.editorconfig +19 -0
  2. package/.github/FUNDING.yml +1 -0
  3. package/.idea/compiler.xml +6 -0
  4. package/.idea/deployment.xml +14 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  6. package/.idea/jsLibraryMappings.xml +6 -0
  7. package/.idea/modules.xml +8 -0
  8. package/.idea/samlify.iml +12 -0
  9. package/.idea/vcs.xml +6 -0
  10. package/.pre-commit.sh +15 -0
  11. package/.snyk +8 -0
  12. package/.travis.yml +29 -0
  13. package/LICENSE +22 -0
  14. package/Makefile +25 -0
  15. package/README.md +84 -0
  16. package/build/.idea/workspace.xml +58 -0
  17. package/build/index.js +65 -0
  18. package/build/index.js.map +1 -0
  19. package/build/src/api.js +24 -0
  20. package/build/src/api.js.map +1 -0
  21. package/build/src/binding-post.js +369 -0
  22. package/build/src/binding-post.js.map +1 -0
  23. package/build/src/binding-redirect.js +333 -0
  24. package/build/src/binding-redirect.js.map +1 -0
  25. package/build/src/binding-simplesign.js +233 -0
  26. package/build/src/binding-simplesign.js.map +1 -0
  27. package/build/src/entity-idp.js +131 -0
  28. package/build/src/entity-idp.js.map +1 -0
  29. package/build/src/entity-sp.js +97 -0
  30. package/build/src/entity-sp.js.map +1 -0
  31. package/build/src/entity.js +236 -0
  32. package/build/src/entity.js.map +1 -0
  33. package/build/src/extractor.js +370 -0
  34. package/build/src/extractor.js.map +1 -0
  35. package/build/src/flow.js +320 -0
  36. package/build/src/flow.js.map +1 -0
  37. package/build/src/libsaml.js +642 -0
  38. package/build/src/libsaml.js.map +1 -0
  39. package/build/src/metadata-idp.js +128 -0
  40. package/build/src/metadata-idp.js.map +1 -0
  41. package/build/src/metadata-sp.js +232 -0
  42. package/build/src/metadata-sp.js.map +1 -0
  43. package/build/src/metadata.js +177 -0
  44. package/build/src/metadata.js.map +1 -0
  45. package/build/src/types.js +12 -0
  46. package/build/src/types.js.map +1 -0
  47. package/build/src/urn.js +213 -0
  48. package/build/src/urn.js.map +1 -0
  49. package/build/src/utility.js +249 -0
  50. package/build/src/utility.js.map +1 -0
  51. package/build/src/validator.js +27 -0
  52. package/build/src/validator.js.map +1 -0
  53. package/index.d.ts +10 -0
  54. package/index.js +19 -0
  55. package/index.js.map +1 -0
  56. package/index.ts +28 -0
  57. package/package.json +74 -0
  58. package/qodana.yaml +29 -0
  59. package/src/.idea/modules.xml +8 -0
  60. package/src/.idea/src.iml +12 -0
  61. package/src/.idea/vcs.xml +6 -0
  62. package/src/api.ts +36 -0
  63. package/src/binding-post.ts +338 -0
  64. package/src/binding-redirect.ts +331 -0
  65. package/src/binding-simplesign.ts +231 -0
  66. package/src/entity-idp.ts +145 -0
  67. package/src/entity-sp.ts +114 -0
  68. package/src/entity.ts +243 -0
  69. package/src/extractor.ts +392 -0
  70. package/src/flow.ts +467 -0
  71. package/src/libsaml.ts +786 -0
  72. package/src/metadata-idp.ts +146 -0
  73. package/src/metadata-sp.ts +268 -0
  74. package/src/metadata.ts +166 -0
  75. package/src/types.ts +153 -0
  76. package/src/urn.ts +211 -0
  77. package/src/utility.ts +248 -0
  78. package/src/validator.ts +44 -0
  79. package/tsconfig.json +38 -0
  80. package/tslint.json +35 -0
  81. package/types/index.d.ts +10 -0
  82. package/types/src/api.d.ts +13 -0
  83. package/types/src/binding-post.d.ts +46 -0
  84. package/types/src/binding-redirect.d.ts +52 -0
  85. package/types/src/binding-simplesign.d.ts +39 -0
  86. package/types/src/entity-idp.d.ts +42 -0
  87. package/types/src/entity-sp.d.ts +36 -0
  88. package/types/src/entity.d.ts +99 -0
  89. package/types/src/extractor.d.ts +25 -0
  90. package/types/src/flow.d.ts +6 -0
  91. package/types/src/libsaml.d.ts +210 -0
  92. package/types/src/metadata-idp.d.ts +24 -0
  93. package/types/src/metadata-sp.d.ts +36 -0
  94. package/types/src/metadata.d.ts +57 -0
  95. package/types/src/types.d.ts +127 -0
  96. package/types/src/urn.d.ts +194 -0
  97. package/types/src/utility.d.ts +134 -0
  98. package/types/src/validator.d.ts +3 -0
  99. package/types.d.ts +2 -0
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.flow = flow;
7
+ const utility_js_1 = require("./utility.js");
8
+ const validator_js_1 = require("./validator.js");
9
+ const libsaml_js_1 = __importDefault(require("./libsaml.js"));
10
+ const extractor_js_1 = require("./extractor.js");
11
+ const urn_js_1 = require("./urn.js");
12
+ const bindDict = urn_js_1.wording.binding;
13
+ const urlParams = urn_js_1.wording.urlParams;
14
+ // get the default extractor fields based on the parserType
15
+ function getDefaultExtractorFields(parserType, assertion) {
16
+ switch (parserType) {
17
+ case urn_js_1.ParserType.SAMLRequest:
18
+ return extractor_js_1.loginRequestFields;
19
+ case urn_js_1.ParserType.SAMLResponse:
20
+ if (!assertion) {
21
+ // unexpected hit
22
+ throw new Error('ERR_EMPTY_ASSERTION');
23
+ }
24
+ return (0, extractor_js_1.loginResponseFields)(assertion);
25
+ case urn_js_1.ParserType.LogoutRequest:
26
+ return extractor_js_1.logoutRequestFields;
27
+ case urn_js_1.ParserType.LogoutResponse:
28
+ return extractor_js_1.logoutResponseFields;
29
+ default:
30
+ throw new Error('ERR_UNDEFINED_PARSERTYPE');
31
+ }
32
+ }
33
+ // proceed the redirect binding flow
34
+ async function redirectFlow(options) {
35
+ const { request, parserType, self, checkSignature = true, from } = options;
36
+ const { query, octetString } = request;
37
+ const { SigAlg: sigAlg, Signature: signature } = query;
38
+ const targetEntityMetadata = from.entityMeta;
39
+ // ?SAMLRequest= or ?SAMLResponse=
40
+ const direction = libsaml_js_1.default.getQueryParamByType(parserType);
41
+ const content = query[direction];
42
+ // query must contain the saml content
43
+ if (content === undefined) {
44
+ return Promise.reject('ERR_REDIRECT_FLOW_BAD_ARGS');
45
+ }
46
+ const xmlString = (0, utility_js_1.inflateString)(decodeURIComponent(content));
47
+ // validate the xml
48
+ try {
49
+ await libsaml_js_1.default.isValidXml(xmlString);
50
+ }
51
+ catch (e) {
52
+ return Promise.reject('ERR_INVALID_XML');
53
+ }
54
+ // check status based on different scenarios
55
+ await checkStatus(xmlString, parserType);
56
+ let assertion = '';
57
+ if (parserType === urlParams.samlResponse) {
58
+ // Extract assertion shortcut
59
+ const verifiedDoc = (0, extractor_js_1.extract)(xmlString, [{
60
+ key: 'assertion',
61
+ localPath: ['~Response', 'Assertion'],
62
+ attributes: [],
63
+ context: true
64
+ }]);
65
+ if (verifiedDoc && verifiedDoc.assertion) {
66
+ assertion = verifiedDoc.assertion;
67
+ }
68
+ }
69
+ const extractorFields = getDefaultExtractorFields(parserType, assertion.length > 0 ? assertion : null);
70
+ const parseResult = {
71
+ samlContent: xmlString,
72
+ sigAlg: null,
73
+ extract: (0, extractor_js_1.extract)(xmlString, extractorFields),
74
+ };
75
+ // see if signature check is required
76
+ // only verify message signature is enough
77
+ if (checkSignature) {
78
+ if (!signature || !sigAlg) {
79
+ return Promise.reject('ERR_MISSING_SIG_ALG');
80
+ }
81
+ // put the below two assignments into verifyMessageSignature function
82
+ const base64Signature = Buffer.from(decodeURIComponent(signature), 'base64');
83
+ const decodeSigAlg = decodeURIComponent(sigAlg);
84
+ const verified = libsaml_js_1.default.verifyMessageSignature(targetEntityMetadata, octetString, base64Signature, sigAlg);
85
+ if (!verified) {
86
+ // Fail to verify message signature
87
+ return Promise.reject('ERR_FAILED_MESSAGE_SIGNATURE_VERIFICATION');
88
+ }
89
+ parseResult.sigAlg = decodeSigAlg;
90
+ }
91
+ /**
92
+ * Validation part: validate the context of response after signature is verified and decrypted (optional)
93
+ */
94
+ const issuer = targetEntityMetadata.getEntityID();
95
+ const extractedProperties = parseResult.extract;
96
+ // unmatched issuer
97
+ if ((parserType === 'LogoutResponse' || parserType === 'SAMLResponse')
98
+ && extractedProperties
99
+ && extractedProperties.issuer !== issuer) {
100
+ return Promise.reject('ERR_UNMATCH_ISSUER');
101
+ }
102
+ // invalid session time
103
+ // only run the verifyTime when `SessionNotOnOrAfter` exists
104
+ if (parserType === 'SAMLResponse'
105
+ && extractedProperties.sessionIndex.sessionNotOnOrAfter
106
+ && !(0, validator_js_1.verifyTime)(undefined, extractedProperties.sessionIndex.sessionNotOnOrAfter, self.entitySetting.clockDrifts)) {
107
+ return Promise.reject('ERR_EXPIRED_SESSION');
108
+ }
109
+ // invalid time
110
+ // 2.4.1.2 https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
111
+ if (parserType === 'SAMLResponse'
112
+ && extractedProperties.conditions
113
+ && !(0, validator_js_1.verifyTime)(extractedProperties.conditions.notBefore, extractedProperties.conditions.notOnOrAfter, self.entitySetting.clockDrifts)) {
114
+ return Promise.reject('ERR_SUBJECT_UNCONFIRMED');
115
+ }
116
+ return Promise.resolve(parseResult);
117
+ }
118
+ // proceed the post flow
119
+ async function postFlow(options) {
120
+ const { request, from, self, parserType, checkSignature = true } = options;
121
+ const { body } = request;
122
+ const direction = libsaml_js_1.default.getQueryParamByType(parserType);
123
+ const encodedRequest = body[direction];
124
+ let samlContent = String((0, utility_js_1.base64Decode)(encodedRequest));
125
+ const verificationOptions = {
126
+ metadata: from.entityMeta,
127
+ signatureAlgorithm: from.entitySetting.requestSignatureAlgorithm,
128
+ };
129
+ const decryptRequired = from.entitySetting.isAssertionEncrypted;
130
+ let extractorFields = [];
131
+ // validate the xml first
132
+ await libsaml_js_1.default.isValidXml(samlContent);
133
+ if (parserType !== urlParams.samlResponse) {
134
+ extractorFields = getDefaultExtractorFields(parserType, null);
135
+ }
136
+ // check status based on different scenarios
137
+ await checkStatus(samlContent, parserType);
138
+ // verify the signatures (the response is encrypted then signed, then verify first then decrypt)
139
+ if (checkSignature &&
140
+ from.entitySetting.messageSigningOrder === urn_js_1.MessageSignatureOrder.ETS) {
141
+ const [verified, verifiedAssertionNode] = libsaml_js_1.default.verifySignature(samlContent, verificationOptions);
142
+ if (!verified) {
143
+ return Promise.reject('ERR_FAIL_TO_VERIFY_ETS_SIGNATURE');
144
+ }
145
+ if (!decryptRequired) {
146
+ extractorFields = getDefaultExtractorFields(parserType, verifiedAssertionNode);
147
+ }
148
+ }
149
+ if (parserType === 'SAMLResponse' && decryptRequired) {
150
+ const result = await libsaml_js_1.default.decryptAssertion(self, samlContent);
151
+ samlContent = result[0];
152
+ extractorFields = getDefaultExtractorFields(parserType, result[1]);
153
+ }
154
+ // verify the signatures (the response is signed then encrypted, then decrypt first then verify)
155
+ if (checkSignature &&
156
+ from.entitySetting.messageSigningOrder === urn_js_1.MessageSignatureOrder.STE) {
157
+ const [verified, verifiedAssertionNode] = libsaml_js_1.default.verifySignature(samlContent, verificationOptions);
158
+ if (verified) {
159
+ extractorFields = getDefaultExtractorFields(parserType, verifiedAssertionNode);
160
+ }
161
+ else {
162
+ return Promise.reject('ERR_FAIL_TO_VERIFY_STE_SIGNATURE');
163
+ }
164
+ }
165
+ const parseResult = {
166
+ samlContent: samlContent,
167
+ extract: (0, extractor_js_1.extract)(samlContent, extractorFields),
168
+ };
169
+ /**
170
+ * Validation part: validate the context of response after signature is verified and decrypted (optional)
171
+ */
172
+ const targetEntityMetadata = from.entityMeta;
173
+ const issuer = targetEntityMetadata.getEntityID();
174
+ const extractedProperties = parseResult.extract;
175
+ // unmatched issuer
176
+ if ((parserType === 'LogoutResponse' || parserType === 'SAMLResponse')
177
+ && extractedProperties
178
+ && extractedProperties.issuer !== issuer) {
179
+ return Promise.reject('ERR_UNMATCH_ISSUER');
180
+ }
181
+ // invalid session time
182
+ // only run the verifyTime when `SessionNotOnOrAfter` exists
183
+ if (parserType === 'SAMLResponse'
184
+ && extractedProperties.sessionIndex.sessionNotOnOrAfter
185
+ && !(0, validator_js_1.verifyTime)(undefined, extractedProperties.sessionIndex.sessionNotOnOrAfter, self.entitySetting.clockDrifts)) {
186
+ return Promise.reject('ERR_EXPIRED_SESSION');
187
+ }
188
+ // invalid time
189
+ // 2.4.1.2 https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
190
+ if (parserType === 'SAMLResponse'
191
+ && extractedProperties.conditions
192
+ && !(0, validator_js_1.verifyTime)(extractedProperties.conditions.notBefore, extractedProperties.conditions.notOnOrAfter, self.entitySetting.clockDrifts)) {
193
+ return Promise.reject('ERR_SUBJECT_UNCONFIRMED');
194
+ }
195
+ return Promise.resolve(parseResult);
196
+ }
197
+ // proceed the post simple sign binding flow
198
+ async function postSimpleSignFlow(options) {
199
+ const { request, parserType, self, checkSignature = true, from } = options;
200
+ const { body, octetString } = request;
201
+ const targetEntityMetadata = from.entityMeta;
202
+ // ?SAMLRequest= or ?SAMLResponse=
203
+ const direction = libsaml_js_1.default.getQueryParamByType(parserType);
204
+ const encodedRequest = body[direction];
205
+ const sigAlg = body['SigAlg'];
206
+ const signature = body['Signature'];
207
+ // query must contain the saml content
208
+ if (encodedRequest === undefined) {
209
+ return Promise.reject('ERR_SIMPLESIGN_FLOW_BAD_ARGS');
210
+ }
211
+ const xmlString = String((0, utility_js_1.base64Decode)(encodedRequest));
212
+ // validate the xml
213
+ try {
214
+ await libsaml_js_1.default.isValidXml(xmlString);
215
+ }
216
+ catch (e) {
217
+ return Promise.reject('ERR_INVALID_XML');
218
+ }
219
+ // check status based on different scenarios
220
+ await checkStatus(xmlString, parserType);
221
+ let assertion = '';
222
+ if (parserType === urlParams.samlResponse) {
223
+ // Extract assertion shortcut
224
+ const verifiedDoc = (0, extractor_js_1.extract)(xmlString, [{
225
+ key: 'assertion',
226
+ localPath: ['~Response', 'Assertion'],
227
+ attributes: [],
228
+ context: true
229
+ }]);
230
+ if (verifiedDoc && verifiedDoc.assertion) {
231
+ assertion = verifiedDoc.assertion;
232
+ }
233
+ }
234
+ const extractorFields = getDefaultExtractorFields(parserType, assertion.length > 0 ? assertion : null);
235
+ const parseResult = {
236
+ samlContent: xmlString,
237
+ sigAlg: null,
238
+ extract: (0, extractor_js_1.extract)(xmlString, extractorFields),
239
+ };
240
+ // see if signature check is required
241
+ // only verify message signature is enough
242
+ if (checkSignature) {
243
+ if (!signature || !sigAlg) {
244
+ return Promise.reject('ERR_MISSING_SIG_ALG');
245
+ }
246
+ // put the below two assignments into verifyMessageSignature function
247
+ const base64Signature = Buffer.from(signature, 'base64');
248
+ const verified = libsaml_js_1.default.verifyMessageSignature(targetEntityMetadata, octetString, base64Signature, sigAlg);
249
+ if (!verified) {
250
+ // Fail to verify message signature
251
+ return Promise.reject('ERR_FAILED_MESSAGE_SIGNATURE_VERIFICATION');
252
+ }
253
+ parseResult.sigAlg = sigAlg;
254
+ }
255
+ /**
256
+ * Validation part: validate the context of response after signature is verified and decrypted (optional)
257
+ */
258
+ const issuer = targetEntityMetadata.getEntityID();
259
+ const extractedProperties = parseResult.extract;
260
+ // unmatched issuer
261
+ if ((parserType === 'LogoutResponse' || parserType === 'SAMLResponse')
262
+ && extractedProperties
263
+ && extractedProperties.issuer !== issuer) {
264
+ return Promise.reject('ERR_UNMATCH_ISSUER');
265
+ }
266
+ // invalid session time
267
+ // only run the verifyTime when `SessionNotOnOrAfter` exists
268
+ if (parserType === 'SAMLResponse'
269
+ && extractedProperties.sessionIndex.sessionNotOnOrAfter
270
+ && !(0, validator_js_1.verifyTime)(undefined, extractedProperties.sessionIndex.sessionNotOnOrAfter, self.entitySetting.clockDrifts)) {
271
+ return Promise.reject('ERR_EXPIRED_SESSION');
272
+ }
273
+ // invalid time
274
+ // 2.4.1.2 https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
275
+ if (parserType === 'SAMLResponse'
276
+ && extractedProperties.conditions
277
+ && !(0, validator_js_1.verifyTime)(extractedProperties.conditions.notBefore, extractedProperties.conditions.notOnOrAfter, self.entitySetting.clockDrifts)) {
278
+ return Promise.reject('ERR_SUBJECT_UNCONFIRMED');
279
+ }
280
+ return Promise.resolve(parseResult);
281
+ }
282
+ function checkStatus(content, parserType) {
283
+ // only check response parser
284
+ if (parserType !== urlParams.samlResponse && parserType !== urlParams.logoutResponse) {
285
+ return Promise.resolve('SKIPPED');
286
+ }
287
+ const fields = parserType === urlParams.samlResponse
288
+ ? extractor_js_1.loginResponseStatusFields
289
+ : extractor_js_1.logoutResponseStatusFields;
290
+ const { top, second } = (0, extractor_js_1.extract)(content, fields);
291
+ // only resolve when top-tier status code is success
292
+ if (top === urn_js_1.StatusCode.Success) {
293
+ return Promise.resolve('OK');
294
+ }
295
+ if (!top) {
296
+ throw new Error('ERR_UNDEFINED_STATUS');
297
+ }
298
+ // returns a detailed error for two-tier error code
299
+ throw new Error(`ERR_FAILED_STATUS with top tier code: ${top}, second tier code: ${second}`);
300
+ }
301
+ function flow(options) {
302
+ const binding = options.binding;
303
+ const parserType = options.parserType;
304
+ options.supportBindings = [urn_js_1.BindingNamespace.Redirect, urn_js_1.BindingNamespace.Post, urn_js_1.BindingNamespace.SimpleSign];
305
+ // saml response allows POST, REDIRECT
306
+ if (parserType === urn_js_1.ParserType.SAMLResponse) {
307
+ options.supportBindings = [urn_js_1.BindingNamespace.Post, urn_js_1.BindingNamespace.Redirect, urn_js_1.BindingNamespace.SimpleSign];
308
+ }
309
+ if (binding === bindDict.post) {
310
+ return postFlow(options);
311
+ }
312
+ if (binding === bindDict.redirect) {
313
+ return redirectFlow(options);
314
+ }
315
+ if (binding === bindDict.simpleSign) {
316
+ return postSimpleSignFlow(options);
317
+ }
318
+ return Promise.reject('ERR_UNEXPECTED_FLOW');
319
+ }
320
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/flow.ts"],"names":[],"mappings":"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"}