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