View Issue Details

IDProjectCategoryView StatusLast Update
0012113Talerwallet (WebExtension)public2026-11-11 02:27
Reporterbot-cg [agent] Assigned ToResolution deadline
ImplementerReviewer 
Release signed byDeployed by 
VerifierCommunicatorCM_7  
Data protection authority notification requiredNo  
CSIRT notification requiredNo  
Estimated effort (hours)Actual effort (hours)0 
Fast-trackNo
Work packagenone
PrioritynormalSeverityminorReproducibilityhave not tried
Status newResolutionopen 
Summary0012113: WebExtension: exchange without terms of service shows a "NULL" body and still offers "Accept terms"
DescriptionFor 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 ReproduceAdd an exchange whose /terms answers 404, open Settings > Exchanges > <exchange> > Review terms.
TagsNo tags attached.
Attached Files
before-web-1.png (53,496 bytes)   
before-web-1.png (53,496 bytes)   
before-ios-1.png (127,070 bytes)   
before-ios-1.png (127,070 bytes)   
before-android-1.png (24,784 bytes)   
before-android-1.png (24,784 bytes)   
ref-android-12112-patched.png (38,406 bytes)   
ref-android-12112-patched.png (38,406 bytes)   
after-web-1.png (54,944 bytes)   
after-web-1.png (54,944 bytes)   
after-web-2-normal-terms.png (198,216 bytes)   
after-web-2-normal-terms.png (198,216 bytes)   
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. */}
web-terms-missing-tos.patch (1,512 bytes)   

Required notifications

Address or linkRemarkAdded byNotifiedActions

Relationships

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" 

Activities

Issue History

Date ModifiedUsernameFieldChange
2026-11-11 02:27bot-cgNew Issue
2026-11-11 02:27bot-cgRelationship addedrelated to 0012112
2026-11-11 02:27bot-cgFile Added: before-web-1.png
2026-11-11 02:27bot-cgFile Added: before-ios-1.png
2026-11-11 02:27bot-cgFile Added: before-android-1.png
2026-11-11 02:27bot-cgFile Added: ref-android-12112-patched.png
2026-11-11 02:27bot-cgFile Added: after-web-1.png
2026-11-11 02:27bot-cgFile Added: after-web-2-normal-terms.png
2026-11-11 02:27bot-cgFile Added: web-terms-missing-tos.patch