mirror of
https://github.com/oxen-io/session-desktop.git
synced 2023-12-14 02:12:57 +01:00
Fileserver update
This commit is contained in:
commit
4fd2126fbe
84 changed files with 481 additions and 624 deletions
10
.github/PULL_REQUEST_TEMPLATE.md
vendored
10
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -9,15 +9,13 @@ Remember, you can preview this before saving it.
|
|||
|
||||
### First time contributor checklist:
|
||||
|
||||
* [ ] I have read the [README](https://github.com/signalapp/Signal-Desktop/blob/master/README.md) and [Contributor Guidelines](https://github.com/signalapp/Signal-Desktop/blob/master/CONTRIBUTING.md)
|
||||
* [ ] I have signed the [Contributor Licence Agreement](https://signal.org/cla/)
|
||||
* [ ] I have read the [README](https://github.com/loki-project/loki-messenger/blob/master/README.md) and [Contributor Guidelines](https://github.com/loki-project/loki-messenger/blob/master/CONTRIBUTING.md)
|
||||
|
||||
### Contributor checklist:
|
||||
|
||||
* [ ] My contribution is **not** related to translations. _Please submit translation changes via our [Signal Desktop Transifex project](https://www.transifex.com/signalapp/signal-desktop/)._
|
||||
* [ ] My commits are in nice logical chunks with [good commit messages](http://chris.beams.io/posts/git-commit/)
|
||||
* [ ] My changes are [rebased](https://medium.freecodecamp.org/git-rebase-and-the-golden-rule-explained-70715eccc372) on the latest [`development`](https://github.com/signalapp/Signal-Desktop/tree/development) branch
|
||||
* [ ] A `yarn ready` run passes successfully ([more about tests here](https://github.com/signalapp/Signal-Desktop/blob/master/CONTRIBUTING.md#tests))
|
||||
* [ ] My changes are [rebased](https://medium.freecodecamp.org/git-rebase-and-the-golden-rule-explained-70715eccc372) on the latest [`clearnet`](https://github.com/loki-project/loki-messenger/tree/development) branch
|
||||
* [ ] A `yarn ready` run passes successfully ([more about tests here](https://github.com/loki-project/loki-messenger/blob/master/CONTRIBUTING.md#tests))
|
||||
* [ ] My changes are ready to be shipped to users
|
||||
|
||||
### Description
|
||||
|
@ -26,7 +24,7 @@ Remember, you can preview this before saving it.
|
|||
Describe briefly what your pull request changes. Focus on the value provided to users.
|
||||
|
||||
Does it address any outstanding issues in this project?
|
||||
https://github.com/signalapp/Signal-Desktop/issues?utf8=%E2%9C%93&q=is%3Aissue
|
||||
https://github.com/loki-project/loki-messenger/issues?utf8=%E2%9C%93&q=is%3Aissue
|
||||
Reference an issue with the hash symbol: "#222"
|
||||
If you're fixing it, use something like "Fixes #222"
|
||||
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Condicions de servei i política de privadesa",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Smluvní podmínky a zásady ochrany osobních údajů",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Vilkår og privatlivspolitik",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Bedingungen & Datenschutzerklärung",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Όροι & Πολιτική Απορρήτου",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description":
|
||||
"Shown in the about box for the link to https://signal.org/legal"
|
||||
"Shown in the about box for the link to https://getsession.org/privacy-policy/"
|
||||
},
|
||||
"copyErrorAndQuit": {
|
||||
"message": "Copy error and quit",
|
||||
|
@ -651,12 +651,14 @@
|
|||
"An error popup when the user has attempted to add an attachment"
|
||||
},
|
||||
"cannotMixImageAndNonImageAttachments": {
|
||||
"message": "Sorry, you cannot mix images with other file types in one message",
|
||||
"message":
|
||||
"Sorry, you cannot mix images with other file types in one message",
|
||||
"description":
|
||||
"An error popup when the user has attempted to add an attachment"
|
||||
},
|
||||
"maximumAttachments": {
|
||||
"message": "Maximum number of attachments reached. Please send remaining attachments in a separate message.",
|
||||
"message":
|
||||
"Maximum number of attachments reached. Please send remaining attachments in a separate message.",
|
||||
"description":
|
||||
"An error popup when the user has attempted to add an attachment"
|
||||
},
|
||||
|
@ -933,7 +935,7 @@
|
|||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message":
|
||||
"Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"Signal Desktop failed to update, but there is a new version available. Please go to https://getsession.org/ and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description":
|
||||
"Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
|
@ -1380,9 +1382,10 @@
|
|||
"message": "Warning"
|
||||
},
|
||||
"linkPreviewsConfirmMessage": {
|
||||
"message": "You will not have full metadata protection when sending or receiving link previews."
|
||||
"message":
|
||||
"You will not have full metadata protection when sending or receiving link previews."
|
||||
},
|
||||
|
||||
|
||||
"mediaPermissionsTitle": {
|
||||
"message": "Microphone and Camera"
|
||||
},
|
||||
|
@ -1445,7 +1448,8 @@
|
|||
"description": "Title of the read receipts setting"
|
||||
},
|
||||
"typingIndicatorsSettingDescription": {
|
||||
"message": "See and share when messages are being typed (applies to all sessions).",
|
||||
"message":
|
||||
"See and share when messages are being typed (applies to all sessions).",
|
||||
"description": "Description of the typing indicators setting"
|
||||
},
|
||||
"typingIndicatorsSettingTitle": {
|
||||
|
@ -1658,7 +1662,8 @@
|
|||
"description": "Brief message shown when trying to message a blocked number"
|
||||
},
|
||||
"unblockGroupToSend": {
|
||||
"message": "This group is blocked. Unlock it if you would like to send a message.",
|
||||
"message":
|
||||
"This group is blocked. Unlock it if you would like to send a message.",
|
||||
"description": "Brief message shown when trying to message a blocked group"
|
||||
},
|
||||
"youChangedTheTimer": {
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Kondiĉoj de uzo kaj regularo pri privateco",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Términos y política de privacidad",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1396,9 +1396,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Tingimused ja privaatsuspoliitika",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "شرایط و سیاست های حفظ حریم خصوصی",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Käyttöehdot ja tietosuoja",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Conditions générales d’utilisation et politique de confidentialité",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "תנאים ומדיניות פרטיות",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Uvjeti i pravila o privatnosti",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Adatvédelmi és Általános Szerződési Feltételek",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Syarat & Kebijakan Privasi",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Termini e privacy policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "使用条件とプライバシーポリシー",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "លក្ខខណ្ឌ និងគោលនយោបាយឯកជនភាព",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Sąlygos ir Privatumo politika",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Vilkår og personvernerklæring",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Gebruiksvoorwaarden & privacybeleid",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Vilkår og personvernfråsegn",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Vilkår og personvernerklæring",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Warunki korzystania & Polityka prywatności",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Termos & Política de Privacidade",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Termos e política de privacidade",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Termeni și politica de confidențialitate",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Условия и политика конфиденциальности",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Podmienky a Ochrana osobných údajov",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Pogoji uporabe in Pravilnik o zasebnosti",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Kushte & Rregulla Privatësie",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Licens- och sekretessvillkor",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "เงื่อนไขและนโยบายความเป็นส่วนตัว",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Şartlar ve Gizlilik İlkesi",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Умови використання та політика конфіденційності",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Terms & Privacy Policy",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "无法更新",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "协议与隐私政策",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -797,10 +797,6 @@
|
|||
"message": "Cannot Update",
|
||||
"description": "Shown as the title of our update error dialogs on windows"
|
||||
},
|
||||
"cannotUpdateDetail": {
|
||||
"message": "Signal Desktop failed to update, but there is a new version available. Please go to https://signal.org/download and install the new version manually, then either contact support or file a bug about this problem.",
|
||||
"description": "Shown if a general error happened while trying to install update package"
|
||||
},
|
||||
"readOnlyVolume": {
|
||||
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.",
|
||||
"description": "Shown on MacOS if running on a read-only volume and we cannot update"
|
||||
|
@ -1536,9 +1532,5 @@
|
|||
"example": "Alice, Bob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "服務條款與隱私政策",
|
||||
"description": "Shown in the about box for the link to https://signal.org/legal"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<!--
|
||||
When making changes to these templates, be sure to update test/index.html as well
|
||||
-->
|
||||
|
||||
|
||||
<script type='text/x-tmpl-mustache' id='app-loading-screen'>
|
||||
<div class='content'>
|
||||
<img src='images/session/full-logo.svg' class='session-full-logo' />
|
||||
|
@ -75,10 +75,11 @@
|
|||
</script>
|
||||
|
||||
<script type='text/x-tmpl-mustache' id='expired_alert'>
|
||||
<a target='_blank' href='https://signal.org/download/'>
|
||||
<a target='_blank' href='https://getsession.org/'>
|
||||
<button class='upgrade'>{{ upgrade }}</button>
|
||||
</a>
|
||||
{{ expiredWarning }}
|
||||
<span>{{ expiredWarning }}</span>
|
||||
<br clear="both">
|
||||
</script>
|
||||
|
||||
<script type='text/x-tmpl-mustache' id='banner'>
|
||||
|
@ -185,7 +186,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
|
||||
<script type='text/x-tmpl-mustache' id='device-pairing-words-dialog'>
|
||||
<div class="content">
|
||||
<h4>{{ title }}</h4>
|
||||
|
@ -584,7 +585,7 @@
|
|||
<script type='text/javascript' src='js/views/moderators_add_dialog_view.js'></script>
|
||||
<script type='text/javascript' src='js/views/moderators_remove_dialog_view.js'></script>
|
||||
<script type='text/javascript' src='js/views/user_details_dialog_view.js'></script>
|
||||
|
||||
|
||||
<script type='text/javascript' src='js/wall_clock_listener.js'></script>
|
||||
<script type='text/javascript' src='js/rotate_signed_prekey_listener.js'></script>
|
||||
<script type='text/javascript' src='js/keychange_listener.js'></script>
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
}
|
||||
],
|
||||
"disableAutoUpdate": true,
|
||||
"updatesUrl": "https://updates2.signal.org/desktop",
|
||||
"updatesUrl": "TODO",
|
||||
"updatesPublicKey":
|
||||
"fd7dd3de7149dc0a127909fee7de0f7620ddd0de061b37a2c303e37de802a401",
|
||||
"updatesEnabled": false,
|
||||
|
@ -36,5 +36,5 @@
|
|||
"import": false,
|
||||
"serverTrustRoot": "BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx",
|
||||
"defaultPublicChatServer": "https://chat.getsession.org",
|
||||
"defaultFileServer": "https://file.lokinet.org"
|
||||
"defaultFileServer": "https://file.getsession.org"
|
||||
}
|
||||
|
|
BIN
fonts/SFProDisplay-Regular.otf
Normal file
BIN
fonts/SFProDisplay-Regular.otf
Normal file
Binary file not shown.
|
@ -2114,7 +2114,9 @@
|
|||
|
||||
// If we don't return early here, we can get into infinite error loops. So, no
|
||||
// delivery receipts for sealed sender errors.
|
||||
if (isError || !data.unidentifiedDeliveryReceived) {
|
||||
|
||||
// Note(LOKI): don't send receipt for FR as we don't have a session yet
|
||||
if (isError || !data.unidentifiedDeliveryReceived || data.friendRequest) {
|
||||
return message;
|
||||
}
|
||||
|
||||
|
|
84
js/expire.js
84
js/expire.js
|
@ -1,22 +1,80 @@
|
|||
/* global LokiAppDotNetServerAPI, LokiFileServerAPI, semver, log */
|
||||
// eslint-disable-next-line func-names
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
let BUILD_EXPIRATION = 0;
|
||||
try {
|
||||
BUILD_EXPIRATION = parseInt(window.getExpiration(), 10);
|
||||
if (BUILD_EXPIRATION) {
|
||||
window.log.info(
|
||||
'Build expires: ',
|
||||
new Date(BUILD_EXPIRATION).toISOString()
|
||||
);
|
||||
// hold last result
|
||||
let expiredVersion = null;
|
||||
|
||||
window.tokenlessFileServerAdnAPI = new LokiAppDotNetServerAPI(
|
||||
'', // no pubkey needed
|
||||
window.getDefaultFileServer()
|
||||
);
|
||||
window.tokenlessFileServerAdnAPI.pubKey = window.Signal.Crypto.base64ToArrayBuffer(
|
||||
LokiFileServerAPI.secureRpcPubKey
|
||||
);
|
||||
|
||||
const checkForUpgrades = async () => {
|
||||
const response = await window.tokenlessFileServerAdnAPI.serverRequest(
|
||||
'loki/v1/version/client/desktop'
|
||||
);
|
||||
if (response && response.response) {
|
||||
const latestVer = semver.clean(response.response.data[0][0]);
|
||||
if (semver.valid(latestVer)) {
|
||||
const ourVersion = window.getVersion();
|
||||
if (latestVer === ourVersion) {
|
||||
log.info('You have the latest version', latestVer);
|
||||
// change the following to true ot test/see expiration banner
|
||||
expiredVersion = false;
|
||||
} else {
|
||||
// expire if latest is newer than current
|
||||
expiredVersion = semver.gt(latestVer, ourVersion);
|
||||
if (expiredVersion) {
|
||||
log.info('There is a newer version available', latestVer);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// give it a minute
|
||||
log.warn('Could not check to see if newer version is available');
|
||||
setTimeout(async () => {
|
||||
await checkForUpgrades();
|
||||
}, 60 * 1000); // wait a minute
|
||||
}
|
||||
} catch (e) {
|
||||
// nothing
|
||||
}
|
||||
// no message logged means serverRequest never returned...
|
||||
};
|
||||
checkForUpgrades();
|
||||
|
||||
window.extension = window.extension || {};
|
||||
|
||||
window.extension.expired = () =>
|
||||
BUILD_EXPIRATION && Date.now() > BUILD_EXPIRATION;
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const resolveWhenReady = (res, rej) => {
|
||||
if (expiredVersion !== null) {
|
||||
return res(expiredVersion);
|
||||
}
|
||||
function waitForVersion() {
|
||||
if (expiredVersion !== null) {
|
||||
return res(expiredVersion);
|
||||
}
|
||||
log.info('Delaying sending checks for 1s, no version yet');
|
||||
setTimeout(waitForVersion, 1000);
|
||||
return true;
|
||||
}
|
||||
waitForVersion();
|
||||
return true;
|
||||
};
|
||||
|
||||
window.extension.expiredPromise = () => new Promise(resolveWhenReady);
|
||||
window.extension.expired = cb => {
|
||||
if (expiredVersion === null) {
|
||||
// just give it another second
|
||||
log.info('Delaying expire banner determination for 1s');
|
||||
setTimeout(() => {
|
||||
window.extension.expired(cb);
|
||||
}, 1000);
|
||||
return;
|
||||
}
|
||||
// yes we know
|
||||
cb(expiredVersion);
|
||||
};
|
||||
})();
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
/* global log, textsecure, libloki, Signal, Whisper, Headers, ConversationController,
|
||||
/* global log, textsecure, libloki, Signal, Whisper, ConversationController,
|
||||
clearTimeout, MessageController, libsignal, StringView, window, _,
|
||||
dcodeIO, Buffer, lokiSnodeAPI, TextDecoder */
|
||||
dcodeIO, Buffer, lokiSnodeAPI, TextDecoder, process */
|
||||
const nodeFetch = require('node-fetch');
|
||||
const { URL, URLSearchParams } = require('url');
|
||||
const FormData = require('form-data');
|
||||
const https = require('https');
|
||||
|
||||
// Can't be less than 1200 if we have unauth'd requests
|
||||
const PUBLICCHAT_MSG_POLL_EVERY = 1.5 * 1000; // 1.5s
|
||||
|
@ -19,6 +20,10 @@ const MESSAGE_ATTACHMENT_TYPE = 'net.app.core.oembed';
|
|||
const LOKI_ATTACHMENT_TYPE = 'attachment';
|
||||
const LOKI_PREVIEW_TYPE = 'preview';
|
||||
|
||||
const snodeHttpsAgent = new https.Agent({
|
||||
rejectUnauthorized: false,
|
||||
});
|
||||
|
||||
// the core ADN class that handles all communication with a specific server
|
||||
class LokiAppDotNetServerAPI {
|
||||
constructor(ourKey, url) {
|
||||
|
@ -53,6 +58,12 @@ class LokiAppDotNetServerAPI {
|
|||
channelId,
|
||||
conversationId
|
||||
);
|
||||
log.info(
|
||||
'LokiPublicChannelAPI started for',
|
||||
channelId,
|
||||
'on',
|
||||
this.baseServerUrl
|
||||
);
|
||||
this.channels.push(thisChannel);
|
||||
}
|
||||
return thisChannel;
|
||||
|
@ -220,9 +231,11 @@ class LokiAppDotNetServerAPI {
|
|||
async refreshServerToken() {
|
||||
// if currently not in progress
|
||||
if (this.tokenPromise === null) {
|
||||
// FIXME: add timeout
|
||||
// a broken/stuck token endpoint can prevent you from removing channels
|
||||
// set lock
|
||||
this.tokenPromise = new Promise(async res => {
|
||||
// request the oken
|
||||
// request the token
|
||||
const token = await this.requestToken();
|
||||
if (!token) {
|
||||
res(null);
|
||||
|
@ -255,11 +268,13 @@ class LokiAppDotNetServerAPI {
|
|||
};
|
||||
url.search = new URLSearchParams(params);
|
||||
|
||||
res = await nodeFetch(url);
|
||||
res = await this.proxyFetch(url);
|
||||
} catch (e) {
|
||||
log.error('requestToken request failed', e);
|
||||
return null;
|
||||
}
|
||||
if (!res.ok) {
|
||||
log.error('requestToken request failed');
|
||||
return null;
|
||||
}
|
||||
const body = await res.json();
|
||||
|
@ -281,7 +296,7 @@ class LokiAppDotNetServerAPI {
|
|||
};
|
||||
|
||||
try {
|
||||
const res = await nodeFetch(
|
||||
const res = await this.proxyFetch(
|
||||
`${this.baseServerUrl}/loki/v1/submit_challenge`,
|
||||
options
|
||||
);
|
||||
|
@ -291,7 +306,32 @@ class LokiAppDotNetServerAPI {
|
|||
}
|
||||
}
|
||||
|
||||
async _sendToProxy(fetchOptions, method, headers, endpoint) {
|
||||
async proxyFetch(urlObj, fetchOptions) {
|
||||
if (
|
||||
window.lokiFeatureFlags.useSnodeProxy &&
|
||||
(this.baseServerUrl === 'https://file-dev.lokinet.org' ||
|
||||
this.baseServerUrl === 'https://file.getsession.org')
|
||||
) {
|
||||
const finalOptions = { ...fetchOptions };
|
||||
if (!fetchOptions.method) {
|
||||
finalOptions.method = 'GET';
|
||||
}
|
||||
const urlStr = urlObj.toString();
|
||||
const endpoint = urlStr.replace(`${this.baseServerUrl}/`, '');
|
||||
const { response, result } = await this._sendToProxy(
|
||||
endpoint,
|
||||
finalOptions
|
||||
);
|
||||
// emulate nodeFetch response...
|
||||
return {
|
||||
ok: result.status === 200,
|
||||
json: () => response,
|
||||
};
|
||||
}
|
||||
return nodeFetch(urlObj, fetchOptions);
|
||||
}
|
||||
|
||||
async _sendToProxy(endpoint, fetchOptions) {
|
||||
const randSnode = await lokiSnodeAPI.getRandomSnodeAddress();
|
||||
const url = `https://${randSnode.ip}:${randSnode.port}/file_proxy`;
|
||||
|
||||
|
@ -299,8 +339,8 @@ class LokiAppDotNetServerAPI {
|
|||
// I think this is a stream, we may need to collect it all?
|
||||
body: fetchOptions.body, // might need to b64 if binary...
|
||||
endpoint,
|
||||
method,
|
||||
headers,
|
||||
method: fetchOptions.method,
|
||||
headers: fetchOptions.headers,
|
||||
};
|
||||
|
||||
// from https://github.com/sindresorhus/is-stream/blob/master/index.js
|
||||
|
@ -361,7 +401,10 @@ class LokiAppDotNetServerAPI {
|
|||
'X-Loki-File-Server-Verb': 'POST',
|
||||
'X-Loki-File-Server-Headers': JSON.stringify(finalRequestHeader),
|
||||
},
|
||||
// we are talking to a snode...
|
||||
agent: snodeHttpsAgent,
|
||||
};
|
||||
// weird this doesn't need NODE_TLS_REJECT_UNAUTHORIZED = 0
|
||||
const result = await nodeFetch(url, firstHopOptions);
|
||||
|
||||
const txtResponse = await result.text();
|
||||
|
@ -419,7 +462,12 @@ class LokiAppDotNetServerAPI {
|
|||
} else if (rawBody) {
|
||||
fetchOptions.body = rawBody;
|
||||
}
|
||||
fetchOptions.headers = new Headers(headers);
|
||||
fetchOptions.headers = headers;
|
||||
|
||||
// domain ends in .loki
|
||||
if (endpoint.match(/\.loki\//)) {
|
||||
fetchOptions.agent = snodeHttpsAgent;
|
||||
}
|
||||
} catch (e) {
|
||||
log.info('serverRequest set up error:', JSON.stringify(e));
|
||||
return {
|
||||
|
@ -435,23 +483,32 @@ class LokiAppDotNetServerAPI {
|
|||
if (
|
||||
window.lokiFeatureFlags.useSnodeProxy &&
|
||||
(this.baseServerUrl === 'https://file-dev.lokinet.org' ||
|
||||
this.baseServerUrl === 'https://file.lokinet.org')
|
||||
this.baseServerUrl === 'https://file.getsession.org')
|
||||
) {
|
||||
mode = '_sendToProxy';
|
||||
// have to send headers because fetchOptions.headers isn't readable
|
||||
|
||||
const endpointWithQS = url
|
||||
.toString()
|
||||
.replace(`${this.baseServerUrl}/`, '');
|
||||
({ response, txtResponse, result } = await this._sendToProxy(
|
||||
fetchOptions,
|
||||
method,
|
||||
headers,
|
||||
endpoint
|
||||
endpointWithQS,
|
||||
fetchOptions
|
||||
));
|
||||
} else {
|
||||
result = await nodeFetch(url, fetchOptions || undefined);
|
||||
// disable check for .loki
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = endpoint.match(/\.loki\//) ? 0 : 1;
|
||||
result = await nodeFetch(url, fetchOptions);
|
||||
// always make sure this check is enabled
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 1;
|
||||
txtResponse = await result.text();
|
||||
response = JSON.parse(txtResponse);
|
||||
}
|
||||
} catch (e) {
|
||||
log.info(`serverRequest ${mode} error json: ${txtResponse}`);
|
||||
if (txtResponse) {
|
||||
log.info(`serverRequest ${mode} error`, e.code, e.message, `json: ${txtResponse}`);
|
||||
} else {
|
||||
log.info(`serverRequest ${mode} error`, e.code, e.message);
|
||||
}
|
||||
return {
|
||||
err: e,
|
||||
};
|
||||
|
@ -714,7 +771,7 @@ class LokiAppDotNetServerAPI {
|
|||
options
|
||||
);
|
||||
if (statusCode !== 200) {
|
||||
log.warn('Failed to upload data to fileserver');
|
||||
log.warn('Failed to upload data to server', this.baseServerUrl);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -56,13 +56,17 @@ class LokiFileServerInstance {
|
|||
// FIXME: this is not file-server specific
|
||||
// and is currently called by LokiAppDotNetAPI.
|
||||
// LokiAppDotNetAPI (base) should not know about LokiFileServer.
|
||||
async establishConnection(serverUrl) {
|
||||
async establishConnection(serverUrl, options) {
|
||||
// why don't we extend this?
|
||||
this._server = new LokiAppDotNetAPI(this.ourKey, serverUrl);
|
||||
|
||||
// configure proxy
|
||||
this._server.pubKey = this.pubKey;
|
||||
|
||||
if (options !== undefined && options.skipToken) {
|
||||
return;
|
||||
}
|
||||
|
||||
// get a token for multidevice
|
||||
const gotToken = await this._server.getOrRefreshServerToken();
|
||||
// TODO: Handle this failure gracefully
|
||||
|
@ -307,11 +311,13 @@ class LokiFileServerFactoryAPI {
|
|||
if (!thisServer) {
|
||||
thisServer = new LokiFileServerInstance(this.ourKey);
|
||||
log.info(`Registering FileServer ${serverUrl}`);
|
||||
await thisServer.establishConnection(serverUrl);
|
||||
await thisServer.establishConnection(serverUrl, { skipToken: true });
|
||||
this.servers.push(thisServer);
|
||||
}
|
||||
return thisServer;
|
||||
}
|
||||
}
|
||||
// smuggle some data out of this joint (for expire.js/version upgrade check)
|
||||
LokiFileServerFactoryAPI.secureRpcPubKey = LOKIFOUNDATION_FILESERVER_PUBKEY;
|
||||
|
||||
module.exports = LokiFileServerFactoryAPI;
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
/* global log, libloki, textsecure, getStoragePubKey, lokiSnodeAPI, StringView,
|
||||
libsignal, window, TextDecoder, TextEncoder, dcodeIO */
|
||||
libsignal, window, TextDecoder, TextEncoder, dcodeIO, process */
|
||||
|
||||
const nodeFetch = require('node-fetch');
|
||||
const https = require('https');
|
||||
const { parse } = require('url');
|
||||
|
||||
const snodeHttpsAgent = new https.Agent({
|
||||
rejectUnauthorized: false,
|
||||
});
|
||||
|
||||
const LOKI_EPHEMKEY_HEADER = 'X-Loki-EphemKey';
|
||||
const endpointBase = '/storage_rpc/v1';
|
||||
|
||||
|
@ -61,7 +66,11 @@ const sendToProxy = async (options = {}, targetNode) => {
|
|||
},
|
||||
};
|
||||
|
||||
// we only proxy to snodes...
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
|
||||
const response = await nodeFetch(url, firstHopOptions);
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 1;
|
||||
|
||||
const ciphertext = await response.text();
|
||||
|
||||
const ciphertextBuffer = dcodeIO.ByteBuffer.wrap(
|
||||
|
@ -115,6 +124,9 @@ const lokiFetch = async (url, options = {}, targetNode = null) => {
|
|||
timeout,
|
||||
method,
|
||||
};
|
||||
if (url.match(/https:\/\//)) {
|
||||
fetchOptions.agent = snodeHttpsAgent;
|
||||
}
|
||||
|
||||
try {
|
||||
if (window.lokiFeatureFlags.useSnodeProxy && targetNode) {
|
||||
|
@ -122,7 +134,12 @@ const lokiFetch = async (url, options = {}, targetNode = null) => {
|
|||
return result.json();
|
||||
}
|
||||
|
||||
if (url.match(/https:\/\//)) {
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
|
||||
}
|
||||
const response = await nodeFetch(url, fetchOptions);
|
||||
// restore TLS checking
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 1;
|
||||
|
||||
let result;
|
||||
// Wrong swarm
|
||||
|
|
|
@ -63,14 +63,25 @@ class LokiRssAPI extends EventEmitter {
|
|||
log.warn('LokiRssAPI unsupported rss feed', this.feedUrl);
|
||||
return;
|
||||
}
|
||||
const response = await window.lokiFileServerAPI._server.serverRequest(
|
||||
const result = await window.lokiFileServerAPI._server.serverRequest(
|
||||
map[this.feedUrl]
|
||||
);
|
||||
if (!response) {
|
||||
if (!result) {
|
||||
log.error('LokiRssAPI empty rss proxy response');
|
||||
return;
|
||||
}
|
||||
const responseXML = response.response.data;
|
||||
if (!result.response) {
|
||||
log.error('LokiRssAPI rss proxy error, no response', result);
|
||||
return;
|
||||
}
|
||||
if (!result.response.data) {
|
||||
log.error(
|
||||
'LokiRssAPI rss proxy error, no data, response',
|
||||
result.response
|
||||
);
|
||||
return;
|
||||
}
|
||||
const responseXML = result.response.data;
|
||||
let feedDOM = {};
|
||||
try {
|
||||
feedDOM = await new window.DOMParser().parseFromString(
|
||||
|
|
|
@ -130,8 +130,8 @@
|
|||
// so its loading screen doesn't stick around forever.
|
||||
|
||||
// Two primary techniques at play for this situation:
|
||||
// - background.js has two openInbox() calls, and passes initalLoadComplete
|
||||
// directly via the options parameter.
|
||||
// - background.js has X number of openInbox() calls,
|
||||
// and passes initalLoadComplete directly via the options parameter.
|
||||
// - in other situations openInbox() will be called with no options. So this
|
||||
// view keeps track of whether onEmpty() has ever been called with
|
||||
// this.initialLoadComplete. An example of this: on a phone-pairing setup.
|
||||
|
|
|
@ -1859,7 +1859,8 @@
|
|||
message = window.Signal.Emoji.replaceColons(message).trim();
|
||||
|
||||
const toastOptions = { type: 'info' };
|
||||
if (extension.expired()) {
|
||||
const expiredVersion = await extension.expiredPromise();
|
||||
if (expiredVersion) {
|
||||
toastOptions.title = i18n('expiredWarning');
|
||||
toastOptions.id = 'expiredWarning';
|
||||
}
|
||||
|
|
|
@ -236,7 +236,7 @@
|
|||
id: 'maximumAttachments',
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
// Housekeeping
|
||||
addAttachment(attachment) {
|
||||
if (attachment.isVoiceNote && this.attachments.length > 0) {
|
||||
|
|
|
@ -156,11 +156,13 @@
|
|||
.find('.network-status-container')
|
||||
.append(this.networkStatusView.render().el);
|
||||
|
||||
if (extension.expired()) {
|
||||
const banner = new Whisper.ExpiredAlertBanner().render();
|
||||
banner.$el.prependTo(this.$el);
|
||||
this.$el.addClass('expired');
|
||||
}
|
||||
extension.expired(expired => {
|
||||
if (expired) {
|
||||
const banner = new Whisper.ExpiredAlertBanner().render();
|
||||
banner.$el.prependTo(this.$el);
|
||||
this.$el.addClass('expired');
|
||||
}
|
||||
});
|
||||
|
||||
// FIXME: Fix this for new react views
|
||||
this.updateInboxSectionUnread();
|
||||
|
@ -393,7 +395,7 @@
|
|||
|
||||
Whisper.ExpiredAlertBanner = Whisper.View.extend({
|
||||
templateName: 'expired_alert',
|
||||
className: 'expiredAlert clearfix',
|
||||
className: 'expiredAlert',
|
||||
render_attributes() {
|
||||
return {
|
||||
expiredWarning: i18n('expiredWarning'),
|
||||
|
|
|
@ -654,6 +654,9 @@ MessageReceiver.prototype.extend({
|
|||
},
|
||||
async decrypt(envelope, ciphertext) {
|
||||
let promise;
|
||||
|
||||
// We don't have source at this point yet (with sealed sender)
|
||||
// This needs a massive cleanup!
|
||||
const address = new libsignal.SignalProtocolAddress(
|
||||
envelope.source,
|
||||
envelope.sourceDevice
|
||||
|
@ -668,33 +671,19 @@ MessageReceiver.prototype.extend({
|
|||
options.messageKeysLimit = false;
|
||||
}
|
||||
|
||||
// Will become obsolete
|
||||
const sessionCipher = new libsignal.SessionCipher(
|
||||
textsecure.storage.protocol,
|
||||
address,
|
||||
options
|
||||
);
|
||||
const secretSessionCipher = new window.Signal.Metadata.SecretSessionCipher(
|
||||
textsecure.storage.protocol
|
||||
);
|
||||
|
||||
const fallBackSessionCipher = new libloki.crypto.FallBackSessionCipher(
|
||||
address
|
||||
);
|
||||
|
||||
const me = {
|
||||
number: ourNumber,
|
||||
deviceId: parseInt(textsecure.storage.user.getDeviceId(), 10),
|
||||
};
|
||||
|
||||
let conversation;
|
||||
try {
|
||||
conversation = await window.ConversationController.getOrCreateAndWait(
|
||||
envelope.source,
|
||||
'private'
|
||||
);
|
||||
} catch (e) {
|
||||
window.log.info('Error getting conversation: ', envelope.source);
|
||||
}
|
||||
// Will become obsolete
|
||||
const getCurrentSessionBaseKey = async () => {
|
||||
const record = await sessionCipher.getRecord(address.toString());
|
||||
if (!record) {
|
||||
|
@ -707,71 +696,26 @@ MessageReceiver.prototype.extend({
|
|||
const { baseKey } = openSession.indexInfo;
|
||||
return baseKey;
|
||||
};
|
||||
|
||||
// Will become obsolete
|
||||
const captureActiveSession = async () => {
|
||||
this.activeSessionBaseKey = await getCurrentSessionBaseKey(sessionCipher);
|
||||
};
|
||||
const restoreActiveSession = async () => {
|
||||
const record = await sessionCipher.getRecord(address.toString());
|
||||
if (!record) {
|
||||
return;
|
||||
}
|
||||
record.archiveCurrentState();
|
||||
const sessionToRestore = record.sessions[this.activeSessionBaseKey];
|
||||
record.promoteState(sessionToRestore);
|
||||
record.updateSessionState(sessionToRestore);
|
||||
await textsecure.storage.protocol.storeSession(
|
||||
address.toString(),
|
||||
record.serialize()
|
||||
);
|
||||
};
|
||||
const deleteAllSessionExcept = async sessionBaseKey => {
|
||||
const record = await sessionCipher.getRecord(address.toString());
|
||||
if (!record) {
|
||||
return;
|
||||
}
|
||||
const sessionToKeep = record.sessions[sessionBaseKey];
|
||||
record.sessions = {};
|
||||
record.updateSessionState(sessionToKeep);
|
||||
await textsecure.storage.protocol.storeSession(
|
||||
address.toString(),
|
||||
record.serialize()
|
||||
);
|
||||
};
|
||||
let handleSessionReset;
|
||||
if (conversation.isSessionResetOngoing()) {
|
||||
handleSessionReset = async result => {
|
||||
const currentSessionBaseKey = await getCurrentSessionBaseKey(
|
||||
sessionCipher
|
||||
);
|
||||
if (
|
||||
this.activeSessionBaseKey &&
|
||||
currentSessionBaseKey !== this.activeSessionBaseKey
|
||||
) {
|
||||
if (conversation.isSessionResetReceived()) {
|
||||
await restoreActiveSession();
|
||||
} else {
|
||||
await deleteAllSessionExcept(currentSessionBaseKey);
|
||||
await conversation.onNewSessionAdopted();
|
||||
}
|
||||
} else if (conversation.isSessionResetReceived()) {
|
||||
await deleteAllSessionExcept(this.activeSessionBaseKey);
|
||||
await conversation.onNewSessionAdopted();
|
||||
}
|
||||
return result;
|
||||
};
|
||||
} else {
|
||||
handleSessionReset = async result => result;
|
||||
}
|
||||
|
||||
switch (envelope.type) {
|
||||
case textsecure.protobuf.Envelope.Type.CIPHERTEXT:
|
||||
window.log.info('message from', this.getEnvelopeId(envelope));
|
||||
promise = captureActiveSession()
|
||||
.then(() => sessionCipher.decryptWhisperMessage(ciphertext))
|
||||
.then(this.unpad)
|
||||
.then(handleSessionReset);
|
||||
.then(this.unpad);
|
||||
break;
|
||||
case textsecure.protobuf.Envelope.Type.FRIEND_REQUEST: {
|
||||
window.log.info('friend-request message from ', envelope.source);
|
||||
|
||||
const fallBackSessionCipher = new libloki.crypto.FallBackSessionCipher(
|
||||
address
|
||||
);
|
||||
|
||||
promise = fallBackSessionCipher
|
||||
.decrypt(ciphertext.toArrayBuffer())
|
||||
.then(this.unpad);
|
||||
|
@ -779,30 +723,33 @@ MessageReceiver.prototype.extend({
|
|||
}
|
||||
case textsecure.protobuf.Envelope.Type.PREKEY_BUNDLE:
|
||||
window.log.info('prekey message from', this.getEnvelopeId(envelope));
|
||||
promise = captureActiveSession(sessionCipher)
|
||||
.then(async () => {
|
||||
if (!this.activeSessionBaseKey) {
|
||||
try {
|
||||
const buffer = dcodeIO.ByteBuffer.wrap(ciphertext);
|
||||
await window.libloki.storage.verifyFriendRequestAcceptPreKey(
|
||||
envelope.source,
|
||||
buffer
|
||||
);
|
||||
} catch (e) {
|
||||
await this.removeFromCache(envelope);
|
||||
throw e;
|
||||
}
|
||||
promise = captureActiveSession(sessionCipher).then(async () => {
|
||||
if (!this.activeSessionBaseKey) {
|
||||
try {
|
||||
const buffer = dcodeIO.ByteBuffer.wrap(ciphertext);
|
||||
await window.libloki.storage.verifyFriendRequestAcceptPreKey(
|
||||
envelope.source,
|
||||
buffer
|
||||
);
|
||||
} catch (e) {
|
||||
await this.removeFromCache(envelope);
|
||||
throw e;
|
||||
}
|
||||
return this.decryptPreKeyWhisperMessage(
|
||||
ciphertext,
|
||||
sessionCipher,
|
||||
address
|
||||
);
|
||||
})
|
||||
.then(handleSessionReset);
|
||||
}
|
||||
return this.decryptPreKeyWhisperMessage(
|
||||
ciphertext,
|
||||
sessionCipher,
|
||||
address
|
||||
);
|
||||
});
|
||||
break;
|
||||
case textsecure.protobuf.Envelope.Type.UNIDENTIFIED_SENDER:
|
||||
case textsecure.protobuf.Envelope.Type.UNIDENTIFIED_SENDER: {
|
||||
window.log.info('received unidentified sender message');
|
||||
|
||||
const secretSessionCipher = new window.Signal.Metadata.SecretSessionCipher(
|
||||
textsecure.storage.protocol
|
||||
);
|
||||
|
||||
promise = secretSessionCipher
|
||||
.decrypt(ciphertext.toArrayBuffer(), me)
|
||||
.then(
|
||||
|
@ -872,9 +819,9 @@ MessageReceiver.prototype.extend({
|
|||
throw error;
|
||||
});
|
||||
}
|
||||
)
|
||||
.then(handleSessionReset);
|
||||
);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
promise = Promise.reject(new Error('Unknown message type'));
|
||||
}
|
||||
|
@ -887,6 +834,82 @@ MessageReceiver.prototype.extend({
|
|||
return null;
|
||||
}
|
||||
|
||||
let conversation;
|
||||
try {
|
||||
conversation = await window.ConversationController.getOrCreateAndWait(
|
||||
envelope.source,
|
||||
'private'
|
||||
);
|
||||
} catch (e) {
|
||||
window.log.info('Error getting conversation: ', envelope.source);
|
||||
}
|
||||
|
||||
// lint hates anything after // (so /// is no good)
|
||||
// *** BEGIN: session reset ***
|
||||
|
||||
// we have address in scope from parent scope
|
||||
// seems to be the same input parameters
|
||||
// going to comment out due to lint complaints
|
||||
/*
|
||||
const address = new libsignal.SignalProtocolAddress(
|
||||
envelope.source,
|
||||
envelope.sourceDevice
|
||||
);
|
||||
*/
|
||||
|
||||
const restoreActiveSession = async () => {
|
||||
const record = await sessionCipher.getRecord(address.toString());
|
||||
if (!record) {
|
||||
return;
|
||||
}
|
||||
record.archiveCurrentState();
|
||||
|
||||
// NOTE: activeSessionBaseKey will be undefined here...
|
||||
const sessionToRestore = record.sessions[this.activeSessionBaseKey];
|
||||
record.promoteState(sessionToRestore);
|
||||
record.updateSessionState(sessionToRestore);
|
||||
await textsecure.storage.protocol.storeSession(
|
||||
address.toString(),
|
||||
record.serialize()
|
||||
);
|
||||
};
|
||||
const deleteAllSessionExcept = async sessionBaseKey => {
|
||||
const record = await sessionCipher.getRecord(address.toString());
|
||||
if (!record) {
|
||||
return;
|
||||
}
|
||||
const sessionToKeep = record.sessions[sessionBaseKey];
|
||||
record.sessions = {};
|
||||
record.updateSessionState(sessionToKeep);
|
||||
await textsecure.storage.protocol.storeSession(
|
||||
address.toString(),
|
||||
record.serialize()
|
||||
);
|
||||
};
|
||||
|
||||
if (conversation.isSessionResetOngoing()) {
|
||||
const currentSessionBaseKey = await getCurrentSessionBaseKey(
|
||||
sessionCipher
|
||||
);
|
||||
if (
|
||||
this.activeSessionBaseKey &&
|
||||
currentSessionBaseKey !== this.activeSessionBaseKey
|
||||
) {
|
||||
if (conversation.isSessionResetReceived()) {
|
||||
await restoreActiveSession();
|
||||
} else {
|
||||
await deleteAllSessionExcept(currentSessionBaseKey);
|
||||
await conversation.onNewSessionAdopted();
|
||||
}
|
||||
} else if (conversation.isSessionResetReceived()) {
|
||||
await deleteAllSessionExcept(this.activeSessionBaseKey);
|
||||
await conversation.onNewSessionAdopted();
|
||||
}
|
||||
}
|
||||
|
||||
// lint hates anything after // (so /// is no good)
|
||||
// *** END ***
|
||||
|
||||
// Type here can actually be UNIDENTIFIED_SENDER even if
|
||||
// the underlying message is FRIEND_REQUEST
|
||||
if (
|
||||
|
@ -920,7 +943,7 @@ MessageReceiver.prototype.extend({
|
|||
const noSession =
|
||||
error &&
|
||||
(error.message.indexOf('No record for device') === 0 ||
|
||||
error.messaeg.indexOf('decryptWithSessionList: list is empty') ===
|
||||
error.message.indexOf('decryptWithSessionList: list is empty') ===
|
||||
0);
|
||||
|
||||
if (error && error.message === 'Unknown identity key') {
|
||||
|
|
|
@ -266,9 +266,15 @@ OutgoingMessage.prototype = {
|
|||
return this.convertMessageToText(messageBuffer);
|
||||
},
|
||||
async wrapInWebsocketMessage(outgoingObject) {
|
||||
const source =
|
||||
outgoingObject.type ===
|
||||
textsecure.protobuf.Envelope.Type.UNIDENTIFIED_SENDER
|
||||
? null
|
||||
: outgoingObject.ourKey;
|
||||
|
||||
const messageEnvelope = new textsecure.protobuf.Envelope({
|
||||
type: outgoingObject.type,
|
||||
source: outgoingObject.ourKey,
|
||||
source,
|
||||
sourceDevice: outgoingObject.sourceDevice,
|
||||
timestamp: this.timestamp,
|
||||
content: outgoingObject.content,
|
||||
|
|
|
@ -231,7 +231,7 @@
|
|||
"publish": [
|
||||
{
|
||||
"provider": "generic",
|
||||
"url": "https://updates.signal.org/desktop"
|
||||
"url": "https://getsession.org/"
|
||||
}
|
||||
],
|
||||
"target": [
|
||||
|
|
10
preload.js
10
preload.js
|
@ -27,6 +27,7 @@ window.Lodash = require('lodash');
|
|||
// Regex to match all characters which are *not* supported in display names
|
||||
window.displayNameRegex = /[^\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC _0-9]*/g;
|
||||
|
||||
window.semver = semver;
|
||||
window.platform = process.platform;
|
||||
window.getDefaultPoWDifficulty = () => config.defaultPoWDifficulty;
|
||||
window.getTitle = () => title;
|
||||
|
@ -75,9 +76,6 @@ window.versionInfo = {
|
|||
appInstance: window.getAppInstance(),
|
||||
};
|
||||
|
||||
// temporary clearnet fix
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
||||
|
||||
window.wrapDeferred = deferredToPromise;
|
||||
|
||||
const ipc = electron.ipcRenderer;
|
||||
|
@ -371,6 +369,8 @@ window.LokiMessageAPI = require('./js/modules/loki_message_api');
|
|||
|
||||
window.LokiPublicChatAPI = require('./js/modules/loki_public_chat_api');
|
||||
|
||||
window.LokiAppDotNetServerAPI = require('./js/modules/loki_app_dot_net_api');
|
||||
|
||||
window.LokiFileServerAPI = require('./js/modules/loki_file_server_api');
|
||||
|
||||
window.LokiRssAPI = require('./js/modules/loki_rss_api');
|
||||
|
@ -499,8 +499,8 @@ window.SMALL_GROUP_SIZE_LIMIT = 10;
|
|||
window.lokiFeatureFlags = {
|
||||
multiDeviceUnpairing: true,
|
||||
privateGroupChats: true,
|
||||
useSnodeProxy: false,
|
||||
useSealedSender: false,
|
||||
useSnodeProxy: true,
|
||||
useSealedSender: true,
|
||||
};
|
||||
|
||||
// eslint-disable-next-line no-extend-native,func-names
|
||||
|
|
|
@ -30,7 +30,10 @@
|
|||
font-family: 'SF Pro Text';
|
||||
src: url('../fonts/SFProText-Regular.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'SF Pro Display';
|
||||
src: url('../fonts/SFProDisplay-Regular.otf') format('opentype');
|
||||
}
|
||||
@keyframes fadein {
|
||||
from {
|
||||
opacity: 0;
|
||||
|
@ -109,6 +112,8 @@ $session-font-h4: 16px;
|
|||
|
||||
$session-search-input-height: 34px;
|
||||
$main-view-header-height: 85px;
|
||||
$session-left-pane-width: 300px;
|
||||
$session-left-pane-sections-container-width: 80px;
|
||||
|
||||
div.spacer-sm {
|
||||
height: $session-margin-sm;
|
||||
|
@ -176,7 +181,7 @@ $session-modal-size-lg: 650px;
|
|||
$session-conversation-header-height: 60px;
|
||||
|
||||
@mixin fontWasaBold {
|
||||
font-weight: 700;
|
||||
font-weight: bold;
|
||||
font-family: $session-font-family;
|
||||
}
|
||||
|
||||
|
@ -480,6 +485,7 @@ $session-element-border-green: 4px solid $session-color-green;
|
|||
font-family: Wasa;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
font-size: $session-font-md;
|
||||
|
||||
&-text {
|
||||
@include session-color-subtle($session-color-white);
|
||||
|
@ -1374,6 +1380,7 @@ label {
|
|||
.session-id-editable textarea {
|
||||
resize: none;
|
||||
overflow: hidden;
|
||||
user-select: all;
|
||||
}
|
||||
|
||||
input {
|
||||
|
|
|
@ -112,14 +112,15 @@ $session-compose-margin: 20px;
|
|||
&__user__profile {
|
||||
&-number,
|
||||
&-name {
|
||||
@include fontWasaBold();
|
||||
font-size: 15px;
|
||||
|
||||
@at-root .light-theme #{&} {
|
||||
color: $session-color-white;
|
||||
}
|
||||
@at-root .dark-theme #{&} {
|
||||
color: $session-shade-17;
|
||||
}
|
||||
|
||||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -135,7 +136,7 @@ $session-compose-margin: 20px;
|
|||
|
||||
.module-left-pane {
|
||||
border-right: none !important;
|
||||
width: 300px;
|
||||
width: $session-left-pane-width;
|
||||
position: relative;
|
||||
height: -webkit-fill-available;
|
||||
|
||||
|
@ -152,7 +153,7 @@ $session-compose-margin: 20px;
|
|||
|
||||
&__sections-container {
|
||||
height: -webkit-fill-available;
|
||||
width: 80px;
|
||||
width: $session-left-pane-sections-container-width;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
|
||||
|
@ -189,6 +190,7 @@ $session-compose-margin: 20px;
|
|||
|
||||
.session-button {
|
||||
margin-left: auto;
|
||||
@include fontWasaBold();
|
||||
}
|
||||
|
||||
&-buttons {
|
||||
|
@ -245,37 +247,34 @@ $session-compose-margin: 20px;
|
|||
|
||||
h3 {
|
||||
padding-top: 22px;
|
||||
position: relative;
|
||||
|
||||
.green-border {
|
||||
position: absolute;
|
||||
color: $session-color-green;
|
||||
background-color: $session-color-green;
|
||||
height: 5px;
|
||||
left: -10px;
|
||||
right: -10px;
|
||||
margin-top: 7px;
|
||||
border: none;
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
&-border-container {
|
||||
width: -webkit-fill-available;
|
||||
.white-border {
|
||||
width: $session-left-pane-width;
|
||||
position: relative;
|
||||
height: 1px;
|
||||
opacity: 0.3;
|
||||
margin-top: -10px;
|
||||
margin-bottom: 50px;
|
||||
.green {
|
||||
position: absolute;
|
||||
color: $session-color-green;
|
||||
background-color: $session-color-green;
|
||||
height: 6px;
|
||||
width: 130px;
|
||||
left: 50%;
|
||||
margin-left: -65px;
|
||||
top: 50%;
|
||||
margin-top: 6px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.white {
|
||||
position: absolute;
|
||||
color: none;
|
||||
height: 1px;
|
||||
width: -webkit-fill-available;
|
||||
opacity: 0.3;
|
||||
}
|
||||
}
|
||||
|
||||
.exit {
|
||||
margin-top: 10px;
|
||||
margin-left: 13px;
|
||||
|
@ -292,24 +291,29 @@ $session-compose-margin: 20px;
|
|||
}
|
||||
|
||||
.session-description-long {
|
||||
font-size: $session-font-sm;
|
||||
<<<<<<<headfont-size: $session-font-sm;
|
||||
line-height: $session-font-h3;
|
||||
margin: 0px 20px;
|
||||
=======font-size: 13px;
|
||||
>>>>>>>9732c4f4d074c1024f308cf7369fc535c26724b4margin: 0px 20px;
|
||||
font-family: 'SF Pro Display';
|
||||
}
|
||||
|
||||
.session-id-editable textarea::-webkit-inner-spin-button {
|
||||
margin: 0px 20px;
|
||||
width: -webkit-fill-available;
|
||||
flex-shrink: 0;
|
||||
user-select: all;
|
||||
overflow: hidden;
|
||||
resize: none;
|
||||
.session-id-editable {
|
||||
textarea::-webkit-inner-spin-button {
|
||||
margin: 0px 20px;
|
||||
width: -webkit-fill-available;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.session-id-editable-disabled {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.session-button {
|
||||
width: fit-content;
|
||||
margin-top: auto;
|
||||
margin-bottom: 16px;
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 3rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
@ -363,7 +367,8 @@ $session-compose-margin: 20px;
|
|||
height: inherit;
|
||||
border: none;
|
||||
flex-grow: 1;
|
||||
font-size: $session-font-md;
|
||||
font-size: $session-font-sm;
|
||||
font-family: 'SF Pro Text';
|
||||
|
||||
&:focus {
|
||||
outline: none !important;
|
||||
|
@ -623,5 +628,7 @@ $session-compose-margin: 20px;
|
|||
background-color: $session-background;
|
||||
color: $session-color-light-grey;
|
||||
border: 1px solid $session-color-dark-grey;
|
||||
font-family: 'SF Pro Text';
|
||||
font-size: $session-font-sm;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -245,7 +245,7 @@
|
|||
overflow-wrap: break-word;
|
||||
padding: 20px 5px 20px 5px;
|
||||
display: inline-block;
|
||||
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
||||
font-family: 'SpaceMono';
|
||||
user-select: all;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
}
|
||||
|
||||
@mixin session-h-title {
|
||||
font-weight: bold;
|
||||
@include fontWasaBold();
|
||||
}
|
||||
|
||||
h1 {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
// Don't forget to handle the background of the popup windows!
|
||||
|
||||
body.dark-theme {
|
||||
background-color: $color-black;
|
||||
color: $color-gray-05;
|
||||
|
@ -298,12 +297,24 @@ body.dark-theme {
|
|||
}
|
||||
}
|
||||
|
||||
/* why can't I access $session-color values here? */
|
||||
.expiredAlert {
|
||||
background: #f3f3a7;
|
||||
background: #28f587;
|
||||
color: black;
|
||||
/* biggest we can make the font without wrapping the current text at minimum app width */
|
||||
font-family: 'Wasa';
|
||||
font-size: 20px;
|
||||
height: 60px;
|
||||
|
||||
span {
|
||||
line-height: 36px;
|
||||
}
|
||||
|
||||
button {
|
||||
font-size: 14px;
|
||||
height: 36px;
|
||||
color: white;
|
||||
background: $blue;
|
||||
background: #474646;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -60,13 +60,6 @@
|
|||
</div>
|
||||
</script>
|
||||
|
||||
<script type='text/x-tmpl-mustache' id='expired_alert'>
|
||||
<a target='_blank' href='https://signal.org/download/'>
|
||||
<button class='upgrade'>{{ upgrade }}</button>
|
||||
</a>
|
||||
{{ expiredWarning }}
|
||||
</script>
|
||||
|
||||
<script type='text/x-tmpl-mustache' id='banner'>
|
||||
<div class='body'>
|
||||
<span class='icon warning'></span>
|
||||
|
|
|
@ -207,15 +207,17 @@ export class Avatar extends React.PureComponent<Props, State> {
|
|||
: this.renderIdenticon();
|
||||
}
|
||||
|
||||
private getBorderStyle(color?: string, width?: number) {
|
||||
const borderWidth = typeof width === 'number' ? width : 3;
|
||||
private getBorderStyle(_color?: string, _width?: number) {
|
||||
//const borderWidth = typeof width === 'number' ? width : 3;
|
||||
|
||||
return color
|
||||
// no border at all for now
|
||||
return undefined;
|
||||
/* return color
|
||||
? {
|
||||
borderColor: color,
|
||||
borderStyle: 'solid',
|
||||
borderWidth: borderWidth,
|
||||
}
|
||||
: undefined;
|
||||
: undefined; */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ export class ContactListItem extends React.Component<Props> {
|
|||
name={name}
|
||||
phoneNumber={phoneNumber}
|
||||
profileName={profileName}
|
||||
size={48}
|
||||
size={36}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -254,7 +254,7 @@ We don't want Jumbomoji or links.
|
|||
conversationType={'direct'}
|
||||
lastUpdated={Date.now() - 5 * 60 * 1000}
|
||||
lastMessage={{
|
||||
text: 'Download at http://signal.org',
|
||||
text: 'Download at http://getsession.org',
|
||||
}}
|
||||
onClick={result => console.log('onClick', result)}
|
||||
i18n={util.i18n}
|
||||
|
|
|
@ -85,7 +85,7 @@ export class ConversationListItem extends React.PureComponent<Props> {
|
|||
if (!(isPendingFriendRequest && !hasSentFriendRequest)) {
|
||||
borderColor = isOnline ? Colors.ONLINE : Colors.OFFLINE;
|
||||
}
|
||||
const iconSize = isPendingFriendRequest && !hasSentFriendRequest ? 28 : 48;
|
||||
const iconSize = isPendingFriendRequest && !hasSentFriendRequest ? 28 : 36;
|
||||
|
||||
return (
|
||||
<div className="module-conversation-list-item__avatar-container">
|
||||
|
|
|
@ -113,7 +113,7 @@ export class MessageSearchResult extends React.PureComponent<Props> {
|
|||
noteToSelf={isNoteToSelf}
|
||||
phoneNumber={from.phoneNumber}
|
||||
profileName={from.profileName}
|
||||
size={48}
|
||||
size={36}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -286,7 +286,7 @@ export class ConversationHeader extends React.Component<Props> {
|
|||
>
|
||||
<SessionIconButton
|
||||
iconType={SessionIconType.Ellipses}
|
||||
iconSize={SessionIconSize.Large}
|
||||
iconSize={SessionIconSize.Medium}
|
||||
onClick={this.showMenuBound}
|
||||
/>
|
||||
</ContextMenuTrigger>
|
||||
|
|
|
@ -47,7 +47,7 @@ export class EmbeddedContact extends React.Component<Props> {
|
|||
role="button"
|
||||
onClick={onClick}
|
||||
>
|
||||
{renderAvatar({ contact, i18n, size: 48, direction })}
|
||||
{renderAvatar({ contact, i18n, size: 36, direction })}
|
||||
<div className="module-embedded-contact__text-container">
|
||||
{renderName({ contact, isIncoming, module })}
|
||||
{renderContactShorthand({ contact, isIncoming, module })}
|
||||
|
|
|
@ -48,7 +48,7 @@ export class MessageDetail extends React.Component<Props> {
|
|||
name={name}
|
||||
phoneNumber={phoneNumber}
|
||||
profileName={profileName}
|
||||
size={48}
|
||||
size={36}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -22,12 +22,12 @@ import { cleanSearchTerm } from '../../util/cleanSearchTerm';
|
|||
import { SessionSearchInput } from './SessionSearchInput';
|
||||
import { SessionClosableOverlay } from './SessionClosableOverlay';
|
||||
import { MainViewController } from '../MainViewController';
|
||||
import { ContactType } from './SessionMemberListItem'
|
||||
import { ContactType } from './SessionMemberListItem';
|
||||
|
||||
export interface Props {
|
||||
searchTerm: string;
|
||||
isSecondaryDevice: boolean;
|
||||
|
||||
|
||||
conversations?: Array<ConversationListItemPropsType>;
|
||||
|
||||
searchResults?: SearchResultsProps;
|
||||
|
@ -185,14 +185,12 @@ export class LeftPaneChannelSection extends React.Component<Props, State> {
|
|||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
|
||||
return (
|
||||
<div className="session-left-pane-section-content">
|
||||
{this.renderHeader()}
|
||||
{this.state.groupAddType
|
||||
? this.renderClosableOverlay(this.state.groupAddType)
|
||||
: this.renderGroups()
|
||||
}
|
||||
: this.renderGroups()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -281,7 +279,7 @@ export class LeftPaneChannelSection extends React.Component<Props, State> {
|
|||
}
|
||||
|
||||
private renderClosableOverlay(groupType: SessionGroupType) {
|
||||
const { searchTerm } = this.props;
|
||||
const { searchTerm } = this.props;
|
||||
const { loading } = this.state;
|
||||
|
||||
const openGroupElement = (
|
||||
|
@ -301,7 +299,7 @@ export class LeftPaneChannelSection extends React.Component<Props, State> {
|
|||
overlayMode={SessionGroupType.Closed}
|
||||
onChangeSessionID={this.handleOnPasteUrl}
|
||||
onCloseClick={() => this.handleToggleOverlay(undefined)}
|
||||
onButtonClick={(groupName: string, groupMembers: Array<ContactType>) =>
|
||||
onButtonClick={(groupName: string, groupMembers: Array<ContactType>) =>
|
||||
this.onCreateClosedGroup(groupName, groupMembers)
|
||||
}
|
||||
searchTerm={searchTerm}
|
||||
|
@ -309,9 +307,12 @@ export class LeftPaneChannelSection extends React.Component<Props, State> {
|
|||
showSpinner={loading}
|
||||
/>
|
||||
);
|
||||
|
||||
const renderElement = groupType === SessionGroupType.Open ? openGroupElement : closedGroupElement;
|
||||
|
||||
|
||||
const renderElement =
|
||||
groupType === SessionGroupType.Open
|
||||
? openGroupElement
|
||||
: closedGroupElement;
|
||||
|
||||
return renderElement;
|
||||
}
|
||||
|
||||
|
@ -380,31 +381,36 @@ export class LeftPaneChannelSection extends React.Component<Props, State> {
|
|||
return false;
|
||||
}
|
||||
|
||||
joinChannelStateManager(this, channelUrlPasted, this.handleToggleOverlay(SessionGroupType.Open));
|
||||
joinChannelStateManager(
|
||||
this,
|
||||
channelUrlPasted,
|
||||
this.handleToggleOverlay(SessionGroupType.Open)
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private async onCreateClosedGroup(groupName: string, groupMembers: Array<ContactType>) {
|
||||
private async onCreateClosedGroup(
|
||||
groupName: string,
|
||||
groupMembers: Array<ContactType>
|
||||
) {
|
||||
// Validate groupName and groupMembers length
|
||||
if (
|
||||
groupMembers.length === 0 ||
|
||||
groupName.length === 0 ||
|
||||
groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH
|
||||
){
|
||||
groupMembers.length === 0 ||
|
||||
groupName.length === 0 ||
|
||||
groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
await window.doCreateGroup(groupName, groupMembers);
|
||||
this.handleToggleOverlay(undefined);
|
||||
|
||||
|
||||
window.pushToast({
|
||||
title: window.i18n('closedGroupCreatedToastTitle'),
|
||||
type: 'success',
|
||||
});
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -208,9 +208,12 @@ export class SessionChannelSettings extends React.Component<Props, any> {
|
|||
{this.renderHeader()}
|
||||
<h2>{name}</h2>
|
||||
{showMemberCount && (
|
||||
<div className="text-subtle">
|
||||
{window.i18n('members', memberCount)}
|
||||
</div>
|
||||
<>
|
||||
<div className="spacer-lg" />
|
||||
<div className="text-subtle">
|
||||
{window.i18n('members', memberCount)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
<input
|
||||
className="description"
|
||||
|
|
|
@ -183,8 +183,7 @@ export class SessionClosableOverlay extends React.Component<Props, State> {
|
|||
/>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
{showSpinner && <SessionSpinner />}
|
||||
|
||||
{isClosedGroupView && (
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React from 'react';
|
||||
import classNames from 'classnames';
|
||||
|
||||
interface Props {
|
||||
placeholder?: string;
|
||||
|
@ -30,7 +31,12 @@ export class SessionIdEditable extends React.PureComponent<Props> {
|
|||
const { placeholder, editable, text, value, maxLength} = this.props;
|
||||
|
||||
return (
|
||||
<div className="session-id-editable">
|
||||
<div
|
||||
className={classNames(
|
||||
'session-id-editable',
|
||||
!editable && 'session-id-editable-disabled'
|
||||
)}
|
||||
>
|
||||
<textarea
|
||||
className="session-id-editable-textarea"
|
||||
ref={this.inputRef}
|
||||
|
|
|
@ -261,7 +261,7 @@ function getGotOptions(): GotOptions<null> {
|
|||
ca,
|
||||
headers: {
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Signal Desktop (+https://signal.org/download)',
|
||||
'User-Agent': 'Session Desktop (+https://getsession.org)',
|
||||
},
|
||||
useElectronNet: false,
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue