@matter/node 0.14.0 → 0.14.1-alpha.0-20250606-a9bcd03f9
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/cjs/behavior/Behavior.d.ts +2 -1
- package/dist/cjs/behavior/Behavior.d.ts.map +1 -1
- package/dist/cjs/behavior/Behavior.js +1 -1
- package/dist/cjs/behavior/Behavior.js.map +1 -1
- package/dist/cjs/behavior/Transitions.js +2 -2
- package/dist/cjs/behavior/Transitions.js.map +1 -1
- package/dist/cjs/behavior/context/server/OnlineContext.d.ts +3 -3
- package/dist/cjs/behavior/context/server/OnlineContext.d.ts.map +1 -1
- package/dist/cjs/behavior/context/server/OnlineContext.js +12 -9
- package/dist/cjs/behavior/context/server/OnlineContext.js.map +1 -1
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.js.map +1 -1
- package/dist/cjs/behavior/system/network/NetworkBehavior.d.ts.map +1 -1
- package/dist/cjs/behavior/system/network/NetworkBehavior.js +2 -1
- package/dist/cjs/behavior/system/network/NetworkBehavior.js.map +1 -1
- package/dist/cjs/behavior/system/network/ServerGroupNetworking.d.ts +18 -0
- package/dist/cjs/behavior/system/network/ServerGroupNetworking.d.ts.map +1 -0
- package/dist/cjs/behavior/system/network/ServerGroupNetworking.js +150 -0
- package/dist/cjs/behavior/system/network/ServerGroupNetworking.js.map +6 -0
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js +25 -7
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
- package/dist/cjs/behavior/system/sessions/SessionsBehavior.d.ts.map +1 -1
- package/dist/cjs/behavior/system/sessions/SessionsBehavior.js.map +1 -1
- package/dist/cjs/behaviors/access-control/AccessControlServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/access-control/AccessControlServer.js +18 -12
- package/dist/cjs/behaviors/access-control/AccessControlServer.js.map +1 -1
- package/dist/cjs/behaviors/color-control/ColorControlServer.d.ts +4 -4
- package/dist/cjs/behaviors/color-control/ColorControlServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/color-control/ColorControlServer.js +3 -3
- package/dist/cjs/behaviors/color-control/ColorControlServer.js.map +1 -1
- package/dist/cjs/behaviors/general-commissioning/GeneralCommissioningServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/general-commissioning/GeneralCommissioningServer.js +5 -4
- package/dist/cjs/behaviors/general-commissioning/GeneralCommissioningServer.js.map +1 -1
- package/dist/cjs/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -1
- package/dist/cjs/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.d.ts +27 -4
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.js +340 -21
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.js.map +2 -2
- package/dist/cjs/behaviors/groups/GroupsServer.d.ts +19 -3
- package/dist/cjs/behaviors/groups/GroupsServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/groups/GroupsServer.js +138 -1
- package/dist/cjs/behaviors/groups/GroupsServer.js.map +2 -2
- package/dist/cjs/behaviors/level-control/LevelControlServer.d.ts +5 -5
- package/dist/cjs/behaviors/level-control/LevelControlServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/level-control/LevelControlServer.js +3 -3
- package/dist/cjs/behaviors/level-control/LevelControlServer.js.map +1 -1
- package/dist/cjs/behaviors/mode-select/ModeSelectServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/mode-select/ModeSelectServer.js +3 -3
- package/dist/cjs/behaviors/mode-select/ModeSelectServer.js.map +1 -1
- package/dist/cjs/behaviors/on-off/OnOffServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/on-off/OnOffServer.js +3 -3
- package/dist/cjs/behaviors/on-off/OnOffServer.js.map +1 -1
- package/dist/cjs/behaviors/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/operational-credentials/OperationalCredentialsServer.js +14 -8
- package/dist/cjs/behaviors/operational-credentials/OperationalCredentialsServer.js.map +1 -1
- package/dist/cjs/endpoint/Endpoint.js +1 -1
- package/dist/cjs/endpoint/Endpoint.js.map +1 -1
- package/dist/cjs/node/Node.d.ts +1 -1
- package/dist/cjs/node/Node.d.ts.map +1 -1
- package/dist/cjs/node/Node.js +2 -2
- package/dist/cjs/node/Node.js.map +1 -1
- package/dist/cjs/node/ServerNode.d.ts +1 -1
- package/dist/cjs/node/ServerNode.d.ts.map +1 -1
- package/dist/cjs/node/ServerNode.js +2 -2
- package/dist/cjs/node/ServerNode.js.map +1 -1
- package/dist/cjs/node/client/NodePeerAddressStore.d.ts +1 -1
- package/dist/cjs/node/client/NodePeerAddressStore.d.ts.map +1 -1
- package/dist/cjs/node/server/InteractionServer.d.ts +2 -2
- package/dist/cjs/node/server/InteractionServer.d.ts.map +1 -1
- package/dist/cjs/node/server/InteractionServer.js +1 -1
- package/dist/cjs/node/server/InteractionServer.js.map +1 -1
- package/dist/cjs/node/server/ServerSubscription.d.ts +4 -4
- package/dist/cjs/node/server/ServerSubscription.d.ts.map +1 -1
- package/dist/cjs/node/server/ServerSubscription.js.map +1 -1
- package/dist/esm/behavior/Behavior.d.ts +2 -1
- package/dist/esm/behavior/Behavior.d.ts.map +1 -1
- package/dist/esm/behavior/Behavior.js +2 -2
- package/dist/esm/behavior/Behavior.js.map +1 -1
- package/dist/esm/behavior/Transitions.js +1 -1
- package/dist/esm/behavior/context/server/OnlineContext.d.ts +3 -3
- package/dist/esm/behavior/context/server/OnlineContext.d.ts.map +1 -1
- package/dist/esm/behavior/context/server/OnlineContext.js +13 -10
- package/dist/esm/behavior/context/server/OnlineContext.js.map +1 -1
- package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
- package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
- package/dist/esm/behavior/internal/ClientBehaviorBacking.js.map +1 -1
- package/dist/esm/behavior/system/network/NetworkBehavior.d.ts.map +1 -1
- package/dist/esm/behavior/system/network/NetworkBehavior.js +2 -1
- package/dist/esm/behavior/system/network/NetworkBehavior.js.map +1 -1
- package/dist/esm/behavior/system/network/ServerGroupNetworking.d.ts +18 -0
- package/dist/esm/behavior/system/network/ServerGroupNetworking.d.ts.map +1 -0
- package/dist/esm/behavior/system/network/ServerGroupNetworking.js +130 -0
- package/dist/esm/behavior/system/network/ServerGroupNetworking.js.map +6 -0
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.js +23 -5
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
- package/dist/esm/behavior/system/sessions/SessionsBehavior.d.ts.map +1 -1
- package/dist/esm/behavior/system/sessions/SessionsBehavior.js.map +1 -1
- package/dist/esm/behaviors/access-control/AccessControlServer.d.ts.map +1 -1
- package/dist/esm/behaviors/access-control/AccessControlServer.js +20 -13
- package/dist/esm/behaviors/access-control/AccessControlServer.js.map +1 -1
- package/dist/esm/behaviors/color-control/ColorControlServer.d.ts +4 -4
- package/dist/esm/behaviors/color-control/ColorControlServer.d.ts.map +1 -1
- package/dist/esm/behaviors/color-control/ColorControlServer.js +3 -3
- package/dist/esm/behaviors/color-control/ColorControlServer.js.map +1 -1
- package/dist/esm/behaviors/general-commissioning/GeneralCommissioningServer.d.ts.map +1 -1
- package/dist/esm/behaviors/general-commissioning/GeneralCommissioningServer.js +6 -5
- package/dist/esm/behaviors/general-commissioning/GeneralCommissioningServer.js.map +1 -1
- package/dist/esm/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -1
- package/dist/esm/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.d.ts +27 -4
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.d.ts.map +1 -1
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.js +342 -23
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.js.map +2 -2
- package/dist/esm/behaviors/groups/GroupsServer.d.ts +19 -3
- package/dist/esm/behaviors/groups/GroupsServer.d.ts.map +1 -1
- package/dist/esm/behaviors/groups/GroupsServer.js +147 -1
- package/dist/esm/behaviors/groups/GroupsServer.js.map +1 -1
- package/dist/esm/behaviors/level-control/LevelControlServer.d.ts +5 -5
- package/dist/esm/behaviors/level-control/LevelControlServer.d.ts.map +1 -1
- package/dist/esm/behaviors/level-control/LevelControlServer.js +3 -3
- package/dist/esm/behaviors/level-control/LevelControlServer.js.map +1 -1
- package/dist/esm/behaviors/mode-select/ModeSelectServer.d.ts.map +1 -1
- package/dist/esm/behaviors/mode-select/ModeSelectServer.js +3 -3
- package/dist/esm/behaviors/mode-select/ModeSelectServer.js.map +1 -1
- package/dist/esm/behaviors/on-off/OnOffServer.d.ts.map +1 -1
- package/dist/esm/behaviors/on-off/OnOffServer.js +3 -3
- package/dist/esm/behaviors/on-off/OnOffServer.js.map +1 -1
- package/dist/esm/behaviors/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
- package/dist/esm/behaviors/operational-credentials/OperationalCredentialsServer.js +15 -9
- package/dist/esm/behaviors/operational-credentials/OperationalCredentialsServer.js.map +1 -1
- package/dist/esm/endpoint/Endpoint.js +1 -1
- package/dist/esm/endpoint/Endpoint.js.map +1 -1
- package/dist/esm/node/Node.d.ts +1 -1
- package/dist/esm/node/Node.d.ts.map +1 -1
- package/dist/esm/node/Node.js +1 -1
- package/dist/esm/node/Node.js.map +1 -1
- package/dist/esm/node/ServerNode.d.ts +1 -1
- package/dist/esm/node/ServerNode.d.ts.map +1 -1
- package/dist/esm/node/ServerNode.js +1 -1
- package/dist/esm/node/client/NodePeerAddressStore.d.ts +1 -1
- package/dist/esm/node/client/NodePeerAddressStore.d.ts.map +1 -1
- package/dist/esm/node/server/InteractionServer.d.ts +2 -2
- package/dist/esm/node/server/InteractionServer.d.ts.map +1 -1
- package/dist/esm/node/server/InteractionServer.js +2 -2
- package/dist/esm/node/server/InteractionServer.js.map +1 -1
- package/dist/esm/node/server/ServerSubscription.d.ts +4 -4
- package/dist/esm/node/server/ServerSubscription.d.ts.map +1 -1
- package/dist/esm/node/server/ServerSubscription.js.map +1 -1
- package/package.json +7 -7
- package/src/behavior/Behavior.ts +2 -2
- package/src/behavior/Transitions.ts +1 -1
- package/src/behavior/context/server/OnlineContext.ts +21 -19
- package/src/behavior/internal/ClientBehaviorBacking.ts +2 -1
- package/src/behavior/system/commissioning/CommissioningClient.ts +1 -1
- package/src/behavior/system/network/NetworkBehavior.ts +2 -1
- package/src/behavior/system/network/ServerGroupNetworking.ts +150 -0
- package/src/behavior/system/network/ServerNetworkRuntime.ts +27 -5
- package/src/behavior/system/sessions/SessionsBehavior.ts +5 -5
- package/src/behaviors/access-control/AccessControlServer.ts +21 -14
- package/src/behaviors/color-control/ColorControlServer.ts +4 -4
- package/src/behaviors/general-commissioning/GeneralCommissioningServer.ts +8 -7
- package/src/behaviors/general-commissioning/ServerNodeFailsafeContext.ts +1 -1
- package/src/behaviors/group-key-management/GroupKeyManagementServer.ts +441 -26
- package/src/behaviors/groups/GroupsServer.ts +181 -3
- package/src/behaviors/level-control/LevelControlServer.ts +5 -5
- package/src/behaviors/mode-select/ModeSelectServer.ts +3 -3
- package/src/behaviors/on-off/OnOffServer.ts +3 -3
- package/src/behaviors/operational-credentials/OperationalCredentialsServer.ts +17 -9
- package/src/endpoint/Endpoint.ts +1 -1
- package/src/node/Node.ts +1 -1
- package/src/node/ServerNode.ts +1 -1
- package/src/node/client/NodePeerAddressStore.ts +1 -1
- package/src/node/server/InteractionServer.ts +5 -6
- package/src/node/server/ServerSubscription.ts +3 -4
|
@@ -4,11 +4,189 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import { GroupKeyManagementServer } from "#behaviors/group-key-management";
|
|
8
|
+
import { IdentifyBehavior } from "#behaviors/identify";
|
|
9
|
+
import { Groups } from "#clusters/groups";
|
|
10
|
+
import { Endpoint } from "#endpoint/Endpoint.js";
|
|
11
|
+
import { RootEndpoint } from "#endpoints/root";
|
|
12
|
+
import { Logger } from "#general";
|
|
13
|
+
import { AccessLevel } from "#model";
|
|
14
|
+
import {
|
|
15
|
+
Command,
|
|
16
|
+
StatusCode,
|
|
17
|
+
StatusResponseError,
|
|
18
|
+
TlvField,
|
|
19
|
+
TlvGroupId,
|
|
20
|
+
TlvNoResponse,
|
|
21
|
+
TlvObject,
|
|
22
|
+
TlvString,
|
|
23
|
+
} from "#types";
|
|
24
|
+
import { InternalError } from "@matter/general";
|
|
9
25
|
import { GroupsBehavior } from "./GroupsBehavior.js";
|
|
10
26
|
|
|
27
|
+
const logger = Logger.get("GroupsServer");
|
|
28
|
+
|
|
29
|
+
// We enable group names by default
|
|
30
|
+
const GroupsBase = GroupsBehavior.with(Groups.Feature.GroupNames);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Monkey patching Tlv Structure of addGroup* commands to prevent data validation of the groupName field to be
|
|
34
|
+
* handled as ConstraintError because we need to return a special error.
|
|
35
|
+
* We do this to leave the model in fact for other validations and only apply the change for our Schema-aware Tlv parsing.
|
|
36
|
+
*/
|
|
37
|
+
Groups.Cluster.commands = {
|
|
38
|
+
...Groups.Cluster.commands,
|
|
39
|
+
addGroup: Command(
|
|
40
|
+
0x0,
|
|
41
|
+
TlvObject({
|
|
42
|
+
groupId: TlvField(0, TlvGroupId),
|
|
43
|
+
groupName: TlvField(1, TlvString),
|
|
44
|
+
}),
|
|
45
|
+
0x0,
|
|
46
|
+
Groups.TlvAddGroupResponse,
|
|
47
|
+
{ invokeAcl: AccessLevel.Manage },
|
|
48
|
+
),
|
|
49
|
+
addGroupIfIdentifying: Command(
|
|
50
|
+
0x5,
|
|
51
|
+
TlvObject({
|
|
52
|
+
groupId: TlvField(0, TlvGroupId),
|
|
53
|
+
groupName: TlvField(1, TlvString),
|
|
54
|
+
}),
|
|
55
|
+
0x5,
|
|
56
|
+
TlvNoResponse,
|
|
57
|
+
{ invokeAcl: AccessLevel.Manage },
|
|
58
|
+
),
|
|
59
|
+
};
|
|
60
|
+
|
|
11
61
|
/**
|
|
12
62
|
* This is the default server implementation of {@link GroupsBehavior}.
|
|
13
63
|
*/
|
|
14
|
-
export class GroupsServer extends
|
|
64
|
+
export class GroupsServer extends GroupsBase {
|
|
65
|
+
override initialize() {
|
|
66
|
+
this.state.nameSupport.groupNames = this.features.groupNames;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// We need to search the root here ourselves because we cannot include ServerNode because else we generate a
|
|
70
|
+
// circular dependency
|
|
71
|
+
#rootEndpoint(): Endpoint<RootEndpoint> {
|
|
72
|
+
const rootEndpoint = this.endpoint.ownerOfType(RootEndpoint);
|
|
73
|
+
if (rootEndpoint === undefined) {
|
|
74
|
+
throw new InternalError("RootEndpoint not found");
|
|
75
|
+
}
|
|
76
|
+
return rootEndpoint;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#actOnGroupKeyManagement(act: (groupKeyManagement: GroupKeyManagementServer) => unknown) {
|
|
80
|
+
return this.#rootEndpoint().act(agent => act(agent.get(GroupKeyManagementServer)));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override async addGroup({ groupId, groupName }: Groups.AddGroupRequest): Promise<Groups.AddGroupResponse> {
|
|
84
|
+
const fabric = this.session.associatedFabric;
|
|
85
|
+
|
|
86
|
+
if (groupId < 1) {
|
|
87
|
+
return { status: StatusCode.ConstraintError, groupId };
|
|
88
|
+
}
|
|
89
|
+
if (groupName.length > 16) {
|
|
90
|
+
return { status: StatusCode.ConstraintError, groupId };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!fabric.groups.groupKeyIdMap.has(groupId)) {
|
|
94
|
+
return { status: StatusCode.UnsupportedAccess, groupId };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const endpointNumber = this.endpoint.number;
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
await this.#actOnGroupKeyManagement(gkm =>
|
|
101
|
+
gkm.addEndpointForGroup(fabric, groupId, endpointNumber, groupName),
|
|
102
|
+
);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
logger.error(error);
|
|
105
|
+
StatusResponseError.accept(error);
|
|
106
|
+
return { status: error.code, groupId };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { status: StatusCode.Success, groupId };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
override viewGroup({ groupId }: Groups.ViewGroupRequest): Groups.ViewGroupResponse {
|
|
113
|
+
const fabric = this.session.associatedFabric;
|
|
114
|
+
|
|
115
|
+
if (groupId < 1) {
|
|
116
|
+
return { status: StatusCode.ConstraintError, groupId, groupName: "" };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const fabricIndex = fabric.fabricIndex;
|
|
120
|
+
const endpointNumber = this.endpoint.number;
|
|
121
|
+
|
|
122
|
+
const { groupTable } = this.#rootEndpoint().stateOf(GroupKeyManagementServer);
|
|
123
|
+
const groupEntry = groupTable.find(entry => entry.groupId === groupId && entry.fabricIndex === fabricIndex);
|
|
124
|
+
if (groupEntry === undefined || !groupEntry.endpoints.includes(endpointNumber)) {
|
|
125
|
+
return { status: StatusCode.NotFound, groupId, groupName: "" };
|
|
126
|
+
}
|
|
127
|
+
return { status: StatusCode.Success, groupId, groupName: groupEntry.groupName ?? "" };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
override async getGroupMembership({
|
|
131
|
+
groupList,
|
|
132
|
+
}: Groups.GetGroupMembershipRequest): Promise<Groups.GetGroupMembershipResponse> {
|
|
133
|
+
const fabric = this.session.associatedFabric;
|
|
134
|
+
const fabricIndex = fabric.fabricIndex;
|
|
135
|
+
const endpointNumber = this.endpoint.number;
|
|
136
|
+
|
|
137
|
+
const { groupTable } = this.#rootEndpoint().stateOf(GroupKeyManagementServer);
|
|
138
|
+
const endpointGroups = groupTable.filter(
|
|
139
|
+
entry => entry.endpoints.includes(endpointNumber) && entry.fabricIndex === fabricIndex,
|
|
140
|
+
);
|
|
141
|
+
const fabricGroupsList = endpointGroups.map(entry => entry.groupId);
|
|
142
|
+
|
|
143
|
+
if (groupList.length === 0) {
|
|
144
|
+
return { capacity: 0xfe - fabricGroupsList.length, groupList: fabricGroupsList };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const filteredGroupsList = groupList.filter(groupId => fabricGroupsList.includes(groupId));
|
|
148
|
+
return { capacity: 0xfe - fabricGroupsList.length, groupList: filteredGroupsList };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
override async removeGroup({ groupId }: Groups.RemoveGroupRequest): Promise<Groups.RemoveGroupResponse> {
|
|
152
|
+
if (groupId < 1) {
|
|
153
|
+
return { status: StatusCode.ConstraintError, groupId };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
if (
|
|
158
|
+
await this.#actOnGroupKeyManagement(gkm =>
|
|
159
|
+
gkm.removeEndpoint(this.session.associatedFabric, this.endpoint.number, groupId),
|
|
160
|
+
)
|
|
161
|
+
) {
|
|
162
|
+
return { status: StatusCode.Success, groupId };
|
|
163
|
+
}
|
|
164
|
+
return { status: StatusCode.NotFound, groupId };
|
|
165
|
+
} catch (error) {
|
|
166
|
+
StatusResponseError.accept(error);
|
|
167
|
+
return { status: error.code, groupId };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// TODO ScenesManagement cluster is also affected by this command
|
|
172
|
+
override async removeAllGroups() {
|
|
173
|
+
try {
|
|
174
|
+
await this.#actOnGroupKeyManagement(gkm =>
|
|
175
|
+
gkm.removeEndpoint(this.session.associatedFabric, this.endpoint.number),
|
|
176
|
+
);
|
|
177
|
+
} catch (error) {
|
|
178
|
+
StatusResponseError.accept(error);
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
override async addGroupIfIdentifying({ groupId, groupName }: Groups.AddGroupIfIdentifyingRequest) {
|
|
184
|
+
if (this.endpoint.stateOf(IdentifyBehavior).identifyTime > 0) {
|
|
185
|
+
// We identify ourselves currently
|
|
186
|
+
const { status } = await this.addGroup({ groupId, groupName });
|
|
187
|
+
if (status !== StatusCode.Success) {
|
|
188
|
+
throw new StatusResponseError(`Failed to add group ${groupId}`, status);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { Behavior } from "#behavior/Behavior.js";
|
|
7
8
|
import { ActionContext } from "#behavior/context/ActionContext.js";
|
|
8
|
-
import { Behavior } from "#behavior/index.js";
|
|
9
9
|
import { Transitions } from "#behavior/Transitions.js";
|
|
10
10
|
import { ColorControlServer } from "#behaviors/color-control";
|
|
11
11
|
import { GeneralDiagnosticsBehavior } from "#behaviors/general-diagnostics";
|
|
12
12
|
import { OnOffServer } from "#behaviors/on-off";
|
|
13
13
|
import { GeneralDiagnostics } from "#clusters/general-diagnostics";
|
|
14
14
|
import { LevelControl } from "#clusters/level-control";
|
|
15
|
-
import { Endpoint } from "#endpoint/
|
|
16
|
-
import { RootEndpoint } from "#endpoints/root";
|
|
15
|
+
import { Endpoint } from "#endpoint/Endpoint.js";
|
|
17
16
|
import { AsyncObservable, Logger, MaybePromise } from "#general";
|
|
17
|
+
import { ServerNode } from "#node/ServerNode.js";
|
|
18
18
|
import { Val } from "#protocol";
|
|
19
19
|
import { ClusterType, StatusCode, StatusResponseError, TypeFromPartialBitSchema } from "#types";
|
|
20
20
|
import { LevelControlBehavior } from "./LevelControlBehavior.js";
|
|
@@ -572,8 +572,8 @@ export class LevelControlBaseServer extends LevelControlBase {
|
|
|
572
572
|
}
|
|
573
573
|
|
|
574
574
|
#getBootReason() {
|
|
575
|
-
const rootEndpoint = this.
|
|
576
|
-
if (rootEndpoint
|
|
575
|
+
const rootEndpoint = this.env.get(ServerNode);
|
|
576
|
+
if (rootEndpoint.behaviors.has(GeneralDiagnosticsBehavior)) {
|
|
577
577
|
return rootEndpoint.stateOf(GeneralDiagnosticsBehavior).bootReason;
|
|
578
578
|
}
|
|
579
579
|
}
|
|
@@ -9,8 +9,8 @@ import { OnOffServer } from "#behaviors/on-off";
|
|
|
9
9
|
import { GeneralDiagnostics } from "#clusters/general-diagnostics";
|
|
10
10
|
import { ModeSelect } from "#clusters/mode-select";
|
|
11
11
|
import { OnOff } from "#clusters/on-off";
|
|
12
|
-
import { RootEndpoint } from "#endpoints/root";
|
|
13
12
|
import { Logger, MaybePromise } from "#general";
|
|
13
|
+
import { ServerNode } from "#node/ServerNode.js";
|
|
14
14
|
import { ClusterType, StatusCode, StatusResponseError } from "#types";
|
|
15
15
|
import { ModeSelectBehavior } from "./ModeSelectBehavior.js";
|
|
16
16
|
|
|
@@ -101,8 +101,8 @@ export class ModeSelectBaseServer extends ModeSelectBase {
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
#getBootReason() {
|
|
104
|
-
const rootEndpoint = this.
|
|
105
|
-
if (rootEndpoint
|
|
104
|
+
const rootEndpoint = this.env.get(ServerNode);
|
|
105
|
+
if (rootEndpoint.behaviors.has(GeneralDiagnosticsBehavior)) {
|
|
106
106
|
return rootEndpoint.stateOf(GeneralDiagnosticsBehavior).bootReason;
|
|
107
107
|
}
|
|
108
108
|
}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
import { GeneralDiagnosticsBehavior } from "#behaviors/general-diagnostics";
|
|
8
8
|
import { GeneralDiagnostics } from "#clusters/general-diagnostics";
|
|
9
9
|
import { OnOff } from "#clusters/on-off";
|
|
10
|
-
import { RootEndpoint } from "#endpoints/root";
|
|
11
10
|
import { MaybePromise, Time, Timer } from "#general";
|
|
11
|
+
import { ServerNode } from "#node/ServerNode.js";
|
|
12
12
|
import { OnOffBehavior } from "./OnOffBehavior.js";
|
|
13
13
|
|
|
14
14
|
const OnOffLogicBase = OnOffBehavior.with(OnOff.Feature.Lighting);
|
|
@@ -187,8 +187,8 @@ export class OnOffBaseServer extends OnOffLogicBase {
|
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
#getBootReason() {
|
|
190
|
-
const rootEndpoint = this.
|
|
191
|
-
if (rootEndpoint
|
|
190
|
+
const rootEndpoint = this.env.get(ServerNode);
|
|
191
|
+
if (rootEndpoint.behaviors.has(GeneralDiagnosticsBehavior)) {
|
|
192
192
|
return rootEndpoint.stateOf(GeneralDiagnosticsBehavior).bootReason;
|
|
193
193
|
}
|
|
194
194
|
}
|
|
@@ -15,7 +15,6 @@ import { CryptoVerifyError, Logger, MatterFlowError, MaybePromise, UnexpectedDat
|
|
|
15
15
|
import { AccessLevel } from "#model";
|
|
16
16
|
import type { Node } from "#node/Node.js";
|
|
17
17
|
import {
|
|
18
|
-
assertSecureSession,
|
|
19
18
|
CertificateError,
|
|
20
19
|
DeviceCertification,
|
|
21
20
|
DeviceCommissioner,
|
|
@@ -25,6 +24,7 @@ import {
|
|
|
25
24
|
FabricTableFullError,
|
|
26
25
|
MatterFabricConflictError,
|
|
27
26
|
MatterFabricInvalidAdminSubjectError,
|
|
27
|
+
NodeSession,
|
|
28
28
|
PublicKeyError,
|
|
29
29
|
TlvAttestation,
|
|
30
30
|
TlvCertSigningRequest,
|
|
@@ -101,6 +101,9 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
101
101
|
|
|
102
102
|
const certification = await this.getCertification();
|
|
103
103
|
|
|
104
|
+
const session = this.session;
|
|
105
|
+
NodeSession.assert(session);
|
|
106
|
+
|
|
104
107
|
const elements = TlvAttestation.encode({
|
|
105
108
|
declaration: certification.declaration,
|
|
106
109
|
attestationNonce: attestationNonce,
|
|
@@ -108,7 +111,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
108
111
|
});
|
|
109
112
|
return {
|
|
110
113
|
attestationElements: elements,
|
|
111
|
-
attestationSignature: await certification.sign(
|
|
114
|
+
attestationSignature: await certification.sign(session, elements),
|
|
112
115
|
};
|
|
113
116
|
}
|
|
114
117
|
|
|
@@ -117,7 +120,9 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
117
120
|
throw new StatusResponseError("Invalid csr nonce length", StatusCode.InvalidCommand);
|
|
118
121
|
}
|
|
119
122
|
|
|
120
|
-
|
|
123
|
+
const session = this.session;
|
|
124
|
+
NodeSession.assert(session);
|
|
125
|
+
if (isForUpdateNoc && session.isPase) {
|
|
121
126
|
throw new StatusResponseError(
|
|
122
127
|
"csrRequest for UpdateNoc received on a PASE session",
|
|
123
128
|
StatusCode.InvalidCommand,
|
|
@@ -140,7 +145,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
140
145
|
this.session.id,
|
|
141
146
|
);
|
|
142
147
|
const nocsrElements = TlvCertSigningRequest.encode({ certSigningRequest, csrNonce });
|
|
143
|
-
return { nocsrElements, attestationSignature: await certification.sign(
|
|
148
|
+
return { nocsrElements, attestationSignature: await certification.sign(session, nocsrElements) };
|
|
144
149
|
}
|
|
145
150
|
|
|
146
151
|
override async certificateChainRequest({ certificateType }: OperationalCredentials.CertificateChainRequest) {
|
|
@@ -264,12 +269,15 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
264
269
|
targets: null, // entire node
|
|
265
270
|
});
|
|
266
271
|
|
|
272
|
+
const session = this.session;
|
|
273
|
+
NodeSession.assert(session);
|
|
274
|
+
|
|
267
275
|
await failsafeContext.addFabric(fabric);
|
|
268
276
|
|
|
269
277
|
try {
|
|
270
|
-
if (
|
|
271
|
-
logger.debug(`Add Fabric ${fabric.fabricIndex} to PASE session ${
|
|
272
|
-
|
|
278
|
+
if (session.isPase) {
|
|
279
|
+
logger.debug(`Add Fabric ${fabric.fabricIndex} to PASE session ${session.name}`);
|
|
280
|
+
session.addAssociatedFabric(fabric);
|
|
273
281
|
}
|
|
274
282
|
|
|
275
283
|
// Update attributes
|
|
@@ -282,7 +290,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
282
290
|
}
|
|
283
291
|
} catch (e) {
|
|
284
292
|
// Fabric insertion into FabricManager is not currently transactional so we need to remove manually
|
|
285
|
-
await fabric.remove(
|
|
293
|
+
await fabric.remove(session.id);
|
|
286
294
|
throw e;
|
|
287
295
|
}
|
|
288
296
|
|
|
@@ -302,7 +310,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
302
310
|
}
|
|
303
311
|
|
|
304
312
|
override async updateNoc({ nocValue, icacValue }: OperationalCredentials.UpdateNocRequest) {
|
|
305
|
-
|
|
313
|
+
NodeSession.assert(this.session);
|
|
306
314
|
|
|
307
315
|
const timedOp = this.#failsafeContext;
|
|
308
316
|
|
package/src/endpoint/Endpoint.ts
CHANGED
|
@@ -124,7 +124,7 @@ export class Endpoint<T extends EndpointType = EndpointType.Empty> {
|
|
|
124
124
|
*/
|
|
125
125
|
ownerOfType<T extends EndpointType.Empty>(type: T): Endpoint<T> | undefined {
|
|
126
126
|
for (let endpoint: Endpoint | undefined = this; endpoint !== undefined; endpoint = endpoint.owner) {
|
|
127
|
-
if (endpoint.type.
|
|
127
|
+
if (endpoint.type.deviceType === type.deviceType) {
|
|
128
128
|
return endpoint as Endpoint<T>;
|
|
129
129
|
}
|
|
130
130
|
}
|
package/src/node/Node.ts
CHANGED
|
@@ -10,8 +10,8 @@ import { IndexBehavior } from "#behavior/system/index/IndexBehavior.js";
|
|
|
10
10
|
import { NetworkRuntime } from "#behavior/system/network/NetworkRuntime.js";
|
|
11
11
|
import { PartsBehavior } from "#behavior/system/parts/PartsBehavior.js";
|
|
12
12
|
import { Endpoint } from "#endpoint/Endpoint.js";
|
|
13
|
-
import { MutableEndpoint } from "#endpoint/index.js";
|
|
14
13
|
import { EndpointType } from "#endpoint/type/EndpointType.js";
|
|
14
|
+
import { MutableEndpoint } from "#endpoint/type/MutableEndpoint.js";
|
|
15
15
|
import {
|
|
16
16
|
Construction,
|
|
17
17
|
Diagnostic,
|
package/src/node/ServerNode.ts
CHANGED
|
@@ -12,7 +12,7 @@ import { NetworkServer } from "#behavior/system/network/NetworkServer.js";
|
|
|
12
12
|
import { ServerNetworkRuntime } from "#behavior/system/network/ServerNetworkRuntime.js";
|
|
13
13
|
import { ProductDescriptionServer } from "#behavior/system/product-description/ProductDescriptionServer.js";
|
|
14
14
|
import { SessionsBehavior } from "#behavior/system/sessions/SessionsBehavior.js";
|
|
15
|
-
import { SubscriptionBehavior } from "#behavior/system/subscription/
|
|
15
|
+
import { SubscriptionBehavior } from "#behavior/system/subscription/SubscriptionBehavior.js";
|
|
16
16
|
import { Endpoint } from "#endpoint/Endpoint.js";
|
|
17
17
|
import type { Environment } from "#general";
|
|
18
18
|
import { Construction, DiagnosticSource, Identity, MatterError, asyncNew, errorOf } from "#general";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { RemoteDescriptor } from "#behavior/system/commissioning/RemoteDescriptor.js";
|
|
8
|
-
import { ClientNode } from "#node/ClientNode.js";
|
|
8
|
+
import type { ClientNode } from "#node/ClientNode.js";
|
|
9
9
|
import { IdentityService } from "#node/server/IdentityService.js";
|
|
10
10
|
import type { ServerNode } from "#node/ServerNode.js";
|
|
11
11
|
import { OperationalPeer, PeerAddress, PeerAddressMap, PeerAddressStore } from "#protocol";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { NodeActivity } from "#behavior/context/NodeActivity.js";
|
|
8
|
-
import { OnlineContext } from "#behavior/
|
|
8
|
+
import { OnlineContext } from "#behavior/context/server/OnlineContext.js";
|
|
9
9
|
import { AccessControlServer } from "#behaviors/access-control";
|
|
10
10
|
import { AccessControl as AccessControlClusterType } from "#clusters/access-control";
|
|
11
11
|
import {
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
} from "#general";
|
|
21
21
|
import { GLOBAL_IDS, Specification } from "#model";
|
|
22
22
|
import {
|
|
23
|
-
assertSecureSession,
|
|
24
23
|
DataReport,
|
|
25
24
|
DataReportPayloadIterator,
|
|
26
25
|
ExchangeManager,
|
|
@@ -30,10 +29,10 @@ import {
|
|
|
30
29
|
Message,
|
|
31
30
|
MessageExchange,
|
|
32
31
|
MessageType,
|
|
32
|
+
NodeSession,
|
|
33
33
|
PeerAddress,
|
|
34
34
|
ProtocolHandler,
|
|
35
35
|
ReadRequest,
|
|
36
|
-
SecureSession,
|
|
37
36
|
SessionManager,
|
|
38
37
|
SessionType,
|
|
39
38
|
SubscribeRequest,
|
|
@@ -474,7 +473,7 @@ export class InteractionServer implements ProtocolHandler, InteractionRecipient
|
|
|
474
473
|
);
|
|
475
474
|
}
|
|
476
475
|
|
|
477
|
-
|
|
476
|
+
NodeSession.assert(exchange.session, "Subscriptions are only implemented on secure sessions");
|
|
478
477
|
const session = exchange.session;
|
|
479
478
|
const fabric = session.fabric;
|
|
480
479
|
|
|
@@ -606,7 +605,7 @@ export class InteractionServer implements ProtocolHandler, InteractionRecipient
|
|
|
606
605
|
isFabricFiltered,
|
|
607
606
|
}: SubscribeRequest,
|
|
608
607
|
messenger: InteractionServerMessenger,
|
|
609
|
-
session:
|
|
608
|
+
session: NodeSession,
|
|
610
609
|
exchange: MessageExchange,
|
|
611
610
|
message: Message,
|
|
612
611
|
) {
|
|
@@ -660,7 +659,7 @@ export class InteractionServer implements ProtocolHandler, InteractionRecipient
|
|
|
660
659
|
maxInterval,
|
|
661
660
|
sendInterval,
|
|
662
661
|
}: PeerSubscription,
|
|
663
|
-
session:
|
|
662
|
+
session: NodeSession,
|
|
664
663
|
) {
|
|
665
664
|
const exchange = this.#context.exchangeManager.initiateExchange(session.peerAddress, INTERACTION_PROTOCOL_ID);
|
|
666
665
|
const message = {} as Message;
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
import { OnlineContext } from "#behavior/context/server/OnlineContext.js";
|
|
8
8
|
import { Logger, MatterError, NetworkError, NoResponseTimeoutError, ObserverGroup, Time, Timer } from "#general";
|
|
9
9
|
import { Specification } from "#model";
|
|
10
|
-
import { ServerNode } from "#node/
|
|
11
|
-
import type { AttributeResponseFilter, Message, MessageExchange } from "#protocol";
|
|
10
|
+
import type { ServerNode } from "#node/ServerNode.js";
|
|
11
|
+
import type { AttributeResponseFilter, Message, MessageExchange, NodeSession } from "#protocol";
|
|
12
12
|
import {
|
|
13
13
|
AttributeReadResponse,
|
|
14
14
|
AttributeSubscriptionResponse,
|
|
@@ -19,7 +19,6 @@ import {
|
|
|
19
19
|
PeerAddress,
|
|
20
20
|
Read,
|
|
21
21
|
ReadResult,
|
|
22
|
-
SecureSession,
|
|
23
22
|
Subscription,
|
|
24
23
|
SubscriptionCriteria,
|
|
25
24
|
} from "#protocol";
|
|
@@ -95,7 +94,7 @@ export namespace ServerSubscriptionConfig {
|
|
|
95
94
|
* Interface between {@link ServerSubscription} and the local Matter environment.
|
|
96
95
|
*/
|
|
97
96
|
export interface ServerSubscriptionContext {
|
|
98
|
-
session:
|
|
97
|
+
session: NodeSession;
|
|
99
98
|
node: ServerNode;
|
|
100
99
|
initiateExchange(address: PeerAddress, protocolId: number): MessageExchange;
|
|
101
100
|
}
|