Add callback to close a PIN display.
authorChul Lee <chuls.lee@samsung.com>
Tue, 14 Feb 2017 10:50:31 +0000 (19:50 +0900)
committerKevin Kane <kkane@microsoft.com>
Thu, 2 Mar 2017 22:45:29 +0000 (22:45 +0000)
Change-Id: Ifad924b7d700d03af43997dbfdd604b72bd09cc5
Signed-off-by: Chul Lee <chuls.lee@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/17267
Reviewed-by: Kevin Kane <kkane@microsoft.com>
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
resource/csdk/security/include/pinoxmcommon.h
resource/csdk/security/provisioning/sample/sampleserver_randompin.cpp
resource/csdk/security/src/doxmresource.c
resource/csdk/security/src/oxmpincommon.c

index a688176..23e22e6 100644 (file)
@@ -59,6 +59,11 @@ typedef void (*GeneratePinCallback)(char* pinData, size_t pinSize);
 typedef void(*DisplayPinCallbackWithContext)(char* pinData, size_t pinSize, void* context);
 
 /**
+ * Function pointer to close the displied PIN.
+ */
+typedef void (*ClosePinDisplayCallback)(void);
+
+/**
  * Function pointer to input pin code.
  */
 typedef void (*InputPinCallback)(char* pinBuf, size_t bufSize);
@@ -105,12 +110,20 @@ void SetInputPinCB(InputPinCallback pinCB);
  * @param context     context to return in the callback.
  *
  * @return OC_STACK_OK in case of success or other value in case of error.
- *         OC_STACK_INVALID_PARAM if pinCB is invalid. 
+ *         OC_STACK_INVALID_PARAM if pinCB is invalid.
  *         OC_STACK_DUPLICATE_REQUEST if an input pin callback has already been set.
  */
 OCStackResult SetInputPinWithContextCB(InputPinCallbackWithContext inputPinCB, void* context);
 
 /**
+ * Function to set the close PIN callback
+ * This callback will be invoked when PIN based OTM is finished.
+ *
+ * @param closeCB implementation of close PIN callback.
+ */
+void SetClosePinDisplayCB(ClosePinDisplayCallback closeCB);
+
+/**
  * Function to unset the input PIN callback.
  * NOTE : Do not call this function while PIN based ownership transfer is in progress.
  *
@@ -141,6 +154,12 @@ void UnsetGeneratePinCB();
 void UnsetDisplayPinWithContextCB();
 
 /**
+ * Function to unset the PIN close callback.
+ * NOTE : Do not call this function while PIN based ownership transfer is in progress.
+ */
+void UnsetClosePinCB();
+
+/**
  * Function to generate a random PIN.
  * This function will send a generated PIN to the user via the callback that was set in
  * SetGeneratePinCB or SetGeneratePinWithContextCB.
@@ -154,8 +173,8 @@ OCStackResult GeneratePin(char* pinBuffer, size_t bufferSize);
 
 /**
  * Function to get a pin for a device.
- * This function will acquire a pin from the user via the callback that was set in 
- * SetInputPinCB or SetInputPinWithContextCB. 
+ * This function will acquire a pin from the user via the callback that was set in
+ * SetInputPinCB or SetInputPinWithContextCB.
  *
  * @param[in] deviceId is the device that is requesting a pin
  * @param[in,out] pinBuffer is the reference to the buffer to store the inputed PIN data.
@@ -165,6 +184,12 @@ OCStackResult GeneratePin(char* pinBuffer, size_t bufferSize);
  */
 OCStackResult InputPin(OicUuid_t deviceId, char* pinBuffer, size_t bufferSize);
 
