From 239e6d114d83be59a446dea8ea26908b58e0c7b8 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Wed, 22 Oct 2025 21:04:21 +0100 Subject: [PATCH 1/4] website: update translations --- website/langs/de.json | 6 +-- website/langs/en.json | 88 +++++++++++++++++++++---------------------- website/langs/es.json | 18 ++++----- website/langs/hu.json | 6 +-- website/langs/id.json | 4 +- website/langs/it.json | 6 +-- website/langs/ru.json | 45 +++++++++++----------- 7 files changed, 87 insertions(+), 86 deletions(-) diff --git a/website/langs/de.json b/website/langs/de.json index 2bc365d609..c3d4035374 100644 --- a/website/langs/de.json +++ b/website/langs/de.json @@ -258,16 +258,16 @@ "docs-dropdown-14": "SimpleX für geschäftliche Anwendungen", "about-and-contact-us": "Über uns & Kontakt", "directory": "Verzeichnis", - "index-hero-h1": "Sei frei", + "index-hero-h1": "Sei
frei", "index-hero-h2": "Freiheit & Sicherheit
Ihrer Kommunikation", "index-hero-p1": "Das erste Netzwerk, in dem Sie Ihre Identität, Kontakte und Gruppen besitzen.", "index-hero-download-desktop-btn-title": "Download der SimpleX Desktop-App", - "index-google-play-title": "Öffentlicher iOS-Preview auf TestFlight", + "index-testflight-title": "Öffentlicher iOS-Preview auf TestFlight", "index-f-droid-title": "SimpleX F-Droid-Repository", "index-security-assessment-title": "Security-Gutachten", "index-security-review-2022-title": "Security-Überprüfung 2022", "index-security-review-2024-title": "Security-Überprüfung 2024", - "index-security-audits-label": "Security-Audits", + "index-security-audits-label": "Security-
Audits", "index-publications-privacy-guides-title": "Empfehlungen für Messenger", "index-publications-whonix-title": "Whonix - Empfehlungen für Messenger", "index-publications-heise-title": "Veröffentlichung", diff --git a/website/langs/en.json b/website/langs/en.json index 29d106d1b0..eeddf9db4a 100644 --- a/website/langs/en.json +++ b/website/langs/en.json @@ -15,7 +15,7 @@ "simplex-explained-tab-1-p-1": "You can create contacts and groups, and have two-way conversations, as in any other messenger.", "simplex-explained-tab-1-p-2": "How can it work with unidirectional queues and without user profile identifiers?", "simplex-explained-tab-2-p-1": "For each connection you use two separate messaging queues to send and receive messages via different servers.", - "simplex-explained-tab-2-p-2": "Servers only pass messages one way, without having the full picture of user's conversations or connections.", + "simplex-explained-tab-2-p-2": "Servers only pass messages one way, without having the full picture of user's conversations or connections.", "simplex-explained-tab-3-p-1": "The servers have separate anonymous credentials for each queue, and do not know which users they belong to.", "simplex-explained-tab-3-p-2": "Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address.", "chat-bot-example": "Chat bot example", @@ -98,7 +98,7 @@ "hero-overlay-card-1-p-3": "You define which server(s) to use to receive the messages, your contacts — the servers you use to send the messages to them. Every conversation is likely to use two different servers.", "hero-overlay-card-1-p-4": "This design prevents leaking any users' metadata on the application level. To further improve privacy and protect your IP address you can connect to messaging servers via Tor.", "hero-overlay-card-1-p-5": "Only client devices store user profiles, contacts and groups; the messages are sent with 2-layer end-to-end encryption.", - "hero-overlay-card-1-p-6": "Read more in SimpleX whitepaper.", + "hero-overlay-card-1-p-6": "Read more in SimpleX whitepaper.", "hero-overlay-card-2-p-1": "When users have persistent identities, even if this is just a random number, like a Session ID, there is a risk that the provider or an attacker can observe how the users are connected and how many messages they send.", "hero-overlay-card-2-p-2": "They could then correlate this information with the existing public social networks, and determine some real identities.", "hero-overlay-card-2-p-3": "Even with the most private apps that use Tor v3 services, if you talk to two different contacts via the same profile they can prove that they are connected to the same person.", @@ -106,26 +106,26 @@ "hero-overlay-card-3-p-1": "Trail of Bits is a leading security and technology consultancy whose clients include big tech, governmental agencies and major blockchain projects.", "hero-overlay-card-3-p-2": "Trail of Bits reviewed SimpleX network cryptography and networking components in November 2022. Read more.", "hero-overlay-card-3-p-3": "Trail of Bits reviewed cryptographic design of SimpleX network protocols in July 2024. Read more.", - "simplex-network-overlay-card-1-p-1": "P2P messaging protocols and apps have various problems that make them less reliable than SimpleX, more complex to analyse, and vulnerable to several types of attack.", - "simplex-network-overlay-card-1-li-1": "P2P networks rely on some variant of DHT to route messages. DHT designs have to balance delivery guarantee and latency. SimpleX has both better delivery guarantee and lower latency than P2P, because the message can be redundantly passed via several servers in parallel, using the servers chosen by the recipient. In P2P networks the message is passed through O(log N) nodes sequentially, using nodes chosen by the algorithm.", + "simplex-network-overlay-card-1-p-1": "P2P messaging protocols and apps have various problems that make them less reliable than SimpleX, more complex to analyse, and vulnerable to several types of attack.", + "simplex-network-overlay-card-1-li-1": "P2P networks rely on some variant of DHT to route messages. DHT designs have to balance delivery guarantee and latency. SimpleX has both better delivery guarantee and lower latency than P2P, because the message can be redundantly passed via several servers in parallel, using the servers chosen by the recipient. In P2P networks the message is passed through O(log N) nodes sequentially, using nodes chosen by the algorithm.", "simplex-network-overlay-card-1-li-2": "SimpleX design, unlike most P2P networks, has no global user identifiers of any kind, even temporary, and only uses temporary pairwise identifiers, providing better anonymity and metadata protection.", - "simplex-network-overlay-card-1-li-3": "P2P does not solve MITM attack problem, and most existing implementations do not use out-of-band messages for the initial key exchange. SimpleX uses out-of-band messages or, in some cases, pre-existing secure and trusted connections for the initial key exchange.", - "simplex-network-overlay-card-1-li-4": "P2P implementations can be blocked by some Internet providers (like BitTorrent). SimpleX is transport agnostic — it can work over standard web protocols, e.g. WebSockets.", - "simplex-network-overlay-card-1-li-5": "All known P2P networks may be vulnerable to Sybil attack, because each node is discoverable, and the network operates as a whole. Known measures to mitigate it require either a centralized component or expensive proof of work. SimpleX network has no server discoverability, it is fragmented and operates as multiple isolated sub-networks, making network-wide attacks impossible.", - "simplex-network-overlay-card-1-li-6": "P2P networks may be vulnerable to DRDoS attack, when the clients can rebroadcast and amplify traffic, resulting in network-wide denial of service. SimpleX clients only relay traffic from known connection and cannot be used by an attacker to amplify the traffic in the whole network.", - "privacy-matters-overlay-card-1-p-1": "Many large companies use information about who you are connected with to estimate your income, sell you the products you don't really need, and to determine the prices.", + "simplex-network-overlay-card-1-li-3": "P2P does not solve MITM attack problem, and most existing implementations do not use out-of-band messages for the initial key exchange. SimpleX uses out-of-band messages or, in some cases, pre-existing secure and trusted connections for the initial key exchange.", + "simplex-network-overlay-card-1-li-4": "P2P implementations can be blocked by some Internet providers (like BitTorrent). SimpleX is transport agnostic — it can work over standard web protocols, e.g. WebSockets.", + "simplex-network-overlay-card-1-li-5": "All known P2P networks may be vulnerable to Sybil attack, because each node is discoverable, and the network operates as a whole. Known measures to mitigate it require either a centralized component or expensive proof of work. SimpleX network has no server discoverability, it is fragmented and operates as multiple isolated sub-networks, making network-wide attacks impossible.", + "simplex-network-overlay-card-1-li-6": "P2P networks may be vulnerable to DRDoS attack, when the clients can rebroadcast and amplify traffic, resulting in network-wide denial of service. SimpleX clients only relay traffic from known connection and cannot be used by an attacker to amplify the traffic in the whole network.", + "privacy-matters-overlay-card-1-p-1": "Many large companies use information about who you are connected with to estimate your income, sell you the products you don't really need, and to determine the prices.", "privacy-matters-overlay-card-1-p-2": "Online retailers know that people with lower incomes are more likely to make urgent purchases, so they may charge higher prices or remove discounts.", - "privacy-matters-overlay-card-1-p-3": "Some financial and insurance companies use social graphs to determine interest rates and premiums. It often makes people with lower incomes pay more — it is known as 'poverty premium'.", + "privacy-matters-overlay-card-1-p-3": "Some financial and insurance companies use social graphs to determine interest rates and premiums. It often makes people with lower incomes pay more — it is known as \"poverty premium\".", "privacy-matters-overlay-card-1-p-4": "SimpleX network protects the privacy of your connections better than any alternative, fully preventing your social graph becoming available to any companies or organizations. Even when people use servers preconfigured in SimpleX Chat apps, server operators do not know the number of users or their connections.", - "privacy-matters-overlay-card-2-p-1": "Not so long ago we observed the major elections being manipulated by a reputable consulting company that used our social graphs to distort our view of the real world and manipulate our votes.", + "privacy-matters-overlay-card-2-p-1": "Not so long ago we observed the major elections being manipulated by a reputable consulting company that used our social graphs to distort our view of the real world and manipulate our votes.", "privacy-matters-overlay-card-2-p-2": "To be objective and to make independent decisions you need to be in control of your information space. It is only possible if you use private communication network that does not have access to your social graph.", - "privacy-matters-overlay-card-2-p-3": "SimpleX is the first network that doesn't have any user identifiers by design, in this way protecting your connections graph better than any known alternative.", + "privacy-matters-overlay-card-2-p-3": "SimpleX is the first network that doesn't have any user identifiers by design, in this way protecting your connections graph better than any known alternative.", "privacy-matters-overlay-card-3-p-1": "Everyone should care about privacy and security of their communications — harmless conversations can put you in danger, even if you have nothing to hide.", - "privacy-matters-overlay-card-3-p-2": "One of the most shocking stories is the experience of Mohamedou Ould Salahi described in his memoir and shown in The Mauritanian movie. He was put into Guantanamo camp, without trial, and was tortured there for 15 years after a phone call to his relative in Afghanistan, under suspicion of being involved in 9/11 attacks, even though he lived in Germany for the previous 10 years.", - "privacy-matters-overlay-card-3-p-3": "Ordinary people get arrested for what they share online, even via their 'anonymous' accounts, even in democratic countries.", + "privacy-matters-overlay-card-3-p-2": "One of the most shocking stories is the experience of Mohamedou Ould Salahi described in his memoir and shown in The Mauritanian movie. He was put into Guantanamo camp, without trial, and was tortured there for 15 years after a phone call to his relative in Afghanistan, under suspicion of being involved in 9/11 attacks, even though he lived in Germany for the previous 10 years.", + "privacy-matters-overlay-card-3-p-3": "Ordinary people get arrested for what they share online, even via their \"anonymous\" accounts, even in democratic countries.", "privacy-matters-overlay-card-3-p-4": "It is not enough to use an end-to-end encrypted messenger, we all should use the messengers that protect the privacy of our personal networks — who we are connected with.", "simplex-unique-overlay-card-1-p-1": "Unlike other messaging networks, SimpleX has no identifiers assigned to the users. It does not rely on phone numbers, domain-based addresses (like email or XMPP), usernames, public keys or even random numbers to identify its users — SimpleX server operators don't know how many people use their servers.", - "simplex-unique-overlay-card-1-p-2": "To deliver messages SimpleX uses pairwise anonymous addresses of unidirectional message queues, separate for received and sent messages, usually via different servers.", + "simplex-unique-overlay-card-1-p-2": "To deliver messages SimpleX uses pairwise anonymous addresses of unidirectional message queues, separate for received and sent messages, usually via different servers.", "simplex-unique-overlay-card-1-p-3": "This design protects the privacy of who you are communicating with, hiding it from SimpleX network servers and from any observers. To hide your IP address from the servers, you can connect to SimpleX servers via Tor.", "simplex-unique-overlay-card-2-p-1": "Because you have no identifier on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link.", "simplex-unique-overlay-card-2-p-2": "Even with the optional user address, while it can be used to send spam contact requests, you can change or completely delete it without losing any of your connections.", @@ -134,8 +134,8 @@ "simplex-unique-overlay-card-3-p-3": "Unlike federated networks servers (email, XMPP or Matrix), SimpleX servers don't store user accounts, they only relay messages, protecting the privacy of both parties.", "simplex-unique-overlay-card-3-p-4": "There are no identifiers or ciphertext in common between sent and received server traffic — if anybody is observing it, they cannot easily determine who communicates with whom, even if TLS is compromised.", "simplex-unique-overlay-card-4-p-1": "You can use SimpleX with your own servers and still communicate with people who use the servers preconfigured in the apps.", - "simplex-unique-overlay-card-4-p-2": "SimpleX network uses an open protocol and provides SDK to create chat bots, allowing implementation of services that users can interact with via SimpleX Chat apps — we're really looking forward to see what SimpleX services you will build.", - "simplex-unique-overlay-card-4-p-3": "If you are considering developing for the SimpleX network, for example, the chat bot for SimpleX app users, or the integration of the SimpleX Chat library into your mobile apps, please get in touch for any advice and support.", + "simplex-unique-overlay-card-4-p-2": "SimpleX network uses an open protocol and provides SDK to create chat bots, allowing implementation of services that users can interact with via SimpleX Chat apps — we're really looking forward to see what SimpleX services you will build.", + "simplex-unique-overlay-card-4-p-3": "If you are considering developing for the SimpleX network, for example, the chat bot for SimpleX app users, or the integration of the SimpleX Chat library into your mobile apps, please get in touch for any advice and support.", "simplex-unique-card-1-p-1": "SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers.", "simplex-unique-card-1-p-2": "Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers.", "simplex-unique-card-2-p-1": "Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link.", @@ -151,7 +151,7 @@ "sign-up-to-receive-our-updates": "Sign up to receive our updates", "enter-your-email-address": "Enter your email address", "get-simplex": "Get SimpleX desktop app", - "why-simplex-is-unique": "Why SimpleX is unique", + "why-simplex-is-unique": "Why SimpleX is unique", "learn-more": "Learn more", "more-info": "More info", "hide-info": "Hide info", @@ -166,7 +166,7 @@ "install-simplex-app": "Install SimpleX app", "connect-in-app": "Connect in app", "open-simplex-app": "Open Simplex app", - "tap-the-connect-button-in-the-app": "Tap the ‘connect’ button in the app", + "tap-the-connect-button-in-the-app": "Tap the \"connect\" button in the app", "scan-the-qr-code-with-the-simplex-chat-app": "Scan the QR code with the SimpleX Chat app", "scan-the-qr-code-with-the-simplex-chat-app-description": "The public keys and message queue address in this link are NOT sent over the network when you view this page —
they are contained in the hash fragment of the link URL.", "installing-simplex-chat-to-terminal": "Installing SimpleX chat to terminal", @@ -178,12 +178,12 @@ "if-you-already-installed": "If you already installed", "simplex-chat-for-the-terminal": "SimpleX Chat for the terminal", "copy-the-command-below-text": "copy the command below and use it in the chat:", - "privacy-matters-section-header": "Why privacy matters", - "privacy-matters-section-subheader": "Preserving the privacy of your metadata — who you talk with — protects you from:", - "privacy-matters-section-label": "Make sure your messenger can't access your data!", - "simplex-private-section-header": "What makes SimpleX private", + "privacy-matters-section-header": "Why privacy matters", + "privacy-matters-section-subheader": "Preserving the privacy of your metadata — who you talk with — protects you from:", + "privacy-matters-section-label": "Make sure your messenger can't access your data!", + "simplex-private-section-header": "What makes SimpleX private", "tap-to-close": "Tap to close", - "simplex-network-section-header": "SimpleX Network", + "simplex-network-section-header": "SimpleX Network", "simplex-network-section-desc": "Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.", "simplex-network-1-header": "Unlike P2P networks", "simplex-network-1-desc": "All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many", @@ -191,7 +191,7 @@ "simplex-network-2-header": "Unlike federated networks", "simplex-network-2-desc": "SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory.", "simplex-network-3-header": "SimpleX network", - "simplex-network-3-desc": "servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do.", + "simplex-network-3-desc": "servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do.", "comparison-section-header": "Comparison with other protocols", "protocol-1-text": "Signal, big platforms", "protocol-2-text": "XMPP, Matrix", @@ -212,8 +212,8 @@ "comparison-section-list-point-2": "DNS-based addresses", "comparison-section-list-point-3": "Public key or some other globally unique ID", "comparison-section-list-point-4a": "SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel", - "comparison-section-list-point-4": "If operator’s servers are compromised. Verify security code in Signal and some other apps to mitigate it", - "comparison-section-list-point-5": "Does not protect users' metadata privacy", + "comparison-section-list-point-4": "If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it", + "comparison-section-list-point-5": "Does not protect users' metadata privacy", "comparison-section-list-point-6": "While P2P are distributed, they are not federated — they operate as a single network", "comparison-section-list-point-7": "P2P networks either have a central authority or the whole network can be compromised", "see-here": "see here", @@ -249,36 +249,36 @@ "simplex-chat-via-f-droid": "SimpleX Chat via F-Droid", "simplex-chat-repo": "SimpleX Chat repo", "stable-and-beta-versions-built-by-developers": "Stable and beta versions built by the developers", - "f-droid-page-simplex-chat-repo-section-text": "To add it to your F-Droid client, scan the QR code or use this URL:", + "f-droid-page-simplex-chat-repo-section-text": "To add it to your F-Droid client, scan the QR code or use this URL:", "signing-key-fingerprint": "Signing key fingerprint (SHA-256)", "f-droid-org-repo": "F-Droid.org repo", "stable-versions-built-by-f-droid-org": "Stable versions built by F-Droid.org", "releases-to-this-repo-are-done-1-2-days-later": "The releases to this repo are done several days later", - "f-droid-page-f-droid-org-repo-section-text": "SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.", + "f-droid-page-f-droid-org-repo-section-text": "SimpleX Chat and F-Droid.org repositories sign builds with the different keys. To switch, please export the chat database and re-install the app.", "jobs": "Join team", "please-enable-javascript": "Please enable JavaScript to see the QR code.", "please-use-link-in-mobile-app": "Please use the link in the mobile app", - "index-hero-h1": "Be Free", + "index-hero-h1": "Be
Free", "index-hero-h2": "Freedom & Security
of Your Communications", "index-hero-p1": "The first network where you own your identity, contacts, and groups.", "index-hero-download-desktop-btn-title": "Download SimpleX Desktop App", - "index-google-play-title": "Public iOS preview on TestFlight", - "index-f-droid-title": "SimpleX F-Droid Repository", - "index-security-assessment-title": "security assessment", - "index-security-review-2022-title": "Security Review 2022", - "index-security-review-2024-title": "Security Review 2024", - "index-security-audits-label": "Security Audits", - "index-publications-privacy-guides-title": "messenger recommendations", + "index-testflight-title": "SimpleX iOS beta-release on TestFlight", + "index-f-droid-title": "SimpleX app via F-Droid", + "index-security-assessment-title": "Security Audits", + "index-security-review-2022-title": "Security Audit 2022", + "index-security-review-2024-title": "Security Audit 2024", + "index-security-audits-label": "Security
Audits", + "index-publications-privacy-guides-title": "Privacy Guides messenger recommendations", "index-publications-whonix-title": "Whonix messenger recommendations", - "index-publications-heise-title": "publication", - "index-publications-kuketz-title": "review", - "index-publications-optout-title": "podcast interview", - "worlds-most-secure-messaging": "World's Most Secure Messaging", + "index-publications-heise-title": "Heise Online publications", + "index-publications-kuketz-title": "Review by Mike Kuketz", + "index-publications-optout-title": "OptOut podcast interview", + "worlds-most-secure-messaging": "World's Most Secure Messaging", "index-messaging-p1": "SimpleX messaging has cutting-edge end-to-end encryption.", - "index-messaging-p2": "For your security and privacy, servers can’t see your messages or who you talk to.", + "index-messaging-p2": "For your security and privacy, servers can't see your messages and who you talk to.", "index-messaging-cta": "Learn more about SimpleX messaging", "index-nextweb-h2": "You Own
The Next Web", - "index-nextweb-p1": "SimpleX is founded on the belief that you must own your identity, contacts and communities.", + "index-nextweb-p1": "SimpleX is founded on the belief that you must own your identity, contacts and communities.", "index-nextweb-p2": "Open and decentralized network lets you connect with people and share ideas: be free and secure.", "index-token-h2": "Communities That Last", "index-token-p1": "You will support your favorite groups with future Community Vouchers.", @@ -299,7 +299,7 @@ "index-directory-p2": "Find your communities in SimpleX directory and create your own!", "index-directory-cta": "View SimpleX Directory", "index-directory-users-group-title": "SimpleX users group", - "how-secure-comparison-title": "How secure is end-to-end encryption in different messengers?", + "how-secure-comparison-title": "Comparison of end-to-end encryption security in different messengers", "how-secure-message-padding": "Message padding", "how-secure-repudiation-deniability": "Repudiation (deniability)", "how-secure-forward-secrecy": "Forward secrecy", diff --git a/website/langs/es.json b/website/langs/es.json index 0d7cf8aec0..0feb776f34 100644 --- a/website/langs/es.json +++ b/website/langs/es.json @@ -258,21 +258,21 @@ "hero-overlay-card-3-p-3": "Trail of Bits ha revisado el diseño criptográfico de los protocolos de red SimpleX en julio del 2024. Saber más.", "directory": "Directorio", "about-and-contact-us": "Acerca de & Contacta con nosotros", - "index-hero-h1": "Sea Libre", + "index-hero-h1": "Sea
Libre", "index-hero-h2": "Libertad y Seguridad
en Tus Comunicaciones", "index-hero-p1": "La primera red donde su identidad, contactos y grupos le pertenecen.", "index-hero-download-desktop-btn-title": "Descargar SimpleX Desktop App", - "index-google-play-title": "Vista previa pública de iOS en TestFlight", + "index-testflight-title": "Vista previa pública de iOS en TestFlight", "index-f-droid-title": "Repositorio SimpleX F-Droid", - "index-security-assessment-title": "evaluación de seguridad", + "index-security-assessment-title": "Evaluación de seguridad", "index-security-review-2022-title": "Revisión de Seguridad 2022", "index-security-review-2024-title": "Revisión de Seguridad 2024", - "index-security-audits-label": "Auditorías de Seguridad", - "index-publications-privacy-guides-title": "recomendaciones de mensajería", - "index-publications-whonix-title": "recomendación de mensajería de Whonix", - "index-publications-heise-title": "publicación", - "index-publications-kuketz-title": "revisión", - "index-publications-optout-title": "entrevista en podcast", + "index-security-audits-label": "Auditorías de
Seguridad", + "index-publications-privacy-guides-title": "Recomendaciones de mensajería", + "index-publications-whonix-title": "Recomendación de mensajería de Whonix", + "index-publications-heise-title": "Publicación", + "index-publications-kuketz-title": "Revisión", + "index-publications-optout-title": "Entrevista en podcast", "worlds-most-secure-messaging": "La Mensajería Más Segura del Mundo", "index-messaging-p1": "Le mensajería SimpleX dispone de cifrado de extremo a extremo de vanguardia.", "index-messaging-p2": "Por su seguridad y privacidad los servidores no pueden ver sus mensajes ni con quién habla.", diff --git a/website/langs/hu.json b/website/langs/hu.json index 6ef584fb52..6590f11cc2 100644 --- a/website/langs/hu.json +++ b/website/langs/hu.json @@ -258,16 +258,16 @@ "docs-dropdown-14": "SimpleX üzleti célra", "directory": "Csoportjegyzék", "about-and-contact-us": "Névjegy és kapcsolat", - "index-hero-h1": "Legyen szabad", + "index-hero-h1": "
Legyen
szabad
", "index-hero-p1": "Az első olyan hálózat, ahol Ön a tulajdonosa saját identitásának, partnereinek és csoportjainak.", "index-hero-download-desktop-btn-title": "SimpleX számítógépes alkalmazásának letöltése", "index-security-assessment-title": "biztonsági felmérés", "index-security-review-2022-title": "Biztonsági audit 2022", "index-security-review-2024-title": "Biztonsági audit 2024", - "index-security-audits-label": "Biztonsági auditok", + "index-security-audits-label": "Biztonsági
auditok", "index-publications-heise-title": "kiadvány", "index-hero-h2": "Az Ön kommunikációjának
szabadsága és biztonsága", - "index-google-play-title": "Nyilvános betekintés az iOS alkalmazás fejlesztésébe a TestFlighton", + "index-testflight-title": "Nyilvános betekintés az iOS alkalmazás fejlesztésébe a TestFlighton", "index-f-droid-title": "SimpleX F-Droid-tároló", "index-publications-privacy-guides-title": "ajánlások", "index-publications-whonix-title": "Whonix ajánlás", diff --git a/website/langs/id.json b/website/langs/id.json index 0b674e3c80..51bd14f976 100644 --- a/website/langs/id.json +++ b/website/langs/id.json @@ -262,12 +262,12 @@ "index-hero-h2": "Kebebasan & Keamanan
Komunikasi Anda", "index-hero-p1": "Jaringan pertama tempat Anda memiliki identitas, kontak, dan grup Anda.", "index-hero-download-desktop-btn-title": "Unduh Aplikasi Desktop SimpleX", - "index-google-play-title": "Pratinjau iOS publik di TestFlight", + "index-testflight-title": "Pratinjau iOS publik di TestFlight", "index-f-droid-title": "Repositori SimpleX F-Droid", "index-security-assessment-title": "penilaian keamanan", "index-security-review-2022-title": "Tinjauan Keamanan 2022", "index-security-review-2024-title": "Tinjauan Keamanan 2024", - "index-security-audits-label": "Audit Keamanan", + "index-security-audits-label": "Audit
Keamanan", "index-publications-privacy-guides-title": "rekomendasi perpesanan", "index-publications-whonix-title": "Rekomendasi perpesanan Whonix", "index-publications-heise-title": "publikasi", diff --git a/website/langs/it.json b/website/langs/it.json index 8b65776215..b7b11ccd72 100644 --- a/website/langs/it.json +++ b/website/langs/it.json @@ -261,13 +261,13 @@ "index-hero-h2": "Libertà e sicurezza
delle tue comunicazioni", "index-hero-p1": "La prima rete in cui possiedi la tua identità, i contatti e i gruppi.", "index-hero-download-desktop-btn-title": "Scarica l'app desktop di SimpleX", - "index-google-play-title": "Anteprima pubblica per iOS su TestFlight", + "index-testflight-title": "Anteprima pubblica per iOS su TestFlight", "index-f-droid-title": "Repository F-Droid di SimpleX", "index-security-assessment-title": "valutazione della sicurezza", "index-security-review-2022-title": "Revisione della sicurezza 2022", "index-security-review-2024-title": "Revisione della sicurezza 2024", - "index-hero-h1": "Sii libero", - "index-security-audits-label": "Analisi della sicurezza", + "index-hero-h1": "Sii
libero", + "index-security-audits-label": "Analisi della
sicurezza", "index-publications-privacy-guides-title": "consigli sulla messaggistica", "index-publications-whonix-title": "consigli sulla messaggistica di Whonix", "index-publications-heise-title": "pubblicazione", diff --git a/website/langs/ru.json b/website/langs/ru.json index d144b1c71a..6ab4827496 100644 --- a/website/langs/ru.json +++ b/website/langs/ru.json @@ -258,53 +258,54 @@ "docs-dropdown-12": "Безопасность", "docs-dropdown-11": "Часто задаваемые вопросы", "docs-dropdown-14": "SimpleX для бизнеса", + "index-hero-h1": "
Жить
Свободно
", "index-hero-h2": "Свобода и Безопасность
Ваших Коммуникаций", "index-hero-p1": "Первая сеть, в которой Вам принадлежат Ваши данные, контакты и группы.", "index-hero-download-desktop-btn-title": "Загрузить приложение SimpleX для компьютера", - "index-google-play-title": "Бета-релиз для iOS на TestFlight", + "index-testflight-title": "Бета-релиз для iOS на TestFlight", "index-f-droid-title": "Загрузить через F-Droid", "index-security-assessment-title": "Аудиты безопасности", "index-security-review-2022-title": "Аудит безопасности в 2022", "index-security-review-2024-title": "Аудит безопасности в 2024", - "index-security-audits-label": "Аудиты безопасности", - "index-publications-privacy-guides-title": "Рекомендации мессенджеров", + "index-security-audits-label": "Аудиты
безопасности", + "index-publications-privacy-guides-title": "Рекомендации мессенджеров Privacy Guides", "index-publications-whonix-title": "Рекомендации мессенджеров от Whonix", - "index-publications-heise-title": "Публикация", - "index-publications-kuketz-title": "Обзор", - "index-publications-optout-title": "Подкаст интервью", + "index-publications-heise-title": "Публикации Heise Online", + "index-publications-kuketz-title": "Обзор от Mike Kuketz", + "index-publications-optout-title": "OptOut подкаст интервью", "worlds-most-secure-messaging": "Самый Безопасный Мессенджер в Мире", "index-messaging-p1": "Сообщения в SimpleX имеют самое передовое сквозное шифрование (end-to-end).", - "index-messaging-p2": "Для Вашей безопасности и конфиденциальности, серверы не могут видеть ваши сообщения и с кем Вы разговариваете.", + "index-messaging-p2": "Для Вашей безопасности, серверы не могут видеть ваши сообщения и с кем Вы разговариваете.", "index-messaging-cta": "Узнать больше про сообщения в SimpleX", - "index-nextweb-h2": "Вам Принадлежит
Следующий Веб", - "index-nextweb-p1": "SimpleX был основан на убеждении что Вы должны быть владельцем Ваших данных, контактов и групп.", - "index-nextweb-p2": "Открытая и децентрализованная сеть позволяет Вам соединяться с другим людьми и делиться идеями свободно и безопасно.", - "index-token-h2": "Независимые Группы", + "index-nextweb-h2": "Ваш Интернет Будущего", + "index-nextweb-p1": "SimpleX основан на идее что Ваши данные, контакты и группы должны принадлежать Вам.", + "index-nextweb-p2": "Открытая децентрализованная сеть позволяет Вам соединяться с другими людьми и общаться свободно и безопасно.", + "index-token-h2": "Стабильные Сообщества", "index-token-p1": "Вы сможете поддерживать Ваши любимые группы с помощью будущих Ваучеров Групп.", - "index-token-p2": "Ваучеры будут использоваться для оплаты за серверы, чтобы Ваши группы оставались свободными и независимыми.", + "index-token-p2": "Ваучеры будут использоваться для оплаты за серверы, чтобы группы оставались свободными и независимыми.", "index-token-cta": "Узнайте больше и возьмите Ваш бесплатный NFT, чтобы получить скидку 20% на SimpleX токены!", - "index-roadmap-h2": "SimpleX План для Свободного Интернета", + "index-roadmap-h2": "Путь Сети SimpleX к Свободному Интернету", "index-roadmap-2025": "2025", "index-roadmap-2025-title": "Большие каналы и группы", - "index-roadmap-2025-desc": "Уйти с централизованных платформ", + "index-roadmap-2025-desc": "Чтобы Вы могли покинуть централизованные платформы", "index-roadmap-2026": "2026", "index-roadmap-2026-title": "Самодостаточные группы и серверы", "index-roadmap-2026-desc": "Запуск Ваучеров Групп", "index-roadmap-2027": "2027", "index-roadmap-2027-title": "Поддержка роста Ваших групп", - "index-roadmap-2027-desc": "Инструменты для продвижения Ваших групп", - "index-directory-h2": "Вступите в Группы SimpleX", + "index-roadmap-2027-desc": "Инструменты для продвижения групп", + "index-directory-h2": "Вступайте в Группы SimpleX", "index-directory-p1": "Сотни тысяч людей уже доверяют мессенджеру SimpleX.", "index-directory-p2": "Найдите группы по душе в каталоге SimpleX и создайте свои!", "index-directory-cta": "Открыть каталог SimpleX", "index-directory-users-group-title": "Группа пользователей SimpleX", "how-secure-comparison-title": "Сравнение безопасности сквозного шифрования в мессенджерах", - "how-secure-message-padding": "Message padding", - "how-secure-repudiation-deniability": "Repudiation (deniability)", - "how-secure-forward-secrecy": "Forward secrecy", - "how-secure-break-in-recovery": "Post-compromise security", - "how-secure-two-factor-key-exchange": "2-factor key exchange", - "how-secure-post-quantum-hybrid-crypto": "Post-quantum hybrid crypto", + "how-secure-message-padding": "Дополнение сообщений", + "how-secure-repudiation-deniability": "Отрицаемые сообщения", + "how-secure-forward-secrecy": "Прямая секретность", + "how-secure-break-in-recovery": "Безопасность после взлома", + "how-secure-two-factor-key-exchange": "2-факторный обмен ключами", + "how-secure-post-quantum-hybrid-crypto": "Гибридное постквантовое шифрование", "messengers-comparison-section-list-point-1": "Briar дополняет сообщения до размера кратного 1024 байтов, Signal - до кратного 160 байтов.", "messengers-comparison-section-list-point-2": "Отрицаемость сообщений не включает в себя соединеие между клиентом и сервером.", "messengers-comparison-section-list-point-3": "По всей видимости, использование криптографической подписи исключает отражаемость, но это требует уточнения.", From 505fde30f8eca04288f09b9f7a9046b9a0938cea Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 23 Oct 2025 08:12:59 +0100 Subject: [PATCH 2/4] core: enable removal of unused connections in migration (#6399) --- .../Store/Postgres/Migrations/M20251007_connections_sync.hs | 2 +- .../Chat/Store/SQLite/Migrations/M20251007_connections_sync.hs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/M20251007_connections_sync.hs b/src/Simplex/Chat/Store/Postgres/Migrations/M20251007_connections_sync.hs index f73145f4e9..08d88eeea8 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations/M20251007_connections_sync.hs +++ b/src/Simplex/Chat/Store/Postgres/Migrations/M20251007_connections_sync.hs @@ -16,7 +16,7 @@ CREATE TABLE connections_sync( last_sync_ts TIMESTAMPTZ ); -INSERT INTO connections_sync (connections_sync_id, should_sync, last_sync_ts) VALUES (1,0,NULL); +INSERT INTO connections_sync (connections_sync_id, should_sync, last_sync_ts) VALUES (1, 1, NULL); |] down_m20251007_connections_sync :: Text diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/M20251007_connections_sync.hs b/src/Simplex/Chat/Store/SQLite/Migrations/M20251007_connections_sync.hs index 64a9275f9a..239f0aeec1 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/M20251007_connections_sync.hs +++ b/src/Simplex/Chat/Store/SQLite/Migrations/M20251007_connections_sync.hs @@ -15,7 +15,7 @@ CREATE TABLE connections_sync( last_sync_ts TEXT ); -INSERT INTO connections_sync (connections_sync_id, should_sync, last_sync_ts) VALUES (1,0,NULL); +INSERT INTO connections_sync (connections_sync_id, should_sync, last_sync_ts) VALUES (1, 1, NULL); |] down_m20251007_connections_sync :: Query From 2badeea19c3a851d03d69e52331eb9d44d8d1276 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 23 Oct 2025 07:30:36 +0000 Subject: [PATCH 3/4] core: fix deleting user with chat tags (#6374) * core: fix deleting user with chat tags * schema, tests * schema * update simplexmq * update ios * plans --- simplex-chat.cabal | 2 ++ src/Simplex/Chat/Store/Postgres/Migrations.hs | 4 ++- .../Migrations/M20251017_chat_tags_cascade.hs | 32 +++++++++++++++++++ .../Store/Postgres/Migrations/chat_schema.sql | 2 +- src/Simplex/Chat/Store/SQLite/Migrations.hs | 4 ++- .../Migrations/M20251017_chat_tags_cascade.hs | 30 +++++++++++++++++ .../SQLite/Migrations/chat_query_plans.txt | 24 ++++++++++++++ .../Store/SQLite/Migrations/chat_schema.sql | 2 +- tests/ChatTests/Direct.hs | 21 ++++++++++++ 9 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 src/Simplex/Chat/Store/Postgres/Migrations/M20251017_chat_tags_cascade.hs create mode 100644 src/Simplex/Chat/Store/SQLite/Migrations/M20251017_chat_tags_cascade.hs diff --git a/simplex-chat.cabal b/simplex-chat.cabal index e8f43f5f07..6557411ee7 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -120,6 +120,7 @@ library Simplex.Chat.Store.Postgres.Migrations.M20250919_group_summary Simplex.Chat.Store.Postgres.Migrations.M20250922_remove_unused_connections Simplex.Chat.Store.Postgres.Migrations.M20251007_connections_sync + Simplex.Chat.Store.Postgres.Migrations.M20251017_chat_tags_cascade else exposed-modules: Simplex.Chat.Archive @@ -264,6 +265,7 @@ library Simplex.Chat.Store.SQLite.Migrations.M20250919_group_summary Simplex.Chat.Store.SQLite.Migrations.M20250922_remove_unused_connections Simplex.Chat.Store.SQLite.Migrations.M20251007_connections_sync + Simplex.Chat.Store.SQLite.Migrations.M20251017_chat_tags_cascade other-modules: Paths_simplex_chat hs-source-dirs: diff --git a/src/Simplex/Chat/Store/Postgres/Migrations.hs b/src/Simplex/Chat/Store/Postgres/Migrations.hs index c6c04b465b..89f8f6070b 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations.hs +++ b/src/Simplex/Chat/Store/Postgres/Migrations.hs @@ -20,6 +20,7 @@ import Simplex.Chat.Store.Postgres.Migrations.M20250813_delivery_tasks import Simplex.Chat.Store.Postgres.Migrations.M20250919_group_summary import Simplex.Chat.Store.Postgres.Migrations.M20250922_remove_unused_connections import Simplex.Chat.Store.Postgres.Migrations.M20251007_connections_sync +import Simplex.Chat.Store.Postgres.Migrations.M20251017_chat_tags_cascade import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Text, Maybe Text)] @@ -39,7 +40,8 @@ schemaMigrations = ("20250813_delivery_tasks", m20250813_delivery_tasks, Just down_m20250813_delivery_tasks), ("20250919_group_summary", m20250919_group_summary, Just down_m20250919_group_summary), ("20250922_remove_unused_connections", m20250922_remove_unused_connections, Just down_m20250922_remove_unused_connections), - ("20251007_connections_sync", m20251007_connections_sync, Just down_m20251007_connections_sync) + ("20251007_connections_sync", m20251007_connections_sync, Just down_m20251007_connections_sync), + ("20251017_chat_tags_cascade", m20251017_chat_tags_cascade, Just down_m20251017_chat_tags_cascade) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/M20251017_chat_tags_cascade.hs b/src/Simplex/Chat/Store/Postgres/Migrations/M20251017_chat_tags_cascade.hs new file mode 100644 index 0000000000..f5a227a3c5 --- /dev/null +++ b/src/Simplex/Chat/Store/Postgres/Migrations/M20251017_chat_tags_cascade.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.Postgres.Migrations.M20251017_chat_tags_cascade where + +import Data.Text (Text) +import qualified Data.Text as T +import Text.RawString.QQ (r) + +m20251017_chat_tags_cascade :: Text +m20251017_chat_tags_cascade = + T.pack + [r| +ALTER TABLE chat_tags DROP CONSTRAINT chat_tags_user_id_fkey; + +ALTER TABLE chat_tags + ADD CONSTRAINT chat_tags_user_id_fkey + FOREIGN KEY (user_id) + REFERENCES users(user_id) + ON DELETE CASCADE; +|] + +down_m20251017_chat_tags_cascade :: Text +down_m20251017_chat_tags_cascade = + T.pack + [r| +ALTER TABLE chat_tags DROP CONSTRAINT chat_tags_user_id_fkey; + +ALTER TABLE chat_tags + ADD CONSTRAINT chat_tags_user_id_fkey + FOREIGN KEY (user_id) + REFERENCES users(user_id); +|] diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql index 6b54b6d9ee..601dd97a6e 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql @@ -2479,7 +2479,7 @@ ALTER TABLE ONLY test_chat_schema.chat_tags_chats ALTER TABLE ONLY test_chat_schema.chat_tags - ADD CONSTRAINT chat_tags_user_id_fkey FOREIGN KEY (user_id) REFERENCES test_chat_schema.users(user_id); + ADD CONSTRAINT chat_tags_user_id_fkey FOREIGN KEY (user_id) REFERENCES test_chat_schema.users(user_id) ON DELETE CASCADE; diff --git a/src/Simplex/Chat/Store/SQLite/Migrations.hs b/src/Simplex/Chat/Store/SQLite/Migrations.hs index e568e2a663..1c819e6537 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations.hs +++ b/src/Simplex/Chat/Store/SQLite/Migrations.hs @@ -143,6 +143,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20250813_delivery_tasks import Simplex.Chat.Store.SQLite.Migrations.M20250919_group_summary import Simplex.Chat.Store.SQLite.Migrations.M20250922_remove_unused_connections import Simplex.Chat.Store.SQLite.Migrations.M20251007_connections_sync +import Simplex.Chat.Store.SQLite.Migrations.M20251017_chat_tags_cascade import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -285,7 +286,8 @@ schemaMigrations = ("20250813_delivery_tasks", m20250813_delivery_tasks, Just down_m20250813_delivery_tasks), ("20250919_group_summary", m20250919_group_summary, Just down_m20250919_group_summary), ("20250922_remove_unused_connections", m20250922_remove_unused_connections, Just down_m20250922_remove_unused_connections), - ("20251007_connections_sync", m20251007_connections_sync, Just down_m20251007_connections_sync) + ("20251007_connections_sync", m20251007_connections_sync, Just down_m20251007_connections_sync), + ("20251017_chat_tags_cascade", m20251017_chat_tags_cascade, Just down_m20251017_chat_tags_cascade) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/M20251017_chat_tags_cascade.hs b/src/Simplex/Chat/Store/SQLite/Migrations/M20251017_chat_tags_cascade.hs new file mode 100644 index 0000000000..1f82831404 --- /dev/null +++ b/src/Simplex/Chat/Store/SQLite/Migrations/M20251017_chat_tags_cascade.hs @@ -0,0 +1,30 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.SQLite.Migrations.M20251017_chat_tags_cascade where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20251017_chat_tags_cascade :: Query +m20251017_chat_tags_cascade = + [sql| +PRAGMA writable_schema=1; + +UPDATE sqlite_master +SET sql = replace(sql, 'user_id INTEGER REFERENCES users', 'user_id INTEGER REFERENCES users ON DELETE CASCADE') +WHERE name = 'chat_tags' AND type = 'table'; + +PRAGMA writable_schema=0; +|] + +down_m20251017_chat_tags_cascade :: Query +down_m20251017_chat_tags_cascade = + [sql| +PRAGMA writable_schema=1; + +UPDATE sqlite_master +SET sql = replace(sql, 'user_id INTEGER REFERENCES users ON DELETE CASCADE', 'user_id INTEGER REFERENCES users') +WHERE name = 'chat_tags' AND type = 'table'; + +PRAGMA writable_schema=0; +|] diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 91db234fd1..dbb4823024 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -3329,6 +3329,16 @@ Query: Plan: SEARCH chat_item_versions USING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?) +Query: + SELECT chat_tag_id, chat_tag_emoji, chat_tag_text + FROM chat_tags + WHERE user_id = ? + ORDER BY tag_order + +Plan: +SEARCH chat_tags USING INDEX idx_chat_tags_user_id (user_id=?) +USE TEMP B-TREE FOR ORDER BY + Query: SELECT command_id, connection_id, command_function, command_status FROM commands @@ -4333,6 +4343,20 @@ Query: Plan: +Query: + INSERT INTO chat_tags (user_id, chat_tag_emoji, chat_tag_text, tag_order) + VALUES (?,?,?, COALESCE((SELECT MAX(tag_order) + 1 FROM chat_tags WHERE user_id = ?), 1)) + +Plan: +SCALAR SUBQUERY 1 +SEARCH chat_tags USING INDEX idx_chat_tags_user_id (user_id=?) + +Query: + INSERT INTO chat_tags_chats (contact_id, chat_tag_id) + VALUES (?,?) + +Plan: + Query: INSERT INTO commands (connection_id, command_function, command_status, user_id, created_at, updated_at) VALUES (?,?,?,?,?,?) diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql index 7d8f9d0dcd..4b12246a3f 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql @@ -663,7 +663,7 @@ CREATE TABLE operator_usage_conditions( ); CREATE TABLE chat_tags( chat_tag_id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER REFERENCES users, + user_id INTEGER REFERENCES users ON DELETE CASCADE, chat_tag_text TEXT NOT NULL, chat_tag_emoji TEXT, tag_order INTEGER NOT NULL diff --git a/tests/ChatTests/Direct.hs b/tests/ChatTests/Direct.hs index b4bce68535..1b93013258 100644 --- a/tests/ChatTests/Direct.hs +++ b/tests/ChatTests/Direct.hs @@ -134,6 +134,7 @@ chatDirectTests = do it "both users have contact link" testMultipleUserAddresses it "create user with same servers" testCreateUserSameServers it "delete user" testDeleteUser + it "delete user with chat tags" testDeleteUserChatTags it "users have different chat item TTL configuration, chat items expire" testUsersDifferentCIExpirationTTL it "chat items expire after restart for all users according to per user configuration" testUsersRestartCIExpiration it "chat items only expire for users who configured expiration" testEnableCIExpirationOnlyForOneUser @@ -2110,6 +2111,26 @@ testDeleteUser = alice ##> "/users" alice <## "no users" +testDeleteUserChatTags :: HasCallStack => TestParams -> IO () +testDeleteUserChatTags = + testChat2 aliceProfile bobProfile $ + \alice bob -> do + connectUsers alice bob + + alice ##> "/_create tag {\"text\":\"my tag\"}" + alice <## "[{\"chatTagId\":1,\"chatTagText\":\"my tag\"}]" + alice ##> "/_tags @2 1" + alice <## "chat tags updated" + + alice ##> "/create user alisa" + showActiveUser alice "alisa" + + alice ##> "/_delete user 1 del_smp=off" + alice <## "ok" + + alice ##> "/users" + alice <## "alisa (active)" + testUsersDifferentCIExpirationTTL :: HasCallStack => TestParams -> IO () testUsersDifferentCIExpirationTTL ps = do withNewTestChat ps "bob" bobProfile $ \bob -> do From 1c684ae654be14d07726e65818c9dc6a0162a30a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 23 Oct 2025 21:49:12 +0100 Subject: [PATCH 4/4] rfc: unlinkable infrastructure (community) vouchers (#6402) --- docs/rfcs/2025-10-23-vouchers.md | 208 ++++++++++++++++++ .../diagrams/2025-10-23-vouchers-diagram.svg | 4 + .../diagrams/2025-10-23-vouchers-mmrs.svg | 4 + 3 files changed, 216 insertions(+) create mode 100644 docs/rfcs/2025-10-23-vouchers.md create mode 100644 docs/rfcs/diagrams/2025-10-23-vouchers-diagram.svg create mode 100644 docs/rfcs/diagrams/2025-10-23-vouchers-mmrs.svg diff --git a/docs/rfcs/2025-10-23-vouchers.md b/docs/rfcs/2025-10-23-vouchers.md new file mode 100644 index 0000000000..9e11827282 --- /dev/null +++ b/docs/rfcs/2025-10-23-vouchers.md @@ -0,0 +1,208 @@ +# SimpleX Vouchers for Unlinkable Payments + +See [this doc](./2024-04-26-commercial-model.md) about commercial model that proposed the approach to making network sustainable and commercially attractive to the server operators. + +This document proposes the cryptographic design for the system of vouchers that can enable these payments. + +Big thank you to [Alain Brenzikofer](https://x.com/brenzi5), co-founder of [Integritee Network](https://x.com/integri_t_e_e), who contributed the draft of this design, which we then evolved collaboratively. + +## High-level diagram + +![Payments diagram](./diagrams/2025-10-23-vouchers-diagram.svg) + +### Coordination Layer (CL) + +Abstract component which allows all involved parties to come to consensus about voucher issuance and redemption + +* can be centralized trusted third party (TTP). +* can be a decentralized ledger with smart contracts, e.g. some L2 Ethereum blockchain with ZK-proofs support. + +### Issuing Operator (IO) + +* must be whitelisted by CL. +* CL defines voucher issuing limit. + +### Accepting Operator (AO) + +* delivers a service and accepts vouchers. + +### User + +* uses a service by an AO. +* seeks anonymity. + +### Voucher + +* token allowing limited number of transfers (0-2) to be redeemed for AO credits. +* comes in few fixed denominations around e.g. 1, 10, 100 operator credits, that would be initially set to USD 1, and adjusted for service costs that are likely to be reduced with scale and inflation. +* expected to be redeemed at low frequency: only every few days per user. + +### AO Credits + +* per-operator tokens for micropayments as-you-go. +* expected to be used to pay fractions of cents for every request to the service. +* balances maintained by the operator. + +Blind signatures to be used with operator issued credits: +- Client generates random token(s): `t[i]` +- Client sends a set of blinded tokens `blind(t[i])` when presenting a voucher. +- Operator's server signs them with operator's key and returns to the client. +- Client de-blinds them so they can be used. + +The signed tokens should include an approximate timestamp, e.g. rounded to a day (or more) - this would allow expiration of credits at the cost of acceptable reduction of anonymity set. + +These tokens would be fungible and would also have multiple denominations - the client would send new random blinded numbers to receive change on the resource provisioning requests. We can use token denominations representing powers of 2. + +When credit is presented it would be validated to prove that it is: + +1) properly signed. +2) not expired. +3) not used. + +The checks 1 and 2 are local, and can be done locally on the server. The check 3 requires verification across all operator's servers. The resource can be provisioned instantly, without waiting for the confirmation. Failed double-spend verification can result in resource cancellation. The "change" can be provided only after verification, as otherwise it may increase the number of issued credits (the provisioned resource can include "pending change" associated with it). + +Another approach would be allocating the registry for spent coins deterministically to different servers, and making these allocations known to the client, so while coins would be accepted by any operator's server, the change would be given faster if it's presented to the server with the coin registry. + +## Abstract Protocol + +Start with the most simple approach, then iterate to improve the anonymity properties. + +### v0.1: Chaumian eCash-style atomic, indivisible vouchers of single denomination + +not yet using ZK, not yet with expiry (see extension) + +``` +# user buys voucher at t1 +s = random(256 bits) +C = hash(S) +B = blind(C) +CoordinationLayer.checkIssuingLimit(issuer=I1) +App(issuer=I1).buyVoucher(ref=B) +# issuer I1 +ensure_payment() +σB = B.sign(K_I1) +# user publishes voucher at t2 +σC = σB.unblind() +CoordinationLayer.publish(σC) +# CoordinationLayer (global, trusted entity) +issuer = verify_signature(σC) +ensure_issuing_limit(issuer) +ensure_is_unknown(C) +store_unspent_voucher(C, issuer=I1) +# user redeems voucher at t3 +proof=encrypt(payload=[C, s], pubkey=CoordinationLayerKey) +ServiceProvider.redeem_voucher(proof) +# ServiceProvider SP1 +CoordinationLayer.redeem(proof, SP1) +# CoordinationLayer +[C, s] = decrypt(proof) +ensure(C=hash(s)) +atomic_invalidate_unspent_voucher(C) +clearing(1 voucher, I1 pays to SP1) +confirm_redemption(SP1) +``` + +### Unlinkability analysis + +* issuer can’t link the purchase to later redemption, not even if colluding with the ServiceProvider (assuming large number of users behaving indistinguishably). +* CoordinationLayer can trivially link timing and IP of publishing (t2) and redeeming C (t3). could collude with issuer to link redemption to purchase correlating timing and IP: + * the user can mask timing with random delays between t1-t2 to make collusion harder. + * the user can hide their IP from the CL if they use the issuer as a proxy through a TLS tunnel. That, in turn, will leak t2 to the issuer unless the user performs indistinguishable dummy requests to mask t2. + +### Adding Voucher Expiry + +Design choices for maximal anonymity set / unlinkability: + +* expiry is the same for all vouchers. +* expiry starts with the publishing step, not with the purchase. + +Extension of v0.1: + +* CoordinationLayer stores publishing date along with C. +* CoordinationLayer enforces expiry upon redemption. +* CoordinationLayer ensures issuers rotate keys every M days (to invalidate vouchers which have been issued but not published within 2xM days). + +*Alternative to allow expiry to start with purchase: blind signature with public metadata. Not trivial if issuer must verify public metadata and bind signature to ensure correctness of expiry*. + +## v0.2: Chaumian eCash-style atomic, Indivisible vouchers of single denomination plus ZK + +Avoid linkability of redemption by using a ZK set membership proof into merkle-mountain range (MMR). + +Change later steps as follows: + + +``` +... same as v0.1 +# CoordinationLayer (global) at ~t2 +... same as in v0.1, adding: +store_unspent_voucher(C, t=now, issuer=I1) +update_unspent_vouchers_mmr() +publish_mmr_root() +return [mmr_path] # to user +# user redeems the voucher at t3 +mmr_root = root of mmr_path # as received from CL upon publishing +N=hash2(s || "redeem") +proof=ZK( + secret_inputs: s, mmr_path + public_inputs: mmr_root, nullifier: N + assertions: hash(s) is leaf of mmr_path with mmr_root && N=hash2(s || "redeem") +) +ServiceProvider.redeem_voucher(proof) +# ServiceProvider SP1 +CoordinationLayer.redeem(proof, SP1) +# CoordinationLayer +ensure_unknown(proof.N) +ensure(age(proof.mmr_root) < EXPIRY) +verify(proof) +store_nullifier(proof.N) +clearing(1 voucher, I1 pays to SP1) +confirm_redemption(SP1) +``` + +(!) If the MMR is public (e.g. if the CL operating on a public ledger), the user can extend voucher expiry arbitrarily by updating their mmr_path to a newer merkle_root. Therefore, expiry can’t rely just on the age of mmr_root. For a mitigation, we need to extend the protocol and rotate MMRs. + +### Adding MMR Rotation + +1. Start a new MMR every T days +2. To mitigate the small anonymity set at the start of each new MMR, let them overlap and let the user choose which one they use. + +![MMR rotation](./diagrams/2025-10-23-vouchers-mmrs.svg) + +Upon publishing: + +* CL returns mmr1_path and mmr_2 path to the user + +Upon redemption: + +* user selects one of the two MMRs to generate the proof. Here, the user can trade off later expiry (mmr2_path, expiry2) against larger anonymity set (mmr1_path, expiry1). + +### Unlinkability Analysis + +* Generating a proof using mmr_root(t2) leaks t2. The CL could therefore still learn the exact time when the redeemed voucher was published + + * this can be mitigated by updated MMR peak-bagging before generating the proof. The user downloads the entire MMR and updates the mmr_path to a later root at e.g. t2' or t2'' (maybe partial download backward to t2 + a masking random bit further back is sufficient). If download size gets too big, reduce MMR duration T. + +* thanks to the ZK proof, now even the CoordinationLayer can’t directly link the publishing of C with the redemption, because the redemption just discloses that “one among all non-expired vouchers shall be redeemed“ (double-spending prevented through tracking nullifiers). +* the Coordination Layer still observes timing and IP address. + * users can wait until anonymity set is big enough for their requirements, but that only masks timing, not networking IP address. + * If we use the ServiceProvider as a proxy to forward the redemption proof, timing and IP leak to SP instead of CL, which is better because the SP learns the IP and timing (user behavior) anyway. trusting the SP with the proof is fine because it doesn’t disclose sensitive information and we trust them to provide their service after redemption anyway. + +### ZK Reasonings + +* to avoid trusted setup we could use STARK, not SNARK, but STARK has heavier proving complexity (expect >30s on mobile. should be evaluated with a PoC). +* we can accept a trusted setup with multiple independent parties contributing to it, with the benefit of much lighter proving. +* STARK friendly hash function: e.g. poseidon2 +* proving time (client-side) is probably still quite heavy for mobile, even if the proposed proof is pretty lean. But redeeming vouchers is only expected to happen infrequently +* verification time (CoordinationLayer side) expected to be light +* Nullifier set is bounded thanks to voucher expiry window M, so it won’t grow indefinitely. Downside: smaller anonymity set. + +Overall, SNARK seems more preferrable. + +### Possible Enhancements + +* Avoid centralized CoordinationLayer SPOF, replace with smart contract on distributed consortial ledger with non-collusion contractor validators: + * or even public permissionless blockchain. + * storing mmr_root and nullifiers onchain helps public auditability. +* publishing σC still leaks publicly observable timing because the CL has to update and publish the MMR. + * possible remedy: use TEE as a random-delay mixer proxy for the user to publish σC. +* optionally delegate heavy ZK proving to TEE for thin clients (s will be exposed to TEE trust assumptions). But then, we need to incentivize TEE-provers as they are service providers in their own right. diff --git a/docs/rfcs/diagrams/2025-10-23-vouchers-diagram.svg b/docs/rfcs/diagrams/2025-10-23-vouchers-diagram.svg new file mode 100644 index 0000000000..b182521563 --- /dev/null +++ b/docs/rfcs/diagrams/2025-10-23-vouchers-diagram.svg @@ -0,0 +1,4 @@ + + + +
Alice (identifiable)
buy voucher
Issuing Operator
Coordination Layer
issue voucher
enforce issuance limit
register voucher
unlink
Accepting Operator
Alice (incognito)
Coordination Layer
redeem voucher with proof
verify proof
issue credits
enforce expiry
prevent double-spend
clearing of voucher value IO->AO
use service
provide service
manage credit balance
transfer credits to Bob*
few $, non-xferrable
fractions of cts, xferrable within same AO
not involved
1
2
3
4
5
6
\ No newline at end of file diff --git a/docs/rfcs/diagrams/2025-10-23-vouchers-mmrs.svg b/docs/rfcs/diagrams/2025-10-23-vouchers-mmrs.svg new file mode 100644 index 0000000000..b1ea917340 --- /dev/null +++ b/docs/rfcs/diagrams/2025-10-23-vouchers-mmrs.svg @@ -0,0 +1,4 @@ + + + +
MMR1
MMR2
MMR3
C1
C2
CN
validity
t2
t
t2'
t2''
CA
expiry1
expiry2
\ No newline at end of file