@intuitionrobotics/user-account 0.47.59 → 1.0.1
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.
- package/LICENSE +3 -0
- package/dist/app-backend/api/_user-account.d.ts +4 -0
- package/dist/app-backend/api/_user-account.d.ts.map +1 -0
- package/dist/app-backend/api/_user-account.js +3 -0
- package/{app-backend → dist/app-backend}/api/_user-account.js.map +1 -1
- package/{app-backend → dist/app-backend}/api/v1/account/_assert.d.ts +3 -2
- package/dist/app-backend/api/v1/account/_assert.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/_assert.js +12 -0
- package/dist/app-backend/api/v1/account/_assert.js.map +1 -0
- package/dist/app-backend/api/v1/account/_imports.d.ts +5 -0
- package/dist/app-backend/api/v1/account/_imports.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/_imports.js +6 -0
- package/{app-backend → dist/app-backend}/api/v1/account/_imports.js.map +1 -1
- package/dist/app-backend/api/v1/account/create.d.ts +10 -0
- package/dist/app-backend/api/v1/account/create.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/create.js +16 -0
- package/dist/app-backend/api/v1/account/create.js.map +1 -0
- package/dist/app-backend/api/v1/account/list.d.ts +11 -0
- package/dist/app-backend/api/v1/account/list.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/list.js +14 -0
- package/dist/app-backend/api/v1/account/list.js.map +1 -0
- package/dist/app-backend/api/v1/account/login-saml.d.ts +12 -0
- package/dist/app-backend/api/v1/account/login-saml.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/login-saml.js +15 -0
- package/dist/app-backend/api/v1/account/login-saml.js.map +1 -0
- package/dist/app-backend/api/v1/account/login.d.ts +10 -0
- package/dist/app-backend/api/v1/account/login.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/login.js +15 -0
- package/dist/app-backend/api/v1/account/login.js.map +1 -0
- package/dist/app-backend/api/v1/account/logout.d.ts +10 -0
- package/dist/app-backend/api/v1/account/logout.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/logout.js +17 -0
- package/dist/app-backend/api/v1/account/logout.js.map +1 -0
- package/dist/app-backend/api/v1/account/upsert.d.ts +10 -0
- package/dist/app-backend/api/v1/account/upsert.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/upsert.js +18 -0
- package/dist/app-backend/api/v1/account/upsert.js.map +1 -0
- package/dist/app-backend/api/v1/account/validate.d.ts +13 -0
- package/dist/app-backend/api/v1/account/validate.d.ts.map +1 -0
- package/dist/app-backend/api/v1/account/validate.js +14 -0
- package/dist/app-backend/api/v1/account/validate.js.map +1 -0
- package/{app-backend → dist/app-backend}/apis/add-new-account.d.ts +4 -3
- package/dist/app-backend/apis/add-new-account.d.ts.map +1 -0
- package/dist/app-backend/apis/add-new-account.js +15 -0
- package/dist/app-backend/apis/add-new-account.js.map +1 -0
- package/dist/app-backend/core/module-pack.d.ts +4 -0
- package/dist/app-backend/core/module-pack.d.ts.map +1 -0
- package/dist/app-backend/core/module-pack.js +9 -0
- package/dist/app-backend/core/module-pack.js.map +1 -0
- package/{app-backend → dist/app-backend}/modules/AccountModule.d.ts +3 -2
- package/dist/app-backend/modules/AccountModule.d.ts.map +1 -0
- package/dist/app-backend/modules/AccountModule.js +341 -0
- package/dist/app-backend/modules/AccountModule.js.map +1 -0
- package/{app-backend → dist/app-backend}/modules/JWTBuilder.d.ts +3 -2
- package/dist/app-backend/modules/JWTBuilder.d.ts.map +1 -0
- package/dist/app-backend/modules/JWTBuilder.js +113 -0
- package/dist/app-backend/modules/JWTBuilder.js.map +1 -0
- package/{app-backend → dist/app-backend}/modules/SamlModule.d.ts +3 -2
- package/dist/app-backend/modules/SamlModule.d.ts.map +1 -0
- package/dist/app-backend/modules/SamlModule.js +47 -0
- package/dist/app-backend/modules/SamlModule.js.map +1 -0
- package/{app-backend → dist/app-backend}/modules/SecretsModule.d.ts +4 -3
- package/dist/app-backend/modules/SecretsModule.d.ts.map +1 -0
- package/dist/app-backend/modules/SecretsModule.js +131 -0
- package/dist/app-backend/modules/SecretsModule.js.map +1 -0
- package/{app-backend → dist/app-backend}/modules/_imports.d.ts +3 -2
- package/dist/app-backend/modules/_imports.d.ts.map +1 -0
- package/dist/app-backend/modules/_imports.js +3 -0
- package/{app-backend → dist/app-backend}/modules/_imports.js.map +1 -1
- package/dist/app-frontend/core/module-pack.d.ts +3 -0
- package/dist/app-frontend/core/module-pack.d.ts.map +1 -0
- package/dist/app-frontend/core/module-pack.js +6 -0
- package/dist/app-frontend/core/module-pack.js.map +1 -0
- package/{app-frontend → dist/app-frontend}/modules/AccountModule.d.ts +3 -2
- package/dist/app-frontend/modules/AccountModule.d.ts.map +1 -0
- package/dist/app-frontend/modules/AccountModule.js +151 -0
- package/dist/app-frontend/modules/AccountModule.js.map +1 -0
- package/{app-frontend → dist/app-frontend}/ui/Component_Login.d.ts +2 -1
- package/dist/app-frontend/ui/Component_Login.d.ts.map +1 -0
- package/dist/app-frontend/ui/Component_Login.js +63 -0
- package/dist/app-frontend/ui/Component_Login.js.map +1 -0
- package/{app-frontend → dist/app-frontend}/ui/Component_Register.d.ts +2 -1
- package/dist/app-frontend/ui/Component_Register.d.ts.map +1 -0
- package/dist/app-frontend/ui/Component_Register.js +69 -0
- package/dist/app-frontend/ui/Component_Register.js.map +1 -0
- package/dist/backend.d.ts +3 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +3 -0
- package/dist/backend.js.map +1 -0
- package/dist/frontend.d.ts +4 -0
- package/dist/frontend.d.ts.map +1 -0
- package/dist/frontend.js +3 -0
- package/dist/frontend.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/{shared → dist/shared}/api.d.ts +2 -1
- package/dist/shared/api.d.ts.map +1 -0
- package/dist/shared/api.js +14 -0
- package/dist/shared/api.js.map +1 -0
- package/dist/shared/types.d.ts +2 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +2 -0
- package/{shared → dist/shared}/utils/AuthenticationConsts.d.ts +1 -0
- package/dist/shared/utils/AuthenticationConsts.d.ts.map +1 -0
- package/dist/shared/utils/AuthenticationConsts.js +3 -0
- package/{shared → dist/shared}/utils/AuthenticationConsts.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +64 -15
- package/app-backend/api/_user-account.d.ts +0 -1
- package/app-backend/api/_user-account.js +0 -5
- package/app-backend/api/v1/account/_assert.js +0 -27
- package/app-backend/api/v1/account/_assert.js.map +0 -1
- package/app-backend/api/v1/account/_imports.d.ts +0 -4
- package/app-backend/api/v1/account/_imports.js +0 -22
- package/app-backend/api/v1/account/create.d.ts +0 -1
- package/app-backend/api/v1/account/create.js +0 -28
- package/app-backend/api/v1/account/create.js.map +0 -1
- package/app-backend/api/v1/account/list.d.ts +0 -1
- package/app-backend/api/v1/account/list.js +0 -27
- package/app-backend/api/v1/account/list.js.map +0 -1
- package/app-backend/api/v1/account/login-saml.d.ts +0 -1
- package/app-backend/api/v1/account/login-saml.js +0 -27
- package/app-backend/api/v1/account/login-saml.js.map +0 -1
- package/app-backend/api/v1/account/login.d.ts +0 -1
- package/app-backend/api/v1/account/login.js +0 -27
- package/app-backend/api/v1/account/login.js.map +0 -1
- package/app-backend/api/v1/account/logout.d.ts +0 -1
- package/app-backend/api/v1/account/logout.js +0 -29
- package/app-backend/api/v1/account/logout.js.map +0 -1
- package/app-backend/api/v1/account/upsert.d.ts +0 -1
- package/app-backend/api/v1/account/upsert.js +0 -30
- package/app-backend/api/v1/account/upsert.js.map +0 -1
- package/app-backend/api/v1/account/validate.d.ts +0 -1
- package/app-backend/api/v1/account/validate.js +0 -27
- package/app-backend/api/v1/account/validate.js.map +0 -1
- package/app-backend/apis/add-new-account.js +0 -29
- package/app-backend/apis/add-new-account.js.map +0 -1
- package/app-backend/core/module-pack.d.ts +0 -3
- package/app-backend/core/module-pack.js +0 -26
- package/app-backend/core/module-pack.js.map +0 -1
- package/app-backend/modules/AccountModule.js +0 -395
- package/app-backend/modules/AccountModule.js.map +0 -1
- package/app-backend/modules/JWTBuilder.js +0 -116
- package/app-backend/modules/JWTBuilder.js.map +0 -1
- package/app-backend/modules/SamlModule.js +0 -60
- package/app-backend/modules/SamlModule.js.map +0 -1
- package/app-backend/modules/SecretsModule.js +0 -137
- package/app-backend/modules/SecretsModule.js.map +0 -1
- package/app-backend/modules/_imports.js +0 -18
- package/app-frontend/core/module-pack.d.ts +0 -2
- package/app-frontend/core/module-pack.js +0 -23
- package/app-frontend/core/module-pack.js.map +0 -1
- package/app-frontend/modules/AccountModule.js +0 -164
- package/app-frontend/modules/AccountModule.js.map +0 -1
- package/app-frontend/ui/Component_Login.js +0 -68
- package/app-frontend/ui/Component_Login.js.map +0 -1
- package/app-frontend/ui/Component_Register.js +0 -74
- package/app-frontend/ui/Component_Register.js.map +0 -1
- package/backend.d.ts +0 -2
- package/backend.js +0 -19
- package/backend.js.map +0 -1
- package/frontend.d.ts +0 -3
- package/frontend.js +0 -20
- package/frontend.js.map +0 -1
- package/index.d.ts +0 -2
- package/index.js +0 -19
- package/index.js.map +0 -1
- package/shared/api.js +0 -16
- package/shared/api.js.map +0 -1
- package/shared/types.d.ts +0 -0
- package/shared/types.js +0 -2
- package/shared/utils/AuthenticationConsts.js +0 -6
- /package/{shared → dist/shared}/types.js.map +0 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { __stringify, auditBy, currentTimeMillies, Day, Dispatcher, generateHex, hashPasswordWithSalt, Minute, Module, validate, validateEmail, batchActionParallel } from "@intuitionrobotics/ts-common";
|
|
2
|
+
import { FirebaseModule, FirestoreCollection, FirestoreTransaction } from "@intuitionrobotics/firebase/backend";
|
|
3
|
+
import { FrontType, HeaderKey_SessionId, QueryParam_Email, QueryParam_JWT, QueryParam_RedirectUrl, QueryParam_SessionId } from "./_imports.js";
|
|
4
|
+
import { ApiException, ApiResponse, HeaderKey } from "@intuitionrobotics/thunderstorm/backend";
|
|
5
|
+
import { SecretsModule } from "./SecretsModule.js";
|
|
6
|
+
import { SamlModule } from "./SamlModule.js";
|
|
7
|
+
import { HeaderKey_JWT } from "@intuitionrobotics/thunderstorm";
|
|
8
|
+
export const Header_SessionId = new HeaderKey(HeaderKey_SessionId, 404);
|
|
9
|
+
export const Collection_Sessions = "user-account--sessions";
|
|
10
|
+
export const Collection_Accounts = "user-account--accounts";
|
|
11
|
+
const dispatch_onUserLogin = new Dispatcher("__onUserLogin");
|
|
12
|
+
const dispatch_onNewUserRegistered = new Dispatcher("__onNewUserRegistered");
|
|
13
|
+
function getUIAccount(account) {
|
|
14
|
+
const { email, _id, createdTimestamp } = account;
|
|
15
|
+
return { email, _id, createdTimestamp };
|
|
16
|
+
}
|
|
17
|
+
export class AccountsModule_Class extends Module {
|
|
18
|
+
constructor() {
|
|
19
|
+
super("AccountsModule");
|
|
20
|
+
this.setDefaultConfig({ sessionTTLms: { web: Day, app: Day, jwt: 30 * Minute }, jwtSecretKey: "TS_AUTH_SECRET" });
|
|
21
|
+
}
|
|
22
|
+
async __queryRequestInfo(request) {
|
|
23
|
+
let data;
|
|
24
|
+
try {
|
|
25
|
+
data = await this.validateSession(request, []);
|
|
26
|
+
}
|
|
27
|
+
catch (_e) {
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
key: this.getName(),
|
|
31
|
+
data: data
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
sessions;
|
|
35
|
+
accounts;
|
|
36
|
+
init() {
|
|
37
|
+
const firestore = FirebaseModule.createAdminSession(this.config.projectId).getFirestore();
|
|
38
|
+
this.sessions = firestore.getCollection(Collection_Sessions, ["userId"]);
|
|
39
|
+
this.accounts = firestore.getCollection(Collection_Accounts, ["email"]);
|
|
40
|
+
}
|
|
41
|
+
async getUser(_email) {
|
|
42
|
+
const email = _email.toLowerCase();
|
|
43
|
+
return this.accounts.queryUnique({
|
|
44
|
+
where: { email },
|
|
45
|
+
select: ["email",
|
|
46
|
+
"_id"]
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async getUsers(_emails) {
|
|
50
|
+
return batchActionParallel(_emails, 10, async (batchedEmails) => {
|
|
51
|
+
return this.accounts.query({
|
|
52
|
+
where: {
|
|
53
|
+
email: {
|
|
54
|
+
$in: batchedEmails.map(e => e.toLowerCase())
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
select: ["email", "_id"]
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async listUsers() {
|
|
62
|
+
return this.accounts.getAll(["_id",
|
|
63
|
+
"email"]);
|
|
64
|
+
}
|
|
65
|
+
async listSessions() {
|
|
66
|
+
return this.sessions.getAll(["userId",
|
|
67
|
+
"timestamp"]);
|
|
68
|
+
}
|
|
69
|
+
async getSession(_email) {
|
|
70
|
+
const email = _email.toLowerCase();
|
|
71
|
+
return this.accounts.queryUnique({ where: { email } });
|
|
72
|
+
}
|
|
73
|
+
async querySessions(_email) {
|
|
74
|
+
const account = await this.getSession(_email);
|
|
75
|
+
if (!account)
|
|
76
|
+
return;
|
|
77
|
+
const sessions = await this.sessions.query({
|
|
78
|
+
select: ["userId",
|
|
79
|
+
"timestamp",
|
|
80
|
+
"version",
|
|
81
|
+
"frontType"], where: { userId: account._id }
|
|
82
|
+
});
|
|
83
|
+
return sessions.map((session) => {
|
|
84
|
+
return {
|
|
85
|
+
...session,
|
|
86
|
+
isExpired: this.TTLExpired(session)
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async create(request, response) {
|
|
91
|
+
const account = await this.createAccount(request);
|
|
92
|
+
const session = await this.login(request, response);
|
|
93
|
+
await dispatch_onNewUserRegistered.dispatchModuleAsync(getUIAccount(account));
|
|
94
|
+
return session;
|
|
95
|
+
}
|
|
96
|
+
async upsert(request) {
|
|
97
|
+
let callback = () => Promise.resolve([]);
|
|
98
|
+
const account = await this.accounts.runInTransaction(async (transaction) => {
|
|
99
|
+
const existAccount = await transaction.queryUnique(this.accounts, { where: { email: request.email } });
|
|
100
|
+
if (existAccount)
|
|
101
|
+
return this.changePassword(request.email, request.password, transaction);
|
|
102
|
+
callback = async () => dispatch_onNewUserRegistered.dispatchModuleAsync(getUIAccount(account));
|
|
103
|
+
return this.createImpl(request, transaction);
|
|
104
|
+
});
|
|
105
|
+
await this.loginValidate(request);
|
|
106
|
+
await callback();
|
|
107
|
+
return getUIAccount(account);
|
|
108
|
+
}
|
|
109
|
+
async addNewAccount(email, password, password_check) {
|
|
110
|
+
let account;
|
|
111
|
+
if (password && password_check) {
|
|
112
|
+
account = await this.createAccount({ password, password_check, email });
|
|
113
|
+
await dispatch_onNewUserRegistered.dispatchModuleAsync(getUIAccount(account));
|
|
114
|
+
}
|
|
115
|
+
else
|
|
116
|
+
account = await this.createSAML(email);
|
|
117
|
+
return getUIAccount(account);
|
|
118
|
+
}
|
|
119
|
+
async changePassword(userEmail, newPassword, _transaction) {
|
|
120
|
+
const email = userEmail.toLowerCase();
|
|
121
|
+
const processor = async (transaction) => {
|
|
122
|
+
const account = await transaction.queryUnique(this.accounts, { where: { email } });
|
|
123
|
+
if (!account)
|
|
124
|
+
throw new ApiException(422, "User with email does not exist");
|
|
125
|
+
if (!account.saltedPassword || !account.salt)
|
|
126
|
+
throw new ApiException(401, "Account login using SAML");
|
|
127
|
+
account.saltedPassword = hashPasswordWithSalt(account.salt, newPassword);
|
|
128
|
+
account._audit = auditBy(email, 'Changed password');
|
|
129
|
+
return transaction.upsert(this.accounts, account);
|
|
130
|
+
};
|
|
131
|
+
if (_transaction)
|
|
132
|
+
return processor(_transaction);
|
|
133
|
+
return this.accounts.runInTransaction(processor);
|
|
134
|
+
}
|
|
135
|
+
async createAccount(request) {
|
|
136
|
+
request.email = request.email.toLowerCase();
|
|
137
|
+
validate(request.email, validateEmail);
|
|
138
|
+
return this.accounts.runInTransaction(async (transaction) => {
|
|
139
|
+
const account = await transaction.queryUnique(this.accounts, { where: { email: request.email } });
|
|
140
|
+
if (account)
|
|
141
|
+
throw new ApiException(422, "User with email already exists");
|
|
142
|
+
return this.createImpl(request, transaction);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
createImpl(request, transaction) {
|
|
146
|
+
const salt = generateHex(32);
|
|
147
|
+
const account = {
|
|
148
|
+
_id: generateHex(32),
|
|
149
|
+
_audit: auditBy(request.email),
|
|
150
|
+
createdTimestamp: currentTimeMillies(),
|
|
151
|
+
email: request.email,
|
|
152
|
+
salt,
|
|
153
|
+
saltedPassword: hashPasswordWithSalt(salt, request.password)
|
|
154
|
+
};
|
|
155
|
+
return transaction.insert(this.accounts, account);
|
|
156
|
+
}
|
|
157
|
+
async logout(sessionId) {
|
|
158
|
+
const query = { where: { sessionId } };
|
|
159
|
+
await this.sessions.deleteUnique(query);
|
|
160
|
+
}
|
|
161
|
+
async logoutAccount(accountId) {
|
|
162
|
+
await this.sessions.delete({ where: { userId: accountId } });
|
|
163
|
+
}
|
|
164
|
+
async login(request, response) {
|
|
165
|
+
return this.loginValidate(request, response);
|
|
166
|
+
}
|
|
167
|
+
async loginValidate(request, response) {
|
|
168
|
+
request.email = request.email.toLowerCase();
|
|
169
|
+
const query = { where: { email: request.email } };
|
|
170
|
+
const account = await this.accounts.queryUnique(query);
|
|
171
|
+
if (!account)
|
|
172
|
+
throw new ApiException(401, "account does not exists");
|
|
173
|
+
if (!account.saltedPassword || !account.salt)
|
|
174
|
+
throw new ApiException(401, "Account login using SAML");
|
|
175
|
+
if (account.saltedPassword !== hashPasswordWithSalt(account.salt, request.password))
|
|
176
|
+
throw new ApiException(401, "wrong username or password");
|
|
177
|
+
if (!account._id) {
|
|
178
|
+
account._id = generateHex(32);
|
|
179
|
+
await this.accounts.upsert(account);
|
|
180
|
+
}
|
|
181
|
+
let sessionWithAccountId;
|
|
182
|
+
if (response) {
|
|
183
|
+
sessionWithAccountId = await this.upsertSession(account, request.frontType);
|
|
184
|
+
this.setJWTinResp(response, sessionWithAccountId.jwt);
|
|
185
|
+
}
|
|
186
|
+
await dispatch_onUserLogin.dispatchModuleAsync(getUIAccount(account));
|
|
187
|
+
return sessionWithAccountId;
|
|
188
|
+
}
|
|
189
|
+
async loginSAML(__email) {
|
|
190
|
+
const _email = __email.toLowerCase();
|
|
191
|
+
const account = await this.createSAML(_email);
|
|
192
|
+
const sessionWithAccountId = await this.upsertSession(account);
|
|
193
|
+
await dispatch_onUserLogin.dispatchModuleAsync(getUIAccount(account));
|
|
194
|
+
return sessionWithAccountId;
|
|
195
|
+
}
|
|
196
|
+
async createSAML(__email) {
|
|
197
|
+
const _email = __email.toLowerCase();
|
|
198
|
+
const query = { where: { email: _email } };
|
|
199
|
+
let dispatchEvent = false;
|
|
200
|
+
const toRet = await this.accounts.runInTransaction(async (transaction) => {
|
|
201
|
+
const account = await transaction.queryUnique(this.accounts, query);
|
|
202
|
+
if (account?._id)
|
|
203
|
+
return account;
|
|
204
|
+
const _account = {
|
|
205
|
+
_id: generateHex(32),
|
|
206
|
+
_audit: auditBy(_email),
|
|
207
|
+
createdTimestamp: currentTimeMillies(),
|
|
208
|
+
email: _email,
|
|
209
|
+
...account
|
|
210
|
+
};
|
|
211
|
+
dispatchEvent = true;
|
|
212
|
+
return transaction.upsert(this.accounts, _account);
|
|
213
|
+
});
|
|
214
|
+
if (dispatchEvent)
|
|
215
|
+
await dispatch_onNewUserRegistered.dispatchModuleAsync(getUIAccount(toRet));
|
|
216
|
+
return toRet;
|
|
217
|
+
}
|
|
218
|
+
isAuthRequest = (request) => request.header(SecretsModule.AUTHENTICATION_KEY) !== undefined;
|
|
219
|
+
verifyAccount(account) {
|
|
220
|
+
if (!account)
|
|
221
|
+
throw new ApiException(401, 'Missing account in token payload');
|
|
222
|
+
const email = account['email'];
|
|
223
|
+
if (!email || typeof email !== 'string')
|
|
224
|
+
throw new ApiException(401, 'Missing email in token payload');
|
|
225
|
+
const _id = account['_id'];
|
|
226
|
+
if (!_id || typeof _id !== 'string')
|
|
227
|
+
throw new ApiException(401, 'Missing _id in token payload');
|
|
228
|
+
return { _id, email };
|
|
229
|
+
}
|
|
230
|
+
async validateAuthenticationHeader(request, scopes, response) {
|
|
231
|
+
const token = SecretsModule.validateRequest(request, scopes);
|
|
232
|
+
const payload = token.payload;
|
|
233
|
+
const isExpired = SecretsModule.isExpired(token);
|
|
234
|
+
const sessionId = payload.sessionId;
|
|
235
|
+
if (!sessionId)
|
|
236
|
+
throw new ApiException(401, `Missing session id in token ${JSON.stringify(payload)}`);
|
|
237
|
+
if (!isExpired) {
|
|
238
|
+
const account = payload.account;
|
|
239
|
+
this.verifyAccount(account);
|
|
240
|
+
return account;
|
|
241
|
+
}
|
|
242
|
+
const dbAccount = await this.validateSessionId(sessionId);
|
|
243
|
+
if (response) {
|
|
244
|
+
const jwt = this.generateJWT(dbAccount, sessionId);
|
|
245
|
+
this.setJWTinResp(response, jwt);
|
|
246
|
+
}
|
|
247
|
+
return dbAccount;
|
|
248
|
+
}
|
|
249
|
+
setJWTinResp(response, jwt) {
|
|
250
|
+
// Set in header response
|
|
251
|
+
response.setHeaders({ [HeaderKey_JWT]: jwt });
|
|
252
|
+
}
|
|
253
|
+
generateJWT(account, sessionId) {
|
|
254
|
+
return SecretsModule.generateJwt({
|
|
255
|
+
account,
|
|
256
|
+
sessionId,
|
|
257
|
+
exp: currentTimeMillies() + this.config.sessionTTLms.jwt
|
|
258
|
+
}, this.config.jwtSecretKey);
|
|
259
|
+
}
|
|
260
|
+
validateSession = async (request, scopes, response) => {
|
|
261
|
+
if (this.isAuthRequest(request))
|
|
262
|
+
return this.validateAuthenticationHeader(request, scopes, response);
|
|
263
|
+
return await this.validateSessionId(Header_SessionId.get(request));
|
|
264
|
+
};
|
|
265
|
+
async validateSessionId(sessionId) {
|
|
266
|
+
const query = { where: { sessionId } };
|
|
267
|
+
const session = await this.sessions.queryUnique(query);
|
|
268
|
+
if (!session)
|
|
269
|
+
throw new ApiException(401, `Invalid session id: ${sessionId}`);
|
|
270
|
+
if (this.TTLExpired(session))
|
|
271
|
+
throw new ApiException(401, "Session timed out");
|
|
272
|
+
return await this.getUserEmailFromSession(session);
|
|
273
|
+
}
|
|
274
|
+
async getUserEmailFromSession(session) {
|
|
275
|
+
const account = await this.accounts.queryUnique({ where: { _id: session.userId } });
|
|
276
|
+
if (!account) {
|
|
277
|
+
await this.sessions.deleteItem(session);
|
|
278
|
+
throw new ApiException(403, `No user found for session: ${__stringify(session)}`);
|
|
279
|
+
}
|
|
280
|
+
return getUIAccount(account);
|
|
281
|
+
}
|
|
282
|
+
async getUserEmailFromUserId(userId) {
|
|
283
|
+
const account = await this.accounts.queryUnique({ where: { _id: userId } });
|
|
284
|
+
if (!account)
|
|
285
|
+
throw new ApiException(403, `No user found for session: ${userId}`);
|
|
286
|
+
return getUIAccount(account);
|
|
287
|
+
}
|
|
288
|
+
TTLExpired = (session) => {
|
|
289
|
+
const delta = currentTimeMillies() - session.timestamp;
|
|
290
|
+
const sessionTTLms = this.config.sessionTTLms.web;
|
|
291
|
+
if (session.frontType === FrontType.App)
|
|
292
|
+
return false;
|
|
293
|
+
return delta > sessionTTLms || delta < 0;
|
|
294
|
+
};
|
|
295
|
+
async getAccountFromParams(p) {
|
|
296
|
+
if (typeof p === "string")
|
|
297
|
+
return this.getUserEmailFromUserId(p);
|
|
298
|
+
return getUIAccount(p);
|
|
299
|
+
}
|
|
300
|
+
async upsertSession(p, frontType) {
|
|
301
|
+
const account = await this.getAccountFromParams(p);
|
|
302
|
+
const session = await this.getSessionFromAccount(account, frontType);
|
|
303
|
+
const sessionId = session.sessionId;
|
|
304
|
+
return { sessionId, jwt: this.generateJWT(account, sessionId), email: account.email, _id: account._id, createdTimestamp: account.createdTimestamp };
|
|
305
|
+
}
|
|
306
|
+
;
|
|
307
|
+
async getSessionFromAccount(account, frontType) {
|
|
308
|
+
const session = await this.sessions.queryUnique({ where: { userId: account._id } });
|
|
309
|
+
if (session && !this.TTLExpired(session))
|
|
310
|
+
return session;
|
|
311
|
+
const _session = {
|
|
312
|
+
sessionId: generateHex(64),
|
|
313
|
+
timestamp: currentTimeMillies(),
|
|
314
|
+
userId: account._id,
|
|
315
|
+
};
|
|
316
|
+
if (frontType)
|
|
317
|
+
_session.frontType = frontType;
|
|
318
|
+
return this.sessions.upsert(_session);
|
|
319
|
+
}
|
|
320
|
+
async assertApi(body, response) {
|
|
321
|
+
const options = {
|
|
322
|
+
request_body: body
|
|
323
|
+
};
|
|
324
|
+
try {
|
|
325
|
+
const data = await SamlModule.assert(options);
|
|
326
|
+
this.logDebug(`Got data from assertion ${__stringify(data)}`);
|
|
327
|
+
const email = data.userId;
|
|
328
|
+
const loginData = await AccountModule.loginSAML(email);
|
|
329
|
+
let redirectUrl = data.loginContext[QueryParam_RedirectUrl];
|
|
330
|
+
redirectUrl = redirectUrl.replace(new RegExp(QueryParam_SessionId.toUpperCase(), "g"), loginData.sessionId);
|
|
331
|
+
redirectUrl = redirectUrl.replace(new RegExp(QueryParam_Email.toUpperCase(), "g"), email);
|
|
332
|
+
redirectUrl = redirectUrl.replace(new RegExp(QueryParam_JWT.toUpperCase(), "g"), loginData.jwt);
|
|
333
|
+
return await response.redirect(302, redirectUrl);
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
throw new ApiException(401, 'Error authenticating user', error);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
export const AccountModule = new AccountsModule_Class();
|
|
341
|
+
//# sourceMappingURL=AccountModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountModule.js","sourceRoot":"","sources":["../../../src/main/app-backend/modules/AccountModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ObjectTS } from "@intuitionrobotics/ts-common";
|
|
2
|
-
import { Algorithm } from "jws";
|
|
1
|
+
import { type ObjectTS } from "@intuitionrobotics/ts-common";
|
|
2
|
+
import { type Algorithm } from "jws";
|
|
3
3
|
export declare const ALGORITHM = "alg";
|
|
4
4
|
export declare const CONTENT_TYPE = "cty";
|
|
5
5
|
export declare const TYPE = "typ";
|
|
@@ -36,3 +36,4 @@ export declare class JWTBuilder {
|
|
|
36
36
|
private assertAlg;
|
|
37
37
|
build(secret: string): string;
|
|
38
38
|
}
|
|
39
|
+
//# sourceMappingURL=JWTBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JWTBuilder.d.ts","sourceRoot":"","sources":["../../../src/main/app-backend/modules/JWTBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,QAAQ,EACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEN,KAAK,SAAS,EAGd,MAAM,KAAK,CAAC;AAIb,eAAO,MAAM,SAAS,QAAQ,CAAC;AAC/B,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,IAAI,QAAQ,CAAC;AAC1B,eAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,eAAO,MAAM,OAAO,QAAQ,CAAC;AAC7B,eAAO,MAAM,UAAU,QAAQ,CAAC;AAChC,eAAO,MAAM,UAAU,QAAQ,CAAC;AAChC,eAAO,MAAM,SAAS,QAAQ,CAAC;AAC/B,eAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAE9B,eAAO,MAAM,WAAW,EAAE,MAAc,CAAC;AAEzC,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,GAAG,EAAE,SAAS;IAS1B,SAAS,CAAC,MAAM,EAAE,QAAQ;IAK1B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAKhC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAOjC,cAAc,GAAI,KAAK,MAAM,UAG3B;IAEF,OAAO,GAAI,KAAK,MAAM,UAGpB;IAEF,QAAQ,GAAI,KAAK,MAAM,UAGrB;IAIF,SAAS,CAAC,GAAG,EAAE,MAAM;IAKrB,MAAM,CAAC,GAAG,EAAE,MAAM;IAKlB,aAAa,CAAC,GAAG,EAAE,MAAM;IAKzB,YAAY,CAAC,GAAG,EAAE,MAAM;IAKxB,OAAO,CAAC,WAAW;IAInB,QAAQ,CAAC,GAAG,EAAE,MAAM;IAKpB,WAAW,CAAC,GAAG,EAAE,MAAM;IAOvB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAMjB,KAAK,CAAC,MAAM,EAAE,MAAM;CAiBpB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { BadImplementationException, currentTimeMillies } from "@intuitionrobotics/ts-common";
|
|
2
|
+
import { sign, ALGORITHMS } from "jws";
|
|
3
|
+
import { SecretsModule } from "./SecretsModule.js";
|
|
4
|
+
//Header
|
|
5
|
+
export const ALGORITHM = "alg";
|
|
6
|
+
export const CONTENT_TYPE = "cty";
|
|
7
|
+
export const TYPE = "typ";
|
|
8
|
+
export const KEY_ID = "kid";
|
|
9
|
+
//Payload
|
|
10
|
+
export const ISSUER = "iss";
|
|
11
|
+
export const SUBJECT = "sub";
|
|
12
|
+
export const EXPIRES_AT = "exp";
|
|
13
|
+
export const NOT_BEFORE = "nbf";
|
|
14
|
+
export const ISSUED_AT = "iat";
|
|
15
|
+
export const JWT_ID = "jti";
|
|
16
|
+
export const AUDIENCE = "aud";
|
|
17
|
+
export const TYP_DEFAULT = "JWT";
|
|
18
|
+
export class JWTBuilder {
|
|
19
|
+
payload = {};
|
|
20
|
+
header;
|
|
21
|
+
constructor(alg) {
|
|
22
|
+
this.assertAlg(alg);
|
|
23
|
+
this.header = {
|
|
24
|
+
[ALGORITHM]: alg
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Generic
|
|
28
|
+
addClaims(claims) {
|
|
29
|
+
Object.keys(claims).forEach(k => this.addClaim(k, claims[k]));
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
addClaim(key, value) {
|
|
33
|
+
this.payload[key] = value;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
addHeader(key, value) {
|
|
37
|
+
this.header[key] = value;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
// End Generic
|
|
41
|
+
setContentType = (cty) => {
|
|
42
|
+
this.header[CONTENT_TYPE] = cty;
|
|
43
|
+
return this;
|
|
44
|
+
};
|
|
45
|
+
setType = (typ) => {
|
|
46
|
+
this.header[TYPE] = typ;
|
|
47
|
+
return this;
|
|
48
|
+
};
|
|
49
|
+
setKeyID = (kid) => {
|
|
50
|
+
this.header[KEY_ID] = kid;
|
|
51
|
+
return this;
|
|
52
|
+
};
|
|
53
|
+
// Payload
|
|
54
|
+
setIssuer(iss) {
|
|
55
|
+
this.payload[ISSUER] = iss;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
setSub(iss) {
|
|
59
|
+
this.payload[SUBJECT] = iss;
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
setExpiration(exp) {
|
|
63
|
+
this.payload[EXPIRES_AT] = exp;
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
setNotBefore(nbf) {
|
|
67
|
+
this.payload[NOT_BEFORE] = nbf;
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
setIssuedAt() {
|
|
71
|
+
this.payload[ISSUED_AT] = Math.floor(currentTimeMillies() / 1000);
|
|
72
|
+
}
|
|
73
|
+
setJWTID(jti) {
|
|
74
|
+
this.payload[JWT_ID] = jti;
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
setAudience(aud) {
|
|
78
|
+
this.payload[AUDIENCE] = aud;
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
// End Payload
|
|
82
|
+
getIssuer() {
|
|
83
|
+
return this.payload[ISSUER];
|
|
84
|
+
}
|
|
85
|
+
getAlgorithm() {
|
|
86
|
+
return this.header[ALGORITHM];
|
|
87
|
+
}
|
|
88
|
+
getExpiration() {
|
|
89
|
+
return this.payload[EXPIRES_AT];
|
|
90
|
+
}
|
|
91
|
+
getType() {
|
|
92
|
+
return this.header[TYPE];
|
|
93
|
+
}
|
|
94
|
+
assertAlg(alg) {
|
|
95
|
+
const foundAlg = ALGORITHMS.find(a => a === alg);
|
|
96
|
+
if (!foundAlg)
|
|
97
|
+
throw new BadImplementationException(`Algorithm with name ${alg} is not valid`);
|
|
98
|
+
}
|
|
99
|
+
build(secret) {
|
|
100
|
+
this.setIssuedAt();
|
|
101
|
+
if (!this.getType())
|
|
102
|
+
this.setType(TYP_DEFAULT);
|
|
103
|
+
if (!this.getIssuer())
|
|
104
|
+
// TODO move the config to the module which I need to create
|
|
105
|
+
this.setIssuer(SecretsModule.getIss());
|
|
106
|
+
if (!this.getExpiration())
|
|
107
|
+
throw new BadImplementationException("Missing expiration, cannot build a valid JWT without this value");
|
|
108
|
+
if (!this.getAlgorithm())
|
|
109
|
+
throw new BadImplementationException("Missing algorithm, cannot build a valid JWT without this value");
|
|
110
|
+
return sign({ secret, payload: this.payload, header: this.header });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=JWTBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JWTBuilder.js","sourceRoot":"","sources":["../../../src/main/app-backend/modules/JWTBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IdentityProvider, IdentityProviderOptions, SAMLAssertResponse, ServiceProviderOptions } from "saml2-js";
|
|
1
|
+
import { IdentityProvider, type IdentityProviderOptions, type SAMLAssertResponse, type ServiceProviderOptions } from "saml2-js";
|
|
2
2
|
import { Module } from "@intuitionrobotics/ts-common";
|
|
3
|
-
import { RequestBody_SamlAssertOptions, RequestParams_LoginSAML } from "./_imports";
|
|
3
|
+
import { type RequestBody_SamlAssertOptions, type RequestParams_LoginSAML } from "./_imports.js";
|
|
4
4
|
type SamlConfig = {
|
|
5
5
|
idConfig: IdentityProviderOptions;
|
|
6
6
|
spConfig: ServiceProviderOptions;
|
|
@@ -19,3 +19,4 @@ export declare class SamlModule_Class extends Module<SamlConfig> {
|
|
|
19
19
|
}
|
|
20
20
|
export declare const SamlModule: SamlModule_Class;
|
|
21
21
|
export {};
|
|
22
|
+
//# sourceMappingURL=SamlModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SamlModule.d.ts","sourceRoot":"","sources":["../../../src/main/app-backend/modules/SamlModule.ts"],"names":[],"mappings":"AACA,OAAO,EACN,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAEvB,KAAK,sBAAsB,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAGN,MAAM,EACN,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,MAAM,eAAe,CAAC;AAEvB,KAAK,UAAU,GAAG;IACjB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,sBAAsB,CAAA;CAChC,CAAC;AAiBF,KAAK,kBAAkB,GAAG;IACzB,YAAY,EAAE,kBAAkB,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,uBAAuB,CAAA;CACrC,CAAA;AAED,qBAAa,gBACZ,SAAQ,MAAM,CAAC,UAAU,CAAC;IAEnB,gBAAgB,EAAG,gBAAgB,CAAC;;IAM3C,SAAS,CAAC,IAAI,IAAI,IAAI;IAUtB,YAAY,GAAU,cAAc,uBAAuB,qBAczD;IAEF,MAAM,GAAU,SAAS,6BAA6B,KAAG,OAAO,CAAC,kBAAkB,CAAC,CAiBjF;CACH;AAED,eAAO,MAAM,UAAU,kBAAyB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { IdentityProvider, ServiceProvider } from "saml2-js";
|
|
2
|
+
import { __stringify, ImplementationMissingException, Module } from "@intuitionrobotics/ts-common";
|
|
3
|
+
import {} from "./_imports.js";
|
|
4
|
+
export class SamlModule_Class extends Module {
|
|
5
|
+
identityProvider;
|
|
6
|
+
constructor() {
|
|
7
|
+
super("SamlModule");
|
|
8
|
+
}
|
|
9
|
+
init() {
|
|
10
|
+
if (!this.config.idConfig)
|
|
11
|
+
throw new ImplementationMissingException("Config must contain idConfig");
|
|
12
|
+
if (!this.config.spConfig)
|
|
13
|
+
throw new ImplementationMissingException("Config must contain spConfig");
|
|
14
|
+
this.identityProvider = new IdentityProvider(this.config.idConfig);
|
|
15
|
+
}
|
|
16
|
+
loginRequest = async (loginContext) => {
|
|
17
|
+
return new Promise((resolve, rejected) => {
|
|
18
|
+
const sp = new ServiceProvider(this.config.spConfig);
|
|
19
|
+
const options = {
|
|
20
|
+
relay_state: __stringify(loginContext)
|
|
21
|
+
};
|
|
22
|
+
sp.create_login_request_url(this.identityProvider, options, (error, loginUrl, _requestId) => {
|
|
23
|
+
if (error)
|
|
24
|
+
return rejected(error);
|
|
25
|
+
resolve(loginUrl);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
assert = async (options) => new Promise((resolve, rejected) => {
|
|
30
|
+
const sp = new ServiceProvider(this.config.spConfig);
|
|
31
|
+
sp.post_assert(this.identityProvider, options, async (error, response) => {
|
|
32
|
+
if (error)
|
|
33
|
+
return rejected(error);
|
|
34
|
+
const userId = response.user.name_id;
|
|
35
|
+
const relay_state = options.request_body.RelayState;
|
|
36
|
+
if (!relay_state)
|
|
37
|
+
return rejected(`LoginContext lost along the way for userId '${userId}'`);
|
|
38
|
+
resolve({
|
|
39
|
+
userId: userId,
|
|
40
|
+
loginContext: JSON.parse(relay_state),
|
|
41
|
+
fullResponse: response
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export const SamlModule = new SamlModule_Class();
|
|
47
|
+
//# sourceMappingURL=SamlModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SamlModule.js","sourceRoot":"","sources":["../../../src/main/app-backend/modules/SamlModule.ts"],"names":[],"mappings":"AACA,OAAO,EACN,gBAAgB,EAGhB,eAAe,EAEf,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,WAAW,EACX,8BAA8B,EAC9B,MAAM,EACN,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAGN,MAAM,eAAe,CAAC;AA4BvB,MAAM,OAAO,gBACZ,SAAQ,MAAkB;IAEnB,gBAAgB,CAAoB;IAE3C;QACC,KAAK,CAAC,YAAY,CAAC,CAAC;IACrB,CAAC;IAES,IAAI;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YACxB,MAAM,IAAI,8BAA8B,CAAC,8BAA8B,CAAC,CAAC;QAE1E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YACxB,MAAM,IAAI,8BAA8B,CAAC,8BAA8B,CAAC,CAAC;QAE1E,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAED,YAAY,GAAG,KAAK,EAAE,YAAqC,EAAE,EAAE;QAC9D,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;YAChD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG;gBACf,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC;aACtC,CAAC;YACF,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;gBAC3F,IAAI,KAAK;oBACR,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAExB,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IAEJ,CAAC,CAAC;IAEF,MAAM,GAAG,KAAK,EAAE,OAAsC,EAA+B,EAAE,CAAC,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC7I,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAA4B,EAAE,EAAE;YAC5F,IAAI,KAAK;gBACR,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;YAExB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACrC,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;YACpD,IAAI,CAAC,WAAW;gBACf,OAAO,QAAQ,CAAC,+CAA+C,MAAM,GAAG,CAAC,CAAC;YAE3E,OAAO,CAAC;gBACC,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBACrC,YAAY,EAAE,QAAQ;aACtB,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;CACH;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Module, ObjectTS } from "@intuitionrobotics/ts-common";
|
|
2
|
-
import { ApiException, ExpressRequest } from "@intuitionrobotics/thunderstorm/backend";
|
|
1
|
+
import { Module, type ObjectTS } from "@intuitionrobotics/ts-common";
|
|
2
|
+
import { ApiException, type ExpressRequest } from "@intuitionrobotics/thunderstorm/backend";
|
|
3
3
|
import * as jws from "jws";
|
|
4
|
-
import { Algorithm, Signature } from "jws";
|
|
4
|
+
import { type Algorithm, type Signature } from "jws";
|
|
5
5
|
export declare class TokenExpiredException extends ApiException {
|
|
6
6
|
constructor(message: string, cause?: Error);
|
|
7
7
|
}
|
|
@@ -36,3 +36,4 @@ export declare class SecretsModule_Class extends Module<Config> {
|
|
|
36
36
|
}
|
|
37
37
|
export declare const SecretsModule: SecretsModule_Class;
|
|
38
38
|
export {};
|
|
39
|
+
//# sourceMappingURL=SecretsModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecretsModule.d.ts","sourceRoot":"","sources":["../../../src/main/app-backend/modules/SecretsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,MAAM,EACN,KAAK,QAAQ,EAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,YAAY,EAAE,KAAK,cAAc,EAAC,MAAM,yCAAyC,CAAC;AAC1F,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAC,MAAM,KAAK,CAAC;AAInD,qBAAa,qBACT,SAAQ,YAAY;gBACR,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAG7C;AAED,KAAK,MAAM,GAAG;IACV,OAAO,CAAC,EAAE;QACN,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAC;IACF,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,KAAK,MAAM,GAAG;IACV,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,qBAAa,mBACT,SAAQ,MAAM,CAAC,MAAM,CAAC;IACtB,OAAO,CAAC,WAAW,CAAW;IAEvB,qBAAqB,SAAyB;IAC9C,kBAAkB,SAAsB;;IAO/C,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAWrB,aAAa,GAAI,KAAK,MAAM,KAAG,MAAM,CAE1C;IAEF,OAAO,CAAC,SAAS,CAQf;IAEF,iCAAiC,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE;IAY3E,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE;IA6BzD,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAOnD,gBAAgB,CAAC,OAAO,EAAE,cAAc;IAuBxC,SAAS,GAAI,OAAO,SAAS,aAElC;IAEK,aAAa,CAAC,KAAK,EAAE,SAAS;IAkBrC,WAAW,GAAI,SAAS,QAAQ,EAAE,KAAK,MAAM,EAAE,YAAW,SAAmB,YAS3E;IAEK,MAAM,eAKX;IAEF,SAAS,GAAI,KAAK,MAAM,0BAEvB;CACJ;AAED,eAAO,MAAM,aAAa,qBAA4B,CAAA"}
|