View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0012147 | Taler | wallet (iOS App) | public | 2026-11-15 19:38 | 2026-11-15 19:38 |
| Reporter | bot-cg [agent] | ||||
| Priority | normal | Severity | major | ||
| Status | new | ||||
| Summary | 0012147: iOS wallet: state the user can never delete -- audit against the rule that every item must be individually removable [meta] | ||||
| Description | Rule, as stated by the maintainer on 2026-11-15: there must be no state in the wallet that can never be deleted. Deletion may be hard -- a confirmation, a deposit first, an accepted loss -- but every transaction (confirmed, cancelled, pending), every scanned code, every directory entry has to be removable AS THAT ITEM. "Reset wallet" does not count. Deleting the payment service that owns an item does not count either; that is acceptable only for the digital cash itself. This issue collects what an audit of the iOS wallet against that rule found. Each child is one item, with the evidence and, where the fix needed no design decision, a patch. How it was audited 1. The app source, category by category: where each kind of state is listed and what removes one entry of it. 2. wallet-core's computeXxxTransactionActions tables: which states offer none of delete, abort, fail. 3. A new oracle in the UI fuzz harness ("state-not-deletable"), run over all 1703 recorded episodes: it reports a scanned code listed without a remove control (45 episodes) and a transaction page that, with the whole page in view, offers none of Delete / Abort / Abandon (10 episodes, all a withdrawal waiting for KYC that offers only Suspend or Resume). 4. Deterministic scenarios that create one item and delete it; these now form a "deletability" matrix in the harness, so the rule is checked on every run rather than audited once. Children (this tree) and one earlier report: - scanned codes cannot be removed (the case that prompted this) - deleting a transaction ends on "Internal core error" (7052) - TalDir contacts cannot be deleted - TalDir mailbox cannot be deleted; own alias registrations are not listed - backup files cannot be deleted - transactions whose page offers the user no removal: what the app hides - wallet-core: transaction states with neither delete, abort nor fail - 11962 (earlier): discount / pass tokens can never be removed Read in the source but NOT verified by a run -- leads, not findings: - The payment-service list iterates controller.balances, not listExchanges (ExchangeListView.swift). A payment service that getBalances does not report (failed add, terms never accepted) would have no row and so no delete button. - For a scope with several payment services only exchanges.first can be deleted per visit (ExchangeSectionView.swift:58-70). - Every transaction list hangs off a balance section. A transaction whose scope has no balance row (e.g. a pay dialog in a currency the wallet holds nothing in) would not be reachable, hence not deletable. - Transactions that fail to decode are dropped silently (Model+Transactions.swift:81-93): never listed, never deletable. Checked and fine: bank accounts ("Forget bank account" for every entry), mailbox messages (swipe to delete), payment services that have a balance row (delete, with an escalation to deposit-or-purge when coins remain). | ||||
| Tags | No tags attached. | ||||
| ID | Summary | Status | Locked by | Estimated effort (hours) |
|---|---|---|---|---|
| 0012148 | A scanned code that cannot be acted on (expired or malformed pay request) stays in the Actions menu and cannot be removed (patch attached) | new | ||
| 0012149 | Deleting a transaction from its page ends on "Internal core error" (7052 transaction not found): the list row asks for the transaction just deleted (patch attached) | new | ||
| 0012150 | TalDir contacts can be added and edited but never deleted: wallet-core's deleteContact is not called anywhere (patch attached) | new | ||
| 0012151 | TalDir: a mailbox, once created, cannot be deleted, and the wallet does not list its own alias registrations | new | ||
| 0012152 | Backup files can be created and restored but not deleted from within the app (patch attached) | new | ||
| 0012153 | Transaction pages that offer the user no way to remove the transaction: Suspend/Resume are developer-only, Retry is never shown, and nothing is shown while the connection is stalled | new | ||
| 0012154 | wallet-core: transaction states that offer neither delete, abort nor fail -- a transaction parked there can never be removed by the user | new | ||
| This issue (hours) | ||||
| Its children (hours) | 0 | |||
| Together (hours) | 0 | |||
Not planned yet: 0012148, 0012149, 0012150, 0012151, 0012152, 0012153, 0012154. The plan of this issue cannot be finished while part of it is unplanned.
| parent of | 0012148 | new | A scanned code that cannot be acted on (expired or malformed pay request) stays in the Actions menu and cannot be removed (patch attached) | |
| parent of | 0012149 | new | Deleting a transaction from its page ends on "Internal core error" (7052 transaction not found): the list row asks for the transaction just deleted (patch attached) | |
| parent of | 0012150 | new | TalDir contacts can be added and edited but never deleted: wallet-core's deleteContact is not called anywhere (patch attached) | |
| parent of | 0012151 | new | TalDir: a mailbox, once created, cannot be deleted, and the wallet does not list its own alias registrations | |
| parent of | 0012152 | new | Backup files can be created and restored but not deleted from within the app (patch attached) | |
| parent of | 0012153 | new | Transaction pages that offer the user no way to remove the transaction: Suspend/Resume are developer-only, Retry is never shown, and nothing is shown while the connection is stalled | |
| parent of | 0012154 | new | wallet-core: transaction states that offer neither delete, abort nor fail -- a transaction parked there can never be removed by the user | |
| Not all the children of this issue are yet resolved or closed. | ||||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2026-11-15 19:38 | bot-cg | New Issue | |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012151 |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012148 |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012154 |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012153 |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012152 |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012149 |
| 2026-11-15 19:38 | bot-cg | Relationship added | parent of 0012150 |
| 2026-11-15 19:38 | bot-cg | Implementer | => MarcS |
| 2026-11-15 19:38 | bot-cg | Reviewer | => bernaalp |
| 2026-11-15 19:38 | bot-cg | Deployed by | => mikolai |
| 2026-11-15 19:38 | bot-cg | Verifier | => Florian Dold |
| 2026-11-15 19:38 | bot-cg | Communicator | => CM_7 |