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,131 @@
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.IdentityProvider = void 0;
7
+ exports.default = default_1;
8
+ /**
9
+ * @file entity-idp.ts
10
+ * @author tngan
11
+ * @desc Declares the actions taken by identity provider
12
+ */
13
+ const entity_js_1 = __importDefault(require("./entity.js"));
14
+ const libsaml_js_1 = __importDefault(require("./libsaml.js"));
15
+ const urn_js_1 = require("./urn.js");
16
+ const binding_post_js_1 = __importDefault(require("./binding-post.js"));
17
+ const binding_redirect_js_1 = __importDefault(require("./binding-redirect.js"));
18
+ const binding_simplesign_js_1 = __importDefault(require("./binding-simplesign.js"));
19
+ const flow_js_1 = require("./flow.js");
20
+ const utility_js_1 = require("./utility.js");
21
+ /**
22
+ * Identity provider can be configured using either metadata importing or idpSetting
23
+ */
24
+ function default_1(props) {
25
+ return new IdentityProvider(props);
26
+ }
27
+ /**
28
+ * Identity provider can be configured using either metadata importing or idpSetting
29
+ */
30
+ class IdentityProvider extends entity_js_1.default {
31
+ constructor(idpSetting) {
32
+ const defaultIdpEntitySetting = {
33
+ wantAuthnRequestsSigned: false,
34
+ tagPrefix: {
35
+ encryptedAssertion: 'saml',
36
+ },
37
+ };
38
+ const entitySetting = Object.assign(defaultIdpEntitySetting, idpSetting);
39
+ // build attribute part
40
+ if (idpSetting.loginResponseTemplate) {
41
+ if ((0, utility_js_1.isString)(idpSetting.loginResponseTemplate.context) && Array.isArray(idpSetting.loginResponseTemplate.attributes)) {
42
+ let attributeStatementTemplate;
43
+ let attributeTemplate;
44
+ if (!idpSetting.loginResponseTemplate.additionalTemplates || !idpSetting.loginResponseTemplate.additionalTemplates.attributeStatementTemplate) {
45
+ attributeStatementTemplate = libsaml_js_1.default.defaultAttributeStatementTemplate;
46
+ }
47
+ else {
48
+ attributeStatementTemplate = idpSetting.loginResponseTemplate.additionalTemplates.attributeStatementTemplate;
49
+ }
50
+ if (!idpSetting.loginResponseTemplate.additionalTemplates || !idpSetting.loginResponseTemplate.additionalTemplates.attributeTemplate) {
51
+ attributeTemplate = libsaml_js_1.default.defaultAttributeTemplate;
52
+ }
53
+ else {
54
+ attributeTemplate = idpSetting.loginResponseTemplate.additionalTemplates.attributeTemplate;
55
+ }
56
+ const replacement = {
57
+ AttributeStatement: libsaml_js_1.default.attributeStatementBuilder(idpSetting.loginResponseTemplate.attributes, attributeTemplate, attributeStatementTemplate),
58
+ };
59
+ entitySetting.loginResponseTemplate = {
60
+ ...entitySetting.loginResponseTemplate,
61
+ context: libsaml_js_1.default.replaceTagsByValue(entitySetting.loginResponseTemplate.context, replacement),
62
+ };
63
+ }
64
+ else {
65
+ console.warn('Invalid login response template');
66
+ }
67
+ }
68
+ super(entitySetting, 'idp');
69
+ }
70
+ /**
71
+ * @desc Generates the login response for developers to design their own method
72
+ * @param sp object of service provider
73
+ * @param requestInfo corresponding request, used to obtain the id
74
+ * @param binding protocol binding
75
+ * @param user current logged user (e.g. req.user)
76
+ * @param customTagReplacement used when developers have their own login response template
77
+ * @param encryptThenSign whether or not to encrypt then sign first (if signing)
78
+ * @param relayState the relayState from corresponding request
79
+ */
80
+ async createLoginResponse(sp, requestInfo, binding, user, customTagReplacement, encryptThenSign, relayState) {
81
+ const protocol = urn_js_1.namespace.binding[binding];
82
+ // can support post, redirect and post simple sign bindings for login response
83
+ let context = null;
84
+ switch (protocol) {
85
+ case urn_js_1.namespace.binding.post:
86
+ context = await binding_post_js_1.default.base64LoginResponse(requestInfo, {
87
+ idp: this,
88
+ sp,
89
+ }, user, customTagReplacement, encryptThenSign);
90
+ break;
91
+ case urn_js_1.namespace.binding.simpleSign:
92
+ context = await binding_simplesign_js_1.default.base64LoginResponse(requestInfo, {
93
+ idp: this, sp,
94
+ }, user, relayState, customTagReplacement);
95
+ break;
96
+ case urn_js_1.namespace.binding.redirect:
97
+ return binding_redirect_js_1.default.loginResponseRedirectURL(requestInfo, {
98
+ idp: this,
99
+ sp,
100
+ }, user, relayState, customTagReplacement);
101
+ default:
102
+ throw new Error('ERR_CREATE_RESPONSE_UNDEFINED_BINDING');
103
+ }
104
+ return {
105
+ ...context,
106
+ relayState,
107
+ entityEndpoint: sp.entityMeta.getAssertionConsumerService(binding),
108
+ type: 'SAMLResponse'
109
+ };
110
+ }
111
+ /**
112
+ * Validation of the parsed URL parameters
113
+ * @param sp ServiceProvider instance
114
+ * @param binding Protocol binding
115
+ * @param req RequesmessageSigningOrderst
116
+ */
117
+ parseLoginRequest(sp, binding, req) {
118
+ const self = this;
119
+ return (0, flow_js_1.flow)({
120
+ from: sp,
121
+ self: self,
122
+ checkSignature: self.entityMeta.isWantAuthnRequestsSigned(),
123
+ parserType: 'SAMLRequest',
124
+ type: 'login',
125
+ binding: binding,
126
+ request: req
127
+ });
128
+ }
129
+ }
130
+ exports.IdentityProvider = IdentityProvider;
131
+ //# sourceMappingURL=entity-idp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-idp.js","sourceRoot":"","sources":["../../src/entity-idp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
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.ServiceProvider = void 0;
7
+ exports.default = default_1;
8
+ /**
9
+ * @file entity-sp.ts
10
+ * @author tngan
11
+ * @desc Declares the actions taken by service provider
12
+ */
13
+ const entity_js_1 = __importDefault(require("./entity.js"));
14
+ const urn_js_1 = require("./urn.js");
15
+ const binding_redirect_js_1 = __importDefault(require("./binding-redirect.js"));
16
+ const binding_post_js_1 = __importDefault(require("./binding-post.js"));
17
+ const binding_simplesign_js_1 = __importDefault(require("./binding-simplesign.js"));
18
+ const flow_js_1 = require("./flow.js");
19
+ /*
20
+ * @desc interface function
21
+ */
22
+ function default_1(props) {
23
+ return new ServiceProvider(props);
24
+ }
25
+ /**
26
+ * @desc Service provider can be configured using either metadata importing or spSetting
27
+ * @param {object} spSettingimport { FlowResult } from '../types/src/flow.d';
28
+
29
+ */
30
+ class ServiceProvider extends entity_js_1.default {
31
+ /**
32
+ * @desc Inherited from Entity
33
+ * @param {object} spSetting setting of service provider
34
+ */
35
+ constructor(spSetting) {
36
+ const entitySetting = Object.assign({
37
+ authnRequestsSigned: false,
38
+ wantAssertionsSigned: false,
39
+ wantMessageSigned: false,
40
+ }, spSetting);
41
+ super(entitySetting, 'sp');
42
+ }
43
+ /**
44
+ * @desc Generates the login request for developers to design their own method
45
+ * @param {IdentityProvider} idp object of identity provider
46
+ * @param {string} binding protocol binding
47
+ * @param {function} customTagReplacement used when developers have their own login response template
48
+ */
49
+ createLoginRequest(idp, binding = 'redirect', customTagReplacement) {
50
+ const nsBinding = urn_js_1.namespace.binding;
51
+ const protocol = nsBinding[binding];
52
+ if (this.entityMeta.isAuthnRequestSigned() !== idp.entityMeta.isWantAuthnRequestsSigned()) {
53
+ throw new Error('ERR_METADATA_CONFLICT_REQUEST_SIGNED_FLAG');
54
+ }
55
+ let context = null;
56
+ switch (protocol) {
57
+ case nsBinding.redirect:
58
+ return binding_redirect_js_1.default.loginRequestRedirectURL({ idp, sp: this }, customTagReplacement);
59
+ case nsBinding.post:
60
+ context = binding_post_js_1.default.base64LoginRequest("/*[local-name(.)='AuthnRequest']", { idp, sp: this }, customTagReplacement);
61
+ break;
62
+ case nsBinding.simpleSign:
63
+ // Object context = {id, context, signature, sigAlg}
64
+ context = binding_simplesign_js_1.default.base64LoginRequest({ idp, sp: this }, customTagReplacement);
65
+ break;
66
+ default:
67
+ // Will support artifact in the next release
68
+ throw new Error('ERR_SP_LOGIN_REQUEST_UNDEFINED_BINDING');
69
+ }
70
+ return {
71
+ ...context,
72
+ relayState: this.entitySetting.relayState,
73
+ entityEndpoint: idp.entityMeta.getSingleSignOnService(binding),
74
+ type: 'SAMLRequest',
75
+ };
76
+ }
77
+ /**
78
+ * @desc Validation of the parsed the URL parameters
79
+ * @param {IdentityProvider} idp object of identity provider
80
+ * @param {string} binding protocol binding
81
+ * @param {request} req request
82
+ */
83
+ parseLoginResponse(idp, binding, request) {
84
+ const self = this;
85
+ return (0, flow_js_1.flow)({
86
+ from: idp,
87
+ self: self,
88
+ checkSignature: true, // saml response must have signature
89
+ parserType: 'SAMLResponse',
90
+ type: 'login',
91
+ binding: binding,
92
+ request: request
93
+ });
94
+ }
95
+ }
96
+ exports.ServiceProvider = ServiceProvider;
97
+ //# sourceMappingURL=entity-sp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-sp.js","sourceRoot":"","sources":["../../src/entity-sp.ts"],"names":[],"mappings":";;;;;;AAyBA,4BAEC;AA3BD;;;;EAIE;AACF,4DAKqB;AAMrB,qCAAqC;AACrC,gFAAoD;AACpD,wEAA4C;AAC5C,oFAAwD;AACxD,uCAA8C;AAE9C;;GAEG;AACH,mBAAwB,KAA8B;IACpD,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;;EAIE;AACF,MAAa,eAAgB,SAAQ,mBAAM;IAGzC;;;MAGE;IACF,YAAY,SAAkC;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;YAClC,mBAAmB,EAAE,KAAK;YAC1B,oBAAoB,EAAE,KAAK;YAC3B,iBAAiB,EAAE,KAAK;SACzB,EAAE,SAAS,CAAC,CAAC;QACd,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;MAKE;IACK,kBAAkB,CACvB,GAAqB,EACrB,OAAO,GAAG,UAAU,EACpB,oBAA2D;QAE3D,MAAM,SAAS,GAAG,kBAAS,CAAC,OAAO,CAAC;QACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC;YAC1F,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,OAAO,GAAQ,IAAI,CAAC;QACxB,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,SAAS,CAAC,QAAQ;gBACrB,OAAO,6BAAe,CAAC,uBAAuB,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAE1F,KAAK,SAAS,CAAC,IAAI;gBACjB,OAAO,GAAG,yBAAW,CAAC,kBAAkB,CAAC,kCAAkC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;gBACtH,MAAM;YAER,KAAK,SAAS,CAAC,UAAU;gBACvB,oDAAoD;gBACpD,OAAO,GAAG,+BAAiB,CAAC,kBAAkB,CAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;gBACzF,MAAM;YAER;gBACE,4CAA4C;gBAC5C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,GAAG,OAAO;YACV,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU;YACzC,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC,OAAO,CAAW;YACxE,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;IAED;;;;;MAKE;IACK,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAyB;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,IAAA,cAAI,EAAC;YACV,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,IAAI;YACV,cAAc,EAAE,IAAI,EAAE,oCAAoC;YAC1D,UAAU,EAAE,cAAc;YAC1B,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;CAEF;AA/ED,0CA+EC"}
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ /**
40
+ * @file entity.ts
41
+ * @author tngan
42
+ * @desc An abstraction for identity provider and service provider.
43
+ */
44
+ const utility_js_1 = require("./utility.js");
45
+ const urn_js_1 = require("./urn.js");
46
+ const uuid = __importStar(require("uuid"));
47
+ const metadata_idp_js_1 = __importDefault(require("./metadata-idp.js"));
48
+ const metadata_sp_js_1 = __importDefault(require("./metadata-sp.js"));
49
+ const binding_redirect_js_1 = __importDefault(require("./binding-redirect.js"));
50
+ const binding_post_js_1 = __importDefault(require("./binding-post.js"));
51
+ const flow_js_1 = require("./flow.js");
52
+ const dataEncryptionAlgorithm = urn_js_1.algorithms.encryption.data;
53
+ const keyEncryptionAlgorithm = urn_js_1.algorithms.encryption.key;
54
+ const signatureAlgorithms = urn_js_1.algorithms.signature;
55
+ const messageSigningOrders = urn_js_1.messageConfigurations.signingOrder;
56
+ const defaultEntitySetting = {
57
+ wantLogoutResponseSigned: false,
58
+ messageSigningOrder: messageSigningOrders.SIGN_THEN_ENCRYPT,
59
+ wantLogoutRequestSigned: false,
60
+ allowCreate: false,
61
+ isAssertionEncrypted: false,
62
+ requestSignatureAlgorithm: signatureAlgorithms.RSA_SHA512,
63
+ dataEncryptionAlgorithm: dataEncryptionAlgorithm.AES_256_GCM,
64
+ keyEncryptionAlgorithm: keyEncryptionAlgorithm.RSA_OAEP_MGF1P,
65
+ generateID: () => ('_' + uuid.v4()),
66
+ relayState: '',
67
+ };
68
+ class Entity {
69
+ entitySetting;
70
+ entityType;
71
+ entityMeta;
72
+ /**
73
+ * @param entitySetting
74
+ * @param entityMeta is the entity metadata, deprecated after 2.0
75
+ */
76
+ constructor(entitySetting, entityType) {
77
+ this.entitySetting = Object.assign({}, defaultEntitySetting, entitySetting);
78
+ const metadata = entitySetting.metadata || entitySetting;
79
+ switch (entityType) {
80
+ case 'idp':
81
+ this.entityMeta = (0, metadata_idp_js_1.default)(metadata);
82
+ // setting with metadata has higher precedence
83
+ this.entitySetting.wantAuthnRequestsSigned = this.entityMeta.isWantAuthnRequestsSigned();
84
+ this.entitySetting.nameIDFormat = this.entityMeta.getNameIDFormat() || this.entitySetting.nameIDFormat;
85
+ break;
86
+ case 'sp':
87
+ this.entityMeta = (0, metadata_sp_js_1.default)(metadata);
88
+ // setting with metadata has higher precedence
89
+ this.entitySetting.authnRequestsSigned = this.entityMeta.isAuthnRequestSigned();
90
+ this.entitySetting.wantAssertionsSigned = this.entityMeta.isWantAssertionsSigned();
91
+ this.entitySetting.nameIDFormat = this.entityMeta.getNameIDFormat() || this.entitySetting.nameIDFormat;
92
+ break;
93
+ default:
94
+ throw new Error('ERR_UNDEFINED_ENTITY_TYPE');
95
+ }
96
+ }
97
+ /**
98
+ * @desc Returns the setting of entity
99
+ * @return {object}
100
+ */
101
+ getEntitySetting() {
102
+ return this.entitySetting;
103
+ }
104
+ /**
105
+ * @desc Returns the xml string of entity metadata
106
+ * @return {string}
107
+ */
108
+ getMetadata() {
109
+ return this.entityMeta.getMetadata();
110
+ }
111
+ /**
112
+ * @desc Exports the entity metadata into specified folder
113
+ * @param {string} exportFile indicates the file name
114
+ */
115
+ exportMetadata(exportFile) {
116
+ return this.entityMeta.exportMetadata(exportFile);
117
+ }
118
+ /** * @desc Verify fields with the one specified in metadata
119
+ * @param {string/[string]} field is a string or an array of string indicating the field value in SAML message
120
+ * @param {string} metaField is a string indicating the same field specified in metadata
121
+ * @return {boolean} True/False
122
+ */
123
+ verifyFields(field, metaField) {
124
+ if ((0, utility_js_1.isString)(field)) {
125
+ return field === metaField;
126
+ }
127
+ if ((0, utility_js_1.isNonEmptyArray)(field)) {
128
+ let res = true;
129
+ field.forEach(f => {
130
+ if (f !== metaField) {
131
+ res = false;
132
+ return;
133
+ }
134
+ });
135
+ return res;
136
+ }
137
+ return false;
138
+ }
139
+ /** @desc Generates the logout request for developers to design their own method
140
+ * @param {ServiceProvider} sp object of service provider
141
+ * @param {string} binding protocol binding
142
+ * @param {object} user current logged user (e.g. user)
143
+ * @param {string} relayState the URL to which to redirect the user when logout is complete
144
+ * @param {function} customTagReplacement used when developers have their own login response template
145
+ */
146
+ createLogoutRequest(targetEntity, binding, user, relayState = '', customTagReplacement) {
147
+ if (binding === urn_js_1.wording.binding.redirect) {
148
+ return binding_redirect_js_1.default.logoutRequestRedirectURL(user, {
149
+ init: this,
150
+ target: targetEntity,
151
+ }, relayState, customTagReplacement);
152
+ }
153
+ if (binding === urn_js_1.wording.binding.post) {
154
+ const entityEndpoint = targetEntity.entityMeta.getSingleLogoutService(binding);
155
+ const context = binding_post_js_1.default.base64LogoutRequest(user, "/*[local-name(.)='LogoutRequest']", { init: this, target: targetEntity }, customTagReplacement);
156
+ return {
157
+ ...context,
158
+ relayState,
159
+ entityEndpoint,
160
+ type: 'SAMLRequest',
161
+ };
162
+ }
163
+ // Will support artifact in the next release
164
+ throw new Error('ERR_UNDEFINED_BINDING');
165
+ }
166
+ /**
167
+ * @desc Generates the logout response for developers to design their own method
168
+ * @param {IdentityProvider} idp object of identity provider
169
+ * @param {object} requestInfo corresponding request, used to obtain the id
170
+ * @param {string} relayState the URL to which to redirect the user when logout is complete.
171
+ * @param {string} binding protocol binding
172
+ * @param {function} customTagReplacement used when developers have their own login response template
173
+ */
174
+ createLogoutResponse(target, requestInfo, binding, relayState = '', customTagReplacement) {
175
+ const protocol = urn_js_1.namespace.binding[binding];
176
+ if (protocol === urn_js_1.namespace.binding.redirect) {
177
+ return binding_redirect_js_1.default.logoutResponseRedirectURL(requestInfo, {
178
+ init: this,
179
+ target,
180
+ }, relayState, customTagReplacement);
181
+ }
182
+ if (protocol === urn_js_1.namespace.binding.post) {
183
+ const context = binding_post_js_1.default.base64LogoutResponse(requestInfo, {
184
+ init: this,
185
+ target,
186
+ }, customTagReplacement);
187
+ return {
188
+ ...context,
189
+ relayState,
190
+ entityEndpoint: target.entityMeta.getSingleLogoutService(binding),
191
+ type: 'SAMLResponse',
192
+ };
193
+ }
194
+ throw new Error('ERR_CREATE_LOGOUT_RESPONSE_UNDEFINED_BINDING');
195
+ }
196
+ /**
197
+ * @desc Validation of the parsed the URL parameters
198
+ * @param {IdentityProvider} idp object of identity provider
199
+ * @param {string} binding protocol binding
200
+ * @param {request} req request
201
+ * @return {Promise}
202
+ */
203
+ parseLogoutRequest(from, binding, request) {
204
+ const self = this;
205
+ return (0, flow_js_1.flow)({
206
+ from: from,
207
+ self: self,
208
+ type: 'logout',
209
+ parserType: 'LogoutRequest',
210
+ checkSignature: this.entitySetting.wantLogoutRequestSigned,
211
+ binding: binding,
212
+ request: request,
213
+ });
214
+ }
215
+ /**
216
+ * @desc Validation of the parsed the URL parameters
217
+ * @param {object} config config for the parser
218
+ * @param {string} binding protocol binding
219
+ * @param {request} req request
220
+ * @return {Promise}
221
+ */
222
+ parseLogoutResponse(from, binding, request) {
223
+ const self = this;
224
+ return (0, flow_js_1.flow)({
225
+ from: from,
226
+ self: self,
227
+ type: 'logout',
228
+ parserType: 'LogoutResponse',
229
+ checkSignature: self.entitySetting.wantLogoutResponseSigned,
230
+ binding: binding,
231
+ request: request
232
+ });
233
+ }
234
+ }
235
+ exports.default = Entity;
236
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/entity.ts"],"names":[],"mappings":"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"}