View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0012113 | Taler | wallet (WebExtension) | public | 2026-11-11 02:27 | 2026-11-11 02:27 |
| Reporter | bot-cg [agent] | Assigned To | Resolution deadline | ||
| Implementer | Reviewer | ||||
| Release signed by | Deployed by | ||||
| Verifier | Communicator | CM_7 | |||
| Data protection authority notification required | No | ||||
| CSIRT notification required | No | ||||
| Estimated effort (hours) | Actual effort (hours) | 0 | |||
| Fast-track | No | ||||
| Work package | none | ||||
| Priority | normal | Severity | minor | Reproducibility | have not tried |
| Status | new | Resolution | open | ||
| Summary | 0012113: WebExtension: exchange without terms of service shows a "NULL" body and still offers "Accept terms" | ||||
| Description | For an exchange that publishes no terms of service, the WebExtension's terms page shows "Status: Terms unavailable" above a body that reads only "NULL", with "Save terms" and "Accept terms" buttons (before-web-1.png). "NULL" is wallet-core's placeholder: getExchangeTos answers {"tosStatus":"missing-tos","content":"NULL","currentEtag":"NULL",...} when GET /terms returns 404/501 (taler-wallet-core/src/exchanges.ts getExchangeTos). Accepting does nothing useful, and saving downloads a file containing "NULL". Same exchange on the other wallets: - iOS: "This payment service has not published any terms of service.", no Accept button (before-ios-1.png). - Android: currently shows "NULL" as well, because of a field-name bug filed as 0012112; with that patch it shows "Terms of service were not provided by payment service" without an Accept button (before-android-1.png, ref-android-12112-patched.png). Code (taler-typescript-core bf2e571a2): packages/wallet-webui/src/screens/TermsScreen.tsx:71-128 renders the content, Save and Accept for every status; exchangeTermsStatusLabel (:12-25) only maps missing-tos to the status line "Terms unavailable". Reproduction: an exchange whose /terms answers 404 (here exchange.demo.taler.net behind a local proxy at http://127.0.0.1:18091/ that answers 404 for /terms): Settings > Exchanges > add it > Review terms. Patch (web-terms-missing-tos.patch): when tosStatus is "missing-tos", TermsScreen shows a card "No terms published" (existing, already translated string) and "This exchange has not published any terms of service, so there is nothing to accept." instead of the status line, the "NULL" body, the language selector and the Save/Accept buttons. Withdrawals are not affected: the exchange gate already treats missing-tos like accepted (routes/exchange-gate-model.ts). Verified: wc-web build of the Chrome MV3 extension; after-web-1.png (same exchange), after-web-2-normal-terms.png (exchange.demo.taler.net: terms, Save and Accept unchanged). pnpm typecheck: same 29 pre-existing errors as origin/master, none in TermsScreen.tsx. Assisted by LLM | ||||
| Steps To Reproduce | Add an exchange whose /terms answers 404, open Settings > Exchanges > <exchange> > Review terms. | ||||
| Tags | No tags attached. | ||||
| Attached Files | web-terms-missing-tos.patch (1,512 bytes)
diff --git a/packages/wallet-webui/src/screens/TermsScreen.tsx b/packages/wallet-webui/src/screens/TermsScreen.tsx
index efcaee0f7..1873de302 100644
--- a/packages/wallet-webui/src/screens/TermsScreen.tsx
+++ b/packages/wallet-webui/src/screens/TermsScreen.tsx
@@ -40,6 +40,8 @@ export function TermsScreen(props: {
onSave: () => void;
onBack: () => void;
}) {
+ // wallet-core answers "missing-tos" with the placeholder body "NULL"
+ const missingTerms = props.status === "missing-tos";
const markdownTooLarge =
props.content !== undefined &&
isMarkdownContentType(props.contentType) &&
@@ -68,7 +70,15 @@ export function TermsScreen(props: {
</Card>
)}
{props.error && <ErrorCard error={props.error} />}
- {props.content !== undefined && (
+ {props.content !== undefined && missingTerms && (
+ <Card>
+ <h2 class="font-semibold">{i18n.str`No terms published`}</h2>
+ <p class="mt-2 text-secondary">{
+ /* Translators: An exchange is a GNU Taler service issuing and redeeming digital cash, not an action that converts one currency into another. */ i18n.str`This exchange has not published any terms of service, so there is nothing to accept.`
+ }</p>
+ </Card>
+ )}
+ {props.content !== undefined && !missingTerms && (
<>
<div class="flex flex-wrap items-center justify-between gap-3">
{/* Translators: %1$s is a localized exchange terms-of-service status. */}
| ||||
| related to | 0012112 | new | Android: ToS status decoded from "status" but wallet-core sends "tosStatus"; an exchange without terms shows "NULL" instead of "terms not provided" |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2026-11-11 02:27 | bot-cg | New Issue | |
| 2026-11-11 02:27 | bot-cg | Relationship added | related to 0012112 |
| 2026-11-11 02:27 | bot-cg | File Added: before-web-1.png | |
| 2026-11-11 02:27 | bot-cg | File Added: before-ios-1.png | |
| 2026-11-11 02:27 | bot-cg | File Added: before-android-1.png | |
| 2026-11-11 02:27 | bot-cg | File Added: ref-android-12112-patched.png | |
| 2026-11-11 02:27 | bot-cg | File Added: after-web-1.png | |
| 2026-11-11 02:27 | bot-cg | File Added: after-web-2-normal-terms.png | |
| 2026-11-11 02:27 | bot-cg | File Added: web-terms-missing-tos.patch |