From edba2d2829db3b9788e7fc96a9dfeb40bf067326 Mon Sep 17 00:00:00 2001 From: Jeroen Vogelpoel Date: Fri, 8 Jul 2016 04:07:21 +0200 Subject: [PATCH] Exposed sketch MD5 through HTTP headers (#2236) * Exposed sketch MD5 through HTTP headers * Updated spacing, docs, example --- doc/ota_updates/readme.md | 26 ++++++++++++------- .../src/ESP8266httpUpdate.cpp | 1 + 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/doc/ota_updates/readme.md b/doc/ota_updates/readme.md index d3462f8bd..39c583258 100644 --- a/doc/ota_updates/readme.md +++ b/doc/ota_updates/readme.md @@ -371,6 +371,7 @@ Example header data: [HTTP_X_ESP8266_AP_MAC] => 1A:FE:AA:AA:AA:AA [HTTP_X_ESP8266_FREE_SPACE] => 671744 [HTTP_X_ESP8266_SKETCH_SIZE] => 373940 + [HTTP_X_ESP8266_SKETCH_MD5] => a56f8ef78a0bebd812f62067daf1408a [HTTP_X_ESP8266_CHIP_SIZE] => 4194304 [HTTP_X_ESP8266_SDK_VERSION] => 1.3.0 [HTTP_X_ESP8266_VERSION] => DOOR-7-g14f53a19 @@ -415,9 +416,9 @@ if( !check_header('HTTP_X_ESP8266_AP_MAC') || !check_header('HTTP_X_ESP8266_FREE_SPACE') || !check_header('HTTP_X_ESP8266_SKETCH_SIZE') || + !check_header('HTTP_X_ESP8266_SKETCH_MD5') || !check_header('HTTP_X_ESP8266_CHIP_SIZE') || - !check_header('HTTP_X_ESP8266_SDK_VERSION') || - !check_header('HTTP_X_ESP8266_VERSION') + !check_header('HTTP_X_ESP8266_SDK_VERSION') ) { header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403); echo "only for ESP8266 updater! (header)\n"; @@ -429,13 +430,20 @@ $db = array( "18:FE:AA:AA:AA:BB" => "TEMP-1.0.0" ); -if(isset($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']])) { - if($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']] != $_SERVER['HTTP_X_ESP8266_VERSION']) { - sendFile("./bin/".$db[$_SERVER['HTTP_X_ESP8266_STA_MAC']]."bin"); - } else { - header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304); - } - exit(); +if(!isset($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']])) { + header($_SERVER["SERVER_PROTOCOL"].' 500 ESP MAC not configured for updates', true, 500); +} + +$localBinary = "./bin/".$db[$_SERVER['HTTP_X_ESP8266_STA_MAC']].".bin"; + +// Check if version has been set and does not match, if not, check if +// MD5 hash between local binary and ESP8266 binary do not match if not. +// then no update has been found. +if((!check_header('HTTP_X_ESP8266_SDK_VERSION') && $db[$_SERVER['HTTP_X_ESP8266_STA_MAC']] != $_SERVER['HTTP_X_ESP8266_VERSION']) + || $_SERVER["HTTP_X_ESP8266_SKETCH_MD5"] != md5_file($localBinary)) { + sendFile($localBinary); +} else { + header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304); } header($_SERVER["SERVER_PROTOCOL"].' 500 no version for ESP MAC', true, 500); diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index c4dc84164..ddebe5b6e 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -175,6 +175,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String& http.addHeader(F("x-ESP8266-AP-MAC"), WiFi.softAPmacAddress()); http.addHeader(F("x-ESP8266-free-space"), String(ESP.getFreeSketchSpace())); http.addHeader(F("x-ESP8266-sketch-size"), String(ESP.getSketchSize())); + http.addHeader(F("x-ESP8266-sketch-md5"), String(ESP.getSketchMD5())); http.addHeader(F("x-ESP8266-chip-size"), String(ESP.getFlashChipRealSize())); http.addHeader(F("x-ESP8266-sdk-version"), ESP.getSdkVersion());