From cb0392b78d8e84cf9bfeb39b444936adb692deb6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 13:24:45 +0000 Subject: [PATCH 001/103] use forms to wrap password fields so Chrome doesn't go wild and prefill all the things Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../CreateSecretStorageDialog.js | 75 +++++++++---------- src/components/structures/SearchBox.js | 1 + .../AccessSecretStorageDialog.js | 45 +++++------ 3 files changed, 57 insertions(+), 64 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 4068f72217..35cd5aa819 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -295,31 +295,27 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseNextClick = () => { - this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); - } - - _onPassPhraseKeyPress = async (e) => { - if (e.key === 'Enter') { - // If we're waiting for the timeout before updating the result at this point, - // skip ahead and do it now, otherwise we'll deny the attempt to proceed - // even if the user entered a valid passphrase - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - this._setZxcvbnResultTimeout = null; - await new Promise((resolve) => { - this.setState({ - zxcvbnResult: scorePassword(this.state.passPhrase), - }, resolve); - }); - } - if (this._passPhraseIsValid()) { - this._onPassPhraseNextClick(); - } + _onPassPhraseNextClick = async () => { + // If we're waiting for the timeout before updating the result at this point, + // skip ahead and do it now, otherwise we'll deny the attempt to proceed + // even if the user entered a valid passphrase + if (this._setZxcvbnResultTimeout !== null) { + clearTimeout(this._setZxcvbnResultTimeout); + this._setZxcvbnResultTimeout = null; + await new Promise((resolve) => { + this.setState({ + zxcvbnResult: scorePassword(this.state.passPhrase), + }, resolve); + }); } - } + if (this._passPhraseIsValid()) { + this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); + } + }; _onPassPhraseConfirmNextClick = async () => { + if (this.state.passPhrase !== this.state.passPhraseConfirm) return; + const [keyInfo, encodedRecoveryKey] = await MatrixClientPeg.get().createRecoveryKeyFromPassphrase(this.state.passPhrase); this._keyInfo = keyInfo; @@ -332,12 +328,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseConfirmKeyPress = (e) => { - if (e.key === 'Enter' && this.state.passPhrase === this.state.passPhraseConfirm) { - this._onPassPhraseConfirmNextClick(); - } - } - _onSetAgainClick = () => { this.setState({ passPhrase: '', @@ -407,7 +397,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } else if (this.state.canUploadKeysWithPasswordOnly) { authPrompt =
{_t("Enter your account password to confirm the upgrade:")}
-
; } - return
+ return

