Skip to content

Commit

Permalink
Close #365: page_software_update: Handle empty response on /firmwareu…
Browse files Browse the repository at this point in the history
…pate request (#366)

* [#365] page_software_update: remove handling of alpha version

* [#365] scripts/http_server_auth.py: Add support for handling /firmwareupdate, /firmwareupdate_beta, /firmwareupdate_not_exist, /firmwareupdate_empty

* [#365] scripts/ruuvi_gw_http_server.py: add simulation of empty response on validation of firmware update URL

* Close #365: page_software_update: Handle empty response on /firmwareupate request
  • Loading branch information
TheSomeMan authored Dec 28, 2023
1 parent a88d46e commit b08b1a5
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 15 deletions.
86 changes: 86 additions & 0 deletions scripts/http_server_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,93 @@ def _do_GET(self, use_auth):
resp += content.encode('ascii')
self.wfile.write(resp)

def handle_firmware_update(self):
resp = b''
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
resp += f'Content-type: application/json\r\n'.encode('ascii')
resp += f'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r\n'.encode('ascii')
resp += f'Pragma: no-cache\r\n'.encode('ascii')
resp += f'\r\n'.encode('ascii')
content = '''
{
"latest": {
"version": "v1.14.3",
"url": "https://fwupdate.ruuvi.com/v1.14.3",
"created_at": "2023-10-06T11:26:07Z"
}
}
'''
resp += content.encode('ascii')
self.wfile.write(resp)

def handle_firmware_update_beta(self):
resp = b''
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
resp += f'Content-type: application/json\r\n'.encode('ascii')
resp += f'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r\n'.encode('ascii')
resp += f'Pragma: no-cache\r\n'.encode('ascii')
resp += f'\r\n'.encode('ascii')
content = '''
{
"latest": {
"version": "v1.14.3",
"url": "https://fwupdate.ruuvi.com/v1.14.3",
"created_at": "2023-10-06T11:26:07Z"
},
"beta": {
"version": "v1.14.2",
"url": "https://github.com/ruuvi/ruuvi.gateway_esp.c/releases/download/v1.14.2",
"created_at": "2023-09-19T11:16:48Z"
}
}
'''
resp += content.encode('ascii')
self.wfile.write(resp)

def handle_firmware_update_not_exist(self):
resp = b''
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
resp += f'Content-type: application/json\r\n'.encode('ascii')
resp += f'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r\n'.encode('ascii')
resp += f'Pragma: no-cache\r\n'.encode('ascii')
resp += f'\r\n'.encode('ascii')
content = '''
{
"latest": {
"version": "v1.14.9",
"url": "https://fwupdate.ruuvi.com/v1.14.9",
"created_at": "2023-09-19T11:16:48Z"
}
}
'''
resp += content.encode('ascii')
self.wfile.write(resp)

def handle_firmware_update_empty(self):
resp = b''
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
resp += f'Content-type: application/json\r\n'.encode('ascii')
resp += f'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r\n'.encode('ascii')
resp += f'Pragma: no-cache\r\n'.encode('ascii')
resp += f'\r\n'.encode('ascii')
content = '{ "latest": { "version": "", "url": "", "created_at": "" } }'
resp += content.encode('ascii')
self.wfile.write(resp)

def do_GET(self):
print('GET %s' % self.path)
if self.path == '/firmwareupdate':
self.handle_firmware_update()
return
if self.path == '/firmwareupdate_beta':
self.handle_firmware_update_beta()
return
if self.path == '/firmwareupdate_not_exist':
self.handle_firmware_update_not_exist()
return
if self.path == '/firmwareupdate_empty':
self.handle_firmware_update_empty()
return
if self._auth is None:
self._do_GET(False)
else:
Expand Down
35 changes: 24 additions & 11 deletions scripts/ruuvi_gw_http_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,6 @@
"version": "v1.16.0",
"url": "https://github.com/ruuvi/ruuvi.gateway_esp.c/releases/download/v1.16.0/",
"created_at": "2023-03-15T14:54:34Z"
},
"alpha": {
"version": "1031",
"url": "https://jenkins.ruuvi.com/job/ruuvi_gateway_esp-PR/1031/artifact/build/"
}
}
'''
Expand All @@ -220,10 +216,6 @@
"url":"https://fwupdate2.ruuvi.com/v1.15.1q",
"created_at":"2023-12-10T14:54:34Z"
},
"alpha":{
"version":"1056",
"url":"https://jenkins.ruuvi.com/job/ruuvi_gateway_esp-PR/1056/artifact/build/"
},
"beta":{
"version":"v1.15.2",
"url":"https://github.com/ruuvi/ruuvi.gateway_esp.c/releases/download/v1.15.2",
Expand Down Expand Up @@ -1512,6 +1504,9 @@ def _validate_url_check_check_fw_update_url(self, url):
return self._resp_200_json_validate_url_status(404, "{\\\"message\\\":\\\"Not Found\\\"}" )
elif url == 'https://network.ruuvi2.com/firmwareupdate':
return self._resp_200_json_validate_url_status(502, "Failed to resolve hostname")
elif url == 'https://network.ruuvi.com/firmwareupdate_empty':
return self._resp_200_json_validate_url_status(200, json='{ "latest": { "version": "", "url": "", "created_at": "" } }' )

return self._resp_200_json_validate_url_status(400, "Error description")

def _validate_url(self, url_with_params):
Expand Down Expand Up @@ -1695,10 +1690,28 @@ def _do_get_status_json(self, resp):
self.wfile.write(resp)

def _do_get_firmware_update_json(self):
content = g_content_firmware_update_json
time.sleep(GET_FIRMWARE_UPDATE_TIMEOUT)
resp = b''
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
fw_update_url = g_ruuvi_dict['fw_update_url']
if fw_update_url == 'https://network.ruuvi.com/firmwareupdate':
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
content = g_content_firmware_update_json
elif fw_update_url == 'https://network2.ruuvi.com/firmwareupdate':
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
content = g_content_firmware_update_json2
elif fw_update_url == 'https://network.ruuvi.com/firmwareupdate2':
resp += f'HTTP/1.0 404 Not Found\r\n'.encode('ascii')
content = ''
elif fw_update_url == 'https://network.ruuvi2.com/firmwareupdate':
resp += f'HTTP/1.0 502 Bad Gateway\r\n'.encode('ascii')
content = ''
elif fw_update_url == 'https://network.ruuvi.com/firmwareupdate_empty':
resp += f'HTTP/1.0 200 OK\r\n'.encode('ascii')
content = '{ "latest": { "version": "", "url": "", "created_at": "" } }'
else:
resp += f'HTTP/1.0 400 Bad Request\r\n'.encode('ascii')
content = ''

time.sleep(GET_FIRMWARE_UPDATE_TIMEOUT)
resp += f'Content-type: application/json; charset=utf-8\r\n'.encode('ascii')
resp += f'Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r\n'.encode('ascii')
resp += f'Pragma: no-cache\r\n'.encode('ascii')
Expand Down
17 changes: 13 additions & 4 deletions src/page_software_update.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -203,17 +203,26 @@ class PageSoftwareUpdate {
}

#on_get_latest_release_info (data) {
const { latest = {}, beta = {}, alpha = {} } = data
const { latest = {}, beta = {} } = data
if (!('version' in latest) || !('url' in latest)) {
console.warn("'latest' object should have 'version' and 'url' properties")
return false
this.#input_fw_update_server_url.setInvalid()
this.#text_fw_update_status_error_desc.setVal('Firmware update info is empty')
this.#div_fw_update_status_error.show()
throw new Error("Server returned incorrect firmware update info")
}
if ((latest.version === '') || (latest.url === '')) {
console.warn("latest.version and latest.url should not be empty")
this.#input_fw_update_server_url.setInvalid()
this.#text_fw_update_status_error_desc.setVal('Firmware update URL is empty or version is empty')
this.#div_fw_update_status_error.show()
this.#sect_advanced.enable()
throw new Error("Server returned incorrect firmware update info")
}
this.#latest_version = latest.version
this.#latest_url = latest.url
const beta_version = beta?.version
const beta_url = beta?.url
const alpha_version = alpha?.version
const alpha_url = alpha?.url

let m = this.#latest_version.match(/v(\d+)\.(\d+)\.(\d+)/)
this.#flagLatestFirmwareVersionSupported = false
Expand Down

0 comments on commit b08b1a5

Please sign in to comment.