From 32af9585f4752488ec253321c0305824ee4b64a9 Mon Sep 17 00:00:00 2001 From: Sachin Agrawal Date: Wed, 15 Jul 2015 22:28:30 -0700 Subject: [PATCH] Added new OCStack Error Code for Unauthorized Req (IOT-609) A Server can deny a REST request from a Client if 'Access Control List' does not authorize the request. Server returns CoAP 401 error code to Client originating the request. RI layer at client incorrectly translates it to OC_STACK_ERROR which does not provide specific failure reason to Client Application. Change-Id: I127060d186a021c676c36bc6148e264bdcb60fde Signed-off-by: Sachin Agrawal Reviewed-on: https://gerrit.iotivity.org/gerrit/1684 Tested-by: jenkins-iotivity Reviewed-by: Sakthivel Samidurai Reviewed-by: Erich Keane --- resource/csdk/stack/include/octypes.h | 1 + resource/csdk/stack/samples/linux/SimpleClientServer/common.cpp | 2 ++ resource/csdk/stack/samples/linux/secure/common.cpp | 2 ++ resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp | 1 + resource/csdk/stack/src/ocstack.c | 6 ++++++ resource/include/StringConstants.h | 1 + resource/src/OCException.cpp | 2 ++ resource/unittests/OCExceptionTest.cpp | 2 ++ 8 files changed, 17 insertions(+) diff --git a/resource/csdk/stack/include/octypes.h b/resource/csdk/stack/include/octypes.h index cd4c13b..3ff3933 100644 --- a/resource/csdk/stack/include/octypes.h +++ b/resource/csdk/stack/include/octypes.h @@ -373,6 +373,7 @@ typedef enum OC_STACK_INVALID_REQUEST_HANDLE, OC_STACK_INVALID_DEVICE_INFO, OC_STACK_INVALID_JSON, + OC_STACK_UNAUTHORIZED_REQ, /**< Request is not authorized by Resource Server. */ /* NOTE: Insert all new error codes here!*/ #ifdef WITH_PRESENCE OC_STACK_PRESENCE_STOPPED = 128, diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/common.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/common.cpp index 0ea86ae..3ebf005 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/common.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/common.cpp @@ -60,6 +60,8 @@ const char *getResult(OCStackResult result) return "OC_STACK_SLOW_RESOURCE"; case OC_STACK_NO_OBSERVERS: return "OC_STACK_NO_OBSERVERS"; + case OC_STACK_UNAUTHORIZED_REQ: + return "OC_STACK_UNAUTHORIZED_REQ"; #ifdef WITH_PRESENCE case OC_STACK_PRESENCE_STOPPED: return "OC_STACK_PRESENCE_STOPPED"; diff --git a/resource/csdk/stack/samples/linux/secure/common.cpp b/resource/csdk/stack/samples/linux/secure/common.cpp index 8137da0..6eb7521 100644 --- a/resource/csdk/stack/samples/linux/secure/common.cpp +++ b/resource/csdk/stack/samples/linux/secure/common.cpp @@ -64,6 +64,8 @@ const char *getResult(OCStackResult result) { return "OC_STACK_SLOW_RESOURCE"; case OC_STACK_NO_OBSERVERS: return "OC_STACK_NO_OBSERVERS"; + case OC_STACK_UNAUTHORIZED_REQ: + return "OC_STACK_UNAUTHORIZED_REQ"; #ifdef WITH_PRESENCE case OC_STACK_PRESENCE_STOPPED: return "OC_STACK_PRESENCE_STOPPED"; diff --git a/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp b/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp index 1cde32b..92dbfdf 100644 --- a/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp +++ b/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp @@ -122,6 +122,7 @@ OCStackApplicationResult putReqCB(void* ctx, OCDoHandle handle, OCClientResponse if(clientResponse) { + OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); OC_LOG_PAYLOAD(INFO, TAG, clientResponse->payload); OC_LOG(INFO, TAG, PCF("=============> Put Response")); } diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 0714b53..ab31608 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -563,6 +563,9 @@ OCStackResult CAToOCStackResult(CAResponseResult_t caCode) case CA_BAD_REQ: ret = OC_STACK_INVALID_QUERY; break; + case CA_UNAUTHORIZED_REQ: + ret = OC_STACK_UNAUTHORIZED_REQ; + break; case CA_BAD_OPT: ret = OC_STACK_INVALID_OPTION; break; @@ -605,6 +608,9 @@ CAResponseResult_t OCToCAStackResult(OCStackResult ocCode) case OC_STACK_COMM_ERROR: ret = CA_RETRANSMIT_TIMEOUT; break; + case OC_STACK_UNAUTHORIZED_REQ: + ret = CA_UNAUTHORIZED_REQ; + break; default: break; } diff --git a/resource/include/StringConstants.h b/resource/include/StringConstants.h index 3c1588b..b7b0a62 100644 --- a/resource/include/StringConstants.h +++ b/resource/include/StringConstants.h @@ -104,6 +104,7 @@ namespace OC static const char INVALID_JSON_TYPE_TAG[] = "Invalid JSON Type Tag"; static const char INVALID_ATTRIBUTE[] = "Invalid Attribute: "; static const char INVALID_DEVICE_INFO[] = "Invalid Device Information"; + static const char UNAUTHORIZED_REQUEST[] = "Unauthorized Request"; } diff --git a/resource/src/OCException.cpp b/resource/src/OCException.cpp index af90961..76893f1 100644 --- a/resource/src/OCException.cpp +++ b/resource/src/OCException.cpp @@ -95,6 +95,8 @@ std::string OC::OCException::reason(const OCStackResult sr) return OC::Exception::INVALID_DEVICE_INFO; case OC_STACK_INVALID_JSON: return OC::Exception::INVALID_REPRESENTATION; + case OC_STACK_UNAUTHORIZED_REQ: + return OC::Exception::UNAUTHORIZED_REQUEST; } return OC::Exception::UNKNOWN_ERROR; diff --git a/resource/unittests/OCExceptionTest.cpp b/resource/unittests/OCExceptionTest.cpp index 7ab265c..0c71f02 100644 --- a/resource/unittests/OCExceptionTest.cpp +++ b/resource/unittests/OCExceptionTest.cpp @@ -63,6 +63,7 @@ namespace OC OC_STACK_INVALID_REQUEST_HANDLE, OC_STACK_INVALID_DEVICE_INFO, OC_STACK_INVALID_JSON, + OC_STACK_UNAUTHORIZED_REQ, OC_STACK_PRESENCE_STOPPED, OC_STACK_PRESENCE_TIMEOUT, OC_STACK_PRESENCE_DO_NOT_HANDLE, @@ -101,6 +102,7 @@ namespace OC OC::Exception::INVALID_REQUEST_HANDLE, OC::Exception::INVALID_DEVICE_INFO, OC::Exception::INVALID_REPRESENTATION, + OC::Exception::UNAUTHORIZED_REQUEST, OC::Exception::PRESENCE_STOPPED, OC::Exception::PRESENCE_TIMEOUT, OC::Exception::PRESENCE_NOT_HANDLED, -- 2.7.4