Connections list: ntfy topics and webhook paths are printed in full, though the form says secret parts are masked #11
Labels
No labels
bug
documentation
enhancement
security
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo-apprise#11
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-09-29 in a read-only review of postulo-apprise at
7637d899d, runningAppriseNotifier.summary()from the snapshot against Apprise 1.13.1 for a range of services.Related to postulo/postulo#5.
The one-line description on Settings → Connections relies on Apprise to know which parts of a URL are secret. Apprise masks what it models as a password or token; it does not mask a path or an ntfy topic. For a custom webhook the path is often the whole credential, and on a public ntfy server the topic name is the only thing protecting the channel. Both are shown in clear, in a field the form describes as never shown again.
src/postulo_apprise/notifier.py:123-126(describe):masked = server.url(privacy=True).split("?", 1)[0].rstrip("/"). The promise is in the help text atsrc/postulo_apprise/notifier.py:147-149and inREADME.md:49-52; the core's contract forsummaryasks for "every secret part masked" (plugins/base.py:714-715).tests/test_apprise.py:270asserts that the topic is on the page.ntfy://ntfy.sh/my-private-topic,json://hooks.example.org/services/T000/B000/secretpathandmailto://me:pw@example.org,summary()returnsntfy ntfy://ntfy.sh/my-private-topic · JSON json://hooks.example.org/services/T000/B000/secretpath · E-Mail mailto://me:****@example.org. The same holds forxml://andform://paths, for the topic-only formntfy://topic(shown asntfys://topic), and for the phone numbers of asignal://line. Tokens Apprise models are masked as intended (tgram://1...1/987654,gotify://host/a...n), and anything in the query string is cut.ConnectionListViewis narrowed to the signed-in person). The exposure is the owner's own screen: the value is rendered on every visit to the connections page, so it is in a shared screen, a screenshot attached to a bug report, or a page left open, after the person was told it would not be shown back.hostthere (server.mode == "cloud"): show the service name alone, orntfy.sh. For hosted services (Telegram, Discord, Pushover) the service name is enough. Reword the help text and the README to say what is shown, and change the test to assert that the topic is absent.Done when
tests/test_apprise.pyasserts thatsummary()for an ntfy line with a server, an ntfy line with a topic only, and ajson://line with a path contains the service names and hosts and none of the topic or path. It fails today.test_the_connection_form_keeps_the_urls_secret_and_the_list_masks_themasserts thatpostulo(the topic) is not in the list page.Fixed by pull request #23.