From d0f22ea9d333fe56fe2bfb31d4088ad748ba2c04 Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Tue, 3 Sep 2024 00:59:23 +0530 Subject: [PATCH] esp_rmaker_claim: Fetch MQTT Host from assisted claiming service For assisted claiming, the node itself does not connect to the claiming service directly. Instead, it just creates and parses payloads which are sent/received by phone apps on its behalf. Since the phone app can get certificates from any claiming service, it will be better to have the MQTT Host URL also part of the response, so that there is no mismatch between certificate and MQTT Host URL. --- .../esp_rainmaker/src/core/esp_rmaker_claim.c | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/components/esp_rainmaker/src/core/esp_rmaker_claim.c b/components/esp_rainmaker/src/core/esp_rmaker_claim.c index ee37bd6..aa52b15 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_claim.c +++ b/components/esp_rainmaker/src/core/esp_rmaker_claim.c @@ -252,17 +252,26 @@ static esp_err_t handle_claim_verify_response(esp_rmaker_claim_data_t *claim_dat int required_len = 0; if (json_obj_get_strlen(&jctx, "certificate", &required_len) == 0) { required_len++; /* For NULL termination */ - char *certificate = MEM_CALLOC_EXTRAM(1, required_len); - if (!certificate) { + char *value_buf = MEM_CALLOC_EXTRAM(1, required_len); + if (!value_buf) { json_parse_end(&jctx); ESP_LOGE(TAG, "Failed to allocate %d bytes for certificate.", required_len); return ESP_ERR_NO_MEM; } - json_obj_get_string(&jctx, "certificate", certificate, required_len); + /* Just using the certificate buffer itself (which is expected to be large enough) to + * check if the claiming service has also sent an MQTT Host, before going on to read + * the certificate itself. + */ + if (json_obj_get_string(&jctx, "mqtt_host", value_buf, required_len) == 0) { + ESP_LOGI(TAG, "Storing received MQTT Host: %s", value_buf); + esp_rmaker_factory_set(ESP_RMAKER_MQTT_HOST_NVS_KEY, value_buf, strlen(value_buf)); + memset(value_buf, 0, required_len); + } + json_obj_get_string(&jctx, "certificate", value_buf, required_len); json_parse_end(&jctx); - unescape_new_line(certificate); - esp_err_t err = esp_rmaker_factory_set(ESP_RMAKER_CLIENT_CERT_NVS_KEY, certificate, strlen(certificate)); - free(certificate); + unescape_new_line(value_buf); + esp_err_t err = esp_rmaker_factory_set(ESP_RMAKER_CLIENT_CERT_NVS_KEY, value_buf, strlen(value_buf)); + free(value_buf); return err; } else { ESP_LOGE(TAG, "Claim Verify Response invalid."); @@ -579,6 +588,7 @@ static esp_err_t handle_assisted_claim_init_response(esp_rmaker_claim_data_t *cl json_gen_str_start(&jstr, claim_data->payload, sizeof(claim_data->payload), NULL, NULL); json_gen_start_object(&jstr); json_gen_obj_set_string(&jstr, "csr", (char *)claim_data->csr); + json_gen_obj_set_bool(&jstr, "send_mqtt_host", true); json_gen_end_object(&jstr); json_gen_str_end(&jstr); claim_data->payload_len = strlen(claim_data->payload);