@peers-app/peers-sdk 0.14.0 → 0.15.0
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/dist/context/data-context.d.ts +4 -4
- package/dist/context/data-context.js +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/context/index.js +4 -0
- package/dist/context/user-context-singleton.js +13 -14
- package/dist/context/user-context.d.ts +4 -4
- package/dist/context/user-context.js +48 -31
- package/dist/data/assistants.d.ts +1 -1
- package/dist/data/assistants.js +35 -24
- package/dist/data/change-tracking.d.ts +8 -8
- package/dist/data/change-tracking.js +45 -39
- package/dist/data/channels.js +5 -5
- package/dist/data/data-locks.d.ts +2 -2
- package/dist/data/data-locks.js +21 -23
- package/dist/data/data-locks.test.js +73 -75
- package/dist/data/device-sync-info.d.ts +1 -1
- package/dist/data/device-sync-info.js +4 -4
- package/dist/data/devices.d.ts +1 -1
- package/dist/data/devices.js +9 -12
- package/dist/data/embeddings.js +14 -11
- package/dist/data/files/file-read-stream.d.ts +2 -2
- package/dist/data/files/file-read-stream.js +23 -14
- package/dist/data/files/file-write-stream.d.ts +2 -2
- package/dist/data/files/file-write-stream.js +8 -8
- package/dist/data/files/file.types.d.ts +2 -2
- package/dist/data/files/file.types.js +17 -11
- package/dist/data/files/files.d.ts +6 -6
- package/dist/data/files/files.js +17 -19
- package/dist/data/files/files.test.js +213 -214
- package/dist/data/files/index.d.ts +4 -4
- package/dist/data/files/index.js +4 -4
- package/dist/data/group-member-roles.js +2 -2
- package/dist/data/group-members.d.ts +5 -5
- package/dist/data/group-members.js +27 -18
- package/dist/data/group-members.test.js +73 -73
- package/dist/data/group-permissions.d.ts +3 -3
- package/dist/data/group-permissions.js +13 -11
- package/dist/data/group-share.d.ts +2 -2
- package/dist/data/group-share.js +29 -24
- package/dist/data/groups.d.ts +4 -4
- package/dist/data/groups.js +27 -19
- package/dist/data/groups.test.js +44 -44
- package/dist/data/index.d.ts +6 -6
- package/dist/data/index.js +6 -6
- package/dist/data/knowledge/peer-types.js +9 -9
- package/dist/data/messages.d.ts +5 -5
- package/dist/data/messages.js +43 -30
- package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
- package/dist/data/orm/client-proxy.data-source.js +10 -12
- package/dist/data/orm/cursor.d.ts +1 -1
- package/dist/data/orm/cursor.js +2 -2
- package/dist/data/orm/cursor.test.js +92 -93
- package/dist/data/orm/data-query.d.ts +3 -3
- package/dist/data/orm/data-query.js +24 -18
- package/dist/data/orm/data-query.mongo.d.ts +1 -1
- package/dist/data/orm/data-query.mongo.js +49 -51
- package/dist/data/orm/data-query.mongo.test.js +173 -204
- package/dist/data/orm/data-query.sqlite.d.ts +1 -1
- package/dist/data/orm/data-query.sqlite.js +84 -73
- package/dist/data/orm/data-query.sqlite.test.js +164 -176
- package/dist/data/orm/data-query.test.js +216 -224
- package/dist/data/orm/decorators.js +3 -3
- package/dist/data/orm/dependency-injection.test.js +53 -56
- package/dist/data/orm/doc.d.ts +4 -4
- package/dist/data/orm/doc.js +17 -21
- package/dist/data/orm/event-registry.d.ts +1 -1
- package/dist/data/orm/event-registry.test.js +16 -16
- package/dist/data/orm/factory.d.ts +2 -2
- package/dist/data/orm/factory.js +33 -33
- package/dist/data/orm/index.d.ts +10 -10
- package/dist/data/orm/index.js +10 -10
- package/dist/data/orm/multi-cursors.d.ts +1 -1
- package/dist/data/orm/multi-cursors.js +6 -6
- package/dist/data/orm/multi-cursors.test.js +152 -144
- package/dist/data/orm/sql.data-source.d.ts +7 -7
- package/dist/data/orm/sql.data-source.js +88 -93
- package/dist/data/orm/sql.data-source.test.js +109 -101
- package/dist/data/orm/subscribable.data-source.d.ts +4 -4
- package/dist/data/orm/subscribable.data-source.js +5 -5
- package/dist/data/orm/table-container-events.test.js +34 -26
- package/dist/data/orm/table-container.d.ts +6 -6
- package/dist/data/orm/table-container.js +33 -21
- package/dist/data/orm/table-container.test.js +64 -53
- package/dist/data/orm/table-definitions.system.d.ts +3 -3
- package/dist/data/orm/table-definitions.system.js +3 -3
- package/dist/data/orm/table-definitions.type.d.ts +5 -5
- package/dist/data/orm/table-dependencies.d.ts +2 -2
- package/dist/data/orm/table.d.ts +5 -5
- package/dist/data/orm/table.event-source.test.js +105 -115
- package/dist/data/orm/table.js +35 -34
- package/dist/data/orm/types.d.ts +3 -3
- package/dist/data/orm/types.js +26 -25
- package/dist/data/orm/types.test.js +166 -92
- package/dist/data/package-permissions.d.ts +1 -1
- package/dist/data/package-permissions.js +2 -2
- package/dist/data/package-version-permissions.d.ts +1 -1
- package/dist/data/package-version-permissions.js +2 -2
- package/dist/data/package-versions.d.ts +9 -9
- package/dist/data/package-versions.js +47 -33
- package/dist/data/packages.d.ts +2 -2
- package/dist/data/packages.js +36 -18
- package/dist/data/packages.utils.d.ts +2 -2
- package/dist/data/packages.utils.js +4 -4
- package/dist/data/persistent-vars.d.ts +15 -15
- package/dist/data/persistent-vars.js +165 -154
- package/dist/data/table-definitions-table.d.ts +5 -5
- package/dist/data/table-definitions-table.js +13 -12
- package/dist/data/tool-tests.js +6 -6
- package/dist/data/tools.js +29 -19
- package/dist/data/user-permissions.d.ts +1 -1
- package/dist/data/user-permissions.js +5 -5
- package/dist/data/user-permissions.test.js +90 -88
- package/dist/data/user-trust-levels.js +10 -10
- package/dist/data/users.d.ts +4 -4
- package/dist/data/users.js +16 -15
- package/dist/data/voice-messages.d.ts +2 -2
- package/dist/data/voice-messages.js +13 -13
- package/dist/data/welcome-modal.pvar.js +3 -1
- package/dist/data/workflow-logs.js +26 -18
- package/dist/data/workflow-runs.d.ts +6 -6
- package/dist/data/workflow-runs.js +70 -44
- package/dist/data/workflows.d.ts +2 -2
- package/dist/data/workflows.js +7 -9
- package/dist/device/binary-peer-connection-v2.d.ts +7 -7
- package/dist/device/binary-peer-connection-v2.js +32 -28
- package/dist/device/binary-peer-connection-v2.test.js +80 -67
- package/dist/device/binary-peer-connection.d.ts +7 -7
- package/dist/device/binary-peer-connection.js +29 -28
- package/dist/device/binary-peer-connection.test.js +35 -31
- package/dist/device/connection.d.ts +5 -5
- package/dist/device/connection.js +59 -48
- package/dist/device/connection.test.js +74 -68
- package/dist/device/device-election.d.ts +2 -2
- package/dist/device/device-election.js +25 -20
- package/dist/device/device-election.test.js +35 -36
- package/dist/device/device.d.ts +2 -2
- package/dist/device/device.js +10 -4
- package/dist/device/device.test.js +16 -17
- package/dist/device/get-trust-level-fn.d.ts +2 -2
- package/dist/device/get-trust-level-fn.js +22 -11
- package/dist/device/get-trust-level-fn.test.js +58 -58
- package/dist/device/socket-io-binary-peer.d.ts +1 -1
- package/dist/device/socket-io-binary-peer.js +16 -13
- package/dist/device/socket.type.d.ts +2 -2
- package/dist/device/streamed-socket.d.ts +2 -2
- package/dist/device/streamed-socket.js +8 -8
- package/dist/device/streamed-socket.test.js +40 -40
- package/dist/device/tx-encoding.test.js +77 -77
- package/dist/events.d.ts +1 -1
- package/dist/events.js +5 -2
- package/dist/group-invite/group-invite.js +110 -19
- package/dist/group-invite/group-invite.pvars.d.ts +2 -2
- package/dist/group-invite/group-invite.pvars.js +21 -13
- package/dist/group-invite/group-invite.types.d.ts +1 -1
- package/dist/group-invite/index.d.ts +3 -3
- package/dist/group-invite/index.js +1 -1
- package/dist/index.d.ts +25 -24
- package/dist/index.js +30 -25
- package/dist/keys.d.ts +3 -3
- package/dist/keys.js +31 -30
- package/dist/keys.test.js +69 -61
- package/dist/logging/console-logger.d.ts +1 -1
- package/dist/logging/console-logger.js +35 -40
- package/dist/logging/console-logger.test.js +115 -115
- package/dist/logging/console-logs.table.d.ts +3 -3
- package/dist/logging/console-logs.table.js +28 -23
- package/dist/mentions.js +16 -12
- package/dist/observable.d.ts +2 -2
- package/dist/observable.js +15 -9
- package/dist/observable.test.js +47 -47
- package/dist/package-loader/get-require.js +3 -4
- package/dist/package-loader/package-loader.d.ts +2 -2
- package/dist/package-loader/package-loader.js +52 -34
- package/dist/peers-ui/peers-ui.d.ts +2 -2
- package/dist/peers-ui/peers-ui.js +2 -4
- package/dist/peers-ui/peers-ui.types.d.ts +3 -3
- package/dist/peers-ui/peers-ui.types.js +0 -1
- package/dist/rpc-types.d.ts +61 -59
- package/dist/rpc-types.js +61 -55
- package/dist/serial-json.d.ts +1 -1
- package/dist/serial-json.js +50 -43
- package/dist/serial-json.test.js +22 -22
- package/dist/system-ids.js +8 -8
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/tools-factory.d.ts +1 -1
- package/dist/tools/tools-factory.js +2 -2
- package/dist/types/assistant-runner-args.d.ts +3 -3
- package/dist/types/peer-device.d.ts +1 -1
- package/dist/types/peers-package.d.ts +3 -3
- package/dist/types/workflow-logger.d.ts +1 -1
- package/dist/types/workflow-run-context.d.ts +4 -4
- package/dist/types/workflow.d.ts +4 -4
- package/dist/types/workflow.js +27 -14
- package/dist/types/zod-types.d.ts +2 -1
- package/dist/types/zod-types.js +9 -3
- package/dist/user-connect/connection-code.d.ts +1 -1
- package/dist/user-connect/connection-code.js +7 -7
- package/dist/user-connect/connection-code.test.js +106 -106
- package/dist/user-connect/index.d.ts +3 -3
- package/dist/user-connect/index.js +1 -1
- package/dist/user-connect/user-connect.pvars.js +13 -11
- package/dist/user-connect/user-connect.types.d.ts +3 -3
- package/dist/users.query.d.ts +2 -2
- package/dist/users.query.js +40 -30
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +34 -32
- package/dist/utils.test.js +12 -8
- package/dist/workflow-log-formatter.d.ts +1 -1
- package/dist/workflow-log-formatter.js +17 -18
- package/package.json +14 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export
|
|
3
|
-
export { FileWriteStream } from
|
|
4
|
-
export
|
|
1
|
+
export * from "./file.types";
|
|
2
|
+
export { FileReadStream } from "./file-read-stream";
|
|
3
|
+
export { FileWriteStream } from "./file-write-stream";
|
|
4
|
+
export * from "./files";
|
package/dist/data/files/index.js
CHANGED
|
@@ -14,10 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
17
|
+
exports.FileWriteStream = exports.FileReadStream = void 0;
|
|
18
18
|
__exportStar(require("./file.types"), exports);
|
|
19
|
-
__exportStar(require("./files"), exports);
|
|
20
|
-
var file_write_stream_1 = require("./file-write-stream");
|
|
21
|
-
Object.defineProperty(exports, "FileWriteStream", { enumerable: true, get: function () { return file_write_stream_1.FileWriteStream; } });
|
|
22
19
|
var file_read_stream_1 = require("./file-read-stream");
|
|
23
20
|
Object.defineProperty(exports, "FileReadStream", { enumerable: true, get: function () { return file_read_stream_1.FileReadStream; } });
|
|
21
|
+
var file_write_stream_1 = require("./file-write-stream");
|
|
22
|
+
Object.defineProperty(exports, "FileWriteStream", { enumerable: true, get: function () { return file_write_stream_1.FileWriteStream; } });
|
|
23
|
+
__exportStar(require("./files"), exports);
|
|
@@ -13,7 +13,7 @@ var GroupMemberRole;
|
|
|
13
13
|
})(GroupMemberRole || (exports.GroupMemberRole = GroupMemberRole = {}));
|
|
14
14
|
function getRoleLabel(value) {
|
|
15
15
|
const roleEntries = Object.entries(GroupMemberRole)
|
|
16
|
-
.filter(([
|
|
16
|
+
.filter(([_key, val]) => typeof val === "number")
|
|
17
17
|
.map(([key, val]) => ({ level: val, label: key }))
|
|
18
18
|
.sort((a, b) => b.level - a.level);
|
|
19
19
|
for (const role of roleEntries) {
|
|
@@ -21,5 +21,5 @@ function getRoleLabel(value) {
|
|
|
21
21
|
return value === role.level ? role.label : `${role.label}+`;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
return
|
|
24
|
+
return "None";
|
|
25
25
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { DataContext } from "../context/data-context";
|
|
3
|
-
import { GroupMemberRole } from
|
|
3
|
+
import { GroupMemberRole } from "./group-member-roles";
|
|
4
4
|
import type { ISaveOptions } from "./orm/data-query";
|
|
5
5
|
import { Table } from "./orm/table";
|
|
6
6
|
export declare const groupMemberSchema: z.ZodObject<{
|
|
@@ -13,16 +13,16 @@ export declare const groupMemberSchema: z.ZodObject<{
|
|
|
13
13
|
}, "strip", z.ZodTypeAny, {
|
|
14
14
|
role: GroupMemberRole;
|
|
15
15
|
signature: string;
|
|
16
|
+
groupId: string;
|
|
16
17
|
userId: string;
|
|
17
18
|
groupMemberId: string;
|
|
18
|
-
groupId: string;
|
|
19
19
|
deleted?: boolean | undefined;
|
|
20
20
|
}, {
|
|
21
21
|
role: GroupMemberRole;
|
|
22
22
|
signature: string;
|
|
23
|
+
groupId: string;
|
|
23
24
|
userId: string;
|
|
24
25
|
groupMemberId: string;
|
|
25
|
-
groupId: string;
|
|
26
26
|
deleted?: boolean | undefined;
|
|
27
27
|
}>;
|
|
28
28
|
export type IGroupMember = z.infer<typeof groupMemberSchema>;
|
|
@@ -35,8 +35,8 @@ export declare class GroupMembersTable extends Table<IGroupMember> {
|
|
|
35
35
|
private static addSignatureToGroupMember;
|
|
36
36
|
static enableGroupMemberSigning(fn: (groupMember: IGroupMember) => IGroupMember): void;
|
|
37
37
|
/** @deprecated Forbidden on GroupsTable; use save() */
|
|
38
|
-
insert(..._args: Parameters<Table<IGroupMember>[
|
|
38
|
+
insert(..._args: Parameters<Table<IGroupMember>["insert"]>): never;
|
|
39
39
|
/** @deprecated Forbidden on GroupsTable; use save() */
|
|
40
|
-
update(..._args: Parameters<Table<IGroupMember>[
|
|
40
|
+
update(..._args: Parameters<Table<IGroupMember>["update"]>): never;
|
|
41
41
|
}
|
|
42
42
|
export declare function GroupMembers(dataContext?: DataContext): GroupMembersTable;
|
|
@@ -48,21 +48,24 @@ const types_1 = require("./orm/types");
|
|
|
48
48
|
const users_1 = require("./users");
|
|
49
49
|
exports.groupMemberSchema = zod_1.z.object({
|
|
50
50
|
groupMemberId: zod_types_1.zodPeerId,
|
|
51
|
-
groupId: zod_types_1.zodPeerId.describe(
|
|
52
|
-
userId: zod_types_1.zodPeerId.describe(
|
|
53
|
-
role: zod_1.z
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
groupId: zod_types_1.zodPeerId.describe("The id of the group"),
|
|
52
|
+
userId: zod_types_1.zodPeerId.describe("The id of the user who is a member of the group"),
|
|
53
|
+
role: zod_1.z
|
|
54
|
+
.nativeEnum(group_member_roles_1.GroupMemberRole)
|
|
55
|
+
.describe('The role of the user in the group. Use "none" to explicitly block a user'),
|
|
56
|
+
signature: zod_1.z.string().describe("The signed hash of this data excluding the signature itself"),
|
|
57
|
+
deleted: zod_1.z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Whether this membership has been deleted (soft delete)"),
|
|
56
61
|
});
|
|
57
|
-
exports.groupMembersTableName =
|
|
62
|
+
exports.groupMembersTableName = "GroupMembers";
|
|
58
63
|
const metaData = {
|
|
59
64
|
name: exports.groupMembersTableName,
|
|
60
|
-
description:
|
|
61
|
-
primaryKeyName:
|
|
65
|
+
description: "group membership associations",
|
|
66
|
+
primaryKeyName: "groupMemberId",
|
|
62
67
|
fields: (0, types_1.schemaToFields)(exports.groupMemberSchema),
|
|
63
|
-
indexes: [
|
|
64
|
-
{ fields: ['groupId', 'userId'], unique: true },
|
|
65
|
-
]
|
|
68
|
+
indexes: [{ fields: ["groupId", "userId"], unique: true }],
|
|
66
69
|
};
|
|
67
70
|
let GroupMembersTable = (() => {
|
|
68
71
|
let _classSuper = table_1.Table;
|
|
@@ -82,20 +85,26 @@ let GroupMembersTable = (() => {
|
|
|
82
85
|
}
|
|
83
86
|
const me = await (0, users_1.getMe)();
|
|
84
87
|
if (groupMember.groupId === me.userId) {
|
|
85
|
-
throw new Error(
|
|
88
|
+
throw new Error("Group members cannot be added to personal user contexts");
|
|
86
89
|
}
|
|
87
|
-
const oldGroupMember = groupMember.groupMemberId
|
|
90
|
+
const oldGroupMember = groupMember.groupMemberId
|
|
91
|
+
? await this.get(groupMember.groupMemberId)
|
|
92
|
+
: undefined;
|
|
88
93
|
if (await (0, group_permissions_1.isGroupMemberSignatureValid)(groupMember.groupId, groupMember, oldGroupMember)) {
|
|
89
94
|
return super.save(groupMember, opts);
|
|
90
95
|
}
|
|
91
|
-
throw new Error(
|
|
96
|
+
throw new Error("Group member signature is not valid");
|
|
92
97
|
}
|
|
93
98
|
async signAndSave(groupMember, opts) {
|
|
94
99
|
if (!GroupMembersTable.addSignatureToGroupMember) {
|
|
95
|
-
throw new Error(
|
|
100
|
+
throw new Error("Group member signing must be enabled to sign and save group members. Call GroupMembersTable.enableGroupMemberSigning(fn) to enable it.");
|
|
96
101
|
}
|
|
97
102
|
groupMember = GroupMembersTable.addSignatureToGroupMember(groupMember);
|
|
98
|
-
return this.save(groupMember, {
|
|
103
|
+
return this.save(groupMember, {
|
|
104
|
+
saveAsSnapshot: true,
|
|
105
|
+
restoreIfDeleted: true,
|
|
106
|
+
...(opts || {}),
|
|
107
|
+
});
|
|
99
108
|
}
|
|
100
109
|
async delete(groupMemberId) {
|
|
101
110
|
if (GroupMembersTable.isPassthrough) {
|
|
@@ -115,11 +124,11 @@ let GroupMembersTable = (() => {
|
|
|
115
124
|
}
|
|
116
125
|
/** @deprecated Forbidden on GroupsTable; use save() */
|
|
117
126
|
insert(..._args) {
|
|
118
|
-
throw new Error(
|
|
127
|
+
throw new Error("GroupsTable forbids insert; use save()");
|
|
119
128
|
}
|
|
120
129
|
/** @deprecated Forbidden on GroupsTable; use save() */
|
|
121
130
|
update(..._args) {
|
|
122
|
-
throw new Error(
|
|
131
|
+
throw new Error("GroupsTable forbids update; use save()");
|
|
123
132
|
}
|
|
124
133
|
constructor() {
|
|
125
134
|
super(...arguments);
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const keys_1 = require("../keys");
|
|
4
4
|
const group_permissions_1 = require("./group-permissions");
|
|
5
5
|
// Test the group members signature logic directly without ORM dependencies
|
|
6
|
-
describe(
|
|
6
|
+
describe("Group Members Signature Logic", () => {
|
|
7
7
|
let testGroupMember;
|
|
8
8
|
let ownerKeys;
|
|
9
9
|
let adminKeys;
|
|
@@ -11,57 +11,57 @@ describe('Group Members Signature Logic', () => {
|
|
|
11
11
|
ownerKeys = (0, keys_1.newKeys)();
|
|
12
12
|
adminKeys = (0, keys_1.newKeys)();
|
|
13
13
|
testGroupMember = {
|
|
14
|
-
groupMemberId:
|
|
15
|
-
groupId:
|
|
16
|
-
userId:
|
|
14
|
+
groupMemberId: "test-member-1",
|
|
15
|
+
groupId: "test-group-1",
|
|
16
|
+
userId: "test-user-1",
|
|
17
17
|
role: group_permissions_1.GroupMemberRole.Reader,
|
|
18
|
-
signature:
|
|
18
|
+
signature: "",
|
|
19
19
|
};
|
|
20
20
|
});
|
|
21
|
-
describe(
|
|
22
|
-
it(
|
|
21
|
+
describe("basic signature functionality", () => {
|
|
22
|
+
it("should add signature to group member object", () => {
|
|
23
23
|
const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
|
|
24
24
|
expect(signedGroupMember.signature).toBeTruthy();
|
|
25
|
-
expect(signedGroupMember.signature).toContain(
|
|
25
|
+
expect(signedGroupMember.signature).toContain(":");
|
|
26
26
|
expect(signedGroupMember.groupId).toBe(testGroupMember.groupId);
|
|
27
27
|
expect(signedGroupMember.userId).toBe(testGroupMember.userId);
|
|
28
28
|
expect(signedGroupMember.role).toBe(testGroupMember.role);
|
|
29
29
|
});
|
|
30
|
-
it(
|
|
30
|
+
it("should verify valid signature", () => {
|
|
31
31
|
const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
|
|
32
32
|
const isValid = (0, keys_1.isObjectSignatureValid)(signedGroupMember);
|
|
33
33
|
expect(isValid).toBe(true);
|
|
34
34
|
});
|
|
35
|
-
it(
|
|
35
|
+
it("should reject invalid signature after modification", () => {
|
|
36
36
|
const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
|
|
37
37
|
// Modify the group member after signing
|
|
38
38
|
signedGroupMember.role = group_permissions_1.GroupMemberRole.Admin;
|
|
39
39
|
const isValid = (0, keys_1.isObjectSignatureValid)(signedGroupMember);
|
|
40
40
|
expect(isValid).toBe(false);
|
|
41
41
|
});
|
|
42
|
-
it(
|
|
42
|
+
it("should extract correct public key from signature", () => {
|
|
43
43
|
const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
|
|
44
44
|
const extractedKey = (0, keys_1.getPublicKeyFromObjectSignature)(signedGroupMember);
|
|
45
45
|
expect(extractedKey).toBe(ownerKeys.publicKey);
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
|
-
describe(
|
|
48
|
+
describe("permission validation with group context", () => {
|
|
49
49
|
// Note: These tests use basic signature verification since the new permission system
|
|
50
50
|
// requires actual user/group data context which isn't available in unit tests
|
|
51
|
-
it(
|
|
51
|
+
it("should allow owner to add any role", () => {
|
|
52
52
|
const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
53
53
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, ownerKeys.secretKey);
|
|
54
54
|
expect(signedMember.signature).toBeTruthy();
|
|
55
55
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Admin);
|
|
56
56
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
57
57
|
});
|
|
58
|
-
it(
|
|
58
|
+
it("should allow admin to add non-admin roles", () => {
|
|
59
59
|
const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
|
|
60
60
|
expect(signedMember.signature).toBeTruthy();
|
|
61
61
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Reader);
|
|
62
62
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
63
63
|
});
|
|
64
|
-
it(
|
|
64
|
+
it("should allow admin to assign admin roles", () => {
|
|
65
65
|
const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
66
66
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, adminKeys.secretKey);
|
|
67
67
|
expect(signedMember.signature).toBeTruthy();
|
|
@@ -69,125 +69,125 @@ describe('Group Members Signature Logic', () => {
|
|
|
69
69
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
|
-
describe(
|
|
72
|
+
describe("role assignment rules", () => {
|
|
73
73
|
// Note: These tests focus on basic signature functionality since the new permission system
|
|
74
74
|
// requires actual user/group data context for role-based validation
|
|
75
|
-
it(
|
|
75
|
+
it("should allow signing owner role", () => {
|
|
76
76
|
const memberWithOwnerRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Owner };
|
|
77
77
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithOwnerRole, ownerKeys.secretKey);
|
|
78
78
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Owner);
|
|
79
79
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
80
80
|
});
|
|
81
|
-
it(
|
|
81
|
+
it("should allow signing founder role", () => {
|
|
82
82
|
const memberWithFounderRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Founder };
|
|
83
83
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithFounderRole, ownerKeys.secretKey);
|
|
84
84
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Founder);
|
|
85
85
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
86
86
|
});
|
|
87
|
-
it(
|
|
87
|
+
it("should allow signing writer role", () => {
|
|
88
88
|
const memberWithWriterRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
89
89
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithWriterRole, adminKeys.secretKey);
|
|
90
90
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Writer);
|
|
91
91
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
92
92
|
});
|
|
93
|
-
it(
|
|
93
|
+
it("should allow setting role to None (blocking user)", () => {
|
|
94
94
|
const memberWithNoneRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.None };
|
|
95
95
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithNoneRole, adminKeys.secretKey);
|
|
96
96
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.None);
|
|
97
97
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
98
98
|
});
|
|
99
|
-
it(
|
|
99
|
+
it("should handle role modifications with signatures", () => {
|
|
100
100
|
const demotedToWriter = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
101
101
|
const signedMember = (0, keys_1.addSignatureToObject)(demotedToWriter, adminKeys.secretKey);
|
|
102
102
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Writer);
|
|
103
103
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
104
104
|
});
|
|
105
105
|
});
|
|
106
|
-
describe(
|
|
107
|
-
it(
|
|
106
|
+
describe("signature tampering detection", () => {
|
|
107
|
+
it("should detect tampered signature", () => {
|
|
108
108
|
const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
|
|
109
109
|
// Tamper with signature by adding extra characters
|
|
110
|
-
signedMember.signature = signedMember.signature
|
|
110
|
+
signedMember.signature = `${signedMember.signature}tampered`;
|
|
111
111
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(false);
|
|
112
112
|
});
|
|
113
|
-
it(
|
|
114
|
-
testGroupMember.signature =
|
|
113
|
+
it("should detect empty signature", () => {
|
|
114
|
+
testGroupMember.signature = "";
|
|
115
115
|
expect((0, keys_1.isObjectSignatureValid)(testGroupMember)).toBe(false);
|
|
116
116
|
});
|
|
117
|
-
it(
|
|
118
|
-
testGroupMember.signature =
|
|
117
|
+
it("should detect malformed signature", () => {
|
|
118
|
+
testGroupMember.signature = "malformed-signature";
|
|
119
119
|
expect((0, keys_1.isObjectSignatureValid)(testGroupMember)).toBe(false);
|
|
120
120
|
});
|
|
121
|
-
it(
|
|
122
|
-
testGroupMember.signature =
|
|
121
|
+
it("should handle signature without colon separator", () => {
|
|
122
|
+
testGroupMember.signature = "noseparator";
|
|
123
123
|
expect((0, keys_1.isObjectSignatureValid)(testGroupMember)).toBe(false);
|
|
124
124
|
expect((0, keys_1.getPublicKeyFromObjectSignature)(testGroupMember)).toBeUndefined();
|
|
125
125
|
});
|
|
126
126
|
});
|
|
127
|
-
describe(
|
|
128
|
-
it(
|
|
127
|
+
describe("complex group member objects", () => {
|
|
128
|
+
it("should handle all role types", () => {
|
|
129
129
|
const roles = [
|
|
130
130
|
group_permissions_1.GroupMemberRole.None,
|
|
131
131
|
group_permissions_1.GroupMemberRole.Reader,
|
|
132
132
|
group_permissions_1.GroupMemberRole.Writer,
|
|
133
133
|
group_permissions_1.GroupMemberRole.Admin,
|
|
134
134
|
group_permissions_1.GroupMemberRole.Owner,
|
|
135
|
-
group_permissions_1.GroupMemberRole.Founder
|
|
135
|
+
group_permissions_1.GroupMemberRole.Founder,
|
|
136
136
|
];
|
|
137
|
-
roles.forEach(role => {
|
|
137
|
+
roles.forEach((role) => {
|
|
138
138
|
const member = { ...testGroupMember, role };
|
|
139
139
|
const signedMember = (0, keys_1.addSignatureToObject)(member, ownerKeys.secretKey);
|
|
140
140
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
141
141
|
expect(signedMember.role).toBe(role);
|
|
142
142
|
});
|
|
143
143
|
});
|
|
144
|
-
it(
|
|
144
|
+
it("should handle different user and group IDs", () => {
|
|
145
145
|
const memberWithDifferentIds = {
|
|
146
146
|
...testGroupMember,
|
|
147
|
-
groupMemberId:
|
|
148
|
-
groupId:
|
|
149
|
-
userId:
|
|
147
|
+
groupMemberId: "member-123",
|
|
148
|
+
groupId: "group-456",
|
|
149
|
+
userId: "user-789",
|
|
150
150
|
};
|
|
151
151
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithDifferentIds, ownerKeys.secretKey);
|
|
152
152
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
153
|
-
expect(signedMember.groupMemberId).toBe(
|
|
154
|
-
expect(signedMember.groupId).toBe(
|
|
155
|
-
expect(signedMember.userId).toBe(
|
|
153
|
+
expect(signedMember.groupMemberId).toBe("member-123");
|
|
154
|
+
expect(signedMember.groupId).toBe("group-456");
|
|
155
|
+
expect(signedMember.userId).toBe("user-789");
|
|
156
156
|
});
|
|
157
157
|
});
|
|
158
|
-
describe(
|
|
159
|
-
it(
|
|
158
|
+
describe("edge cases", () => {
|
|
159
|
+
it("should handle long IDs", () => {
|
|
160
160
|
const memberWithLongIds = {
|
|
161
161
|
...testGroupMember,
|
|
162
|
-
groupMemberId:
|
|
163
|
-
groupId:
|
|
164
|
-
userId:
|
|
162
|
+
groupMemberId: "A".repeat(1000),
|
|
163
|
+
groupId: "B".repeat(1000),
|
|
164
|
+
userId: "C".repeat(1000),
|
|
165
165
|
};
|
|
166
166
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithLongIds, ownerKeys.secretKey);
|
|
167
167
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
168
168
|
});
|
|
169
|
-
it(
|
|
169
|
+
it("should handle special characters in IDs", () => {
|
|
170
170
|
const memberWithSpecialIds = {
|
|
171
171
|
...testGroupMember,
|
|
172
|
-
groupMemberId:
|
|
172
|
+
groupMemberId: "member-🚀-test",
|
|
173
173
|
groupId: 'group-"with"-quotes',
|
|
174
|
-
userId:
|
|
174
|
+
userId: "user\nwith\nnewlines",
|
|
175
175
|
};
|
|
176
176
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithSpecialIds, ownerKeys.secretKey);
|
|
177
177
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
178
|
-
expect(signedMember.groupMemberId).toContain(
|
|
178
|
+
expect(signedMember.groupMemberId).toContain("🚀");
|
|
179
179
|
});
|
|
180
|
-
it(
|
|
180
|
+
it("should handle empty string IDs", () => {
|
|
181
181
|
const memberWithEmptyIds = {
|
|
182
182
|
...testGroupMember,
|
|
183
|
-
groupMemberId:
|
|
184
|
-
groupId:
|
|
185
|
-
userId:
|
|
183
|
+
groupMemberId: "",
|
|
184
|
+
groupId: "",
|
|
185
|
+
userId: "",
|
|
186
186
|
};
|
|
187
187
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithEmptyIds, ownerKeys.secretKey);
|
|
188
188
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
189
189
|
});
|
|
190
|
-
it(
|
|
190
|
+
it("should handle modification of existing group member", () => {
|
|
191
191
|
const originalMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Reader };
|
|
192
192
|
const modifiedMember = { ...originalMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
193
193
|
const signedMember = (0, keys_1.addSignatureToObject)(modifiedMember, adminKeys.secretKey);
|
|
@@ -195,17 +195,17 @@ describe('Group Members Signature Logic', () => {
|
|
|
195
195
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
196
196
|
});
|
|
197
197
|
});
|
|
198
|
-
describe(
|
|
198
|
+
describe("permission functions with role override", () => {
|
|
199
199
|
// Use the optional signerRole parameter to avoid mocking complexity
|
|
200
|
-
describe(
|
|
201
|
-
it(
|
|
200
|
+
describe("signGroupMemberObject", () => {
|
|
201
|
+
it("should allow admin to sign group member", async () => {
|
|
202
202
|
const memberToSign = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
203
203
|
const signedMember = await (0, keys_1.addSignatureToObject)(memberToSign, adminKeys.secretKey);
|
|
204
204
|
expect(signedMember.signature).toBeTruthy();
|
|
205
205
|
expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Writer);
|
|
206
206
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
207
207
|
});
|
|
208
|
-
it(
|
|
208
|
+
it("should allow owner to sign group member", async () => {
|
|
209
209
|
const memberToSign = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
210
210
|
const signedMember = await (0, keys_1.addSignatureToObject)(memberToSign, ownerKeys.secretKey);
|
|
211
211
|
expect(signedMember.signature).toBeTruthy();
|
|
@@ -213,60 +213,60 @@ describe('Group Members Signature Logic', () => {
|
|
|
213
213
|
expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
|
|
214
214
|
});
|
|
215
215
|
});
|
|
216
|
-
describe(
|
|
217
|
-
it(
|
|
216
|
+
describe("verifyGroupMemberSignature with role override", () => {
|
|
217
|
+
it("should verify valid signature with admin signer role", async () => {
|
|
218
218
|
const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
|
|
219
219
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
|
|
220
220
|
expect(isValid).toBe(true);
|
|
221
221
|
});
|
|
222
|
-
it(
|
|
222
|
+
it("should verify valid signature with owner signer role", async () => {
|
|
223
223
|
const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
224
224
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, ownerKeys.secretKey);
|
|
225
225
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithAdminRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Owner);
|
|
226
226
|
expect(isValid).toBe(true);
|
|
227
227
|
});
|
|
228
|
-
it(
|
|
228
|
+
it("should reject when signer role is below admin", async () => {
|
|
229
229
|
const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
|
|
230
230
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Writer);
|
|
231
231
|
expect(isValid).toBe(false);
|
|
232
232
|
});
|
|
233
|
-
it(
|
|
233
|
+
it("should reject when signer role is below new member role", async () => {
|
|
234
234
|
const memberWithOwnerRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Owner };
|
|
235
235
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithOwnerRole, adminKeys.secretKey);
|
|
236
236
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithOwnerRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
|
|
237
237
|
expect(isValid).toBe(false);
|
|
238
238
|
});
|
|
239
|
-
it(
|
|
239
|
+
it("should reject when signer role is below old member role", async () => {
|
|
240
240
|
const oldMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Owner };
|
|
241
241
|
const newMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
242
242
|
const signedNewMember = (0, keys_1.addSignatureToObject)(newMember, adminKeys.secretKey);
|
|
243
243
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(newMember.groupId, signedNewMember, oldMember, group_permissions_1.GroupMemberRole.Admin);
|
|
244
244
|
expect(isValid).toBe(false);
|
|
245
245
|
});
|
|
246
|
-
it(
|
|
246
|
+
it("should allow admin to modify reader role", async () => {
|
|
247
247
|
const memberWithReaderRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Reader };
|
|
248
248
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithReaderRole, adminKeys.secretKey);
|
|
249
249
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithReaderRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
|
|
250
250
|
expect(isValid).toBe(true);
|
|
251
251
|
});
|
|
252
|
-
it(
|
|
252
|
+
it("should allow owner to modify admin role", async () => {
|
|
253
253
|
const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
254
254
|
const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, ownerKeys.secretKey);
|
|
255
255
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithAdminRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Owner);
|
|
256
256
|
expect(isValid).toBe(true);
|
|
257
257
|
});
|
|
258
|
-
it(
|
|
258
|
+
it("should reject invalid signature", async () => {
|
|
259
259
|
const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
|
|
260
|
-
signedMember.signature =
|
|
260
|
+
signedMember.signature = "invalid-signature";
|
|
261
261
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
|
|
262
262
|
expect(isValid).toBe(false);
|
|
263
263
|
});
|
|
264
|
-
it(
|
|
265
|
-
const memberWithoutSignature = { ...testGroupMember, signature:
|
|
264
|
+
it("should reject when signature is missing", async () => {
|
|
265
|
+
const memberWithoutSignature = { ...testGroupMember, signature: "" };
|
|
266
266
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, memberWithoutSignature, undefined, group_permissions_1.GroupMemberRole.Admin);
|
|
267
267
|
expect(isValid).toBe(false);
|
|
268
268
|
});
|
|
269
|
-
it(
|
|
269
|
+
it("should handle role modifications correctly", async () => {
|
|
270
270
|
const oldMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
271
271
|
const newMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
272
272
|
const signedNewMember = (0, keys_1.addSignatureToObject)(newMember, ownerKeys.secretKey);
|
|
@@ -274,7 +274,7 @@ describe('Group Members Signature Logic', () => {
|
|
|
274
274
|
const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(newMember.groupId, signedNewMember, oldMember, group_permissions_1.GroupMemberRole.Owner);
|
|
275
275
|
expect(isValid).toBe(true);
|
|
276
276
|
});
|
|
277
|
-
it(
|
|
277
|
+
it("should handle role demotion correctly", async () => {
|
|
278
278
|
const oldMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
|
|
279
279
|
const newMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
|
|
280
280
|
const signedNewMember = (0, keys_1.addSignatureToObject)(newMember, ownerKeys.secretKey);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { GroupMemberRole } from
|
|
2
|
-
import type { IGroupMember } from
|
|
3
|
-
import type { IGroup } from
|
|
1
|
+
import { GroupMemberRole } from "./group-member-roles";
|
|
2
|
+
import type { IGroupMember } from "./group-members";
|
|
3
|
+
import type { IGroup } from "./groups";
|
|
4
4
|
export { GroupMemberRole };
|
|
5
5
|
export declare function getUserRole(groupId: string, userId: string): Promise<GroupMemberRole>;
|
|
6
6
|
export declare function getUserRoleFromPublicKey(groupId: string, publicKey: string): Promise<GroupMemberRole>;
|
|
@@ -10,12 +10,12 @@ const keys_1 = require("../keys");
|
|
|
10
10
|
const group_member_roles_1 = require("./group-member-roles");
|
|
11
11
|
Object.defineProperty(exports, "GroupMemberRole", { enumerable: true, get: function () { return group_member_roles_1.GroupMemberRole; } });
|
|
12
12
|
async function getUserRole(groupId, userId) {
|
|
13
|
-
const { Groups } = await Promise.resolve().then(() => require(
|
|
14
|
-
const { GroupMembers } = await Promise.resolve().then(() => require(
|
|
13
|
+
const { Groups } = await Promise.resolve().then(() => require("./groups"));
|
|
14
|
+
const { GroupMembers } = await Promise.resolve().then(() => require("./group-members"));
|
|
15
15
|
const userContext = await (0, context_1.getUserContext)();
|
|
16
16
|
const groupDataContext = userContext.getDataContext(groupId);
|
|
17
|
-
const group = await Groups(groupDataContext).get(groupId)
|
|
18
|
-
|
|
17
|
+
const group = (await Groups(groupDataContext).get(groupId)) ||
|
|
18
|
+
(await Groups(userContext.userDataContext).get(groupId));
|
|
19
19
|
// If the group doesn't exist or the current user is explicitly the founder, return Founder role
|
|
20
20
|
if (!group || group.founderUserId === userId) {
|
|
21
21
|
return group_member_roles_1.GroupMemberRole.Founder;
|
|
@@ -27,11 +27,11 @@ async function getUserRole(groupId, userId) {
|
|
|
27
27
|
return group.publicRole || group_member_roles_1.GroupMemberRole.None;
|
|
28
28
|
}
|
|
29
29
|
async function getUserRoleFromPublicKey(groupId, publicKey) {
|
|
30
|
-
const { Users } = await Promise.resolve().then(() => require(
|
|
30
|
+
const { Users } = await Promise.resolve().then(() => require("./users"));
|
|
31
31
|
const userContext = await (0, context_1.getUserContext)();
|
|
32
32
|
const groupDataContext = userContext.getDataContext(groupId);
|
|
33
|
-
const user = await Users(groupDataContext).findOne({ publicKey })
|
|
34
|
-
|
|
33
|
+
const user = (await Users(groupDataContext).findOne({ publicKey })) ||
|
|
34
|
+
(await Users(userContext.userDataContext).findOne({ publicKey }));
|
|
35
35
|
if (user) {
|
|
36
36
|
return getUserRole(groupId, user?.userId);
|
|
37
37
|
}
|
|
@@ -39,13 +39,15 @@ async function getUserRoleFromPublicKey(groupId, publicKey) {
|
|
|
39
39
|
}
|
|
40
40
|
async function verifyGroupSignature(group, oldGroup) {
|
|
41
41
|
(0, keys_1.verifyObjectSignature)(group);
|
|
42
|
-
const publicKey = (0, keys_1.getPublicKeyFromObjectSignature)(group) ??
|
|
42
|
+
const publicKey = (0, keys_1.getPublicKeyFromObjectSignature)(group) ?? "";
|
|
43
43
|
const signerRole = await getUserRoleFromPublicKey(group.groupId, publicKey);
|
|
44
|
-
if (oldGroup &&
|
|
45
|
-
|
|
44
|
+
if (oldGroup &&
|
|
45
|
+
oldGroup.founderUserId !== group.founderUserId &&
|
|
46
|
+
signerRole < group_member_roles_1.GroupMemberRole.Founder) {
|
|
47
|
+
throw new Error("Only group founders can change the founder of the group");
|
|
46
48
|
}
|
|
47
49
|
if (signerRole < group_member_roles_1.GroupMemberRole.Admin) {
|
|
48
|
-
throw new Error(
|
|
50
|
+
throw new Error("Only group admins can modify group settings");
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
async function isGroupMemberSignatureValid(groupId, newGroupMember, oldGroupMember, signerRole) {
|