@abtnode/auth 1.16.23-beta-2229bcee → 1.16.23-beta-c9c4e08e
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/lib/auth.js +7 -3
- package/lib/invitation.js +132 -10
- package/lib/lost-passport.js +9 -5
- package/package.json +7 -7
package/lib/auth.js
CHANGED
|
@@ -799,9 +799,13 @@ const handleIssuePassportResponse = async ({
|
|
|
799
799
|
await updateSession({ passportId: vc.id });
|
|
800
800
|
|
|
801
801
|
return {
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
802
|
+
response: {
|
|
803
|
+
disposition: 'attachment',
|
|
804
|
+
type: 'VerifiableCredential',
|
|
805
|
+
data: vc,
|
|
806
|
+
},
|
|
807
|
+
role,
|
|
808
|
+
passport,
|
|
805
809
|
};
|
|
806
810
|
};
|
|
807
811
|
|
package/lib/invitation.js
CHANGED
|
@@ -7,10 +7,120 @@ const { getDisplayName } = require('@blocklet/meta/lib/util');
|
|
|
7
7
|
const logger = require('@abtnode/logger')(require('../package.json').name);
|
|
8
8
|
const { getUserAvatarUrl } = require('@abtnode/util/lib/user');
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {Object} InvitationInfo
|
|
12
|
+
* @property {string} inviteId
|
|
13
|
+
* @property {string} teamDid
|
|
14
|
+
* @property {number} expireDate
|
|
15
|
+
* @property {Object} info
|
|
16
|
+
* @property {Object} inviter
|
|
17
|
+
* @property {Object} receiver
|
|
18
|
+
* @property {Object} role
|
|
19
|
+
* @property {string} remark
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {Object} InvitationData
|
|
23
|
+
* @property {string} inviteId
|
|
24
|
+
* @property {string} teamDid
|
|
25
|
+
* @property {Date} expireDate
|
|
26
|
+
* @property {Object} inviter
|
|
27
|
+
* @property {Object} role
|
|
28
|
+
* @property {string} remark
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @typedef {Object} IssuePassportData
|
|
33
|
+
* @property {string} id
|
|
34
|
+
* @property {'passport-issuance'} type
|
|
35
|
+
* @property {string} key - 实际上是颁发者的 userDid
|
|
36
|
+
* @property {string} name
|
|
37
|
+
* @property {string} title
|
|
38
|
+
* @property {string} ownerDid
|
|
39
|
+
* @property {string} teamDid
|
|
40
|
+
* @property {number} expireDate
|
|
41
|
+
* @property {Date} createdAt
|
|
42
|
+
* @property {Date} updatedAt
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @typedef {Object} Role
|
|
47
|
+
* @property {string} name
|
|
48
|
+
* @property {string} title
|
|
49
|
+
* @property {string} description
|
|
50
|
+
* @property {Arrary} permissions
|
|
51
|
+
* @property {Arrary} grants
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
async function getInvitation({ node, teamDid, inviteId, roles }) {
|
|
55
|
+
/**
|
|
56
|
+
* @type {InvitationData}
|
|
57
|
+
*/
|
|
58
|
+
const invitationData = await node.getInvitation({ teamDid, inviteId });
|
|
59
|
+
if (invitationData) {
|
|
60
|
+
/**
|
|
61
|
+
* @type {Role}
|
|
62
|
+
*/
|
|
63
|
+
const role = roles.find((v) => v.name === invitationData.role);
|
|
64
|
+
const invitation = {
|
|
65
|
+
...invitationData,
|
|
66
|
+
expireDate: new Date(invitationData.expireDate).getTime(),
|
|
67
|
+
receiver: null,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
invitation,
|
|
72
|
+
role,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
invitation: null,
|
|
77
|
+
role: null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 通过指定用户颁发通行证获得 invitation 数据结构
|
|
83
|
+
* @returns {Promise<{invitation: InvitationInfo, role: Role}>}
|
|
84
|
+
*/
|
|
85
|
+
async function getInvitationByIssuePassport({ node, teamDid, inviteId, roles }) {
|
|
86
|
+
/**
|
|
87
|
+
* @type {IssuePassportData}
|
|
88
|
+
*/
|
|
89
|
+
const passportIssuance = await node.getPassportIssuance({ teamDid, sessionId: inviteId });
|
|
90
|
+
if (passportIssuance) {
|
|
91
|
+
const role = roles.find((v) => v.name === passportIssuance.name);
|
|
92
|
+
|
|
93
|
+
const invitation = {
|
|
94
|
+
inviteId: passportIssuance.id,
|
|
95
|
+
teamDid,
|
|
96
|
+
expireDate: new Date(passportIssuance.expireDate).getTime(),
|
|
97
|
+
inviter: {
|
|
98
|
+
did: passportIssuance.key,
|
|
99
|
+
},
|
|
100
|
+
remark: '',
|
|
101
|
+
role: {
|
|
102
|
+
name: passportIssuance.name,
|
|
103
|
+
title: passportIssuance.title,
|
|
104
|
+
},
|
|
105
|
+
receiver: {
|
|
106
|
+
did: passportIssuance.ownerDid,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
invitation,
|
|
111
|
+
role,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
invitation: null,
|
|
116
|
+
role: null,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
10
120
|
module.exports = {
|
|
11
121
|
init(server, node, { prefix, type } = {}) {
|
|
12
122
|
server.get(`${prefix}/invitation`, async (req, res) => {
|
|
13
|
-
const { inviteId } = req.query;
|
|
123
|
+
const { inviteId, mode = 'invite' } = req.query;
|
|
14
124
|
const groupPathPrefix = req.headers['x-group-path-prefix'] || '/';
|
|
15
125
|
|
|
16
126
|
const nodeInfo = await node.getNodeInfo();
|
|
@@ -43,15 +153,28 @@ module.exports = {
|
|
|
43
153
|
}
|
|
44
154
|
|
|
45
155
|
const teamDid = info.did;
|
|
46
|
-
const
|
|
47
|
-
|
|
156
|
+
const roles = await node.getRoles({ teamDid });
|
|
157
|
+
let invitation;
|
|
158
|
+
let role;
|
|
159
|
+
if (mode === 'invite') {
|
|
160
|
+
({ invitation, role } = await getInvitation({
|
|
161
|
+
node,
|
|
162
|
+
inviteId,
|
|
163
|
+
teamDid,
|
|
164
|
+
roles,
|
|
165
|
+
}));
|
|
166
|
+
} else if (mode === 'issue-passport') {
|
|
167
|
+
({ invitation, role } = await getInvitationByIssuePassport({ node, inviteId, teamDid, roles }));
|
|
168
|
+
} else {
|
|
169
|
+
res.status(400).send('Invitation mode is invalid');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
48
173
|
if (!invitation || Date.now() > new Date(invitation.expireDate).getTime()) {
|
|
49
174
|
res.status(404).send('Invitation not found or invitation has been used');
|
|
50
175
|
return;
|
|
51
176
|
}
|
|
52
177
|
|
|
53
|
-
const roles = await node.getRoles({ teamDid });
|
|
54
|
-
const role = roles.find((v) => v.name === invitation.role);
|
|
55
178
|
try {
|
|
56
179
|
role.permissions = await node.getPermissionsByRole({ teamDid, role: { name: role.name } });
|
|
57
180
|
} catch (err) {
|
|
@@ -71,10 +194,10 @@ module.exports = {
|
|
|
71
194
|
}
|
|
72
195
|
|
|
73
196
|
const inviter = {
|
|
74
|
-
did:
|
|
75
|
-
email:
|
|
76
|
-
fullName:
|
|
77
|
-
role:
|
|
197
|
+
did: user.did,
|
|
198
|
+
email: user.email,
|
|
199
|
+
fullName: user.fullName,
|
|
200
|
+
role: user.role,
|
|
78
201
|
avatar: getUserAvatarUrl(baseUrl, user.avatar, nodeInfo, isServer),
|
|
79
202
|
};
|
|
80
203
|
|
|
@@ -82,7 +205,6 @@ module.exports = {
|
|
|
82
205
|
...invitation,
|
|
83
206
|
info: omit(info, 'dataDir'),
|
|
84
207
|
inviter,
|
|
85
|
-
inviterRaw: invitation.inviter,
|
|
86
208
|
role: role || {},
|
|
87
209
|
});
|
|
88
210
|
} catch (err) {
|
package/lib/lost-passport.js
CHANGED
|
@@ -9,7 +9,7 @@ const getNodeWallet = require('@abtnode/util/lib/get-app-wallet');
|
|
|
9
9
|
const { getDisplayName, getBlockletAppIdList } = require('@blocklet/meta/lib/util');
|
|
10
10
|
const { VC_TYPE_NODE_PASSPORT, PASSPORT_STATUS, NODE_DATA_DIR_NAME } = require('@abtnode/constant');
|
|
11
11
|
const get = require('lodash/get');
|
|
12
|
-
const { getUserAvatarUrl, getAppAvatarUrl, getServerAvatarUrl } = require('@abtnode/util/lib/user');
|
|
12
|
+
const { getUserAvatarUrl, getAppAvatarUrl, getServerAvatarUrl, extractUserAvatar } = require('@abtnode/util/lib/user');
|
|
13
13
|
const { getWalletDid } = require('@blocklet/meta/lib/did-utils');
|
|
14
14
|
|
|
15
15
|
const logger = require('./logger');
|
|
@@ -176,7 +176,7 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
176
176
|
const { locale, passportName, receiverDid } = extraParams;
|
|
177
177
|
checkWalletVersion({ didwallet, locale });
|
|
178
178
|
|
|
179
|
-
const { teamDid, issuerDid, issuerName, issuerLogo, passportColor, info } = await getApplicationInfo({
|
|
179
|
+
const { teamDid, issuerDid, issuerName, issuerLogo, passportColor, info, dataDir } = await getApplicationInfo({
|
|
180
180
|
node,
|
|
181
181
|
req: request,
|
|
182
182
|
type,
|
|
@@ -185,6 +185,8 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
185
185
|
const user = await getUser(node, teamDid, receiverDid, { enableConnectedAccount: true });
|
|
186
186
|
const passport = await createPassport({ name: passportName, node, teamDid, locale });
|
|
187
187
|
|
|
188
|
+
const avatar = await extractUserAvatar(user.avatar, { dataDir });
|
|
189
|
+
|
|
188
190
|
return {
|
|
189
191
|
description: messages.receivePassport[locale],
|
|
190
192
|
data: getRandomMessage(),
|
|
@@ -198,7 +200,7 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
198
200
|
issuerAvatarUrl: issuerLogo,
|
|
199
201
|
ownerDid: receiverDid,
|
|
200
202
|
ownerName: user.fullName || '',
|
|
201
|
-
ownerAvatarUrl: getUserAvatarUrl(baseUrl,
|
|
203
|
+
ownerAvatarUrl: getUserAvatarUrl(baseUrl, avatar, info, info.did === teamDid),
|
|
202
204
|
preferredColor: passportColor,
|
|
203
205
|
}),
|
|
204
206
|
}),
|
|
@@ -210,7 +212,7 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
210
212
|
onAuth: async ({ claims, userDid, userPk, extraParams, updateSession, baseUrl, req }) => {
|
|
211
213
|
const { locale = 'en', receiverDid, passportName } = extraParams;
|
|
212
214
|
|
|
213
|
-
const { teamDid, issuerDidList, issuerName, issuerLogo, issuerWallet, passportColor, info } =
|
|
215
|
+
const { teamDid, issuerDidList, issuerName, issuerLogo, issuerWallet, passportColor, info, dataDir } =
|
|
214
216
|
await getApplicationInfo({ node, req, type, baseUrl });
|
|
215
217
|
const statusEndpointBaseUrl = getStatusEndpointBaseUrl(type, baseUrl, authServicePrefix);
|
|
216
218
|
|
|
@@ -261,6 +263,8 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
261
263
|
);
|
|
262
264
|
}
|
|
263
265
|
|
|
266
|
+
const avatar = await extractUserAvatar(user.avatar, { dataDir });
|
|
267
|
+
|
|
264
268
|
const vcParams = {
|
|
265
269
|
issuerName,
|
|
266
270
|
issuerWallet,
|
|
@@ -279,7 +283,7 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
|
|
|
279
283
|
teamDid,
|
|
280
284
|
}),
|
|
281
285
|
types: [],
|
|
282
|
-
ownerProfile: { ...user, avatar: getUserAvatarUrl(baseUrl,
|
|
286
|
+
ownerProfile: { ...user, avatar: getUserAvatarUrl(baseUrl, avatar, info, info.did === teamDid) },
|
|
283
287
|
preferredColor: passportColor,
|
|
284
288
|
};
|
|
285
289
|
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.23-beta-
|
|
6
|
+
"version": "1.16.23-beta-c9c4e08e",
|
|
7
7
|
"description": "Simple lib to manage auth in ABT Node",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"files": [
|
|
@@ -20,15 +20,15 @@
|
|
|
20
20
|
"author": "linchen <linchen1987@foxmail.com> (http://github.com/linchen1987)",
|
|
21
21
|
"license": "Apache-2.0",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@abtnode/constant": "1.16.23-beta-
|
|
24
|
-
"@abtnode/logger": "1.16.23-beta-
|
|
25
|
-
"@abtnode/util": "1.16.23-beta-
|
|
23
|
+
"@abtnode/constant": "1.16.23-beta-c9c4e08e",
|
|
24
|
+
"@abtnode/logger": "1.16.23-beta-c9c4e08e",
|
|
25
|
+
"@abtnode/util": "1.16.23-beta-c9c4e08e",
|
|
26
26
|
"@arcblock/did": "1.18.110",
|
|
27
27
|
"@arcblock/nft-display": "2.9.24",
|
|
28
28
|
"@arcblock/validator": "^1.18.110",
|
|
29
29
|
"@arcblock/vc": "1.18.110",
|
|
30
|
-
"@blocklet/constant": "1.16.23-beta-
|
|
31
|
-
"@blocklet/meta": "1.16.23-beta-
|
|
30
|
+
"@blocklet/constant": "1.16.23-beta-c9c4e08e",
|
|
31
|
+
"@blocklet/meta": "1.16.23-beta-c9c4e08e",
|
|
32
32
|
"@ocap/client": "^1.18.110",
|
|
33
33
|
"@ocap/mcrypto": "1.18.110",
|
|
34
34
|
"@ocap/util": "1.18.110",
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"jest": "^29.7.0"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "f2db6cfe9a6a64fc9921bfbbe2878dd343004703"
|
|
53
53
|
}
|