Example #1
0
OSStatus HKhandleIncomeingMessage(int sockfd, HTTPHeader_t *httpHeader, HK_Notify_t** notifyList, HK_Context_t *inHkContext, mico_Context_t * const inContext)
{
  OSStatus err = kNoErr;
  HkStatus hkErr = kNoErr;
  printbuf *buffer = NULL;
  uint32_t idx;
  size_t arrayLen;
  err = HKSocketReadHTTPHeader( sockfd, httpHeader, inHkContext->session );
  int accessoryID, serviceID, characteristicID;
  json_object *characteristics, *characteristic, *outCharacteristics, *outCharacteristic, *event_obj;
  json_object *value_obj = NULL;
  json_object *inhapJsonObject = NULL, *outhapJsonObject = NULL;
  value_union value;
  bool event, isFound;
  int status = kStatusOK;
  int aid, iid;
  HK_Char_ID_t id;

  switch ( err )
  {
    case kNoErr:
        err = HKSocketReadHTTPBody( sockfd, httpHeader, inHkContext->session );
        require_noerr(err, exit);
        /*Pair set engine*/
        if(HTTPHeaderMatchURL( httpHeader, kPAIRSETUP ) == kNoErr) {
          err = HTTPHeaderMatchMethod( httpHeader, "POST");
          require_noerr_action(err, exit, status = kStatusMethodNotAllowed);

          err = HKPairSetupEngine( sockfd, httpHeader, &inHkContext->pairInfo, inContext );
          require_noerr( err, exit );
          if(inContext->appStatus.haPairSetupRunning == false){err = kConnectionErr; goto exit;};
        }
        /*Pair verify engine*/ 
        else if(HTTPHeaderMatchURL( httpHeader, kPAIRVERIFY ) == kNoErr){
          err = HTTPHeaderMatchMethod( httpHeader, "POST");
          require_noerr_action(err, exit, status = kStatusMethodNotAllowed);

          if(inHkContext->pairVerifyInfo == NULL){
            inHkContext->pairVerifyInfo = HKCreatePairVerifyInfo();
            require_action( inHkContext->pairVerifyInfo, exit, err = kNoMemoryErr );
          }
          err = HKPairVerifyEngine( sockfd, httpHeader, inHkContext->pairVerifyInfo, inContext );
          require_noerr_action( err, exit, HKCleanPairVerifyInfo(&inHkContext->pairVerifyInfo));
          if(inHkContext->pairVerifyInfo->verifySuccess){
            inHkContext->session->established = true;
            memcpy(inHkContext->session->InputKey,  inHkContext->pairVerifyInfo->C2AKey, 32);
            memcpy(inHkContext->session->OutputKey, inHkContext->pairVerifyInfo->A2CKey, 32);
            strncpy(inHkContext->session->controllerIdentifier, inHkContext->pairVerifyInfo->pControllerIdentifier, 64);
            HKCleanPairVerifyInfo(&inHkContext->pairVerifyInfo);
          }
        }
        /* Add or remove pairs */ 
        else if(HTTPHeaderMatchURL( httpHeader, kPAIRINGS ) == kNoErr){
          err = HTTPHeaderMatchMethod( httpHeader, "POST");
          require_noerr_action(err, exit, status = kStatusMethodNotAllowed);

          require_action( inHkContext->session->established == true, exit, err = kAuthenticationErr; status = kStatusAuthenticationErr );

          err = HKPairAddRemoveEngine( sockfd, httpHeader, inHkContext->session );
          require_noerr( err, exit );
        }
        /* Identity routine under unpaired */
        else if(HTTPHeaderMatchURL( httpHeader, kIdentity ) == kNoErr){
Example #2
0
OSStatus _LocalConfigRespondInComingMessage(int fd, HTTPHeader_t* inHeader, mico_Context_t * const inContext)
{
  OSStatus err = kUnknownErr;
  const char *  json_str;
  uint8_t *httpResponse = NULL;
  size_t httpResponseLen = 0;
  json_object* report = NULL;
  config_log_trace();

  if(HTTPHeaderMatchURL( inHeader, kCONFIGURLRead ) == kNoErr){    
    report = ConfigCreateReportJsonMessage( inContext );
    require( report, exit );
    json_str = json_object_to_json_string(report);
    require_action( json_str, exit, err = kNoMemoryErr );
    config_log("Send config object=%s", json_str);
    err =  CreateSimpleHTTPMessageNoCopy( kMIMEType_JSON, strlen(json_str), &httpResponse, &httpResponseLen );
    require_noerr( err, exit );
    require( httpResponse, exit );
    err = SocketSend( fd, httpResponse, httpResponseLen );
    require_noerr( err, exit );
    err = SocketSend( fd, (uint8_t *)json_str, strlen(json_str) );
    require_noerr( err, exit );
    config_log("Current configuration sent");
    goto exit;
  }
  else if(HTTPHeaderMatchURL( inHeader, kCONFIGURLWrite ) == kNoErr){
    if(inHeader->contentLength > 0){
      config_log("Recv new configuration, apply and reset");
      err = ConfigIncommingJsonMessage( inHeader->extraDataPtr, inContext);
      require_noerr( err, exit );
      inContext->flashContentInRam.micoSystemConfig.configured = allConfigured;
      MICOUpdateConfiguration(inContext);

      err =  CreateSimpleHTTPOKMessage( &httpResponse, &httpResponseLen );
      require_noerr( err, exit );
      require( httpResponse, exit );
      err = SocketSend( fd, httpResponse, httpResponseLen );
      SocketClose(&fd);
      inContext->micoStatus.sys_state = eState_Software_Reset;
      if(inContext->micoStatus.sys_state_change_sem != NULL );
        mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem);
      mico_thread_sleep(MICO_WAIT_FOREVER);
    }
    goto exit;
  }
else if(HTTPHeaderMatchURL( inHeader, kCONFIGURLWriteByUAP ) == kNoErr){
    if(inHeader->contentLength > 0){
      config_log("Recv new configuration from uAP, apply and connect to AP");
      err = ConfigIncommingJsonMessageUAP( inHeader->extraDataPtr, inContext);
      require_noerr( err, exit );
      MICOUpdateConfiguration(inContext);

      err =  CreateSimpleHTTPOKMessage( &httpResponse, &httpResponseLen );
      require_noerr( err, exit );
      require( httpResponse, exit );

      err = SocketSend( fd, httpResponse, httpResponseLen );
      require_noerr( err, exit );
      sleep(1);

      micoWlanSuspendSoftAP();
      _easylinkConnectWiFi( inContext );

      err = kConnectionErr; //Return an err to close socket and exit the current thread
    }
    goto exit;
  }
#ifdef MICO_FLASH_FOR_UPDATE
  else if(HTTPHeaderMatchURL( inHeader, kCONFIGURLOTA ) == kNoErr){
    if(inHeader->contentLength > 0){
      config_log("Receive OTA data!");
      memset(&inContext->flashContentInRam.bootTable, 0, sizeof(boot_table_t));
      inContext->flashContentInRam.bootTable.length = inHeader->contentLength;
      inContext->flashContentInRam.bootTable.start_address = UPDATE_START_ADDRESS;
      inContext->flashContentInRam.bootTable.type = 'A';
      inContext->flashContentInRam.bootTable.upgrade_type = 'U';
      if(inContext->flashContentInRam.micoSystemConfig.configured != allConfigured)
        inContext->flashContentInRam.micoSystemConfig.easyLinkByPass = EASYLINK_SOFT_AP_BYPASS;
      MICOUpdateConfiguration(inContext);
      SocketClose(&fd);
      inContext->micoStatus.sys_state = eState_Software_Reset;
      if(inContext->micoStatus.sys_state_change_sem != NULL );
        mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem);
      mico_thread_sleep(MICO_WAIT_FOREVER);
    }
    goto exit;
  }
#endif
  else{
    return kNotFoundErr;
  };

 exit:
  if(inHeader->persistent == false)  //Return an err to close socket and exit the current thread
    err = kConnectionErr;
  if(httpResponse)  free(httpResponse);
  if(report)        json_object_put(report);

  return err;

}