From 37f294b6add3ff4780b14ad54331e98c47b8453a Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 6 Jan 2023 11:05:05 -0500 Subject: [PATCH 1/7] modifications to batch1 --- .../exchange_do_batch_reserves_in_insert.sql | 50 +++++++++++-------- src/exchangedb/pg_batch2_reserves_in_insert.c | 2 + 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/exchangedb/exchange_do_batch_reserves_in_insert.sql b/src/exchangedb/exchange_do_batch_reserves_in_insert.sql index 4e0383f6c..d1cc35d3e 100644 --- a/src/exchangedb/exchange_do_batch_reserves_in_insert.sql +++ b/src/exchangedb/exchange_do_batch_reserves_in_insert.sql @@ -32,7 +32,10 @@ CREATE OR REPLACE FUNCTION exchange_do_batch_reserves_in_insert( OUT ruuid INT8) LANGUAGE plpgsql AS $$ - +DECLARE + curs refcursor; +DECLARE + i RECORD; BEGIN ruuid= 0; out_reserve_found = TRUE; @@ -46,28 +49,35 @@ transaction_duplicate= TRUE; ,in_payto_uri) ON CONFLICT DO NOTHING; - INSERT INTO reserves - (reserve_pub - ,current_balance_val - ,current_balance_frac - ,expiration_date - ,gc_date) - VALUES - (in_reserve_pub - ,in_credit_val - ,in_credit_frac - ,in_expiration_date - ,in_gc_date) - ON CONFLICT DO NOTHING - RETURNING reserves.reserve_uuid INTO ruuid; + OPEN curs FOR + WITH reserve_changes AS ( + INSERT INTO reserves + (reserve_pub + ,current_balance_val + ,current_balance_frac + ,expiration_date + ,gc_date) + VALUES + (in_reserve_pub + ,in_credit_val + ,in_credit_frac + ,in_expiration_date + ,in_gc_date) + ON CONFLICT DO NOTHING + RETURNING reserve_uuid, reserve_pub) + SELECT * FROM reserve_changes; + FETCH FROM curs INTO i; IF FOUND THEN -- We made a change, so the reserve did not previously exist. - out_reserve_found = FALSE; - ELSE - -- We made no change, which means the reserve existed. - out_reserve_found = TRUE; + IF in_reserve_pub = i.reserve_pub + THEN + out_reserve_found = FALSE; + ruuid = i.reserve_uuid; + END IF; END IF; + CLOSE curs; + PERFORM pg_notify(in_notify, NULL); INSERT INTO reserves_in (reserve_pub @@ -92,7 +102,7 @@ transaction_duplicate= TRUE; transaction_duplicate = FALSE; ELSE -- Unhappy... --- RAISE EXCEPTION 'Reserve did not exist, but INSERT into reserves_in gave conflict'; + RAISE EXCEPTION 'Reserve did not exist, but INSERT into reserves_in gave conflict'; transaction_duplicate = TRUE; -- ROLLBACK; END IF; diff --git a/src/exchangedb/pg_batch2_reserves_in_insert.c b/src/exchangedb/pg_batch2_reserves_in_insert.c index a55c518c3..e0208f094 100644 --- a/src/exchangedb/pg_batch2_reserves_in_insert.c +++ b/src/exchangedb/pg_batch2_reserves_in_insert.c @@ -763,6 +763,7 @@ TEH_PG_batch2_reserves_in_insert (void *cls, t_duplicate |= transaction_duplicate[i+1]; t_duplicate |= transaction_duplicate[i+2]; t_duplicate |= transaction_duplicate[i+3]; + // fprintf(stdout, "reserve_uuid : %ld %ld %ld %ld\n", reserve_uuid[i], reserve_uuid[i+1], reserve_uuid[i+2], reserve_uuid[i+3]); i += 4; break; case 3: @@ -792,6 +793,7 @@ TEH_PG_batch2_reserves_in_insert (void *cls, results[i] = (t_duplicate) ? GNUNET_DB_STATUS_SUCCESS_NO_RESULTS : GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; + // fprintf(stdout, "reserve_uuid : %ld %ld\n", reserve_uuid[i], reserve_uuid[i+1]); i += 2; break; case 1: From 1a94db3d4943b6fbec9e3c3131dc8b9b6ad233f6 Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 6 Jan 2023 11:05:53 -0500 Subject: [PATCH 2/7] some changes to batchtest --- src/exchangedb/exchange_do_batch2_reserves_in_insert.sql | 1 - src/exchangedb/exchange_do_batch4_reserves_in_insert.sql | 2 +- src/exchangedb/test_exchangedb_by_j.c | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/exchangedb/exchange_do_batch2_reserves_in_insert.sql b/src/exchangedb/exchange_do_batch2_reserves_in_insert.sql index bda644eca..932f7d813 100644 --- a/src/exchangedb/exchange_do_batch2_reserves_in_insert.sql +++ b/src/exchangedb/exchange_do_batch2_reserves_in_insert.sql @@ -55,7 +55,6 @@ DECLARE DECLARE k INT8; BEGIN - --SIMPLE INSERT ON CONFLICT DO NOTHING transaction_duplicate=TRUE; transaction_duplicate2=TRUE; out_reserve_found = TRUE; diff --git a/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql b/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql index c2157f7d3..a70521bcd 100644 --- a/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql +++ b/src/exchangedb/exchange_do_batch4_reserves_in_insert.sql @@ -267,7 +267,7 @@ BEGIN END IF; k=k+1; END LOOP; - + /**ROLLBACK TRANSACTION IN SOTRED PROCEDURE IS IT PROSSIBLE ?**/ /*IF transaction_duplicate OR transaction_duplicate2 OR transaction_duplicate3 diff --git a/src/exchangedb/test_exchangedb_by_j.c b/src/exchangedb/test_exchangedb_by_j.c index 9769d964b..533871cca 100644 --- a/src/exchangedb/test_exchangedb_by_j.c +++ b/src/exchangedb/test_exchangedb_by_j.c @@ -107,7 +107,7 @@ run (void *cls) const char *sndr = "payto://x-taler-bank/localhost:8080/1"; struct TALER_Amount value; unsigned int batch_size = batches[i]; - unsigned int iterations = 16;//1024*10; + unsigned int iterations = 10000;//1024*10; struct TALER_ReservePublicKeyP reserve_pubs[iterations]; struct GNUNET_TIME_Absolute now; struct GNUNET_TIME_Timestamp ts; From 28c3ae47de7428b4f7019db9158390f8d14ca93d Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 6 Jan 2023 11:15:32 -0500 Subject: [PATCH 3/7] try batch1 with cursor --- .../exchange_do_batch_reserves_in_insert.sql | 20 ++++++++++++------- src/exchangedb/pg_batch2_reserves_in_insert.c | 2 +- src/exchangedb/test_exchangedb_by_j.c | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/exchangedb/exchange_do_batch_reserves_in_insert.sql b/src/exchangedb/exchange_do_batch_reserves_in_insert.sql index d1cc35d3e..c95f75c3c 100644 --- a/src/exchangedb/exchange_do_batch_reserves_in_insert.sql +++ b/src/exchangedb/exchange_do_batch_reserves_in_insert.sql @@ -36,6 +36,8 @@ DECLARE curs refcursor; DECLARE i RECORD; +DECLARE + curs_trans refcursor; BEGIN ruuid= 0; out_reserve_found = TRUE; @@ -79,6 +81,8 @@ transaction_duplicate= TRUE; CLOSE curs; PERFORM pg_notify(in_notify, NULL); + OPEN curs_trans FOR + WITH reserve_transaction AS( INSERT INTO reserves_in (reserve_pub ,wire_reference @@ -95,16 +99,18 @@ transaction_duplicate= TRUE; ,in_exchange_account_name ,in_wire_source_h_payto ,in_expiration_date) - ON CONFLICT DO NOTHING; + ON CONFLICT DO NOTHING + RETURNING reserve_pub) + SELECT * FROM reserve_transaction; + FETCH FROM curs_trans INTO i; IF FOUND THEN + IF i.reserve_pub = in_reserve_pub + THEN -- HAPPY PATH THERE IS NO DUPLICATE TRANS - transaction_duplicate = FALSE; - ELSE - -- Unhappy... - RAISE EXCEPTION 'Reserve did not exist, but INSERT into reserves_in gave conflict'; - transaction_duplicate = TRUE; --- ROLLBACK; + transaction_duplicate = FALSE; + END IF; END IF; + CLOSE curs_trans; RETURN; END $$; diff --git a/src/exchangedb/pg_batch2_reserves_in_insert.c b/src/exchangedb/pg_batch2_reserves_in_insert.c index e0208f094..1ef9045da 100644 --- a/src/exchangedb/pg_batch2_reserves_in_insert.c +++ b/src/exchangedb/pg_batch2_reserves_in_insert.c @@ -817,7 +817,7 @@ TEH_PG_batch2_reserves_in_insert (void *cls, } need_update |= conflicts[i]; t_duplicate |= transaction_duplicate[i]; - // fprintf(stdout, "reserve uuid : %ld c :%d t:%d\n", reserve_uuid[i], conflicts[i], transaction_duplicate[i]); + // fprintf(stdout, "reserve uuid : %ld c :%d t:%d\n", reserve_uuid[i], conflicts[i], transaction_duplicate[i]); i += 1; break; case 0: diff --git a/src/exchangedb/test_exchangedb_by_j.c b/src/exchangedb/test_exchangedb_by_j.c index 533871cca..9769d964b 100644 --- a/src/exchangedb/test_exchangedb_by_j.c +++ b/src/exchangedb/test_exchangedb_by_j.c @@ -107,7 +107,7 @@ run (void *cls) const char *sndr = "payto://x-taler-bank/localhost:8080/1"; struct TALER_Amount value; unsigned int batch_size = batches[i]; - unsigned int iterations = 10000;//1024*10; + unsigned int iterations = 16;//1024*10; struct TALER_ReservePublicKeyP reserve_pubs[iterations]; struct GNUNET_TIME_Absolute now; struct GNUNET_TIME_Timestamp ts; From 6cb8b68bd08ddb5edff396e293b6776e0e989ded Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 6 Jan 2023 22:22:14 +0100 Subject: [PATCH 4/7] support md in TOS --- contrib/Makefile.am | 2 ++ contrib/update-pp.sh | 4 ++++ contrib/update-tos.sh | 4 ++++ src/mhd/mhd_legal.c | 1 + 4 files changed, 11 insertions(+) diff --git a/contrib/Makefile.am b/contrib/Makefile.am index cc1cf4d7f..99927e7e6 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -26,6 +26,7 @@ rdatadir=$(datadir)/taler/exchange tosen_DATA = \ tos/en/*.txt \ + tos/en/*.md \ tos/en/*.pdf \ tos/en/*.epub \ tos/en/*.xml \ @@ -33,6 +34,7 @@ tosen_DATA = \ ppen_DATA = \ pp/en/*.txt \ + pp/en/*.md \ pp/en/*.pdf \ pp/en/*.epub \ pp/en/*.xml \ diff --git a/contrib/update-pp.sh b/contrib/update-pp.sh index 948f6af35..728216c58 100755 --- a/contrib/update-pp.sh +++ b/contrib/update-pp.sh @@ -29,6 +29,10 @@ do else mv _build/$f/${VERSION}.$f $l/${VERSION}.$f fi + if test $f = "txt" + then + cp $l/${VERSION}.$f $l/${VERSION}.md + fi done done cd .. diff --git a/contrib/update-tos.sh b/contrib/update-tos.sh index 67db7c031..dcf9e3919 100755 --- a/contrib/update-tos.sh +++ b/contrib/update-tos.sh @@ -29,6 +29,10 @@ do else mv _build/$f/${VERSION}.$f $l/${VERSION}.$f fi + if test $f = "txt" + then + cp $l/${VERSION}.$f $l/${VERSION}.md + fi done done cd .. diff --git a/src/mhd/mhd_legal.c b/src/mhd/mhd_legal.c index c801f84cd..25435210e 100644 --- a/src/mhd/mhd_legal.c +++ b/src/mhd/mhd_legal.c @@ -388,6 +388,7 @@ load_terms (struct TALER_MHD_Legal *legal, { .ext = ".html", .mime = "text/html", .priority = 100 }, { .ext = ".htm", .mime = "text/html", .priority = 99 }, { .ext = ".txt", .mime = "text/plain", .priority = 50 }, + { .ext = ".md", .mime = "text/markdown", .priority = 50 }, { .ext = ".pdf", .mime = "application/pdf", .priority = 25 }, { .ext = ".jpg", .mime = "image/jpeg" }, { .ext = ".jpeg", .mime = "image/jpeg" }, From 854e9fda1ee848b18fc34b2e02c62852c12096cc Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 6 Jan 2023 22:23:44 +0100 Subject: [PATCH 5/7] update md files --- contrib/pp/en/pp-v0.epub | Bin 14943 -> 14943 bytes contrib/pp/en/pp-v0.html | 2 +- contrib/pp/en/pp-v0.md | 237 ++++++++++++++++++++++++++ contrib/pp/en/pp-v0.pdf | Bin 77785 -> 77874 bytes contrib/tos/en/tos-v0.epub | Bin 24308 -> 24313 bytes contrib/tos/en/tos-v0.html | 4 +- contrib/tos/en/tos-v0.md | 337 +++++++++++++++++++++++++++++++++++++ contrib/tos/en/tos-v0.pdf | Bin 82064 -> 82566 bytes 8 files changed, 577 insertions(+), 3 deletions(-) create mode 100644 contrib/pp/en/pp-v0.md create mode 100644 contrib/tos/en/tos-v0.md diff --git a/contrib/pp/en/pp-v0.epub b/contrib/pp/en/pp-v0.epub index b564671b89da7ba8986ffee54c6e4f9d9e7fafcc..2827fcbeecceb32c276f822776adbd0393a4fe80 100644 GIT binary patch delta 929 zcmca#a=&DQ93#iGO=@A6M2_v9tj4HbAL%#w&;}6^-ATS;jF0kmX=Y@l2v78ww&c%` z-+dZC-dQ$Mu#>)IP8m%Vmb%6OHpj$Sx*^Um_hSv>0&nRo^pJrs@j zw53cg%YELyiT>aF`MV#gUYvI4{@)6P=8B4+mJfd2(9KR4Q0kuR&gXR_^V_+u>H}Pt z5~uJidQvrM+2Rt5dZ{J*cL`^gTj#!JGnr$S@YiZ_>xYDF^Hmprd+5C2o?!OIW}$iR z`?^`u!n%{pSuB{9mh^bp)VdevOIJAG30YOziT%MQz6;o4?1(H+yaPvG7>du3cLfsMMGmSv|bW z)uDH?e2?EPv-7*Q9shp8@b&%=KjQrSmo6SPXO()F_!NQaO!5GFC e77&qq3sVSVg@rYQ@!aAogz>=A4#H5fvIPLrs=Da_ delta 929 zcmca#a=&DQ93w|_WNv6c%BzW!)fm<5Px?(hv_V8fcapCdC z-g?QC@JA;7RjQNA&z%ViE>>HM_Z@^Sq^EHP=kMcIeAND+&_dV8U!?kd$gA4v$XAenQZ9X@5(KaC-sf>-1$3L08 zH%?sVb!3^f%@(06Q{Mi+ueIk3@09IfdOIT~N8k0>*jIn4E_wCp1Dx8u$Lmf#+^{I8 zzE)dIY{&I)4m%=mcW(Ie|-78p!t!!Nb6>S$hS5{0f+oHmxtYP zmYk$sIq%8i-!}7~EUxz~`?uPDdTEhcJ_Y55!lY%V@CuT=c%n|814L)(s-A&EZs*SN2LvCQ*_R}$ZvOWp@($Hx2@ zdA3+yY+VZPIew4Me1m-)s$o-f3jDZVZS{D3Urg(y@P4y^3kEYe_~xaou3z%WIAqSF zKLLm4E&Nf`eCT+|)(?)~lyq{wFIi~Hxvt$tnR%A+NwW`@8a7%HdzB9tChb!^7XJJG zj*D#HZ&&gN<{X3f#_1;D{*|LU-y7v-w^yHt{ zRG!LQ`sxn5!*hSfWj_U;Kaxzh?Kl5czdF6ec%wO6aQYIarfu@a4kSEcIcu@~!J#wi zQ@1G8{P|{j@6z5Z1A8%%)i)wK|0Y}C7858wcD%Cv`(1%%uMIyI9?SZ*YwH4)I#aHy z^Xa?-v6J6d%xy92-&J;i|AMCUz7J311H748L>L$tI2b?)KlX`KtNVX2$VLds1i%?-iAlmEdO g#ugS3k$ekN2xEnXHH7ip;wyylz|s!FP_nWG0KXEood5s; diff --git a/contrib/pp/en/pp-v0.html b/contrib/pp/en/pp-v0.html index e248db2e0..57b942607 100644 --- a/contrib/pp/en/pp-v0.html +++ b/contrib/pp/en/pp-v0.html @@ -202,4 +202,4 @@ privacy practices that are not addressed in this Privacy Statement.

- \ No newline at end of file + \ No newline at end of file diff --git a/contrib/pp/en/pp-v0.md b/contrib/pp/en/pp-v0.md new file mode 100644 index 000000000..d6e42faf6 --- /dev/null +++ b/contrib/pp/en/pp-v0.md @@ -0,0 +1,237 @@ +Privacy Policy +************** + +Last Updated: 11.12.2019 + +This Privacy Policy describes the policies and procedures of Taler +Systems SA (“we,” “our,” or “us”) pertaining to the collection, use, +and disclosure of your information on our sites and related mobile +applications and products we offer (the “Services” or “Taler Wallet”). +This Privacy Statement applies to your personal data when you use our +Services, and does not apply to online websites or services that we do +not own or control. + + +Overview +======== + +Your privacy is important to us. We follow a few fundamental +principles: We don’t ask you for personally identifiable information +(defined below). That being said, your contact information, such as +your phone number, social media handle, or email address (depending on +how you contact us), may be collected when you communicate with us, +for example to report a bug or other error related to the Taler +Wallet. We don’t share your information with third parties except when +strictly required to deliver you our Services and products, or to +comply with the law. If you have any questions or concerns about this +policy, please reach out to us at privacy@taler-systems.net. + + +How you accept this policy +========================== + +By using our Services or visiting our sites, you agree to the use, +disclosure, and procedures outlined in this Privacy Policy. + + +What personal information do we collect from our users? +======================================================= + +The information we collect from you falls into two categories: (i) +personally identifiable information (i.e., data that could potentially +identify you as an individual) (“Personal Information”), and (ii) non- +personally identifiable information (i.e., information that cannot be +used to identify who you are) (“Non-Personal Information”). This +Privacy Policy covers both categories and will tell you how we might +collect and use each type. + +We do our best to not collect any Personal Information from Taler +Wallet users. We believe that the Taler Wallet never transmits +personal information to our services without at least clear implied +consent, and we only process and retain information with a strict +business need. That being said, when using our Services, we inherently +have to collect the following information: + + * Bank account details necessary when receiving funds from you to + top-up your wallet or to transfer funds to you when you are being + paid via Taler. At the current experimental stage, only the + pseudonym and password you entered in the bank demonstrator is + stored. + + * The amounts being withdrawn or deposited, with associated unique + transaction identifiers and cryptographic signatures authorizing + the transaction. Note that for purchases, we cannot identify the + buyer from the collected data, so when you spend money, we only + receive non-personal information. + + * When you contact us. We may collect certain information if you + choose to contact us, for example to report a bug or other error + with the Taler Wallet. This may include contact information such + as your name, email address or phone number depending on the + method you choose to contact us. + + +How we collect and process information +====================================== + +We may process your information for the following reasons: + + * to transfer money as specified by our users (Taler transactions); + + * to assist government entities in linking income to the underlying + contract as required by law and local regulations + + * to support you using the Taler Wallet or to improve our Services + + +How we share and use the information we gather +============================================== + +We may share your Personal Data or other information about you only if +you are a merchant receiving income, with your bank, to the degree +necessary to execute the payment. + +We retain Personal Data to transfer funds to the accounts designated +by our users. We may retain Personal Data only for as long as mandated +by law and required for the wire transfers. + +We primarily use the limited information we receive directly from you +to enhance the Taler Wallet. Some ways we may use your Personal +Information are to: Contact you when necessary to respond to your +comments, answer your questions, or obtain additional information on +issues related to bugs or errors with the Taler Wallet that you +reported. + + +Agents or third party partners +============================== + +We may provide your Personal Information to our employees, +contractors, agents, service providers, and designees (“Agents”) to +enable them to perform certain services for us exclusively, including: +improvement and maintenance of our software and Services. + + +Protection of us and others +=========================== + +We reserve the right to access, read, preserve, and disclose any +information that we reasonably believe is necessary to comply with the +law or a court order. + + +What personal information can I access or change? +================================================= + +You can request access to the information we have collected from you. +You can do this by contacting us at privacy@taler-systems.net. We will +make sure to provide you with a copy of the data we process about you. +To comply with your request, we may ask you to verify your identity. +We will fulfill your request by sending your copy electronically. For +any subsequent access request, we may charge you with an +administrative fee. If you believe that the information we have +collected is incorrect, you are welcome to contact us so we can update +it and keep your data accurate. Any data that is no longer needed for +purposes specified in the “How We Use the Information We Gather” +section will be deleted after ninety (90) days. + + +What are your data protection rights? +===================================== + +Anastasis would like to make sure you are fully aware of all of your +data protection rights. Every user is entitled to the following: + +**The right to access**: You have the right to request Anastasis for + copies of your personal data. We may charge you a small fee for + this service. + +**The right to rectification**: You have the right to request that +Anastasis correct any information you believe is inaccurate. You also +have the right to request Anastasis to complete information you +believe is incomplete. The right to erasure - You have the right to +request that Anastasis erase your personal data, under certain +conditions. + +**The right to restrict processing**: You have the right to request + that Anastasis restrict the processing of your personal data, under + certain conditions. + +**The right to object to processing**: You have the right to object to + Anastasis's processing of your personal data, under certain + conditions. + +**The right to data portability**: You have the right to request that + Anastasis transfer the data that we have collected to another + organization, or directly to you, under certain conditions. + +If you make a request, we have one month to respond to you. If you +would like to exercise any of these rights, please contact us at our +email: privacy@taler-systems.com + +You can always contact your local data protection authority to enforce +your rights. + + +Data retention +============== + +If you uninstall the Taler Wallet mobile applications from your +device, or request that your information be deleted, we still may +retain some information that you have provided to us to maintain the +Taler Wallet or to comply with relevant laws. + + +Data security +============= + +We are committed to making sure your information is protected. We +employ several physical and electronic safeguards to keep your +information safe, including encrypted user passwords, two factor +verification and authentication on passwords where possible, and +securing connections with industry standard transport layer security. +You are also welcome to contact us using GnuPG encrypted e-mail. Even +with all these precautions, we cannot fully guarantee against the +access, disclosure, alteration, or deletion of data through events, +including but not limited to hardware or software failure or +unauthorized use. Any information that you provide to us is done so +entirely at your own risk. + + +Changes and updates to privacy policy +===================================== + +We reserve the right to update and revise this privacy policy at any +time. We occasionally review this Privacy Policy to make sure it +complies with applicable laws and conforms to changes in our business. +We may need to update this Privacy Policy, and we reserve the right to +do so at any time. If we do revise this Privacy Policy, we will update +the “Effective Date” at the bottom of this page so that you can tell +if it has changed since your last visit. As we generally do not +collect contact information and also do not track your visits, we will +not be able to notify you directly. However, the Taler Wallet may +inform you about a change in the privacy policy once it detects that +the policy has changed. Please review this Privacy Policy regularly to +ensure that you are aware of its terms. Any use of our Services after +an amendment to our Privacy Policy constitutes your acceptance to the +revised or amended agreement. + + +International users and visitors +================================ + +Our Services are hosted in Switzerland. If you are a user accessing +the Services from the European Union, Asia, US, or any other region +with laws or regulations governing personal data collection, use, and +disclosure that differ from Swiss laws, please be advised that through +your continued use of the Services, which is governed by Swiss law, +you are transferring your Personal Information to Switzerland and you +consent to that transfer. + + +Questions +========= + +Please contact us at privacy@taler-systems.net if you have questions +about our privacy practices that are not addressed in this Privacy +Statement. diff --git a/contrib/pp/en/pp-v0.pdf b/contrib/pp/en/pp-v0.pdf index 67f5b71b0c03074ac6eb3d19bceb46be07f05052..eab50dee7963362c2cb4be1109906810f290c64c 100644 GIT binary patch delta 15192 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 H*x&yFt*Mo~ diff --git a/contrib/tos/en/tos-v0.epub b/contrib/tos/en/tos-v0.epub index 11461a6158dd61f39fa92efafba81c0529d6a86a..af588b1809e16f44b280a2489c6b38ff87ffe877 100644 GIT binary patch delta 1295 zcmeyem+|Lb#tm|e^=~$*g*_E0`Nho4z%Yq}fq|QWfgw3RuOv0EL@&P}ZS6GQ{M!aR zZSVhzHu*_&MfY9a>MF2Y!feZQIX08sZ;VbD&E?pt>O1N3ll%Rf=Dz<@{Q2axI6EcH zpie*2BEwS{uX(ODvg#1_a^Q^hFg^X^{L9=D-+Z<7mu9TgiC4*j^%u> zUi{%wxWUY(wXzpgD;aiAV2Ua<-x?_Ppk?Z@WS7Zyv1@b6Ym~*rc3dy>-ywIqYs;sw zXJ;oCq}M2$`Nnygx7WTbD^cE3WcEF8l3H`OhVP{*K9#J~Y}U+S=lS$d`)A4b$946F zHtM$~?Y{l~dx`-6dHd}6aKa7?d$n|d&({&KiFn)805(Dn^? zIaQ}kIkPd;_|?{q+vlaYPAcy=nsD*L91cF$lhXnp7KhA9<_am+41STa@+Qr*+w-U{m)XehdYql z>z20m;^2AV0_!&CS4?T`nX~T0y!*k&*Ze;`;}2_qH#3U}FmG@$fO5=cPZo1V7BH)Y zRY@AcTBXnk71LJ|mx73S*~IfeSZh7@^Fmk!VcaYbR(;eQMqZR0I9Ve`#}Xv+EB2qS z7$XCN0TTlQJJ4PjSkmag!oX0HpRAXcToK^S$RxsyaMtAB7^(VdRtAQov<%%c1HFoj zlH440MJqjhiXwp~UjdrT2QwB(FKJw;z`&56nwOcEl3IaXZ`5u6)1U7mll2R7N{jUh^3u^=obp2U%3Wajv_^=50pwX2Skjn2c|x4BBPhJOS{#`E0wq=h jeZ~n>0Hl{RmPIizRn3Q8~n1SUQ&?@VDft5v?|i8-sk-y>8jbWK0M<7HEb+bPt`9idAC>6cw3BK za^wu7Yh}mUnh%;@Ube*gj>dxvDKQ@#m|gWf7C(8}c|nJdfZ*hUpUEB_a(1#&O(is>?&CjQ>P zolC!#^`=P9+YY^x$~Rg?E_Cf)yLJ zX|8@~@7J|AOe$6H%J41SeRb`HQ#bGI&av=Vx9DMlg-UQ-qiTQlbH>Rvf1K>@)YnJU z_vm$Qd-CtyZD!9$7oQ#%yM8+_a<`b`rW>Uv9XYJe#;x7au4BuSi5`0kyF;Q zDsLaqep9sa(1d+a{k4l$YdzBLv@>whXI)=bb~m_wMqggYj!CK(_mx%m?fs^zv2jsK zU+}D;^{#jRtywt1=2JGaCU0@)gA4sRqM~;0M^*j!Ro}226_*yVJGOc!|EB$i4wbpT z3ZDGH>IA3c2E)Y%+2&3EoMBkO{NG0Z=7+Qe8@_D#mHwz8-1ED=l1y&J{yFZ#2aDb< z>1Zu(59n`K&aMwXU%al*GV$x%8UDv-1U;IVyCId|VAC<>iCa%Ux18T^xizG>n*GHu ziIi34g?WA!uOq7&_e3bmY}&hXmW8sYz?{W(>v*jCHtbFpi?MK6wO% z7xK(mi*I}ps!p@6tdmY(dMLo+-chgo(a3>}HqXxIA<^6}Y`oOnnMDMcEjSoJnPsydi#a0;nAORuBn@G$ zS7?NanJ9@%LB#xR;&~vfO&Terms Of Service — Taler Exchange Terms of Service - + @@ -295,4 +295,4 @@ message on our contact page at - \ No newline at end of file + \ No newline at end of file diff --git a/contrib/tos/en/tos-v0.md b/contrib/tos/en/tos-v0.md new file mode 100644 index 000000000..c124d70ee --- /dev/null +++ b/contrib/tos/en/tos-v0.md @@ -0,0 +1,337 @@ +Terms Of Service +**************** + +Last Updated: 12.4.2019 + +Welcome! Taler Systems SA (“we,” “our,” or “us”) provides a payment +service through our Internet presence (collectively the “Services”). +Before using our Services, please read the Terms of Service (the +“Terms” or the “Agreement”) carefully. + + +Overview +======== + +This section provides a brief summary of the highlights of this +Agreement. Please note that when you accept this Agreement, you are +accepting all of the terms and conditions and not just this section. +We and possibly other third parties provide Internet services which +interact with the Taler Wallet’s self-hosted personal payment +application. When using the Taler Wallet to interact with our +Services, you are agreeing to our Terms, so please read carefully. + + +Highlights: +----------- + + * You are responsible for keeping the data in your Taler Wallet at + all times under your control. Any losses arising from you not + being in control of your private information are your problem. + + * We will try to transfer funds we hold in escrow for our users to + any legal recipient to the best of our ability within the + limitations of the law and our implementation. However, the + Services offered today are highly experimental and the set of + recipients of funds is severely restricted. + + * For our Services, we may charge transaction fees. The specific + fee structure is provided based on the Taler protocol and should + be shown to you when you withdraw electronic coins using a Taler + Wallet. You agree and understand that the Taler protocol allows + for the fee structure to change. + + * You agree to not intentionally overwhelm our systems with + requests and follow responsible disclosure if you find security + issues in our services. + + * We cannot be held accountable for our Services not being + available due to circumstances beyond our control. If we modify + or terminate our services, we will try to give you the + opportunity to recover your funds. However, given the + experimental state of the Services today, this may not be + possible. You are strongly advised to limit your use of the + Service to small-scale experiments expecting total loss of all + funds. + +These terms outline approved uses of our Services. The Services and +these Terms are still at an experimental stage. If you have any +questions or comments related to this Agreement, please send us a +message to legal@taler-systems.com. If you do not agree to this +Agreement, you must not use our Services. + + +How you accept this policy +========================== + +By sending funds to us (to top-up your Taler Wallet), you acknowledge +that you have read, understood, and agreed to these Terms. We reserve +the right to change these Terms at any time. If you disagree with the +change, we may in the future offer you with an easy option to recover +your unspent funds. However, in the current experimental period you +acknowledge that this feature is not yet available, resulting in your +funds being lost unless you accept the new Terms. If you continue to +use our Services other than to recover your unspent funds, your +continued use of our Services following any such change will signify +your acceptance to be bound by the then current Terms. Please check +the effective date above to determine if there have been any changes +since you have last reviewed these Terms. + + +Services +======== + +We will try to transfer funds that we hold in escrow for our users to +any legal recipient to the best of our ability and within the +limitations of the law and our implementation. However, the Services +offered today are highly experimental and the set of recipients of +funds is severely restricted. The Taler Wallet can be loaded by +exchanging fiat currencies against electronic coins. We are providing +this exchange service. Once your Taler Wallet is loaded with +electronic coins they can be spent for purchases if the seller is +accepting Taler as a means of payment. We are not guaranteeing that +any seller is accepting Taler at all or a particular seller. The +seller or recipient of deposits of electronic coins must specify the +target account, as per the design of the Taler protocol. They are +responsible for following the protocol and specifying the correct bank +account, and are solely liable for any losses that may arise from +specifying the wrong account. We will allow the government to link +wire transfers to the underlying contract hash. It is the +responsibility of recipients to preserve the full contracts and to pay +whatever taxes and charges may be applicable. Technical issues may +lead to situations where we are unable to make transfers at all or +lead to incorrect transfers that cannot be reversed. We will only +refuse to execute transfers if the transfers are prohibited by a +competent legal authority and we are ordered to do so. + +When using our Services, you agree to not take any action that +intentionally imposes an unreasonable load on our infrastructure. If +you find security problems in our Services, you agree to first report +them to security@taler-systems.com and grant us the right to publish +your report. We warrant that we will ourselves publicly disclose any +issues reported within 3 months, and that we will not prosecute anyone +reporting security issues if they did not exploit the issue beyond a +proof-of-concept, and followed the above responsible disclosure +practice. + + +Fees +==== + +You agree to pay the fees for exchanges and withdrawals completed via +the Taler Wallet ("Fees") as defined by us, which we may change from +time to time. With the exception of wire transfer fees, Taler +transaction fees are set for any electronic coin at the time of +withdrawal and fixed throughout the validity period of the respective +electronic coin. Your wallet should obtain and display applicable fees +when withdrawing funds. Fees for coins obtained as change may differ +from the fees applicable to the original coin. Wire transfer fees that +are independent from electronic coins may change annually. You +authorize us to charge or deduct applicable fees owed in connection +with deposits, exchanges and withdrawals following the rules of the +Taler protocol. We reserve the right to provide different types of +rewards to users either in the form of discount for our Services or in +any other form at our discretion and without prior notice to you. + + +Eligibility and Financial self-responsibility +============================================= + +To be eligible to use our Services, you must be able to form legally +binding contracts or have the permission of your legal guardian. By +using our Services, you represent and warrant that you meet all +eligibility requirements that we outline in these Terms. + +You will be responsible for maintaining the availability, integrity +and confidentiality of the data stored in your wallet. When you setup +a Taler Wallet, you are strongly advised to follow the precautionary +measures offered by the software to minimize the chances to losse +access to or control over your Wallet data. We will not be liable for +any loss or damage arising from your failure to comply with this +paragraph. + + +Copyrights and trademarks +========================= + +The Taler Wallet is released under the terms of the GNU General Public +License (GNU GPL). You have the right to access, use, and share the +Taler Wallet, in modified or unmodified form. However, the GPL is a +strong copyleft license, which means that any derivative works must be +distributed under the same license terms as the original software. If +you have any questions, you should review the GNU GPL’s full terms and +conditions at https://www.gnu.org/licenses/gpl-3.0.en.html. “Taler” +itself is a trademark of Taler Systems SA. You are welcome to use the +name in relation to processing payments using the Taler protocol, +assuming your use is compatible with an official release from the GNU +Project that is not older than two years. + + +Limitation of liability & disclaimer of warranties +================================================== + +You understand and agree that we have no control over, and no duty to +take any action regarding: Failures, disruptions, errors, or delays in +processing that you may experience while using our Services; The risk +of failure of hardware, software, and Internet connections; The risk +of malicious software being introduced or found in the software +underlying the Taler Wallet; The risk that third parties may obtain +unauthorized access to information stored within your Taler Wallet, +including, but not limited to your Taler Wallet coins or backup +encryption keys. You release us from all liability related to any +losses, damages, or claims arising from: + +1. user error such as forgotten passwords, incorrectly constructed + transactions; + +2. server failure or data loss; + +3. unauthorized access to the Taler Wallet application; + +4. bugs or other errors in the Taler Wallet software; and + +5. any unauthorized third party activities, including, but not limited + to, the use of viruses, phishing, brute forcing, or other means of + attack against the Taler Wallet. We make no representations + concerning any Third Party Content contained in or accessed through + our Services. + +Any other terms, conditions, warranties, or representations associated +with such content, are solely between you and such organizations +and/or individuals. + +To the fullest extent permitted by applicable law, in no event will we +or any of our officers, directors, representatives, agents, servants, +counsel, employees, consultants, lawyers, and other personnel +authorized to act, acting, or purporting to act on our behalf +(collectively the “Taler Parties”) be liable to you under contract, +tort, strict liability, negligence, or any other legal or equitable +theory, for: + +1. any lost profits, data loss, cost of procurement of substitute + goods or services, or direct, indirect, incidental, special, + punitive, compensatory, or consequential damages of any kind + whatsoever resulting from: + + 1. your use of, or conduct in connection with, our services; + + 2. any unauthorized use of your wallet and/or private key due to + your failure to maintain the confidentiality of your wallet; + + 3. any interruption or cessation of transmission to or from the + services; or + + 4. any bugs, viruses, trojan horses, or the like that are found in + the Taler Wallet software or that may be transmitted to or + through our services by any third party (regardless of the + source of origination), or + +2. any direct damages. + +These limitations apply regardless of legal theory, whether based on +tort, strict liability, breach of contract, breach of warranty, or any +other legal theory, and whether or not we were advised of the +possibility of such damages. Some jurisdictions do not allow the +exclusion or limitation of liability for consequential or incidental +damages, so the above limitation may not apply to you. + +Our services are provided "as is" and without warranty of any kind. To +the maximum extent permitted by law, we disclaim all representations +and warranties, express or implied, relating to the services and +underlying software or any content on the services, whether provided +or owned by us or by any third party, including without limitation, +warranties of merchantability, fitness for a particular purpose, +title, non-infringement, freedom from computer virus, and any implied +warranties arising from course of dealing, course of performance, or +usage in trade, all of which are expressly disclaimed. In addition, we +do not represent or warrant that the content accessible via the +services is accurate, complete, available, current, free of viruses or +other harmful components, or that the results of using the services +will meet your requirements. Some states do not allow the disclaimer +of implied warranties, so the foregoing disclaimers may not apply to +you. This paragraph gives you specific legal rights and you may also +have other legal rights that vary from state to state. + + +Indemnity and Time limitation on claims and Termination +======================================================= + +To the extent permitted by applicable law, you agree to defend, +indemnify, and hold harmless the Taler Parties from and against any +and all claims, damages, obligations, losses, liabilities, costs or +debt, and expenses (including, but not limited to, attorney’s fees) +arising from: (a) your use of and access to the Services; (b) any +feedback or submissions you provide to us concerning the Taler Wallet; +(c) your violation of any term of this Agreement; or (d) your +violation of any law, rule, or regulation, or the rights of any third +party. + +You agree that any claim you may have arising out of or related to +your relationship with us must be filed within one year after such +claim arises, otherwise, your claim in permanently barred. + +In the event of termination concerning your use of our Services, your +obligations under this Agreement will still continue. + + +Discontinuance of services and Force majeure +============================================ + +We may, in our sole discretion and without cost to you, with or +without prior notice, and at any time, modify or discontinue, +temporarily or permanently, any portion of our Services. We will use +the Taler protocol’s provisions to notify Wallets if our Services are +to be discontinued. It is your responsibility to ensure that the Taler +Wallet is online at least once every three months to observe these +notifications. We shall not be held responsible or liable for any loss +of funds in the event that we discontinue or depreciate the Services +and your Taler Wallet fails to transfer out the coins within a three +months notification period. + +We shall not be held liable for any delays, failure in performance, or +interruptions of service which result directly or indirectly from any +cause or condition beyond our reasonable control, including but not +limited to: any delay or failure due to any act of God, act of civil +or military authorities, act of terrorism, civil disturbance, war, +strike or other labor dispute, fire, interruption in +telecommunications or Internet services or network provider services, +failure of equipment and/or software, other catastrophe, or any other +occurrence which is beyond our reasonable control and shall not affect +the validity and enforceability of any remaining provisions. + + +Governing law, Waivers, Severability and Assignment +=================================================== + +No matter where you’re located, the laws of Switzerland will govern +these Terms. If any provisions of these Terms are inconsistent with +any applicable law, those provisions will be superseded or modified +only to the extent such provisions are inconsistent. The parties agree +to submit to the ordinary courts in Zurich, Switzerland for exclusive +jurisdiction of any dispute arising out of or related to your use of +the Services or your breach of these Terms. + +Our failure to exercise or delay in exercising any right, power, or +privilege under this Agreement shall not operate as a waiver; nor +shall any single or partial exercise of any right, power, or privilege +preclude any other or further exercise thereof. + +You agree that we may assign any of our rights and/or transfer, sub- +contract, or delegate any of our obligations under these Terms. + +If it turns out that any part of this Agreement is invalid, void, or +for any reason unenforceable, that term will be deemed severable and +limited or eliminated to the minimum extent necessary. + +This Agreement sets forth the entire understanding and agreement as to +the subject matter hereof and supersedes any and all prior +discussions, agreements, and understandings of any kind (including, +without limitation, any prior versions of this Agreement) and every +nature between us. Except as provided for above, any modification to +this Agreement must be in writing and must be signed by both parties. + + +Questions or comments +===================== + +We welcome comments, questions, concerns, or suggestions. Please send +us a message on our contact page at legal@taler-systems.com. diff --git a/contrib/tos/en/tos-v0.pdf b/contrib/tos/en/tos-v0.pdf index 0091da7bf17c70dd6795e1c146ac30bfcb3f06fc..9bce47031b2b745648d1498d1497dd8c6012bdd6 100644 GIT binary patch delta 14087 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 From d782dd7f54a1b86c402a99428364e86f38552f76 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 7 Jan 2023 13:53:59 +0100 Subject: [PATCH 6/7] wirewatch: ensure wirewatch doesn't busy-loop even if the server errors or ignores long-polling --- src/exchange/taler-exchange-wirewatch.c | 30 ++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/exchange/taler-exchange-wirewatch.c b/src/exchange/taler-exchange-wirewatch.c index 337b11ca3..957060329 100644 --- a/src/exchange/taler-exchange-wirewatch.c +++ b/src/exchange/taler-exchange-wirewatch.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2016--2022 Taler Systems SA + Copyright (C) 2016--2023 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -51,6 +51,17 @@ static const struct TALER_EXCHANGEDB_AccountInfo *ai; */ static struct TALER_BANK_CreditHistoryHandle *hh; +/** + * Set to true if the request for history did actually + * return transaction items. + */ +static bool hh_returned_data; + +/** + * When did we start the last @e hh request? + */ +static struct GNUNET_TIME_Absolute hh_start_time; + /** * Until when is processing this wire plugin delayed? */ @@ -455,6 +466,18 @@ transaction_completed (void) GNUNET_SCHEDULER_shutdown (); return; } + if (! hh_returned_data) + { + /* Enforce long polling delay even if the server ignored it + and returned earlier */ + struct GNUNET_TIME_Relative latency; + struct GNUNET_TIME_Relative left; + + latency = GNUNET_TIME_absolute_get_duration (hh_start_time); + left = GNUNET_TIME_relative_subtract (LONGPOLL_TIMEOUT, + latency); + delayed_until = GNUNET_TIME_relative_to_absolute (left); + } GNUNET_assert (NULL == task); schedule_transfers (); } @@ -482,6 +505,7 @@ process_reply (const struct TALER_BANK_CreditDetails *details, transaction_completed (); return; } + hh_returned_data = true; /* check serial IDs for range constraints */ for (unsigned int i = 0; iauth, latest_row_off, From 0cf46d8e5995f84a642795ddf214776ed8d4077f Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 9 Jan 2023 19:35:16 +0100 Subject: [PATCH 7/7] -add index on shard --- src/exchangedb/0002-work_shards.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/exchangedb/0002-work_shards.sql b/src/exchangedb/0002-work_shards.sql index 016207d37..220745d43 100644 --- a/src/exchangedb/0002-work_shards.sql +++ b/src/exchangedb/0002-work_shards.sql @@ -49,3 +49,8 @@ CREATE INDEX work_shards_by_end_row_index ON work_shards (end_row DESC); +CREATE INDEX work_shards_by_rows + ON work_shards + (job_name + ,start_row + ,end_row);