+/**
+ * Function to invoke the callback for close a PIN display.
+ */
+void ClosePinDisplay();
+
+
 #ifdef MULTIPLE_OWNER
 /**
  * Function to save the Pre-configured PIN.
index f67caf8..d135f32 100644 (file)
@@ -469,6 +469,13 @@ void DisplayPinCB(char *pin, size_t pinSize, void *context)
     OIC_LOG(INFO, TAG, "============================");
 }
 
+void ClosePinDisplayCB(void)
+{
+    OIC_LOG(INFO, TAG, "============================");
+    OIC_LOG(INFO, TAG, "    PIN DISPLAY CLOSED.");
+    OIC_LOG(INFO, TAG, "============================");
+}
+
 int main()
 {
     OIC_LOG(DEBUG, TAG, "OCServer is starting...");
@@ -490,6 +497,13 @@ int main()
     SetDisplayPinWithContextCB(DisplayPinCB, NULL);
 
     /**
+     * If the server supports random pin based OTM,
+     * the callback to close PIN display can be registered.
+     * This callback will be invoked when random PIN based OTM is done.
+     */
+    SetClosePinDisplayCB(ClosePinDisplayCB);
+
+    /**
      * Random PIN generation policy can be changed through SetRandomPinPolicy() API.
      * first param : byte length of random PIN ( 4 <= first param <= 32)
      * second param : PIN type (This is bitmask)
index 11d4982..3cd5619 100644 (file)
@@ -1327,6 +1327,12 @@ static OCEntityHandlerResult HandleDoxmPostRequest(OCEntityHandlerRequest * ehRe
                         //Save the owner's UUID to derive owner credential
                         memcpy(&(gDoxm->owner), &(newDoxm->owner), sizeof(OicUuid_t));
 
+                        // In case of random-pin based OTM, close the PIN display if callback is registered.
+                        if (!isDuplicatedMsg)
+                        {
+                            ClosePinDisplay();
+                        }
+
                         //Update new state in persistent storage
                         if (UpdatePersistentStorage(gDoxm) == true)
                         {
index 9a5e066..931a175 100644 (file)
@@ -48,6 +48,7 @@ typedef struct DisplayPinCallbacks
 {
     GeneratePinCallback callback;
     DisplayPinCallbackWithContext contextCallback;
+    ClosePinDisplayCallback closePinDisplayCallback;
     void* context;
 } DisplayPinCallbacks_t;
 
@@ -61,7 +62,7 @@ typedef struct InputPinCallbacks
     void* context;
 } InputPinCallbacks_t;
 
-static DisplayPinCallbacks_t g_displayPinCallbacks = { .callback = NULL, .contextCallback = NULL, .context = NULL };
+static DisplayPinCallbacks_t g_displayPinCallbacks = { .callback = NULL, .contextCallback = NULL, .closePinDisplayCallback = NULL, .context = NULL };
 static InputPinCallbacks_t g_inputPinCallbacks = { .callback = NULL, .contextCallback = NULL, .context = NULL };
 
 typedef struct PinOxmData {
@@ -185,6 +186,23 @@ OCStackResult SetDisplayPinWithContextCB(DisplayPinCallbackWithContext displayPi
     return OC_STACK_OK;
 }
 
+void SetClosePinDisplayCB(ClosePinDisplayCallback closeCB)
+{
+    if (NULL == closeCB)
+    {
+        OIC_LOG(ERROR, TAG, "Failed to set a callback for closing a pin.");
+        return;
+    }
+
+    if (NULL != g_displayPinCallbacks.closePinDisplayCallback)
+    {
+        OIC_LOG(ERROR, TAG, "Callback for closing a pin is already set.");
+        return;
+    }
+
+    g_displayPinCallbacks.closePinDisplayCallback = closeCB;
+}
+
 void UnsetInputPinCB()
 {
     UnsetInputPinWithContextCB();
@@ -209,6 +227,19 @@ void UnsetDisplayPinWithContextCB()
     g_displayPinCallbacks.context = NULL;
 }
 
+void UnsetClosePinDisplayCB()
+{
+    g_displayPinCallbacks.closePinDisplayCallback = NULL;
+}
+
+void ClosePinDisplay()
+{
+    if (g_displayPinCallbacks.closePinDisplayCallback)
+    {
+        g_displayPinCallbacks.closePinDisplayCallback();
+    }
+}
+
 /**
  * Internal function to generate PIN element according to pinType.
  * This function assumes the pinType is valid.