summaryrefslogtreecommitdiff
path: root/resource/csdk/stack
diff options
context:
space:
mode:
authorTodd Malsbary <todd.malsbary@intel.com>2017-05-17 11:56:13 -0700
committerDan Mihai <Daniel.Mihai@microsoft.com>2017-05-20 00:56:13 +0000
commit7511dbf830740a91564042335450934c0278bc5e (patch)
treedba5de6484958b4d2781430ca378ff681dbc95f0 /resource/csdk/stack
parentdb2361bad1e029db5b702691dc267b374963ec41 (diff)
downloadiotivity-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.c6
-rw-r--r--resource/csdk/stack/src/ocstack.c8
-rw-r--r--resource/csdk/stack/test/stacktests.cpp134
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)
{