From 754c3d3d0a69431d607f008ada05b6511fbedad7 Mon Sep 17 00:00:00 2001 From: suwatchai Date: Sun, 4 Apr 2021 12:47:21 +0700 Subject: [PATCH] Fix the memory leaks in internal JSON parser and the token pre-refreshment issue. --- README.md | 2 +- library.properties | 2 +- src/FirebaseESP8266.cpp | 47 ++--------------- src/FirebaseESP8266.h | 19 ++----- src/README.md | 2 +- src/Utils.h | 101 ++++++++++++++++++++++++++++++++++- src/common.h | 3 +- src/json/FirebaseJson.cpp | 6 ++- src/json/FirebaseJson.h | 4 +- src/rtdb/FB_RTDB.cpp | 44 +--------------- src/rtdb/FB_RTDB.h | 14 +---- src/signer/Signer.cpp | 108 +++++++++++++------------------------- src/signer/Signer.h | 4 +- 13 files changed, 157 insertions(+), 199 deletions(-) diff --git a/README.md b/README.md index bf17c6f1..e096744e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4390794.svg)](https://doi.org/10.5281/zenodo.4390794) -Google's Firebase Realtime Database Arduino Library for ESP8266 v 3.1.8 +Google's Firebase Realtime Database Arduino Library for ESP8266 v 3.1.9 This library supports ESP8266 MCU from Espressif. The following are platforms in which libraries are also available. diff --git a/library.properties b/library.properties index 405d2dc3..9748a762 100644 --- a/library.properties +++ b/library.properties @@ -1,6 +1,6 @@ name=Firebase ESP8266 Client -version=3.1.8 +version=3.1.9 author=Mobizt diff --git a/src/FirebaseESP8266.cpp b/src/FirebaseESP8266.cpp index 4966cd55..8903d1ff 100644 --- a/src/FirebaseESP8266.cpp +++ b/src/FirebaseESP8266.cpp @@ -1,10 +1,11 @@ /** * Google's Firebase Realtime Database Arduino Library for ESP8266, version 3.1.9 * - * April 3, 2021 + * April 4, 2021 * * Updates: - * - Allows other Firebase calls inside the stream and multipath stream callback function. + * - Fix the memory leaks in internal JSON parser. + * - Fix the token pre-refreshment issue. * * This library provides ESP8266 to perform REST API by GET PUT, POST, PATCH, DELETE data from/to with Google's Firebase database using get, set, update * and delete calls. @@ -317,11 +318,6 @@ bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, const String return RTDB.pushString(&fbdo, path.c_str(), stringValue); } -bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue) -{ - return RTDB.pushString(&fbdo, path.c_str(), stringValue); -} - bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, const char *stringValue, float priority) { return RTDB.pushString(&fbdo, path.c_str(), stringValue, priority); @@ -332,11 +328,6 @@ bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, const String return RTDB.pushString(&fbdo, path.c_str(), stringValue, priority); } -bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, float priority) -{ - return RTDB.pushString(&fbdo, path.c_str(), stringValue, priority); -} - bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, FirebaseJson &json) { return RTDB.pushJSON(&fbdo, path.c_str(), &json); @@ -390,8 +381,6 @@ bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, T value) return pushString(fbdo, path, value); else if (std::is_same::value) return pushString(fbdo, path, value); - else if (std::is_same::value) - return pushString(fbdo, path, value); else if (std::is_same::value) return pushJson(fbdo, path, value); else if (std::is_same::value) @@ -418,8 +407,6 @@ bool FirebaseESP8266::push(FirebaseData &fbdo, const String &path, T value, floa return pushString(fbdo, path, value, priority); else if (std::is_same::value) return pushString(fbdo, path, value, priority); - else if (std::is_same::value) - return pushString(fbdo, path, value, priority); else if (std::is_same::value) return pushJson(fbdo, path, value, priority); else if (std::is_same::value) @@ -618,11 +605,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const String & return RTDB.setString(&fbdo, path.c_str(), stringValue); } -bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue) -{ - return RTDB.setString(&fbdo, path.c_str(), stringValue); -} - bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const char *stringValue, float priority) { return RTDB.setString(&fbdo, path.c_str(), stringValue, priority); @@ -633,11 +615,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const String & return RTDB.setString(&fbdo, path.c_str(), stringValue, priority); } -bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, float priority) -{ - return RTDB.setString(&fbdo, path.c_str(), stringValue, priority); -} - bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const char *stringValue, const String &ETag) { return RTDB.setString(&fbdo, path.c_str(), stringValue, ETag.c_str()); @@ -648,11 +625,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const String & return RTDB.setString(&fbdo, path.c_str(), stringValue, ETag.c_str()); } -bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, const String &ETag) -{ - return RTDB.setString(&fbdo, path.c_str(), stringValue, ETag.c_str()); -} - bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const char *stringValue, float priority, const String &ETag) { return RTDB.setString(&fbdo, path.c_str(), stringValue, priority, ETag.c_str()); @@ -663,11 +635,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const String & return RTDB.setString(&fbdo, path.c_str(), stringValue, priority, ETag.c_str()); } -bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, float priority, const String &ETag) -{ - return RTDB.setString(&fbdo, path.c_str(), stringValue, priority, ETag.c_str()); -} - bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, FirebaseJson &json) { return RTDB.setJSON(&fbdo, path.c_str(), &json); @@ -761,8 +728,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, T value) return setString(fbdo, path, value); else if (std::is_same::value) return setString(fbdo, path, value); - else if (std::is_same::value) - return setString(fbdo, path, value); else if (std::is_same::value) return setJson(fbdo, path, value); else if (std::is_same::value) @@ -791,8 +756,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, T value, float return setString(fbdo, path, value, priority); else if (std::is_same::value) return setString(fbdo, path, value, priority); - else if (std::is_same::value) - return setString(fbdo, path, value, priority); else if (std::is_same::value) return setJson(fbdo, path, value, priority); else if (std::is_same::value) @@ -819,8 +782,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, T value, const return setString(fbdo, path, value, ETag); else if (std::is_same::value) return setString(fbdo, path, value, ETag); - else if (std::is_same::value) - return setString(fbdo, path, value, ETag); else if (std::is_same::value) return setJson(fbdo, path, value, ETag); else if (std::is_same::value) @@ -847,8 +808,6 @@ bool FirebaseESP8266::set(FirebaseData &fbdo, const String &path, T value, float return setString(fbdo, path, value, priority, ETag); else if (std::is_same::value) return setString(fbdo, path, value, priority, ETag); - else if (std::is_same::value) - return setString(fbdo, path, value, priority, ETag); else if (std::is_same::value) return setJson(fbdo, path, value, priority, ETag); else if (std::is_same::value) diff --git a/src/FirebaseESP8266.h b/src/FirebaseESP8266.h index 7e0b8975..383f6995 100644 --- a/src/FirebaseESP8266.h +++ b/src/FirebaseESP8266.h @@ -1,10 +1,11 @@ /** - * Google's Firebase Realtime Database Arduino Library for ESP8266, version 3.1.8 + * Google's Firebase Realtime Database Arduino Library for ESP8266, version 3.1.9 * - * April 3, 2021 + * April 4, 2021 * * Updates: - * - Allows other Firebase calls inside the stream and multipath stream callback function. + * - Fix the memory leaks in internal JSON parser. + * - Fix the token pre-refreshment issue. * * This library provides ESP8266 to perform REST API by GET PUT, POST, PATCH, DELETE data from/to with Google's Firebase database using get, set, update * and delete calls. @@ -382,8 +383,6 @@ class FirebaseESP8266 bool push(FirebaseData &fbdo, const String &path, const String &stringValue); - bool push(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue); - /** Append new string (text) and the virtual child ".priority" to the defined database path. */ bool pushString(FirebaseData &fbdo, const String &path, const String &stringValue, float priority); @@ -392,8 +391,6 @@ class FirebaseESP8266 bool push(FirebaseData &fbdo, const String &path, const String &stringValue, float priority); - bool push(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, float priority); - /** Append new child nodes key and value (using FirebaseJson object) to the defined database path. * * @param fbdo Firebase Data Object to hold data and instance. @@ -704,8 +701,6 @@ class FirebaseESP8266 bool set(FirebaseData &fbdo, const String &path, const String &stringValue); - bool set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue); - /** Set string data and virtual child ".priority" at the defined database path. */ bool setString(FirebaseData &fbdo, const String &path, const String &stringValue, float priority); @@ -714,8 +709,6 @@ class FirebaseESP8266 bool set(FirebaseData &fbdo, const String &path, const String &stringValue, float priority); - bool set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, float priority); - /** Set string (text) at the defined database path if defined database path's ETag matched the ETag value. * * @param fbdo Firebase Data Object to hold data and instance. @@ -741,8 +734,6 @@ class FirebaseESP8266 bool set(FirebaseData &fbdo, const String &path, const String &stringValue, const String &ETag); - bool set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, const String &ETag); - /** Set string data and the virtual child ".priority" if defined ETag matches at the defined database path */ bool setString(FirebaseData &fbdo, const String &path, const String &stringValue, float priority, const String &ETag); @@ -751,8 +742,6 @@ class FirebaseESP8266 bool set(FirebaseData &fbdo, const String &path, const String &stringValue, float priority, const String &ETag); - bool set(FirebaseData &fbdo, const String &path, const StringSumHelper &stringValue, float priority, const String &ETag); - /** Set the child node key and value (using FirebaseJson object) to the defined database path. * This will replace any child nodes inside the defined path with node' s key * and value defined in FirebaseJson object. diff --git a/src/README.md b/src/README.md index 74e672a4..45fa30fa 100644 --- a/src/README.md +++ b/src/README.md @@ -1,7 +1,7 @@ # Firebase Realtime Database Arduino Library for ESP8266 -Google's Firebase Realtime Database Arduino Library for ESP8266 v 3.1.8 +Google's Firebase Realtime Database Arduino Library for ESP8266 v 3.1.9 ## Global functions diff --git a/src/Utils.h b/src/Utils.h index af0881e0..7663edd0 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -1,9 +1,9 @@ /** - * Google's Firebase Util class, Utils.h version 1.0.9 + * Google's Firebase Util class, Utils.h version 1.0.10 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 31, 2021 + * Created April 4, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2021 K. Suwatchai (Mobizt) @@ -569,6 +569,26 @@ class UtilsClass return idx; } + int readLine(WiFiClient *stream, std::string &buf) + { + int res = -1; + char c = 0; + int idx = 0; + while (stream->available()) + { + res = stream->read(); + if (res > -1) + { + c = (char)res; + buf += c; + idx++; + if (c == '\n') + return idx; + } + } + return idx; + } + int readChunkedData(WiFiClient *stream, char *out, int &chunkState, int &chunkedSize, int &dataLen, int bufLen) { @@ -651,6 +671,83 @@ class UtilsClass return olen; } + int readChunkedData(WiFiClient *stream, std::string &out, int &chunkState, int &chunkedSize, int &dataLen) + { + + char *tmp = nullptr; + int p1 = 0; + int olen = 0; + + if (chunkState == 0) + { + chunkState = 1; + chunkedSize = -1; + dataLen = 0; + std::string s; + int readLen = readLine(stream, s); + if (readLen) + { + tmp = strP(fb_esp_pgm_str_79); + p1 = strpos(s.c_str(), tmp, 0); + delS(tmp); + if (p1 == -1) + { + tmp = strP(fb_esp_pgm_str_21); + p1 = strpos(s.c_str(), tmp, 0); + delS(tmp); + } + + if (p1 != -1) + { + tmp = newS(p1 + 1); + memcpy(tmp, s.c_str(), p1); + chunkedSize = hex2int(tmp); + delS(tmp); + } + + //last chunk + if (chunkedSize < 1) + olen = -1; + } + else + chunkState = 0; + } + else + { + + if (chunkedSize > -1) + { + std::string s; + int readLen = readLine(stream, s); + + if (readLen > 0) + { + //chunk may contain trailing + if (dataLen + readLen - 2 < chunkedSize) + { + dataLen += readLen; + out += s; + olen = readLen; + } + else + { + if (chunkedSize - dataLen > 0) + out += s; + dataLen = chunkedSize; + chunkState = 0; + olen = readLen; + } + } + else + { + olen = -1; + } + } + } + + return olen; + } + char *getHeader(const char *buf, PGM_P beginH, PGM_P endH, int &beginPos, int endPos) { diff --git a/src/common.h b/src/common.h index 8161de6a..b41ea5c0 100644 --- a/src/common.h +++ b/src/common.h @@ -1,6 +1,6 @@ /** - * Created March 23, 2021 + * Created April 3, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) @@ -65,6 +65,7 @@ class FunctionsConfig; #define MAX_BLOB_PAYLOAD_SIZE 1024 #define MAX_EXCHANGE_TOKEN_ATTEMPTS 5 #define ESP_DEFAULT_TS 1510644967 +#define ESP_SIGNER_DEFAULT_RESPONSE_BUFFER_SIZE 2560 enum fb_esp_fcm_msg_mode { diff --git a/src/json/FirebaseJson.cpp b/src/json/FirebaseJson.cpp index 4eaa71d1..8e5085ea 100644 --- a/src/json/FirebaseJson.cpp +++ b/src/json/FirebaseJson.cpp @@ -1,9 +1,9 @@ /* - * FirebaseJson, version 2.3.12 + * FirebaseJson, version 2.3.13 * * The Easiest Arduino library to parse, create and edit JSON object using a relative path. * - * March 26, 2021 + * April 4, 2021 * * Features * - None recursive operations @@ -70,6 +70,7 @@ FirebaseJson::~FirebaseJson() _parser.reset(); _parser = nullptr; _finalize(); + delete helper; } void FirebaseJson::_init() @@ -3124,6 +3125,7 @@ FirebaseJsonArray::~FirebaseJsonArray() { _finalize(); std::string().swap(_jbuf); + delete helper; }; void FirebaseJsonArray::_init() diff --git a/src/json/FirebaseJson.h b/src/json/FirebaseJson.h index ff4bbecc..f5bc7f71 100644 --- a/src/json/FirebaseJson.h +++ b/src/json/FirebaseJson.h @@ -1,9 +1,9 @@ /** - * FirebaseJson, version 2.3.12 + * FirebaseJson, version 2.3.13 * * The Easiest Arduino library to parse, create and edit JSON object using a relative path. * - * March 26, 2021 + * April 4, 2021 * * Features * - None recursive operations diff --git a/src/rtdb/FB_RTDB.cpp b/src/rtdb/FB_RTDB.cpp index 940ca2b4..12c4958f 100644 --- a/src/rtdb/FB_RTDB.cpp +++ b/src/rtdb/FB_RTDB.cpp @@ -3,7 +3,7 @@ * * This library supports Espressif ESP8266 and ESP32 * - * Created April 3, 2021 + * Created April 4, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2021 K. Suwatchai (Mobizt) @@ -208,11 +208,6 @@ bool FB_RTDB::push(FirebaseData *fbdo, const char *path, const String &stringVal return pushString(fbdo, path, stringValue); } -bool FB_RTDB::push(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue) -{ - return pushString(fbdo, path, stringValue); -} - bool FB_RTDB::push(FirebaseData *fbdo, const char *path, const char *stringValue, float priority) { return pushString(fbdo, path, stringValue, priority); @@ -223,11 +218,6 @@ bool FB_RTDB::push(FirebaseData *fbdo, const char *path, const String &stringVal return pushString(fbdo, path, stringValue, priority); } -bool FB_RTDB::push(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, float priority) -{ - return pushString(fbdo, path, stringValue, priority); -} - bool FB_RTDB::push(FirebaseData *fbdo, const char *path, FirebaseJson *json) { return pushJSON(fbdo, path, json); @@ -281,8 +271,6 @@ bool FB_RTDB::push(FirebaseData *fbdo, const char *path, T value) return pushString(fbdo, path, value); else if (std::is_same::value) return pushString(fbdo, path, value); - else if (std::is_same::value) - return pushString(fbdo, path, value); else if (std::is_same::value) return pushJson(fbdo, path, value); else if (std::is_same::value) @@ -309,8 +297,6 @@ bool FB_RTDB::push(FirebaseData *fbdo, const char *path, T value, float priority return pushString(fbdo, path, value, priority); else if (std::is_same::value) return pushString(fbdo, path, value, priority); - else if (std::is_same::value) - return pushString(fbdo, path, value, priority); else if (std::is_same::value) return pushJson(fbdo, path, value, priority); else if (std::is_same::value) @@ -714,11 +700,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const String &stringValu return setString(fbdo, path, stringValue); } -bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue) -{ - return setString(fbdo, path, stringValue); -} - bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const char *stringValue, float priority) { return setString(fbdo, path, stringValue, priority); @@ -729,11 +710,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const String &stringValu return setString(fbdo, path, stringValue, priority); } -bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, float priority) -{ - return setString(fbdo, path, stringValue, priority); -} - bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const char *stringValue, const char *ETag) { return setString(fbdo, path, stringValue, ETag); @@ -744,11 +720,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const String &stringValu return setString(fbdo, path, stringValue, ETag); } -bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, const char *ETag) -{ - return setString(fbdo, path, stringValue, ETag); -} - bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const char *stringValue, float priority, const char *ETag) { return setString(fbdo, path, stringValue, priority, ETag); @@ -759,11 +730,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const String &stringValu return setString(fbdo, path, stringValue, priority, ETag); } -bool FB_RTDB::set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, float priority, const char *ETag) -{ - return setString(fbdo, path, stringValue, priority, ETag); -} - bool FB_RTDB::set(FirebaseData *fbdo, const char *path, FirebaseJson *json) { return setJSON(fbdo, path, json); @@ -857,8 +823,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, T value) return setString(fbdo, path, value); else if (std::is_same::value) return setString(fbdo, path, value); - else if (std::is_same::value) - return setString(fbdo, path, value); else if (std::is_same::value) return setJson(fbdo, path, value); else if (std::is_same::value) @@ -887,8 +851,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, T value, float priority) return setString(fbdo, path, value, priority); else if (std::is_same::value) return setString(fbdo, path, value, priority); - else if (std::is_same::value) - return setString(fbdo, path, value, priority); else if (std::is_same::value) return setJson(fbdo, path, value, priority); else if (std::is_same::value) @@ -915,8 +877,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, T value, const char *ETa return setString(fbdo, path, value, ETag); else if (std::is_same::value) return setString(fbdo, path, value, ETag); - else if (std::is_same::value) - return setString(fbdo, path, value, ETag); else if (std::is_same::value) return setJson(fbdo, path, value, ETag); else if (std::is_same::value) @@ -943,8 +903,6 @@ bool FB_RTDB::set(FirebaseData *fbdo, const char *path, T value, float priority, return setString(fbdo, path, value, priority, ETag); else if (std::is_same::value) return setString(fbdo, path, value, priority, ETag); - else if (std::is_same::value) - return setString(fbdo, path, value, priority, ETag); else if (std::is_same::value) return setJson(fbdo, path, value, priority, ETag); else if (std::is_same::value) diff --git a/src/rtdb/FB_RTDB.h b/src/rtdb/FB_RTDB.h index ccce6f27..c95b89fc 100644 --- a/src/rtdb/FB_RTDB.h +++ b/src/rtdb/FB_RTDB.h @@ -3,7 +3,7 @@ * * This library supports Espressif ESP8266 and ESP32 * - * Created April 3, 2021 + * Created April 4, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2021 K. Suwatchai (Mobizt) @@ -257,8 +257,6 @@ class FB_RTDB bool push(FirebaseData *fbdo, const char *path, const String &stringValue); - bool push(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue); - /** Append (post) new string and the virtual child ".priority" to the defined node. */ bool pushString(FirebaseData *fbdo, const char *path, const String &stringValue, float priority); @@ -267,8 +265,6 @@ class FB_RTDB bool push(FirebaseData *fbdo, const char *path, const String &stringValue, float priority); - bool push(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, float priority); - /** Append (post) new child (s) to the defined node. * * @param fbdo The pointer to Firebase Data Object. @@ -571,8 +567,6 @@ class FB_RTDB bool set(FirebaseData *fbdo, const char *path, const String &stringValue); - bool set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue); - /** Set (put) string value and virtual child ".priority" at the defined node. */ bool setString(FirebaseData *fbdo, const char *path, const String &stringValue, float priority); @@ -581,8 +575,6 @@ class FB_RTDB bool set(FirebaseData *fbdo, const char *path, const String &stringValue, float priority); - bool set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, float priority); - /** Set (put) string at the defined node if defined node's ETag matched the ETag value. * * @param fbdo The pointer to Firebase Data Object. @@ -606,8 +598,6 @@ class FB_RTDB bool set(FirebaseData *fbdo, const char *path, const String &stringValue, const char *ETag); - bool set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, const char *ETag); - /** Set string data and the virtual child ".priority" if defined ETag matches at the defined node. */ bool setString(FirebaseData *fbdo, const char *path, const String &stringValue, float priority, const char *ETag); @@ -616,8 +606,6 @@ class FB_RTDB bool set(FirebaseData *fbdo, const char *path, const String &stringValue, float priority, const char *ETag); - bool set(FirebaseData *fbdo, const char *path, const StringSumHelper &stringValue, float priority, const char *ETag); - /** Set (put) the child (s) nodes to the defined node. * The old content in defined node will be replaced. * diff --git a/src/signer/Signer.cpp b/src/signer/Signer.cpp index 649764c9..74c37d76 100644 --- a/src/signer/Signer.cpp +++ b/src/signer/Signer.cpp @@ -1,15 +1,15 @@ /** - * Google's Firebase Token Generation class, Signer.cpp version 1.0.7 + * Google's Firebase Token Generation class, Signer.cpp version 1.0.8 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 31, 2021 + * Created April 4, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -99,21 +99,16 @@ bool Firebase_Signer::parseSAFile() tmp = ut->strP(fb_esp_pgm_str_245); config->signer.json->get(*config->signer.data, (const char *)tmp); ut->delS(tmp); - if (config->signer.data->success) config->service_account.data.project_id = config->signer.data->stringValue.c_str(); - tmp = ut->strP(fb_esp_pgm_str_246); config->signer.json->get(*config->signer.data, (const char *)tmp); ut->delS(tmp); - if (config->signer.data->success) config->service_account.data.private_key_id = config->signer.data->stringValue.c_str(); - tmp = ut->strP(fb_esp_pgm_str_247); config->signer.json->get(*config->signer.data, (const char *)tmp); ut->delS(tmp); - if (config->signer.data->success) { tmp = ut->newS(config->signer.data->stringValue.length()); @@ -137,14 +132,11 @@ bool Firebase_Signer::parseSAFile() tmp = ut->strP(fb_esp_pgm_str_248); config->signer.json->get(*config->signer.data, (const char *)tmp); ut->delS(tmp); - if (config->signer.data->success) config->service_account.data.client_email = config->signer.data->stringValue.c_str(); - tmp = ut->strP(fb_esp_pgm_str_253); config->signer.json->get(*config->signer.data, (const char *)tmp); ut->delS(tmp); - if (config->signer.data->success) config->service_account.data.client_id = config->signer.data->stringValue.c_str(); @@ -215,7 +207,7 @@ bool Firebase_Signer::handleToken() if (config->host.length() == 0) return false; - if (config->signer.preRefreshSeconds > config->signer.tokens.expires) + if (config->signer.preRefreshSeconds > config->signer.tokens.expires && config->signer.tokens.expires > 0) config->signer.preRefreshSeconds = 60; if ((config->signer.tokens.token_type == token_type_id_token || config->signer.tokens.token_type == token_type_custom_token || config->signer.tokens.token_type == token_type_oauth2_access_token) && ((unsigned long)time(nullptr) > config->signer.tokens.expires - config->signer.preRefreshSeconds || config->signer.tokens.expires == 0)) @@ -224,10 +216,17 @@ bool Firebase_Signer::handleToken() { if (millis() - config->signer.lastReqMillis > config->signer.reqTO || config->signer.lastReqMillis == 0) { + config->signer.lastReqMillis = millis(); if (config->_int.fb_processing) return false; +#if defined(ESP32) return refreshToken(); +#elif defined(ESP8266) + //Due to the response payload of token refreshment request is too big for ESP8266, + //get the new id token instead. + return getIdToken(false, "", ""); +#endif } return false; } @@ -503,7 +502,7 @@ bool Firebase_Signer::refreshToken() #elif defined(ESP8266) config->signer.wcs = new WiFiClientSecure(); config->signer.wcs->setInsecure(); - config->signer.wcs->setBufferSizes(512, 512); + config->signer.wcs->setBufferSizes(1024, 512); #endif config->signer.json = new FirebaseJson(); config->signer.data = new FirebaseJsonData(); @@ -774,21 +773,11 @@ bool Firebase_Signer::handleTokenResponse() unsigned long dataTime = millis(); int chunkIdx = 0; - int pChunkIdx = 0; - int payloadLen = 3200; - int pBufPos = 0; - int hBufPos = 0; int chunkBufSize = 0; - int hstate = 0; - int pstate = 0; int chunkedDataState = 0; int chunkedDataSize = 0; int chunkedDataLen = 0; - int defaultChunkSize = 2048; - char *header = nullptr; - char *payload = nullptr; - char *pChunk = nullptr; - char *tmp = nullptr; + std::string header, payload; bool isHeader = false; #if defined(ESP32) WiFiClient *stream = config->signer.wcs->stream(); @@ -809,7 +798,6 @@ bool Firebase_Signer::handleTokenResponse() } bool complete = false; - int readLen = 0; unsigned long datatime = millis(); while (!complete) { @@ -836,32 +824,23 @@ bool Firebase_Signer::handleTokenResponse() if (chunkBufSize > 0) { - chunkBufSize = defaultChunkSize; - if (chunkIdx == 0) { - header = ut->newS(chunkBufSize); - hstate = 1; - int readLen = ut->readLine(stream, header, chunkBufSize); - + ut->readLine(stream, header); int pos = 0; - - tmp = ut->getHeader(header, fb_esp_pgm_str_5, fb_esp_pgm_str_6, pos, 0); - delay(0); + char *tmp = ut->getHeader(header.c_str(), fb_esp_pgm_str_5, fb_esp_pgm_str_6, pos, 0); if (tmp) { isHeader = true; - hBufPos = readLen; response.httpCode = atoi(tmp); ut->delS(tmp); } } else { - delay(0); if (isHeader) { - tmp = ut->newS(chunkBufSize); + char *tmp = ut->newS(chunkBufSize); int readLen = ut->readLine(stream, tmp, chunkBufSize); bool headerEnded = false; @@ -876,16 +855,11 @@ bool Firebase_Signer::handleTokenResponse() if (headerEnded) { isHeader = false; - ut->parseRespHeader(header, response); - if (hstate == 1) - ut->delS(header); - hstate = 0; + ut->parseRespHeader(header.c_str(), response); + std::string().swap(header); } else - { - memcpy(header + hBufPos, tmp, readLen); - hBufPos += readLen; - } + header += tmp; ut->delS(tmp); } @@ -893,32 +867,23 @@ bool Firebase_Signer::handleTokenResponse() { if (!response.noContent) { - pChunkIdx++; - - pChunk = ut->newS(chunkBufSize + 1); - - if (!payload || pstate == 0) - { - pstate = 1; - payload = ut->newS(payloadLen + 1); - } - readLen = 0; if (response.isChunkedEnc) - readLen = ut->readChunkedData(stream, pChunk, chunkedDataState, chunkedDataSize, chunkedDataLen, chunkBufSize); + complete = ut->readChunkedData(stream, payload, chunkedDataState, chunkedDataSize, chunkedDataLen) < 0; else { + chunkBufSize = 1024; if (stream->available() < chunkBufSize) chunkBufSize = stream->available(); - readLen = stream->readBytes(pChunk, chunkBufSize); - } - if (readLen > 0) - memcpy(payload + pBufPos, pChunk, readLen); + char *tmp = ut->newS(chunkBufSize + 1); + int readLen = stream->readBytes(tmp, chunkBufSize); - ut->delS(pChunk); - pBufPos += readLen; - if ((response.isChunkedEnc && readLen < 0) || (!response.isChunkedEnc && stream->available() <= 0)) - complete = true; + if (readLen > 0) + payload += tmp; + + ut->delS(tmp); + complete = stream->available() <= 0; + } } else { @@ -938,16 +903,13 @@ bool Firebase_Signer::handleTokenResponse() } } - if (hstate == 1) - ut->delS(header); - if (stream->connected()) stream->stop(); - if (payload && !response.noContent) + if (payload.length() > 0 && !response.noContent) { - config->signer.json->setJsonData(payload); - ut->delS(payload); + config->signer.json->setJsonData(payload.c_str()); + std::string().swap(payload); return true; } @@ -1453,11 +1415,13 @@ bool Firebase_Signer::getIdToken(bool createUser, const char *email, const char ut->delS(tmp); if (config->signer.data->success) config->signer.tokens.id_token = config->signer.data->stringValue.c_str(); +#if defined(ESP32) tmp = ut->strP(fb_esp_pgm_str_201); config->signer.json->get(*config->signer.data, tmp); ut->delS(tmp); if (config->signer.data->success) config->signer.tokens.refresh_token = config->signer.data->stringValue.c_str(); +#endif tmp = ut->strP(fb_esp_pgm_str_202); config->signer.json->get(*config->signer.data, tmp); @@ -1827,7 +1791,7 @@ void Firebase_Signer::checkToken() if (config->host.length() == 0) return; - if (config->signer.preRefreshSeconds > config->signer.tokens.expires) + if (config->signer.preRefreshSeconds > config->signer.tokens.expires && config->signer.tokens.expires > 0) config->signer.preRefreshSeconds = 60; if ((config->signer.tokens.token_type == token_type_id_token || config->signer.tokens.token_type == token_type_custom_token || config->signer.tokens.token_type == token_type_oauth2_access_token) && ((unsigned long)time(nullptr) > config->signer.tokens.expires - config->signer.preRefreshSeconds || config->signer.tokens.expires == 0)) diff --git a/src/signer/Signer.h b/src/signer/Signer.h index 58310932..db1e9525 100644 --- a/src/signer/Signer.h +++ b/src/signer/Signer.h @@ -1,9 +1,9 @@ /** - * Google's Firebase Token Generation class, Signer.h version 1.0.7 + * Google's Firebase Token Generation class, Signer.h version 1.0.8 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 31, 2021 + * Created April 4, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt)