fix(earthquakes): reject malformed feature properties

This commit is contained in:
Sameh Khamis committed 2026-09-10 19:56:01 -07:00
1 parent c390724bc0
commit ac3926c7db
4 files changed
+18

No files matched your search

+2
View File
@@ -4,6 +4,8 @@
Earthquake refreshes validate the complete feed and construct replacement entities before clearing the previous snapshot. Malformed rows and duplicate rendered IDs retain the last good entities, overlays, count and timestamp and report a malformed response; unknown magnitude is excluded from M2.5+ rendering. Earthquake refreshes validate the complete feed and construct replacement entities before clearing the previous snapshot. Malformed rows and duplicate rendered IDs retain the last good entities, overlays, count and timestamp and report a malformed response; unknown magnitude is excluded from M2.5+ rendering.
Non-object or array-valued properties reject the response instead of being treated as an unknown magnitude.
This changelog records public product changes. For the authoritative description This changelog records public product changes. For the authoritative description
of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md). of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md).
+2
View File
@@ -4,6 +4,8 @@
Earthquake refreshes validate the complete feed and construct replacement entities before clearing the previous snapshot. Malformed rows and duplicate rendered IDs retain the last good entities, overlays, count and timestamp and report a malformed response; unknown magnitude is excluded from M2.5+ rendering. Earthquake refreshes validate the complete feed and construct replacement entities before clearing the previous snapshot. Malformed rows and duplicate rendered IDs retain the last good entities, overlays, count and timestamp and report a malformed response; unknown magnitude is excluded from M2.5+ rendering.
Non-object or array-valued properties reject the response instead of being treated as an unknown magnitude.
Updated: August 24, 2026 Updated: August 24, 2026
## Installations and map-source guidance ## Installations and map-source guidance
+1
View File
@@ -130,6 +130,7 @@ export function normalizeEarthquakeSnapshot(geojson) {
const coordinates = feature?.geometry?.coordinates; const coordinates = feature?.geometry?.coordinates;
const properties = feature?.properties; const properties = feature?.properties;
if (!Array.isArray(coordinates) || coordinates.length < 2 || !properties if (!Array.isArray(coordinates) || coordinates.length < 2 || !properties
|| typeof properties !== 'object' || Array.isArray(properties)
|| (feature.geometry.type != null && feature.geometry.type !== 'Point')) return null; || (feature.geometry.type != null && feature.geometry.type !== 'Point')) return null;
const [lon, lat, depthKm] = coordinates; const [lon, lat, depthKm] = coordinates;
const mag = properties.mag; const mag = properties.mag;
+13
View File
@@ -359,6 +359,19 @@ test('malformed earthquake refresh preserves entities, overlays, count and times
assert.equal(await layer.update(viewer), true); assert.equal(await layer.update(viewer), true);
const entity = dataSources[0].entities.values[0]; const entity = dataSources[0].entities.values[0];
const stats = layer.getStats(); const stats = layer.getStats();
for (const properties of ['invalid', 123, [], true]) {
const bad = { ...good, id: 'bad-properties', properties };
for (const features of [[bad], [good, bad]]) {
respond(features);
assert.equal(await layer.update(viewer), false);
assert.equal(dataSources[0].entities.values.length, 1);
assert.equal(dataSources[0].entities.values[0], entity);
assert.equal(layer.getStats().count, stats.count);
assert.equal(layer.getStats().lastUpdate, stats.lastUpdate);
assert.equal(layer.getStats().error, 'Malformed USGS response');
assert.equal(publications.length, 1);
}
}
for (const bad of [null, { ...good, geometry: null }, for (const bad of [null, { ...good, geometry: null },
{ ...good, geometry: { type: 'LineString', coordinates: [1, 2] } }, { ...good, geometry: { type: 'LineString', coordinates: [1, 2] } },
{ ...good, geometry: { coordinates: [181, 20] } }, { ...good, geometry: { coordinates: [181, 20] } },