1
1
/* *
2
2
*
3
- * Copyright (c) 2021 Project CHIP Authors
3
+ * Copyright (c) 2021-2024 Project CHIP Authors
4
4
*
5
5
* Licensed under the Apache License, Version 2.0 (the "License");
6
6
* you may not use this file except in compliance with the License.
27
27
#include < app/CommandHandler.h>
28
28
#include < app/ConcreteCommandPath.h>
29
29
#include < app/server/CommissioningWindowManager.h>
30
+ #include < app/server/EnhancedSetupFlowProvider.h>
30
31
#include < app/server/Server.h>
31
32
#include < app/util/attribute-storage.h>
32
33
#include < lib/support/Span.h>
33
34
#include < lib/support/logging/CHIPLogging.h>
34
35
#include < platform/CHIPDeviceConfig.h>
35
36
#include < platform/ConfigurationManager.h>
36
37
#include < platform/DeviceControlServer.h>
38
+ #include < system/SystemConfig.h>
37
39
#include < tracing/macros.h>
38
40
39
41
using namespace chip ;
@@ -57,6 +59,55 @@ using Transport::Session;
57
59
58
60
namespace {
59
61
62
+ template <typename T, typename K>
63
+ static CHIP_ERROR ReadInternal (const T * const provider, CHIP_ERROR (T::*getter)(K &) const , AttributeValueEncoder & aEncoder)
64
+ {
65
+ K data;
66
+
67
+ if (nullptr == provider)
68
+ {
69
+ return CHIP_ERROR_PERSISTED_STORAGE_FAILED;
70
+ }
71
+
72
+ CHIP_ERROR err = (provider->*getter)(data);
73
+ if (err == CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE)
74
+ {
75
+ data = 0 ;
76
+ }
77
+ else if (err != CHIP_NO_ERROR)
78
+ {
79
+ return err;
80
+ }
81
+
82
+ return aEncoder.Encode (data);
83
+ }
84
+
85
+ template <typename Provider, typename T>
86
+ static CHIP_ERROR ReadInternal (Provider * provider, CHIP_ERROR (Provider::*getter)(T &), AttributeValueEncoder & aEncoder)
87
+ {
88
+ const Provider * constProvider = provider;
89
+ CHIP_ERROR (Provider::*constGetter)(T &) const = reinterpret_cast <CHIP_ERROR (Provider::*const )(T &) const >(getter);
90
+ return ReadInternal (constProvider, constGetter, aEncoder);
91
+ }
92
+
93
+ template <typename T, typename K>
94
+ static CHIP_ERROR ReadInternal (const T & provider, CHIP_ERROR (T::*getter)(K &) const , AttributeValueEncoder & aEncoder)
95
+ {
96
+ return ReadInternal (&provider, getter, aEncoder);
97
+ }
98
+
99
+ template <typename T, typename K>
100
+ static CHIP_ERROR ReadInternal (T & provider, CHIP_ERROR (T::*getter)(K &), AttributeValueEncoder & aEncoder)
101
+ {
102
+ return ReadInternal (&provider, getter, aEncoder);
103
+ }
104
+
105
+ template <typename ... Args>
106
+ static CHIP_ERROR ReadIfSupported (Args &&... args)
107
+ {
108
+ return ReadInternal (std::forward<Args>(args)...);
109
+ }
110
+
60
111
class GeneralCommissioningAttrAccess : public AttributeAccessInterface
61
112
{
62
113
public:
@@ -66,7 +117,6 @@ class GeneralCommissioningAttrAccess : public AttributeAccessInterface
66
117
CHIP_ERROR Read (const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override ;
67
118
68
119
private:
69
- CHIP_ERROR ReadIfSupported (CHIP_ERROR (ConfigurationManager::*getter)(uint8_t &), AttributeValueEncoder & aEncoder);
70
120
CHIP_ERROR ReadBasicCommissioningInfo (AttributeValueEncoder & aEncoder);
71
121
CHIP_ERROR ReadSupportsConcurrentConnection (AttributeValueEncoder & aEncoder);
72
122
};
@@ -84,39 +134,43 @@ CHIP_ERROR GeneralCommissioningAttrAccess::Read(const ConcreteReadAttributePath
84
134
switch (aPath.mAttributeId )
85
135
{
86
136
case RegulatoryConfig::Id: {
87
- return ReadIfSupported (&ConfigurationManager::GetRegulatoryLocation, aEncoder);
137
+ return ReadIfSupported (DeviceLayer::ConfigurationMgr (), &ConfigurationManager::GetRegulatoryLocation, aEncoder);
88
138
}
89
139
case LocationCapability::Id: {
90
- return ReadIfSupported (&ConfigurationManager::GetLocationCapability, aEncoder);
140
+ return ReadIfSupported (DeviceLayer::ConfigurationMgr (), &ConfigurationManager::GetLocationCapability, aEncoder);
91
141
}
92
142
case BasicCommissioningInfo::Id: {
93
143
return ReadBasicCommissioningInfo (aEncoder);
94
144
}
95
145
case SupportsConcurrentConnection::Id: {
96
146
return ReadSupportsConcurrentConnection (aEncoder);
97
147
}
98
- default : {
99
- break ;
148
+ #if defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS && defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS_VERSION
149
+ case TCAcceptedVersion::Id: {
150
+ auto provider = Server::GetInstance ().GetEnhancedSetupFlowProvider ();
151
+ auto getter = &EnhancedSetupFlowProvider::GetTermsAndConditionsAcceptedAcknowledgementsVersion;
152
+ return ReadIfSupported (provider, getter, aEncoder);
100
153
}
154
+ case TCMinRequiredVersion::Id: {
155
+ auto provider = Server::GetInstance ().GetEnhancedSetupFlowProvider ();
156
+ auto getter = &EnhancedSetupFlowProvider::GetTermsAndConditionsRequiredAcknowledgementsVersion;
157
+ return ReadIfSupported (provider, getter, aEncoder);
101
158
}
102
- return CHIP_NO_ERROR;
103
- }
104
-
105
- CHIP_ERROR GeneralCommissioningAttrAccess::ReadIfSupported (CHIP_ERROR (ConfigurationManager::*getter)(uint8_t &),
106
- AttributeValueEncoder & aEncoder)
107
- {
108
- uint8_t data;
109
- CHIP_ERROR err = (DeviceLayer::ConfigurationMgr ().*getter)(data);
110
- if (err == CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE)
111
- {
112
- data = 0 ;
159
+ case TCAcknowledgements::Id: {
160
+ auto provider = Server::GetInstance ().GetEnhancedSetupFlowProvider ();
161
+ auto getter = &EnhancedSetupFlowProvider::GetTermsAndConditionsAcceptedAcknowledgements;
162
+ return ReadIfSupported (provider, getter, aEncoder);
113
163
}
114
- else if (err != CHIP_NO_ERROR)
115
- {
116
- return err;
164
+ case TCAcknowledgementsRequired::Id: {
165
+ auto provider = Server::GetInstance ().GetEnhancedSetupFlowProvider ();
166
+ auto getter = &EnhancedSetupFlowProvider::GetTermsAndConditionsRequiredAcknowledgements;
167
+ return ReadIfSupported (provider, getter, aEncoder);
117
168
}
118
-
119
- return aEncoder.Encode (data);
169
+ #endif
170
+ default :
171
+ break ;
172
+ }
173
+ return CHIP_NO_ERROR;
120
174
}
121
175
122
176
CHIP_ERROR GeneralCommissioningAttrAccess::ReadBasicCommissioningInfo (AttributeValueEncoder & aEncoder)
@@ -214,9 +268,12 @@ bool emberAfGeneralCommissioningClusterCommissioningCompleteCallback(
214
268
{
215
269
MATTER_TRACE_SCOPE (" CommissioningComplete" , " GeneralCommissioning" );
216
270
217
- DeviceControlServer * devCtrl = &DeviceLayer::DeviceControlServer::DeviceControlSvr ();
218
- auto & failSafe = Server::GetInstance ().GetFailSafeContext ();
219
- auto & fabricTable = Server::GetInstance ().GetFabricTable ();
271
+ #if defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS && defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS_VERSION
272
+ EnhancedSetupFlowProvider * enhancedSetupFlowProvider = Server::GetInstance ().GetEnhancedSetupFlowProvider ();
273
+ #endif
274
+ DeviceControlServer * const devCtrl = &DeviceLayer::DeviceControlServer::DeviceControlSvr ();
275
+ auto & failSafe = Server::GetInstance ().GetFailSafeContext ();
276
+ auto & fabricTable = Server::GetInstance ().GetFabricTable ();
220
277
221
278
ChipLogProgress (FailSafe, " GeneralCommissioning: Received CommissioningComplete" );
222
279
@@ -239,34 +296,64 @@ bool emberAfGeneralCommissioningClusterCommissioningCompleteCallback(
239
296
}
240
297
else
241
298
{
242
- if (failSafe.NocCommandHasBeenInvoked ())
299
+ CHIP_ERROR err;
300
+
301
+ #if defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS && defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS_VERSION
302
+
303
+ uint16_t termsAndConditionsAcceptedAcknowledgements;
304
+ bool hasTermsAndConditionsRequiredAcknowledgementsBeenAccepted;
305
+ bool hasTermsAndConditionsRequiredAcknowledgementsVersionBeenAccepted;
306
+
307
+ err = enhancedSetupFlowProvider->GetTermsAndConditionsAcceptedAcknowledgements (
308
+ termsAndConditionsAcceptedAcknowledgements);
309
+ CheckSuccess (err, Failure);
310
+
311
+ err = enhancedSetupFlowProvider->HasTermsAndConditionsRequiredAcknowledgementsBeenAccepted (
312
+ hasTermsAndConditionsRequiredAcknowledgementsBeenAccepted);
313
+ CheckSuccess (err, Failure);
314
+
315
+ err = enhancedSetupFlowProvider->HasTermsAndConditionsRequiredAcknowledgementsVersionBeenAccepted (
316
+ hasTermsAndConditionsRequiredAcknowledgementsVersionBeenAccepted);
317
+ CheckSuccess (err, Failure);
318
+
319
+ if (!hasTermsAndConditionsRequiredAcknowledgementsBeenAccepted)
243
320
{
244
- CHIP_ERROR err = fabricTable.CommitPendingFabricData ();
245
- if (err != CHIP_NO_ERROR)
246
- {
247
- // No need to revert on error: CommitPendingFabricData always reverts if not fully successful.
248
- ChipLogError (FailSafe, " GeneralCommissioning: Failed to commit pending fabric data: %" CHIP_ERROR_FORMAT,
249
- err.Format ());
250
- }
251
- else
321
+ ChipLogError (AppServer, " Required terms and conditions have not been accepted" );
322
+ Breadcrumb::Set (commandPath.mEndpointId , 0 );
323
+ response.errorCode = (0 == termsAndConditionsAcceptedAcknowledgements)
324
+ ? CommissioningErrorEnum::kTCAcknowledgementsNotReceived
325
+ : CommissioningErrorEnum::kRequiredTCNotAccepted ;
326
+ }
327
+
328
+ else if (!hasTermsAndConditionsRequiredAcknowledgementsVersionBeenAccepted)
329
+ {
330
+ ChipLogError (AppServer, " Minimum terms and conditions version has not been accepted" );
331
+ Breadcrumb::Set (commandPath.mEndpointId , 0 );
332
+ response.errorCode = CommissioningErrorEnum::kTCMinVersionNotMet ;
333
+ }
334
+
335
+ else
336
+ #endif
337
+ {
338
+ if (failSafe.NocCommandHasBeenInvoked ())
252
339
{
340
+ err = fabricTable.CommitPendingFabricData ();
341
+ CheckSuccess (err, Failure);
253
342
ChipLogProgress (FailSafe, " GeneralCommissioning: Successfully commited pending fabric data" );
254
343
}
255
- CheckSuccess (err, Failure);
256
- }
257
344
258
- /*
259
- * Pass fabric of commissioner to DeviceControlSvr.
260
- * This allows device to send messages back to commissioner.
261
- * Once bindings are implemented, this may no longer be needed.
262
- */
263
- failSafe.DisarmFailSafe ();
264
- CheckSuccess (
265
- devCtrl->PostCommissioningCompleteEvent (handle->AsSecureSession ()->GetPeerNodeId (), handle->GetFabricIndex ()),
266
- Failure);
345
+ /*
346
+ * Pass fabric of commissioner to DeviceControlSvr.
347
+ * This allows device to send messages back to commissioner.
348
+ * Once bindings are implemented, this may no longer be needed.
349
+ */
350
+ failSafe.DisarmFailSafe ();
351
+ err = devCtrl->PostCommissioningCompleteEvent (handle->AsSecureSession ()->GetPeerNodeId (), handle->GetFabricIndex ());
352
+ CheckSuccess (err, Failure);
267
353
268
- Breadcrumb::Set (commandPath.mEndpointId , 0 );
269
- response.errorCode = CommissioningErrorEnum::kOk ;
354
+ Breadcrumb::Set (commandPath.mEndpointId , 0 );
355
+ response.errorCode = CommissioningErrorEnum::kOk ;
356
+ }
270
357
}
271
358
}
272
359
@@ -328,13 +415,37 @@ bool emberAfGeneralCommissioningClusterSetRegulatoryConfigCallback(app::CommandH
328
415
return true ;
329
416
}
330
417
418
+ bool emberAfGeneralCommissioningClusterSetTCAcknowledgementsCallback (
419
+ chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
420
+ const chip::app::Clusters::GeneralCommissioning::Commands::SetTCAcknowledgements::DecodableType & commandData)
421
+ {
422
+ #if defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS && defined CHIP_CONFIG_TC_REQUIRED_ACKNOWLEDGEMENTS_VERSION
423
+ MATTER_TRACE_SCOPE (" SetTCAcknowledgements" , " GeneralCommissioning" );
424
+ Commands::SetTCAcknowledgementsResponse::Type response;
425
+ EnhancedSetupFlowProvider * const enhancedSetupFlowProvider = Server::GetInstance ().GetEnhancedSetupFlowProvider ();
426
+ uint16_t acknowledgements = commandData.TCUserResponse ;
427
+ uint16_t acknowledgementsVersion = commandData.TCVersion ;
428
+ CheckSuccess (enhancedSetupFlowProvider->SetTermsAndConditionsAcceptance (acknowledgements, acknowledgementsVersion), Failure);
429
+ response.errorCode = CommissioningErrorEnum::kOk ;
430
+
431
+ commandObj->AddResponse (commandPath, response);
432
+ #endif
433
+ return true ;
434
+ }
435
+
331
436
namespace {
332
437
void OnPlatformEventHandler (const DeviceLayer::ChipDeviceEvent * event, intptr_t arg)
333
438
{
334
- if (event->Type == DeviceLayer::DeviceEventType:: kFailSafeTimerExpired )
439
+ switch (event->Type )
335
440
{
441
+ case DeviceLayer::DeviceEventType::kFailSafeTimerExpired : {
336
442
// Spec says to reset Breadcrumb attribute to 0.
337
443
Breadcrumb::Set (0 , 0 );
444
+ break ;
445
+ }
446
+ default : {
447
+ break ;
448
+ }
338
449
}
339
450
}
340
451
0 commit comments