diff options
author | Todd Malsbary <todd.malsbary@intel.com> | 2017-05-17 11:56:13 -0700 |
---|---|---|
committer | Dan Mihai <Daniel.Mihai@microsoft.com> | 2017-05-20 00:56:13 +0000 |
commit | 7511dbf830740a91564042335450934c0278bc5e (patch) | |
tree | dba5de6484958b4d2781430ca378ff681dbc95f0 /resource/csdk/stack | |
parent | db2361bad1e029db5b702691dc267b374963ec41 (diff) | |
download | iotivity-7511dbf830740a91564042335450934c0278bc5e.tar.gz iotivity-7511dbf830740a91564042335450934c0278bc5e.tar.bz2 iotivity-7511dbf830740a91564042335450934c0278bc5e.zip |
IOT-2258: Allow secure and nonsecure endpoints with OCCreateResource.
Added new property flag OC_NONSECURE. To specify both secure and
nonsecure endpoints use OC_SECURE | OC_NONSECURE. The behavior when
neither flag is specified is OC_NONSECURE, the same as before this
change.
Bug: https://jira.iotivity.org/browse/IOT-2258
Change-Id: I12ffdff70a83455eff46d4464e234963063c4f35
Signed-off-by: Todd Malsbary <todd.malsbary@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/19995
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Dan Mihai <Daniel.Mihai@microsoft.com>
Diffstat (limited to 'resource/csdk/stack')
-rw-r--r-- | resource/csdk/stack/src/ocpayload.c | 6 | ||||
-rw-r--r-- | resource/csdk/stack/src/ocstack.c | 8 | ||||
-rw-r--r-- | resource/csdk/stack/test/stacktests.cpp | 134 |
3 files changed, 126 insertions, 22 deletions
diff --git a/resource/csdk/stack/src/ocpayload.c b/resource/csdk/stack/src/ocpayload.c index eaf597380..86d650b7f 100644 --- a/resource/csdk/stack/src/ocpayload.c +++ b/resource/csdk/stack/src/ocpayload.c @@ -1818,7 +1818,8 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t secureP return NULL; } - bool isSecure = res->resourceProperties & OC_FLAG_SECURE; + bool includeSecure = res->resourceProperties & OC_SECURE; + bool includeNonsecure = res->resourceProperties & OC_NONSECURE; OCEndpointPayload *selfEp = NULL; if (networkInfo && infoSize && devAddr) { @@ -1842,8 +1843,9 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t secureP return NULL; } + bool isSecure = (info->flags & OC_FLAG_SECURE); if (((res->endpointType) & matchedTps) && - (isSecure == (bool)(info->flags & OC_FLAG_SECURE))) + ((isSecure && includeSecure) || (!isSecure && includeNonsecure))) { // create payload OCEndpointPayload* tmpNode = (OCEndpointPayload*) diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 29248dd13..5ee4991b7 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -4087,7 +4087,7 @@ OCStackResult OCCreateResourceWithEp(OCResourceHandle *handle, #endif // Make sure resourceProperties bitmask has allowed properties specified if (resourceProperties - > (OC_ACTIVE | OC_DISCOVERABLE | OC_OBSERVABLE | OC_SLOW | OC_SECURE | + > (OC_ACTIVE | OC_DISCOVERABLE | OC_OBSERVABLE | OC_SLOW | OC_NONSECURE | OC_SECURE | OC_EXPLICIT_DISCOVERABLE #ifdef MQ_PUBLISHER | OC_MQ_PUBLISHER @@ -4165,6 +4165,12 @@ OCStackResult OCCreateResourceWithEp(OCResourceHandle *handle, goto exit; } + // Set resource to nonsecure if caller did not specify + if ((resourceProperties & OC_MASK_RESOURCE_SECURE) == 0) + { + resourceProperties |= OC_NONSECURE; + } + // Set properties. Set OC_ACTIVE pointer->resourceProperties = (OCResourceProperty) (resourceProperties | OC_ACTIVE); diff --git a/resource/csdk/stack/test/stacktests.cpp b/resource/csdk/stack/test/stacktests.cpp index 4bee8efa7..33faf9ea7 100644 --- a/resource/csdk/stack/test/stacktests.cpp +++ b/resource/csdk/stack/test/stacktests.cpp @@ -1331,6 +1331,7 @@ TEST(StackResource, GetResourceProperties) OIC_LOG(INFO, TAG, "Starting GetResourceProperties test"); InitStack(OC_SERVER); + uint8_t props = OC_DISCOVERABLE|OC_OBSERVABLE; OCResourceHandle handle; EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.led", @@ -1338,13 +1339,9 @@ TEST(StackResource, GetResourceProperties) "/a/led", 0, NULL, - OC_DISCOVERABLE|OC_OBSERVABLE)); + props)); -#ifdef MQ_PUBLISHER - EXPECT_EQ(OC_ACTIVE|OC_DISCOVERABLE|OC_OBSERVABLE|OC_MQ_PUBLISHER, OCGetResourceProperties(handle)); -#else - EXPECT_EQ(OC_ACTIVE|OC_DISCOVERABLE|OC_OBSERVABLE, OCGetResourceProperties(handle)); -#endif + EXPECT_EQ(props, OCGetResourceProperties(handle) & props); EXPECT_EQ(OC_STACK_OK, OCDeleteResource(handle)); EXPECT_EQ(OC_STACK_OK, OCStop()); @@ -1365,12 +1362,9 @@ TEST(StackResource, SetResourceProperties) NULL, 0)); - EXPECT_EQ(OC_STACK_OK, OCSetResourceProperties(handle, OC_DISCOVERABLE|OC_OBSERVABLE)); -#ifdef MQ_PUBLISHER - EXPECT_EQ(OC_ACTIVE|OC_DISCOVERABLE|OC_OBSERVABLE|OC_MQ_PUBLISHER, OCGetResourceProperties(handle)); -#else - EXPECT_EQ(OC_ACTIVE|OC_DISCOVERABLE|OC_OBSERVABLE, OCGetResourceProperties(handle)); -#endif + uint8_t props = OC_DISCOVERABLE|OC_OBSERVABLE; + EXPECT_EQ(OC_STACK_OK, OCSetResourceProperties(handle, props)); + EXPECT_EQ(props, OCGetResourceProperties(handle) & props); EXPECT_EQ(OC_STACK_OK, OCDeleteResource(handle)); @@ -1383,6 +1377,7 @@ TEST(StackResource, ClearResourceProperties) OIC_LOG(INFO, TAG, "Starting ClearResourceProperties test"); InitStack(OC_SERVER); + uint8_t props = OC_DISCOVERABLE|OC_OBSERVABLE; OCResourceHandle handle; EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.led", @@ -1390,14 +1385,10 @@ TEST(StackResource, ClearResourceProperties) "/a/led", 0, NULL, - OC_DISCOVERABLE|OC_OBSERVABLE)); + props)); - EXPECT_EQ(OC_STACK_OK, OCClearResourceProperties(handle, OC_DISCOVERABLE|OC_OBSERVABLE)); -#ifdef MQ_PUBLISHER - EXPECT_EQ(OC_ACTIVE|OC_MQ_PUBLISHER, OCGetResourceProperties(handle)); -#else - EXPECT_EQ(OC_ACTIVE, OCGetResourceProperties(handle)); -#endif + EXPECT_EQ(OC_STACK_OK, OCClearResourceProperties(handle, props)); + EXPECT_EQ(0, OCGetResourceProperties(handle) & props); EXPECT_EQ(OC_STACK_OK, OCDeleteResource(handle)); @@ -2817,6 +2808,111 @@ TEST_F(OCDiscoverTests, DISABLED_DiscoverResourceWithInvalidQueries) EXPECT_EQ(OC_STACK_OK, discoverUnicastRTEmptyCB.Wait(10)); } +class OCEndpointTests : public testing::Test +{ + protected: + virtual void SetUp() + { + OCPersistentStorage ps = { fopen, fread, fwrite, fclose, unlink }; + EXPECT_EQ(OC_STACK_OK, OCRegisterPersistentStorageHandler(&ps)); + EXPECT_EQ(OC_STACK_OK, OCInit(NULL, 0, OC_CLIENT_SERVER)); + } + + virtual void TearDown() + { + OCStop(); + } +}; + +static OCStackApplicationResult SecureAndNonsecureEndpoints(void *ctx, OCDoHandle handle, + OCClientResponse *response) +{ + OC_UNUSED(ctx); + OC_UNUSED(handle); + EXPECT_EQ(OC_STACK_OK, response->result); + EXPECT_TRUE(NULL != response->payload); + if (NULL != response->payload) + { + EXPECT_EQ(PAYLOAD_TYPE_DISCOVERY, response->payload->type); + OCDiscoveryPayload *payload = (OCDiscoveryPayload *)response->payload; + EXPECT_TRUE(NULL != payload->sid); + for (OCResourcePayload *resource = payload->resources; resource; resource = resource->next) + { + if (!strcmp("/a/default", resource->uri)) + { + for (OCEndpointPayload *ep = resource->eps; ep; ep = ep->next) + { + EXPECT_EQ(0, OC_FLAG_SECURE & ep->family); + } + } + else if (!strcmp("/a/secure", resource->uri)) + { + for (OCEndpointPayload *ep = resource->eps; ep; ep = ep->next) + { +#ifdef __WITH_DTLS__ + EXPECT_EQ(OC_FLAG_SECURE, OC_FLAG_SECURE & ep->family); +#else + EXPECT_EQ(0, OC_FLAG_SECURE & ep->family); +#endif + } + } + else if (!strcmp("/a/nonsecure", resource->uri)) + { + for (OCEndpointPayload *ep = resource->eps; ep; ep = ep->next) + { + EXPECT_EQ(0, OC_FLAG_SECURE & ep->family); + } + } + else if (!strcmp("/a/both", resource->uri)) + { + bool hasSecure = false; + bool hasNonsecure = false; + for (OCEndpointPayload *ep = resource->eps; ep; ep = ep->next) + { + if (OC_FLAG_SECURE & ep->family) + { + hasSecure = true; + } + else + { + hasNonsecure = true; + } + } +#ifdef __WITH_DTLS__ + EXPECT_TRUE(hasSecure); +#else + EXPECT_FALSE(hasSecure); +#endif + EXPECT_TRUE(hasNonsecure); + } + } + } + return OC_STACK_DELETE_TRANSACTION; +} + +// Disabled until unit tests can run with SECURED=1 builds +TEST_F(OCEndpointTests, DISABLED_SecureAndNonsecureEndpoints) +{ + itst::DeadmanTimer killSwitch(LONG_TEST_TIMEOUT); + + OCResourceHandle handle; + handle = OCGetResourceHandleAtUri(OC_RSRVD_WELL_KNOWN_URI); + EXPECT_EQ(OC_STACK_OK, OCSetResourceProperties(handle, OC_DISCOVERABLE | OC_OBSERVABLE)); + EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light", "oic.if.baseline", "/a/default", + entityHandler, NULL, OC_DISCOVERABLE)); + EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light", "oic.if.baseline", "/a/secure", + entityHandler, NULL, OC_DISCOVERABLE | OC_SECURE)); + EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light", "oic.if.baseline", "/a/nonsecure", + entityHandler, NULL, OC_DISCOVERABLE | OC_NONSECURE)); + EXPECT_EQ(OC_STACK_OK, OCCreateResource(&handle, "core.light", "oic.if.baseline", "/a/both", + entityHandler, NULL, OC_DISCOVERABLE | OC_SECURE | OC_NONSECURE)); + + itst::Callback secureAndNonSecureEndpointsCB(&SecureAndNonsecureEndpoints); + EXPECT_EQ(OC_STACK_OK, OCDoResource(NULL, OC_REST_DISCOVER, "/oic/res", NULL, + 0, CT_DEFAULT, OC_HIGH_QOS, secureAndNonSecureEndpointsCB, NULL, 0)); + EXPECT_EQ(OC_STACK_OK, secureAndNonSecureEndpointsCB.Wait(100)); +} + #ifdef IP_ADAPTER TEST(StackZoneId, getZoneId) { |