diff options
32 files changed, 429 insertions, 501 deletions
@@ -1,3 +1,6 @@ +Wed May 15 17:43:41 AM CEST 2024 + Releasing GNU Taler Exchange 0.11.0. -CG + Fri Apr 12 10:43:41 AM CEST 2024 Releasing GNU Taler Exchange 0.10.2. -CG diff --git a/configure.ac b/configure.ac index 3f8238b42..9a5c570d4 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ # # AC_PREREQ([2.69]) -AC_INIT([taler-exchange],[0.10.2],[taler-bug@gnunet.org]) +AC_INIT([taler-exchange],[0.11.2],[taler-bug@gnunet.org]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_SRCDIR([src/util/util.c]) AC_CONFIG_HEADERS([taler_config.h]) diff --git a/contrib/Makefile.am.in b/contrib/Makefile.am.in index e278fad2f..d3cfa769c 100644 --- a/contrib/Makefile.am.in +++ b/contrib/Makefile.am.in @@ -29,6 +29,7 @@ termsdir=$(datadir)/taler/terms/ terms_DATA = \ exchange-tos-v0.rst \ exchange-tos-bfh-v0.rst \ + exchange-tos-tops-v0.rst \ exchange-pp-v0.rst install-exec-local: diff --git a/contrib/exchange-tos-tops-v0.rst b/contrib/exchange-tos-tops-v0.rst index 3d0effa4c..9079545be 100644 --- a/contrib/exchange-tos-tops-v0.rst +++ b/contrib/exchange-tos-tops-v0.rst @@ -1,133 +1,289 @@ - -1.1. Dienstleistung / Geltungsbereich -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -CG: "Kunden sind Inhaber von durch TOPS signierten und in CHF denominierten Wertmarken -welche in Taler-Wallets in Eigenverantwortung gespeichert werden und mit denen Kunden -bezahlen koennen." - -[KOMMENTAR SK] -1. Ich empfehle weiterhin den Rechtsbegriff **Nutzer** anstelle von "Kunden", denn -Händler/Verkäufer können ja auch Nutzer sein, die untereinander Wertmarken austauschen, -ohne untereinander Kunden sein zu müssen. Sie sind damit "Nutzer" wie alle anderen Nutzer, die -wiederum keine Händler sein müssen. Das gilt selbstredend auch für P2P-Transaktionen von Wallets, -die keine Zahlung auslösen, sondern nur Token an andere Wallets übertragen wollen. -2. Nutzer sind **Eigentümer** von Wertmarken - denn "Inhaber" oder "Besitzer" wären hierfür -rechtlich schwache und unzutreffende Rechtsbegriffe. Wir sollten in diesem Punkt exakt sein, -wenn wir mit der Definition von e-Geld konform bleiben wollen (Wertmarken/Token, die in -Wallets bis zu ihrer Einlösung als Eigentum der Wallet-Eigentümer verwahrt werden). - -Daher nun folgender **Formulierungsvorschlag**: -- **Nutzer** sind Eigentümer von durch TOPS signierten und in CHF denominierten Wertmarken, welche -sie in Taler-Wallets in Eigenverantwortung als ihr Eigentum speichern und mit denen sie bezahlen -können. Ist eine Wertmarke eingelöst worden, kann diese nicht noch ein weiteres Mal eingelöst werden. -Wer eine Wertmarke zuerst einlöst, hat ihren Wert zur Zahlung verwendet. -Die Nutzer anerkennen sämtliche getätigten Zahlungen aus dem Taler-Wallet, selbst wenn diese ohne -ihre Zustimmung erfolgt sind. -[KOMMENTAR SK] - -1.2. Zugang zu den TALER Dienstleistungen -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[KOMMENTAR SK] -1.2. **Zugang zum TALER-Zahlungsdienst und zu anderen TOPS-Dienstleistungen**. -[KOMMENTAR SK] - -1.4. Registrierung und Identifizierung -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[KOMMENTAR SK] -Meine Vorschläge dazu: -1.4.1. Zur Nutzung des Zahlungsdiensts sind Nutzer und Begünstigte verpflichtet, TOPS bei -der Erfüllung regulatorischer und gesetzlicher Vorgaben zu unterstützen. Insbesondere kann -TOPS über die Identität von **wirtschaftlich Berechtigten** Auskunft verlangen. TOPS hat -das Recht und ggf. die gesetzliche Pflicht, Nutzer und Begünstigte von der Nutzung des -Zahlungsdiensts auszuschliessen, sollten diese die erforderlichen Auskünfte verweigern oder unwahre -Angaben machen. - -1.4.2. Zur Nutzung des Zahlungsdiensts gehen **Begünstigte** eine Geschäftsbeziehung mit -TOPS ein und können ggf. verpflichtet sein, sich bei TOPS zu registrieren und die dabei -verlangten Informationen zur Verfügung zu stellen. TOPS benötigt zur Registrierung von -Begünstigten deren IBAN, Adresse und Telefonnummer. TOPS behält sich vor, zur Erfüllung -regulatorischer Vorgaben jederzeit weitere Informationen verlangen zu können. - -1.4.3. Es erfolgt keine Registrierung oder Kontenanlage der **Nutzer** bei TOPS oder dem -Taler-Zahlungsdienst. Erfasst werden jedoch IBAN-Konten, die CHF an TOPS überweisen. -Die Nutzer brauchen für das Abheben in Taler-Wallets eine Schweizer Telefonnummer zum -Empfang von TANs im Fall der TAN-Versendung durch den Taler-Zahlungsdienst. -[KOMMENTAR SK] - -1.10. Kommunikation -~~~~~~~~~~~~~~~~~~~ - -[KOMMENTAR SK] -Die Kommunikation von TOPS zu Nutzern erfolgt grundsätzlich über Benachrichtigungen im Taler-Protokoll. -Die Nutzer sind dafür verantwortlich, auf entsprechende Benachrichtigungen zu reagieren. -TOPS hat das Recht, Transaktionen solange nicht auszuführen, bis Nutzer auf diesem Weg angeforderte rechtlich -notwendige Daten bereitstellen. -[KOMMENTAR SK] - -1.12. Vorbehalt gesetzlicher Regelungen und Beschränkung der Dienstleistungen -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[KOMMENTAR SK] -Mein auf das Wesentliche reduzierter Vorschlag, um stets im Rahmen der (unvorhersehbaren) Entwicklung der Regulatorik -zu bleiben: - -1.12.1 Allfällige Gesetzesbestimmungen, die den Betrieb und die Nutzung von digitalen Endgeräten, -Zahlungsdiensten, des Internets und sonstiger Infrastruktur regeln, bleiben vorbehalten und gelten -ab ihrer Inkraftsetzung auch für die TOPS-Dienstleistungen. - -1.12.2 TOPS behält sich vor, das Angebot von Dienstleistungen jederzeit und ohne vorherige Ankündigung zu ändern, zu -beschränken oder vollständig einzustellen, insbesondere aufgrund rechtlicher Anforderungen, technischen Problemen, -zwecks Verhinderung von Missbräuchen, auf behördliche Anordnung oder aus Sicherheitsgründen. -[KOMMENTAR SK] - -1.14 Datenschutz -~~~~~~~~~~~~~~~~ - -Weitere Informationen zu den Datenbearbeitungen finden sich in der Datenschutzerklärung auf -der Webseite der TALER AG (www.TALER.ch). - -[KOMMENTAR SK] -TALER AG (www.TALER.ch) --> TOPS (www.taler-ops.ch) -[KOMMENTAR SK] - -1.15. Dauer und Kündigung -~~~~~~~~~~~~~~~~~~~~~~~~~ - -[KOMMENTAR SK] -Mein Vorschlag: -1.15 Dauer und Kündigung der Geschäftsbeziehung - -1.15.1 Die Geschäftsbeziehung zwischen TOPS und **Begünstigten** (Händler, Betriebe, Verkäufer und sonstige -Empfänger von Überweisungen des Zahlungsdiensts an die begünstigten IBAN-Konten) wird auf eine unbestimmte Dauer -abgeschlossen. TOPS kann die Geschäftsbeziehung mit den Begünstigten jederzeit - insbesondere in Missbrauchsfällen mit -sofortiger Wirkung - kündigen. Eine schriftliche Kündigung durch TOPS erfolgt an eine der zuletzt bekanntgegebenen -Adressen der Geschäftspartner (z.B. per E-Mail oder Brief). Sollten für über 12 Monate keine Transaktionen an die -Begünstigen erfolgen, gilt die Geschäftsbeziehung als beendet. - -1.15.2 Die Geschäftsbeziehung zwischen TOPS und **Nutzern** wird auf die Dauer der Nutzung des Zahlungsdiensts -abgeschlossen. Die Nutzer von Taler-Wallets können das Guthaben in diesen jederzeit an die Bankkonten zurücküberweisen -lassen, von denen die Überweisung der Nutzer an den Zahlungsdienst erfolgte, und so das Guthaben saldieren. Bei einer -Betriebsaufgabe des Zahlungsdiensts der TOPS werden die Nutzer über die bevorstehende Einstellung des Zahlungsdiensts -durch das Taler-Protokoll informiert und von den Taler-Wallets aufgefordert, das bestehende Guthaben zu saldieren. -Nutzer, die diese Saldierung unterlassen, verlieren nach 3 Monaten den Anspruch auf das danach noch bestehende -Guthaben, welches in das Eigentum der TOPS übergeht. -[KOMMENTAR SK] - -1.17. Anwendbares Recht und Gerichtsstand -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- Satz 2: Zürich --> Biel - -CG: TOPS: Ich denke Bern, nicht Biel (so was ist doch bestimmt Kantonal!?) - -[KOMMENTAR SK] -Subkantonal. Das Regionalgericht in Biel ist zuständig als erstinstanzliche Zivilrechtsabteilung und als -Schlichtungsbehörde (siehe https://www.zsg.justice.be.ch/de/start/ueber-uns/regionalgerichte/berner-jura-seeland.html): -Regionalgericht Berner Jura-Seeland, Amthaus Biel, Spitalstrasse 14, 2502 Biel. - -Hinsichtlich NetzBon gilt der Gerichtsstand, der im Vertrag zwischen Taler Operations AG und dem Verein Soziale -Ökonomie vereinbart wird. -[KOMMENTAR SK] +Allgemeine Geschäftsbedingungen der Taler Operations AG +======================================================= + +Diese Allgemeinen Geschäftsbedingungen (nachfolgend **AGB**) der Taler +Operations AG regeln die Rechte und Pflichten von Nutzern und +Zahlungsempfängern (Begünstigten) des angebotenen Zahlungsdiensts. + + +Dienstleistung / Geltungsbereich +-------------------------------- + +GNU Taler ist ein technisches System, das bargeldlose Zahlungen ermöglicht. +Taler Operations AG (nachfolgend **TOPS**) mit Sitz in Biel/Bienne, Schweiz, +bietet einen **Zahlungsdienst** auf Basis von GNU Taler für Nutzer in der +Schweiz an. TOPS ist Mitglied im VQF, einer FINMA-akkreditierten +Selbstregulierungsorganisation. TOPS wird daher nicht direkt von der FINMA +beaufsichtigt, sondern betreibt eine Finanzdienstleistung nach Art. 6 Abs. 2 +BankV ohne gewerbsmässige Bankeneigenschaft (Nichtbank) und somit ohne +Kundeneinlagensicherung. + +**Nutzer** sind Eigentümer von durch TOPS signierten und in CHF denominierten +Wertmarken (e-Geld), welche in Taler-Wallets in Eigenverantwortung der Nutzer +gespeichert werden und mit denen die Nutzer bezahlen können. + +**Taler-Wallets** sind Produkte, die digitales Bargeld (e-Geld) nach dem GNU +Taler-Protokoll verwalten, welches ein Zahlungsdienst emittiert und zur +Zahlung an Begünstigte wieder einlöst. Die von TOPS emittierten Wertmarken +(e-CHF) können als Zahlungsmittel im stationären Handel, an Automaten, online +und in Apps bei autorisierten Händlern oder Dienstleistungsanbietern, die +dieses Zahlungsmittel akzeptieren (nachfolgend "**Begünstigte**") eingesetzt +werden. Nutzer können auch Zahlungen mit anderen Nutzern durchführen oder +das e-Geld auf ein Schweizer Bankkonto zurückübertragen. + + +Technische Voraussetzungen +-------------------------- + +Um die angebotenen Dienste wahrnehmen zu können, müssen Nutzer ein Taler-Wallet +(elektronische Geldbörse) als Taler-App auf ihrem Smartphone oder als +Erweiterung in einem Browser auf dem PC installieren. Die Nutzer sind frei in +der Wahl ihrer Taler-Wallet-Anwendung. Begünstigte sind ebenfalls frei in der +Wahl ihrer Taler-Wallet-Anwendung bzw. ihres Taler-Backends. Verschiedene +Lösungen werden von diversen Anbietern bereitgestellt. TOPS macht hier keine +Einschränkungen und übernimmt keine Gewährleistung für die gewählte Lösung. Die +Nutzer sind eigenverantwortlich für die Sicherheit ihrer Taler-Wallets bzw. +Taler-Backends und der darin gespeicherten Wertmarken bzw. Transaktionsdaten. + +Das Taler-Wallet wird von den Nutzern über die hierfür vorgesehenen +Mechanismen aufgeladen. Zum Aufbuchen der gewünschten Geldmenge wählt man im +Taler-Wallet den von TOPS betriebenen Zahlungsdienst, an den man diese +Geldmenge vom Girokonto überweist und von dem schliesslich das Taler-Wallet die +elektronischen Repräsentanten der Geldmenge abhebt. TOPS kann weitere +Aufladeoptionen einführen oder auch bestehende Mechanismen nicht mehr anbieten. +Allfällige mit der Aufladung verbundene Transaktions- oder sonstige Gebühren +sind durch die Nutzer zu tragen. Das Guthaben der Nutzer in Wallets wird nicht +verzinst. Die Nutzer nehmen zur Kenntnis, dass das Guthaben nicht von der +Einlagensicherung gedeckt ist. + +Das Entladen des Taler-Wallet muss auf ein Schweizer Bankkonto +erfolgen. Internationale Zahlungen sind nicht erlaubt. Die Nutzer können mit +dem im Smartphone oder Webbrowser installierten Taler-Wallet innerhalb der +geltenden Limiten bei natürlichen und juristischen Personen bezahlen, die +diese Bezahloption akzeptieren und ein Schweizer Bankkonto zum Geldempfang +führen (z.B. Ladengeschäfte, Webshops, Apps und sonstige Begünstigte). Bei +einer Bezahlung wird der entsprechende Betrag direkt vom Taler-Wallet +abgebucht. Es muss im Taler-Wallet mindestens der Transaktionsbetrag verfügbar +sein. Die Nutzer anerkennen sämtliche getätigten Zahlungen, welche mit dem +Taler-Wallet von ihrem digitalen Endgerät erfolgten, selbst wenn diese +Zahlungen ohne ihre Zustimmung erfolgt sind. Wer ein Guthaben im Taler-Wallet +einlöst, hat den Wert des Guthabens zur Zahlung verwendet. + +Der Verarbeitungsprozess für das Erhöhen und Verringern des Guthabens im +Taler-Wallet kann je nach Mechanismus mehrere Tage in Anspruch nehmen. + + +Preise, Gebühren und Limiten +---------------------------- + +TOPS kann die Gebühren jederzeit ändern. Änderungen haben nur Wirkung auf nach +der Änderung bezogene Wertmarken. Korrekte Taler-Wallets informieren Nutzer +über Gebührenänderungen vor dem Bezug von neuen Wertmarken. Der Bezug von +Wertmarken der TOPS nach Änderungen der Gebühren gilt als Zustimmung zu den +geänderten Bedingungen. + +Es bestehen Limiten von CHF 3.000 pro Monat und CHF 15.000 pro Kalenderjahr +für das Abheben von e-Geld von einem Girokonto bzw. für den Empfang von +Peer-to-Peer-Zahlungen zwischen Taler-Wallets mit bestätigter Schweizer +Mobilfunknummer. + + +Allgemeine Mitwirkungspflichten +------------------------------- + +Zur Nutzung des Zahlungsdiensts sind Nutzer und Begünstigte verpflichtet, TOPS +bei der Erfüllung regulatorischer und gesetzlicher Vorgaben zu unterstützen. +Insbesondere kann TOPS über die Identität von wirtschaftlich Berechtigten +Auskunft verlangen. TOPS hat das Recht und ggf. die gesetzliche Pflicht, +Nutzer und Begünstigte von der Nutzung des Zahlungsdiensts auszuschliessen, +sollten diese die erforderlichen Auskünfte verweigern oder unwahre Angaben +machen. + +Zur Nutzung des Zahlungsdiensts gehen *Begünstigte* eine Geschäftsbeziehung +mit TOPS ein und können ggf. verpflichtet sein, sich bei TOPS zu registrieren +und die dabei verlangten Informationen zur Verfügung zu stellen. TOPS behält +sich vor, zur Erfüllung regulatorischer Vorgaben jederzeit weitere +Informationen zu verlangen. + +Es erfolgt keine Kontenanlage der *Nutzer* bei TOPS. Erfasst werden jedoch +die IBAN-Konten von Nutzern, die CHF an TOPS überweisen, um Wertmarken zu +kaufen. Die Nutzer brauchen zum Empfang von Peer-to-Peer-Zahlungen mindestens +eine Schweizer Mobiltelefonnummer zum Empfang von SMS zur Identifizierung. + + +Sorgfalts- und andere Pflichten der Nutzer +------------------------------------------ + +Beim Umgang mit dem Zahlungsdienst sind insbesondere folgende +Sorgfaltspflichten von Nutzern einzuhalten: + +* Das Smartphone, PC, Notebook etc. ist vor unbefugter Benutzung oder + Manipulation zu schützen (z.B. mittels Geräte- bzw. Displaysperre). +* Im Schadenfall haben die Nutzer nach bestem Wissen zur Aufklärung des Falls + und zur Schadensminderung beizutragen. Bei strafbaren Handlungen ist Anzeige + bei der Polizei zu erstatten. +* Vor jeder Ausführung einer Zahlung sind die Angaben zum Zahlungsempfänger zu + überprüfen, um Fehltransaktionen zu verhindern. +* Die Nutzer sind für die Nutzung verantwortlich und tragen sämtliche Folgen, + die sich aus der Verwendung ergeben. Insbesondere werden Handlungen, die + eine Drittperson unberechtigt mit dem Taler-Wallet vornimmt, dem Eigentümer + des Wallet zugerechnet. +* Die Nutzer müssen sich darüber im klaren sein, **elektronisches Geld wie + Bargeld zu behandeln** und ebenso zu sichern, d.h. ein Backup der Wallet-Daten + anzulegen. Die Nutzer der Taler-App sind daher verpflichtet, den Zugang zum + digitalen Endgerät zu sichern und vor unbefugtem Zugriff zu bewahren. Sie + müssen die Wallet-Daten mit einer Sicherungskopie auf einem anderen Gerät + speichern. Die Exportfunktion des Wallet hilft dabei, ein Backup der + Wallet-Daten anzulegen und zu speichern. Ein verlorenes Nutzergerät mit + einem Wallet darauf ohne Backup auf einem anderen Gerät oder Datenträger + bedeutet einen Totalverlust des Guthabens. +* Es ist dafür zu sorgen, dass sich das Endgerät mit einem darauf + installierten Taler-Wallet **innerhalb eines Jahres** nach der letzten + Transaktion **mit dem Zahlungsdienst über das Internet verbindet**, ansonsten + kann das Guthaben im Wallet verloren werden. Ein Erneuern des Guthabens + erfolgt regulär einen Monat vor dem Ende der Gültigkeit des elektronischen + Bargelds, die zum Abhebezeitpunkt ca. ein Jahr beträgt. + +Die Kommunikation von TOPS zu Nutzern erfolgt grundsätzlich über +Benachrichtigungen im Protokoll von GNU Taler. Nutzer sind dafür +verantwortlich, auf entsprechende Benachrichtigungen zu reagieren. TOPS hat +das Recht, Transaktionen solange nicht auszuführen, bis Nutzer auf diesem Weg +angeforderte rechtlich notwendige Daten bereitstellen. + + +Haftung +------- + +TOPS haftet nicht für entstandene Verluste oder Schäden der Nutzer aufgrund +der Verwendung von GNU Taler, insbesondere nicht für Verluste oder Schäden + +* aufgrund von Übermittlungsfehlern, technischen Störungen oder Defekten, + Ausfällen und unberechtigten Zugriffen oder Eingriffen auf das digitale + Endgerät, +* die ganz oder teilweise auf einen Verstoss der Nutzer gegen diese AGB oder + anwendbare Gesetze zurückzuführen sind, +* aufgrund einer Störung oder Fehlers von Software oder der verwendeten + Hardware, +* aufgrund von Störungen, Unterbrechungen (einschliesslich + Systemwartungsarbeiten) oder Überlastungen der relevanten Informatiksysteme + bzw. Netze, +* aufgrund von Zahlungen, die nicht oder verzögert verarbeitet werden, +* die auf Handlungen oder Unterlassungen von Dritten (inkl. Hilfspersonen der + TOPS) zurückzuführen sind, + +es sei denn, diese Verluste oder Schäden sind auf grobe Fahrlässigkeit oder +vorsätzliches Verschulden von TOPS zurückzuführen. TOPS ersetzt Sach- und +Vermögensschäden je Schadenereignis bis höchstens CHF 1.000. Die Haftung für +Folgeschäden, entgangenen Gewinn oder Datenverluste ist – soweit gesetzlich +zulässig – in jedem Fall ausgeschlossen. + + +Nutzung; Missbräuche +-------------------- + +Nutzer halten TOPS schadlos für Schäden oder Verluste, die TOPS aufgrund der +Nichteinhaltung dieser AGB oder gesetzlicher Vorgaben, aufgrund fehlerhafter +oder unvollständiger Angaben der Nutzer oder der fehlerhaften Ausführung von +Anweisungen entstehen. + +Weicht die Nutzung erheblich vom üblichen Gebrauch ab oder bestehen Anzeichen +eines rechts- oder vertragswidrigen Verhaltens, kann TOPS die Nutzer zur +rechts- und vertragskonformen Nutzung anhalten, die Leistungserbringung ohne +Vorankündigung entschädigungslos ändern, einschränken oder einstellen, die +Geschäftsbeziehung frist- und entschädigungslos auflösen und gegebenenfalls +Schadenersatz sowie die Freistellung von Ansprüchen Dritter verlangen. TOPS +behält sich vor, bei Verletzung von Regeln oder Missbrauch Zahlungen an +Begünstigte zurückzuhalten. + + +Vorbehalte zu Änderungen an dieser AGB +-------------------------------------- + +TOPS kann die AGB jederzeit ändern. Änderungen haben nur Wirkung auf nach der +Änderung bezogene Wertmarken. Korrekte Taler-Wallets informieren Nutzer über +Änderungen vor dem Bezug von neuen Wertmarken. Der Bezug von Wertmarken der +TOPS nach Änderungen der AGB gilt als Zustimmung zu den geänderten +Bedingungen. + +Allfällige Gesetzesbestimmungen, die den Betrieb und die Nutzung von digitalen +Endgeräten, Zahlungsdiensten, des Internets und sonstiger Infrastruktur +regeln, bleiben vorbehalten und gelten ab ihrer Inkraftsetzung auch für die +TOPS-Dienstleistungen. + +TOPS behält sich vor, das Angebot von Dienstleistungen jederzeit und ohne +vorherige Ankündigung zu ändern, zu beschränken oder vollständig einzustellen, +insbesondere aufgrund rechtlicher Anforderungen, technischer Probleme, zur +Verhinderung von Missbräuchen, auf behördliche Anordnung oder aus +Sicherheitsgründen. + +TOPS kann die Vertragsbeziehungen (einschliesslich eines Guthabens) jederzeit +und ohne vorherige Information auf eine andere Gesellschaft übertragen. + + +Geheimhaltung und Datenschutz +----------------------------- + +Personenbezogene Daten werden von TOPS nur im Rahmen der Erfüllung +gesetzlicher Verpflichtungen erhoben, verarbeitet, aufbewahrt oder +weitergegeben. Beim Bezahlvorgang mit e-Geld werden keine Daten zur Identität +der Nutzer erfasst. + +TOPS stellt Nutzern auf Anfrage technischen Support zur Verfügung. An der +Erbringung dieses Supports können Dritte beteiligt sein. Diese erhalten +hierfür Zugriff auf notwendige personenbezogene Daten zur Kommunikation mit +den Nutzern. + +TOPS verpflichtet sich hinsichtlich der Beschaffung, Bearbeitung und Nutzung +personenbezogener Daten von Nutzern, die Bestimmungen der schweizerischen +Datenschutzgesetzgebung, insbesondere des Bundesgesetzes über den Datenschutz +und der Verordnung über den Datenschutz, einzuhalten. + +Alle Systemdaten werden primär in der Schweiz gehostet. + +KYC-Prozesse werden ggf. durch Dienstleister gesteuert. Diese sind ebenfalls +verpflichtet, die Daten nach Recht und Gesetz der Schweiz zu sichern. Die +eigentlichen Daten des Kernsystems werden auf verschlüsselten Festplatten +redundant (d.h. mit Backup) gespeichert und sind nur autorisiertem Personal +zugänglich. Autorisiertes Personal wird von TOPS einer Sicherheitsprüfung +unterzogen. Das gesamte Design des Zahlungsdiensts GNU Taler wurde strikt nach +den Grundsätzen "Privacy-by-Design” und "Privacy-by-Default” umgesetzt. + +Weitere Informationen zu den Datenbearbeitungen finden sich in der +Datenschutzerklärung auf der Webseite der TOPS (www.taler-ops.ch). + + +Dauer und Kündigung +------------------- + +Die Geschäftsbeziehung zwischen TOPS und Begünstigten (Händler, Betriebe, +Verkäufer und sonstige regelmässige Empfänger von Überweisungen des +Zahlungsdiensts an die begünstigten IBAN-Konten) wird auf eine unbestimmte +Dauer abgeschlossen. TOPS kann die Geschäftsbeziehung mit den Begünstigten +jederzeit - insbesondere in Missbrauchsfällen mit sofortiger Wirkung - +kündigen. Eine schriftliche Kündigung durch TOPS erfolgt an eine der zuletzt +bekanntgegebenen Adressen der Geschäftspartner (z.B. per E-Mail oder +Brief). Sollten für über 12 Monate keine Transaktionen an die Begünstigen +erfolgen, gilt die Geschäftsbeziehung als beendet. + +Die Nutzer von Taler-Wallets können das Guthaben in diesen jederzeit an +Bankkonten in der Schweiz zurücküberweisen lassen und so das Guthaben +saldieren. Bei einer +Betriebsaufgabe des Zahlungsdiensts der TOPS werden die Nutzer über die +bevorstehende Einstellung des Zahlungsdiensts durch das Taler-Protokoll +informiert und von den Taler-Wallets aufgefordert, das bestehende Guthaben zu +saldieren. Nutzer, die diese Saldierung unterlassen, verlieren nach 3 Monaten +den Anspruch auf das danach noch bestehende Guthaben, welches in das Eigentum +der TOPS übergeht. + + +Anwendbares Recht und Gerichtsstand +----------------------------------- + +Soweit gesetzlich zulässig unterstehen alle Rechtsbeziehungen zwischen TOPS +und Nutzern ausschliesslich dem materiellen schweizerischen Recht, unter +Ausschluss von Kollisionsrecht und unter Ausschluss von Staatsverträgen. + +Unter dem Vorbehalt von entgegenstehenden zwingenden gesetzlichen +Bestimmungen ist Biel ausschliesslicher Gerichtsstand und Erfüllungsort. Für +Nutzer und Begünstigte mit einem Wohnsitz ausserhalb der Schweiz ist Biel +sodann auch Betreibungsort. diff --git a/contrib/gana b/contrib/gana -Subproject 61556908520df557832b04bb5e1ee91c708aeef +Subproject 898a5d6c244ea66fc83cd8936db903aad14c4f1 diff --git a/contrib/wallet-core b/contrib/wallet-core -Subproject 240d647da85de6b575d15c37efec04757541e3d +Subproject 608c1bb0b435eb64420388a1a5809df3d1146bc diff --git a/debian/changelog b/debian/changelog index cab5345dc..8d9f58db1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,22 @@ +taler-exchange (0.11.2) unstable; urgency=low + + * Bump version. + + -- Christian Grothoff <grothoff@gnu.org> Wed, 5 Jun 2024 21:50:12 +0200 + +taler-exchange (0.11.1) unstable; urgency=low + + * Fixed issues with restarts in service files. + * Fixed minor translation issues. + + -- Christian Grothoff <grothoff@gnu.org> Tue, 21 May 2024 14:50:12 +0200 + +taler-exchange (0.11.0) unstable; urgency=low + + * Releasing 0.11.0 with updated terms of service draft. + + -- Christian Grothoff <grothoff@gnu.org> Wed, 15 May 2024 17:50:12 +0200 + taler-exchange (0.10.2) unstable; urgency=low * Updated man pages and other resources for release. diff --git a/debian/control b/debian/control index cf99dd1ed..52ab79c5f 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ Build-Depends: libjansson-dev (>= 2.13), libltdl-dev (>=2.2), libmicrohttpd-dev (>=0.9.71), - libpq-dev (>=14), + libpq-dev (>=15), libsodium-dev (>=1.0.11), libunistring-dev (>=0.9.2), po-debconf, @@ -90,7 +90,7 @@ Recommends: taler-exchange-offline (= ${binary:Version}), taler-terms-generator, apache2 | nginx | httpd, - postgresql (>=14.0) + postgresql (>=15.0) Description: GNU's payment system operator. GNU Taler is the privacy-preserving digital payment system from the GNU project. This package contains the diff --git a/debian/taler-exchange.taler-exchange-aggregator.service b/debian/taler-exchange.taler-exchange-aggregator.service index db297270f..84b757eda 100644 --- a/debian/taler-exchange.taler-exchange-aggregator.service +++ b/debian/taler-exchange.taler-exchange-aggregator.service @@ -9,7 +9,7 @@ Type=simple Restart=always RestartMode=direct RestartSec=1s -RestartPreventExitStatus=2 3 4 5 6 9 +RestartPreventExitStatus=9 ExecStart=/usr/bin/taler-exchange-aggregator -c /etc/taler/taler.conf -L INFO StandardOutput=journal StandardError=journal diff --git a/debian/taler-exchange.taler-exchange-closer.service b/debian/taler-exchange.taler-exchange-closer.service index ba57522b0..9cdc534f9 100644 --- a/debian/taler-exchange.taler-exchange-closer.service +++ b/debian/taler-exchange.taler-exchange-closer.service @@ -9,7 +9,7 @@ Type=simple Restart=always RestartMode=direct RestartSec=1s -RestartPreventExitStatus=2 3 4 5 6 9 +RestartPreventExitStatus=9 ExecStart=/usr/bin/taler-exchange-closer -c /etc/taler/taler.conf -L INFO StandardOutput=journal StandardError=journal diff --git a/debian/taler-exchange.taler-exchange-expire.service b/debian/taler-exchange.taler-exchange-expire.service index 8fd9a9f74..2a9552f76 100644 --- a/debian/taler-exchange.taler-exchange-expire.service +++ b/debian/taler-exchange.taler-exchange-expire.service @@ -9,7 +9,7 @@ Type=simple Restart=always RestartMode=direct RestartSec=1s -RestartPreventExitStatus=2 3 4 5 6 9 +RestartPreventExitStatus=9 ExecStart=/usr/bin/taler-exchange-expire -c /etc/taler/taler.conf -L INFO StandardOutput=journal StandardError=journal diff --git a/debian/taler-exchange.taler-exchange-httpd.service b/debian/taler-exchange.taler-exchange-httpd.service index cbde72522..d7e9b1e36 100644 --- a/debian/taler-exchange.taler-exchange-httpd.service +++ b/debian/taler-exchange.taler-exchange-httpd.service @@ -14,7 +14,7 @@ Type=simple Restart=always RestartMode=direct RestartSec=1ms -RestartPreventExitStatus=2 3 4 5 6 9 +RestartPreventExitStatus=9 # Disable the service if more than 5 restarts are encountered within 5s. # These are usually the systemd defaults, but can be overwritten, thus we set diff --git a/debian/taler-exchange.taler-exchange-transfer.service b/debian/taler-exchange.taler-exchange-transfer.service index ffe2f1955..77ada8f86 100644 --- a/debian/taler-exchange.taler-exchange-transfer.service +++ b/debian/taler-exchange.taler-exchange-transfer.service @@ -9,7 +9,7 @@ Type=simple Restart=always RestartMode=direct RestartSec=1s -RestartPreventExitStatus=2 3 4 5 6 9 +RestartPreventExitStatus=9 ExecStart=/usr/bin/taler-exchange-transfer -c /etc/taler/taler.conf -L INFO StandardOutput=journal StandardError=journal diff --git a/debian/taler-exchange.taler-exchange-wirewatch.service b/debian/taler-exchange.taler-exchange-wirewatch.service index 40103bb51..7a7dc60b0 100644 --- a/debian/taler-exchange.taler-exchange-wirewatch.service +++ b/debian/taler-exchange.taler-exchange-wirewatch.service @@ -9,7 +9,7 @@ Type=simple Restart=always RestartMode=direct RestartSec=1s -RestartPreventExitStatus=2 3 4 5 6 9 +RestartPreventExitStatus=9 RuntimeMaxSec=3600s ExecStart=/usr/bin/taler-exchange-wirewatch -c /etc/taler/taler.conf -L INFO StandardOutput=journal diff --git a/doc/doxygen/taler.doxy b/doc/doxygen/taler.doxy index 1516811c5..8efcf0c0f 100644 --- a/doc/doxygen/taler.doxy +++ b/doc/doxygen/taler.doxy @@ -47,7 +47,7 @@ PROJECT_NAME = "GNU Taler: Exchange" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.10.2 +PROJECT_NUMBER = 0.11.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/doc/prebuilt b/doc/prebuilt -Subproject b8d2d2fa2ed2a771880f451725176f256583cb2 +Subproject c1a885ac1f9d9b2fdef19a976bed01dab4f7d85 diff --git a/src/bank-lib/Makefile.am b/src/bank-lib/Makefile.am index a292dcece..ef7704684 100644 --- a/src/bank-lib/Makefile.am +++ b/src/bank-lib/Makefile.am @@ -72,8 +72,6 @@ libtalerfakebank_la_SOURCES = \ fakebank_bank_get_withdrawals.c fakebank_bank_get_withdrawals.h \ fakebank_bank_get_root.c fakebank_bank_get_root.h \ fakebank_bank_post_accounts_withdrawals.c fakebank_bank_post_accounts_withdrawals.h \ - fakebank_bank_post_withdrawals_abort.c fakebank_bank_post_withdrawals_abort.h \ - fakebank_bank_post_withdrawals_confirm.c fakebank_bank_post_withdrawals_confirm.h \ fakebank_bank_post_withdrawals_id_op.c fakebank_bank_post_withdrawals_id_op.h \ fakebank_bank_testing_register.c fakebank_bank_testing_register.h \ fakebank_tbr.c fakebank_tbr.h \ diff --git a/src/bank-lib/fakebank.h b/src/bank-lib/fakebank.h index a9d61d8b1..98c1bb020 100644 --- a/src/bank-lib/fakebank.h +++ b/src/bank-lib/fakebank.h @@ -161,7 +161,7 @@ struct WithdrawalOperation /** * Amount transferred. */ - struct TALER_Amount amount; + struct TALER_Amount *amount; /** * Public key of the reserve, wire transfer subject. diff --git a/src/bank-lib/fakebank_bank.c b/src/bank-lib/fakebank_bank.c index 7c2d39ab4..e9a437e21 100644 --- a/src/bank-lib/fakebank_bank.c +++ b/src/bank-lib/fakebank_bank.c @@ -34,8 +34,6 @@ #include "fakebank_bank_get_withdrawals.h" #include "fakebank_bank_get_root.h" #include "fakebank_bank_post_accounts_withdrawals.h" -#include "fakebank_bank_post_withdrawals_abort.h" -#include "fakebank_bank_post_withdrawals_confirm.h" #include "fakebank_bank_post_withdrawals_id_op.h" #include "fakebank_bank_testing_register.h" @@ -167,55 +165,6 @@ TALER_FAKEBANK_bank_main_ ( wid); } - if ( (0 == strncmp (url, - "/withdrawals/", - strlen ("/withdrawals/"))) && - (0 == strcasecmp (method, - MHD_HTTP_METHOD_POST)) ) - { - /* POST /withdrawals/$WID* */ - const char *wid = url + strlen ("/withdrawals/"); - const char *opid = strchr (wid, - '/'); - char *wi; - - if (NULL == opid) - { - /* POST /withdrawals/$WID (not defined) */ - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_GENERIC_ENDPOINT_UNKNOWN, - url); - } - wi = GNUNET_strndup (wid, - opid - wid); - if (0 == strcmp (opid, - "/abort")) - { - /* POST /withdrawals/$WID/abort */ - MHD_RESULT ret; - - ret = TALER_FAKEBANK_bank_withdrawals_abort_ (h, - connection, - wi); - GNUNET_free (wi); - return ret; - } - if (0 == strcmp (opid, - "/confirm")) - { - /* POST /withdrawals/$WID/confirm */ - MHD_RESULT ret; - - ret = TALER_FAKEBANK_bank_withdrawals_confirm_ (h, - connection, - wi); - GNUNET_free (wi); - return ret; - } - } - if (0 == strncmp (url, "/accounts/", strlen ("/accounts/"))) diff --git a/src/bank-lib/fakebank_bank_accounts_withdrawals.c b/src/bank-lib/fakebank_bank_accounts_withdrawals.c index bb435d975..d956a591f 100644 --- a/src/bank-lib/fakebank_bank_accounts_withdrawals.c +++ b/src/bank-lib/fakebank_bank_accounts_withdrawals.c @@ -96,6 +96,7 @@ TALER_FAKEBANK_bank_account_withdrawals_ ( &wo->reserve_pub) : GNUNET_JSON_pack_string ("selected_reserve_pub", NULL)), - TALER_JSON_pack_amount ("amount", - &wo->amount)); + GNUNET_JSON_pack_allow_null ( + TALER_JSON_pack_amount ("amount", + wo->amount))); } diff --git a/src/bank-lib/fakebank_bank_get_withdrawals.c b/src/bank-lib/fakebank_bank_get_withdrawals.c index 7f65e8660..84f65cc40 100644 --- a/src/bank-lib/fakebank_bank_get_withdrawals.c +++ b/src/bank-lib/fakebank_bank_get_withdrawals.c @@ -82,6 +82,9 @@ TALER_FAKEBANK_bank_get_withdrawals_ ( &wo->reserve_pub) : GNUNET_JSON_pack_string ("selected_reserve_pub", NULL)), - TALER_JSON_pack_amount ("amount", - &wo->amount)); + GNUNET_JSON_pack_string ("currency", + h->currency), + GNUNET_JSON_pack_allow_null ( + TALER_JSON_pack_amount ("amount", + wo->amount))); } diff --git a/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c b/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c index 7fbb93352..7d77f7626 100644 --- a/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c +++ b/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c @@ -67,7 +67,11 @@ do_post_account_withdrawals ( } wo = GNUNET_new (struct WithdrawalOperation); wo->debit_account = acc; - wo->amount = *amount; + if (NULL != amount) + { + wo->amount = GNUNET_new (struct TALER_Amount); + *wo->amount = *amount; + } if (NULL == h->wops) { h->wops = GNUNET_CONTAINER_multishortmap_create (32, @@ -83,6 +87,8 @@ do_post_account_withdrawals ( &wo->wopid, wo, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) + + break; } { @@ -169,11 +175,15 @@ TALER_FAKEBANK_bank_post_account_withdrawals_ ( { struct TALER_Amount amount; + bool amount_missing; + struct TALER_Amount *amount_ptr; enum GNUNET_GenericReturnValue ret; struct GNUNET_JSON_Specification spec[] = { - TALER_JSON_spec_amount ("amount", - h->currency, - &amount), + GNUNET_JSON_spec_mark_optional ( + TALER_JSON_spec_amount ("amount", + h->currency, + &amount), + &amount_missing), GNUNET_JSON_spec_end () }; @@ -186,10 +196,13 @@ TALER_FAKEBANK_bank_post_account_withdrawals_ ( json_decref (json); return (GNUNET_NO == ret) ? MHD_YES : MHD_NO; } + + amount_ptr = amount_missing ? NULL : &amount; + res = do_post_account_withdrawals (h, connection, account_name, - &amount); + amount_ptr); } json_decref (json); return res; diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_abort.c b/src/bank-lib/fakebank_bank_post_withdrawals_abort.c deleted file mode 100644 index f8ebf1b93..000000000 --- a/src/bank-lib/fakebank_bank_post_withdrawals_abort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of TALER - (C) 2016-2023 Taler Systems SA - - TALER is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 3, - or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with TALER; see the file COPYING. If not, - see <http://www.gnu.org/licenses/> -*/ -/** - * @file bank-lib/fakebank_bank_post_withdrawals_abort.c - * @brief implement bank API withdrawals /abort endpoint - * @author Christian Grothoff <christian@grothoff.org> - */ -#include "platform.h" -#include <pthread.h> -#include "taler_fakebank_lib.h" -#include "taler_bank_service.h" -#include "taler_mhd_lib.h" -#include <gnunet/gnunet_mhd_compat.h> -#include "fakebank.h" -#include "fakebank_bank_post_withdrawals_abort.h" -#include "fakebank_common_lookup.h" -#include "fakebank_common_lp.h" - - -MHD_RESULT -TALER_FAKEBANK_bank_withdrawals_abort_ ( - struct TALER_FAKEBANK_Handle *h, - struct MHD_Connection *connection, - const char *withdrawal_id) -{ - struct WithdrawalOperation *wo; - - GNUNET_assert (0 == - pthread_mutex_lock (&h->big_lock)); - wo = TALER_FAKEBANK_lookup_withdrawal_operation_ (h, - withdrawal_id); - if (NULL == wo) - { - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_BANK_TRANSACTION_NOT_FOUND, - withdrawal_id); - } - if (wo->confirmation_done) - { - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_CONFLICT, - TALER_EC_BANK_ABORT_CONFIRM_CONFLICT, - withdrawal_id); - } - wo->aborted = true; - TALER_FAKEBANK_notify_withdrawal_ (h, - wo); - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_json (connection, - json_object (), /* FIXME: #7301 */ - MHD_HTTP_OK); -} diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_abort.h b/src/bank-lib/fakebank_bank_post_withdrawals_abort.h deleted file mode 100644 index 920b0b802..000000000 --- a/src/bank-lib/fakebank_bank_post_withdrawals_abort.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - This file is part of TALER - (C) 2016-2023 Taler Systems SA - - TALER is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 3, - or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with TALER; see the file COPYING. If not, - see <http://www.gnu.org/licenses/> -*/ -/** - * @file bank-lib/fakebank_bank_post_withdrawals_abort.h - * @brief implement bank API withdrawals /abort endpoint - * @author Christian Grothoff <christian@grothoff.org> - */ -#ifndef FAKEBANK_BANK_POST_WITHDRAWALS_ABORT_H -#define FAKEBANK_BANK_POST_WITHDRAWALS_ABORT_H - -#include "taler_fakebank_lib.h" -#include "taler_bank_service.h" -#include "taler_mhd_lib.h" -#include <gnunet/gnunet_mhd_compat.h> -#include "fakebank.h" - - -/** - * Handle POST /withdrawals/{withdrawal_id}/abort request. - * - * @param h our fakebank handle - * @param connection the connection - * @param withdrawal_id the withdrawal operation identifier - * @return MHD result code - */ -MHD_RESULT -TALER_FAKEBANK_bank_withdrawals_abort_ ( - struct TALER_FAKEBANK_Handle *h, - struct MHD_Connection *connection, - const char *withdrawal_id); - -#endif diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c b/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c deleted file mode 100644 index 2fa67c970..000000000 --- a/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - This file is part of TALER - (C) 2016-2023 Taler Systems SA - - TALER is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 3, - or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with TALER; see the file COPYING. If not, - see <http://www.gnu.org/licenses/> -*/ -/** - * @file bank-lib/fakebank_bank_post_withdrawals_confirm.c - * @brief implement bank API withdrawals /confirm endpoint - * @author Christian Grothoff <christian@grothoff.org> - */ -#include "platform.h" -#include <pthread.h> -#include "taler_fakebank_lib.h" -#include "taler_bank_service.h" -#include "taler_mhd_lib.h" -#include <gnunet/gnunet_mhd_compat.h> -#include "fakebank.h" -#include "fakebank_bank_post_withdrawals_confirm.h" -#include "fakebank_common_lookup.h" -#include "fakebank_common_lp.h" -#include "fakebank_common_make_admin_transfer.h" - - -MHD_RESULT -TALER_FAKEBANK_bank_withdrawals_confirm_ ( - struct TALER_FAKEBANK_Handle *h, - struct MHD_Connection *connection, - const char *withdrawal_id) -{ - struct WithdrawalOperation *wo; - - GNUNET_assert (0 == - pthread_mutex_lock (&h->big_lock)); - wo = TALER_FAKEBANK_lookup_withdrawal_operation_ (h, - withdrawal_id); - if (NULL == wo) - { - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_BANK_TRANSACTION_NOT_FOUND, - withdrawal_id); - } - if (NULL == wo->exchange_account) - { - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, - NULL); - } - if (wo->aborted) - { - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_CONFLICT, - TALER_EC_BANK_CONFIRM_ABORT_CONFLICT, - withdrawal_id); - } - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - if (GNUNET_OK != - TALER_FAKEBANK_make_admin_transfer_ ( - h, - wo->debit_account->account_name, - wo->exchange_account->account_name, - &wo->amount, - &wo->reserve_pub, - &wo->row_id, - &wo->timestamp)) - { - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_CONFLICT, - TALER_EC_BANK_DUPLICATE_RESERVE_PUB_SUBJECT, - NULL); - } - /* Re-acquiring the lock and continuing to operate on 'wo' - is currently (!) acceptable because we NEVER free 'wo' - until shutdown. We may want to revise this if keeping - all withdraw operations in RAM becomes an issue... */ - GNUNET_assert (0 == - pthread_mutex_lock (&h->big_lock)); - wo->confirmation_done = true; - TALER_FAKEBANK_notify_withdrawal_ (h, - wo); - GNUNET_assert (0 == - pthread_mutex_unlock (&h->big_lock)); - return TALER_MHD_reply_json (connection, - json_object (), - MHD_HTTP_OK); -} diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_confirm.h b/src/bank-lib/fakebank_bank_post_withdrawals_confirm.h deleted file mode 100644 index 56cd2deda..000000000 --- a/src/bank-lib/fakebank_bank_post_withdrawals_confirm.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - This file is part of TALER - (C) 2016-2023 Taler Systems SA - - TALER is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 3, - or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with TALER; see the file COPYING. If not, - see <http://www.gnu.org/licenses/> -*/ -/** - * @file bank-lib/fakebank_bank_post_withdrawals_confirm.h - * @brief implement bank API withdrawals /confirm endpoint - * @author Christian Grothoff <christian@grothoff.org> - */ -#ifndef FAKEBANK_BANK_POST_WITHDRAWALS_CONFIRM_H -#define FAKEBANK_BANK_POST_WITHDRAWALS_CONFIRM_H - -#include "taler_fakebank_lib.h" -#include "taler_bank_service.h" -#include "taler_mhd_lib.h" -#include <gnunet/gnunet_mhd_compat.h> -#include "fakebank.h" - - -/** - * Handle POST /accounts/{account_name}/withdrawals/{withdrawal_id}/confirm request. - * - * @param h our fakebank handle - * @param connection the connection - * @param withdrawal_id the withdrawal operation identifier - * @return MHD result code - */ -MHD_RESULT -TALER_FAKEBANK_bank_withdrawals_confirm_ ( - struct TALER_FAKEBANK_Handle *h, - struct MHD_Connection *connection, - const char *withdrawal_id); - -#endif diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c index fe5cc982d..2adc07df0 100644 --- a/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c +++ b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c @@ -91,6 +91,15 @@ bank_withdrawals_confirm ( TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, NULL); } + if (NULL == wo->amount) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, + NULL); + } if (wo->aborted) { GNUNET_assert (0 == @@ -107,7 +116,7 @@ bank_withdrawals_confirm ( h, wo->debit_account->account_name, wo->exchange_account->account_name, - &wo->amount, + wo->amount, &wo->reserve_pub, &wo->row_id, &wo->timestamp)) diff --git a/src/bank-lib/fakebank_stop.c b/src/bank-lib/fakebank_stop.c index e31d47523..ff6b084f4 100644 --- a/src/bank-lib/fakebank_stop.c +++ b/src/bank-lib/fakebank_stop.c @@ -77,6 +77,7 @@ free_withdraw_op (void *cls, (void) cls; (void) key; + GNUNET_free (wo->amount); GNUNET_free (wo); return GNUNET_OK; } diff --git a/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c b/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c index 4749bda77..fd6f3b7c4 100644 --- a/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c +++ b/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c @@ -123,8 +123,9 @@ TALER_FAKEBANK_tbi_get_withdrawal_operation_ ( GNUNET_JSON_pack_allow_null ( GNUNET_JSON_pack_string ("suggested_exchange", h->exchange_url)), - TALER_JSON_pack_amount ("amount", - &wc->wo->amount), + GNUNET_JSON_pack_allow_null ( + TALER_JSON_pack_amount ("amount", + wc->wo->amount)), GNUNET_JSON_pack_array_steal ("wire_types", wt)); } diff --git a/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c b/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c index 38b92e494..29f1e7475 100644 --- a/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c +++ b/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c @@ -40,6 +40,8 @@ * @param wopid the withdrawal operation identifier * @param reserve_pub public key of the reserve * @param exchange_payto_uri payto://-URI of the exchange + * @param amount chosen by the client, or NULL to use the + * pre-determined amount * @return MHD result code */ static MHD_RESULT @@ -48,7 +50,8 @@ do_post_withdrawal ( struct MHD_Connection *connection, const char *wopid, const struct TALER_ReservePublicKeyP *reserve_pub, - const char *exchange_payto_uri) + const char *exchange_payto_uri, + const struct TALER_Amount *amount) { struct WithdrawalOperation *wo; char *credit_name; @@ -134,6 +137,35 @@ do_post_withdrawal ( TALER_EC_BANK_WITHDRAWAL_OPERATION_RESERVE_SELECTION_CONFLICT, "exchange account changed"); } + if ( (NULL != wo->amount) && (NULL != amount) && (0 != TALER_amount_cmp (wo-> + amount, + amount)) ) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_CONFLICT, + TALER_EC_BANK_WITHDRAWAL_OPERATION_RESERVE_SELECTION_CONFLICT, + "amount changed"); + } + if (NULL == wo->amount) + { + if (NULL == amount) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, + "amount missing"); + } + else + { + wo->amount = GNUNET_new (struct TALER_Amount); + *wo->amount = *amount; + } + } + GNUNET_assert (NULL != wo->amount); wo->exchange_account = credit_account; wo->reserve_pub = *reserve_pub; wo->selection_done = true; @@ -203,11 +235,19 @@ TALER_FAKEBANK_tbi_post_withdrawal ( struct TALER_ReservePublicKeyP reserve_pub; const char *exchange_payto_url; enum GNUNET_GenericReturnValue ret; + struct TALER_Amount amount; + bool amount_missing; + struct TALER_Amount *amount_ptr; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed_auto ("reserve_pub", &reserve_pub), GNUNET_JSON_spec_string ("selected_exchange", &exchange_payto_url), + GNUNET_JSON_spec_mark_optional ( + TALER_JSON_spec_amount ("amount", + h->currency, + &amount), + &amount_missing), GNUNET_JSON_spec_end () }; @@ -220,11 +260,15 @@ TALER_FAKEBANK_tbi_post_withdrawal ( json_decref (json); return (GNUNET_NO == ret) ? MHD_YES : MHD_NO; } + + amount_ptr = amount_missing ? NULL : &amount; + res = do_post_withdrawal (h, connection, wopid, &reserve_pub, - exchange_payto_url); + exchange_payto_url, + amount_ptr); } json_decref (json); return res; diff --git a/src/exchangedb/exchangedb_accounts.c b/src/exchangedb/exchangedb_accounts.c index e668134e1..3f0e47afb 100644 --- a/src/exchangedb/exchangedb_accounts.c +++ b/src/exchangedb/exchangedb_accounts.c @@ -190,27 +190,35 @@ add_account_cb (void *cls, ( (credit) && (lc->credit) ) ) ) return; /* not enabled for us, skip */ - if (GNUNET_OK != + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, section, "PAYTO_URI", &payto_uri)) { - GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING, - section, - "PAYTO_URI"); - return; + method = TALER_payto_get_method (payto_uri); + GNUNET_free (payto_uri); + if (NULL == method) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "payto URI in config ([%s]/PAYTO_URI) malformed\n", + section); + lc->res = GNUNET_SYSERR; + return; + } } - method = TALER_payto_get_method (payto_uri); - GNUNET_free (payto_uri); - if (NULL == method) + else if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cfg, + section, + "WIRE_METHOD", + &method)) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "payto URI in config ([%s]/PAYTO_URI) malformed\n", - section); - lc->res = GNUNET_SYSERR; + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING, + section, + "WIRE_METHOD"); return; } + GNUNET_assert (NULL != method); wa = GNUNET_new (struct WireAccount); wa->section_name = GNUNET_strdup (section); wa->method = method; diff --git a/src/testing/testing_api_cmd_signal.c b/src/testing/testing_api_cmd_signal.c index b2116ebf6..be3a58bdd 100644 --- a/src/testing/testing_api_cmd_signal.c +++ b/src/testing/testing_api_cmd_signal.c @@ -62,7 +62,6 @@ signal_run (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Signaling '%d'..\n", ss->signal); - sleep (6); TALER_TESTING_interpreter_next (is); } |