Verification tweaks (#4234)

* Prioritize CSP over GTM error in case both detected

* Outline better message for persistent headless timeout

* Bump headless waiting times slightly

* Add generic type of error

For known cases, that we rather not reveal much
details about.

* Add the malformed script tag case
This commit is contained in:
hq1 2024-06-18 05:58:56 +02:00 committed by GitHub
parent 2eed1fd913
commit 1c820ba2af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 101 additions and 8 deletions

View File

@ -50,6 +50,13 @@ defmodule Plausible.Verification.Diagnostics do
%Result{ok?: true} %Result{ok?: true}
end end
def interpret(
%__MODULE__{plausible_installed?: false, gtm_likely?: true, disallowed_via_csp?: true},
_url
) do
error(@errors.csp)
end
def interpret( def interpret(
%__MODULE__{plausible_installed?: false, gtm_likely?: true, cookie_banner_likely?: true}, %__MODULE__{plausible_installed?: false, gtm_likely?: true, cookie_banner_likely?: true},
_url _url
@ -87,6 +94,21 @@ defmodule Plausible.Verification.Diagnostics do
error(@errors.no_snippet) error(@errors.no_snippet)
end end
def interpret(
%__MODULE__{
plausible_installed?: true,
snippets_found_in_head: 0,
snippets_found_in_body: 0,
body_fetched?: true,
gtm_likely?: false,
callback_status: callback_status
},
_url
)
when is_integer(callback_status) and callback_status > 202 do
error(@errors.no_snippet)
end
def interpret( def interpret(
%__MODULE__{ %__MODULE__{
plausible_installed?: false, plausible_installed?: false,
@ -111,6 +133,16 @@ defmodule Plausible.Verification.Diagnostics do
error(@errors.unreachable) error(@errors.unreachable)
end end
def interpret(
%__MODULE__{
plausible_installed?: false,
service_error: :timeout
},
_url
) do
error(@errors.generic)
end
def interpret( def interpret(
%__MODULE__{ %__MODULE__{
plausible_installed?: false, plausible_installed?: false,
@ -141,7 +173,7 @@ defmodule Plausible.Verification.Diagnostics do
}, },
_url _url
) do ) do
error(@errors.old_script) error(@errors.generic)
end end
def interpret( def interpret(

View File

@ -46,12 +46,12 @@ defmodule Plausible.Verification.Errors do
url: url:
"https://plausible.io/docs/troubleshoot-integration#how-to-manually-check-your-integration" "https://plausible.io/docs/troubleshoot-integration#how-to-manually-check-your-integration"
}, },
old_script: %{ generic: %{
message: "We couldn't verify your website", message: "We couldn't automatically verify your website",
recommendation: recommendation:
"You're running an older version of our script so we cannot verify it automatically. Please update to the latest script", "Please manually check your integration by following the instructions provided",
url: url:
"https://plausible.io/docs/troubleshoot-integration#are-you-using-an-older-version-of-our-script" "https://plausible.io/docs/troubleshoot-integration#how-to-manually-check-your-integration"
}, },
old_script_wp_no_plugin: %{ old_script_wp_no_plugin: %{
message: "We couldn't verify your website", message: "We couldn't verify your website",

View File

@ -8,7 +8,7 @@ export default async function({ page, context }) {
await page.goto(context.url); await page.goto(context.url);
try { try {
await page.waitForFunction('window.plausible', { timeout: 4000 }); await page.waitForFunction('window.plausible', { timeout: 5000 });
await page.evaluate(() => { await page.evaluate(() => {
window.__plausible = true; window.__plausible = true;
window.plausible('verification-agent-test', { window.plausible('verification-agent-test', {
@ -19,7 +19,7 @@ export default async function({ page, context }) {
}); });
try { try {
await page.waitForFunction('window.plausibleCallbackResult', { timeout: 3000 }); await page.waitForFunction('window.plausibleCallbackResult', { timeout: 5000 });
const status = await page.evaluate(() => { return window.plausibleCallbackResult() }); const status = await page.evaluate(() => { return window.plausibleCallbackResult() });
return { data: { plausibleInstalled: true, callbackStatus: status } }; return { data: { plausibleInstalled: true, callbackStatus: status } };
} catch ({ err, message }) { } catch ({ err, message }) {

View File

@ -524,6 +524,21 @@ defmodule Plausible.Verification.ChecksTest do
</html> </html>
""" """
test "disallowd via content-security-policy and GTM should make CSP a priority" do
stub_fetch_body(fn conn ->
conn
|> put_resp_header("content-security-policy", "default-src 'self' foo.local")
|> put_resp_content_type("text/html")
|> send_resp(200, @gtm_body)
end)
stub_installation(200, plausible_installed(false))
run_checks()
|> Checks.interpret_diagnostics()
|> assert_error(@errors.csp)
end
test "detecting gtm" do test "detecting gtm" do
stub_fetch_body(200, @gtm_body) stub_fetch_body(200, @gtm_body)
stub_installation(200, plausible_installed(false)) stub_installation(200, plausible_installed(false))
@ -689,7 +704,7 @@ defmodule Plausible.Verification.ChecksTest do
run_checks() run_checks()
|> Checks.interpret_diagnostics() |> Checks.interpret_diagnostics()
|> assert_error(@errors.old_script) |> assert_error(@errors.generic)
end end
test "callback handling not found for wordpress site" do test "callback handling not found for wordpress site" do
@ -773,6 +788,52 @@ defmodule Plausible.Verification.ChecksTest do
|> interpret_sentry_case() |> interpret_sentry_case()
|> assert_error(@errors.old_script_wp_no_plugin) |> assert_error(@errors.old_script_wp_no_plugin)
end end
test "service timeout" do
%Plausible.Verification.Diagnostics{
plausible_installed?: false,
snippets_found_in_head: 1,
snippets_found_in_body: 0,
snippet_found_after_busting_cache?: false,
snippet_unknown_attributes?: false,
disallowed_via_csp?: false,
service_error: :timeout,
body_fetched?: true,
wordpress_likely?: true,
cookie_banner_likely?: false,
gtm_likely?: false,
callback_status: 0,
proxy_likely?: true,
manual_script_extension?: false,
data_domain_mismatch?: false,
wordpress_plugin?: false
}
|> interpret_sentry_case()
|> assert_error(@errors.generic)
end
test "malformed snippet code, that headless somewhat accepts" do
%Plausible.Verification.Diagnostics{
plausible_installed?: true,
snippets_found_in_head: 0,
snippets_found_in_body: 0,
snippet_found_after_busting_cache?: false,
snippet_unknown_attributes?: false,
disallowed_via_csp?: false,
service_error: nil,
body_fetched?: true,
wordpress_likely?: false,
cookie_banner_likely?: false,
gtm_likely?: false,
callback_status: 405,
proxy_likely?: false,
manual_script_extension?: false,
data_domain_mismatch?: false,
wordpress_plugin?: false
}
|> interpret_sentry_case()
|> assert_error(@errors.no_snippet)
end
end end
defp interpret_sentry_case(diagnostics) do defp interpret_sentry_case(diagnostics) do