{_t( "Set up encryption on this device to allow it to verify other devices, " + "granting them access to encrypted messages and marking them as trusted for other users.", @@ -480,13 +471,14 @@ export default class CreateSecretStorageDialog extends React.PureComponent { )}

-
{strengthMeter} @@ -499,10 +491,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { onChange={this._onUseKeyBackupChange} value={this.state.useKeyBackup} /> -
; + ; } _renderPhasePassPhraseConfirm() { @@ -549,27 +543,30 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
; } const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
+ return

{_t( "Enter your passphrase a second time to confirm it.", )}

-
{passPhraseMatch}
- -
; + ; } _renderPhaseShowKey() { diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js index 873efb64c2..e169e09752 100644 --- a/src/components/structures/SearchBox.js +++ b/src/components/structures/SearchBox.js @@ -160,6 +160,7 @@ export default createReactClass({ onKeyDown={ this._onKeyDown } onBlur={this._onBlur} placeholder={ placeholder } + autoComplete="off" /> { clearButton }
diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index c976eb81d0..ed65c9d2a6 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -1,6 +1,6 @@ /* Copyright 2018, 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import * as sdk from '../../../../index'; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { _t } from '../../../../languageHandler'; -import { Key } from "../../../../Keyboard"; /* * Access Secure Secret Storage by requesting the user's passphrase. @@ -69,6 +68,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } _onPassPhraseNext = async () => { + if (this.state.passPhrase.length <= 0) return; + this.setState({ keyMatches: null }); const input = { passphrase: this.state.passPhrase }; const keyMatches = await this.props.checkPrivateKey(input); @@ -80,6 +81,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } _onRecoveryKeyNext = async () => { + if (!this.state.recoveryKeyValid) return; + this.setState({ keyMatches: null }); const input = { recoveryKey: this.state.recoveryKey }; const keyMatches = await this.props.checkPrivateKey(input); @@ -97,18 +100,6 @@ export default class AccessSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.passPhrase.length > 0) { - this._onPassPhraseNext(); - } - } - - _onRecoveryKeyKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.recoveryKeyValid) { - this._onRecoveryKeyNext(); - } - } - render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); @@ -135,7 +126,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { )}
; } else { - keyStatus =
; + keyStatus =
; } content =
@@ -149,23 +140,26 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "identity for verifying other devices by entering your passphrase.", )}

-
- + {keyStatus} - -
+ {_t( "If you've forgotten your passphrase you can "+ "use your recovery key or " + @@ -192,7 +186,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { let keyStatus; if (this.state.recoveryKey.length === 0) { - keyStatus =
; + keyStatus =
; } else if (this.state.recoveryKeyValid) { keyStatus =
{"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} @@ -221,22 +215,23 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "identity for verifying other devices by entering your recovery key.", )}

-
+
{keyStatus} - -
+ {_t( "If you've forgotten your recovery key you can "+ "." From fe71fe6033a59e0dcc20c62527ad5b7ec7f71895 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 13:38:50 +0000 Subject: [PATCH 002/103] Sprinkle forms and new-password designators to make autofill and password completion less wild Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../keybackup/CreateKeyBackupDialog.js | 66 ++++++++----------- src/components/views/auth/RegistrationForm.js | 2 + .../views/dialogs/DeactivateAccountDialog.js | 1 + .../keybackup/RestoreKeyBackupDialog.js | 15 ++--- .../views/settings/ChangePassword.js | 8 ++- 5 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 8940239cfd..1557159e5c 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -192,31 +192,27 @@ export default class CreateKeyBackupDialog extends React.PureComponent { }); } - _onPassPhraseNextClick = () => { - this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); - } - - _onPassPhraseKeyPress = async (e) => { - if (e.key === 'Enter') { - // If we're waiting for the timeout before updating the result at this point, - // skip ahead and do it now, otherwise we'll deny the attempt to proceed - // even if the user entered a valid passphrase - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - this._setZxcvbnResultTimeout = null; - await new Promise((resolve) => { - this.setState({ - zxcvbnResult: scorePassword(this.state.passPhrase), - }, resolve); - }); - } - if (this._passPhraseIsValid()) { - this._onPassPhraseNextClick(); - } + _onPassPhraseNextClick = async () => { + // If we're waiting for the timeout before updating the result at this point, + // skip ahead and do it now, otherwise we'll deny the attempt to proceed + // even if the user entered a valid passphrase + if (this._setZxcvbnResultTimeout !== null) { + clearTimeout(this._setZxcvbnResultTimeout); + this._setZxcvbnResultTimeout = null; + await new Promise((resolve) => { + this.setState({ + zxcvbnResult: scorePassword(this.state.passPhrase), + }, resolve); + }); } - } + if (this._passPhraseIsValid()) { + this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); + } + }; _onPassPhraseConfirmNextClick = async () => { + if (this.state.passPhrase !== this.state.passPhraseConfirm) return; + this._keyBackupInfo = await MatrixClientPeg.get().prepareKeyBackupVersion(this.state.passPhrase); this.setState({ setPassPhrase: true, @@ -224,13 +220,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { downloaded: false, phase: PHASE_SHOWKEY, }); - } - - _onPassPhraseConfirmKeyPress = (e) => { - if (e.key === 'Enter' && this.state.passPhrase === this.state.passPhraseConfirm) { - this._onPassPhraseConfirmNextClick(); - } - } + }; _onSetAgainClick = () => { this.setState({ @@ -301,7 +291,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
; } - return
+ return

{_t( "Warning: You should only set up key backup from a trusted computer.", {}, { b: sub => {sub} }, @@ -316,7 +306,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {

- @@ -341,7 +332,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { {_t("Set up with a Recovery Key")}

-
; + ; } _renderPhasePassPhraseConfirm() { @@ -373,7 +364,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
; } const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
+ return

{_t( "Please enter your passphrase a second time to confirm.", )}

@@ -382,7 +373,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
- -
; + ; } _renderPhaseShowKey() { diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 91f8e1b226..8ca454dabd 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -486,6 +486,7 @@ export default createReactClass({ id="mx_RegistrationForm_password" ref={field => this[FIELD_PASSWORD] = field} type="password" + autoComplete="new-password" label={_t("Password")} value={this.state.password} onChange={this.onPasswordChange} @@ -499,6 +500,7 @@ export default createReactClass({ id="mx_RegistrationForm_passwordConfirm" ref={field => this[FIELD_PASSWORD_CONFIRM] = field} type="password" + autoComplete="new-password" label={_t("Confirm")} value={this.state.passwordConfirm} onChange={this.onPasswordConfirmChange} diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 7e36232eb0..d7468933df 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -118,6 +118,7 @@ export default class DeactivateAccountDialog extends React.Component { const Field = sdk.getComponent('elements.Field'); + // this is on purpose not a
to prevent Enter triggering submission, to further prevent accidents return ( { - if (e.key === Key.ENTER) { - this._onPassPhraseNext(); - } - } - _onRecoveryKeyKeyPress = (e) => { if (e.key === Key.ENTER && this.state.recoveryKeyValid) { this._onRecoveryKeyNext(); @@ -305,21 +299,22 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { "messaging by entering your recovery passphrase.", )}

-
+ - -
+ {_t( "If you've forgotten your recovery passphrase you can "+ "use your recovery key or " + diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 2d8c4c4178..8cbe455af3 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -253,20 +253,24 @@ export default createReactClass({
{ currentPassword }
-
-
From 920daa3125c229697a25daa65788d909839c71e1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 13:43:08 +0000 Subject: [PATCH 003/103] Get rid of custom enter handling and protect handlers, disabling button isn't foolproof Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/keybackup/RestoreKeyBackupDialog.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js index 814f5a4980..fc9a21c51b 100644 --- a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js @@ -22,7 +22,6 @@ import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { MatrixClient } from 'matrix-js-sdk'; import Modal from '../../../../Modal'; import { _t } from '../../../../languageHandler'; -import {Key} from "../../../../Keyboard"; import { accessSecretStorage } from '../../../../CrossSigningManager'; const RESTORE_TYPE_PASSPHRASE = 0; @@ -125,6 +124,8 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } _onRecoveryKeyNext = async () => { + if (!this.state.recoveryKeyValid) return; + this.setState({ loading: true, restoreError: null, @@ -157,12 +158,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { }); } - _onRecoveryKeyKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.recoveryKeyValid) { - this._onRecoveryKeyNext(); - } - } - async _restoreWithSecretStorage() { this.setState({ loading: true, @@ -366,7 +361,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
From 5b04ad46e0ff77515b56dcaace8c9ccc34a88dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Thu, 6 Feb 2020 10:29:28 +0000 Subject: [PATCH 004/103] Translated using Weblate (Czech) Currently translated at 94.7% (1990 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 155 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 66af5b931e..3adc393e0a 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1419,7 +1419,7 @@ "View Servers in Room": "Zobrazit servery v místnosti", "Sign out and remove encryption keys?": "Odhlásit a odstranit šifrovací klíče?", "To help us prevent this in future, please send us logs.": "Abychom tomu mohli pro příště předejít, pošlete nám prosím logy.", - "Missing session data": "Chybějící data sezení", + "Missing session data": "Chybějící data relace", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Některá data sezení, například klíče od šifrovaných zpráv, nám chybí. Přihlašte se prosím znovu a obnovte si klíče ze zálohy.", "Your browser likely removed this data when running low on disk space.": "Prohlížeč data možná smazal aby ušetřil místo na disku.", "Upload files (%(current)s of %(total)s)": "Nahrát soubory (%(current)s z %(total)s)", @@ -1825,7 +1825,7 @@ "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Toto běžně ovlivňuje jak je místnost zpracovávána na serveru. Pokud máte problém s Riotem, nahlaste nám prosím bug.", "You'll upgrade this room from to .": "Upgradujeme tuto místnost z na .", "Upgrade": "Upgradovat", - "Enter secret storage passphrase": "Zadejte tajné heslo k úložišti", + "Enter secret storage passphrase": "Zadejte tajné heslo k bezpečnému úložišti", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Nepovedlo se přistoupit k bezpečnému úložišti. Zkontrolujte prosím, že je zadané správné heslo.", "Warning: You should only access secret storage from a trusted computer.": "Varování: Přistupujte k bezpečnému úložišti pouze z důvěryhodných počítačů.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Pokud si nepamatujete heslo, můžete použít váš obnovovací klíč nebo si nastavte nové možnosti obnovení.", @@ -1861,5 +1861,154 @@ "%(count)s verified sessions|one": "1 ověřená relace", "Language Dropdown": "Menu jazyků", "Help": "Pomoc", - "Country Dropdown": "Menu států" + "Country Dropdown": "Menu států", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V místnosti jsou neověřené relace: pokud budete pokračovat bez ověření, bude možné váš hovor odposlouchávat.", + "Verify this session": "Ověřit tuto relaci", + "Encryption upgrade available": "Je dostupná aktualizace šifrování", + "Set up encryption": "Nastavit šifrování", + "Unverified session": "Neověřená relace", + "Verifies a user, session, and pubkey tuple": "Ověří uživatele, relaci a veřejné klíče", + "Unknown (user, session) pair:": "Neznámý pár (uživatel, relace):", + "Session already verified!": "Relace je už ověřená!", + "WARNING: Session already verified, but keys do NOT MATCH!": "VAROVÁNÍ: Relace je už ověřená, ale klíče NEODPOVÍDAJÍ!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VAROVÁNÍ: OVĚŘENÍ KLÍČŮ SELHALO! Podpisový klíč pro uživatele %(userId)s a relaci %(deviceId)s je \"%(fprint)s\", což neodpovídá klíči \"%(fingerprint)s\". Může to znamenat, že je vaše komunikace rušena!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Zadaný podpisový klíč odpovídá klíči relace %(deviceId)s od uživatele %(userId)s. Relace byla označena za platnou.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s přidal/a této místnosti %(addedAddresses)s a dalších %(count)s adres", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s odstranil/a této místnosti %(removedAddresses)s a dalších %(count)s adres", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s odstranil/a této místnosti %(countRemoved)s adres a přidal/a %(countAdded)s adres", + "a few seconds ago": "před pár vteřinami", + "about a minute ago": "před minutou", + "%(num)s minutes ago": "před %(num)s minutami", + "about an hour ago": "asi před hodinou", + "%(num)s hours ago": "před %(num)s hodinami", + "about a day ago": "před jedním dnem", + "%(num)s days ago": "před %(num)s dny", + "a few seconds from now": "za pár vteřin", + "about a minute from now": "asi za minutu", + "%(num)s minutes from now": "za %(num)s minut", + "about an hour from now": "asi za hodinu", + "%(num)s hours from now": "za %(num)s hodin", + "about a day from now": "asi za den", + "%(num)s days from now": "za %(num)s dní", + "Show a presence dot next to DMs in the room list": "V seznamu místností zobrazovat informaci o přítomnosti", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Povolit cross-signing pro verifikaci uživatelů místo zařízení (experimentální)", + "Show info about bridges in room settings": "Zobrazovat v nastavení místnosti informace o propojeních", + "Show padlocks on invite only rooms": "Zobrazovat zámek u místností vyžadujících pozvání", + "Never send encrypted messages to unverified sessions from this session": "Nikdy neposílat šifrované zprávy neověřených zařízením", + "Never send encrypted messages to unverified sessions in this room from this session": "Nikdy v této místnosti neposílat šifrované zprávy neověřeným relacím", + "Enable message search in encrypted rooms": "Povolit vyhledávání v zašifrovaných místnostech", + "Keep secret storage passphrase in memory for this session": "Pro toto přihlášení si uchovat heslo k bezpečnému úložišti", + "How fast should messages be downloaded.": "Jak rychle se mají zprávy stahovat.", + "Confirm the emoji below are displayed on both devices, in the same order:": "Ověřte, že následující emotikony jsou zobrazeny na obou zařízeních ve stejném pořadí:", + "Verify this device by confirming the following number appears on its screen.": "Ověřit zařízení potvrzením, že jsou následující čísla zobrazena na jeho obrazovce.", + "Waiting for %(displayName)s to verify…": "Čekám až nás %(displayName)s ověří…", + "They match": "Odpovídají", + "They don't match": "Neodpovídají", + "To be secure, do this in person or use a trusted way to communicate.": "Aby to bylo bezpečné, udělejte to osobně nebo použijte důvěryhodný komunikační prostředek.", + "Lock": "Zamknout", + "Verify yourself & others to keep your chats safe": "Ověřte sebe a ostatní, aby byla vaše komunikace bezpečná", + "Other users may not trust it": "Ostatní uživatelé této relaci nemusí věřit", + "Later": "Později", + "Review": "Prohlédnout", + "This bridge was provisioned by .": "Toto propojení poskytuje .", + "This bridge is managed by .": "Toto propojení spravuje .", + "Workspace: %(networkName)s": "Workspace: %(networkName)s", + "Channel: %(channelName)s": "Kanál: %(channelName)s", + "Show less": "Skrýt detaily", + "Show more": "Zobrazit víc", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.", + "Cross-signing and secret storage are enabled.": "Cross-signing a bezpečné úložiště jsou zapnuté.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Váš účet má v bezpečném úložišti identitu pro cross-signing, ale v této relaci jí zatím nevěříte.", + "Cross-signing and secret storage are not yet set up.": "Zatím nemáte nastavený cross-signing a bezpečné úložiště.", + "Bootstrap cross-signing and secret storage": "Zapnout cross-signing a bezpečné úložiště", + "Cross-signing public keys:": "Veřejné klíče pro cross-signing:", + "in memory": "v paměti", + "Cross-signing private keys:": "Soukromé klíče pro cross-signing:", + "in secret storage": "v bezpečném úložišti", + "Secret storage public key:": "Veřejný klíč bezpečného úložiště:", + "in account data": "v datech účtu", + "Your homeserver does not support session management.": "Váš domovský server nepodporuje správu relací.", + "Unable to load session list": "Nepovedlo se načíst seznam relací", + "Delete %(count)s sessions|other": "Smazat %(count)s relací", + "Delete %(count)s sessions|one": "Smazat %(count)s relaci", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Bezpečně uchovávat šifrované zprávy na tomto zařízení, aby se v nich dalo vyhledávat pomocí ", + " to store messages from ": " na uchování zpráv z ", + "rooms.": "místností.", + "Manage": "Spravovat", + "Securely cache encrypted messages locally for them to appear in search results.": "Bezpečně uchovávat zprávy na tomto zařízení aby se v nich dalo vyhledávat.", + "Enable": "Povolit", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot neumí bezpečně uchovávat zprávy když běží v prohlížeči. Pokud chcete vyhledávat v šifrovaných zprávách, použijte Riot Desktop.", + "This session is backing up your keys. ": "Tato relace zálohuje vaše klíče. ", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Tato relace nezálohuje vaše klíče, ale už máte zálohu ze které je můžete obnovit.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Než se odhlásíce, připojte tuto relaci k záloze klíčů abyste nepřišli o klíče, které můžou být jen v této relaci.", + "Connect this session to Key Backup": "Připojit k zálohování klíčů", + "not stored": "není uložen", + "Backup has a signature from unknown session with ID %(deviceId)s": "Záloha je podepsaná z neznámé relace s ID %(deviceId)s", + "Backup has a valid signature from this session": "Záloha má platný podpis z této relace", + "Backup has an invalid signature from this session": "Záloha má neplatný podpis z této relace", + "Backup has a valid signature from verified session ": "Záloha má platný podpis z ověřené relace ", + "Backup has a valid signature from unverified session ": "Záloha má platný podpis z neověřené relace ", + "Backup has an invalid signature from verified session ": "Záloha má neplatný podpis z ověřené relace ", + "Backup has an invalid signature from unverified session ": "Záloha má neplatný podpis z neověřené relace ", + "Backup is not signed by any of your sessions": "Záloha nemá podpis z žádné vaší relace", + "This backup is trusted because it has been restored on this session": "Záloze věříme, protože už byla v této relaci načtena", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Zálohovací klíč je uložen v bezpečném úložišti, ale jeho načtení není v této relaci povolené. Zapněte prosím cross-signing v Experimentálních funkcích abyste mohli modifikovat stav zálohy.", + "Backup key stored: ": "Zálohovací klíč je uložen: ", + "Your keys are not being backed up from this session.": "Vaše klíče nejsou z této relace zálohovány.", + "Enable desktop notifications for this session": "Povolit v této relaci notifikace", + "Enable audible notifications for this session": "Povolit v této relaci hlasové notifikace", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Heslo bylo změněno. Dokud se znovu nepřihlásíte na ostatních zařízeních, nebudete na nich dostávat notifikace", + "Session ID:": "ID relace:", + "Session key:": "Klíč relace:", + "Message search": "Vyhledávání ve zprávách", + "Cross-signing": "Cross-signing", + "Sessions": "Relace", + "A session's public name is visible to people you communicate with": "Lidé se kterými komunikujete si můžou jméno relace zobrazit", + "This room is bridging messages to the following platforms. Learn more.": "Tato místnost je propojena s následujícími platformami. Více informací", + "This room isn’t bridging messages to any platforms. Learn more.": "Tato místnost není propojená s žádnými dalšími platformami. Více informací.", + "Bridges": "Propojení", + "This user has not verified all of their sessions.": "Tento uživatel zatím neověřil všechny své relace.", + "You have not verified this user.": "Tohoto uživatele jste neověřil.", + "You have verified this user. This user has verified all of their sessions.": "Tohoto uživatele jste ověřili a on ověřil všechny své relace.", + "Someone is using an unknown session": "Někdo používá neznámou relaci", + "This room is end-to-end encrypted": "Místnost je E2E šifrovaná", + "Everyone in this room is verified": "V této místnosti jsou všichni ověřeni", + "Some sessions for this user are not trusted": "Některé relace tohoto uživatele jsou nedůvěryhodné", + "All sessions for this user are trusted": "Všem relacím tohoto uživatele věříme", + "Some sessions in this encrypted room are not trusted": "Některé relace v této místnosti jsou nedůvěryhodné", + "All sessions in this encrypted room are trusted": "Všem relacím v této místosti věříme", + "Mod": "Moderátor", + "Your key share request has been sent - please check your other sessions for key share requests.": "Požadavek k nasdílení klíčů byl odeslán - podívejte se prosím na své ostatní relace, jestli vám přišel.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Požadavek se sdílení klíčů se vaše ostatní relace odesílá automaticky. Pokud jste ho zamítli nebo ignorovali, tímto tlačítkem si jej můžete poslat znovu.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Pokud vaše ostatní relace nemají klíč pro tuto zprávu, nebudete mít možnost jí dešifrovat.", + "Re-request encryption keys from your other sessions.": "Znovu zažádat o šifrovací klíče z vašich ostatních relací.", + "Encrypted by an unverified session": "Zašifrované v neověřené relaci", + "Encrypted by a deleted session": "Zašifrované smazanou relací", + "Invite only": "Pouze na pozvání", + "No sessions with registered encryption keys": "Žádné relace se šifrovacími klíči", + "Send a reply…": "Odpovědět…", + "Send a message…": "Napsat zprávu…", + "Direct Messages": "Přímé zprávy", + "Reject & Ignore user": "Odmítnout & ignorovat uživatele", + "Unknown Command": "Neznámý příkaz", + "Unrecognised command: %(commandText)s": "Nerozpoznaný příkaz: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Můžete použít /help na vypsání všech příkazů. Nebo jste text chtěli odeslat jako zprávu?", + "Hint: Begin your message with // to start it with a slash.": "Tip: Zprávu můžete začít //, pokud chcete aby začínala lomítkem.", + "Send as message": "Odeslat jako zprávu", + "Waiting for %(displayName)s to accept…": "Čekáme, než %(displayName)s přijme…", + "Start Verification": "Začít s verifikací", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Vaše zprávy jsou zabezpečené - pouze Vy a příjemce mají klíče k jejich přečtení.", + "Verify User": "Ověřit uživatele", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Pro lepší bezpečnost, ověřte uživatele zkontrolováním jednorázového kódu na vašich zařízeních.", + "Your messages are not secure": "Vaše zprávy nejsou zabezpečené", + "One of the following may be compromised:": "Něco z následujích věcí může být kompromitováno:", + "Your homeserver": "Váš domovský server", + "The homeserver the user you’re verifying is connected to": "Domovský server ověřovaného uživatele", + "Yours, or the other users’ internet connection": "Vaše připojení k internetu a nebo připojení ověřovaného uživatele", + "Yours, or the other users’ session": "Vaše relace a nebo relace ověřovaného uživatele", + "%(count)s sessions|other": "%(count)s relací", + "%(count)s sessions|one": "%(count)s relace", + "Hide sessions": "Skrýt relace", + "Verify by emoji": "Ověřit emotikonami", + "Verify by comparing unique emoji.": "Oveření porovnáním několika emotikon." } From 05fc6c11b0fd02d3f3d2568c17c5340a5c33f53e Mon Sep 17 00:00:00 2001 From: "J. A. Durieux" Date: Mon, 3 Feb 2020 11:23:24 +0000 Subject: [PATCH 005/103] Translated using Weblate (Dutch) Currently translated at 83.6% (1756 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 93 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index cfd829d718..6574a09bc2 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -388,7 +388,7 @@ "To continue, please enter your password.": "Voer uw wachtwoord in om verder te gaan.", "Blacklist": "Blokkeren", "Unblacklist": "Deblokkeren", - "I verify that the keys match": "Ik verifieer dat de sleutels overeenkomen", + "I verify that the keys match": "Ik verklaar dat de sleutels overeenkomen", "Unable to restore session": "Sessieherstel lukt niet", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Als u reeds een recentere versie van Riot heeft gebruikt is uw sessie mogelijk onverenigbaar met deze versie. Sluit dit venster en ga terug naar die recentere versie.", "Unknown Address": "Onbekend adres", @@ -1679,5 +1679,94 @@ "Verify this session": "Deze sessie verifiëren", "Encryption upgrade available": "Er is een bijgewerkte versleuteling beschikbaar", "You can use /help to list available commands. Did you mean to send this as a message?": "Type /help om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?", - "Help": "Hulp" + "Help": "Hulp", + "Set up encryption": "Versleuteling instellen", + "Unverified session": "Ongeverifieerde sessie", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Dit vergt toegang tot de verstek-identiteitsserver om emailadres of telefoonummer te valideren, maar die server heeft kent geen gebruiksvoorwaarden.", + "Trust": "Vertrouw", + "Custom (%(level)s)": "Aangepast (%(level)s)", + "Error upgrading room": "Bijwerken gesprek mislukt", + "Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen gespreksversie ondersteunt, en probeer dan opnieuw.", + "Verifies a user, session, and pubkey tuple": "Verifieert een combinatie van gebruiker+sessie+publieke sleutel", + "Unknown (user, session) pair:": "Onbekende combinatie gebruiker+sessie:", + "Session already verified!": "Sessie al geverifieerd!", + "WARNING: Session already verified, but keys do NOT MATCH!": "PAS OP: De sessie is al geverifieerd, maar de sleutels komen NIET OVEREEN!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "PAS OP: Sleutelverificatie MISLUKT! De combinatie %userId)s + sessie %(deviceId)s is ondertekend met \"%(fprint)s\" - maar de opgegeven sleutel is \"%(fingerprint)s\". Wellicht worden uw berichten onderschept!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "De door u verschafte en de van %(userId)ss sessie %(deviceId)s verkregen sleutels komen overeen. De sessie is daarmee geverifieerd.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName) heeft %(addedAddresses)s en %(count)d andere adressen aan dit gesprek toegevoegd", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s heeft dit gesprek ontdaan van %(removedAddresses)s en %(count)s andere adressen", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s heeft dit gesprek ontdaan van %(countRemoved)s adressen, en er %(countAdded)s toegevoegd", + "%(senderName)s placed a voice call.": "%(senderName)s probeert u te bellen.", + "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s poogt u te bellen, maar uw browser ondersteunt dat niet", + "%(senderName)s placed a video call.": "%(senderName)s doet een video-oproep.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s doet een video-oproep, maar uw browser ondersteunt dat niet", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s heeft de banregel voor gebruikers die met %(glob)s stroken verwijderd", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s heeft de banregel voor gesprekken die met %(glob)s stroken verwijderd", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s heeft de banregel voor servers die met %(glob)s stroken verwijderd", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s heeft een banregel die met %(glob)s strookt verwijderd", + "%(senderName)s updated an invalid ban rule": "%(senderName)s heeft een ongeldige banregel bijgewerkt", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die gebruikers die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die gesprekken die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die servers die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s heeft een banregel vanwege %(reason)s die met %(glob)s spoort bijgewerkt", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat gebruikers die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat gesprekken die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat servers die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat alles wat met %(glob)s spoort verbannen wordt vanwege %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor gebruikers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor gesprekken wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor servers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "The message you are trying to send is too large.": "Uw bericht is te lang om te verzenden.", + "a few seconds ago": "enige tellen geleden", + "about a minute ago": "een minuut of zo geleden", + "%(num)s minutes ago": "%(num)s minuten geleden", + "about an hour ago": "een uur of zo geleden", + "%(num)s hours ago": "%(num)s uren geleden", + "about a day ago": "een dag of zo geleden", + "%(num)s days ago": "%(num)s dagen geleden", + "a few seconds from now": "over een paar tellen", + "about a minute from now": "over een minuut of zo", + "%(num)s minutes from now": "over %(num)s minuten", + "about an hour from now": "over een uur of zo", + "%(num)s hours from now": "over %(num)s uur", + "about a day from now": "over een dag of zo", + "%(num)s days from now": "over %(num)s dagen", + "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", + "Try out new ways to ignore people (experimental)": "Nieuwe manieren om mensen te negeren uitproberen (nog in ontwikkeling)", + "Show a presence dot next to DMs in the room list": "Toon aanwezigheid bij tweegesprekken in de gesprekkenlijst", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Gebruik gebruikersverificatie in plaats van sessieverificatie (nog in ontwikkeling)", + "Enable local event indexing and E2EE search (requires restart)": "Indexeer lokaal gebeurtenissen en maak zo E2EE-zoeken mogelijk (vergt een herstart)", + "Show info about bridges in room settings": "Toon bruginformatie in gespreksinstellingen", + "Show padlocks on invite only rooms": "Toon hangsloten op besloten gesprekken", + "Match system theme": "Pas aan aan systeemthema", + "Never send encrypted messages to unverified sessions from this session": "Zend vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies", + "Never send encrypted messages to unverified sessions in this room from this session": "Zend vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies in dit gesprek", + "Enable message search in encrypted rooms": "Sta zoeken in versleutelde gesprekken toe", + "Keep secret storage passphrase in memory for this session": "Onthoud in deze sessie het wachtwoord voor sleutelopslag", + "How fast should messages be downloaded.": "Ophaalfrequentie van berichten.", + "My Ban List": "Mijn banlijst", + "This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!", + "Confirm the emoji below are displayed on both devices, in the same order:": "Bevestig dat beide apparaten dezelfde emojis in dezelfde volgorde tonen:", + "Verify this device by confirming the following number appears on its screen.": "Verifieer dit apparaat door te bevestigen dat het scherm het volgende getal toont.", + "Waiting for %(displayName)s to verify…": "Wachten tot %(displayName)s geverifieerd heeft…", + "They match": "Ze komen overeen", + "They don't match": "Ze komen niet overeen", + "To be secure, do this in person or use a trusted way to communicate.": "Doe dit voor de zekerheid in persona, of via een betrouwbaar communicatiemedium.", + "Lock": "Hangslot", + "Verify yourself & others to keep your chats safe": "Verifieer jezelf en anderen om je gesprekken veilig te houden", + "Other users may not trust it": "Mogelijk wantrouwen anderen het", + "Upgrade": "Bijwerken", + "Verify": "Verifiëren", + "Later": "Later", + "Review": "Contrôle", + "Decline (%(counter)s)": "Afwijzen (%(counter)s)", + "This bridge was provisioned by .": "Dank aan voor de brug.", + "This bridge is managed by .": "Brug onderhouden door .", + "Workspace: %(networkName)s": "Werkruimte: %(networkName)s", + "Channel: %(channelName)s": "Kanaal: %(channelName)s", + "Show less": "Minder tonen", + "Show more": "Meer tonen", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.", + "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Geef hier te negeren gebruikers en servers in. Asterisken staan voor willekeurige tekenreeksen; zo leidt @bot:* tot het negeren van gebruikers die 'bot' heten op alle servers." } From a6dd0d01e4fe11a24cc64b635e2c0e5393874252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Thu, 6 Feb 2020 07:55:40 +0000 Subject: [PATCH 006/103] Translated using Weblate (French) Currently translated at 100.0% (2101 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index bd491ad7f5..cc79b5c9fc 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -387,7 +387,7 @@ "Accept": "Accepter", "Active call (%(roomName)s)": "Appel en cours (%(roomName)s)", "Alias (optional)": "Alias (facultatif)", - "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Impossible de se connecter au serveur d'accueil - veuillez vérifier votre connexion, assurez-vous que le certificat SSL de votre serveur d'accueil est un certificat de confiance, et qu'aucune extension du navigateur ne bloque les requêtes.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Impossible de se connecter au serveur d’accueil - veuillez vérifier votre connexion, assurez-vous que le certificat SSL de votre serveur d’accueil est un certificat de confiance, et qu’aucune extension du navigateur ne bloque les requêtes.", "Close": "Fermer", "Custom": "Personnaliser", "Decline": "Refuser", @@ -493,7 +493,7 @@ "%(senderName)s changed the pinned messages for the room.": "%(senderName)s a changé les messages épinglés du salon.", "Jump to read receipt": "Aller à l'accusé de lecture", "World readable": "Lisible publiquement", - "Guests can join": "Accessible aux invités", + "Guests can join": "Accessible aux visiteurs", "Invalid community ID": "Identifiant de communauté non valide", "'%(groupId)s' is not a valid community ID": "\"%(groupId)s\" n'est pas un identifiant de communauté valide", "%(senderName)s sent an image": "%(senderName)s a envoyé une image", @@ -1149,7 +1149,7 @@ "Begin Verifying": "Commencer la vérification", "Waiting for partner to accept...": "Nous attendons que le partenaire accepte…", "Use two-way text verification": "Utiliser la vérification textuelle bidirectionnelle", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Vérifier cet utilisateur pour que ce soit un utilisateur de confiance. Faire confiance aux utilisateurs vous apporte une tranquillité d’esprit quand vous utilisez des messages chiffrés de bout en bout.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Vérifier cet utilisateur pour le marquer comme fiable. Faire confiance aux utilisateurs vous permet d’être serein quand vous utilisez des messages chiffrés de bout en bout.", "Waiting for partner to confirm...": "Nous attendons que le partenaire confirme…", "Incoming Verification Request": "Demande de vérification entrante", "Go back": "Revenir en arrière", @@ -1178,7 +1178,7 @@ "Premium hosting for organisations Learn more": "Hébergement premium pour les organisations En savoir plus", "Other": "Autre", "Find other public servers or use a custom server": "Trouvez d'autres serveurs publics ou utilisez un serveur personnalisé", - "Guest": "Invité", + "Guest": "Visiteur", "Sign in instead": "Se connecter", "Set a new password": "Définir un nouveau mot de passe", "Create account": "Créer un compte", @@ -1193,9 +1193,9 @@ "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s a rendu le salon public à tous ceux qui en connaissent le lien.", "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s a rendu le salon disponible sur invitation seulement.", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s a changé la règle d’adhésion en %(rule)s", - "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s a autorisé les invités à rejoindre le salon.", - "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s a empêché les invités de rejoindre le salon.", - "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s a changé l'accès des invités en %(rule)s", + "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s a autorisé les visiteurs à rejoindre le salon.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s a empêché les visiteurs de rejoindre le salon.", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s a changé l'accès des visiteurs en %(rule)s", "Group & filter rooms by custom tags (refresh to apply changes)": "Grouper et filtrer les salons grâce à des étiquettes personnalisées (actualiser pour appliquer les changements)", "Verify this user by confirming the following emoji appear on their screen.": "Vérifier cet utilisateur en confirmant que les émojis suivant apparaissent sur son écran.", "Unable to find a supported verification method.": "Impossible de trouver une méthode de vérification prise en charge.", @@ -1754,7 +1754,7 @@ "You have ignored this user, so their message is hidden. Show anyways.": "Vous avez ignoré cet utilisateur, donc ses messages sont cachés. Les montrer quand même.", "Custom (%(level)s)": "Personnalisé (%(level)s)", "Trusted": "Fiable", - "Not trusted": "Non vérifié", + "Not trusted": "Non fiable", "Direct message": "Message direct", "%(role)s in %(roomName)s": "%(role)s dans %(roomName)s", "Messages in this room are end-to-end encrypted.": "Les messages dans ce salon sont chiffrés de bout en bout.", @@ -1850,7 +1850,7 @@ "Enter secret storage recovery key": "Saisir la clé de récupération du coffre secret", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Impossible d’accéder au coffre secret. Vérifiez que vous avez saisi la bonne clé de récupération.", "If you've forgotten your recovery key you can .": "Si vous avez oublié votre clé de récupération vous pouvez .", - "Warning: You should only set up key backup from a trusted computer.": "Attention : Vous devriez uniquement configurer une sauvegarde de clés depuis un ordinateur de confiance.", + "Warning: You should only set up key backup from a trusted computer.": "Attention : Vous ne devriez configurer la sauvegarde de clés que depuis un ordinateur de confiance.", "If you've forgotten your recovery key you can ": "Si vous avez oublié votre clé de récupération, vous pouvez ", "Set up with a recovery key": "Configurer avec une clé de récupération", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Par mesure de sécurité, vous pouvez l’utiliser pour récupérer l’accès aux messages chiffrés si vous oubliez votre phrase de passe.", @@ -1918,7 +1918,7 @@ "Other users may not trust it": "D’autres utilisateurs pourraient ne pas lui faire confiance", "Later": "Plus tard", "Verify User": "Vérifier l’utilisateur", - "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une meilleure sécurité, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une sécurité supplémentaire, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", "Start Verification": "Commencer la vérification", "Unknown Command": "Commande inconnue", "Unrecognised command: %(commandText)s": "Commande non reconnue : %(commandText)s", @@ -2051,7 +2051,7 @@ "You have not verified this user. This user has verified all of their sessions.": "Vous n’avez pas vérifié cet utilisateur. Cet utilisateur a vérifié toutes ses sessions.", "You have verified this user. This user has verified all of their sessions.": "Vous avez vérifié cet utilisateur. Cet utilisateur a vérifié toutes ses sessions.", "Someone is using an unknown session": "Quelqu'un utilise une session inconnue", - "Some sessions for this user are not trusted": "Certaines sessions de cet utilisateur ne sont par fiables", + "Some sessions for this user are not trusted": "Certaines sessions de cet utilisateur ne sont pas fiables", "All sessions for this user are trusted": "Toutes les sessions de cet utilisateur sont fiables", "Some sessions in this encrypted room are not trusted": "Certaines sessions dans ce salon chiffré ne sont pas fiables", "All sessions in this encrypted room are trusted": "Toutes les sessions dans ce salon chiffré sont fiables", @@ -2101,7 +2101,7 @@ "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Récupérez l’accès à votre compte et restaurez les clés de chiffrement dans cette session. Sans elles, vous ne pourrez pas lire tous vos messages chiffrés dans n’importe quelle session.", "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Attention : Vos données personnelles (y compris les clés de chiffrement) seront stockées dans cette session. Effacez-les si vous n’utilisez plus cette session ou si vous voulez vous connecter à un autre compte.", "Sender session information": "Informations de session de l’expéditeur", - "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cette session pour l’autoriser de vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cette session pour l’autoriser à vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Configurez le chiffrement sur cette session pour lui permettre de vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", "This session can now verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Cette session peut à présent vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Si vous ne configurez pas la récupération de messages sécurisée, vous ne pourrez pas restaurer l’historique de vos messages chiffrés si vous vous déconnectez ou si vous utilisez une autre session.", From 34a67bf1446ecb34718626d92c576b331f889a42 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 5 Feb 2020 18:22:29 +0000 Subject: [PATCH 007/103] Translated using Weblate (Hungarian) Currently translated at 98.4% (2068 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 86 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 32f5b237e7..b8d14774d6 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2006,5 +2006,89 @@ "Unable to load session list": "A munkamenet listát nem lehet betölteni", "Delete %(count)s sessions|other": "%(count)s munkamenet törlése", "Delete %(count)s sessions|one": "%(count)s munkamenet törlése", - "This session is backing up your keys. ": "Ez a munkamenet elmenti a kulcsaidat. " + "This session is backing up your keys. ": "Ez a munkamenet elmenti a kulcsaidat. ", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: KULCS ELLENŐRZÉS HIBÁS! %(userId)s aláírási kulcsa és a munkamenet: %(deviceId)s ujjlenyomata \"%(fprint)s\" ami nem egyezik meg a megadott ujjlenyomattal ami \"%(fingerprint)s\". Ez jelentheti azt, hogy a kommunikációt lehallgatják!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A megadott aláírási kulcs megegyezik %(userId)s felhasználótól kapott aláírási kulccsal ebben a munkamenetben: %(deviceId)s. A munkamenet hitelesnek lett jelölve.", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelenleg a jelszó változtatás minden munkamenet végpontok közötti titkosító kulcsait alaphelyzetbe állítja, ezáltal a titkosított üzenetek olvashatatlanok lesznek, hacsak először nem mented ki a szobák kulcsait és töltöd vissza jelszóváltoztatás után. A jövőben ezt egyszerűsítjük majd.", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ez az munkamenet nem menti el a kulcsaidat, de van létező mentésed ahonnan vissza tudsz állni és továbbléphetsz.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Állítsd be ezen az munkameneten a Kulcs Mentést kijelentkezés előtt, hogy ne veszíts el olyan kulcsot ami csak ezen az eszközön van meg.", + "Connect this session to Key Backup": "Munkamenet csatlakoztatása a Kulcs Mentéshez", + "Backup has a signature from unknown session with ID %(deviceId)s": "A mentésnek ismeretlen munkamenetből származó aláírása van ezzel az azonosítóval: %(deviceId)s", + "Backup has a valid signature from this session": "A mentés érvényes aláírást tartalmaz ebből a munkamenetből", + "Backup has an invalid signature from this session": "A mentés érvénytelen aláírást tartalmaz ebből a munkamenetből", + "Backup has a valid signature from verified session ": "A mentés érvénes aláírást tartalmaz érvényes munkamenetből ", + "Backup has a valid signature from unverified session ": "A mentés érvénes aláírást tartalmaz ellenőrizetlen munkamenetből ", + "Backup has an invalid signature from verified session ": "A mentés érvénytelen aláírást tartalmaz érvényes munkamenetből ", + "Backup has an invalid signature from unverified session ": "A mentés érvénytelen aláírást tartalmaz ellenőrizetlen munkamenetből ", + "Backup is not signed by any of your sessions": "A mentés nem tartalmaz aláírást egyetlen munkamenetedből sem", + "This backup is trusted because it has been restored on this session": "Ez a mentés megbízható mert ebben a munkamenetben lett visszaállítva", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "A mentési kulcs a biztonsági tárolóban van elmentve, de ebben a munkamenetben ez a lehetőség nincs engedélyezve. Kérlek engedélyezd az eszközök közötti hitelesítést a Laborokban a kulcs mentés állapotának megváltoztatásához.", + "Your keys are not being backed up from this session.": "A kulcsaid nem kerülnek elmentésre erről a munkamenetről.", + "Enable desktop notifications for this session": "Asztali értesítések engedélyezése ebben a munkamenetben", + "Enable audible notifications for this session": "Hallható értesítések engedélyezése ebben a munkamenetben", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "A jelszavad sikeresen megváltozott. Addig nem kapsz push értesítéseket más munkamenetekben amíg nem jelentkezel vissza bennük", + "Session ID:": "Munkamenet azonosító:", + "Session key:": "Munkamenet kulcs:", + "Sessions": "Munkamenetek", + "A session's public name is visible to people you communicate with": "A munkamenet nyilvános neve megjelenik azoknál az embereknél, akikkel beszélgetsz", + "This user has not verified all of their sessions.": "Ez a felhasználó még nem ellenőrizte az összes munkamenetét.", + "You have not verified this user.": "Még nem ellenőrizted ezt a felhasználót.", + "You have verified this user. This user has verified all of their sessions.": "Ezt a felhasználót ellenőrizted. Ez a felhasználó hitelesítette az összes munkamenetét.", + "Someone is using an unknown session": "Valaki ismeretlen munkamenetet használ", + "Some sessions for this user are not trusted": "Ennek a felhasználónak néhány munkamenete nem megbízható", + "All sessions for this user are trusted": "A felhasználónak minden munkamenete megbízható", + "Some sessions in this encrypted room are not trusted": "Ebben a titkosított szobában nem minden munkamenet megbízható", + "All sessions in this encrypted room are trusted": "Ebben a titkosított szobában minden munkamenet megbízható", + "Mod": "Mod", + "Your key share request has been sent - please check your other sessions for key share requests.": "A kulcs megosztás kérésed el lett küldve - ellenőrizd a többi munkamenetedet a kulcskérések után.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Kulcs megosztás kérés automatikusan el lett küldve neked a másik munkamenetekből. Ha elutasítottad vagy bezártad a kérést másik munkamenetedben, ide kattintva újrakérheted őket ehhez a munkamenethez.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Ha a többi munkameneted közül egyik sem tartalmazza a kulcsot ehhez az üzenethez, akkor ezt az üzenetet nem fogod tudni elolvasni.", + "Re-request encryption keys from your other sessions.": "Titkosítási kulcsok újrakérése a többi munkamenetből.", + "Encrypted by an unverified session": "Ellenőrizetlen munkamenet titkosította", + "Encrypted by a deleted session": "Törölt munkamenet által lett titkosítva", + "No sessions with registered encryption keys": "Nincs munkamenet regisztrált titkosítási kulcsokkal", + "Waiting for %(displayName)s to accept…": "%(displayName)s felhasználóra várakozás az elfogadáshoz…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Az üzeneted biztonságban van és csak neked és a címzetteknek van meg az egyedi kulcs a visszafejtéshez.", + "Your messages are not secure": "Az üzeneteid nincsenek biztonságban", + "One of the following may be compromised:": "Valamelyik az alábbiak közül kompromittált:", + "Your homeserver": "Matrix szervered", + "The homeserver the user you’re verifying is connected to": "Az ellenőrizendő felhasználó ehhez a matrix szerverhez kapcsolódik:", + "Yours, or the other users’ internet connection": "A te vagy a másik felhasználó Internet kapcsolata", + "Yours, or the other users’ session": "A te vagy a másik felhasználó munkamenete", + "%(count)s sessions|other": "%(count)s munkamenet", + "%(count)s sessions|one": "%(count)s munkamenet", + "Hide sessions": "Munkamenetek elrejtése", + "Verify by emoji": "Ellenőrzés emodzsival", + "Verify by comparing unique emoji.": "Ellenőrzés egyedi emodzsik összehasonlításával.", + "Ask %(displayName)s to scan your code:": "Kérd meg %(displayName)s felhasználót, hogy olvassa be a kódot:", + "If you can't scan the code above, verify by comparing unique emoji.": "Ha nem tudod beolvasni az alábbi kódot, ellenőrizd az egyedi emodzsik összehasonlításával.", + "You've successfully verified %(displayName)s!": "Sikeresen ellenőrizted a felhasználót: %(displayName)s!", + "Got it": "Értem", + "Verification timed out. Start verification again from their profile.": "Ellenőrzés időtúllépés. Kezd újra az ellenőrzést a másik felhasználó profiljából.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s törölte az ellenőrzést. Kezd újra az ellenőrzést a felhasználó profiljából.", + "You cancelled verification. Start verification again from their profile.": "Törölted az ellenőrzést. Kezd újra az ellenőrzést a felhasználó profiljából.", + "Encryption enabled": "Titkosítás engedélyezve", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Ebben a szobában az üzenetek végpontok között titkosítottak. Tudj meg többet és ellenőrizd ezt a felhasználót a profiljában.", + "Encryption not enabled": "Titkosítás nincs engedélyezve", + "The encryption used by this room isn't supported.": "A szobában használt titkosítás nem támogatott.", + "Clear all data in this session?": "Minden adat törlése ebben a munkamenetben?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Az adatok törlése ebből a munkamenetből végleges. A titkosított üzenetek elvesznek hacsak nincsenek elmentve a kulcsai.", + "Verify session": "Munkamenet ellenőrzése", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "A munkamenet megbízhatóságának eldöntéséhez ellenőrizd a kulcsot a Felhasználói Beállításokban ezen az eszközön, hogy megegyezik-e az alábbi kulccsal:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "A munkamenet megbízhatóságának eldöntéséhez vedd fel a kapcsolatot a tulajdonosával valami másik módon (pl. személyesen vagy telefonhívással) és kérdezd meg, hogy a Felhasználói Beállításokban ugyanazt a kulcsot látja-e mint ami alul van:", + "Session name": "Munkamenet neve", + "Session key": "Munkamenet kulcs", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Ha egyezik akkor nyomd meg az ellenőriz gombot alul. Ha nem akkor valaki lehallgatja a munkamenetet és valószínű, hogy inkább a tiltólista gombra kellene kattintani.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "A felhasználót ellenőrizve a munkamenet megbízhatónak lesz jelölve és ugyanakkor a munkamenetedet is megbízhatónak fogja jelölni náluk.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Eszköz ellenőrzése és beállítás megbízhatónak. Az eszközben való megbízás megnyugtató lehet, ha végpontok közötti titkosítást használsz.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Az eszköz ellenőrzése megbízhatónak fogja jelezni az eszközt és azok akik téged ellenőriztek megbíznak majd ebben az eszközödben.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Új munkamenetet adtál hozzá '%(displayName)s' néven ami kéri a titkosítási kulcsokat.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Az ellenőrizetlen munkameneted '%(displayName)s' néven titkosítási kulcsokat kér.", + "Loading session info...": "Munkamenet információk betöltése...", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Ezzel visszatérhetsz a fiókodba miután kijelentkeztél majd vissza egy másik munkamenetbe.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Jelenleg tiltólistán vannak az ellenőrizetlen munkamenetek; hogy üzeneteket tudj küldeni ezekbe a munkamenetekbe ellenőrizned kell őket.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Javasoljuk, hogy minden munkamenetet ellenőrizz, hogy a tényleges tulajdonosához tartoznak vagy újraküldheted az üzenetet ha akarod anélkül, hogy ellenőriznéd őket.", + "Room contains unknown sessions": "A szoba ismeretlen munkameneteket tartalmaz", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" még nem látott munkameneteket tartalmaz.", + "Unknown sessions": "Ismeretlen munkamenetek" } From f1d7cf6a564549e18f5632de13a47ee3ee1c5f4c Mon Sep 17 00:00:00 2001 From: random Date: Mon, 3 Feb 2020 09:44:29 +0000 Subject: [PATCH 008/103] Translated using Weblate (Italian) Currently translated at 99.9% (2100 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 116 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index f6ee0f82ff..dd6b697fb7 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2009,5 +2009,119 @@ "Verify this device by confirming the following number appears on its screen.": "Verifica questo dispositivo confermando che il seguente numero appare sullo schermo.", "Verify yourself & others to keep your chats safe": "Verifica te stesso e gli altri per mantenere sicure le chat", "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Backup chiavi salvato nell'archivio segreto, ma questa funzione non è attiva in questa sessione. Attiva la firma incrociata in Laboratori per modificare lo stato del backup chiavi.", - "Your keys are not being backed up from this session.": "Il backup chiavi non viene fatto per questa sessione." + "Your keys are not being backed up from this session.": "Il backup chiavi non viene fatto per questa sessione.", + "Enable desktop notifications for this session": "Attiva le notifiche desktop per questa sessione", + "Enable audible notifications for this session": "Attiva le notifiche audio per questa sessione", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "La tua password è stata cambiata correttamente. Non riceverai notifiche push in altre sessioni finchè non riesegui l'accesso in esse", + "Session ID:": "ID sessione:", + "Session key:": "Chiave sessione:", + "Message search": "Ricerca messaggio", + "Sessions": "Sessioni", + "A session's public name is visible to people you communicate with": "Il nome pubblico di una sessione è visibile alle persone con cui comunichi", + "This room is bridging messages to the following platforms. Learn more.": "Questa stanza fa un bridge dei messaggi con le seguenti piattaforme. Maggiori informazioni.", + "This room isn’t bridging messages to any platforms. Learn more.": "Questa stanza non fa un bridge dei messaggi con alcuna piattaforma. Maggiori informazioni.", + "Bridges": "Bridge", + "This user has not verified all of their sessions.": "Questo utente non ha verificato tutte le sue sessioni.", + "You have not verified this user.": "Non hai verificato questo utente.", + "You have verified this user. This user has verified all of their sessions.": "Hai verificato questo utente. Questo utente ha verificato tutte le sue sessioni.", + "Someone is using an unknown session": "Qualcuno sta usando una sessione sconosciuta", + "Some sessions for this user are not trusted": "Alcune sessioni di questo utente non sono fidate", + "All sessions for this user are trusted": "Tutte le sessioni di questo utente sono fidate", + "Some sessions in this encrypted room are not trusted": "Alcune sessioni in questa stanza cifrata non sono fidate", + "All sessions in this encrypted room are trusted": "Tutte le sessioni in questa stanza cifrata sono fidate", + "Your key share request has been sent - please check your other sessions for key share requests.": "La tua richiesta di condivisione chiavi è stata inviata - controlla le tue altre sessioni per le richieste.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Le richieste di condivisione chiavi vengono inviate alle tue altre sessioni automaticamente. Se sulle altre sessioni l'hai rifiutata o annullata, clicca qui per chiedere di nuovo le chiavi per questa sessione.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Se le altre sessioni non hanno la chiave per questo messaggio non sarai in grado di decifrarlo.", + "Re-request encryption keys from your other sessions.": "Chiedi di nuovo le chiavi di cifratura dalle altre sessioni.", + "Encrypted by an unverified session": "Cifrato da una sessione non verificata", + "Encrypted by a deleted session": "Cifrato da una sessione eliminata", + "No sessions with registered encryption keys": "Nessuna sessione con chiavi di cifratura registrate", + "Waiting for %(displayName)s to accept…": "In attesa che %(displayName)s accetti…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "I tuoi messaggi sono protetti e solo tu ed il destinatario avete le chiavi univoche per sbloccarli.", + "Your messages are not secure": "I tuoi messaggi non sono sicuri", + "One of the following may be compromised:": "Uno dei seguenti potrebbe essere compromesso:", + "Your homeserver": "Il tuo homeserver", + "The homeserver the user you’re verifying is connected to": "L'homeserver al quale è connesso l'utente che stai verificando", + "Yours, or the other users’ internet connection": "La tua connessione internet o quella degli altri utenti", + "Yours, or the other users’ session": "La tua sessione o quella degli altri utenti", + "%(count)s sessions|other": "%(count)s sessioni", + "%(count)s sessions|one": "%(count)s sessione", + "Hide sessions": "Nascondi sessione", + "Verify by emoji": "Verifica via emoji", + "Verify by comparing unique emoji.": "Verifica confrontando emoji specifici.", + "Ask %(displayName)s to scan your code:": "Chiedi a %(displayName)s di scansionare il tuo codice:", + "If you can't scan the code above, verify by comparing unique emoji.": "Se non riesci a scansionare il codice sopra, verifica confrontando emoji specifiche.", + "You've successfully verified %(displayName)s!": "Hai verificato correttamente %(displayName)s!", + "Got it": "Capito", + "Verification timed out. Start verification again from their profile.": "Verifica scaduta. Inizia di nuovo la verifica dal suo profilo.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s ha annullato la verifica. Inizia di nuovo la verifica dal suo profilo.", + "You cancelled verification. Start verification again from their profile.": "Hai annullato la verifica. Inizia di nuovo la verifica dal suo profilo.", + "Encryption enabled": "Cifratura attivata", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "I messaggi in questa stanza sono cifrati end-to-end. Maggiori info e verifica di questo utente nel suo profilo.", + "Encryption not enabled": "Cifratura non attivata", + "The encryption used by this room isn't supported.": "La cifratura usata da questa stanza non è supportata.", + "Clear all data in this session?": "Svuotare tutti i dati in questa sessione?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Lo svuotamento dei dati di questa sessione è permanente. I messaggi cifrati andranno persi a meno non si abbia un backup delle loro chiavi.", + "Verify session": "Verifica sessione", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Per verficare che questa sessione sia fidata, controlla che la chiave che vedi nelle impostazioni utente su quel dispositivo corrisponda a questa sotto:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Per verificare che questa sessione sia fidata, contatta il suo proprietario usando altri metodi (es. di persona o per telefono) e chiedi se la chiave che vede nelle sue impostazioni utente di questa sessione corrisponde con questa sotto:", + "Session name": "Nome sessione", + "Session key": "Chiave sessione", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Se corrisponde, premi il pulsante di verifica sottostante. Se non corrisponde, qualcuno sta intercettando questa sessione e dovresti invece premere il pulsante della lista nera.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "La verifica di questo utente contrassegnerà come fidata la sua sessione a te e viceversa.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifica questo dispositivo per segnarlo come fidato. Fidarsi di questo dispositivo offre a te e agli altri utenti una maggiore tranquillità nell'uso di messaggi cifrati end-to-end.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "La verifica di questo dispositivo lo segnerà come fidato e gli utenti che si sono verificati con te si fideranno di questo dispositivo.", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Se non riesci a trovare qualcuno, chiedigli il nome utente, condividi il tuo (%(userId)s) o il collegamento al profilo.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Hai aggiunto una nuova sessione '%(displayName)s', che sta chiedendo le chiavi di cifratura.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "La tua sessione non verificata '%(displayName)s' sta chiedendo le chiavi di cifratura.", + "Loading session info...": "Caricamento info di sessione...", + "New session": "Nuova sessione", + "Use this session to verify your new one, granting it access to encrypted messages:": "Usa questa sessione per verificare quella nuova, dandole accesso ai messaggi cifrati:", + "If you didn’t sign in to this session, your account may be compromised.": "Se non hai fatto l'accesso a questa sessione, il tuo account potrebbe essere compromesso.", + "This wasn't me": "Non ero io", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Ciò ti permetterà di tornare al tuo account dopo la disconnessione e di accedere in altre sessioni.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Stai attualmente bloccando sessioni non verificate; per inviare messaggi a queste sessioni devi verificarle.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Ti consigliamo di eseguire il processo di verifica per ogni sessione per confermare l'appartenenza al loro legittimo proprietario, ma puoi reinviare il messaggio senza la verifica se lo preferisci.", + "Room contains unknown sessions": "La stanza contiene sessioni sconosciute", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" contiene sessioni che non hai mai visto prima.", + "Unknown sessions": "Sessioni sconosciute", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Accedi alla tua cronologia di messaggi sicuri e all'identità a firma incrociata per verificare altre sessioni inserendo la tua password.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Accedi alla tua cronologia di messaggi sicuri e all'identità a firma incrociata per verificare altre sessioni inserendo la tua chiave di recupero.", + "Recovery key mismatch": "La chiave di recupero non corrisponde", + "Incorrect recovery passphrase": "Password di recupero errata", + "Backup restored": "Backup ripristinato", + "Enter recovery passphrase": "Inserisci password di recupero", + "Enter recovery key": "Inserisci chiave di recupero", + "Confirm your identity by entering your account password below.": "Conferma la tua identità inserendo la password dell'account sotto.", + "Message not sent due to unknown sessions being present": "Messaggio non inviato a causa della presenza di sessioni sconosciute", + "Show sessions, send anyway or cancel.": "Mostra le sessioni, invia comunque o annulla.", + "Your new session is now verified. Other users will see it as trusted.": "La tua nuova sessione è ora verificata. Gli altri utenti la vedranno come fidata.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Senza completare la sicurezza di questa sessione, essa non avrà accesso ai messaggi cifrati.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "La modifica della password reimposterà qualsiasi chiave di cifratura end-to-end su tutte le sessioni, rendendo illeggibile la cronologia delle chat cifrate. Configura il Backup Chiavi o esporta le tue chiavi della stanza da un'altra sessione prima di reimpostare la password.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Sei stato disconnesso da tutte le sessioni e non riceverai più notifiche push. Per riattivare le notifiche, riaccedi su ogni dispositivo.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Riprendi l'accesso al tuo account e recupera le chiavi di cifratura memorizzate in questa sessione. Senza di esse, non sarai in grado di leggere tutti i tuoi messaggi sicuri in qualsiasi sessione.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Attenzione: i tuoi dati personali (incluse le chiavi di cifratura) sono ancora memorizzati in questa sessione. Cancellali se hai finito di usare questa sessione o se vuoi accedere ad un altro account.", + "Sender session information": "Informazioni sessione del mittente", + "Restore your key backup to upgrade your encryption": "Ripristina il tuo backup chiavi per aggiornare la cifratura", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Aggiorna questa sessione per consentirle di verificare altre sessioni, garantendo loro l'accesso ai messaggi cifrati e contrassegnandole come fidate per gli altri utenti.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Imposta la cifratura su questa sessione per consentirle di verificare le altre sessioni, garantendo loro l'accesso ai messaggi cifrati e contrassegnandole come fidate per gli altri utenti.", + "Back up my encryption keys, securing them with the same passphrase": "Fai il backup delle mie chiavi di cifratura, proteggendole con la stessa password", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Conservane una copia in un luogo sicuro, come un gestore di password o una cassaforte.", + "Your recovery key": "La tua chiave di recupero", + "Copy": "Copia", + "You can now verify your other devices, and other users to keep your chats safe.": "Ora puoi verificare i tuoi altri dispositivi e gli altri utenti per tenere al sicuro le tue chat.", + "Make a copy of your recovery key": "Fai una copia della chiave di recupero", + "You're done!": "Hai finito!", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Senza configurare il Recupero Messaggi Sicuri, non potrai ripristinare la cronologia di messaggi cifrati se ti disconnetti o se usi un'altra sessione.", + "Create key backup": "Crea backup chiavi", + "This session is encrypting history using the new recovery method.": "Questa sessione sta cifrando la cronologia usando il nuovo metodo di recupero.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Questa sessione ha rilevato che la tua password di recupero e la chiave per i Messaggi Sicuri sono state rimosse.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Se l'hai fatto accidentalmente, puoi configurare Messaggi Sicuri su questa sessione che cripterà nuovamente la cronologia dei messaggi con un nuovo metodo di recupero.", + "If disabled, messages from encrypted rooms won't appear in search results.": "Se disattivato, i messaggi delle stanze cifrate non appariranno nei risultati di ricerca.", + "Disable": "Disattiva", + "Not currently downloading messages for any room.": "Nessuno scaricamento di messaggi in corso per alcuna stanza.", + "Downloading mesages for %(currentRoom)s.": "Scaricamento messaggi per %(currentRoom)s.", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot sta tenendo in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca:", + "of ": "di ", + "Message downloading sleep time(ms)": "Tempo di attesa scaricamento messaggi (ms)" } From c93e098d4cd3485f6b4c5d11711b7ee15a2f1731 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 6 Feb 2020 13:27:51 +0000 Subject: [PATCH 009/103] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2101 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 668725c4aa..8cf4f7706e 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2126,5 +2126,7 @@ "You're done!": "您已經完成了!", "Create key backup": "建立金鑰備份", "Message downloading sleep time(ms)": "訊息下載休眠時間(毫秒)", - "of ": "的 " + "of ": "的 ", + "Indexed rooms:": "已索引的聊天室:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(totalRooms)s 中的 %(crawlingRooms)s" } From fba314d65f0b7f8bada5077f992a506ea5da0b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Thu, 6 Feb 2020 12:55:20 +0000 Subject: [PATCH 010/103] Translated using Weblate (Czech) Currently translated at 96.1% (2020 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3adc393e0a..5941fdedb4 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2010,5 +2010,35 @@ "%(count)s sessions|one": "%(count)s relace", "Hide sessions": "Skrýt relace", "Verify by emoji": "Ověřit emotikonami", - "Verify by comparing unique emoji.": "Oveření porovnáním několika emotikon." + "Verify by comparing unique emoji.": "Oveření porovnáním několika emotikon.", + "Ask %(displayName)s to scan your code:": "Ověříte se, když %(displayName)s naskenuje váš kód:", + "If you can't scan the code above, verify by comparing unique emoji.": "Pokud vám skenování kódů nefunguje, ověřte se porovnáním emotikon.", + "You've successfully verified %(displayName)s!": "%(displayName)s je úspěšně ověřen/a!", + "Got it": "Dobře", + "Verification timed out. Start verification again from their profile.": "Čas na verifikaci vypršel. Začněte s verifikací znovu z druhého profilu.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s zrušil/a verifikaci. Začněte s verifikací znovu z druhého profilu.", + "Encryption enabled": "Šifrování je zapnuté", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Zprávy v této místnosti jsou E2E šifrované. Více informací & verifikace uživatele je v jeho profilu.", + "Encryption not enabled": "Šifrování je vypnuté", + "The encryption used by this room isn't supported.": "Šifrování používané v této místnosti není podporované.", + "Clear all data in this session?": "Smazat všechna data v této relaci?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Výmaz všech dat v relaci je nevratný. Pokud nemáte zálohované šifrovací klíče, přijdete o šifrované zprávy.", + "Verify session": "Ověřit relaci", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Abychom ověřili, že je relace důvěryhodná, zkontrolujte prosím, že klíč v uživatelském nastavení na tom zařízení odpovídá následujícímu klíči:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Abychom ověřili, že tato relace je důvěryhodná, kontaktujte prosím jejího vlastníka nějakým dalším způsobem (osobně, telefonicky, apod.). Zkontrolujte spolu, že klíč v uživatelském nastavení na druhém zařízení odpovídá následujícímu klíči:", + "Session name": "Jméno relace", + "Session key": "Klíč relace", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Pokud odpovídá, zmáčkněte tlačítko ověřit. Pokud ne, druhé zařízení je pravděpodobně falešné a chcete ho zablokovat.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Ověření uživatele označí jeho relace za důvěryhodné a Vaše relace budou důvěryhodné pro něj.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Ověření zařízení ho označí za důvěryhodné. Ověření konkrétního zařízení vám dát trochu klidu mysli navíc při používání šifrovaných zpráv.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Ověření zařízení ho označí za důvěryhodné a uživatelé, kteří věří vám budou také tomuto zařízení důvěřovat.", + "Failed to invite the following users to chat: %(csvUsers)s": "Následující uživatele se nepovedlo pozvat do chatu: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "Nepovedlo se nám vyrobit soukromou konverzaci. Zkontrolujte prosím, že pozvaný uživatel opravdu existuje a pak to zkuste znovu.", + "Something went wrong trying to invite the users.": "Při odesílání pozvánek se něco pokazilo.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "Nemůžeme pozvat tyto uživatele. Zkontrolujte prosím, že opravdu existují a zkuste to znovu.", + "Failed to find the following users": "Nepovedlo se najít následující uživatele", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Následující uživatelé asi neexistují nebo jsou neplatní a nelze je pozvat: %(csvNames)s", + "Recent Conversations": "Nedávné konverzace", + "Suggestions": "Návrhy", + "Recently Direct Messaged": "Nedávno kontaktovaní" } From 1105c14fdd41dec71a8a531ece2c76c01ab7552b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Thu, 6 Feb 2020 13:53:52 +0000 Subject: [PATCH 011/103] Translated using Weblate (Czech) Currently translated at 98.0% (2059 of 2101 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 5941fdedb4..97ca508e04 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2040,5 +2040,44 @@ "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Následující uživatelé asi neexistují nebo jsou neplatní a nelze je pozvat: %(csvNames)s", "Recent Conversations": "Nedávné konverzace", "Suggestions": "Návrhy", - "Recently Direct Messaged": "Nedávno kontaktovaní" + "Recently Direct Messaged": "Nedávno kontaktovaní", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Pokud někoho nemůžete nalézt, zeptejte se na username, pošlete jim svůj (%(userId)s) a nebo pošlete odkaz na svůj profil.", + "Go": "Ok", + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Pokud někoho nemůžete nalézt, zeptejte se na username (například @user:server.com) a nebo pošlete odkaz na tuto místnost.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Přidali jste novou relaci '%(displayName)s', která požaduje šifrovací klíče.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Vaše neověřená relace '%(displayName)s' požaduje šifrovací klíče.", + "Loading session info...": "Načítám informace o relaci...", + "New session": "Nová relace", + "Use this session to verify your new one, granting it access to encrypted messages:": "Použijte tuto relaci abyste ověřili novou a dali jí přístup ke svým šifrovaným zprávám:", + "If you didn’t sign in to this session, your account may be compromised.": "Pokud jste se do této nové relace nepřihlásili, váš účet může být kompromitován.", + "This wasn't me": "Nebyl/a jsem to já", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Umožní vám to se přihlásit do dalších relací a vrátit se ke svému účtu poté co se odhlásíte.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Máte zakázané posílání zpráv neověřeným relacím; abyste mohli zprávu odeslat, musíte je ověřit.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Doporučujeme si projít ověřovací proces pro každou relaci abyste ověřili, že patří tomu, komu očekáváte. Můžete ale poslat zprávu i bez ověření, pokud chcete.", + "Room contains unknown sessions": "V místnosti jsou neověřené relace", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "V místnosti \"%(RoomName)s\" jsou relace, které jste ještě nikdy neviděli.", + "Unknown sessions": "Neznámá relace", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Zadejte svoje heslo a získejte přístup k bezpečnému úložišti historie zpráv a k identitě pro cross-signing pro snadné ověřování vašich relací.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Zadejte svůj obnovovací klíč a získejte přístup k bezpečnému úložišti historie zpráv a k identitě pro cross-signing pro snadné ověřování vašich relací.", + "Recovery key mismatch": "Obnovovací klíč neodpovídá", + "Incorrect recovery passphrase": "Nesprávné heslo pro obnovení", + "Backup restored": "Záloha byla nahrána", + "Enter recovery passphrase": "Zadejte heslo pro obnovení zálohy", + "Enter recovery key": "Zadejte obnovovací klíč", + "Confirm your identity by entering your account password below.": "Potvrďte svou identitu zadáním hesla ke svému účtu.", + "Message not sent due to unknown sessions being present": "Zpráva nebyla odeslána, protože jsou v místnosti neznámé relace", + "Show sessions, send anyway or cancel.": "Zobrazit relace, i tak odeslat, a nebo zrušit.", + "Verify this session to grant it access to encrypted messages.": "Ověřte relaci aby získala přístup k šifrovaným zprávám.", + "Start": "Začít", + "Session verified": "Relace je ověřena", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Vaše nová relace je teď ověřená. Má přístup k šifrovaným zprávám a ostatní uživatelé jí budou věřit.", + "Your new session is now verified. Other users will see it as trusted.": "Vaše nová relace je teď ověřená. Ostatní uživatelé jí budou věřit.", + "Done": "Hotovo", + "Without completing security on this session, it won’t have access to encrypted messages.": "Bez dokončení ověření nebude mít nová relace přístup k šifrovaným zprávám.", + "Go Back": "Zpět", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Změna hesla resetuje šifrovací klíče ve všech vašich přihlášených relacích a přijdete tak o přístup k historickým zprávám. Před změnou hesla si nastavte zálohu klíčů nebo si klíče pro místnosti exportujte.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Všude jsme Vás odhlásili, takže nedostáváte žádné upozornění. Můžete je znovu povolit tím, že se na všech svych zařízeních znovu přihlásíte.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Získejte znovu přístup k účtu a obnovte si šifrovací klíče uložené v této relaci. Bez nich nebudete schopni číst zabezpečené zprávy na některých zařízeních.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Varování: Vaše osobní data (včetně šifrovacích klíčů) jsou tu pořád uložena. Smažte je, pokud chcete tuto relaci zahodit nebo se přihlašte pod jiný účet.", + "Sender session information": "Informace o relaci odesílatele" } From f620cc05e24d843a322c1d1443a2e1ea105a2036 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 6 Feb 2020 20:01:09 +0000 Subject: [PATCH 012/103] Translated using Weblate (Hungarian) Currently translated at 99.7% (2097 of 2103 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index b8d14774d6..d3a77a6bcc 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2090,5 +2090,35 @@ "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Javasoljuk, hogy minden munkamenetet ellenőrizz, hogy a tényleges tulajdonosához tartoznak vagy újraküldheted az üzenetet ha akarod anélkül, hogy ellenőriznéd őket.", "Room contains unknown sessions": "A szoba ismeretlen munkameneteket tartalmaz", "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" még nem látott munkameneteket tartalmaz.", - "Unknown sessions": "Ismeretlen munkamenetek" + "Unknown sessions": "Ismeretlen munkamenetek", + "Cancel entering passphrase?": "Megszakítod a jelmondat bevitelét?", + "If you cancel now, you won't complete your secret storage operation!": "Ha most megszakítod, akkor nem fejezed be a biztonságos tárolóval kapcsolatos műveletet!", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "A jelmondat megadásával hozzáférhetsz a biztonságos üzeneteidhez és az eszközök közötti hitelesítéshez használt személyazonosságodhoz, hogy más munkameneteket hitelesíthess.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "A visszaállítási kulcs megadásával hozzáférhetsz a biztonságos üzeneteidhez és az eszközök közötti hitelesítéshez használt személyazonosságodhoz, hogy más munkameneteket hitelesíthess.", + "Recovery key mismatch": "A visszaállítási kulcs nem megfelelő", + "Incorrect recovery passphrase": "A visszaállítási jelmondat helytelen", + "Backup restored": "Mentés visszaállítva", + "Enter recovery passphrase": "Visszaállítási jelmondat megadása", + "Enter recovery key": "Visszaállítási kulcs megadása", + "Confirm your identity by entering your account password below.": "A fiók jelszó megadásával erősítsd meg a személyazonosságodat.", + "Message not sent due to unknown sessions being present": "Ismeretlen munkamenet miatt az üzenet nem került elküldésre", + "Show sessions, send anyway or cancel.": "Munkamenetek megmutatása, küldés mindenképpen vagy küldés megszakítása.", + "Your new session is now verified. Other users will see it as trusted.": "Az új munkameneted ellenőrizve. Mások megbízhatónak fogják látni.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Amíg a biztonság nincs beállítva a munkameneten nem fér hozzá a titkosított üzenetekhez.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "A jelszó változtatás minden munkamenet végpontok közötti titkosító kulcsait alaphelyzetbe állítja, ezáltal a titkosított üzenetek olvashatatlanok lesznek, hacsak először nem mented ki a szobák kulcsait és töltöd vissza jelszóváltoztatás után. A jövőben ezt egyszerűsítjük majd.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Kijelentkeztettünk minden eszközödből és nem kapsz értesítéseket sem. Az értesítések újra engedélyezéséhez jelentkezz be újra az eszközökön.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Szerezd vissza a hozzáférést a fiókodhoz és állítsd vissza az elmentett titkosítási kulcsokat ebben a munkamenetben. Ezek nélkül egyetlen munkamenetben sem tudod elolvasni a titkosított üzeneteidet.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Figyelmeztetés: A személyes adataid (beleértve a titkosító kulcsokat is) továbbra is az eszközön vannak tárolva. Ha az eszközt nem használod tovább vagy másik fiókba szeretnél bejelentkezni, töröld őket.", + "Sender session information": "Küldő munkamenet információ", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Fejleszd ezt a munkamenetet, hogy más munkamenetet tudj vele hitelesíteni amivel hozzáférnek a titkosított üzenetekhez és megbízhatónak lesznek jelölve más felhasználók számára.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Állítsd be a titkosítást ezen a munkameneten, hogy más munkamenetet tudj vele hitelesíteni amivel hozzáférnek a titkosított üzenetekhez és megbízhatónak lesznek jelölve más felhasználók számára.", + "Back up my encryption keys, securing them with the same passphrase": "Mentsd el a titkosítási kulcsaimat és védd őket ugyanazzal a jelmondattal", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "A másolatot tartsd biztonságos helyen, mint pl. egy jelszókezelő (vagy széf).", + "Your recovery key": "Visszaállítási kulcsod", + "Copy": "Másol", + "You can now verify your other devices, and other users to keep your chats safe.": "Már ellenőrizheted a többi eszközödet és más felhasználókat, hogy a beszélgetéseidet biztonságban tudhasd.", + "Make a copy of your recovery key": "Készíts másolatot a visszaállítási kulcsodról", + "You're done!": "Kész!", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "A Biztonságos Üzenet Visszaállítás beállítása nélkül kijelentkezés után vagy másik munkamenetet használva nem tudod visszaállítani a titkosított üzeneteidet.", + "Create key backup": "Kulcs mentés készítése" } From 2bafc1ebc895eff36da70932b034363c7d039bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Fri, 7 Feb 2020 08:01:44 +0000 Subject: [PATCH 013/103] Translated using Weblate (French) Currently translated at 100.0% (2103 of 2103 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index cc79b5c9fc..e1bf47569d 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2126,5 +2126,9 @@ "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Si vous l’avez fait accidentellement, vous pouvez configurer les messages sécurisés sur cette session ce qui re-chiffrera l’historique des messages de cette session avec une nouvelle méthode de récupération.", "How fast should messages be downloaded.": "À quelle fréquence les messages doivent être téléchargés.", "of ": "sur ", - "Message downloading sleep time(ms)": "Temps d’attente de téléchargement des messages (ms)" + "Message downloading sleep time(ms)": "Temps d’attente de téléchargement des messages (ms)", + "Cancel entering passphrase?": "Annuler la saisie de la phrase de passe ?", + "If you cancel now, you won't complete your secret storage operation!": "Si vous annulez maintenant, vous ne terminerez pas votre opération du coffre secret !", + "Indexed rooms:": "Salons indexés :", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s sur %(totalRooms)s" } From 6d0aab2a2d62d67c0d843a48478f8b1fb69e8572 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 7 Feb 2020 08:55:03 +0000 Subject: [PATCH 014/103] Translated using Weblate (French) Currently translated at 100.0% (2103 of 2103 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index e1bf47569d..940f850df1 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1153,7 +1153,7 @@ "Waiting for partner to confirm...": "Nous attendons que le partenaire confirme…", "Incoming Verification Request": "Demande de vérification entrante", "Go back": "Revenir en arrière", - "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Pour éviter la duplication d'issues, veuillez voir les issues existantsd'abord (et ajouter un +1) ou créer un nouvel issue si vous ne le trouvez pas.", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Pour éviter la duplication de problèmes, veuillez voir les problèmes existants d'abord (et ajouter un +1) ou créer un nouveau problème si vous ne le trouvez pas.", "Report bugs & give feedback": "Rapporter des anomalies & Donner son avis", "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "La sauvegarde n'a pas pu être déchiffrée avec cette clé : veuillez vérifier que vous avez saisi la bonne clé de récupération.", "Update status": "Mettre à jour le statut", From 9a0bc15548f9d0eea82e95477462cf11d1116e6d Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 6 Feb 2020 21:13:47 +0000 Subject: [PATCH 015/103] Translated using Weblate (Hungarian) Currently translated at 100.0% (2103 of 2103 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index d3a77a6bcc..14ba143c10 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2120,5 +2120,11 @@ "Make a copy of your recovery key": "Készíts másolatot a visszaállítási kulcsodról", "You're done!": "Kész!", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "A Biztonságos Üzenet Visszaállítás beállítása nélkül kijelentkezés után vagy másik munkamenetet használva nem tudod visszaállítani a titkosított üzeneteidet.", - "Create key backup": "Kulcs mentés készítése" + "Create key backup": "Kulcs mentés készítése", + "This session is encrypting history using the new recovery method.": "Ez a munkamenet az új visszaállítási metódussal titkosítja a régi üzeneteket.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "A munkamenet észrevette, hogy a visszaállítási jelmondat és a kulcs a Biztonságos Üzenetekhez törölve lett.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Ha véletlenül tetted, beállíthatod a Biztonságos Üzeneteket ezen a munkameneten ami újra titkosítja a régi üzeneteket az visszaállítási eljárással.", + "Indexed rooms:": "Indexált szobák:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s / %(totalRooms)s", + "Message downloading sleep time(ms)": "Üzenet letöltés alvási idő (ms)" } From fa13bb96893d242efff8250b13d083cea954ce31 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 30 Jan 2020 18:50:44 +0100 Subject: [PATCH 016/103] make the verif toast work with to_device request that do .request/.ready --- .../views/toasts/VerificationRequestToast.js | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 5125e20261..0c5d29ebe6 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -58,10 +58,7 @@ export default class VerificationRequestToast extends React.PureComponent { _checkRequestIsPending = () => { const {request} = this.props; - const isPendingInRoomRequest = request.channel.roomId && - !(request.ready || request.started || request.done || request.cancelled || request.observeOnly); - const isPendingDeviceRequest = request.channel.deviceId && request.started; - if (!isPendingInRoomRequest && !isPendingDeviceRequest) { + if (request.done || request.cancelled || request.observeOnly) { ToastStore.sharedInstance().dismissToast(this.props.toastKey); } }; @@ -79,6 +76,7 @@ export default class VerificationRequestToast extends React.PureComponent { ToastStore.sharedInstance().dismissToast(this.props.toastKey); const {request} = this.props; // no room id for to_device requests + const cli = MatrixClientPeg.get(); try { if (request.channel.roomId) { dis.dispatch({ @@ -86,23 +84,29 @@ export default class VerificationRequestToast extends React.PureComponent { room_id: request.channel.roomId, should_peek: false, }); - await request.accept(); - const cli = MatrixClientPeg.get(); + } else { dis.dispatch({ - action: "set_right_panel_phase", - phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: { - verificationRequest: request, - member: cli.getUser(request.otherUserId), - }, + action: 'view_room', + room_id: cli.getRooms()[0].roomId, + should_peek: false, }); - } else if (request.channel.deviceId && request.verifier) { - // show to_device verifications in dialog still - const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); - Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { - verifier: request.verifier, - }, null, /* priority = */ false, /* static = */ true); } + await request.accept(); + dis.dispatch({ + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: { + verificationRequest: request, + member: cli.getUser(request.otherUserId), + }, + }); + // } else if (request.channel.deviceId && request.verifier) { + // // show to_device verifications in dialog still + // const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); + // Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { + // verifier: request.verifier, + // }, null, /* priority = */ false, /* static = */ true); + // } } catch (err) { console.error(err.message); } From 049a6d2064605c521e53fe91f19b3e86e4bd3976 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Sun, 2 Feb 2020 10:25:05 +0100 Subject: [PATCH 017/103] hide toast when request is accepted if this is a .request > .ready request, dismissing when in .ready is what we want, as that is how you accept the request if this is a .start request, we shouldn't dismiss so only add .ready to the phases to hide the toast, not .started --- src/components/views/toasts/VerificationRequestToast.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 0c5d29ebe6..a5a26f7ddb 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -58,7 +58,7 @@ export default class VerificationRequestToast extends React.PureComponent { _checkRequestIsPending = () => { const {request} = this.props; - if (request.done || request.cancelled || request.observeOnly) { + if (request.ready || request.done || request.cancelled || request.observeOnly) { ToastStore.sharedInstance().dismissToast(this.props.toastKey); } }; From 413a149b4713feded25cc23f912200871c456188 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Sun, 2 Feb 2020 10:47:15 +0100 Subject: [PATCH 018/103] disable "Accept"/"Decline" buttons on verif tile after clicking to avoid sending double events --- src/components/views/messages/MKeyVerificationRequest.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/views/messages/MKeyVerificationRequest.js b/src/components/views/messages/MKeyVerificationRequest.js index ab02b2e5ad..9a48858bc7 100644 --- a/src/components/views/messages/MKeyVerificationRequest.js +++ b/src/components/views/messages/MKeyVerificationRequest.js @@ -27,6 +27,7 @@ import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; export default class MKeyVerificationRequest extends React.Component { constructor(props) { super(props); + this.state = {}; } componentDidMount() { @@ -58,6 +59,7 @@ export default class MKeyVerificationRequest extends React.Component { }; _onAcceptClicked = async () => { + this.setState({acceptOrCancelClicked: true}); const request = this.props.mxEvent.verificationRequest; if (request) { try { @@ -70,6 +72,7 @@ export default class MKeyVerificationRequest extends React.Component { }; _onRejectClicked = async () => { + this.setState({acceptOrCancelClicked: true}); const request = this.props.mxEvent.verificationRequest; if (request) { try { @@ -135,9 +138,10 @@ export default class MKeyVerificationRequest extends React.Component { subtitle = (
{ userLabelForEventRoom(request.requestingUserId, mxEvent.getRoomId())}
); if (request.requested && !request.observeOnly) { + const disabled = this.state.acceptOrCancelClicked; stateNode = (
- - + +
); } } else { // request sent by us From 577121e88d43513f66b8803257b186ca23d44f90 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Sun, 2 Feb 2020 10:48:02 +0100 Subject: [PATCH 019/103] disable "verify by emoji" after clicking it --- src/components/views/right_panel/VerificationPanel.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 3527747a66..f925508be6 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -62,8 +62,9 @@ export default class VerificationPanel extends React.PureComponent { if (pending) { button = ; } else { + const disabled = this.state.emojiButtonClicked; button = ( - + {_t("Verify by emoji")} ); @@ -196,6 +197,7 @@ export default class VerificationPanel extends React.PureComponent { } _startSAS = async () => { + this.setState({emojiButtonClicked: true}); const verifier = this.props.request.beginKeyVerification(verificationMethods.SAS); try { await verifier.verify(); From 8fdae73e030546decf346d0f23a9c956faa456e2 Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 7 Feb 2020 14:55:01 +0000 Subject: [PATCH 020/103] Button to reset cross-signing and SSSS keys --- src/CrossSigningManager.js | 11 ++-- .../CreateSecretStorageDialog.js | 10 ++- .../ConfirmDestroyCrossSigningDialog.js | 63 +++++++++++++++++++ .../views/settings/CrossSigningPanel.js | 24 ++++++- src/i18n/strings/en_EN.json | 4 ++ 5 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index a560c956f1..08ec459f26 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -116,17 +116,20 @@ export const crossSigningCallbacks = { * @param {Function} [func] An operation to perform once secret storage has been * bootstrapped. Optional. */ -export async function accessSecretStorage(func = async () => { }) { +export async function accessSecretStorage(func = async () => { }, force = false) { const cli = MatrixClientPeg.get(); secretStorageBeingAccessed = true; - try { - if (!await cli.hasSecretStorageKey()) { + if (!await cli.hasSecretStorageKey() || force) { + console.warn(!force ? "!hasSecretStorageKey()" : "force"); // This dialog calls bootstrap itself after guiding the user through // passphrase creation. const { finished } = Modal.createTrackedDialogAsync('Create Secret Storage dialog', '', import("./async-components/views/dialogs/secretstorage/CreateSecretStorageDialog"), - null, null, /* priority = */ false, /* static = */ true, + { + force, + }, + null, /* priority = */ false, /* static = */ true, ); const [confirmed] = await finished; if (!confirmed) { diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 679b3907d1..c3574c0094 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -55,10 +55,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { static propTypes = { hasCancel: PropTypes.bool, accountPassword: PropTypes.string, + force: PropTypes.bool, }; static defaultProps = { hasCancel: true, + force: false, }; constructor(props) { @@ -107,7 +109,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo) ); - const phase = backupInfo ? PHASE_MIGRATE : PHASE_PASSPHRASE; + const { force } = this.props; + const phase = (backupInfo && !force) ? PHASE_MIGRATE : PHASE_PASSPHRASE; this.setState({ phase, @@ -219,12 +222,15 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); + const { force } = this.props; + try { await cli.bootstrapSecretStorage({ + setupNewSecretStorage: force, authUploadDeviceSigningKeys: this._doBootstrapUIAuth, createSecretStorageKey: async () => this._keyInfo, keyBackupInfo: this.state.backupInfo, - setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, + setupNewKeyBackup: force || !this.state.backupInfo && this.state.useKeyBackup, }); this.setState({ phase: PHASE_DONE, diff --git a/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js new file mode 100644 index 0000000000..942249e07d --- /dev/null +++ b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js @@ -0,0 +1,63 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import {_t} from "../../../languageHandler"; +import * as sdk from "../../../index"; + +export default class ConfirmDestroyCrossSigningDialog extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + }; + + _onConfirm = () => { + this.props.onFinished(true); + }; + + _onDecline = () => { + this.props.onFinished(false); + }; + + render() { + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + + return ( + +
+

+ {_t( + "Deleting cross-signing keys is permanent. " + + "Anyone you have verified with will see security alerts. " + + "You almost certainly don't want to do this, unless " + + "you've lost every device you can cross-sign from." + )} +

+
+ +
+ ); + } +} diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index f99968c44f..35f617b83b 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -20,6 +20,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; import { accessSecretStorage } from '../../../CrossSigningManager'; +import Modal from '../../../Modal'; export default class CrossSigningPanel extends React.PureComponent { constructor(props) { @@ -87,10 +88,10 @@ export default class CrossSigningPanel extends React.PureComponent { * cross-signing keys as needed. * 3. All keys are loaded and there's nothing to do. */ - _bootstrapSecureSecretStorage = async () => { + _bootstrapSecureSecretStorage = async (force=false) => { this.setState({ error: null }); try { - await accessSecretStorage(); + await accessSecretStorage(() => undefined, force); } catch (e) { this.setState({ error: e }); console.error("Error bootstrapping secret storage", e); @@ -99,6 +100,19 @@ export default class CrossSigningPanel extends React.PureComponent { this._getUpdatedStatus(); } + onDestroyStorage = (act) => { + if (!act) return; + console.log("Destroy secret storage:", act); + this._bootstrapSecureSecretStorage(true); + } + + _destroySecureSecretStorage = () => { + const ConfirmDestoryCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog"); + Modal.createDialog(ConfirmDestoryCrossSigningDialog, { + onFinished: this.onDestroyStorage + }); + } + render() { const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); const { @@ -142,6 +156,12 @@ export default class CrossSigningPanel extends React.PureComponent { {_t("Bootstrap cross-signing and secret storage")}
; + } else { + bootstrapButton =
+ + {_t("Torpedo cross-signing")} + +
; } return ( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d125d10cfb..edb0da8780 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -553,6 +553,7 @@ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", + "Torpedo cross-signing": "Torpedo cross-signing", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", @@ -1430,6 +1431,9 @@ "Changelog": "Changelog", "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", "Removing…": "Removing…", + "Destroy cross-signing keys?": "Destroy cross-signing keys?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.", + "Clear cross-signing keys": "Clear cross-signing keys", "Confirm Removal": "Confirm Removal", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", "Clear all data in this session?": "Clear all data in this session?", From 1a5bed5a105f1db0bd219e52983fb03ff65ad704 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 17:16:27 +0100 Subject: [PATCH 021/103] open a to_device request in a modal instead of the right panel 1st room --- .../views/toasts/VerificationRequestToast.js | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index a5a26f7ddb..92402c3f98 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -78,28 +78,28 @@ export default class VerificationRequestToast extends React.PureComponent { // no room id for to_device requests const cli = MatrixClientPeg.get(); try { + await request.accept(); if (request.channel.roomId) { dis.dispatch({ action: 'view_room', room_id: request.channel.roomId, should_peek: false, }); - } else { dis.dispatch({ - action: 'view_room', - room_id: cli.getRooms()[0].roomId, - should_peek: false, + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: { + verificationRequest: request, + member: cli.getUser(request.otherUserId), + }, }); - } - await request.accept(); - dis.dispatch({ - action: "set_right_panel_phase", - phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: { + } else { + const VerificationRequestDialog = sdk.getComponent("views.dialogs.VerificationRequestDialog"); + Modal.createTrackedDialog('Incoming Verification', '', VerificationRequestDialog, { verificationRequest: request, - member: cli.getUser(request.otherUserId), - }, - }); + }, null, /* priority = */ false, /* static = */ true); + } + // } else if (request.channel.deviceId && request.verifier) { // // show to_device verifications in dialog still // const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); From ce39d1de7076b8deb0deeadedbef1519ff8918b6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 7 Feb 2020 13:25:07 +0000 Subject: [PATCH 022/103] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2105 of 2105 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 8cf4f7706e..2570746fc7 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2128,5 +2128,9 @@ "Message downloading sleep time(ms)": "訊息下載休眠時間(毫秒)", "of ": "的 ", "Indexed rooms:": "已索引的聊天室:", - "%(crawlingRooms)s out of %(totalRooms)s": "%(totalRooms)s 中的 %(crawlingRooms)s" + "%(crawlingRooms)s out of %(totalRooms)s": "%(totalRooms)s 中的 %(crawlingRooms)s", + "If you cancel now, you won't complete verifying the other user.": "如果您現在取消,您將無法完成驗證其他使用者。", + "If you cancel now, you won't complete verifying your other session.": "如果您現在取消,您將無法完成驗證您其他的工作階段。", + "If you cancel now, you won't complete your secret storage operation.": "如果您現在取消,您將無法完成驗證您的秘密儲存空間動作。", + "Cancel entering passphrase?": "取消輸入通關密語?" } From 066faa18f19995742a36e78c4cede380867f0863 Mon Sep 17 00:00:00 2001 From: random Date: Fri, 7 Feb 2020 10:31:36 +0000 Subject: [PATCH 023/103] Translated using Weblate (Italian) Currently translated at 100.0% (2105 of 2105 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index dd6b697fb7..e3be1a1aae 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2123,5 +2123,12 @@ "Downloading mesages for %(currentRoom)s.": "Scaricamento messaggi per %(currentRoom)s.", "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot sta tenendo in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca:", "of ": "di ", - "Message downloading sleep time(ms)": "Tempo di attesa scaricamento messaggi (ms)" + "Message downloading sleep time(ms)": "Tempo di attesa scaricamento messaggi (ms)", + "If you cancel now, you won't complete verifying the other user.": "Se adesso annulli, non completerai la verifica dell'altro utente.", + "If you cancel now, you won't complete verifying your other session.": "Se adesso annulli, non completerai la verifica dell'altra tua sessione.", + "If you cancel now, you won't complete your secret storage operation.": "Se adesso annulli, non completerai l'operazione dell'archivio segreto.", + "Cancel entering passphrase?": "Annullare l'inserimento della password?", + "Mod": "Moderatore", + "Indexed rooms:": "Stanze indicizzate:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s di %(totalRooms)s" } From b08c5d84107b0e60b89f932c830b4767d0bc60d7 Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 7 Feb 2020 15:46:31 +0000 Subject: [PATCH 024/103] lint --- src/CrossSigningManager.js | 1 + .../views/dialogs/ConfirmDestroyCrossSigningDialog.js | 2 +- src/components/views/settings/CrossSigningPanel.js | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 08ec459f26..3381f3e93b 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -115,6 +115,7 @@ export const crossSigningCallbacks = { * * @param {Function} [func] An operation to perform once secret storage has been * bootstrapped. Optional. + * @param {bool} [force] Reset secret storage even if it's already set up */ export async function accessSecretStorage(func = async () => { }, force = false) { const cli = MatrixClientPeg.get(); diff --git a/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js index 942249e07d..3242afd5f1 100644 --- a/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js +++ b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js @@ -46,7 +46,7 @@ export default class ConfirmDestroyCrossSigningDialog extends React.Component { "Deleting cross-signing keys is permanent. " + "Anyone you have verified with will see security alerts. " + "You almost certainly don't want to do this, unless " + - "you've lost every device you can cross-sign from." + "you've lost every device you can cross-sign from.", )}

diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index 35f617b83b..77cae79324 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -87,6 +87,7 @@ export default class CrossSigningPanel extends React.PureComponent { * 2. Access existing secret storage by requesting passphrase and accessing * cross-signing keys as needed. * 3. All keys are loaded and there's nothing to do. + * @param {bool} [force] Bootstrap again even if keys already present */ _bootstrapSecureSecretStorage = async (force=false) => { this.setState({ error: null }); @@ -109,7 +110,7 @@ export default class CrossSigningPanel extends React.PureComponent { _destroySecureSecretStorage = () => { const ConfirmDestoryCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog"); Modal.createDialog(ConfirmDestoryCrossSigningDialog, { - onFinished: this.onDestroyStorage + onFinished: this.onDestroyStorage, }); } From a260d7a1471d15b8af31dea56f220d457e5dfd1d Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 7 Feb 2020 15:53:43 +0000 Subject: [PATCH 025/103] manual lint --- src/CrossSigningManager.js | 1 - .../views/dialogs/ConfirmDestroyCrossSigningDialog.js | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 3381f3e93b..45e0a336d5 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -122,7 +122,6 @@ export async function accessSecretStorage(func = async () => { }, force = false) secretStorageBeingAccessed = true; try { if (!await cli.hasSecretStorageKey() || force) { - console.warn(!force ? "!hasSecretStorageKey()" : "force"); // This dialog calls bootstrap itself after guiding the user through // passphrase creation. const { finished } = Modal.createTrackedDialogAsync('Create Secret Storage dialog', '', diff --git a/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js index 3242afd5f1..9e1980e98d 100644 --- a/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js +++ b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js @@ -37,9 +37,11 @@ export default class ConfirmDestroyCrossSigningDialog extends React.Component { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return ( - +

{_t( From e016cbeffff7c2a30e9b6169372c726f6eb7e8b3 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 17:03:10 +0100 Subject: [PATCH 026/103] support header image in QuestionDialog --- src/components/views/dialogs/QuestionDialog.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/views/dialogs/QuestionDialog.js b/src/components/views/dialogs/QuestionDialog.js index b165bf79e2..3eec497b44 100644 --- a/src/components/views/dialogs/QuestionDialog.js +++ b/src/components/views/dialogs/QuestionDialog.js @@ -31,6 +31,7 @@ export default createReactClass({ danger: PropTypes.bool, focus: PropTypes.bool, onFinished: PropTypes.func.isRequired, + headerImage: PropTypes.string, }, getDefaultProps: function() { @@ -63,6 +64,7 @@ export default createReactClass({

From 5c89b41177b832e1d7e7bed28d404c8f00b6bec8 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 17:03:36 +0100 Subject: [PATCH 027/103] make device verification go over right panel (after showing dialog) dialog should be more or less as in the design --- src/components/views/right_panel/UserInfo.js | 68 ++++++++++++++++++-- src/i18n/strings/en_EN.json | 6 +- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index cd8952fd72..fc1f5bfcc9 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -42,6 +42,8 @@ import {textualPowerLevel} from '../../../Roles'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; import EncryptionPanel from "./EncryptionPanel"; +import {verificationMethods} from 'matrix-js-sdk/src/crypto'; +import {SCAN_QR_CODE_METHOD, SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; const _disambiguateDevices = (devices) => { const names = Object.create(null); @@ -135,12 +137,66 @@ function useIsEncrypted(cli, room) { return isEncrypted; } -function verifyDevice(userId, device) { - const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog'); - Modal.createTrackedDialog('Device Verify Dialog', '', DeviceVerifyDialog, { - userId: userId, - device: device, - }, null, /* priority = */ false, /* static = */ true); +async function verifyDevice(userId, device) { + const cli = MatrixClientPeg.get(); + const member = cli.getUser(userId); + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + Modal.createTrackedDialog("Verification failed", "insecure", QuestionDialog, { + headerImage: require("../../../../res/img/e2e/warning.svg"), + title: _t("Not Trusted"), + description:
+

{_t("%(name)s (%(userId)s) signed in to a new session without verifying it:", {name: member.displayName, userId})}

+

{device.getDisplayName()} ({device.deviceId})

+

{_t("Ask this user to verify their session, or manually verify it below.")}

+
, + onFinished: async (doneClicked) => { + const manuallyVerifyClicked = !doneClicked; + if (!manuallyVerifyClicked) { + return; + } + const cli = MatrixClientPeg.get(); + const verificationRequest = await cli.requestVerification( + userId, + [ + verificationMethods.SAS, + SHOW_QR_CODE_METHOD, + SCAN_QR_CODE_METHOD, + verificationMethods.RECIPROCATE_QR_CODE, + ], + [device.deviceId], + ); + dis.dispatch({ + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: {member, verificationRequest}, + }); + }, + primaryButton: _t("Done"), + cancelButton: _t("Manually Verify"), + }); + + // const cli = MatrixClientPeg.get(); + // const verificationRequest = await cli.requestVerification( + // userId, + // [ + // verificationMethods.SAS, + // SHOW_QR_CODE_METHOD, + // SCAN_QR_CODE_METHOD, + // verificationMethods.RECIPROCATE_QR_CODE, + // ], + // [device.deviceId], + // ); + // dis.dispatch({ + // action: "set_right_panel_phase", + // phase: RIGHT_PANEL_PHASES.EncryptionPanel, + // refireParams: {member, verificationRequest}, + // }); + + // const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog'); + // Modal.createTrackedDialog('Device Verify Dialog', '', DeviceVerifyDialog, { + // userId: userId, + // device: device, + // }, null, /* priority = */ false, /* static = */ true); } function verifyUser(user) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 83c15fc385..78a56bbffc 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1166,6 +1166,11 @@ "Yours, or the other users’ session": "Yours, or the other users’ session", "Members": "Members", "Files": "Files", + "Not Trusted": "Not Trusted", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) signed in to a new session without verifying it:", + "Ask this user to verify their session, or manually verify it below.": "Ask this user to verify their session, or manually verify it below.", + "Done": "Done", + "Manually Verify": "Manually Verify", "Trusted": "Trusted", "Not trusted": "Not trusted", "%(count)s verified sessions|other": "%(count)s verified sessions", @@ -1928,7 +1933,6 @@ "Session verified": "Session verified", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "Your new session is now verified. Other users will see it as trusted.": "Your new session is now verified. Other users will see it as trusted.", - "Done": "Done", "Without completing security on this session, it won’t have access to encrypted messages.": "Without completing security on this session, it won’t have access to encrypted messages.", "Go Back": "Go Back", "Failed to send email": "Failed to send email", From a8da4a3028d723d3084a908c8765cee052b27c58 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 8 Feb 2020 21:21:30 +0000 Subject: [PATCH 028/103] allow hiding of who is typing tile --- src/components/structures/MessagePanel.js | 13 ++++++++++++- .../tabs/user/PreferencesUserSettingsTab.js | 1 + src/i18n/strings/en_EN.json | 1 + src/settings/Settings.js | 5 +++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index a13278cf68..445d9019d1 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -115,6 +115,7 @@ export default class MessagePanel extends React.Component { // previous positions the read marker has been in, so we can // display 'ghost' read markers that are animating away ghostReadMarkers: [], + showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), }; // opaque readreceipt info for each userId; used by ReadReceiptMarker @@ -164,6 +165,9 @@ export default class MessagePanel extends React.Component { this._readMarkerNode = createRef(); this._whoIsTyping = createRef(); this._scrollPanel = createRef(); + + this._showTypingNotificationsWatcherRef = + SettingsStore.watchSetting("showTypingNotifications", this.onShowTypingNotificationsChange); } componentDidMount() { @@ -172,6 +176,7 @@ export default class MessagePanel extends React.Component { componentWillUnmount() { this._isMounted = false; + SettingsStore.unwatchSetting(this._showTypingNotificationsWatcherRef); } componentDidUpdate(prevProps, prevState) { @@ -184,6 +189,12 @@ export default class MessagePanel extends React.Component { } } + onShowTypingNotificationsChange = () => { + this.setState({ + showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), + }); + }; + /* get the DOM node representing the given event */ getNodeForEventId(eventId) { if (!this.eventNodes) { @@ -921,7 +932,7 @@ export default class MessagePanel extends React.Component { ); let whoIsTyping; - if (this.props.room && !this.props.tileShape) { + if (this.props.room && !this.props.tileShape && this.state.showTypingNotifications) { whoIsTyping = ( Date: Sun, 9 Feb 2020 14:49:54 +0000 Subject: [PATCH 029/103] fix submit button disabled breaking async task --- .../keybackup/_CreateKeyBackupDialog.scss | 6 ++++++ .../keybackup/CreateKeyBackupDialog.js | 19 +++++++++++-------- .../CreateSecretStorageDialog.js | 10 ++++------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss b/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss index 04ee575867..b9babd05f5 100644 --- a/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss +++ b/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss @@ -85,3 +85,9 @@ limitations under the License. flex: 1; white-space: nowrap; } + +.mx_CreateKeyBackupDialog { + details .mx_AccessibleButton { + margin: 1em 0; // emulate paragraph spacing because we can't put this button in a paragraph due to HTML rules + } +} diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 2d6a07ad2f..f89fb17448 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -24,6 +24,7 @@ import { scorePassword } from '../../../../utils/PasswordScorer'; import { _t } from '../../../../languageHandler'; import { accessSecretStorage } from '../../../../CrossSigningManager'; import SettingsStore from '../../../../settings/SettingsStore'; +import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; const PHASE_PASSPHRASE = 0; const PHASE_PASSPHRASE_CONFIRM = 1; @@ -191,7 +192,9 @@ export default class CreateKeyBackupDialog extends React.PureComponent { }); } - _onPassPhraseNextClick = async () => { + _onPassPhraseNextClick = async (e) => { + e.preventDefault(); + // If we're waiting for the timeout before updating the result at this point, // skip ahead and do it now, otherwise we'll deny the attempt to proceed // even if the user entered a valid passphrase @@ -209,7 +212,9 @@ export default class CreateKeyBackupDialog extends React.PureComponent { } }; - _onPassPhraseConfirmNextClick = async () => { + _onPassPhraseConfirmNextClick = async (e) => { + e.preventDefault(); + if (this.state.passPhrase !== this.state.passPhraseConfirm) return; this._keyBackupInfo = await MatrixClientPeg.get().prepareKeyBackupVersion(this.state.passPhrase); @@ -289,7 +294,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
; } - return + return

{_t( "Warning: You should only set up key backup from a trusted computer.", {}, { b: sub => {sub} }, @@ -320,15 +325,14 @@ export default class CreateKeyBackupDialog extends React.PureComponent { primaryButton={_t('Next')} onPrimaryButtonClick={this._onPassPhraseNextClick} hasCancel={false} - primaryIsSubmit={true} disabled={!this._passPhraseIsValid()} />

{_t("Advanced")} -

+
; } @@ -362,7 +366,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
; } const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
+ return

{_t( "Please enter your passphrase a second time to confirm.", )}

@@ -384,7 +388,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent { primaryButton={_t('Next')} onPrimaryButtonClick={this._onPassPhraseConfirmNextClick} hasCancel={false} - primaryIsSubmit={true} disabled={this.state.passPhrase !== this.state.passPhraseConfirm} />
; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 12ca752421..99f91d4044 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -413,8 +413,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { "as trusted for other users.", )}

{authPrompt}
- @@ -458,7 +458,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
; } - return
+ return

{_t( "Set up encryption on this session to allow it to verify other sessions, " + "granting them access to encrypted messages and marking them as trusted for other users.", @@ -495,7 +495,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { onPrimaryButtonClick={this._onPassPhraseNextClick} hasCancel={false} disabled={!this._passPhraseIsValid()} - primaryIsSubmit={true} >

; } - _renderSasVerificationPhaseVerified() { + _renderVerificationPhaseVerified() { const VerificationComplete = sdk.getComponent('views.verification.VerificationComplete'); return ; } - _renderSasVerificationPhaseCancelled() { + _renderVerificationPhaseCancelled() { const VerificationCancelled = sdk.getComponent('views.verification.VerificationCancelled'); return ; } diff --git a/src/components/views/verification/VerificationQREmojiOptions.js b/src/components/views/verification/VerificationQREmojiOptions.js new file mode 100644 index 0000000000..07f3b30f50 --- /dev/null +++ b/src/components/views/verification/VerificationQREmojiOptions.js @@ -0,0 +1,84 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { _t, _td } from '../../../languageHandler'; +import {PendingActionSpinner} from "../right_panel/EncryptionInfo"; +import AccessibleButton from "../elements/AccessibleButton"; +import DialogButtons from "../elements/DialogButtons"; +import {replaceableComponent} from "../../../utils/replaceableComponent"; +import VerificationQRCode from "../elements/crypto/VerificationQRCode"; +import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import Spinner from "../elements/Spinner"; + +@replaceableComponent("views.verification.VerificationQREmojiOptions") +export default class VerificationQREmojiOptions extends React.Component { + static propTypes = { + request: PropTypes.object.isRequired, + onCancel: PropTypes.func.isRequired, + onStartEmoji: PropTypes.func.isRequired, + }; + + constructor(props) { + super(props); + + this.state = { + qrProps: null, + }; + + this._prepareQrCode(props.request); + } + + async _prepareQrCode(request: VerificationRequest) { + try { + const props = await VerificationQRCode.getPropsForRequest(request); + this.setState({qrProps: props}); + } catch (e) { + console.error(e); + // We just won't show a QR code + } + } + + render() { + let qrCode =
; + if (this.state.qrProps) { + qrCode = ; + } + return ( +
+ {_t("Verify this session by completing one of the following:")} +
+
+

{_t("Scan this unique code")}

+ {qrCode} +
+ {_t("or")} +
+

{_t("Compare unique emoji")}

+ {_t("Compare a unique set of emoji if you don't have a camera on either device")} + + {_t("Start")} + +
+
+ + {_t("Cancel")} + +
+ ); + } +} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 83c15fc385..3bff66f258 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -451,6 +451,12 @@ "You've successfully verified this user.": "You've successfully verified this user.", "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.", "Got It": "Got It", + "Verify this session by completing one of the following:": "Verify this session by completing one of the following:", + "Scan this unique code": "Scan this unique code", + "or": "or", + "Compare unique emoji": "Compare unique emoji", + "Compare a unique set of emoji if you don't have a camera on either device": "Compare a unique set of emoji if you don't have a camera on either device", + "Start": "Start", "Confirm the emoji below are displayed on both devices, in the same order:": "Confirm the emoji below are displayed on both devices, in the same order:", "Verify this user by confirming the following emoji appear on their screen.": "Verify this user by confirming the following emoji appear on their screen.", "Verify this device by confirming the following number appears on its screen.": "Verify this device by confirming the following number appears on its screen.", @@ -1924,7 +1930,6 @@ "Could not load user profile": "Could not load user profile", "Complete security": "Complete security", "Verify this session to grant it access to encrypted messages.": "Verify this session to grant it access to encrypted messages.", - "Start": "Start", "Session verified": "Session verified", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "Your new session is now verified. Other users will see it as trusted.": "Your new session is now verified. Other users will see it as trusted.", From bc5a59339b16c970f05521efb4b8c73216520078 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 31 Jan 2020 11:04:49 +0000 Subject: [PATCH 042/103] Send NewSessionReviewDialog through dialogs --- .../views/dialogs/NewSessionReviewDialog.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index da12bbed62..3979855503 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -43,24 +43,24 @@ export default class NewSessionReviewDialog extends React.PureComponent { onContinueClick = async () => { const { userId, device } = this.props; const cli = MatrixClientPeg.get(); - const request = await cli.requestVerification( - userId, - [verificationMethods.SAS, SHOW_QR_CODE_METHOD], - [device.deviceId], - ); - dis.dispatch({ - action: "set_right_panel_phase", - phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: { - verificationRequest: request, - member: cli.getUser(request.otherUserId), - }, - }); - - // Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { + // const request = await cli.requestVerification( // userId, - // device, - // }, null, /* priority = */ false, /* static = */ true); + // [verificationMethods.SAS, SHOW_QR_CODE_METHOD], + // [device.deviceId], + // ); + // dis.dispatch({ + // action: "set_right_panel_phase", + // phase: RIGHT_PANEL_PHASES.EncryptionPanel, + // refireParams: { + // verificationRequest: request, + // member: cli.getUser(request.otherUserId), + // }, + // }); + + Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { + userId, + device, + }, null, /* priority = */ false, /* static = */ true); } render() { From 3d91ff23ec88a87c0607c67d5eb87949cb6d6eb1 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 12:20:48 +0100 Subject: [PATCH 043/103] cram the EncryptionPanel in CompleteSecurity instead of IncomingSasDialog so we get QR code support and support phases prior to STARTED --- src/components/structures/auth/CompleteSecurity.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 2126590736..18000be68e 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -138,9 +138,11 @@ export default class CompleteSecurity extends React.Component { let body; if (this.state.verificationRequest) { - const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); - body = ; } else if (phase === PHASE_INTRO) { icon = ; From 747a4866e2a42db83b8751fbd7bc139cfcab2051 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 12:21:49 +0100 Subject: [PATCH 044/103] indenting --- .../views/dialogs/NewSessionReviewDialog.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 3979855503..41b881a1f2 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -43,7 +43,20 @@ export default class NewSessionReviewDialog extends React.PureComponent { onContinueClick = async () => { const { userId, device } = this.props; const cli = MatrixClientPeg.get(); - // const request = await cli.requestVerification( + const request = await cli.requestVerification( + userId, + [verificationMethods.SAS, SHOW_QR_CODE_METHOD], + [device.deviceId], + ); + dis.dispatch({ + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: { + verificationRequest: request, + member: cli.getUser(request.otherUserId), + }, + }); + // Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { // userId, // [verificationMethods.SAS, SHOW_QR_CODE_METHOD], // [device.deviceId], @@ -56,11 +69,6 @@ export default class NewSessionReviewDialog extends React.PureComponent { // member: cli.getUser(request.otherUserId), // }, // }); - - Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { - userId, - device, - }, null, /* priority = */ false, /* static = */ true); } render() { From 469d53396469ed0125388a5a7cfa3b7720009fe2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 31 Jan 2020 11:48:49 +0000 Subject: [PATCH 045/103] Apply some CSS --- res/css/_components.scss | 1 + .../_VerificationQREmojiOptions.scss | 71 +++++++++++++++++++ .../VerificationQREmojiOptions.js | 4 +- 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 res/css/views/verification/_VerificationQREmojiOptions.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index bc636eb3c6..ad6bbdc486 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -206,6 +206,7 @@ @import "./views/settings/tabs/user/_SecurityUserSettingsTab.scss"; @import "./views/settings/tabs/user/_VoiceUserSettingsTab.scss"; @import "./views/terms/_InlineTermsAgreement.scss"; +@import "./views/verification/_VerificationQREmojiOptions.scss"; @import "./views/verification/_VerificationShowSas.scss"; @import "./views/voip/_CallView.scss"; @import "./views/voip/_IncomingCallbox.scss"; diff --git a/res/css/views/verification/_VerificationQREmojiOptions.scss b/res/css/views/verification/_VerificationQREmojiOptions.scss new file mode 100644 index 0000000000..6c9b527ba9 --- /dev/null +++ b/res/css/views/verification/_VerificationQREmojiOptions.scss @@ -0,0 +1,71 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_IncomingSasDialog_startOptions { + display: flex; + margin-top: 10px; + margin-bottom: 10px; + align-items: stretch; + + > .mx_IncomingSasDialog_betweenText { + width: 50px; + vertical-align: middle; + text-align: center; + display: flex; + align-items: center; + justify-content: center; + } + + .mx_IncomingSasDialog_startOption { + background-color: $user-tile-hover-bg-color; + border-radius: 10px; + flex: 1; + display: flex; + padding: 10px; + align-items: center; + flex-direction: column; + position: relative; + + canvas, .mx_VerificationQREmojiOptions_noQR { + width: 220px !important; + height: 220px !important; + background-color: #fff; + border-radius: 4px; + vertical-align: middle; + text-align: center; + padding: 10px; + } + + > p { + font-weight: 700; + } + + .mx_IncomingSasDialog_helpText { + font-size: 14px; + margin-top: 71px; + text-align: center; + } + + .mx_AccessibleButton { + position: absolute; + bottom: 30px; + } + } +} + +//mx_IncomingSasDialog_startOptions +//mx_IncomingSasDialog_startOption > canvas +//mx_VerificationQREmojiOptions_noQR diff --git a/src/components/views/verification/VerificationQREmojiOptions.js b/src/components/views/verification/VerificationQREmojiOptions.js index 07f3b30f50..770b8a44a4 100644 --- a/src/components/views/verification/VerificationQREmojiOptions.js +++ b/src/components/views/verification/VerificationQREmojiOptions.js @@ -66,10 +66,10 @@ export default class VerificationQREmojiOptions extends React.Component {

{_t("Scan this unique code")}

{qrCode} - {_t("or")} +
{_t("or")}

{_t("Compare unique emoji")}

- {_t("Compare a unique set of emoji if you don't have a camera on either device")} + {_t("Compare a unique set of emoji if you don't have a camera on either device")} {_t("Start")} From b210c9cb769c63f69a9a43008e9489954b1dd3d1 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 12:21:57 +0100 Subject: [PATCH 046/103] close dialog after clicking continue --- src/components/views/dialogs/NewSessionReviewDialog.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 41b881a1f2..c8e3992384 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -56,6 +56,7 @@ export default class NewSessionReviewDialog extends React.PureComponent { member: cli.getUser(request.otherUserId), }, }); + this.props.onFinished(true); // Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { // userId, // [verificationMethods.SAS, SHOW_QR_CODE_METHOD], From f368339b78824e5b23ad99bb1d0b9acbee1ae864 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 14:01:32 +0100 Subject: [PATCH 047/103] cram EncryptionPanel into a Dialog when clicking from new session dialog --- .../views/dialogs/DeviceVerifyOwnDialog.js | 36 +++++++++++++++++++ .../views/dialogs/NewSessionReviewDialog.js | 22 +++--------- 2 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 src/components/views/dialogs/DeviceVerifyOwnDialog.js diff --git a/src/components/views/dialogs/DeviceVerifyOwnDialog.js b/src/components/views/dialogs/DeviceVerifyOwnDialog.js new file mode 100644 index 0000000000..ca562062a8 --- /dev/null +++ b/src/components/views/dialogs/DeviceVerifyOwnDialog.js @@ -0,0 +1,36 @@ +/* +Copyright 2019, 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import {MatrixClientPeg} from '../../../MatrixClientPeg'; +import * as sdk from '../../../index'; + +export default class DeviceVerifyOwnDialog extends React.Component { + static propTypes = { + verificationRequest: PropTypes.object.isRequired, + onFinished: PropTypes.func.isRequired, + }; + + render() { + const EncryptionPanel = sdk.getComponent("views.right_panel.EncryptionPanel"); + return ; + } +} diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index c8e3992384..6d074d7045 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -14,13 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -import dis from "../../../dispatcher"; import React from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; import { replaceableComponent } from '../../../utils/replaceableComponent'; -import DeviceVerifyDialog from './DeviceVerifyDialog'; +import DeviceVerifyOwnDialog from './DeviceVerifyOwnDialog'; import BaseDialog from './BaseDialog'; import DialogButtons from '../elements/DialogButtons'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; @@ -48,28 +47,17 @@ export default class NewSessionReviewDialog extends React.PureComponent { [verificationMethods.SAS, SHOW_QR_CODE_METHOD], [device.deviceId], ); - dis.dispatch({ - action: "set_right_panel_phase", - phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: { - verificationRequest: request, - member: cli.getUser(request.otherUserId), - }, + + Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyOwnDialog, { + verificationRequest: request, }); + this.props.onFinished(true); // Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { // userId, // [verificationMethods.SAS, SHOW_QR_CODE_METHOD], // [device.deviceId], // ); - // dis.dispatch({ - // action: "set_right_panel_phase", - // phase: RIGHT_PANEL_PHASES.EncryptionPanel, - // refireParams: { - // verificationRequest: request, - // member: cli.getUser(request.otherUserId), - // }, - // }); } render() { From ee23bfe625476b2be9d2f956211f0fc8f223c371 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 14:42:02 +0100 Subject: [PATCH 048/103] need to close the current dialog before opening a new modal --- src/components/views/dialogs/NewSessionReviewDialog.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 6d074d7045..cab30c4d14 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -48,11 +48,12 @@ export default class NewSessionReviewDialog extends React.PureComponent { [device.deviceId], ); + this.props.onFinished(true); + Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyOwnDialog, { verificationRequest: request, }); - this.props.onFinished(true); // Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { // userId, // [verificationMethods.SAS, SHOW_QR_CODE_METHOD], From ea4d97fa73b17a1ebe6dfda4acfbf760da089341 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 31 Jan 2020 15:04:44 +0000 Subject: [PATCH 049/103] Hack in a layout option --- .../structures/auth/CompleteSecurity.js | 1 + .../views/dialogs/DeviceVerifyOwnDialog.js | 1 + .../views/right_panel/EncryptionPanel.js | 4 ++- .../views/right_panel/VerificationPanel.js | 29 +++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 18000be68e..1443db0613 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -140,6 +140,7 @@ export default class CompleteSecurity extends React.Component { if (this.state.verificationRequest) { const EncryptionPanel = sdk.getComponent("views.right_panel.EncryptionPanel"); body = { +const EncryptionPanel = ({verificationRequest, member, onClose, layout}) => { const [request, setRequest] = useState(verificationRequest); useEffect(() => { setRequest(verificationRequest); @@ -77,6 +77,7 @@ const EncryptionPanel = ({verificationRequest, member, onClose}) => { } else { return (
; + if (this.state.qrCodeProps) { + qrCode = ; + } + return ( +
+ {_t("Verify this session by completing one of the following:")} +
+
+

{_t("Scan this unique code")}

+ {qrCode} +
+
{_t("or")}
+
+

{_t("Compare unique emoji")}

+ {_t("Compare a unique set of emoji if you don't have a camera on either device")} + + {_t("Start")} + +
+
+
+ ); + } + let button; if (pending) { button = ; From 39fab02fcc64b285092f2fcae73957d120523131 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 17:15:52 +0100 Subject: [PATCH 050/103] rename DeviceVerifyOwnDialog to VerificationRequestDialog as it works (and we want to use it) for any verification request, not just between two devices of the same user --- src/components/views/dialogs/NewSessionReviewDialog.js | 4 ++-- ...{DeviceVerifyOwnDialog.js => VerificationRequestDialog.js} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/components/views/dialogs/{DeviceVerifyOwnDialog.js => VerificationRequestDialog.js} (94%) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index cab30c4d14..48c15ab06a 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; import { replaceableComponent } from '../../../utils/replaceableComponent'; -import DeviceVerifyOwnDialog from './DeviceVerifyOwnDialog'; +import VerificationRequestDialog from './VerificationRequestDialog'; import BaseDialog from './BaseDialog'; import DialogButtons from '../elements/DialogButtons'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; @@ -50,7 +50,7 @@ export default class NewSessionReviewDialog extends React.PureComponent { this.props.onFinished(true); - Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyOwnDialog, { + Modal.createTrackedDialog('New Session Verification', 'Starting dialog', VerificationRequestDialog, { verificationRequest: request, }); diff --git a/src/components/views/dialogs/DeviceVerifyOwnDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js similarity index 94% rename from src/components/views/dialogs/DeviceVerifyOwnDialog.js rename to src/components/views/dialogs/VerificationRequestDialog.js index 4a75cc16ec..f47d76ab94 100644 --- a/src/components/views/dialogs/DeviceVerifyOwnDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import * as sdk from '../../../index'; -export default class DeviceVerifyOwnDialog extends React.Component { +export default class VerificationRequestDialog extends React.Component { static propTypes = { verificationRequest: PropTypes.object.isRequired, onFinished: PropTypes.func.isRequired, From d9b7b28e5ab6a477ed6b370f137cdfad73855168 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 17:45:48 +0100 Subject: [PATCH 051/103] add css hacks to make EncryptionPanel look ok in Dialog for the sas and verified phase --- .../_VerificationQREmojiOptions.scss | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/res/css/views/verification/_VerificationQREmojiOptions.scss b/res/css/views/verification/_VerificationQREmojiOptions.scss index 6c9b527ba9..ceaece8853 100644 --- a/res/css/views/verification/_VerificationQREmojiOptions.scss +++ b/res/css/views/verification/_VerificationQREmojiOptions.scss @@ -66,6 +66,26 @@ limitations under the License. } } +// Special case styling for EncryptionPanel in a Modal dialog +.mx_Dialog { + // fixed with for when showing sas and once verified. + .mx_VerificationShowSas, .mx_VerificationPanel_verified_section { + width: 500px; + } + + // EncryptionPanel when verification is done + .mx_VerificationPanel_verified_section { + // center the big shield icon + .mx_E2EIcon { + margin: 0 auto; + } + // right align the "Got it" button + .mx_AccessibleButton { + float: right; + } + } +} + //mx_IncomingSasDialog_startOptions //mx_IncomingSasDialog_startOption > canvas //mx_VerificationQREmojiOptions_noQR From a865cfb01362f550b62e10fb227bdc789d68e18c Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Sat, 1 Feb 2020 18:25:01 +0100 Subject: [PATCH 052/103] put encryption in a proper dialog with close button --- .../_VerificationQREmojiOptions.scss | 5 ----- .../dialogs/VerificationRequestDialog.js | 20 +++++++++++++------ src/i18n/strings/en_EN.json | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/res/css/views/verification/_VerificationQREmojiOptions.scss b/res/css/views/verification/_VerificationQREmojiOptions.scss index ceaece8853..1f488cc758 100644 --- a/res/css/views/verification/_VerificationQREmojiOptions.scss +++ b/res/css/views/verification/_VerificationQREmojiOptions.scss @@ -68,11 +68,6 @@ limitations under the License. // Special case styling for EncryptionPanel in a Modal dialog .mx_Dialog { - // fixed with for when showing sas and once verified. - .mx_VerificationShowSas, .mx_VerificationPanel_verified_section { - width: 500px; - } - // EncryptionPanel when verification is done .mx_VerificationPanel_verified_section { // center the big shield icon diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js index f47d76ab94..baed79bd58 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -18,6 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import * as sdk from '../../../index'; +import { _t } from '../../../languageHandler'; export default class VerificationRequestDialog extends React.Component { static propTypes = { @@ -26,12 +27,19 @@ export default class VerificationRequestDialog extends React.Component { }; render() { + const BaseDialog = sdk.getComponent("views.dialogs.BaseDialog"); const EncryptionPanel = sdk.getComponent("views.right_panel.EncryptionPanel"); - return ; + return + + ; } } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3bff66f258..18df6dc70f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1644,6 +1644,7 @@ "Upload %(count)s other files|one": "Upload %(count)s other file", "Cancel All": "Cancel All", "Upload Error": "Upload Error", + "Verification Request": "Verification Request", "A widget would like to verify your identity": "A widget would like to verify your identity", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.", "Remember my selection for this widget": "Remember my selection for this widget", @@ -1855,7 +1856,6 @@ "Review terms and conditions": "Review terms and conditions", "Old cryptography data detected": "Old cryptography data detected", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.", - "Verification Request": "Verification Request", "Logout": "Logout", "%(creator)s created and configured the room.": "%(creator)s created and configured the room.", "Your Communities": "Your Communities", From 8c3004c2ac3e6eb745b996efedf3002d1ca46d33 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 12:20:11 +0100 Subject: [PATCH 053/103] to_device requests now can include .request so we might need send .ready --- src/components/structures/auth/CompleteSecurity.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 1443db0613..6bf3e7f07c 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -83,12 +83,13 @@ export default class CompleteSecurity extends React.Component { } } - onVerificationRequest = (request) => { + onVerificationRequest = async (request) => { if (request.otherUserId !== MatrixClientPeg.get().getUserId()) return; if (this.state.verificationRequest) { this.state.verificationRequest.off("change", this.onVerificationRequestChange); } + await request.accept(); request.on("change", this.onVerificationRequestChange); this.setState({ verificationRequest: request, From 9059f00b29570ce3f730458607ff679d036373a9 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 14:20:54 +0100 Subject: [PATCH 054/103] move css to correct file Move the CSS for the dialog layout used in VerificationPanel to _VerificationPanel.scss, and delete the latter as it doesn't have any css of it's own anymore --- res/css/_components.scss | 1 - .../views/right_panel/_VerificationPanel.scss | 68 +++++++++++++++ .../_VerificationQREmojiOptions.scss | 86 ------------------- .../views/right_panel/VerificationPanel.js | 12 +-- 4 files changed, 74 insertions(+), 93 deletions(-) delete mode 100644 res/css/views/verification/_VerificationQREmojiOptions.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index ad6bbdc486..bc636eb3c6 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -206,7 +206,6 @@ @import "./views/settings/tabs/user/_SecurityUserSettingsTab.scss"; @import "./views/settings/tabs/user/_VoiceUserSettingsTab.scss"; @import "./views/terms/_InlineTermsAgreement.scss"; -@import "./views/verification/_VerificationQREmojiOptions.scss"; @import "./views/verification/_VerificationShowSas.scss"; @import "./views/voip/_CallView.scss"; @import "./views/voip/_IncomingCallbox.scss"; diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 827f2a2c49..8473b860db 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -36,4 +36,72 @@ limitations under the License. max-width: 240px; } } + +} + +// Special case styling for EncryptionPanel in a Modal dialog +.mx_Dialog, .mx_CompleteSecurity_body { + .mx_VerificationPanel_QRPhase_startOptions { + display: flex; + margin-top: 10px; + margin-bottom: 10px; + align-items: stretch; + + > .mx_VerificationPanel_QRPhase_betweenText { + width: 50px; + vertical-align: middle; + text-align: center; + display: flex; + align-items: center; + justify-content: center; + } + + .mx_VerificationPanel_QRPhase_startOption { + background-color: $user-tile-hover-bg-color; + border-radius: 10px; + flex: 1; + display: flex; + padding: 10px; + align-items: center; + flex-direction: column; + position: relative; + + canvas, .mx_VerificationPanel_QRPhase_noQR { + width: 220px !important; + height: 220px !important; + background-color: #fff; + border-radius: 4px; + vertical-align: middle; + text-align: center; + padding: 10px; + } + + > p { + font-weight: 700; + } + + .mx_VerificationPanel_QRPhase_helpText { + font-size: 14px; + margin-top: 71px; + text-align: center; + } + + .mx_AccessibleButton { + position: absolute; + bottom: 30px; + } + } + } + + // EncryptionPanel when verification is done + .mx_VerificationPanel_verified_section { + // center the big shield icon + .mx_E2EIcon { + margin: 0 auto; + } + // right align the "Got it" button + .mx_AccessibleButton { + float: right; + } + } } diff --git a/res/css/views/verification/_VerificationQREmojiOptions.scss b/res/css/views/verification/_VerificationQREmojiOptions.scss deleted file mode 100644 index 1f488cc758..0000000000 --- a/res/css/views/verification/_VerificationQREmojiOptions.scss +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -.mx_IncomingSasDialog_startOptions { - display: flex; - margin-top: 10px; - margin-bottom: 10px; - align-items: stretch; - - > .mx_IncomingSasDialog_betweenText { - width: 50px; - vertical-align: middle; - text-align: center; - display: flex; - align-items: center; - justify-content: center; - } - - .mx_IncomingSasDialog_startOption { - background-color: $user-tile-hover-bg-color; - border-radius: 10px; - flex: 1; - display: flex; - padding: 10px; - align-items: center; - flex-direction: column; - position: relative; - - canvas, .mx_VerificationQREmojiOptions_noQR { - width: 220px !important; - height: 220px !important; - background-color: #fff; - border-radius: 4px; - vertical-align: middle; - text-align: center; - padding: 10px; - } - - > p { - font-weight: 700; - } - - .mx_IncomingSasDialog_helpText { - font-size: 14px; - margin-top: 71px; - text-align: center; - } - - .mx_AccessibleButton { - position: absolute; - bottom: 30px; - } - } -} - -// Special case styling for EncryptionPanel in a Modal dialog -.mx_Dialog { - // EncryptionPanel when verification is done - .mx_VerificationPanel_verified_section { - // center the big shield icon - .mx_E2EIcon { - margin: 0 auto; - } - // right align the "Got it" button - .mx_AccessibleButton { - float: right; - } - } -} - -//mx_IncomingSasDialog_startOptions -//mx_IncomingSasDialog_startOption > canvas -//mx_VerificationQREmojiOptions_noQR diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index b007b6b54c..08b90f9114 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -73,22 +73,22 @@ export default class VerificationPanel extends React.PureComponent { if (this.props.layout === 'dialog') { // HACK: This is a terrible idea. - let qrCode =
; + let qrCode =
; if (this.state.qrCodeProps) { qrCode = ; } return (
{_t("Verify this session by completing one of the following:")} -
-
+
+

{_t("Scan this unique code")}

{qrCode}
-
{_t("or")}
-
+
{_t("or")}
+

{_t("Compare unique emoji")}

- {_t("Compare a unique set of emoji if you don't have a camera on either device")} + {_t("Compare a unique set of emoji if you don't have a camera on either device")} {_t("Start")} From 2a8453b9397b241daa62e0dd1124496496ed2b6f Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 14:44:20 +0100 Subject: [PATCH 055/103] i18n fixes --- src/components/views/right_panel/VerificationPanel.js | 7 +++---- src/i18n/strings/en_EN.json | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 08b90f9114..94051686bd 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -111,9 +111,8 @@ export default class VerificationPanel extends React.PureComponent { if (!this.state.qrCodeProps) { return
-

Verify by emoji

+

{_t("Verify by emoji")}

{_t("Verify by comparing unique emoji.")}

- { button }
; } @@ -121,7 +120,7 @@ export default class VerificationPanel extends React.PureComponent { // TODO: add way to open camera to scan a QR code return
-

Verify by scanning

+

{_t("Verify by scanning")}

{_t("Ask %(displayName)s to scan your code:", { displayName: member.displayName || member.name || member.userId, })}

@@ -132,7 +131,7 @@ export default class VerificationPanel extends React.PureComponent {
-

Verify by emoji

+

{_t("Verify by emoji")}

{_t("If you can't scan the code above, verify by comparing unique emoji.")}

{ button } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 18df6dc70f..97e2a7cb5b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1192,6 +1192,7 @@ "Security": "Security", "Verify by emoji": "Verify by emoji", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", + "Verify by scanning": "Verify by scanning", "Ask %(displayName)s to scan your code:": "Ask %(displayName)s to scan your code:", "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", From a693af0c6b2ac24798c8fdadc7f8304ccbaf2f5e Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 14:48:10 +0100 Subject: [PATCH 056/103] fix lint --- src/components/views/dialogs/DeviceVerifyDialog.js | 2 +- src/components/views/dialogs/NewSessionReviewDialog.js | 1 - src/components/views/right_panel/VerificationPanel.js | 1 - .../views/verification/VerificationQREmojiOptions.js | 4 +--- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index 0b2470c92b..7187aa4d28 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -132,7 +132,7 @@ export default class DeviceVerifyDialog extends React.Component { this._verifier = request.verifier; } } else if (verifyingOwnDevice && SettingsStore.isFeatureEnabled("feature_cross_signing")) { - this._request = await client.requestVerification(this.props.userId,[ + this._request = await client.requestVerification(this.props.userId, [ verificationMethods.SAS, SHOW_QR_CODE_METHOD, ]); diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 48c15ab06a..2a7281c60e 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -24,7 +24,6 @@ import BaseDialog from './BaseDialog'; import DialogButtons from '../elements/DialogButtons'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; -import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; import {SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @replaceableComponent("views.dialogs.NewSessionReviewDialog") diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 94051686bd..9ec556f4bf 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -31,7 +31,6 @@ import { PHASE_CANCELLED, VerificationRequest, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import Spinner from "../elements/Spinner"; -import AccessibleButton from "../elements/AccessibleButton"; export default class VerificationPanel extends React.PureComponent { static propTypes = { diff --git a/src/components/views/verification/VerificationQREmojiOptions.js b/src/components/views/verification/VerificationQREmojiOptions.js index 770b8a44a4..d72c6951fe 100644 --- a/src/components/views/verification/VerificationQREmojiOptions.js +++ b/src/components/views/verification/VerificationQREmojiOptions.js @@ -16,10 +16,8 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import { _t, _td } from '../../../languageHandler'; -import {PendingActionSpinner} from "../right_panel/EncryptionInfo"; +import { _t } from '../../../languageHandler'; import AccessibleButton from "../elements/AccessibleButton"; -import DialogButtons from "../elements/DialogButtons"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import VerificationQRCode from "../elements/crypto/VerificationQRCode"; import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; From 0e0b0e8d09de7ac6a1382e8d50a384387a08bea4 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 15:30:16 +0100 Subject: [PATCH 057/103] fix css lint --- res/css/views/right_panel/_VerificationPanel.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 8473b860db..2a733d11a7 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -36,7 +36,6 @@ limitations under the License. max-width: 240px; } } - } // Special case styling for EncryptionPanel in a Modal dialog From 936b40f6b5d20075619d3370ad2b1fc45ac445fc Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 15:53:36 +0100 Subject: [PATCH 058/103] remove commented out code --- src/components/views/dialogs/NewSessionReviewDialog.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 2a7281c60e..e0f82df0c0 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -52,12 +52,6 @@ export default class NewSessionReviewDialog extends React.PureComponent { Modal.createTrackedDialog('New Session Verification', 'Starting dialog', VerificationRequestDialog, { verificationRequest: request, }); - - // Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { - // userId, - // [verificationMethods.SAS, SHOW_QR_CODE_METHOD], - // [device.deviceId], - // ); } render() { From 69dc725006960053be0fa69cd16f303074c7035d Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 10 Feb 2020 15:43:02 +0000 Subject: [PATCH 059/103] rename button --- src/components/views/settings/CrossSigningPanel.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index 77cae79324..6f68193729 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -160,7 +160,7 @@ export default class CrossSigningPanel extends React.PureComponent { } else { bootstrapButton =
- {_t("Torpedo cross-signing")} + {_t("Reset Secret Store and Cross-signing")}
; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index edb0da8780..1832a6123b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -553,7 +553,7 @@ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", - "Torpedo cross-signing": "Torpedo cross-signing", + "Reset Secret Store and Cross-signing": "Reset Secret Store and Cross-signing", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", From 1ff1575b427dec63eda52d0ed586f4338dad340e Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 16:59:47 +0100 Subject: [PATCH 060/103] remove dead code --- src/components/views/toasts/VerificationRequestToast.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 92402c3f98..a831505a05 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -99,14 +99,6 @@ export default class VerificationRequestToast extends React.PureComponent { verificationRequest: request, }, null, /* priority = */ false, /* static = */ true); } - - // } else if (request.channel.deviceId && request.verifier) { - // // show to_device verifications in dialog still - // const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); - // Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { - // verifier: request.verifier, - // }, null, /* priority = */ false, /* static = */ true); - // } } catch (err) { console.error(err.message); } From 4b8382b5c45f602e88297120e6838a1754140d89 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 10 Feb 2020 17:07:02 +0100 Subject: [PATCH 061/103] remove dead code --- src/components/views/right_panel/UserInfo.js | 23 -------------------- 1 file changed, 23 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index fc1f5bfcc9..9e0682e380 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -174,29 +174,6 @@ async function verifyDevice(userId, device) { primaryButton: _t("Done"), cancelButton: _t("Manually Verify"), }); - - // const cli = MatrixClientPeg.get(); - // const verificationRequest = await cli.requestVerification( - // userId, - // [ - // verificationMethods.SAS, - // SHOW_QR_CODE_METHOD, - // SCAN_QR_CODE_METHOD, - // verificationMethods.RECIPROCATE_QR_CODE, - // ], - // [device.deviceId], - // ); - // dis.dispatch({ - // action: "set_right_panel_phase", - // phase: RIGHT_PANEL_PHASES.EncryptionPanel, - // refireParams: {member, verificationRequest}, - // }); - - // const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog'); - // Modal.createTrackedDialog('Device Verify Dialog', '', DeviceVerifyDialog, { - // userId: userId, - // device: device, - // }, null, /* priority = */ false, /* static = */ true); } function verifyUser(user) { From ea7cb6ba0b8b4eb7cb3e69b6c0981bbbb9877bb0 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 2 Feb 2020 14:31:21 +0000 Subject: [PATCH 062/103] Support keepSecretStoragePassphraseForSession at the config level too --- src/settings/Settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/Settings.js b/src/settings/Settings.js index b5a966523e..f16085dbf7 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -492,7 +492,7 @@ export const SETTINGS = { default: true, }, "keepSecretStoragePassphraseForSession": { - supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, + supportedLevels: ['device', 'config'], displayName: _td("Keep secret storage passphrase in memory for this session"), default: false, }, From afc38b92a0e7050d7c5ab8d4037011ff65e5388c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 31 Jan 2020 11:51:24 +0000 Subject: [PATCH 063/103] Always send scan for RiotX (for now) --- src/components/views/dialogs/DeviceVerifyDialog.js | 3 ++- src/components/views/dialogs/NewSessionReviewDialog.js | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index 7187aa4d28..346af2c2e9 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -27,7 +27,7 @@ import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {ensureDMExists} from "../../../createRoom"; import dis from "../../../dispatcher"; import SettingsStore from '../../../settings/SettingsStore'; -import {SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; +import {SCAN_QR_CODE_METHOD, SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; import VerificationQREmojiOptions from "../verification/VerificationQREmojiOptions"; const MODE_LEGACY = 'legacy'; @@ -135,6 +135,7 @@ export default class DeviceVerifyDialog extends React.Component { this._request = await client.requestVerification(this.props.userId, [ verificationMethods.SAS, SHOW_QR_CODE_METHOD, + SCAN_QR_CODE_METHOD, ]); await this._request.waitFor(r => r.ready || r.started); diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index e0f82df0c0..9d12b5c098 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -24,7 +24,7 @@ import BaseDialog from './BaseDialog'; import DialogButtons from '../elements/DialogButtons'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; -import {SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; +import {SCAN_QR_CODE_METHOD, SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @replaceableComponent("views.dialogs.NewSessionReviewDialog") export default class NewSessionReviewDialog extends React.PureComponent { @@ -43,12 +43,11 @@ export default class NewSessionReviewDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); const request = await cli.requestVerification( userId, - [verificationMethods.SAS, SHOW_QR_CODE_METHOD], + [verificationMethods.SAS, SHOW_QR_CODE_METHOD, SCAN_QR_CODE_METHOD], [device.deviceId], ); this.props.onFinished(true); - Modal.createTrackedDialog('New Session Verification', 'Starting dialog', VerificationRequestDialog, { verificationRequest: request, }); From ccde5530d26547d5638bcf528e0f36a5dad9ab68 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 31 Jan 2020 12:23:59 +0000 Subject: [PATCH 064/103] Add reciprocate as a method --- src/components/views/dialogs/DeviceVerifyDialog.js | 1 + src/components/views/dialogs/NewSessionReviewDialog.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index 346af2c2e9..f8d66ae641 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -136,6 +136,7 @@ export default class DeviceVerifyDialog extends React.Component { verificationMethods.SAS, SHOW_QR_CODE_METHOD, SCAN_QR_CODE_METHOD, + verificationMethods.RECIPROCATE_QR_CODE, ]); await this._request.waitFor(r => r.ready || r.started); diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 9d12b5c098..b770cfd881 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -43,7 +43,7 @@ export default class NewSessionReviewDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); const request = await cli.requestVerification( userId, - [verificationMethods.SAS, SHOW_QR_CODE_METHOD, SCAN_QR_CODE_METHOD], + [verificationMethods.SAS, SHOW_QR_CODE_METHOD, SCAN_QR_CODE_METHOD, verificationMethods.RECIPROCATE_QR_CODE], [device.deviceId], ); From 9dde09d36f3f752f083b7b00661faf5d1c993d4a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 31 Jan 2020 14:42:27 +0100 Subject: [PATCH 065/103] cleanup --- src/components/views/dialogs/NewSessionReviewDialog.js | 7 ++++++- src/components/views/dialogs/VerificationRequestDialog.js | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index b770cfd881..643a5a3c5d 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -43,7 +43,12 @@ export default class NewSessionReviewDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); const request = await cli.requestVerification( userId, - [verificationMethods.SAS, SHOW_QR_CODE_METHOD, SCAN_QR_CODE_METHOD, verificationMethods.RECIPROCATE_QR_CODE], + [ + verificationMethods.SAS, + SHOW_QR_CODE_METHOD, + SCAN_QR_CODE_METHOD, + verificationMethods.RECIPROCATE_QR_CODE, + ], [device.deviceId], ); diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js index baed79bd58..8080fa09f3 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -1,5 +1,5 @@ /* -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. +Copyright 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 4f4b52d6665ad318c2dae57e1f217587a30ca65a Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 10 Feb 2020 16:59:17 +0000 Subject: [PATCH 066/103] Update src/components/views/settings/CrossSigningPanel.js Co-Authored-By: J. Ryan Stinnett --- src/components/views/settings/CrossSigningPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index 6f68193729..95b9f76858 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -160,7 +160,7 @@ export default class CrossSigningPanel extends React.PureComponent { } else { bootstrapButton =
- {_t("Reset Secret Store and Cross-signing")} + {_t("Reset cross-signing and secret storage")}
; } From 2d425051245763b605f63b6250bc31af80757bd2 Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 10 Feb 2020 17:00:03 +0000 Subject: [PATCH 067/103] and re-run yarn i18n --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1832a6123b..d9bd4c3b14 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -553,7 +553,7 @@ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", - "Reset Secret Store and Cross-signing": "Reset Secret Store and Cross-signing", + "Reset cross-signing and secret storage": "Reset cross-signing and secret storage", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", From 3da630beb8c8d96a3193dfc41d576f42ef5ca233 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 10 Feb 2020 21:38:31 +0100 Subject: [PATCH 068/103] I have removed problematic ligns --- res/css/views/rooms/_WhoIsTypingTile.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/res/css/views/rooms/_WhoIsTypingTile.scss b/res/css/views/rooms/_WhoIsTypingTile.scss index ef20c24c84..50aaf49340 100644 --- a/res/css/views/rooms/_WhoIsTypingTile.scss +++ b/res/css/views/rooms/_WhoIsTypingTile.scss @@ -31,10 +31,6 @@ limitations under the License. margin-left: -12px; } -.mx_WhoIsTypingTile_avatars .mx_BaseAvatar_image { - border: 1px solid $primary-bg-color; -} - .mx_WhoIsTypingTile_avatars .mx_BaseAvatar_initial { padding-top: 1px; } From 86306e3da3d792c9b43b2d2d20454e72b0aecfd7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 10 Feb 2020 20:41:16 +0000 Subject: [PATCH 069/103] Recaptcha should always be loaded over https --- src/components/views/auth/CaptchaForm.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/views/auth/CaptchaForm.js b/src/components/views/auth/CaptchaForm.js index efcc450067..1b9dd3a97d 100644 --- a/src/components/views/auth/CaptchaForm.js +++ b/src/components/views/auth/CaptchaForm.js @@ -61,13 +61,9 @@ export default createReactClass({ } else { console.log("Loading recaptcha script..."); window.mx_on_recaptcha_loaded = () => {this._onCaptchaLoaded();}; - let protocol = global.location.protocol; - if (protocol !== "http:") { - protocol = "https:"; - } const scriptTag = document.createElement('script'); scriptTag.setAttribute( - 'src', `${protocol}//www.recaptcha.net/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit`, + 'src', `https://www.recaptcha.net/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit`, ); this._recaptchaContainer.current.appendChild(scriptTag); } From f01b4fe241d8320216f5d7b2ade3448dc415ea85 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 10 Feb 2020 20:47:27 +0000 Subject: [PATCH 070/103] Allow custom hs url submission on enter --- src/components/views/auth/ServerConfig.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/views/auth/ServerConfig.js b/src/components/views/auth/ServerConfig.js index 5e17d50b55..a9e26b8fb7 100644 --- a/src/components/views/auth/ServerConfig.js +++ b/src/components/views/auth/ServerConfig.js @@ -274,15 +274,13 @@ export default class ServerConfig extends React.PureComponent { : null; return ( -
+

{_t("Other servers")}

{errorText} {this._renderHomeserverSection()} {this._renderIdentityServerSection()} - - {submitButton} -
-
+ {submitButton} + ); } } From f5111a6290ac04059421982991f092f39994fcb6 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 10 Feb 2020 19:49:08 +0000 Subject: [PATCH 071/103] Translated using Weblate (Albanian) Currently translated at 99.7% (2103 of 2110 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 90ec9d2bc0..051860dca4 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2122,5 +2122,9 @@ "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Nëse këtë e keni bërë pa dashje, mund të ujdisni Mesazhe të Sigurt në këtë sesion, gjë që do të sjellë rifshehtëzimin e historikut të mesazheve të sesionit me një metodë të re rimarrjesh.", "Indexed rooms:": "Dhoma të indeksuara:", "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s nga %(totalRooms)s gjithsej", - "Message downloading sleep time(ms)": "Kohë fjetjeje shkarkimi mesazhi(ms)" + "Message downloading sleep time(ms)": "Kohë fjetjeje shkarkimi mesazhi(ms)", + "Show typing notifications": "Shfaq njoftime shtypjeje", + "Destroy cross-signing keys?": "Të shkatërrohen kyçet cross-signing?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Fshirja e kyçeve cross-signing është e përhershme. Cilido që keni verifikuar me to, do të shohë një sinjalizim sigurie. Thuajse e sigurt që s’keni pse ta bëni një gjë të tillë, veç në paçi humbur çdo pajisje prej nga mund të bëni cross-sign.", + "Clear cross-signing keys": "Spastro kyçe cross-signing" } From dd4aaf230a5a9ecad133bbc25ecea48bbd491700 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 11 Feb 2020 02:14:48 +0000 Subject: [PATCH 072/103] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2110 of 2110 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 2570746fc7..9f49122a69 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2132,5 +2132,10 @@ "If you cancel now, you won't complete verifying the other user.": "如果您現在取消,您將無法完成驗證其他使用者。", "If you cancel now, you won't complete verifying your other session.": "如果您現在取消,您將無法完成驗證您其他的工作階段。", "If you cancel now, you won't complete your secret storage operation.": "如果您現在取消,您將無法完成驗證您的秘密儲存空間動作。", - "Cancel entering passphrase?": "取消輸入通關密語?" + "Cancel entering passphrase?": "取消輸入通關密語?", + "Show typing notifications": "顯示打字通知", + "Reset cross-signing and secret storage": "重設交叉簽章與秘密儲存空間", + "Destroy cross-signing keys?": "摧毀交叉簽章金鑰?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "永久刪除交叉簽章金鑰。任何您已驗證過的人都會看到安全性警告。除非您遺失了所有可以進行交叉簽章的裝置,否則您平常幾乎不會想要這樣做。", + "Clear cross-signing keys": "清除交叉簽章金鑰" } From 5436662d92537c1613fec9e1af1c78f857accc13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Mon, 10 Feb 2020 19:28:35 +0000 Subject: [PATCH 073/103] Translated using Weblate (Czech) Currently translated at 98.7% (2082 of 2110 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 6978a3a5d9..34d646e0a4 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2095,5 +2095,12 @@ "Enter your account password to confirm the upgrade:": "Potvrďte, že chcete aktualizaci provést zadáním svého uživatelského hesla:", "You'll need to authenticate with the server to confirm the upgrade.": "Server si vás potřebuje ověřit, abychom mohli provést aktualizaci.", "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Aktualizujte tuto přihlášenou relaci abyste mohli ověřovat ostatní relace. Tím jim dáte přístup k šifrovaným konverzacím a ostatní uživatelé je jim budou automaticky věřit.", - "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Zapněte v této přihlášené relaci šifrování abyste mohli ověřovat ostatní relace. Tím jim dáte přístup k šifrovaným konverzacím a ostatní uživatelé je jim budou automaticky věřit." + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Zapněte v této přihlášené relaci šifrování abyste mohli ověřovat ostatní relace. Tím jim dáte přístup k šifrovaným konverzacím a ostatní uživatelé je jim budou automaticky věřit.", + "Show typing notifications": "Zobrazovat notifikace \"... právě píše...\"", + "Reset cross-signing and secret storage": "Resetovat bezpečné úložiště a cross-signing", + "Destroy cross-signing keys?": "Nenávratně smazat klíče pro cross-signing?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Smazání klíčů pro cross-signing je definitivní. Každý kdo vás ověřil teď uvidí bezpečnostní varování. Pokud jste zrovna neztratili všechna zařízení ze kterých se můžete ověřit, tak to asi nechcete udělat.", + "Clear cross-signing keys": "Smazat klíče pro cross-signing", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Zabezpečte si šifrovací klíče silným heslem. Pro lepší bezpečnost by mělo být jiné než vaše heslo k přihlášení:", + "Enter a passphrase": "Zadejte heslo" } From 136dca7837610b8bbf539040b305f252fd486bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Tue, 11 Feb 2020 07:25:52 +0000 Subject: [PATCH 074/103] Translated using Weblate (French) Currently translated at 100.0% (2110 of 2110 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 9ff54d55a5..3fbff88540 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2133,5 +2133,10 @@ "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s sur %(totalRooms)s", "If you cancel now, you won't complete verifying the other user.": "Si vous annuler maintenant, vous ne terminerez pas la vérification de l’autre utilisateur.", "If you cancel now, you won't complete verifying your other session.": "Si vous annulez maintenant, vous ne terminerez pas la vérification de votre autre session.", - "If you cancel now, you won't complete your secret storage operation.": "Si vous annulez maintenant, vous ne terminerez pas votre opération sur le coffre secret." + "If you cancel now, you won't complete your secret storage operation.": "Si vous annulez maintenant, vous ne terminerez pas votre opération sur le coffre secret.", + "Show typing notifications": "Afficher les notifications de saisie", + "Reset cross-signing and secret storage": "Réinitialiser la signature croisée et le coffre secret", + "Destroy cross-signing keys?": "Détruire les clés de signature croisée ?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "La suppression des clés de signature croisée est permanente. Tous ceux que vous avez vérifié vont voir des alertes de sécurité. Il est peu probable que ce soit ce que vous voulez faire, sauf si vous avez perdu tous les appareils vous permettant d’effectuer une signature croisée.", + "Clear cross-signing keys": "Vider les clés de signature croisée" } From ee819dfdf8871cdbbb07b435bd3a4ba9285c71e1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 11 Feb 2020 09:32:09 +0000 Subject: [PATCH 075/103] fix call to SettngsStore.watchSetting, it takes a roomID --- src/components/structures/MessagePanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 445d9019d1..821e370628 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -167,7 +167,7 @@ export default class MessagePanel extends React.Component { this._scrollPanel = createRef(); this._showTypingNotificationsWatcherRef = - SettingsStore.watchSetting("showTypingNotifications", this.onShowTypingNotificationsChange); + SettingsStore.watchSetting("showTypingNotifications", null, this.onShowTypingNotificationsChange); } componentDidMount() { From 6b6d612041f98b018b5595569ee73e2f4f7449f1 Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 11:59:49 +0000 Subject: [PATCH 076/103] Fix error message rendering for key entry Relates to https://github.com/vector-im/riot-web/issues/12288 --- .../AccessSecretStorageDialog.js | 8 +- .../dialogs/AccessSecretStorageDialog-test.js | 106 ++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 test/components/views/dialogs/AccessSecretStorageDialog-test.js diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index 68ae8281c4..e3a7d7f532 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -190,10 +190,6 @@ export default class AccessSecretStorageDialog extends React.PureComponent { let keyStatus; if (this.state.recoveryKey.length === 0) { keyStatus =
; - } else if (this.state.recoveryKeyValid) { - keyStatus =
- {"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} -
; } else if (this.state.keyMatches === false) { keyStatus =
{"\uD83D\uDC4E "}{_t( @@ -201,6 +197,10 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "entered the correct recovery key.", )}
; + } else if (this.state.recoveryKeyValid) { + keyStatus =
+ {"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} +
; } else { keyStatus =
{"\uD83D\uDC4E "}{_t("Not a valid recovery key")} diff --git a/test/components/views/dialogs/AccessSecretStorageDialog-test.js b/test/components/views/dialogs/AccessSecretStorageDialog-test.js new file mode 100644 index 0000000000..4e2ade6069 --- /dev/null +++ b/test/components/views/dialogs/AccessSecretStorageDialog-test.js @@ -0,0 +1,106 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import TestRenderer from 'react-test-renderer'; +import sdk from '../../../skinned-sdk'; +import {MatrixClientPeg} from '../../../../src/MatrixClientPeg'; +import { stubClient } from '../../../test-utils'; + +const AccessSecretStorageDialog = sdk.getComponent("dialogs.secretstorage.AccessSecretStorageDialog"); + +describe("AccessSecretStorageDialog", function () { + it("Closes the dialog if _onRecoveryKeyNext is called with a valid key", (done) => { + const testInstance = TestRenderer.create( + p && p.recoveryKey && p.recoveryKey == "a"} + onFinished={(v) => { + if (v) { done() } + }} + /> + ); + testInstance.getInstance().setState({ + recoveryKeyValid: true, + recoveryKey: "a", + }); + const e = { preventDefault: () => {} } + testInstance.getInstance()._onRecoveryKeyNext(e); + }); + + it("Considers a valid key to be valid", function () { + const testInstance = TestRenderer.create( + true} + /> + ); + const v = "asfd"; + const e = { target: { value: v } }; + stubClient(); + MatrixClientPeg.get().isValidRecoveryKey = function (k) { + return k == v; + } + testInstance.getInstance()._onRecoveryKeyChange(e); + const { recoveryKeyValid } = testInstance.getInstance().state; + expect(recoveryKeyValid).toBe(true); + }); + + it("Notifies the user if they input an invalid recovery key", async function (done) { + const testInstance = TestRenderer.create( + false} + /> + ); + const e = { target: { value: "a" } }; + stubClient(); + MatrixClientPeg.get().isValidRecoveryKey = () => true; + testInstance.getInstance()._onRecoveryKeyChange(e); + await testInstance.getInstance()._onRecoveryKeyNext({ preventDefault: () => {} }); + const { keyMatches } = testInstance.getInstance().state; + expect(keyMatches).toBe(false); + const notification = testInstance.root.findByProps({ + className: "mx_AccessSecretStorageDialog_keyStatus", + }); + expect(notification.props.children).toEqual( + ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + + "entered the correct recovery key."]); + done() + }); + + it("Notifies the user if they input an invalid passphrase", async function (done) { + const testInstance = TestRenderer.create( + false} + onFinished={() => {}} + keyInfo={ { passphrase: { + salt: 'nonempty', + iterations: 2, + } } } + /> + ); + const e = { target: { value: "a" } }; + stubClient(); + MatrixClientPeg.get().isValidRecoveryKey = () => false; + testInstance.getInstance()._onPassPhraseChange(e); + await testInstance.getInstance()._onPassPhraseNext({ preventDefault: () => {} }) + const notification = testInstance.root.findByProps({ + className: "mx_AccessSecretStorageDialog_keyStatus", + }); + expect(notification.props.children).toEqual( + ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + + "entered the correct passphrase."]); + done(); + }); +}); From a67778088977553055866fdcb20b8d5efa6ccd6f Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 12:05:58 +0000 Subject: [PATCH 077/103] i18n --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 940777c1c7..f6090ce09f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1654,8 +1654,8 @@ "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.", "Enter secret storage recovery key": "Enter secret storage recovery key", - "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", + "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Not a valid recovery key": "Not a valid recovery key", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.", "If you've forgotten your recovery key you can .": "If you've forgotten your recovery key you can .", From 9a5663056d41ca0b3a695ad4a6bc9ee32b53ddf9 Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 12:06:40 +0000 Subject: [PATCH 078/103] lint --- .../dialogs/AccessSecretStorageDialog-test.js | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/test/components/views/dialogs/AccessSecretStorageDialog-test.js b/test/components/views/dialogs/AccessSecretStorageDialog-test.js index 4e2ade6069..30512ca4dd 100644 --- a/test/components/views/dialogs/AccessSecretStorageDialog-test.js +++ b/test/components/views/dialogs/AccessSecretStorageDialog-test.js @@ -22,46 +22,46 @@ import { stubClient } from '../../../test-utils'; const AccessSecretStorageDialog = sdk.getComponent("dialogs.secretstorage.AccessSecretStorageDialog"); -describe("AccessSecretStorageDialog", function () { +describe("AccessSecretStorageDialog", function() { it("Closes the dialog if _onRecoveryKeyNext is called with a valid key", (done) => { const testInstance = TestRenderer.create( p && p.recoveryKey && p.recoveryKey == "a"} onFinished={(v) => { - if (v) { done() } + if (v) { done(); } }} - /> + />, ); testInstance.getInstance().setState({ recoveryKeyValid: true, recoveryKey: "a", }); - const e = { preventDefault: () => {} } + const e = { preventDefault: () => {} }; testInstance.getInstance()._onRecoveryKeyNext(e); }); - it("Considers a valid key to be valid", function () { + it("Considers a valid key to be valid", function() { const testInstance = TestRenderer.create( true} - /> + />, ); const v = "asfd"; const e = { target: { value: v } }; stubClient(); - MatrixClientPeg.get().isValidRecoveryKey = function (k) { + MatrixClientPeg.get().isValidRecoveryKey = function(k) { return k == v; - } + }; testInstance.getInstance()._onRecoveryKeyChange(e); const { recoveryKeyValid } = testInstance.getInstance().state; expect(recoveryKeyValid).toBe(true); }); - it("Notifies the user if they input an invalid recovery key", async function (done) { + it("Notifies the user if they input an invalid recovery key", async function(done) { const testInstance = TestRenderer.create( false} - /> + />, ); const e = { target: { value: "a" } }; stubClient(); @@ -76,10 +76,10 @@ describe("AccessSecretStorageDialog", function () { expect(notification.props.children).toEqual( ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + "entered the correct recovery key."]); - done() + done(); }); - it("Notifies the user if they input an invalid passphrase", async function (done) { + it("Notifies the user if they input an invalid passphrase", async function(done) { const testInstance = TestRenderer.create( false} @@ -88,13 +88,13 @@ describe("AccessSecretStorageDialog", function () { salt: 'nonempty', iterations: 2, } } } - /> + />, ); const e = { target: { value: "a" } }; stubClient(); MatrixClientPeg.get().isValidRecoveryKey = () => false; testInstance.getInstance()._onPassPhraseChange(e); - await testInstance.getInstance()._onPassPhraseNext({ preventDefault: () => {} }) + await testInstance.getInstance()._onPassPhraseNext({ preventDefault: () => {} }); const notification = testInstance.root.findByProps({ className: "mx_AccessSecretStorageDialog_keyStatus", }); From 627ced3838958ed3653b440031c720017efa65f0 Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 13:17:18 +0000 Subject: [PATCH 079/103] quick fix for cross-signing reset bug --- src/components/views/settings/CrossSigningPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index 95b9f76858..b39ed4808b 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -157,13 +157,13 @@ export default class CrossSigningPanel extends React.PureComponent { {_t("Bootstrap cross-signing and secret storage")}
; - } else { + } /*else { // TODO https://github.com/vector-im/riot-web/issues/12221 bootstrapButton =
{_t("Reset cross-signing and secret storage")}
; - } + }*/ return (
From cbb0ad6621659fc7e403ab064afc06853ff09127 Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 13:20:27 +0000 Subject: [PATCH 080/103] god i hate the i18n linter --- src/i18n/strings/en_EN.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 940777c1c7..1c1b5158ca 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -559,7 +559,6 @@ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", - "Reset cross-signing and secret storage": "Reset cross-signing and secret storage", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", From 5267dbf44aa3a1aa88bb610ac3f2831cd3231f1a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 11 Feb 2020 15:21:01 +0000 Subject: [PATCH 081/103] Update src/components/views/right_panel/UserInfo.js Co-Authored-By: J. Ryan Stinnett --- src/components/views/right_panel/UserInfo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 9e0682e380..9db8de1ae3 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -141,7 +141,7 @@ async function verifyDevice(userId, device) { const cli = MatrixClientPeg.get(); const member = cli.getUser(userId); const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog("Verification failed", "insecure", QuestionDialog, { + Modal.createTrackedDialog("Verification warning", "unverified session", QuestionDialog, { headerImage: require("../../../../res/img/e2e/warning.svg"), title: _t("Not Trusted"), description:
From 5382a52519341da90191b31600684a9167d85858 Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 15:56:32 +0000 Subject: [PATCH 082/103] Fixed bug where key reset didn't always return the right key --- .../CreateSecretStorageDialog.js | 22 +++++++++++++------ .../views/settings/CrossSigningPanel.js | 5 ++--- src/i18n/strings/en_EN.json | 1 + 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index db2f4c35cc..e3ff8b2143 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -225,13 +225,21 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const { force } = this.props; try { - await cli.bootstrapSecretStorage({ - setupNewSecretStorage: force, - authUploadDeviceSigningKeys: this._doBootstrapUIAuth, - createSecretStorageKey: async () => this._keyInfo, - keyBackupInfo: this.state.backupInfo, - setupNewKeyBackup: force || !this.state.backupInfo && this.state.useKeyBackup, - }); + if (!force) { + await cli.bootstrapSecretStorage({ + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + createSecretStorageKey: async () => this._keyInfo, + keyBackupInfo: this.state.backupInfo, + setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, + }); + } else { + await cli.bootstrapSecretStorage({ + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + createSecretStorageKey: async () => this._keyInfo, + setupNewKeyBackup: true, + setupNewSecretStorage: true, + }); + } this.setState({ phase: PHASE_DONE, }); diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index b39ed4808b..eeccaa61e1 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -103,7 +103,6 @@ export default class CrossSigningPanel extends React.PureComponent { onDestroyStorage = (act) => { if (!act) return; - console.log("Destroy secret storage:", act); this._bootstrapSecureSecretStorage(true); } @@ -157,13 +156,13 @@ export default class CrossSigningPanel extends React.PureComponent { {_t("Bootstrap cross-signing and secret storage")}
; - } /*else { // TODO https://github.com/vector-im/riot-web/issues/12221 + } else { bootstrapButton =
{_t("Reset cross-signing and secret storage")}
; - }*/ + } return (
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 5b28a58878..7a8642be95 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -565,6 +565,7 @@ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", + "Reset cross-signing and secret storage": "Reset cross-signing and secret storage", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", From a1844e44f2b9166c3212e12c2fab5660a51ccfc5 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 11 Feb 2020 17:44:41 +0100 Subject: [PATCH 083/103] remove methods arg to requestVerification(DM) as it's easy to have this argument be out of sync from all the places this is called from the js-sdk. There is also little point, as you can already specify the methods a consumer of the js-sdk wants to provide through the verificationMethods option when creating the client object. --- src/components/views/dialogs/DeviceVerifyDialog.js | 2 +- src/components/views/dialogs/NewSessionReviewDialog.js | 6 ------ src/components/views/right_panel/UserInfo.js | 6 ------ 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index f8d66ae641..835b7daf02 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -123,7 +123,7 @@ export default class DeviceVerifyDialog extends React.Component { const roomId = await ensureDMExistsAndOpen(this.props.userId); // throws upon cancellation before having started const request = await client.requestVerificationDM( - this.props.userId, roomId, [verificationMethods.SAS], + this.props.userId, roomId, ); await request.waitFor(r => r.ready || r.started); if (request.ready) { diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 643a5a3c5d..53e97de9e0 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -43,12 +43,6 @@ export default class NewSessionReviewDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); const request = await cli.requestVerification( userId, - [ - verificationMethods.SAS, - SHOW_QR_CODE_METHOD, - SCAN_QR_CODE_METHOD, - verificationMethods.RECIPROCATE_QR_CODE, - ], [device.deviceId], ); diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 9db8de1ae3..db73f510a0 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -157,12 +157,6 @@ async function verifyDevice(userId, device) { const cli = MatrixClientPeg.get(); const verificationRequest = await cli.requestVerification( userId, - [ - verificationMethods.SAS, - SHOW_QR_CODE_METHOD, - SCAN_QR_CODE_METHOD, - verificationMethods.RECIPROCATE_QR_CODE, - ], [device.deviceId], ); dis.dispatch({ From 33f3a61b94a48a0ddc9ac7660e51c0861b1edf46 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 11 Feb 2020 17:56:40 +0100 Subject: [PATCH 084/103] remove unused imports --- src/components/views/dialogs/NewSessionReviewDialog.js | 2 -- src/components/views/right_panel/UserInfo.js | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 53e97de9e0..0019e0644f 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -22,9 +22,7 @@ import { replaceableComponent } from '../../../utils/replaceableComponent'; import VerificationRequestDialog from './VerificationRequestDialog'; import BaseDialog from './BaseDialog'; import DialogButtons from '../elements/DialogButtons'; -import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; -import {SCAN_QR_CODE_METHOD, SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @replaceableComponent("views.dialogs.NewSessionReviewDialog") export default class NewSessionReviewDialog extends React.PureComponent { diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index db73f510a0..315035db96 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -42,8 +42,6 @@ import {textualPowerLevel} from '../../../Roles'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; import EncryptionPanel from "./EncryptionPanel"; -import {verificationMethods} from 'matrix-js-sdk/src/crypto'; -import {SCAN_QR_CODE_METHOD, SHOW_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; const _disambiguateDevices = (devices) => { const names = Object.create(null); From c8e65bfa6597e280dda40dbb3c0b42b9a74a50fb Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 11 Feb 2020 17:56:25 +0000 Subject: [PATCH 085/103] flip sense of 'force' flag in if statement --- .../secretstorage/CreateSecretStorageDialog.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index e3ff8b2143..84b94ab64c 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -225,20 +225,20 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const { force } = this.props; try { - if (!force) { - await cli.bootstrapSecretStorage({ - authUploadDeviceSigningKeys: this._doBootstrapUIAuth, - createSecretStorageKey: async () => this._keyInfo, - keyBackupInfo: this.state.backupInfo, - setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, - }); - } else { + if (force) { await cli.bootstrapSecretStorage({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, createSecretStorageKey: async () => this._keyInfo, setupNewKeyBackup: true, setupNewSecretStorage: true, }); + } else { + await cli.bootstrapSecretStorage({ + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + createSecretStorageKey: async () => this._keyInfo, + keyBackupInfo: this.state.backupInfo, + setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, + }); } this.setState({ phase: PHASE_DONE, From 078401c58f7f5ae248fe190bc6db7e85bb7b83c4 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Feb 2020 20:06:07 +0100 Subject: [PATCH 086/103] I have reverted and used the styling a bit higher in the DOM --- res/css/views/rooms/_WhoIsTypingTile.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/css/views/rooms/_WhoIsTypingTile.scss b/res/css/views/rooms/_WhoIsTypingTile.scss index 50aaf49340..579ea7e73e 100644 --- a/res/css/views/rooms/_WhoIsTypingTile.scss +++ b/res/css/views/rooms/_WhoIsTypingTile.scss @@ -35,6 +35,11 @@ limitations under the License. padding-top: 1px; } +.mx_WhoIsTypingTile_avatars .mx_BaseAvatar { + border: 1px solid $primary-bg-color; + border-radius: 40px; +} + .mx_WhoIsTypingTile_remainingAvatarPlaceholder { position: relative; display: inline-block; From 9acf70c69360c83698d13174e67eafe423d9c776 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 12 Feb 2020 01:55:20 +0000 Subject: [PATCH 087/103] Score user ID searches higher when they match nearly exactly --- src/components/views/dialogs/InviteDialog.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 8fec2437f6..caf94bb8de 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -482,6 +482,15 @@ export default class InviteDialog extends React.PureComponent { record.score += scoreBoost; } + // Last chance: if the user ID matches the search term, score it higher + if (this.state.filterText && this.state.filterText[0] === '@') { + for (const memberId in memberScores) { + if (memberId.startsWith(this.state.filterText)) { + memberScores[memberId] += 2; // arbitrary score bump + } + } + } + const members = Object.values(memberScores); members.sort((a, b) => { if (a.score === b.score) { From a05dafc3003d9133549d4d0e43c1a04b5734588a Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 12 Feb 2020 01:58:21 +0000 Subject: [PATCH 088/103] Check for null config settings a bit safer Fixes https://github.com/vector-im/riot-web/issues/12254 --- src/settings/handlers/ConfigSettingsHandler.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/settings/handlers/ConfigSettingsHandler.js b/src/settings/handlers/ConfigSettingsHandler.js index a54ad1cef6..3b5b4b626e 100644 --- a/src/settings/handlers/ConfigSettingsHandler.js +++ b/src/settings/handlers/ConfigSettingsHandler.js @@ -17,6 +17,7 @@ limitations under the License. import SettingsHandler from "./SettingsHandler"; import SdkConfig from "../../SdkConfig"; +import {isNullOrUndefined} from "matrix-js-sdk/src/utils"; /** * Gets and sets settings at the "config" level. This handler does not make use of the @@ -32,7 +33,7 @@ export default class ConfigSettingsHandler extends SettingsHandler { } const settingsConfig = config["settingDefaults"]; - if (!settingsConfig || !settingsConfig[settingName]) return null; + if (!settingsConfig || isNullOrUndefined(settingsConfig[settingName])) return null; return settingsConfig[settingName]; } From 6fe4eb1fc3d03528af451b703312c8c8961fae93 Mon Sep 17 00:00:00 2001 From: Marco Zehe Date: Wed, 12 Feb 2020 09:36:59 +0100 Subject: [PATCH 089/103] Don't render avatars in pills for screen readers. These don't provide any additional information, but add extraneous noise. The link text and title already provide all information. Therefore, mark the avatar inside pills (the mention links inside messages) as hidden. Note that due to the images being part of something focusable, role "presentation" does not work here. Signed-off-by: Marco Zehe --- src/components/views/elements/Pill.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 1de857e7fe..44413505d6 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -211,7 +211,7 @@ const Pill = createReactClass({ if (room) { linkText = "@room"; if (this.props.shouldShowPillAvatar) { - avatar = ; + avatar =
, }); - } + }; } if (!global.mxAnalytics) { diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 303bae42b1..24bf99ed24 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -632,7 +632,7 @@ export async function onLoggedOut() { * @returns {Promise} promise which resolves once the stores have been cleared */ async function _clearStorage() { - Analytics.logout(); + Analytics.disable(); if (window.localStorage) { window.localStorage.clear(); From 98e8fed26e871a9dea34abbcbb76bf067ad0a7bf Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 13 Feb 2020 06:58:47 +0000 Subject: [PATCH 098/103] Translated using Weblate (Hungarian) Currently translated at 100.0% (2120 of 2120 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 5f5e1290ee..09b9e4d6e0 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2143,5 +2143,6 @@ "Verify by scanning": "Ellenőrzés kód beolvasással", "Destroy cross-signing keys?": "Eszközök közti hitelesítési kulcsok megsemmisítése?", "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Eszközök közti hitelesítési kulcsok törlése végleges. Mindenki akit ezzel hitelesítettél biztonsági figyelmeztetéseket fog látni. Hacsak nem vesztetted el az összes eszközödet amivel eszközök közti hitelesítést tudsz végezni, nem valószínű, hogy ezt szeretnéd tenni.", - "Clear cross-signing keys": "Eszközök közti hitelesítési kulcsok törlése" + "Clear cross-signing keys": "Eszközök közti hitelesítési kulcsok törlése", + "Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló visszaállítása" } From 9649f2a2da62bdf5d2b517df537631d0638d5718 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 13 Feb 2020 10:11:48 +0000 Subject: [PATCH 099/103] don't show tooltips on big icons fixes: https://github.com/vector-im/riot-web/issues/12191 --- src/components/views/rooms/E2EIcon.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 9480accb1a..39a90d1bec 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -52,6 +52,8 @@ const legacyRoomTitles = { }; const E2EIcon = ({isUser, status, className, size, onClick}) => { + const sizeThreshold = 25; // the size of an avatar + 1 + const [hover, setHover] = useState(false); const classes = classNames({ @@ -82,7 +84,7 @@ const E2EIcon = ({isUser, status, className, size, onClick}) => { const onMouseOut = () => setHover(false); let tip; - if (hover) { + if (hover && (!size || size <= sizeThreshold)) { tip = ; } From 0c4ee0091e43a69e981f021441373849829bba3a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 13 Feb 2020 10:47:50 +0000 Subject: [PATCH 100/103] Update comment and clear up localstorage on disabling Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/Analytics.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Analytics.js b/src/Analytics.js index fc1b7c5827..e95887a810 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -195,8 +195,7 @@ class Analytics { } /** - * Disable Analytics calls, will not fully unload Piwik until a refresh, - * but this is second best, Piwik should not pull anything implicitly. + * Disable Analytics, stop the heartbeat and clear identifiers from localStorage */ disable() { if (this.disabled) return; @@ -204,6 +203,10 @@ class Analytics { window.clearInterval(this._heartbeatIntervalID); this.baseUrl = null; this.visitVariables = {}; + localStorage.removeItem(UID_KEY); + localStorage.removeItem(CREATION_TS_KEY); + localStorage.removeItem(VISIT_COUNT_KEY); + localStorage.removeItem(LAST_VISIT_TS_KEY); } async _track(data) { From f53c41550459452abc68c2f9445c4777bfa50eb7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 13 Feb 2020 11:50:40 +0000 Subject: [PATCH 101/103] Fix sending of visit variables Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/Analytics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Analytics.js b/src/Analytics.js index e95887a810..39731a0e7d 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -217,7 +217,7 @@ class Analytics { ...data, url: getRedactedUrl(), - _cvar: this.visitVariables, // user custom vars + _cvar: JSON.stringify(this.visitVariables), // user custom vars res: `${window.screen.width}x${window.screen.height}`, // resolution as WWWWxHHHH rand: String(Math.random()).slice(2, 8), // random nonce to cache-bust h: now.getHours(), From c3af1a2f95ff5ed59d093f32a03fec7f8f0f9f25 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 13 Feb 2020 13:47:39 +0000 Subject: [PATCH 102/103] don't be too magic about hiding tooltips --- src/components/views/right_panel/VerificationPanel.js | 2 +- src/components/views/rooms/E2EIcon.js | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index a8d4ce733b..69eb55f9b2 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -149,7 +149,7 @@ export default class VerificationPanel extends React.PureComponent {

{_t("You've successfully verified %(displayName)s!", { displayName: member.displayName || member.name || member.userId, })}

- +

Verify all users in a room to ensure it's secure.

diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 39a90d1bec..a2c99fad99 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -51,9 +51,7 @@ const legacyRoomTitles = { [E2E_STATE.VERIFIED]: _td("All sessions in this encrypted room are trusted"), }; -const E2EIcon = ({isUser, status, className, size, onClick}) => { - const sizeThreshold = 25; // the size of an avatar + 1 - +const E2EIcon = ({isUser, status, className, size, onClick, hideTooltip}) => { const [hover, setHover] = useState(false); const classes = classNames({ @@ -84,7 +82,7 @@ const E2EIcon = ({isUser, status, className, size, onClick}) => { const onMouseOut = () => setHover(false); let tip; - if (hover && (!size || size <= sizeThreshold)) { + if (hover && !hideTooltip) { tip = ; } From 37f1104f61acae8962d0dd5920c3983ce7a76777 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 13 Feb 2020 14:15:08 +0000 Subject: [PATCH 103/103] lint --- src/components/views/right_panel/VerificationPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 69eb55f9b2..08c3935a2c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -149,7 +149,7 @@ export default class VerificationPanel extends React.PureComponent {

{_t("You've successfully verified %(displayName)s!", { displayName: member.displayName || member.name || member.userId, })}

- +

Verify all users in a room to ensure it's secure.