@bitblit/ratchet-warden-common 4.0.84-alpha

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 (121) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/License.txt +13 -0
  3. package/README.md +38 -0
  4. package/dist/cjs/build/ratchet-warden-common-info.js +18 -0
  5. package/dist/cjs/client/provider/warden-client-abstract-recent-login-provider.js +47 -0
  6. package/dist/cjs/client/provider/warden-client-current-logged-in-jwt-token-provider.js +2 -0
  7. package/dist/cjs/client/provider/warden-client-local-storage-logged-in-user-provider.js +30 -0
  8. package/dist/cjs/client/provider/warden-client-local-storage-recent-login-provider.js +24 -0
  9. package/dist/cjs/client/provider/warden-client-recent-login-provider.js +2 -0
  10. package/dist/cjs/client/provider/warden-client-transient-memory-logged-in-user-provider.js +15 -0
  11. package/dist/cjs/client/provider/warden-client-transient-memory-recent-login-provider.js +17 -0
  12. package/dist/cjs/client/provider/warden-command-exchange-provider.js +2 -0
  13. package/dist/cjs/client/provider/warden-logged-in-user-provider.js +2 -0
  14. package/dist/cjs/client/provider/warden-logged-in-user-wrapper.js +2 -0
  15. package/dist/cjs/client/provider/warden-recent-login-descriptor.js +2 -0
  16. package/dist/cjs/client/provider/warden-user-service-event-processing-provider.js +2 -0
  17. package/dist/cjs/client/provider/warden-user-service-options.js +2 -0
  18. package/dist/cjs/client/warden-client.js +133 -0
  19. package/dist/cjs/client/warden-delegating-current-user-providing-user-service-event-processing-provider.js +45 -0
  20. package/dist/cjs/client/warden-user-service.js +253 -0
  21. package/dist/cjs/common/command/create-account.js +2 -0
  22. package/dist/cjs/common/command/remove-web-authn-registration.js +2 -0
  23. package/dist/cjs/common/command/warden-command-response.js +2 -0
  24. package/dist/cjs/common/command/warden-command.js +2 -0
  25. package/dist/cjs/common/command/web-authn-object-wrapper.js +2 -0
  26. package/dist/cjs/common/model/warden-contact-type.js +8 -0
  27. package/dist/cjs/common/model/warden-contact.js +2 -0
  28. package/dist/cjs/common/model/warden-customer-message-type.js +7 -0
  29. package/dist/cjs/common/model/warden-entry-summary.js +2 -0
  30. package/dist/cjs/common/model/warden-entry.js +2 -0
  31. package/dist/cjs/common/model/warden-jwt-token.js +2 -0
  32. package/dist/cjs/common/model/warden-login-request.js +2 -0
  33. package/dist/cjs/common/model/warden-login-results.js +2 -0
  34. package/dist/cjs/common/model/warden-store-registration-response-type.js +9 -0
  35. package/dist/cjs/common/model/warden-store-registration-response.js +2 -0
  36. package/dist/cjs/common/model/warden-team-role.js +2 -0
  37. package/dist/cjs/common/model/warden-user-decoration.js +2 -0
  38. package/dist/cjs/common/model/warden-web-authn-entry.js +2 -0
  39. package/dist/cjs/common/model/warden-web-authn-transport-future-type.js +12 -0
  40. package/dist/cjs/common/util/warden-utils.js +108 -0
  41. package/dist/cjs/index.js +40 -0
  42. package/dist/es/build/ratchet-warden-common-info.js +14 -0
  43. package/dist/es/client/provider/warden-client-abstract-recent-login-provider.js +43 -0
  44. package/dist/es/client/provider/warden-client-current-logged-in-jwt-token-provider.js +1 -0
  45. package/dist/es/client/provider/warden-client-local-storage-logged-in-user-provider.js +26 -0
  46. package/dist/es/client/provider/warden-client-local-storage-recent-login-provider.js +20 -0
  47. package/dist/es/client/provider/warden-client-recent-login-provider.js +1 -0
  48. package/dist/es/client/provider/warden-client-transient-memory-logged-in-user-provider.js +11 -0
  49. package/dist/es/client/provider/warden-client-transient-memory-recent-login-provider.js +13 -0
  50. package/dist/es/client/provider/warden-command-exchange-provider.js +1 -0
  51. package/dist/es/client/provider/warden-logged-in-user-provider.js +1 -0
  52. package/dist/es/client/provider/warden-logged-in-user-wrapper.js +1 -0
  53. package/dist/es/client/provider/warden-recent-login-descriptor.js +1 -0
  54. package/dist/es/client/provider/warden-user-service-event-processing-provider.js +1 -0
  55. package/dist/es/client/provider/warden-user-service-options.js +1 -0
  56. package/dist/es/client/warden-client.js +129 -0
  57. package/dist/es/client/warden-delegating-current-user-providing-user-service-event-processing-provider.js +40 -0
  58. package/dist/es/client/warden-user-service.js +245 -0
  59. package/dist/es/common/command/create-account.js +1 -0
  60. package/dist/es/common/command/remove-web-authn-registration.js +1 -0
  61. package/dist/es/common/command/warden-command-response.js +1 -0
  62. package/dist/es/common/command/warden-command.js +1 -0
  63. package/dist/es/common/command/web-authn-object-wrapper.js +1 -0
  64. package/dist/es/common/model/warden-contact-type.js +5 -0
  65. package/dist/es/common/model/warden-contact.js +1 -0
  66. package/dist/es/common/model/warden-customer-message-type.js +4 -0
  67. package/dist/es/common/model/warden-entry-summary.js +1 -0
  68. package/dist/es/common/model/warden-entry.js +1 -0
  69. package/dist/es/common/model/warden-jwt-token.js +1 -0
  70. package/dist/es/common/model/warden-login-request.js +1 -0
  71. package/dist/es/common/model/warden-login-results.js +1 -0
  72. package/dist/es/common/model/warden-store-registration-response-type.js +6 -0
  73. package/dist/es/common/model/warden-store-registration-response.js +1 -0
  74. package/dist/es/common/model/warden-team-role.js +1 -0
  75. package/dist/es/common/model/warden-user-decoration.js +1 -0
  76. package/dist/es/common/model/warden-web-authn-entry.js +1 -0
  77. package/dist/es/common/model/warden-web-authn-transport-future-type.js +9 -0
  78. package/dist/es/common/util/warden-utils.js +104 -0
  79. package/dist/es/index.js +37 -0
  80. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  81. package/dist/tsconfig.es.tsbuildinfo +1 -0
  82. package/dist/tsconfig.types.tsbuildinfo +1 -0
  83. package/dist/types/build/ratchet-warden-common-info.d.ts +5 -0
  84. package/dist/types/client/provider/warden-client-abstract-recent-login-provider.d.ts +13 -0
  85. package/dist/types/client/provider/warden-client-current-logged-in-jwt-token-provider.d.ts +3 -0
  86. package/dist/types/client/provider/warden-client-local-storage-logged-in-user-provider.d.ts +9 -0
  87. package/dist/types/client/provider/warden-client-local-storage-recent-login-provider.d.ts +8 -0
  88. package/dist/types/client/provider/warden-client-recent-login-provider.d.ts +10 -0
  89. package/dist/types/client/provider/warden-client-transient-memory-logged-in-user-provider.d.ts +8 -0
  90. package/dist/types/client/provider/warden-client-transient-memory-recent-login-provider.d.ts +7 -0
  91. package/dist/types/client/provider/warden-command-exchange-provider.d.ts +7 -0
  92. package/dist/types/client/provider/warden-logged-in-user-provider.d.ts +6 -0
  93. package/dist/types/client/provider/warden-logged-in-user-wrapper.d.ts +6 -0
  94. package/dist/types/client/provider/warden-recent-login-descriptor.d.ts +5 -0
  95. package/dist/types/client/provider/warden-user-service-event-processing-provider.d.ts +11 -0
  96. package/dist/types/client/provider/warden-user-service-options.d.ts +13 -0
  97. package/dist/types/client/warden-client.d.ts +27 -0
  98. package/dist/types/client/warden-delegating-current-user-providing-user-service-event-processing-provider.d.ts +26 -0
  99. package/dist/types/client/warden-user-service.d.ts +47 -0
  100. package/dist/types/common/command/create-account.d.ts +7 -0
  101. package/dist/types/common/command/remove-web-authn-registration.d.ts +4 -0
  102. package/dist/types/common/command/warden-command-response.d.ts +17 -0
  103. package/dist/types/common/command/warden-command.d.ts +18 -0
  104. package/dist/types/common/command/web-authn-object-wrapper.d.ts +3 -0
  105. package/dist/types/common/model/warden-contact-type.d.ts +4 -0
  106. package/dist/types/common/model/warden-contact.d.ts +5 -0
  107. package/dist/types/common/model/warden-customer-message-type.d.ts +3 -0
  108. package/dist/types/common/model/warden-entry-summary.d.ts +7 -0
  109. package/dist/types/common/model/warden-entry.d.ts +11 -0
  110. package/dist/types/common/model/warden-jwt-token.d.ts +5 -0
  111. package/dist/types/common/model/warden-login-request.d.ts +9 -0
  112. package/dist/types/common/model/warden-login-results.d.ts +7 -0
  113. package/dist/types/common/model/warden-store-registration-response-type.d.ts +5 -0
  114. package/dist/types/common/model/warden-store-registration-response.d.ts +8 -0
  115. package/dist/types/common/model/warden-team-role.d.ts +4 -0
  116. package/dist/types/common/model/warden-user-decoration.d.ts +6 -0
  117. package/dist/types/common/model/warden-web-authn-entry.d.ts +9 -0
  118. package/dist/types/common/model/warden-web-authn-transport-future-type.d.ts +8 -0
  119. package/dist/types/common/util/warden-utils.d.ts +21 -0
  120. package/dist/types/index.d.ts +40 -0
  121. package/package.json +66 -0
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WardenUserService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const ratchet_common_1 = require("@bitblit/ratchet-common");
6
+ const rxjs_1 = require("rxjs");
7
+ const jwt_decode_1 = tslib_1.__importDefault(require("jwt-decode"));
8
+ const ratchet_common_2 = require("@bitblit/ratchet-common");
9
+ const browser_1 = require("@simplewebauthn/browser");
10
+ class WardenUserService {
11
+ constructor(options) {
12
+ this.options = options;
13
+ this._autoRefreshEnabled = false;
14
+ ratchet_common_1.Logger.info('Initializing user service');
15
+ const stored = this.options.loggedInUserProvider.fetchLoggedInUserWrapper();
16
+ if (WardenUserService.wrapperIsExpired(stored)) {
17
+ ratchet_common_1.Logger.info('Stored token is expired, removing it');
18
+ this.options.loggedInUserProvider.logOutUser();
19
+ }
20
+ else {
21
+ this.options.eventProcessor.onSuccessfulLogin(stored);
22
+ }
23
+ const timerSeconds = this.options.loginCheckTimerPingSeconds || 2.5;
24
+ this.loggedInTimerSubscription = (0, rxjs_1.timer)(0, timerSeconds * 1000).subscribe((t) => this.checkForAutoLogoutOrRefresh(t));
25
+ }
26
+ get serviceOptions() {
27
+ return this.options;
28
+ }
29
+ async createAccount(contact, sendCode, label, tags) {
30
+ const rval = await this.options.wardenClient.createAccount(contact, sendCode, label, tags);
31
+ if (this.options.recentLoginProvider && ratchet_common_2.StringRatchet.trimToNull(rval)) {
32
+ this.options.recentLoginProvider.saveNewUser(rval, label, contact);
33
+ }
34
+ return rval;
35
+ }
36
+ async addContactToLoggedInUser(contact) {
37
+ return this.options.wardenClient.addContactToLoggedInUser(contact);
38
+ }
39
+ get autoRefreshEnabled() {
40
+ return this._autoRefreshEnabled;
41
+ }
42
+ set autoRefreshEnabled(newValue) {
43
+ if (newValue) {
44
+ if (this.options.allowAutoRefresh) {
45
+ this._autoRefreshEnabled = true;
46
+ }
47
+ else {
48
+ throw new Error('Cannot enable auto-refresh - this is disabled in the user service options');
49
+ }
50
+ }
51
+ else {
52
+ this._autoRefreshEnabled = false;
53
+ }
54
+ }
55
+ async checkForAutoLogoutOrRefresh(t) {
56
+ ratchet_common_1.Logger.debug('Checking for auto-logout or refresh : %s', t);
57
+ const current = this.fetchLoggedInUserWrapper();
58
+ if (current) {
59
+ const thresholdSeconds = this.options.autoLoginHandlingThresholdSeconds || 10;
60
+ const secondsLeft = current.expirationEpochSeconds - Math.floor(Date.now() / 1000);
61
+ if (secondsLeft < thresholdSeconds) {
62
+ if (this.autoRefreshEnabled) {
63
+ ratchet_common_1.Logger.info('Under threshold, initiating auto-refresh');
64
+ const result = await this.refreshToken();
65
+ this.options.eventProcessor.onAutomaticTokenRefresh(result);
66
+ }
67
+ else {
68
+ ratchet_common_1.Logger.info('Under threshold, initiating auto-logout');
69
+ this.logout();
70
+ }
71
+ }
72
+ }
73
+ }
74
+ logout() {
75
+ this.options.loggedInUserProvider.logOutUser();
76
+ this.options.eventProcessor.onLogout();
77
+ }
78
+ static wrapperIsExpired(value) {
79
+ var _a;
80
+ const rval = ((_a = value === null || value === void 0 ? void 0 : value.userObject) === null || _a === void 0 ? void 0 : _a.exp) && value.expirationEpochSeconds < Date.now() / 1000;
81
+ return rval;
82
+ }
83
+ fetchLoggedInUserWrapper() {
84
+ let tmp = this.options.loggedInUserProvider.fetchLoggedInUserWrapper();
85
+ if (tmp) {
86
+ if (WardenUserService.wrapperIsExpired(tmp)) {
87
+ ratchet_common_1.Logger.info('Token is expired - auto logout triggered');
88
+ this.logout();
89
+ tmp = null;
90
+ }
91
+ }
92
+ return tmp;
93
+ }
94
+ loggedInUserHasRole(role) {
95
+ var _a;
96
+ let rval = false;
97
+ if (ratchet_common_2.StringRatchet.trimToNull(role)) {
98
+ const t = this.fetchLoggedInUserWrapper();
99
+ const testRole = role.toLowerCase();
100
+ rval = ((_a = t === null || t === void 0 ? void 0 : t.userObject) === null || _a === void 0 ? void 0 : _a.roles) && !!t.userObject.roles.find((r) => r.toLowerCase() === testRole);
101
+ }
102
+ return rval;
103
+ }
104
+ isLoggedIn() {
105
+ const t = this.fetchLoggedInUserWrapper();
106
+ return !!t;
107
+ }
108
+ fetchLoggedInUserJwtObject() {
109
+ const t = this.fetchLoggedInUserWrapper();
110
+ return t ? t.userObject : null;
111
+ }
112
+ fetchLoggedInUserJwtToken() {
113
+ const t = this.fetchLoggedInUserWrapper();
114
+ return t ? t.jwtToken : null;
115
+ }
116
+ fetchLoggedInUserObject() {
117
+ const t = this.fetchLoggedInUserJwtObject();
118
+ return t ? t.user : null;
119
+ }
120
+ fetchLoggedInUserExpirationEpochSeconds() {
121
+ const t = this.fetchLoggedInUserJwtObject();
122
+ return t ? t.exp : null;
123
+ }
124
+ fetchLoggedInUserRemainingSeconds() {
125
+ const t = this.fetchLoggedInUserJwtObject();
126
+ return t ? t.exp - Math.floor(Date.now() / 1000) : null;
127
+ }
128
+ updateLoggedInUserFromTokenString(token) {
129
+ let rval = null;
130
+ if (!ratchet_common_2.StringRatchet.trimToNull(token)) {
131
+ ratchet_common_1.Logger.info('Called updateLoggedInUserFromTokenString with empty string - logging out');
132
+ this.logout();
133
+ }
134
+ else {
135
+ ratchet_common_1.Logger.info('updateLoggedInUserFromTokenString : %s', token);
136
+ const parsed = (0, jwt_decode_1.default)(token);
137
+ if (parsed) {
138
+ rval = {
139
+ userObject: parsed,
140
+ jwtToken: token,
141
+ expirationEpochSeconds: parsed.exp,
142
+ };
143
+ this.options.loggedInUserProvider.setLoggedInUserWrapper(rval);
144
+ this.updateRecentLoginsFromWardenEntrySummary(parsed.loginData);
145
+ this.options.eventProcessor.onSuccessfulLogin(rval);
146
+ }
147
+ else {
148
+ ratchet_common_1.Logger.warn('Failed to parse token %s - ignoring login and triggering failure');
149
+ this.options.eventProcessor.onLoginFailure('Could not parse token string');
150
+ }
151
+ }
152
+ return rval;
153
+ }
154
+ async refreshToken() {
155
+ let rval = null;
156
+ const currentWrapper = this.fetchLoggedInUserWrapper();
157
+ if (!currentWrapper) {
158
+ ratchet_common_1.Logger.info('Could not refresh - no token available');
159
+ }
160
+ else {
161
+ const newToken = await this.options.wardenClient.refreshJwtToken(currentWrapper.jwtToken);
162
+ rval = await this.updateLoggedInUserFromTokenString(newToken);
163
+ }
164
+ return rval;
165
+ }
166
+ async sendExpiringCode(contact) {
167
+ return this.options.wardenClient.sendExpiringValidationToken(contact);
168
+ }
169
+ async processWardenLoginResults(resp) {
170
+ let rval = null;
171
+ if (resp) {
172
+ ratchet_common_1.Logger.info('Warden: response : %j ', resp);
173
+ if (resp.jwtToken) {
174
+ ratchet_common_1.Logger.info('Applying login');
175
+ rval = await this.updateLoggedInUserFromTokenString(resp.jwtToken);
176
+ }
177
+ else if (resp.error) {
178
+ this.options.eventProcessor.onLoginFailure(resp.error);
179
+ }
180
+ else {
181
+ ratchet_common_1.Logger.error('Response contained neither token nor error');
182
+ this.options.eventProcessor.onLoginFailure('Response contained neither token nor error');
183
+ }
184
+ }
185
+ else {
186
+ ratchet_common_1.Logger.error('Login call failed');
187
+ this.options.eventProcessor.onLoginFailure('Login call returned null');
188
+ }
189
+ return rval;
190
+ }
191
+ updateRecentLoginsFromWardenEntrySummary(res) {
192
+ if (this.options.recentLoginProvider && res) {
193
+ ratchet_common_1.Logger.info('UserService : Saving recent login %j', res);
194
+ this.options.recentLoginProvider.saveRecentLogin(res);
195
+ }
196
+ else {
197
+ ratchet_common_1.Logger.info('Not saving recent login - no storage configured or no data passed');
198
+ }
199
+ }
200
+ updateRecentLoginsFromLoggedInUserWrapper(res) {
201
+ var _a;
202
+ this.updateRecentLoginsFromWardenEntrySummary((_a = res === null || res === void 0 ? void 0 : res.userObject) === null || _a === void 0 ? void 0 : _a.loginData);
203
+ }
204
+ async executeWebAuthnBasedLogin(userId) {
205
+ const resp = await this.executeWebAuthnLoginToWardenLoginResults(userId);
206
+ const rval = await this.processWardenLoginResults(resp);
207
+ this.updateRecentLoginsFromLoggedInUserWrapper(rval);
208
+ return rval;
209
+ }
210
+ async removeWebAuthnRegistrationFromLoggedInUser(input) {
211
+ const rval = await this.options.wardenClient.removeWebAuthnRegistrationFromLoggedInUser(input);
212
+ return rval;
213
+ }
214
+ async removeContactFromLoggedInUser(input) {
215
+ const rval = await this.options.wardenClient.removeContactFromLoggedInUser(input);
216
+ return rval;
217
+ }
218
+ async executeValidationTokenBasedLogin(contact, token) {
219
+ ratchet_common_1.Logger.info('Warden: executeValidationTokenBasedLogin : %j : %s ', contact, token);
220
+ const resp = await this.options.wardenClient.performLoginCmd({ contact: contact, expiringToken: token });
221
+ const rval = await this.processWardenLoginResults(resp);
222
+ this.updateRecentLoginsFromLoggedInUserWrapper(rval);
223
+ return rval;
224
+ }
225
+ async saveCurrentDeviceAsWebAuthnForCurrentUser() {
226
+ const input = await this.options.wardenClient.generateWebAuthnRegistrationChallengeForLoggedInUser();
227
+ const creds = await (0, browser_1.startRegistration)(input);
228
+ const output = await this.options.wardenClient.addWebAuthnRegistrationToLoggedInUser(creds);
229
+ this.updateRecentLoginsFromWardenEntrySummary(output);
230
+ return output;
231
+ }
232
+ async executeWebAuthnLoginToWardenLoginResults(userId) {
233
+ let rval = null;
234
+ try {
235
+ const input = await this.options.wardenClient.generateWebAuthnAuthenticationChallengeForUserId(userId);
236
+ ratchet_common_1.Logger.info('Got login challenge : %s', input);
237
+ const creds = await (0, browser_1.startAuthentication)(input);
238
+ ratchet_common_1.Logger.info('Got creds: %j', creds);
239
+ const loginCmd = {
240
+ userId: userId,
241
+ webAuthn: creds,
242
+ };
243
+ rval = await this.options.wardenClient.performLoginCmd(loginCmd);
244
+ if (rval === null || rval === void 0 ? void 0 : rval.jwtToken) {
245
+ }
246
+ }
247
+ catch (err) {
248
+ ratchet_common_1.Logger.error('WebauthN Failed : %s', err);
249
+ }
250
+ return rval;
251
+ }
252
+ }
253
+ exports.WardenUserService = WardenUserService;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WardenContactType = void 0;
4
+ var WardenContactType;
5
+ (function (WardenContactType) {
6
+ WardenContactType["TextCapablePhoneNumber"] = "TextCapablePhoneNumber";
7
+ WardenContactType["EmailAddress"] = "EmailAddress";
8
+ })(WardenContactType = exports.WardenContactType || (exports.WardenContactType = {}));
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WardenCustomerMessageType = void 0;
4
+ var WardenCustomerMessageType;
5
+ (function (WardenCustomerMessageType) {
6
+ WardenCustomerMessageType["ExpiringCode"] = "ExpiringCode";
7
+ })(WardenCustomerMessageType = exports.WardenCustomerMessageType || (exports.WardenCustomerMessageType = {}));
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WardenStoreRegistrationResponseType = void 0;
4
+ var WardenStoreRegistrationResponseType;
5
+ (function (WardenStoreRegistrationResponseType) {
6
+ WardenStoreRegistrationResponseType["Verified"] = "Verified";
7
+ WardenStoreRegistrationResponseType["Failed"] = "Failed";
8
+ WardenStoreRegistrationResponseType["Error"] = "Error";
9
+ })(WardenStoreRegistrationResponseType = exports.WardenStoreRegistrationResponseType || (exports.WardenStoreRegistrationResponseType = {}));
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WardenWebAuthnTransportFutureType = void 0;
4
+ var WardenWebAuthnTransportFutureType;
5
+ (function (WardenWebAuthnTransportFutureType) {
6
+ WardenWebAuthnTransportFutureType["ble"] = "ble";
7
+ WardenWebAuthnTransportFutureType["internal"] = "internal";
8
+ WardenWebAuthnTransportFutureType["nfc"] = "nfc";
9
+ WardenWebAuthnTransportFutureType["usb"] = "usb";
10
+ WardenWebAuthnTransportFutureType["cable"] = "cable";
11
+ WardenWebAuthnTransportFutureType["hybrid"] = "hybrid";
12
+ })(WardenWebAuthnTransportFutureType = exports.WardenWebAuthnTransportFutureType || (exports.WardenWebAuthnTransportFutureType = {}));
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WardenUtils = void 0;
4
+ const warden_contact_type_1 = require("../model/warden-contact-type");
5
+ const ratchet_common_1 = require("@bitblit/ratchet-common");
6
+ class WardenUtils {
7
+ constructor() { }
8
+ static extractContactsOfType(req, type) {
9
+ let rval = null;
10
+ if (req === null || req === void 0 ? void 0 : req.contactMethods) {
11
+ rval = req.contactMethods.filter((s) => s.type === type).map((s) => s.value);
12
+ }
13
+ return rval;
14
+ }
15
+ static validLoginRequest(req) {
16
+ let rval = false;
17
+ if (req) {
18
+ if (ratchet_common_1.StringRatchet.trimToNull(req.userId) || WardenUtils.validContact(req.contact)) {
19
+ if (ratchet_common_1.StringRatchet.trimToNull(req.expiringToken) || ratchet_common_1.StringRatchet.trimToNull(req.jwtTokenToRefresh) || req.webAuthn) {
20
+ rval = true;
21
+ }
22
+ }
23
+ }
24
+ return rval;
25
+ }
26
+ static stringToWardenContact(input) {
27
+ let rval = null;
28
+ const type = WardenUtils.stringToContactType(input);
29
+ if (type) {
30
+ rval = {
31
+ type: type,
32
+ value: input,
33
+ };
34
+ }
35
+ else {
36
+ ratchet_common_1.Logger.error('Failed to convert a string to a contact type', input);
37
+ }
38
+ return rval;
39
+ }
40
+ static teamRolesToRoles(teamRoles) {
41
+ const rval = (teamRoles === null || teamRoles === void 0 ? void 0 : teamRoles.length) ? teamRoles.map((t) => WardenUtils.teamRoleToRoleString(t)) : [];
42
+ return rval;
43
+ }
44
+ static roleStringsToTeamRoles(roles) {
45
+ const rval = (roles === null || roles === void 0 ? void 0 : roles.length) ? roles.map((t) => WardenUtils.roleStringToTeamRole(t)) : [];
46
+ return rval;
47
+ }
48
+ static roleStringToTeamRole(role) {
49
+ let rval = null;
50
+ if (role && role.indexOf('_/_') >= 0) {
51
+ const sp = role.split('_/_');
52
+ rval = {
53
+ team: sp[0],
54
+ role: sp[1],
55
+ };
56
+ }
57
+ return rval;
58
+ }
59
+ static teamRoleToRoleString(tr) {
60
+ let rval = null;
61
+ if ((tr === null || tr === void 0 ? void 0 : tr.role) && tr.team) {
62
+ rval = tr.team + '_/_' + tr.role;
63
+ }
64
+ return rval;
65
+ }
66
+ static stringToContactType(input) {
67
+ let rval = null;
68
+ if (!!ratchet_common_1.StringRatchet.trimToNull(input)) {
69
+ rval = WardenUtils.stringIsEmailAddress(input) ? warden_contact_type_1.WardenContactType.EmailAddress : null;
70
+ rval = !rval && WardenUtils.stringIsPhoneNumber(input) ? warden_contact_type_1.WardenContactType.TextCapablePhoneNumber : rval;
71
+ }
72
+ return rval;
73
+ }
74
+ static validContact(contact) {
75
+ let rval = false;
76
+ if ((contact === null || contact === void 0 ? void 0 : contact.type) && ratchet_common_1.StringRatchet.trimToNull(contact === null || contact === void 0 ? void 0 : contact.value)) {
77
+ switch (contact.type) {
78
+ case warden_contact_type_1.WardenContactType.EmailAddress:
79
+ rval = WardenUtils.stringIsEmailAddress(contact.value);
80
+ break;
81
+ case warden_contact_type_1.WardenContactType.TextCapablePhoneNumber:
82
+ rval = WardenUtils.stringIsPhoneNumber(contact.value);
83
+ break;
84
+ default:
85
+ rval = false;
86
+ }
87
+ }
88
+ return rval;
89
+ }
90
+ static stringIsEmailAddress(value) {
91
+ return !!value.match(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/);
92
+ }
93
+ static stringIsPhoneNumber(value) {
94
+ return !!value.match(/^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/im);
95
+ }
96
+ static stripWardenEntryToSummary(we) {
97
+ const rval = we
98
+ ? {
99
+ userId: we.userId,
100
+ userLabel: we.userLabel,
101
+ contactMethods: we.contactMethods,
102
+ webAuthnAuthenticatorIds: (we.webAuthnAuthenticators || []).map((s) => s.credentialIdBase64),
103
+ }
104
+ : null;
105
+ return rval;
106
+ }
107
+ }
108
+ exports.WardenUtils = WardenUtils;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./build/ratchet-warden-common-info"), exports);
5
+ tslib_1.__exportStar(require("./client/warden-client"), exports);
6
+ tslib_1.__exportStar(require("./client/warden-delegating-current-user-providing-user-service-event-processing-provider"), exports);
7
+ tslib_1.__exportStar(require("./client/warden-user-service"), exports);
8
+ tslib_1.__exportStar(require("./client/provider/warden-client-abstract-recent-login-provider"), exports);
9
+ tslib_1.__exportStar(require("./client/provider/warden-client-current-logged-in-jwt-token-provider"), exports);
10
+ tslib_1.__exportStar(require("./client/provider/warden-client-local-storage-logged-in-user-provider"), exports);
11
+ tslib_1.__exportStar(require("./client/provider/warden-client-local-storage-recent-login-provider"), exports);
12
+ tslib_1.__exportStar(require("./client/provider/warden-client-recent-login-provider"), exports);
13
+ tslib_1.__exportStar(require("./client/provider/warden-client-transient-memory-logged-in-user-provider"), exports);
14
+ tslib_1.__exportStar(require("./client/provider/warden-client-transient-memory-recent-login-provider"), exports);
15
+ tslib_1.__exportStar(require("./client/provider/warden-command-exchange-provider"), exports);
16
+ tslib_1.__exportStar(require("./client/provider/warden-logged-in-user-provider"), exports);
17
+ tslib_1.__exportStar(require("./client/provider/warden-logged-in-user-wrapper"), exports);
18
+ tslib_1.__exportStar(require("./client/provider/warden-recent-login-descriptor"), exports);
19
+ tslib_1.__exportStar(require("./client/provider/warden-user-service-event-processing-provider"), exports);
20
+ tslib_1.__exportStar(require("./client/provider/warden-user-service-options"), exports);
21
+ tslib_1.__exportStar(require("./common/command/create-account"), exports);
22
+ tslib_1.__exportStar(require("./common/command/remove-web-authn-registration"), exports);
23
+ tslib_1.__exportStar(require("./common/command/warden-command-response"), exports);
24
+ tslib_1.__exportStar(require("./common/command/warden-command"), exports);
25
+ tslib_1.__exportStar(require("./common/command/web-authn-object-wrapper"), exports);
26
+ tslib_1.__exportStar(require("./common/model/warden-contact-type"), exports);
27
+ tslib_1.__exportStar(require("./common/model/warden-contact"), exports);
28
+ tslib_1.__exportStar(require("./common/model/warden-customer-message-type"), exports);
29
+ tslib_1.__exportStar(require("./common/model/warden-entry-summary"), exports);
30
+ tslib_1.__exportStar(require("./common/model/warden-entry"), exports);
31
+ tslib_1.__exportStar(require("./common/model/warden-jwt-token"), exports);
32
+ tslib_1.__exportStar(require("./common/model/warden-login-request"), exports);
33
+ tslib_1.__exportStar(require("./common/model/warden-login-results"), exports);
34
+ tslib_1.__exportStar(require("./common/model/warden-store-registration-response-type"), exports);
35
+ tslib_1.__exportStar(require("./common/model/warden-store-registration-response"), exports);
36
+ tslib_1.__exportStar(require("./common/model/warden-team-role"), exports);
37
+ tslib_1.__exportStar(require("./common/model/warden-user-decoration"), exports);
38
+ tslib_1.__exportStar(require("./common/model/warden-web-authn-entry"), exports);
39
+ tslib_1.__exportStar(require("./common/model/warden-web-authn-transport-future-type"), exports);
40
+ tslib_1.__exportStar(require("./common/util/warden-utils"), exports);
@@ -0,0 +1,14 @@
1
+ export class RatchetWardenCommonInfo {
2
+ constructor() { }
3
+ static buildInformation() {
4
+ const val = {
5
+ version: '84',
6
+ hash: 'f4d435f9dba4b8b2eaefb31582fcf44290522d7f',
7
+ branch: 'alpha-2023-03-12-7',
8
+ tag: 'alpha-2023-03-12-7',
9
+ timeBuiltISO: '2023-03-12T22:04:40-0700',
10
+ notes: '',
11
+ };
12
+ return val;
13
+ }
14
+ }
@@ -0,0 +1,43 @@
1
+ import { Logger, StringRatchet } from '@bitblit/ratchet-common';
2
+ import { WardenUtils } from '../../common/util/warden-utils';
3
+ export class WardenClientAbstractRecentLoginProvider {
4
+ saveRecentLogin(entry) {
5
+ if (entry?.userId) {
6
+ Logger.info('Saving recent login : %j', entry);
7
+ let list = this.fetchCache();
8
+ list = list.filter((s) => s.user.userId !== entry.userId);
9
+ list.push({
10
+ user: entry,
11
+ lastLoginEpochMS: Date.now(),
12
+ });
13
+ this.updateCache(list);
14
+ }
15
+ else {
16
+ Logger.warn('Cannot save recent login - no login provided : %s', entry);
17
+ }
18
+ }
19
+ saveNewUser(userId, label, contact) {
20
+ if (StringRatchet.trimToNull(userId) && WardenUtils.validContact(contact)) {
21
+ this.saveRecentLogin({
22
+ userId: userId,
23
+ contactMethods: [contact],
24
+ webAuthnAuthenticatorIds: [],
25
+ userLabel: label,
26
+ });
27
+ }
28
+ else {
29
+ Logger.warn('Cannot save new user - invalid data : %s : %j', userId, contact);
30
+ }
31
+ }
32
+ removeUser(userId) {
33
+ let list = this.fetchCache();
34
+ list = list.filter((c) => c.user.userId !== userId);
35
+ this.updateCache(list);
36
+ }
37
+ fetchAllLogins() {
38
+ return Object.assign([], this.fetchCache());
39
+ }
40
+ clearAllLogins() {
41
+ this.updateCache([]);
42
+ }
43
+ }
@@ -0,0 +1,26 @@
1
+ import { ErrorRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';
2
+ export class WardenClientLocalStorageLoggedInUserProvider {
3
+ constructor(localStorageKey) {
4
+ this.localStorageKey = localStorageKey;
5
+ RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(this.localStorageKey, 'localStorageKey');
6
+ if (!localStorage) {
7
+ ErrorRatchet.throwFormattedErr('Local storage not available on this platform');
8
+ }
9
+ }
10
+ fetchLoggedInUserWrapper() {
11
+ const asString = localStorage.getItem(this.localStorageKey);
12
+ const rval = StringRatchet.trimToNull(asString) ? JSON.parse(asString) : null;
13
+ return rval;
14
+ }
15
+ logOutUser() {
16
+ this.setLoggedInUserWrapper(null);
17
+ }
18
+ setLoggedInUserWrapper(wrapper) {
19
+ if (wrapper) {
20
+ localStorage.setItem(this.localStorageKey, JSON.stringify(wrapper));
21
+ }
22
+ else {
23
+ localStorage.removeItem(this.localStorageKey);
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,20 @@
1
+ import { ErrorRatchet, RequireRatchet, StringRatchet } from '@bitblit/ratchet-common';
2
+ import { WardenClientAbstractRecentLoginProvider } from './warden-client-abstract-recent-login-provider';
3
+ export class WardenClientLocalStorageRecentLoginProvider extends WardenClientAbstractRecentLoginProvider {
4
+ constructor(localStorageKey) {
5
+ super();
6
+ this.localStorageKey = localStorageKey;
7
+ RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(this.localStorageKey, 'localStorageKey');
8
+ if (!localStorage) {
9
+ ErrorRatchet.throwFormattedErr('Local storage not available on this platform');
10
+ }
11
+ }
12
+ fetchCache() {
13
+ const asString = StringRatchet.trimToNull(localStorage.getItem(StringRatchet.trimToNull(this.localStorageKey)));
14
+ return asString ? JSON.parse(asString) : [];
15
+ }
16
+ updateCache(newValue) {
17
+ const asString = newValue ? JSON.stringify(newValue) : '[]';
18
+ localStorage.setItem(StringRatchet.trimToNull(this.localStorageKey), asString);
19
+ }
20
+ }
@@ -0,0 +1,11 @@
1
+ export class WardenClientTransientMemoryLoggedInUserProvider {
2
+ fetchLoggedInUserWrapper() {
3
+ return this.wrapper;
4
+ }
5
+ logOutUser() {
6
+ this.wrapper = null;
7
+ }
8
+ setLoggedInUserWrapper(wrapper) {
9
+ this.wrapper = wrapper;
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ import { WardenClientAbstractRecentLoginProvider } from './warden-client-abstract-recent-login-provider';
2
+ export class WardenClientTransientMemoryRecentLoginProvider extends WardenClientAbstractRecentLoginProvider {
3
+ constructor() {
4
+ super(...arguments);
5
+ this._cache = [];
6
+ }
7
+ fetchCache() {
8
+ return this._cache;
9
+ }
10
+ updateCache(newValue) {
11
+ this._cache = newValue;
12
+ }
13
+ }