From 26f94baf805664af8319a5842d9df8e765cfabb5 Mon Sep 17 00:00:00 2001 From: majakomel Date: Thu, 23 Apr 2026 17:55:19 +0200 Subject: [PATCH] Don't load raw measurement with measurement meta --- .../measurement/nettests/FacebookMessenger.js | 14 ++- .../nettests/HTTPHeaderFieldManipulation.js | 14 +-- .../nettests/HTTPInvalidRequestLine.js | 9 +- components/measurement/nettests/Psiphon.js | 8 +- components/measurement/nettests/Signal.js | 12 +- .../measurement/nettests/TorSnowflake.js | 4 +- .../measurement/nettests/WebConnectivity.js | 111 +++++++++--------- components/measurement/nettests/WhatsApp.js | 2 +- pages/m/[measurement_uid].js | 2 +- 9 files changed, 77 insertions(+), 99 deletions(-) diff --git a/components/measurement/nettests/FacebookMessenger.js b/components/measurement/nettests/FacebookMessenger.js index ab91414d2..a6fb17921 100644 --- a/components/measurement/nettests/FacebookMessenger.js +++ b/components/measurement/nettests/FacebookMessenger.js @@ -5,13 +5,15 @@ import { DetailsBox } from '../DetailsBox' import StatusInfo from '../StatusInfo' import { formatTwoTuple } from 'utils' -export const FacebookMessengerDetails = ({ measurement, render }) => { +export const FacebookMessengerDetails = ({ measurement, render, isAnomaly, isFailure, isConfirmed, scores }) => { const intl = useIntl() - const testKeys = measurement.test_keys - const isWorking = - testKeys.facebook_dns_blocking === false && - testKeys.facebook_tcp_blocking === false - const dnsBlocking = testKeys.facebook_dns_blocking === true + console.log("scores", scores) + const testKeys = measurement?.test_keys ?? {} + const isWorking = !isAnomaly && !isFailure && !isConfirmed + // testKeys.facebook_dns_blocking === false && + // testKeys.facebook_tcp_blocking === false + const dnsBlocking = scores?.facebook_dns_blocking === true + // testKeys.facebook_dns_blocking === true const tcpBlocking = testKeys.facebook_tcp_blocking === true const tcpConnections = testKeys.tcp_connect diff --git a/components/measurement/nettests/HTTPHeaderFieldManipulation.js b/components/measurement/nettests/HTTPHeaderFieldManipulation.js index c1f8b5b44..d16f10e5e 100644 --- a/components/measurement/nettests/HTTPHeaderFieldManipulation.js +++ b/components/measurement/nettests/HTTPHeaderFieldManipulation.js @@ -1,19 +1,7 @@ import { defineMessages, useIntl } from 'react-intl' -export const HttpHeaderFieldManipulationDetails = ({ measurement, render }) => { +export const HttpHeaderFieldManipulationDetails = ({ measurement, render, isAnomaly }) => { const intl = useIntl() - const testKeys = measurement.test_keys - let isAnomaly = false - let isFailed = true - const tampering = testKeys?.tampering || {} - for (const key of Object.keys(tampering)) { - if (tampering[key] === true) { - isAnomaly = true - } - if (tampering[key] !== null) { - isFailed = false - } - } const messages = defineMessages({ middleboxes: { diff --git a/components/measurement/nettests/HTTPInvalidRequestLine.js b/components/measurement/nettests/HTTPInvalidRequestLine.js index 69653f1c6..9dd6d2969 100644 --- a/components/measurement/nettests/HTTPInvalidRequestLine.js +++ b/components/measurement/nettests/HTTPInvalidRequestLine.js @@ -1,11 +1,10 @@ import PropTypes from 'prop-types' import { FormattedMessage, defineMessages } from 'react-intl' -const HttpInvalidRequestLineDetails = ({ measurement, render }) => { - const testKeys = measurement.test_keys - const isAnomaly = testKeys.tampering === true - const isOK = testKeys.tampering === false - const isFailed = testKeys.tampering === null +const HttpInvalidRequestLineDetails = ({ measurement, render, isAnomaly, isFailure, isConfirmed, scores }) => { + const testKeys = measurement?.test_keys ?? {} + const isOK = !isAnomaly && !isFailure && !isConfirmed + const isFailed = isFailure const sentMessages = testKeys.sent const receivedMessages = testKeys.received diff --git a/components/measurement/nettests/Psiphon.js b/components/measurement/nettests/Psiphon.js index ec2566f14..6992d494a 100644 --- a/components/measurement/nettests/Psiphon.js +++ b/components/measurement/nettests/Psiphon.js @@ -4,10 +4,8 @@ import { FormattedMessage, defineMessages } from 'react-intl' import AccessPointStatus from '../AccessPointStatus' -const PsiphonDetails = ({ measurement, render }) => { - const { - test_keys: { failure, bootstrap_time }, - } = measurement +const PsiphonDetails = ({ measurement, isAnomaly, render }) => { + const { bootstrap_time } = measurement?.test_keys ?? {} const messages = defineMessages({ reachable: { @@ -27,7 +25,7 @@ const PsiphonDetails = ({ measurement, render }) => { // https://github.com/ooni/spec/blob/master/nettests/ts-015-psiphon.md#possible-conclusions // Determine if psiphon is blocked and if the probe could bootstrap psiphon - if (failure) { + if (isAnomaly) { status = 'anomaly' metaText = messages.unReachable if (bootstrap_time === 0) { diff --git a/components/measurement/nettests/Signal.js b/components/measurement/nettests/Signal.js index 20c6d5660..f6850d8c1 100644 --- a/components/measurement/nettests/Signal.js +++ b/components/measurement/nettests/Signal.js @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types' import { defineMessages, useIntl } from 'react-intl' const messages = defineMessages({ @@ -16,11 +15,9 @@ const messages = defineMessages({ }, }) -const SignalDetails = ({ measurement, render }) => { +const SignalDetails = ({ measurement, render, isAnomaly, isFailure, isConfirmed, scores }) => { const intl = useIntl() - const testKeys = measurement.test_keys - const { signal_backend_status, signal_backend_failure } = testKeys - const anomaly = signal_backend_status === 'blocked' + const anomaly = isAnomaly let hint = intl.formatMessage({ id: 'Measurement.Status.Hint.Signal.Reachable', @@ -45,9 +42,4 @@ const SignalDetails = ({ measurement, render }) => { }) } -SignalDetails.propTypes = { - measurement: PropTypes.object.isRequired, - render: PropTypes.func, -} - export default SignalDetails diff --git a/components/measurement/nettests/TorSnowflake.js b/components/measurement/nettests/TorSnowflake.js index 4cca1c228..3d7c944a3 100644 --- a/components/measurement/nettests/TorSnowflake.js +++ b/components/measurement/nettests/TorSnowflake.js @@ -20,9 +20,7 @@ const messages = defineMessages({ }) const TorSnowflakeDetails = ({ isAnomaly, isFailure, measurement, render }) => { - const { - test_keys: { bootstrap_time, failure }, - } = measurement + const { bootstrap_time, failure } = measurement?.test_keys ?? {} let status let hint diff --git a/components/measurement/nettests/WebConnectivity.js b/components/measurement/nettests/WebConnectivity.js index 9dcfd8998..5eda70f2f 100644 --- a/components/measurement/nettests/WebConnectivity.js +++ b/components/measurement/nettests/WebConnectivity.js @@ -247,8 +247,8 @@ const validateMeasurement = (measurement) => { }, }, test_keys: { - accessible: undefined, - blocking: undefined, + // accessible: undefined, + // blocking: undefined, queries: undefined, tcp_connect: undefined, requests: undefined, @@ -368,7 +368,7 @@ const WebConnectivityDetails = ({ ) } else if (isAnomaly) { status = 'anomaly' - const blockingReason = blocking ?? scores?.analysis?.blocking_type ?? null + const blockingReason = scores?.analysis?.blocking_type ?? null reason = messages[`blockingReason.${blockingReason}`] && intl.formatMessage(messages[`blockingReason.${blockingReason}`]) @@ -404,7 +404,7 @@ const WebConnectivityDetails = ({ reason, }, ) - } else if (accessible) { + } else { status = 'reachable' summaryText = ( , - network: probe_asn, - country, - }} - /> - ) - headMetadata.message = intl.formatMessage( - { - id: 'Measurement.Metadata.WebConnectivity.Down', - defaultMessage: '{hostname} was down in {country}', - }, - { - date, - hostname, - country, - }, - ) - } else { - // Fallback condition to handle older measurements not present in fastpath - // See: https://github.com/ooni/explorer/issues/426#issuecomment-612094244 - status = 'error' - summaryText = ( - , - network: probe_asn, - country, - }} - /> - ) - headMetadata.message = intl.formatMessage( - { - id: 'Measurement.Metadata.WebConnectivity.Failed', - defaultMessage: '{hostname} failed to be measured in {country}', - }, - { - date, - hostname, - country, - }, - ) } + // else if (blocking === false) { + // // When not accessible, but also not blocking, it must be down + // status = 'down' + // summaryText = ( + // , + // network: probe_asn, + // country, + // }} + // /> + // ) + // headMetadata.message = intl.formatMessage( + // { + // id: 'Measurement.Metadata.WebConnectivity.Down', + // defaultMessage: '{hostname} was down in {country}', + // }, + // { + // date, + // hostname, + // country, + // }, + // ) + // } else { + // // Fallback condition to handle older measurements not present in fastpath + // // See: https://github.com/ooni/explorer/issues/426#issuecomment-612094244 + // status = 'error' + // summaryText = ( + // , + // network: probe_asn, + // country, + // }} + // /> + // ) + // headMetadata.message = intl.formatMessage( + // { + // id: 'Measurement.Metadata.WebConnectivity.Failed', + // defaultMessage: '{hostname} failed to be measured in {country}', + // }, + // { + // date, + // hostname, + // country, + // }, + // ) + // } const tcpConnections = Array.isArray(tcp_connect) ? tcp_connect.map((connection) => { diff --git a/components/measurement/nettests/WhatsApp.js b/components/measurement/nettests/WhatsApp.js index a04584877..b83534cbb 100644 --- a/components/measurement/nettests/WhatsApp.js +++ b/components/measurement/nettests/WhatsApp.js @@ -6,7 +6,7 @@ import { DetailsBox } from '../DetailsBox' import { formatTwoTuple } from 'utils' const WhatsAppDetails = ({ isAnomaly, scores, measurement, render }) => { - const testKeys = measurement.test_keys + const testKeys = measurement?.test_keys ?? {} const tcp_connect = testKeys.tcp_connect let registrationServerAccessible let webAccessible diff --git a/pages/m/[measurement_uid].js b/pages/m/[measurement_uid].js index e946b0b16..473a9555c 100644 --- a/pages/m/[measurement_uid].js +++ b/pages/m/[measurement_uid].js @@ -128,7 +128,7 @@ const Measurement = ({ error, isValidating: isLoadingMeasurementData, } = useSWR( - `${process.env.NEXT_PUBLIC_OONI_API}/api/v1/measurement_meta?measurement_uid=${measurementUid}&full=true`, + `${process.env.NEXT_PUBLIC_OONI_API}/api/v1/measurement_meta?measurement_uid=${measurementUid}`, measurementFetcher, { revalidateOnFocus: false,