testing
This commit is contained in:
1 parent
475a38999a
commit
5099d25965
11 files changed
+648
-9
No files matched your search
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "BintrayClient",
|
||||
"keywords": "bintray, ota, cdn, storage",
|
||||
"description": "A BintrayClient to connect to a JFrog Bintray.",
|
||||
"authors": [
|
||||
{
|
||||
"name": "PlatformIO",
|
||||
"url": "https://platformio.org/"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/platformio/platformio-examples"
|
||||
},
|
||||
"export": {
|
||||
"include": "bintray-secure-ota/lib/BintrayClient"
|
||||
},
|
||||
"dependencies": {
|
||||
"ArduinoJson": "^5.13.1"
|
||||
},
|
||||
"version": "1.0.0",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "espressif32"
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
**/
|
||||
|
||||
#ifndef BINTRAY_CERTIFICATES_H
|
||||
#define BINTRAY_CERTIFICATES_H
|
||||
|
||||
const char* BINTRAY_API_ROOT_CA = \
|
||||
"-----BEGIN CERTIFICATE-----\n" \
|
||||
"MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\n" \
|
||||
"MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\n" \
|
||||
"YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\n" \
|
||||
"EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\n" \
|
||||
"R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\n" \
|
||||
"9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\n" \
|
||||
"fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\n" \
|
||||
"iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\n" \
|
||||
"1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\n" \
|
||||
"bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\n" \
|
||||
"MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\n" \
|
||||
"ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\n" \
|
||||
"uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\n" \
|
||||
"Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\n" \
|
||||
"tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\n" \
|
||||
"PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\n" \
|
||||
"hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\n" \
|
||||
"5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\n" \
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
const char* BINTRAY_AKAMAI_ROOT_CA = \
|
||||
"-----BEGIN CERTIFICATE-----\n"\
|
||||
"MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh\n"\
|
||||
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"\
|
||||
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n"\
|
||||
"QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaME0xCzAJBgNVBAYTAlVT\n"\
|
||||
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJzAlBgNVBAMTHkRpZ2lDZXJ0IFNIQTIg\n"\
|
||||
"U2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n"\
|
||||
"ANyuWJBNwcQwFZA1W248ghX1LFy949v/cUP6ZCWA1O4Yok3wZtAKc24RmDYXZK83\n"\
|
||||
"nf36QYSvx6+M/hpzTc8zl5CilodTgyu5pnVILR1WN3vaMTIa16yrBvSqXUu3R0bd\n"\
|
||||
"KpPDkC55gIDvEwRqFDu1m5K+wgdlTvza/P96rtxcflUxDOg5B6TXvi/TC2rSsd9f\n"\
|
||||
"/ld0Uzs1gN2ujkSYs58O09rg1/RrKatEp0tYhG2SS4HD2nOLEpdIkARFdRrdNzGX\n"\
|
||||
"kujNVA075ME/OV4uuPNcfhCOhkEAjUVmR7ChZc6gqikJTvOX6+guqw9ypzAO+sf0\n"\
|
||||
"/RR3w6RbKFfCs/mC/bdFWJsCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8C\n"\
|
||||
"AQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYY\n"\
|
||||
"aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6\n"\
|
||||
"Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwN6A1\n"\
|
||||
"oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RD\n"\
|
||||
"QS5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v\n"\
|
||||
"d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFA+AYRyCMWHVLyjnjUY4tCzh\n"\
|
||||
"xtniMB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA0GCSqGSIb3DQEB\n"\
|
||||
"CwUAA4IBAQAjPt9L0jFCpbZ+QlwaRMxp0Wi0XUvgBCFsS+JtzLHgl4+mUwnNqipl\n"\
|
||||
"5TlPHoOlblyYoiQm5vuh7ZPHLgLGTUq/sELfeNqzqPlt/yGFUzZgTHbO7Djc1lGA\n"\
|
||||
"8MXW5dRNJ2Srm8c+cftIl7gzbckTB+6WohsYFfZcTEDts8Ls/3HB40f/1LkAtDdC\n"\
|
||||
"2iDJ6m6K7hQGrn2iWZiIqBtvLfTyyRRfJs8sjX7tN8Cp1Tm5gr8ZDOo0rwAhaPit\n"\
|
||||
"c+LJMto4JQtV05od8GiG7S5BNO98pVAdvzr508EIDObtHopYJeS4d60tbvVS3bR0\n"\
|
||||
"j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz\n"\
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
const char* CLOUDFRONT_API_ROOT_CA = \
|
||||
"-----BEGIN CERTIFICATE-----\n"\
|
||||
"MIIE3zCCA8egAwIBAgIQYxgNOPuAl3ip0DWjFhj4QDANBgkqhkiG9w0BAQsFADCB\n"\
|
||||
"yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n"\
|
||||
"ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n"\
|
||||
"U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n"\
|
||||
"ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n"\
|
||||
"aG9yaXR5IC0gRzUwHhcNMTcxMTA2MDAwMDAwWhcNMjIxMTA1MjM1OTU5WjBhMQsw\n"\
|
||||
"CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu\n"\
|
||||
"ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjCC\n"\
|
||||
"ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALs3zTTce2vJsmiQrUp1/0a6\n"\
|
||||
"IQoIjfUZVMn7iNvzrvI6iZE8euarBhprz6wt6F4JJES6Ypp+1qOofuBUdSAFrFC3\n"\
|
||||
"nGMabDDc2h8Zsdce3v3X4MuUgzeu7B9DTt17LNK9LqUv5Km4rTrUmaS2JembawBg\n"\
|
||||
"kmD/TyFJGPdnkKthBpyP8rrptOmSMmu181foXRvNjB2rlQSVSfM1LZbjSW3dd+P7\n"\
|
||||
"SUu0rFUHqY+Vs7Qju0xtRfD2qbKVMLT9TFWMJ0pXFHyCnc1zktMWSgYMjFDRjx4J\n"\
|
||||
"vheh5iHK/YPlELyDpQrEZyj2cxQUPUZ2w4cUiSE0Ta8PRQymSaG6u5zFsTODKYUC\n"\
|
||||
"AwEAAaOCAScwggEjMB0GA1UdDgQWBBROIlQgGJXm427mD/r6uRLtBhePOTAPBgNV\n"\
|
||||
"HRMBAf8EBTADAQH/MF8GA1UdIARYMFYwVAYEVR0gADBMMCMGCCsGAQUFBwIBFhdo\n"\
|
||||
"dHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEFBQcCAjAZDBdodHRwczovL2Qu\n"\
|
||||
"c3ltY2IuY29tL3JwYTAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vcy5zeW1jYi5j\n"\
|
||||
"b20vcGNhMy1nNS5jcmwwDgYDVR0PAQH/BAQDAgGGMC4GCCsGAQUFBwEBBCIwIDAe\n"\
|
||||
"BggrBgEFBQcwAYYSaHR0cDovL3Muc3ltY2QuY29tMB8GA1UdIwQYMBaAFH/TZafC\n"\
|
||||
"3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBCwUAA4IBAQBQ3dNWKSUBip6n5X1N\n"\
|
||||
"ua8bjKLSJzXlnescavPECMpFBlIIKH2mc6mL2Xr/wkSIBDrsqAO3sBcmoJN+n8V3\n"\
|
||||
"0O5JelrtEAFYSyRDXfu78ZlHn6kvV5/jPUFECEM/hdN0x8WdLpGjJMqfs0EG5qHj\n"\
|
||||
"+UaxpucWD445wea4zlK7hUR+MA8fq0Yd1HEKj4c8TcgaQIHMa4KHr448cQ69e3CP\n"\
|
||||
"ECRhRNg+RAKT2I7SlaVzLvaB/8yym2oMCEsoqiRT8dbXg35aKEYmmzn3O/mnB7bG\n"\
|
||||
"Ud/EUrkIf7FVamgYZd1fSzQeg1cHqf0ja6eHpvq2bTl+cWFHaq/84KlHe5Rh0Csm\n"\
|
||||
"pZzn\n"\
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
#endif // BINTRAY_CERTIFICATES_H
|
||||
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
**/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <HTTPClient.h>
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
#include "BintrayClient.h"
|
||||
#include "BintrayCertificates.h"
|
||||
|
||||
BintrayClient::BintrayClient(const String &user, const String &repository, const String &package)
|
||||
: m_user(user), m_repo(repository), m_package(package),
|
||||
m_storage_host("dl.bintray.com"),
|
||||
m_api_host("api.bintray.com")
|
||||
{
|
||||
m_certificates.emplace_back("cloudfront.net", CLOUDFRONT_API_ROOT_CA);
|
||||
m_certificates.emplace_back("akamai.bintray.com", BINTRAY_AKAMAI_ROOT_CA);
|
||||
m_certificates.emplace_back("bintray.com", BINTRAY_API_ROOT_CA);
|
||||
}
|
||||
|
||||
String BintrayClient::getUser() const
|
||||
{
|
||||
return m_user;
|
||||
}
|
||||
|
||||
String BintrayClient::getRepository() const
|
||||
{
|
||||
return m_repo;
|
||||
}
|
||||
|
||||
String BintrayClient::getPackage() const
|
||||
{
|
||||
return m_package;
|
||||
}
|
||||
|
||||
String BintrayClient::getStorageHost() const
|
||||
{
|
||||
return m_storage_host;
|
||||
}
|
||||
|
||||
String BintrayClient::getApiHost() const
|
||||
{
|
||||
return m_api_host;
|
||||
}
|
||||
|
||||
String BintrayClient::getLatestVersionRequestUrl() const
|
||||
{
|
||||
return String("https://") + getApiHost() + "/packages/" + getUser() + "/" + getRepository() + "/" + getPackage() + "/versions/_latest";
|
||||
}
|
||||
|
||||
String BintrayClient::getBinaryRequestUrl(const String &version) const
|
||||
{
|
||||
return String("https://") + getApiHost() + "/packages/" + getUser() + "/" + getRepository() + "/" + getPackage() + "/versions/" + version + "/files";
|
||||
}
|
||||
|
||||
const char *BintrayClient::getCertificate(const String &url) const
|
||||
{
|
||||
for(auto& cert: m_certificates) {
|
||||
if(url.indexOf(cert.first) >= 0) {
|
||||
return cert.second;
|
||||
}
|
||||
}
|
||||
|
||||
// Return the certificate for *.bintray.com by default
|
||||
return m_certificates.rbegin()->second;
|
||||
}
|
||||
|
||||
String BintrayClient::requestHTTPContent(const String &url) const
|
||||
{
|
||||
String payload;
|
||||
HTTPClient http;
|
||||
http.begin(url, getCertificate(url));
|
||||
int httpCode = http.GET();
|
||||
|
||||
if (httpCode > 0)
|
||||
{
|
||||
if (httpCode == HTTP_CODE_OK)
|
||||
{
|
||||
payload = http.getString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.printf("GET request failed, error: %s\n", http.errorToString(httpCode).c_str());
|
||||
}
|
||||
|
||||
http.end();
|
||||
return payload;
|
||||
}
|
||||
|
||||
String BintrayClient::getLatestVersion() const
|
||||
{
|
||||
String version;
|
||||
const String url = getLatestVersionRequestUrl();
|
||||
String jsonResult = requestHTTPContent(url);
|
||||
const size_t bufferSize = 1024;
|
||||
if (jsonResult.length() > bufferSize)
|
||||
{
|
||||
Serial.println("Error: Could parse JSON. Input data is too big!");
|
||||
return version;
|
||||
}
|
||||
StaticJsonBuffer<bufferSize> jsonBuffer;
|
||||
|
||||
JsonObject &root = jsonBuffer.parseObject(jsonResult.c_str());
|
||||
// Check for errors in parsing
|
||||
if (!root.success())
|
||||
{
|
||||
Serial.println("Error: Could not parse JSON!");
|
||||
return version;
|
||||
}
|
||||
return root.get<String>("name");
|
||||
}
|
||||
|
||||
String BintrayClient::getBinaryPath(const String &version) const
|
||||
{
|
||||
String path;
|
||||
const String url = getBinaryRequestUrl(version);
|
||||
String jsonResult = requestHTTPContent(url);
|
||||
|
||||
const size_t bufferSize = 1024;
|
||||
if (jsonResult.length() > bufferSize)
|
||||
{
|
||||
Serial.println("Error: Could parse JSON. Input data is too big!");
|
||||
return path;
|
||||
}
|
||||
StaticJsonBuffer<bufferSize> jsonBuffer;
|
||||
|
||||
JsonArray &root = jsonBuffer.parseArray(jsonResult.c_str());
|
||||
JsonObject &firstItem = root[0];
|
||||
if (!root.success())
|
||||
{ //Check for errors in parsing
|
||||
Serial.println("Error: Could not parse JSON!");
|
||||
return path;
|
||||
}
|
||||
return "/" + getUser() + "/" + getRepository() + "/" + firstItem.get<String>("path");
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
**/
|
||||
|
||||
#ifndef BINTRAY_CLIENT_H
|
||||
#define BINTRAY_CLIENT_H
|
||||
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#include <WString.h>
|
||||
|
||||
class BintrayClient {
|
||||
|
||||
public:
|
||||
BintrayClient(const String& user, const String& repository, const String& package);
|
||||
String getUser() const;
|
||||
String getRepository() const;
|
||||
String getPackage() const;
|
||||
String getStorageHost() const;
|
||||
String getApiHost() const;
|
||||
const char* getCertificate(const String& url) const;
|
||||
String getLatestVersion() const;
|
||||
String getBinaryPath(const String& version) const;
|
||||
|
||||
private:
|
||||
String requestHTTPContent(const String& url) const;
|
||||
String getLatestVersionRequestUrl() const;
|
||||
String getBinaryRequestUrl(const String& version) const;
|
||||
String m_user;
|
||||
String m_repo;
|
||||
String m_package;
|
||||
const String m_storage_host;
|
||||
const String m_api_host;
|
||||
std::vector<std::pair<String, const char*>> m_certificates;
|
||||
};
|
||||
|
||||
#endif // BINTRAY_CLIENT_H
|
||||
Reference in new issue
Block a user