@matrix-widget-toolkit/api 4.2.0 → 5.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/build/cjs/api/extras/events.d.cts +51 -0
- package/build/cjs/api/extras/index.d.cts +4 -3
- package/build/cjs/api/extras/powerLevel.d.cts +27 -36
- package/build/cjs/index.cjs +199 -86
- package/build/esm/api/extras/events.d.ts +51 -0
- package/build/esm/api/extras/index.d.ts +4 -3
- package/build/esm/api/extras/powerLevel.d.ts +27 -36
- package/build/esm/index.js +196 -87
- package/build/index.d.ts +48 -5
- package/package.json +5 -5
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import Joi from 'joi';
|
|
2
2
|
import { RoomEvent, StateEvent, ToDeviceMessageEvent } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* The type of the power levels state event.
|
|
5
|
+
*/
|
|
6
|
+
export declare const STATE_EVENT_POWER_LEVELS = "m.room.power_levels";
|
|
7
|
+
/**
|
|
8
|
+
* The types of type of the create event.
|
|
9
|
+
*/
|
|
10
|
+
export declare const STATE_EVENT_CREATE = "m.room.create";
|
|
3
11
|
/**
|
|
4
12
|
* Check if the given event is a {@link StateEvent}.
|
|
5
13
|
*
|
|
@@ -38,3 +46,46 @@ export declare function isValidToDeviceMessageEvent(event: unknown): event is To
|
|
|
38
46
|
export declare const roomEventSchema: Joi.ObjectSchema<RoomEvent>;
|
|
39
47
|
export declare const stateEventSchema: Joi.ObjectSchema<StateEvent>;
|
|
40
48
|
export declare const toDeviceMessageSchema: Joi.ObjectSchema<ToDeviceMessageEvent>;
|
|
49
|
+
export type StateEventCreateContent = {
|
|
50
|
+
room_version?: string;
|
|
51
|
+
creator?: string;
|
|
52
|
+
additional_creators?: string[];
|
|
53
|
+
};
|
|
54
|
+
export declare const createEventSchema: Joi.ObjectSchema<StateEvent<StateEventCreateContent>>;
|
|
55
|
+
/**
|
|
56
|
+
* Validates that `event` is has a valid structure for a
|
|
57
|
+
* {@link StateEventCreateContent}.
|
|
58
|
+
* @param event - The event to validate.
|
|
59
|
+
* @returns True, if the event is valid.
|
|
60
|
+
*/
|
|
61
|
+
export declare function isValidCreateEventSchema(event: StateEvent<unknown> | undefined): event is StateEvent<StateEventCreateContent>;
|
|
62
|
+
/**
|
|
63
|
+
* The types of actions.
|
|
64
|
+
*/
|
|
65
|
+
export type PowerLevelsActions = 'invite' | 'kick' | 'ban' | 'redact';
|
|
66
|
+
/**
|
|
67
|
+
* The content of an `m.room.power_levels` event.
|
|
68
|
+
*/
|
|
69
|
+
export type PowerLevelsStateEvent = {
|
|
70
|
+
events?: {
|
|
71
|
+
[key: string]: number;
|
|
72
|
+
};
|
|
73
|
+
state_default?: number;
|
|
74
|
+
events_default?: number;
|
|
75
|
+
users?: {
|
|
76
|
+
[key: string]: number;
|
|
77
|
+
};
|
|
78
|
+
users_default?: number;
|
|
79
|
+
ban?: number;
|
|
80
|
+
invite?: number;
|
|
81
|
+
kick?: number;
|
|
82
|
+
redact?: number;
|
|
83
|
+
};
|
|
84
|
+
export declare const powerLevelsEventSchema: Joi.ObjectSchema<StateEvent<PowerLevelsStateEvent>>;
|
|
85
|
+
/**
|
|
86
|
+
* Validates that `event` is has a valid structure for a
|
|
87
|
+
* {@link PowerLevelsStateEvent}.
|
|
88
|
+
* @param event - The event to validate.
|
|
89
|
+
* @returns True, if the event is valid.
|
|
90
|
+
*/
|
|
91
|
+
export declare function isValidPowerLevelStateEvent(event: StateEvent<unknown>): event is StateEvent<PowerLevelsStateEvent>;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export { generateRoomTimelineCapabilities } from './capabilities';
|
|
2
2
|
export { getRoomMemberDisplayName } from './displayName';
|
|
3
|
-
export { isRoomEvent, isStateEvent, isValidRoomEvent, isValidStateEvent as isValidStateEVent, isValidToDeviceMessageEvent, } from './events';
|
|
3
|
+
export { STATE_EVENT_CREATE, isRoomEvent, isStateEvent, isValidCreateEventSchema, isValidRoomEvent, isValidStateEvent as isValidStateEVent, isValidToDeviceMessageEvent, } from './events';
|
|
4
|
+
export type { PowerLevelsActions, PowerLevelsStateEvent, StateEventCreateContent, } from './events';
|
|
4
5
|
export { WIDGET_CAPABILITY_NAVIGATE, navigateToRoom } from './navigateTo';
|
|
5
6
|
export type { NavigateToRoomOptions } from './navigateTo';
|
|
6
7
|
export { compareOriginServerTS } from './originServerTs';
|
|
7
|
-
export { STATE_EVENT_POWER_LEVELS, calculateUserPowerLevel, hasActionPower, hasRoomEventPower, hasStateEventPower, isValidPowerLevelStateEvent, } from './powerLevel';
|
|
8
|
-
export type {
|
|
8
|
+
export { ROOM_VERSION_12_CREATOR, STATE_EVENT_POWER_LEVELS, calculateUserPowerLevel, compareUserPowerLevelToNormalPowerLevel, hasActionPower, hasRoomEventPower, hasStateEventPower, isValidPowerLevelStateEvent, } from './powerLevel';
|
|
9
|
+
export type { UserPowerLevelType } from './powerLevel';
|
|
9
10
|
export { ROOM_EVENT_REDACTION, isValidRedactionEvent, observeRedactionEvents, redactEvent, } from './redactions';
|
|
10
11
|
export type { Redaction, RedactionRoomEvent } from './redactions';
|
|
11
12
|
export { getContent, getOriginalEventId, isValidEventWithRelatesTo, } from './relatesTo';
|
|
@@ -1,55 +1,39 @@
|
|
|
1
1
|
import { StateEvent } from '../types';
|
|
2
|
+
import type { PowerLevelsActions, PowerLevelsStateEvent, StateEventCreateContent } from './events';
|
|
3
|
+
export { isValidPowerLevelStateEvent, STATE_EVENT_POWER_LEVELS, } from './events';
|
|
2
4
|
/**
|
|
3
|
-
*
|
|
5
|
+
* Room version 12 requires us to have something larger than Max integer for room creators.
|
|
6
|
+
* This is a workaround to allow the room creator to always have the highest power level.
|
|
4
7
|
*/
|
|
5
|
-
export declare const
|
|
8
|
+
export declare const ROOM_VERSION_12_CREATOR = "ROOM_VERSION_12_CREATOR";
|
|
9
|
+
export type UserPowerLevelType = number | typeof ROOM_VERSION_12_CREATOR;
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
11
|
+
* Compare a user's power level to a normal power level.
|
|
12
|
+
* @param userPowerLevel - The user's power level
|
|
13
|
+
* @param normalPowerLevel - The normal power level
|
|
14
|
+
* @returns True if the user's power level is greater than or equal to the normal power level, false otherwise
|
|
8
15
|
*/
|
|
9
|
-
export
|
|
10
|
-
/**
|
|
11
|
-
* The content of an `m.room.power_levels` event.
|
|
12
|
-
*/
|
|
13
|
-
export type PowerLevelsStateEvent = {
|
|
14
|
-
events?: {
|
|
15
|
-
[key: string]: number;
|
|
16
|
-
};
|
|
17
|
-
state_default?: number;
|
|
18
|
-
events_default?: number;
|
|
19
|
-
users?: {
|
|
20
|
-
[key: string]: number;
|
|
21
|
-
};
|
|
22
|
-
users_default?: number;
|
|
23
|
-
ban?: number;
|
|
24
|
-
invite?: number;
|
|
25
|
-
kick?: number;
|
|
26
|
-
redact?: number;
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* Validates that `event` is has a valid structure for a
|
|
30
|
-
* {@link PowerLevelsStateEvent}.
|
|
31
|
-
* @param event - The event to validate.
|
|
32
|
-
* @returns True, if the event is valid.
|
|
33
|
-
*/
|
|
34
|
-
export declare function isValidPowerLevelStateEvent(event: StateEvent<unknown>): event is StateEvent<PowerLevelsStateEvent>;
|
|
16
|
+
export declare function compareUserPowerLevelToNormalPowerLevel(userPowerLevel: UserPowerLevelType, normalPowerLevel: number): boolean;
|
|
35
17
|
/**
|
|
36
18
|
* Check if a user has the power to send a specific room event.
|
|
37
19
|
*
|
|
38
20
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
21
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room
|
|
39
22
|
* @param userId - the id of the user
|
|
40
23
|
* @param eventType - the type of room event
|
|
41
24
|
* @returns if true, the user has the power
|
|
42
25
|
*/
|
|
43
|
-
export declare function hasRoomEventPower(powerLevelStateEvent: PowerLevelsStateEvent | undefined, userId: string | undefined, eventType: string): boolean;
|
|
26
|
+
export declare function hasRoomEventPower(powerLevelStateEvent: PowerLevelsStateEvent | undefined, createRoomStateEvent: StateEvent<StateEventCreateContent> | undefined, userId: string | undefined, eventType: string): boolean;
|
|
44
27
|
/**
|
|
45
28
|
* Check if a user has the power to send a specific state event.
|
|
46
29
|
*
|
|
47
30
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
31
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room
|
|
48
32
|
* @param userId - the id of the user
|
|
49
33
|
* @param eventType - the type of state event
|
|
50
34
|
* @returns if true, the user has the power
|
|
51
35
|
*/
|
|
52
|
-
export declare function hasStateEventPower(powerLevelStateEvent: PowerLevelsStateEvent | undefined, userId: string | undefined, eventType: string): boolean;
|
|
36
|
+
export declare function hasStateEventPower(powerLevelStateEvent: PowerLevelsStateEvent | undefined, createRoomStateEvent: StateEvent<StateEventCreateContent> | undefined, userId: string | undefined, eventType: string): boolean;
|
|
53
37
|
/**
|
|
54
38
|
* Check if a user has the power to perform a specific action.
|
|
55
39
|
*
|
|
@@ -60,19 +44,25 @@ export declare function hasStateEventPower(powerLevelStateEvent: PowerLevelsStat
|
|
|
60
44
|
* * redact: Redact a message from another user
|
|
61
45
|
*
|
|
62
46
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
47
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room
|
|
63
48
|
* @param userId - the id of the user
|
|
64
49
|
* @param action - the action
|
|
65
50
|
* @returns if true, the user has the power
|
|
66
51
|
*/
|
|
67
|
-
export declare function hasActionPower(powerLevelStateEvent: PowerLevelsStateEvent | undefined, userId: string | undefined, action: PowerLevelsActions): boolean;
|
|
52
|
+
export declare function hasActionPower(powerLevelStateEvent: PowerLevelsStateEvent | undefined, createRoomStateEvent: StateEvent<StateEventCreateContent> | undefined, userId: string | undefined, action: PowerLevelsActions): boolean;
|
|
68
53
|
/**
|
|
69
54
|
* Calculate the power level of the user based on a `m.room.power_levels` event.
|
|
70
55
|
*
|
|
56
|
+
* Note that we return the @see UserPowerLevelType type instead of a number as Room Version 12
|
|
57
|
+
* gives a Room creator (and additionalCreators) always the highest power level regardless
|
|
58
|
+
* of the highest next Powerlevel number.
|
|
59
|
+
*
|
|
71
60
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event.
|
|
61
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room.
|
|
72
62
|
* @param userId - the ID of the user.
|
|
73
63
|
* @returns the power level of the user.
|
|
74
64
|
*/
|
|
75
|
-
export declare function calculateUserPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent, userId
|
|
65
|
+
export declare function calculateUserPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent | undefined, createRoomStateEvent: StateEvent<StateEventCreateContent> | undefined, userId: string): UserPowerLevelType;
|
|
76
66
|
/**
|
|
77
67
|
* Calculate the power level that a user needs send a specific room event.
|
|
78
68
|
*
|
|
@@ -80,15 +70,16 @@ export declare function calculateUserPowerLevel(powerLevelStateEvent: PowerLevel
|
|
|
80
70
|
* @param eventType - the type of room event
|
|
81
71
|
* @returns the power level that is needed
|
|
82
72
|
*/
|
|
83
|
-
export declare function calculateRoomEventPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent, eventType: string): number;
|
|
73
|
+
export declare function calculateRoomEventPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent | undefined, eventType: string): number;
|
|
84
74
|
/**
|
|
85
75
|
* Calculate the power level that a user needs send a specific state event.
|
|
86
76
|
*
|
|
87
77
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
78
|
+
* @param createRoomStateEvent - the `m.room.create` event
|
|
88
79
|
* @param eventType - the type of state event
|
|
89
80
|
* @returns the power level that is needed
|
|
90
81
|
*/
|
|
91
|
-
export declare function calculateStateEventPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent, eventType: string): number;
|
|
82
|
+
export declare function calculateStateEventPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent | undefined, createRoomStateEvent: StateEvent<StateEventCreateContent> | undefined, eventType: string): number;
|
|
92
83
|
/**
|
|
93
84
|
* Calculate the power level that a user needs to perform an action.
|
|
94
85
|
*
|
|
@@ -102,4 +93,4 @@ export declare function calculateStateEventPowerLevel(powerLevelStateEvent: Powe
|
|
|
102
93
|
* @param action - the action
|
|
103
94
|
* @returns the power level that is needed
|
|
104
95
|
*/
|
|
105
|
-
export declare function calculateActionPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent, action: PowerLevelsActions): number;
|
|
96
|
+
export declare function calculateActionPowerLevel(powerLevelStateEvent: PowerLevelsStateEvent | undefined, action: PowerLevelsActions): number;
|
package/build/cjs/index.cjs
CHANGED
|
@@ -124,6 +124,14 @@ var __assign$2 = (undefined && undefined.__assign) || function () {
|
|
|
124
124
|
};
|
|
125
125
|
return __assign$2.apply(this, arguments);
|
|
126
126
|
};
|
|
127
|
+
/**
|
|
128
|
+
* The type of the power levels state event.
|
|
129
|
+
*/
|
|
130
|
+
var STATE_EVENT_POWER_LEVELS = 'm.room.power_levels';
|
|
131
|
+
/**
|
|
132
|
+
* The types of type of the create event.
|
|
133
|
+
*/
|
|
134
|
+
var STATE_EVENT_CREATE = 'm.room.create';
|
|
127
135
|
/**
|
|
128
136
|
* Check if the given event is a {@link StateEvent}.
|
|
129
137
|
*
|
|
@@ -151,7 +159,12 @@ function isRoomEvent(event) {
|
|
|
151
159
|
// Allow any here, so that the validation works for every event
|
|
152
160
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
161
|
function isValidRoomEvent(event) {
|
|
154
|
-
|
|
162
|
+
var result = roomEventSchema.validate(event);
|
|
163
|
+
if (result.error) {
|
|
164
|
+
console.warn('Invalid room event:', result.error.details, { event: event });
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
return true;
|
|
155
168
|
}
|
|
156
169
|
/**
|
|
157
170
|
* Check if the given value is a valid {@link StateEvent}.
|
|
@@ -162,7 +175,12 @@ function isValidRoomEvent(event) {
|
|
|
162
175
|
// Allow any here, so that the validation works for every event
|
|
163
176
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
177
|
function isValidStateEvent(event) {
|
|
165
|
-
|
|
178
|
+
var result = stateEventSchema.validate(event);
|
|
179
|
+
if (result.error) {
|
|
180
|
+
console.warn('Invalid state event:', result.error.details, { event: event });
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
166
184
|
}
|
|
167
185
|
/**
|
|
168
186
|
* Check if the given value is a valid {@link ToDeviceMessageEvent}.
|
|
@@ -171,19 +189,26 @@ function isValidStateEvent(event) {
|
|
|
171
189
|
* @returns true if value is a valid to device message, else false.
|
|
172
190
|
*/
|
|
173
191
|
function isValidToDeviceMessageEvent(event) {
|
|
174
|
-
|
|
192
|
+
var result = toDeviceMessageSchema.validate(event);
|
|
193
|
+
if (result.error) {
|
|
194
|
+
console.warn('Invalid to device message event:', result.error.details, {
|
|
195
|
+
event: event,
|
|
196
|
+
});
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
175
200
|
}
|
|
176
|
-
|
|
177
|
-
* Base properties to validate for all events.
|
|
178
|
-
*/
|
|
179
|
-
var eventSchemaProps = {
|
|
180
|
-
type: Joi__default.default.string().required(),
|
|
201
|
+
var eventSchemaBasicProps = {
|
|
181
202
|
// Do roughly check against the format
|
|
182
203
|
// https://spec.matrix.org/v1.13/appendices/#common-identifier-format
|
|
183
204
|
sender: Joi__default.default.string().pattern(new RegExp('^@[^\\s:]*:\\S*$')).required(),
|
|
184
|
-
|
|
185
|
-
|
|
205
|
+
// Prior versions of the code had checked for a server_name. However in room version 12+ this got dropped. There is no way for us to check this here.
|
|
206
|
+
room_id: Joi__default.default.string().pattern(new RegExp('^!')).required(),
|
|
186
207
|
};
|
|
208
|
+
/**
|
|
209
|
+
* Base properties to validate for all events.
|
|
210
|
+
*/
|
|
211
|
+
var eventSchemaProps = __assign$2({ type: Joi__default.default.string().required(), content: Joi__default.default.object().required() }, eventSchemaBasicProps);
|
|
187
212
|
var roomEventSchema = Joi__default.default.object(__assign$2(__assign$2({}, eventSchemaProps), { event_id: Joi__default.default.string().pattern(new RegExp('^\\$.*')).required(), origin_server_ts: Joi__default.default.date().timestamp('javascript').required() })).unknown();
|
|
188
213
|
var stateEventSchema = Joi__default.default.object(__assign$2(__assign$2({}, eventSchemaProps), { event_id: Joi__default.default.string().pattern(new RegExp('^\\$.*')), origin_server_ts: Joi__default.default.date().timestamp('javascript'), state_key: Joi__default.default.string().allow('').required() })).unknown();
|
|
189
214
|
var toDeviceMessageSchema = Joi__default.default.object({
|
|
@@ -192,6 +217,71 @@ var toDeviceMessageSchema = Joi__default.default.object({
|
|
|
192
217
|
encrypted: Joi__default.default.boolean().required(),
|
|
193
218
|
content: Joi__default.default.object().required(),
|
|
194
219
|
}).unknown();
|
|
220
|
+
var createEventSchema = Joi__default.default.object(__assign$2(__assign$2({}, eventSchemaBasicProps), { type: Joi__default.default.string().equal(STATE_EVENT_CREATE).required(), content: Joi__default.default.object({
|
|
221
|
+
// Room version 1 does not have a room version, so we allow it to be undefined.
|
|
222
|
+
room_version: Joi__default.default.string().optional(),
|
|
223
|
+
// The user ID of the creator of the room. (only from 1-10. after that we must use the sender field)
|
|
224
|
+
creator: Joi__default.default.string().optional(),
|
|
225
|
+
// Room version 12 introduces the additional_creators field.
|
|
226
|
+
additional_creators: Joi__default.default.array().items(Joi__default.default.string()).optional(),
|
|
227
|
+
})
|
|
228
|
+
.unknown()
|
|
229
|
+
.required() })).unknown();
|
|
230
|
+
/**
|
|
231
|
+
* Validates that `event` is has a valid structure for a
|
|
232
|
+
* {@link StateEventCreateContent}.
|
|
233
|
+
* @param event - The event to validate.
|
|
234
|
+
* @returns True, if the event is valid.
|
|
235
|
+
*/
|
|
236
|
+
function isValidCreateEventSchema(event) {
|
|
237
|
+
if (!event) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
var result = createEventSchema.validate(event);
|
|
241
|
+
if (result.error) {
|
|
242
|
+
console.warn('Invalid room create message event:', result.error.details, {
|
|
243
|
+
event: event,
|
|
244
|
+
});
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
var powerLevelsEventSchema = Joi__default.default.object(__assign$2(__assign$2({}, eventSchemaBasicProps), {
|
|
250
|
+
// Strictly require to match the power levels event type
|
|
251
|
+
type: Joi__default.default.string().equal(STATE_EVENT_POWER_LEVELS).required(), content: Joi__default.default.object({
|
|
252
|
+
ban: Joi__default.default.number().optional().default(50),
|
|
253
|
+
events: Joi__default.default.object().pattern(Joi__default.default.string(), Joi__default.default.number()).optional(),
|
|
254
|
+
events_default: Joi__default.default.number().optional().default(0),
|
|
255
|
+
invite: Joi__default.default.number().optional().default(0),
|
|
256
|
+
kick: Joi__default.default.number().optional().default(50),
|
|
257
|
+
notifications: Joi__default.default.object({
|
|
258
|
+
room: Joi__default.default.number().optional().default(50),
|
|
259
|
+
})
|
|
260
|
+
.unknown()
|
|
261
|
+
.optional(),
|
|
262
|
+
redact: Joi__default.default.number().optional().default(50),
|
|
263
|
+
state_default: Joi__default.default.number().optional().default(50),
|
|
264
|
+
users: Joi__default.default.object().pattern(Joi__default.default.string(), Joi__default.default.number()).optional(),
|
|
265
|
+
users_default: Joi__default.default.number().optional().default(0),
|
|
266
|
+
})
|
|
267
|
+
.unknown()
|
|
268
|
+
.required() })).unknown();
|
|
269
|
+
/**
|
|
270
|
+
* Validates that `event` is has a valid structure for a
|
|
271
|
+
* {@link PowerLevelsStateEvent}.
|
|
272
|
+
* @param event - The event to validate.
|
|
273
|
+
* @returns True, if the event is valid.
|
|
274
|
+
*/
|
|
275
|
+
function isValidPowerLevelStateEvent(event) {
|
|
276
|
+
var result = powerLevelsEventSchema.validate(event);
|
|
277
|
+
if (result.error) {
|
|
278
|
+
console.warn('Invalid powerlevel event:', result.error.details, {
|
|
279
|
+
event: event,
|
|
280
|
+
});
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
195
285
|
|
|
196
286
|
/*
|
|
197
287
|
* Copyright 2022 Nordeck IT + Consulting GmbH
|
|
@@ -319,95 +409,63 @@ function compareOriginServerTS(a, b) {
|
|
|
319
409
|
* limitations under the License.
|
|
320
410
|
*/
|
|
321
411
|
/**
|
|
322
|
-
*
|
|
412
|
+
* Room version 12 requires us to have something larger than Max integer for room creators.
|
|
413
|
+
* This is a workaround to allow the room creator to always have the highest power level.
|
|
323
414
|
*/
|
|
324
|
-
var
|
|
325
|
-
function isNumberOrUndefined(value) {
|
|
326
|
-
return value === undefined || typeof value === 'number';
|
|
327
|
-
}
|
|
328
|
-
function isStringToNumberMapOrUndefined(value) {
|
|
329
|
-
return (value === undefined ||
|
|
330
|
-
(value !== null &&
|
|
331
|
-
typeof value === 'object' &&
|
|
332
|
-
Object.entries(value).every(function (_a) {
|
|
333
|
-
var k = _a[0], v = _a[1];
|
|
334
|
-
return typeof k === 'string' && typeof v === 'number';
|
|
335
|
-
})));
|
|
336
|
-
}
|
|
415
|
+
var ROOM_VERSION_12_CREATOR = 'ROOM_VERSION_12_CREATOR';
|
|
337
416
|
/**
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
* @param
|
|
341
|
-
* @returns True
|
|
417
|
+
* Compare a user's power level to a normal power level.
|
|
418
|
+
* @param userPowerLevel - The user's power level
|
|
419
|
+
* @param normalPowerLevel - The normal power level
|
|
420
|
+
* @returns True if the user's power level is greater than or equal to the normal power level, false otherwise
|
|
342
421
|
*/
|
|
343
|
-
function
|
|
344
|
-
if (
|
|
345
|
-
|
|
346
|
-
return
|
|
347
|
-
}
|
|
348
|
-
var content = event.content;
|
|
349
|
-
if (!isStringToNumberMapOrUndefined(content.events)) {
|
|
350
|
-
return false;
|
|
351
|
-
}
|
|
352
|
-
if (!isNumberOrUndefined(content.state_default)) {
|
|
353
|
-
return false;
|
|
354
|
-
}
|
|
355
|
-
if (!isNumberOrUndefined(content.events_default)) {
|
|
356
|
-
return false;
|
|
357
|
-
}
|
|
358
|
-
if (!isStringToNumberMapOrUndefined(content.users)) {
|
|
359
|
-
return false;
|
|
360
|
-
}
|
|
361
|
-
if (!isNumberOrUndefined(content.users_default)) {
|
|
362
|
-
return false;
|
|
363
|
-
}
|
|
364
|
-
if (!isNumberOrUndefined(content.ban)) {
|
|
365
|
-
return false;
|
|
366
|
-
}
|
|
367
|
-
if (!isNumberOrUndefined(content.invite)) {
|
|
368
|
-
return false;
|
|
369
|
-
}
|
|
370
|
-
if (!isNumberOrUndefined(content.kick)) {
|
|
371
|
-
return false;
|
|
422
|
+
function compareUserPowerLevelToNormalPowerLevel(userPowerLevel, normalPowerLevel) {
|
|
423
|
+
if (userPowerLevel === ROOM_VERSION_12_CREATOR) {
|
|
424
|
+
// Room version 12 creator has the highest power level.
|
|
425
|
+
return true;
|
|
372
426
|
}
|
|
373
|
-
if (
|
|
427
|
+
if (typeof userPowerLevel !== 'number') {
|
|
428
|
+
// If the user power level is not a number, we cannot compare it to a normal power level.
|
|
374
429
|
return false;
|
|
375
430
|
}
|
|
376
|
-
|
|
431
|
+
// Compare the user power level to the normal power level.
|
|
432
|
+
return userPowerLevel >= normalPowerLevel;
|
|
377
433
|
}
|
|
378
434
|
/**
|
|
379
435
|
* Check if a user has the power to send a specific room event.
|
|
380
436
|
*
|
|
381
437
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
438
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room
|
|
382
439
|
* @param userId - the id of the user
|
|
383
440
|
* @param eventType - the type of room event
|
|
384
441
|
* @returns if true, the user has the power
|
|
385
442
|
*/
|
|
386
|
-
function hasRoomEventPower(powerLevelStateEvent, userId, eventType) {
|
|
387
|
-
if (!
|
|
388
|
-
//
|
|
389
|
-
|
|
443
|
+
function hasRoomEventPower(powerLevelStateEvent, createRoomStateEvent, userId, eventType) {
|
|
444
|
+
if (!userId) {
|
|
445
|
+
// This is invalid but required to be checked due to widget API which may not know it
|
|
446
|
+
throw new Error('Cannot check action power without a user ID. Please provide a user ID.');
|
|
390
447
|
}
|
|
391
|
-
var userLevel = calculateUserPowerLevel(powerLevelStateEvent, userId);
|
|
448
|
+
var userLevel = calculateUserPowerLevel(powerLevelStateEvent, createRoomStateEvent, userId);
|
|
392
449
|
var eventLevel = calculateRoomEventPowerLevel(powerLevelStateEvent, eventType);
|
|
393
|
-
return userLevel
|
|
450
|
+
return compareUserPowerLevelToNormalPowerLevel(userLevel, eventLevel);
|
|
394
451
|
}
|
|
395
452
|
/**
|
|
396
453
|
* Check if a user has the power to send a specific state event.
|
|
397
454
|
*
|
|
398
455
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
456
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room
|
|
399
457
|
* @param userId - the id of the user
|
|
400
458
|
* @param eventType - the type of state event
|
|
401
459
|
* @returns if true, the user has the power
|
|
402
460
|
*/
|
|
403
|
-
function hasStateEventPower(powerLevelStateEvent, userId, eventType) {
|
|
404
|
-
if (!
|
|
405
|
-
//
|
|
406
|
-
|
|
461
|
+
function hasStateEventPower(powerLevelStateEvent, createRoomStateEvent, userId, eventType) {
|
|
462
|
+
if (!userId) {
|
|
463
|
+
// This is invalid but required to be checked due to widget API which may not know it
|
|
464
|
+
throw new Error('Cannot check action power without a user ID. Please provide a user ID.');
|
|
407
465
|
}
|
|
408
|
-
var userLevel = calculateUserPowerLevel(powerLevelStateEvent, userId);
|
|
409
|
-
var eventLevel = calculateStateEventPowerLevel(powerLevelStateEvent, eventType);
|
|
410
|
-
return userLevel
|
|
466
|
+
var userLevel = calculateUserPowerLevel(powerLevelStateEvent, createRoomStateEvent, userId);
|
|
467
|
+
var eventLevel = calculateStateEventPowerLevel(powerLevelStateEvent, createRoomStateEvent, eventType);
|
|
468
|
+
return compareUserPowerLevelToNormalPowerLevel(userLevel, eventLevel);
|
|
411
469
|
}
|
|
412
470
|
/**
|
|
413
471
|
* Check if a user has the power to perform a specific action.
|
|
@@ -419,30 +477,74 @@ function hasStateEventPower(powerLevelStateEvent, userId, eventType) {
|
|
|
419
477
|
* * redact: Redact a message from another user
|
|
420
478
|
*
|
|
421
479
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
480
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room
|
|
422
481
|
* @param userId - the id of the user
|
|
423
482
|
* @param action - the action
|
|
424
483
|
* @returns if true, the user has the power
|
|
425
484
|
*/
|
|
426
|
-
function hasActionPower(powerLevelStateEvent, userId, action) {
|
|
427
|
-
if (!
|
|
428
|
-
//
|
|
429
|
-
|
|
485
|
+
function hasActionPower(powerLevelStateEvent, createRoomStateEvent, userId, action) {
|
|
486
|
+
if (!userId) {
|
|
487
|
+
// This is invalid but required to be checked due to widget API which may not know it
|
|
488
|
+
throw new Error('Cannot check action power without a user ID. Please provide a user ID.');
|
|
430
489
|
}
|
|
431
|
-
var userLevel = calculateUserPowerLevel(powerLevelStateEvent, userId);
|
|
490
|
+
var userLevel = calculateUserPowerLevel(powerLevelStateEvent, createRoomStateEvent, userId);
|
|
432
491
|
var eventLevel = calculateActionPowerLevel(powerLevelStateEvent, action);
|
|
433
|
-
return userLevel
|
|
492
|
+
return compareUserPowerLevelToNormalPowerLevel(userLevel, eventLevel);
|
|
434
493
|
}
|
|
435
494
|
/**
|
|
436
495
|
* Calculate the power level of the user based on a `m.room.power_levels` event.
|
|
437
496
|
*
|
|
497
|
+
* Note that we return the @see UserPowerLevelType type instead of a number as Room Version 12
|
|
498
|
+
* gives a Room creator (and additionalCreators) always the highest power level regardless
|
|
499
|
+
* of the highest next Powerlevel number.
|
|
500
|
+
*
|
|
438
501
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event.
|
|
502
|
+
* @param createRoomStateEvent - the `m.room.create` event for the room.
|
|
439
503
|
* @param userId - the ID of the user.
|
|
440
504
|
* @returns the power level of the user.
|
|
441
505
|
*/
|
|
442
|
-
function calculateUserPowerLevel(powerLevelStateEvent, userId) {
|
|
443
|
-
var _a, _b, _c;
|
|
444
|
-
//
|
|
445
|
-
|
|
506
|
+
function calculateUserPowerLevel(powerLevelStateEvent, createRoomStateEvent, userId) {
|
|
507
|
+
var _a, _b, _c, _d, _e, _f;
|
|
508
|
+
// This is practically not allowed and therefor not covered by the spec. However a js consumer could still pass an undefined userId so we handle it gracefully.
|
|
509
|
+
if (!userId) {
|
|
510
|
+
// If no user ID is provided, we return the default user power level or 0 if not set.
|
|
511
|
+
return 0;
|
|
512
|
+
}
|
|
513
|
+
// If we have room version 12 we must check if the user is the creator of the room and needs to have the highest power level.
|
|
514
|
+
if (((_a = createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.content) === null || _a === void 0 ? void 0 : _a.room_version) === '12' ||
|
|
515
|
+
((_b = createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.content) === null || _b === void 0 ? void 0 : _b.room_version) === 'org.matrix.hydra.11') {
|
|
516
|
+
// If the user is the creator of the room, we return the special ROOM_VERSION_12_CREATOR value.
|
|
517
|
+
if (createRoomStateEvent.sender === userId) {
|
|
518
|
+
return ROOM_VERSION_12_CREATOR;
|
|
519
|
+
}
|
|
520
|
+
if ((_c = createRoomStateEvent.content.additional_creators) === null || _c === void 0 ? void 0 : _c.includes(userId)) {
|
|
521
|
+
// If the user is an additional creator of the room, we return the special ROOM_VERSION_12_CREATOR value.
|
|
522
|
+
return ROOM_VERSION_12_CREATOR;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
// If there is no power level state event, we assume the user has no power unless they are the room creator in which case they get PL 100.
|
|
526
|
+
if (!powerLevelStateEvent) {
|
|
527
|
+
if (['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'].includes((_e = (_d = createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.content) === null || _d === void 0 ? void 0 : _d.room_version) !== null && _e !== void 0 ? _e : '1')) {
|
|
528
|
+
// Room version 1-10 does not have a room version, so we assume the creator has power level 100.
|
|
529
|
+
return ((_f = createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.content) === null || _f === void 0 ? void 0 : _f.creator) === userId ? 100 : 0;
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
// For room versions 11 and above, we assume the sender has power level 100.
|
|
533
|
+
return (createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.sender) === userId ? 100 : 0;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
if (powerLevelStateEvent.users && userId in powerLevelStateEvent.users) {
|
|
537
|
+
// If the user is explicitly listed in the users map, return their power level.
|
|
538
|
+
return powerLevelStateEvent.users[userId];
|
|
539
|
+
}
|
|
540
|
+
else if (powerLevelStateEvent.users_default !== undefined) {
|
|
541
|
+
// If the user is not explicitly listed, return the default user power level.
|
|
542
|
+
return powerLevelStateEvent.users_default;
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
// If no users or default is set, return 0.
|
|
546
|
+
return 0;
|
|
547
|
+
}
|
|
446
548
|
}
|
|
447
549
|
/**
|
|
448
550
|
* Calculate the power level that a user needs send a specific room event.
|
|
@@ -454,19 +556,26 @@ function calculateUserPowerLevel(powerLevelStateEvent, userId) {
|
|
|
454
556
|
function calculateRoomEventPowerLevel(powerLevelStateEvent, eventType) {
|
|
455
557
|
var _a, _b, _c;
|
|
456
558
|
// See https://github.com/matrix-org/matrix-spec/blob/203b9756f52adfc2a3b63d664f18cdbf9f8bf126/data/event-schemas/schema/m.room.power_levels.yaml#L14-L19
|
|
457
|
-
return ((_c = (_b = (_a = powerLevelStateEvent.events) === null || _a === void 0 ? void 0 : _a[eventType]) !== null && _b !== void 0 ? _b : powerLevelStateEvent.events_default) !== null && _c !== void 0 ? _c : 0);
|
|
559
|
+
return ((_c = (_b = (_a = powerLevelStateEvent === null || powerLevelStateEvent === void 0 ? void 0 : powerLevelStateEvent.events) === null || _a === void 0 ? void 0 : _a[eventType]) !== null && _b !== void 0 ? _b : powerLevelStateEvent === null || powerLevelStateEvent === void 0 ? void 0 : powerLevelStateEvent.events_default) !== null && _c !== void 0 ? _c : 0);
|
|
458
560
|
}
|
|
459
561
|
/**
|
|
460
562
|
* Calculate the power level that a user needs send a specific state event.
|
|
461
563
|
*
|
|
462
564
|
* @param powerLevelStateEvent - the content of the `m.room.power_levels` event
|
|
565
|
+
* @param createRoomStateEvent - the `m.room.create` event
|
|
463
566
|
* @param eventType - the type of state event
|
|
464
567
|
* @returns the power level that is needed
|
|
465
568
|
*/
|
|
466
|
-
function calculateStateEventPowerLevel(powerLevelStateEvent, eventType) {
|
|
467
|
-
var _a, _b, _c;
|
|
569
|
+
function calculateStateEventPowerLevel(powerLevelStateEvent, createRoomStateEvent, eventType) {
|
|
570
|
+
var _a, _b, _c, _d, _e;
|
|
571
|
+
// In room version 12 (and the beta org.matrix.hydra.11 version) we need 150 for m.room.tombstone events and it cant be changed by the user.
|
|
572
|
+
if ((((_a = createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.content) === null || _a === void 0 ? void 0 : _a.room_version) === '12' ||
|
|
573
|
+
((_b = createRoomStateEvent === null || createRoomStateEvent === void 0 ? void 0 : createRoomStateEvent.content) === null || _b === void 0 ? void 0 : _b.room_version) === 'org.matrix.hydra.11') &&
|
|
574
|
+
eventType === 'm.room.tombstone') {
|
|
575
|
+
return 150;
|
|
576
|
+
}
|
|
468
577
|
// See https://github.com/matrix-org/matrix-spec/blob/203b9756f52adfc2a3b63d664f18cdbf9f8bf126/data/event-schemas/schema/m.room.power_levels.yaml#L14-L19
|
|
469
|
-
return ((
|
|
578
|
+
return ((_e = (_d = (_c = powerLevelStateEvent === null || powerLevelStateEvent === void 0 ? void 0 : powerLevelStateEvent.events) === null || _c === void 0 ? void 0 : _c[eventType]) !== null && _d !== void 0 ? _d : powerLevelStateEvent === null || powerLevelStateEvent === void 0 ? void 0 : powerLevelStateEvent.state_default) !== null && _e !== void 0 ? _e : 50);
|
|
470
579
|
}
|
|
471
580
|
/**
|
|
472
581
|
* Calculate the power level that a user needs to perform an action.
|
|
@@ -1914,12 +2023,15 @@ var WidgetApiImpl = /** @class */ (function () {
|
|
|
1914
2023
|
}());
|
|
1915
2024
|
|
|
1916
2025
|
exports.ROOM_EVENT_REDACTION = ROOM_EVENT_REDACTION;
|
|
2026
|
+
exports.ROOM_VERSION_12_CREATOR = ROOM_VERSION_12_CREATOR;
|
|
2027
|
+
exports.STATE_EVENT_CREATE = STATE_EVENT_CREATE;
|
|
1917
2028
|
exports.STATE_EVENT_POWER_LEVELS = STATE_EVENT_POWER_LEVELS;
|
|
1918
2029
|
exports.STATE_EVENT_ROOM_MEMBER = STATE_EVENT_ROOM_MEMBER;
|
|
1919
2030
|
exports.WIDGET_CAPABILITY_NAVIGATE = WIDGET_CAPABILITY_NAVIGATE;
|
|
1920
2031
|
exports.WidgetApiImpl = WidgetApiImpl;
|
|
1921
2032
|
exports.calculateUserPowerLevel = calculateUserPowerLevel;
|
|
1922
2033
|
exports.compareOriginServerTS = compareOriginServerTS;
|
|
2034
|
+
exports.compareUserPowerLevelToNormalPowerLevel = compareUserPowerLevelToNormalPowerLevel;
|
|
1923
2035
|
exports.extractRawWidgetParameters = extractRawWidgetParameters;
|
|
1924
2036
|
exports.extractWidgetApiParameters = extractWidgetApiParameters;
|
|
1925
2037
|
exports.extractWidgetParameters = extractWidgetParameters;
|
|
@@ -1934,6 +2046,7 @@ exports.hasStateEventPower = hasStateEventPower;
|
|
|
1934
2046
|
exports.hasWidgetParameters = hasWidgetParameters;
|
|
1935
2047
|
exports.isRoomEvent = isRoomEvent;
|
|
1936
2048
|
exports.isStateEvent = isStateEvent;
|
|
2049
|
+
exports.isValidCreateEventSchema = isValidCreateEventSchema;
|
|
1937
2050
|
exports.isValidEventWithRelatesTo = isValidEventWithRelatesTo;
|
|
1938
2051
|
exports.isValidPowerLevelStateEvent = isValidPowerLevelStateEvent;
|
|
1939
2052
|
exports.isValidRedactionEvent = isValidRedactionEvent;
|