Compare commits

..

91 Commits

Author SHA1 Message Date
timvisee
2cedc6e014 Bump version to 3.3.2 2020-11-16 18:07:49 +01:00
timvisee
590b56dd92 Update dependencies 2020-11-16 18:07:08 +01:00
Tim Visée
62809fb57d Merge branch 'iomintz-master-patch-75995' into 'master'
CSP: remove a bunch of unused mozilla-only domains and FXA domains

See merge request timvisee/send!7
2020-11-13 23:26:51 +00:00
io mintz
44c03e355f CSP: remove a bunch of unused mozilla-only domains and FXA domains 2020-11-13 22:24:38 +00:00
timvisee
d305e7fd57 Update dependencies 2020-11-11 13:13:57 +01:00
timvisee
33064484c4 Update dependencies 2020-10-29 13:59:06 +01:00
timvisee
283df64542 Update dependencies 2020-10-26 12:38:54 +01:00
timvisee
e8c49962da Update CONTRIBUTORS 2020-10-21 18:26:12 +02:00
timvisee
2ec69ec927 Update CODEOWNERS, use fork repository owner 2020-10-21 18:22:07 +02:00
timvisee
7eb2ea02c1 Remove unused VS Code settings 2020-10-21 18:21:29 +02:00
timvisee
e4950f6c68 Bump version to 3.3.1 2020-10-21 18:10:51 +02:00
timvisee
9f2d248e8f Update dependencies 2020-10-21 18:04:10 +02:00
timvisee
5d1ede5f63 Fix password field not being inline with password checkbox 2020-10-21 17:51:19 +02:00
timvisee
47666c153a Update dependencies to mitigate some vulnerabilities reported by npm 2020-10-21 17:23:04 +02:00
timvisee
cadf039c55 Fix release tag badge link in README 2020-10-20 20:56:23 +02:00
timvisee
dbe374bdc6 Bump version to 3.3.0 2020-10-18 15:57:36 +02:00
timvisee
48ab1cdd4e Add latest release version badge to README 2020-10-18 15:55:37 +02:00
timvisee
54150702da Update dependencies 2020-10-18 15:51:58 +02:00
Tim Visée
981f86946b Merge branch 'password-preview' into 'master'
Add password preview

See merge request timvisee/send!6
2020-10-18 13:50:17 +00:00
George Raptis
b5865f00e9 toggle preview image src instead of havingtwo images
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:42:32 +02:00
George Raptis
7797f485f2 make color dimmer
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:42:22 +02:00
George Raptis
db169cb9f0 Add password preview
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:42:14 +02:00
Tim Visée
f999c4c44f Merge branch 'favicon-progress' into 'master'
Show upload progress in favicon

See merge request timvisee/send!5
2020-10-18 13:38:37 +00:00
Ashesh Vidyut
e9b50b7682 query selector fix + revert favicon in case of cancel and complete
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:21 +02:00
Ashesh Vidyut
a3e8646ea7 constants at the top
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:18 +02:00
Ashesh Vidyut
a6a3cae5e9 pr comment changes and progress line starts from top instead of right
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:15 +02:00
Ashesh Vidyut
8d80ba1f69 fix var name
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:13 +02:00
Ashesh Vidyut
e5f76a7b1f converted division to multiplication and calculating radius inside func
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:10 +02:00
Ashesh Vidyut
acf82a4e3e varaible name changed to more meaningful
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:07 +02:00
Ashesh Vidyut
0acdf3a720 changed 100/100 to 1
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:04 +02:00
Ashesh Vidyut
305dd2f5ef color changed to #0090ed
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:02 +02:00
Ashesh Vidyut
e53571e219 removed unwanted comment
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:31:00 +02:00
Ashesh Vidyut
0eda8d2082 removed unsed code
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:30:57 +02:00
Ashesh Vidyut
1cd4adfc2a made variable name more relevant
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:30:54 +02:00
Ashesh Vidyut
0460bd2e97 favicon progress bar
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:30:43 +02:00
okyanusoz
60146541f2 Fixed a typo in encryption documentation
Co-authored-by: timvisee <tim@visee.me>
2020-10-18 15:20:34 +02:00
timvisee
79d314146b Improve README fork header 2020-10-16 18:54:19 +02:00
timvisee
72d12c3d80 Add fork description and goals to top of README 2020-10-16 18:49:33 +02:00
timvisee
1469464c43 Bump version to 3.2.1 2020-10-16 18:18:19 +02:00
Danny Coates
7cdef4bbfc added qr code to copyDialog
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 18:16:14 +02:00
timvisee
24aa1f2e17 Add badges to README 2020-10-16 16:42:40 +02:00
timvisee
7a4a4fc849 Bump version to 3.2.0 2020-10-16 16:37:39 +02:00
timvisee
97be1737cb Remove siteFeedback key as removed in Mozilla's commits 2020-10-16 16:36:00 +02:00
Tim Visée
ba33e022b0 Merge branch 'apply-mozilla-patches' into 'master'
Apply Mozilla patches

See merge request timvisee/send!3
2020-10-16 14:17:59 +00:00
timvisee
0d6b3731ef Update dependencies 2020-10-16 16:14:01 +02:00
timvisee
0be4a65904 Merge branch 'master' into apply-mozilla-patches 2020-10-16 16:11:57 +02:00
Tim Visée
54c182ab0d Merge branch '2-fix-puppeteer-timeouts-on-ci' into 'master'
Resolve "Fix puppeteer timeouts on CI"

Closes #2

See merge request timvisee/send!4
2020-10-16 14:10:56 +00:00
timvisee
b2e9907551 Increase default puppeteer timeout to 60 seconds
Fixes https://gitlab.com/timvisee/send/-/issues/2
2020-10-16 16:05:51 +02:00
Victor Ibragimov
3b4a4d82e8 Pontoon: Update Russian (ru) localization of Firefox Send
Co-authored-by: Victor Ibragimov <victor.ibragimov@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:53:02 +02:00
వీవెన్
5747f55876 Pontoon: Update Telugu (te) localization of Firefox Send
Co-authored-by: వీవెన్ <veeven@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:59 +02:00
robbp
636a239e86 Pontoon: Update Romanian (ro) localization of Firefox Send
Co-authored-by: robbp <robbpaun@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:56 +02:00
Jim Spentzos
f9a1583078 Pontoon: Update Greek (el) localization of Firefox Send
Co-authored-by: Jim Spentzos <jimspentzos2000@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:52 +02:00
Mark Heijl
0dfbe3566a Pontoon: Update Dutch (nl) localization of Firefox Send
Co-authored-by: Mark Heijl <markh@babelzilla.org>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:48 +02:00
వీవెన్
98b84ba05f Pontoon: Update Telugu (te) localization of Firefox Send
Co-authored-by: వీవెన్ <veeven@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:45 +02:00
Abdulrasheed Idris
4ad4a65924 Pontoon: Update Yoruba (yo) localization of Firefox Send
Co-authored-by: Abdulrasheed Idris <Abdulrash6211@gmail.com>
Co-authored-by: biobell2000 <biobell2000@gmail.com>
Co-authored-by: Umegbewe <nwebedujunior55@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:41 +02:00
Adaobi
6e07ecf643 Pontoon: Update Igbo (ig) localization of Firefox Send
Co-authored-by: Adaobi <ada_okeke60@ymail.com>
Co-authored-by: Umegbewe <nwebedujunior55@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:37 +02:00
Danny Coates
a39cfaf3d3 remove signin modal from privacy page. fixes #1508
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:34 +02:00
Kim YoungCheon
97e3d78ba8 Pontoon: Update Korean (ko) localization of Firefox Send
Co-authored-by: Kim YoungCheon <circcc@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:31 +02:00
Danny Coates
28c48f51d1 set downloadMetadata.status to 404 on unfound downloads. fixes #1501
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:28 +02:00
Danny Coates
239fba452a fixed dark-theme password input style. fixes #1504
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:25 +02:00
Danny Coates
3631bc8f39 restrict "share" to mobile, fixes #1505
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:22 +02:00
Danny Coates
189f4cfb9b fix main section height. fixes #1499
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:18 +02:00
Abelardo Ayala Rodríguez
deb2d41de8 Pontoon: Update Guarani (gn) localization of Firefox Send
Co-authored-by: Abelardo Ayala Rodríguez <abe_aya@hotmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:14 +02:00
Danny Coates
ab53f9cf3e give 404 and error pages the loggedin/ok treatment
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:12 +02:00
Danny Coates
facb61a9b5 updated @google-cloud/storage
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:09 +02:00
Danny Coates
d8ac413064 handle unknown errors in getMetadata
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:06 +02:00
Danny Coates
e0f51c7fde exlude puppeteer from docker build
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:52:02 +02:00
Danny Coates
c44c4ba41c support edge 18 maybe
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:59 +02:00
Danny Coates
4e9625ef36 added downloadConfirm string to noStream page
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:56 +02:00
Danny Coates
4413fc75a3 show "OK" button on complete page when logged in instead of "Try Firefox Send"
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:52 +02:00
Danny Coates
d13fda1419 🤷
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:48 +02:00
Gery Escalier
7f7ba0e33f Pontoon: Update Spanish (Spain) (es-ES) localization of Firefox Send
Co-authored-by: Gery Escalier <geryescalier@yahoo.com>
Co-authored-by: jlG <jlg.l10n.es@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:45 +02:00
timvisee
86c5553f58 Update package-lock.json 2020-10-16 15:51:43 +02:00
jlG
7e173ec23d Pontoon: Update Spanish (Spain) (es-ES) localization of Firefox Send
Co-authored-by: Paulina Rodriguez <pauli.rodriguez.c@gmail.com>
Co-authored-by: Gery Escalier <geryescalier@yahoo.com>
Co-authored-by: jlG <jlg.l10n.es@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:39 +02:00
వీవెన్
3ae6f9bd5a Pontoon: Update Telugu (te) localization of Firefox Send
Co-authored-by: వీవెన్ <veeven@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:33 +02:00
Danny Coates
b5ef1785ab replaced fxa-geodb with load balancer header
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:28 +02:00
Abelardo Ayala Rodríguez
4b1b7cb821 Pontoon: Update Guarani (gn) localization of Firefox Send
Co-authored-by: Abelardo Ayala Rodríguez <abe_aya@hotmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:51:07 +02:00
ZiriSut
b0b75f5daa Pontoon: Update Kabyle (kab) localization of Firefox Send
Co-authored-by: ZiriSut <rgebbid@gmail.com>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:50:56 +02:00
Enol
e2562aec17 Pontoon: Update Asturian (ast) localization of Firefox Send
Co-authored-by: Enol <enolp@softastur.org>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:50:46 +02:00
Danny Coates
f64e772145 added hmac auth to report route
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:50:36 +02:00
Enol
bc0ccc8e5d Pontoon: Update Asturian (ast) localization of Firefox Send
Co-authored-by: Enol <enolp@softastur.org>
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:48:02 +02:00
Danny Coates
e909a3bae8 refactored storage, style tweaks
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:47:56 +02:00
Danny Coates
abc58518ea minor style tweaks and refresh token fixes
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:47:46 +02:00
Danny Coates
4f273eca03 added oauth refresh token support
Co-authored-by: timvisee <tim@visee.me>
2020-10-16 15:46:24 +02:00
timvisee
b15c017dcd Bump version to 3.1.1 2020-10-15 21:02:25 +02:00
timvisee
bfaac8f66d Update dependencies 2020-10-15 21:00:06 +02:00
timvisee
4ffc65274b Merge branch 'dependabot/npm_and_yarn/lodash-4.17.20' 2020-10-15 20:57:47 +02:00
timvisee
1d492cd0df Merge branch 'master' into dependabot/npm_and_yarn/lodash-4.17.20 2020-10-15 20:57:09 +02:00
timvisee
b4594c5280 Merge branch 'dependabot/npm_and_yarn/elliptic-6.5.3' 2020-10-15 20:54:44 +02:00
dependabot[bot]
aa47df79f9 Bump lodash from 4.17.15 to 4.17.20
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.20.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.20)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-15 18:51:55 +00:00
dependabot[bot]
7533ab1930 Bump elliptic from 6.5.2 to 6.5.3
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-15 18:49:21 +00:00
134 changed files with 3300 additions and 2261 deletions

View File

@@ -4,4 +4,5 @@ firefox
coverage
android/app/build
app/locale.js
app/capabilities.js
app/capabilities.js
app/qrcode.js

View File

@@ -1,2 +0,0 @@
{
}

View File

@@ -1,8 +1,14 @@
Abd ar-Rahman Hamidi
Abdalrahman Hwoij
Abdulrash6211
Abdulrasheed Idris
Abelardo Ayala Rodríguez
Abhinav Adduri
Adaobi
Adnan Kičin
Adolfo Jayme Barrientos
Alberto Castro
Alexander Parada
Alexander Slovesnik
Alfredos-Panagiotis Damkalis
Aman Alam
@@ -14,9 +20,12 @@ Anika Dorn
Anish Sheela
Arash Mousavi
Artem Polivanchuk
Ashesh Vidyut
Ashikur Rahman
Ashok kumar
Ayobamiadebayo375
Balasankar C
Bald3mar
Balázs Meskó
Belayet Hossain
Benjamin Forehand Jr
@@ -27,12 +36,14 @@ Boopesh Mahendran
Brahim Essaidi
Brainlulz
Breana Gonzales
CLASSIFIED
Christian Elbrianno
Christoph Kührer
Christopher Ramírez
Chuck Harmston
Cloney 173741
Cláudio Esperança
Connor Ford
Cristian Silaghi
Cynthia Pereira
Daniel Thorn
@@ -44,6 +55,7 @@ Dhyey Thakore
Donovan Preston
Edi Santoso
Edmund Huggett
Eduard Bopp
Elisa X
Emily
Emily Hou
@@ -59,12 +71,17 @@ Francesco Lodolo [:flod]
Frederick Villaluna
G12r
Gabriela
Garysqo
Gautam krishna.R
George Raptis
Georgianizator
Gery Escalier
Gisela Solis
Gonçalo Matos
Gwenn
Hampus
Hmxhmx
Hrant
Hugo
Hugo Abreu
Hyeonseok Shin
@@ -75,26 +92,35 @@ Jae Hyeon Park
Jakob Kappel
Jakub Rychlý
Jamie
Jan Schloß
Jarmo
Jim Spentzos
Jiri Grönroos
Jirka Soukeník
Jobava
Joe Becher
Joe ST
Joergen
Johann-S
John Gruen
John Zonunmawi Vankal
Jon Buckley
Jon Vadillo
Jonathan Claudius
Jordi Cuevas
Jordi Serratosa
Joseph.maza
José Manuel
Juan Esteban Ajsivinac Sián
Juan Pablo
Juan Sián
Julio Gomez
Juraj Cigáň
Jwtiyar
Kerim Kalamujić
Khaled Hosny
Kim Ludvigsen
Kim YoungCheon
Kim Younggeon
Kohei Yoshino
Lan Glad
@@ -103,10 +129,12 @@ Laurent Jouanneau
Lobodzets
LuFlo
Luis A. Sánchez
Luis Flores Martínez
Luiz Carlos de Morais
Luiz Felipe F M Costa
Luna Jernberg
Mahay Alam Khan
Manuela Silva
Marcelo Ghelman
Marcelo Poli
Marco Aurélio
@@ -116,16 +144,21 @@ Mark Liang (You-Wen)
Marko Andrejić
Martijn Dekker
Marwan Mohamad
Mathieu Lecarme
Matjaž Horvat
Maykon Chagas
Melo46
Merike Sell
Michael Köhler
Michael Peter
Michael Wolf
Michal Stanke
Michal Vašíček
Miguel
Mikeyy
Milo
Miro Rauhala
Misael Hernández
Mozilla Pontoon
Mozilla-GitHub-Standards
Mozinet
@@ -133,6 +166,7 @@ Moḥend Belqasem
Muhend Belkacem
Muḥend Belqasem
Myungjae Won
Netza López
Nicholas Skinsacos
Nihad
Nihad Suljić
@@ -144,12 +178,14 @@ Peter deHaan
Pierre Neter
Pin-guang Chen
Piotr Drąg
Pontoon
Quentí
Quế Tùng
Rachel Tublitz
Radu Popescu
Rhoslyn Prys
RickieES
Ricky Rosario
Rimas Kudelis
Rizky Ariestiyansyah
Rob Powell
@@ -170,6 +206,7 @@ Sav22999
Schieck :)
Selim Şumlu
Selyan Sliman Amiri
Selyan Slimane Amiri
Sidak Singh Aulakh
Slimane Amiri
Slimane Selyan AMIRI
@@ -187,8 +224,11 @@ Ton
Top
Tymur Faradzhev
Uccen Marzuq
Umegbewe
Varghese Thomas
Victor Bychek
Victor Davila
Victor Ibragimov
Vimal Raghubir
Vitaliy Krutko
Weihang Lo
@@ -198,29 +238,42 @@ YFdyh000
Yassine Aït-El-Mouden
Yongmin H
You-Wen Liang (Mark)
Zhenya Tikhonov
ZiriSut
aaaaalbert
abtin
ada_okeke60
aefgh39622
alamanda
albertdcastro
alex_mayorga
ali.malek.71
ariestiyansyah
avelper
biobell2000
bulut
chilledfrogs
clouserw-mozilla-owner
dependabot[bot]
dgadelha
dskmori
ehuggett
elenatambriz
eljuno
emily-hou1
erdem cobanoglu
fcortess
gautamkrishnar
gmontagu
goofy
hello
hi
ivan.pompa
jackyzy823
jesferman1993
jlG
jnunezf96
johngruen
josotrix
jspam
julen
@@ -230,12 +283,15 @@ kumincir
leo.toneff
m4hdi.pdroid
mail
manuel padilla sanchez
manxmensch
marigalicer
marsf
merianosnikos
minvs1
mirzet.omerovic.1992
mujeebcpy
okyanusoz
p.sanroman.bengoetxea
passionforlife
paul.trevor
@@ -249,10 +305,12 @@ robbp
ruikunai
savemore99.sm
sergio
shamanchic2011
shikhar-scs
siparon
skystar-p
stripTM
sugabelly
tatalmondmush
tiagomoraismorgado
timvisee
@@ -261,6 +319,7 @@ xcffl
ybouhamam
yoshimitsu002
yusup.ramdani
zankomhamad
Μιχάλης
Марко Костић (Marko Kostić)
Ратко Вујановић

View File

@@ -16,13 +16,12 @@ RUN set -x \
--home /app \
--uid 10001 \
app
RUN npm i -g npm
COPY --chown=app:app . /app
USER app
WORKDIR /app
RUN set -x \
# Build
&& npm ci \
&& PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm ci \
&& npm run build

View File

@@ -1,7 +1,57 @@
# [![Send](./assets/icon.svg)](https://gitlab.com/timvisee/send/) Send
Based on Mozilla's [Firefox Send](https://github.com/mozilla/send),
with branding removed.
[![Build status on GitLab CI][gitlab-ci-master-badge]][gitlab-ci-link]
[![Latest release][release-badge]][release-link]
[![Docker image][docker-image-badge]][docker-image-link]
[![Project license][repo-license-badge]](LICENSE)
[docker-image-badge]: https://img.shields.io/badge/docker-latest-blue.svg
[docker-image-link]: https://gitlab.com/timvisee/send/container_registry/eyJuYW1lIjoidGltdmlzZWUvc2VuZCIsInRhZ3NfcGF0aCI6Ii90aW12aXNlZS9zZW5kL3JlZ2lzdHJ5L3JlcG9zaXRvcnkvMTQxODUwNC90YWdzP2Zvcm1hdD1qc29uIiwiaWQiOjE0MTg1MDQsImNsZWFudXBfcG9saWN5X3N0YXJ0ZWRfYXQiOm51bGx9
[gitlab-ci-link]: https://gitlab.com/timvisee/send/pipelines
[gitlab-ci-master-badge]: https://gitlab.com/timvisee/send/badges/master/pipeline.svg
[release-badge]: https://img.shields.io/github/v/tag/timvisee/send
[release-link]: https://gitlab.com/timvisee/send/-/tags
[repo-license-badge]: https://img.shields.io/github/license/timvisee/send.svg
A fork of Mozilla's [Firefox Send][mozilla-send].
Mozilla discontinued Send, this fork is a community effort to keep the project
up-to-date and alive.
- Forked [at][fork-commit] Mozilla's last publicly hosted version
- _Mozilla_ & _Firefox_ branding [is][remove-branding-pr] removed so you can legally self-host
- Kept compatible with [`ffsend`][ffsend] (CLI for Send)
- Dependencies have been updated
- Mozilla's [changes][mozilla-patches] since the fork have been selectively [merged][mozilla-patches-pr]
- Mozilla's experimental report feature, download tokens, trust warnings and FxA changes are not included
Find an up-to-date Docker image here: [docs/docker.md](docs/docker.md)
The original project by Mozilla can be found [here][mozilla-send].
The [`mozilla-master`][branch-mozilla-master] branch holds the `master` branch
as left by Mozilla.
The [`send-v3`][branch-send-v3] branch holds the commit tree of Mozilla's last
publicly hosted version, which this fork is based on.
The [`send-v4`][branch-send-v4] branch holds the commit tree of Mozilla's last
experimental version which was still a work in progress (featuring file
reporting, download tokens, trust warnings and FxA changes), this has
selectively been merged into this fork.
Please consider to [donate][donate] to allow me to keep working on this.
Thanks [Mozilla][mozilla] for building this amazing tool!
[branch-mozilla-master]: https://gitlab.com/timvisee/send/-/tree/mozilla-master
[branch-send-v3]: https://gitlab.com/timvisee/send/-/tree/send-v3
[branch-send-v4]: https://gitlab.com/timvisee/send/-/tree/send-v4
[donate]: https://timvisee.com/donate
[ffsend]: https://github.com/timvisee/ffsend
[fork-commit]: https://gitlab.com/timvisee/send/-/commit/3e9be676413a6e1baaf6a354c180e91899d10bec
[mozilla-patches-pr]: https://gitlab.com/timvisee/send/-/merge_requests/3
[mozilla-patches]: https://gitlab.com/timvisee/send/-/compare/3e9be676413a6e1baaf6a354c180e91899d10bec...mozilla-master
[mozilla-send]: https://github.com/mozilla/send
[mozilla]: https://mozilla.org/
[remove-branding-pr]: https://gitlab.com/timvisee/send/-/merge_requests/2
---
**Docs:** [FAQ](docs/faq.md), [Encryption](docs/encryption.md), [Build](docs/build.md), [Docker](docs/docker.md), [Metrics](docs/metrics.md), [More](docs/)
@@ -109,4 +159,6 @@ The android implementation is contained in the `android` directory, and can be v
[Mozilla Public License Version 2.0](LICENSE)
[qrcode.js](https://github.com/kazuhikoarase/qrcode-generator) licensed under MIT
---

View File

@@ -61,7 +61,10 @@ async function fetchWithAuth(url, params, keychain) {
const result = {};
params = params || {};
const h = await keychain.authHeader();
params.headers = new Headers({ Authorization: h });
params.headers = new Headers({
Authorization: h,
'Content-Type': 'application/json'
});
const response = await fetch(url, params);
result.response = response;
result.ok = response.ok;

View File

@@ -77,6 +77,7 @@ async function polyfillStreams() {
export default async function getCapabilities() {
const browser = browserName();
const isMobile = /mobi|android/i.test(navigator.userAgent);
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
let crypto = await checkCrypto();
const nativeStreams = checkStreams();
@@ -91,14 +92,15 @@ export default async function getCapabilities() {
account = false;
}
const share =
typeof navigator.share === 'function' && locale().startsWith('en'); // en until strings merge
isMobile &&
typeof navigator.share === 'function' &&
locale().startsWith('en'); // en until strings merge
const standalone =
window.matchMedia('(display-mode: standalone)').matches ||
navigator.standalone;
const mobileFirefox =
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
const mobileFirefox = browser === 'firefox' && isMobile;
return {
account,

View File

@@ -1,13 +1,14 @@
import FileSender from './fileSender';
import FileReceiver from './fileReceiver';
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
import * as metrics from './metrics';
import { bytes, locale } from './utils';
import okDialog from './ui/okDialog';
import FileReceiver from './fileReceiver';
import FileSender from './fileSender';
import copyDialog from './ui/copyDialog';
import faviconProgressbar from './ui/faviconProgressbar';
import okDialog from './ui/okDialog';
import shareDialog from './ui/shareDialog';
import signupDialog from './ui/signupDialog';
import surveyDialog from './ui/surveyDialog';
import { bytes, locale } from './utils';
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
export default function(state, emitter) {
let lastRender = 0;
@@ -29,6 +30,7 @@ export default function(state, emitter) {
if (updateTitle) {
emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio));
}
faviconProgressbar.updateFavicon(state.transfer.progressRatio);
render();
}
@@ -37,6 +39,7 @@ export default function(state, emitter) {
document.addEventListener('focus', () => {
updateTitle = false;
emitter.emit('DOMTitleChange', 'Send');
faviconProgressbar.updateFavicon(0);
});
checkFiles();
});
@@ -49,8 +52,8 @@ export default function(state, emitter) {
state.user.login(email);
});
emitter.on('logout', () => {
state.user.logout();
emitter.on('logout', async () => {
await state.user.logout();
metrics.loggedOut({ trigger: 'button' });
emitter.emit('pushState', '/');
});
@@ -83,6 +86,7 @@ export default function(state, emitter) {
emitter.on('cancel', () => {
state.transfer.cancel();
faviconProgressbar.updateFavicon(0);
});
emitter.on('addFiles', async ({ files }) => {
@@ -161,6 +165,7 @@ export default function(state, emitter) {
state.storage.totalUploads += 1;
const duration = Date.now() - start;
metrics.completedUpload(archive, duration);
faviconProgressbar.updateFavicon(0);
state.storage.addFile(ownedFile);
// TODO integrate password into /upload request
@@ -178,6 +183,12 @@ export default function(state, emitter) {
//cancelled. do nothing
metrics.cancelledUpload(archive, err.duration);
render();
} else if (err.message === '401') {
const refreshed = await state.user.refresh();
if (refreshed) {
return emitter.emit('upload');
}
emitter.emit('pushState', '/error');
} else {
// eslint-disable-next-line no-console
console.error(err);
@@ -229,6 +240,9 @@ export default function(state, emitter) {
if (!file.requiresPassword) {
return emitter.emit('pushState', '/404');
}
} else {
console.error(e);
return emitter.emit('pushState', '/error');
}
}
@@ -255,6 +269,7 @@ export default function(state, emitter) {
duration,
password_protected: file.requiresPassword
});
faviconProgressbar.updateFavicon(0);
} catch (err) {
if (err.message === '0') {
// download cancelled

View File

@@ -1,7 +1,7 @@
import Nanobus from 'nanobus';
import Keychain from './keychain';
import { delay, bytes, streamToArrayBuffer } from './utils';
import { downloadFile, metadata, getApiUrl } from './api';
import { downloadFile, metadata, getApiUrl, reportLink } from './api';
import { blobStream } from './streams';
import Zip from './zip';
@@ -53,6 +53,10 @@ export default class FileReceiver extends Nanobus {
this.state = 'ready';
}
async reportLink(reason) {
await reportLink(this.fileInfo.id, this.keychain, reason);
}
sendMessageToSw(msg) {
return new Promise((resolve, reject) => {
const channel = new MessageChannel();

View File

@@ -283,7 +283,7 @@ select {
@apply m-auto;
@apply py-8;
min-height: 36rem;
min-height: 42rem;
max-height: 42rem;
width: calc(100% - 3rem);
}

1076
app/qrcode.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,10 @@ module.exports = function(app = choo({ hash: true })) {
app.route('/oauth', function(state, emit) {
emit('authenticate', state.query.code, state.query.state);
});
app.route('/login', body(require('./ui/home')));
app.route('/login', function(state, emit) {
emit('replaceState', '/');
setTimeout(() => emit('render'));
});
app.route('*', body(require('./ui/notFound')));
return app;
};

View File

@@ -9,7 +9,7 @@ import contentDisposition from 'content-disposition';
let noSave = false;
const map = new Map();
const IMAGES = /.*\.(png|svg|jpg)$/;
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)(#\w+)?$/;
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
const FONT = /\.woff2?$/;

View File

@@ -54,12 +54,17 @@ class Account extends Component {
createElement() {
if (!this.enabled) {
return html`
<div></div>
<send-account></send-account>
`;
}
const user = this.state.user;
const translate = this.state.translate;
this.setLocal();
if (user.loginRequired && !this.local.loggedIn) {
return html`
<send-account></send-account>
`;
}
if (!this.local.loggedIn) {
return html`
<send-account>

View File

@@ -30,6 +30,12 @@ function password(state) {
return html`
<div class="mb-2 px-1">
<input
id="autocomplete-decoy"
class="hidden"
type="password"
value="lol"
/>
<div class="checkbox inline-block mr-3">
<input
id="add-password"
@@ -42,19 +48,36 @@ function password(state) {
${state.translate('addPassword')}
</label>
</div>
<input
id="password-input"
class="${state.archive.password
? ''
: 'invisible'} border rounded focus:border-blue-60 leading-normal my-1 py-1 px-2 h-8 dark:bg-grey-80"
autocomplete="off"
maxlength="${MAX_LENGTH}"
type="password"
oninput="${inputChanged}"
onfocus="${focused}"
placeholder="${state.translate('unlockInputPlaceholder')}"
value="${state.archive.password || ''}"
/>
<div class="relative inline-block my-1">
<input
id="password-input"
class="${state.archive.password
? ''
: 'invisible'} border rounded focus:border-blue-60 leading-normal my-1 py-1 px-2 h-8 dark:bg-grey-80"
autocomplete="off"
maxlength="${MAX_LENGTH}"
type="password"
oninput="${inputChanged}"
onfocus="${focused}"
placeholder="${state.translate('unlockInputPlaceholder')}"
value="${state.archive.password || ''}"
/>
<button
id="password-preview-button"
type="button"
class="${state.archive.password
? ''
: 'invisible'} absolute top-0 right-0 w-8 h-8"
onclick="${onPasswordPreviewButtonclicked}"
>
<img
src="${assets.get('eye.svg')}"
width="22"
height="22"
class="m-auto mt-2"
/>
</button>
</div>
<label
id="password-msg"
for="password-input"
@@ -63,15 +86,36 @@ function password(state) {
</div>
`;
function onPasswordPreviewButtonclicked(event) {
event.preventDefault();
const input = document.getElementById('password-input');
const eyeIcon = event.currentTarget.querySelector('img');
if (input.type === 'password') {
input.type = 'text';
eyeIcon.src = assets.get('eye-off.svg');
} else {
input.type = 'password';
eyeIcon.src = assets.get('eye.svg');
}
input.focus();
}
function togglePasswordInput(event) {
event.stopPropagation();
const checked = event.target.checked;
const input = document.getElementById('password-input');
const passwordPreviewButton = document.getElementById(
'password-preview-button'
);
if (checked) {
input.classList.remove('invisible');
passwordPreviewButton.classList.remove('invisible');
input.focus();
} else {
input.classList.add('invisible');
passwordPreviewButton.classList.add('invisible');
input.value = '';
document.getElementById('password-msg').textContent = '';
state.archive.password = null;

View File

@@ -1,5 +1,6 @@
const html = require('choo/html');
const { copyToClipboard } = require('../utils');
const qr = require('./qr');
module.exports = function(name, url) {
const dialog = function(state, emit, close) {
@@ -16,13 +17,23 @@ module.exports = function(name, url) {
${state.translate('copyLinkDescription')} <br />
${name}
</p>
<input
type="text"
id="share-url"
class="w-full my-4 border rounded-lg leading-loose h-12 px-2 py-1 dark:bg-grey-80"
value="${url}"
readonly="true"
/>
<div class="flex flex-row items-center justify-center w-full">
<input
type="text"
id="share-url"
class="block w-full my-4 border rounded-lg leading-loose h-12 px-2 py-1 dark:bg-grey-80"
value="${url}"
readonly="true"
/>
<button
id="qr-btn"
class="w-16 m-1 p-1"
onclick="${toggleQR}"
title="QR code"
>
${qr(url)}
</button>
</div>
<button
class="btn rounded-lg w-full flex-shrink-0 focus:outline"
onclick="${copy}"
@@ -40,6 +51,19 @@ module.exports = function(name, url) {
</send-copy-dialog>
`;
function toggleQR(event) {
event.stopPropagation();
const shareUrl = document.getElementById('share-url');
const qrBtn = document.getElementById('qr-btn');
if (shareUrl.classList.contains('hidden')) {
shareUrl.classList.replace('hidden', 'block');
qrBtn.classList.replace('w-48', 'w-16');
} else {
shareUrl.classList.replace('block', 'hidden');
qrBtn.classList.replace('w-16', 'w-48');
}
}
function copy(event) {
event.stopPropagation();
copyToClipboard(url);

View File

@@ -55,9 +55,13 @@ module.exports = function(state, emit) {
let content = '';
if (!state.fileInfo) {
state.fileInfo = createFileInfo(state);
if (!state.fileInfo.nonce) {
if (downloadMetadata.status === 404) {
return notFound(state);
}
if (!state.fileInfo.nonce) {
// coming from something like the browser back button
return location.reload();
}
}
if (!state.transfer && !state.fileInfo.requiresPassword) {

View File

@@ -2,6 +2,7 @@ const html = require('choo/html');
const assets = require('../../common/assets');
module.exports = function(state) {
const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink';
return html`
<div
id="download-complete"
@@ -10,13 +11,18 @@ module.exports = function(state) {
<h1 class="text-center text-3xl font-bold my-2">
${state.translate('downloadFinish')}
</h1>
<img src="${assets.get('completed.svg')}" class="my-12 h-48" />
<p class="text-grey-80 leading-normal dark:text-grey-40">
<img src="${assets.get('completed.svg')}" class="my-8 h-48" />
<p
class="text-grey-80 leading-normal dark:text-grey-40 ${state.user
.loggedIn
? 'hidden'
: ''}"
>
${state.translate('trySendDescription')}
</p>
<p class="my-5">
<a href="/" class="btn rounded-lg flex items-center mt-4" role="button"
>${state.translate('sendYourFilesLink')}</a
>${state.translate(btnText)}</a
>
</p>
</div>

View File

@@ -21,6 +21,12 @@ module.exports = function(state, emit) {
onsubmit="${checkPassword}"
data-no-csrf
>
<input
id="autocomplete-decoy"
class="hidden"
type="password"
value="lol"
/>
<input
id="password-input"
class="w-full border-l border-t border-b rounded-l-lg rounded-r-none ${invalid
@@ -63,8 +69,13 @@ module.exports = function(state, emit) {
const input = document.getElementById('password-input');
const btn = document.getElementById('password-btn');
label.classList.add('invisible');
input.classList.remove('border-red');
btn.classList.remove('bg-red', 'hover:bg-red', 'focus:bg-red');
input.classList.remove('border-red', 'dark:border-red-40');
btn.classList.remove(
'bg-red',
'hover:bg-red',
'focus:bg-red',
'dark:bg-red-40'
);
}
function checkPassword(event) {

View File

@@ -3,6 +3,7 @@ const assets = require('../../common/assets');
const modal = require('./modal');
module.exports = function(state, emit) {
const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink';
return html`
<main class="main">
${state.modal && modal(state, emit)}
@@ -13,12 +14,17 @@ module.exports = function(state, emit) {
${state.translate('errorPageHeader')}
</h1>
<img class="my-12 h-48" src="${assets.get('error.svg')}" />
<p class="max-w-md text-center text-grey-80 leading-normal">
<p
class="max-w-md text-center text-grey-80 leading-normal dark:text-grey-40 ${state
.user.loggedIn
? 'hidden'
: ''}"
>
${state.translate('trySendDescription')}
</p>
<p class="my-5">
<a href="/" class="btn rounded-lg flex items-center" role="button"
>${state.translate('sendYourFilesLink')}</a
>${state.translate(btnText)}</a
>
</p>
</section>

View File

@@ -0,0 +1,41 @@
const { platform } = require('../utils');
const assets = require('../../common/assets');
const size = 32;
const loaderWidth = 5;
const loaderColor = '#0090ed';
function drawCircle(canvas, context, color, lineWidth, outerWidth, percent) {
canvas.width = canvas.height = outerWidth;
context.translate(outerWidth * 0.5, outerWidth * 0.5);
context.rotate(-Math.PI * 0.5);
const radius = (outerWidth - lineWidth) * 0.5;
context.beginPath();
context.arc(0, 0, radius, 0, Math.PI * 2 * percent, false);
context.strokeStyle = color;
context.lineCap = 'square';
context.lineWidth = lineWidth;
context.stroke();
}
function drawNewFavicon(progressRatio) {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
drawCircle(canvas, context, '#efefef', loaderWidth, size, 1);
drawCircle(canvas, context, loaderColor, loaderWidth, size, progressRatio);
return canvas.toDataURL();
}
module.exports.updateFavicon = function(progressRatio) {
if (platform() === 'web') {
const link = document.querySelector("link[rel='icon'][sizes='32x32']");
const progress = progressRatio * 100;
if (progress === 0 || progress === 100) {
link.type = 'image/png';
link.href = assets.get('favicon-32x32.png');
return;
}
link.href = drawNewFavicon(progressRatio);
}
};

View File

@@ -33,7 +33,7 @@ class Header extends Component {
alt="${this.state.translate('title')}"
src="${assets.get('icon.svg')}"
/>
<svg class="w-48 md:w-64">
<svg viewBox="66 0 340 64" class="w-48 md:w-64">
<use xlink:href="${assets.get('wordmark.svg')}#logo" />
</svg>
</a>

View File

@@ -2,6 +2,7 @@ const html = require('choo/html');
const modal = require('./modal');
module.exports = function(state, emit) {
state.modal = null;
return html`
<main class="main">
${state.modal && modal(state, emit)}

View File

@@ -6,7 +6,7 @@ module.exports = function(state, emit) {
class="absolute inset-0 flex items-center justify-center overflow-hidden z-40 bg-white md:rounded-xl md:my-8 dark:bg-grey-90"
>
<div
class="h-full w-full max-h-screen absolute top-0 flex items-center justify-center"
class="h-full w-full max-h-screen absolute top-0 flex justify-center md:items-center"
>
<div class="w-full">
${state.modal(state, emit, close)}

View File

@@ -19,9 +19,9 @@ module.exports = function(state, emit) {
<form class="md:w-128" onsubmit=${submit}>
<fieldset class="border rounded p-4 my-4" onchange=${optionChanged}>
<div class="flex items-center mb-2">
<img class="mr-3 flex-shrink-0" src="${assets.get(
'blue_file.svg'
)}"/>
<svg class="h-8 w-6 mr-3 flex-shrink-0 text-white dark:text-grey-90">
<use xlink:href="${assets.get('blue_file.svg')}#icon"/>
</svg>
<p class="flex-grow">
<h1 class="text-base font-medium word-break-all">${
archive.name
@@ -55,6 +55,11 @@ module.exports = function(state, emit) {
value="${state.translate('copyLinkButton')}"
title="${state.translate('copyLinkButton')}"
type="submit" />
<p
class="text-grey-80 leading-normal dark:text-grey-40 font-semibold text-center md:my-8 md:text-left"
>
${state.translate('downloadConfirmDescription')}
</p>
</form>
</div>
`;
@@ -64,6 +69,7 @@ module.exports = function(state, emit) {
const choice = event.target.value;
const button = event.currentTarget.nextElementSibling;
let title = button.title;
console.error(choice, title);
switch (choice) {
case 'copy':
title = state.translate('copyLinkButton');

View File

@@ -3,6 +3,7 @@ const assets = require('../../common/assets');
const modal = require('./modal');
module.exports = function(state, emit) {
const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink';
return html`
<main class="main">
${state.modal && modal(state, emit)}
@@ -13,12 +14,17 @@ module.exports = function(state, emit) {
${state.translate('expiredTitle')}
</h1>
<img src="${assets.get('notFound.svg')}" class="my-12" />
<p class="max-w-md text-center text-grey-80 leading-normal">
<p
class="max-w-md text-center text-grey-80 leading-normal dark:text-grey-40 ${state
.user.loggedIn
? 'hidden'
: ''}"
>
${state.translate('trySendDescription')}
</p>
<p class="my-5">
<a href="/" class="btn rounded-lg flex items-center" role="button"
>${state.translate('sendYourFilesLink')}</a
>${state.translate(btnText)}</a
>
</p>
</section>

10
app/ui/qr.js Normal file
View File

@@ -0,0 +1,10 @@
const raw = require('choo/html/raw');
const qrcode = require('../qrcode');
module.exports = function(url) {
const gen = qrcode(5, 'L');
gen.addData(url);
gen.make();
const qr = gen.createSvgTag({ scalable: true });
return raw(qr);
};

View File

@@ -1,22 +1,19 @@
const html = require('choo/html');
const assets = require('../../common/assets');
const { bytes, platform } = require('../utils');
const { bytes } = require('../utils');
const { canceledSignup, submittedSignup } = require('../metrics');
module.exports = function(trigger) {
return function(state, emit, close) {
const DAYS = Math.floor(state.LIMITS.MAX_EXPIRE_SECONDS / 86400);
const hidden = platform() === 'android' ? 'hidden' : '';
let submitting = false;
return html`
<send-signup-dialog
class="flex flex-col lg:flex-row justify-center px-8 md:px-24 w-full h-full"
class="flex flex-col justify-center my-16 md:my-0 px-8 md:px-24 w-full h-full"
>
<img src="${assets.get('master-logo.svg')}" class="h-16 mt-1 mb-4" />
<section
class="flex flex-col flex-shrink-0 self-center lg:mx-6 lg:max-w-xs"
>
<h1 class="text-3xl font-bold text-center lg:text-left">
<section class="flex flex-col flex-shrink-0 self-center">
<h1 class="text-3xl font-bold text-center">
${state.translate('accountBenefitTitle')}
</h1>
<ul
@@ -32,17 +29,14 @@ module.exports = function(trigger) {
${state.translate('accountBenefitTimeLimit', { count: DAYS })}
</li>
<li>${state.translate('accountBenefitSync')}</li>
<li>${state.translate('accountBenefitMoz')}</li>
</ul>
</section>
<section
class="flex flex-col flex-grow m-4 md:self-center md:w-128 lg:max-w-xs"
>
<section class="flex flex-col flex-grow m-4 md:self-center md:w-128">
<form onsubmit=${submitEmail} data-no-csrf>
<input
id="email-input"
type="email"
class="${hidden} border rounded-lg w-full px-2 py-1 h-12 mb-3 text-lg text-grey-70 leading-loose dark:bg-grey-80 dark:text-white"
class="hidden border rounded-lg w-full px-2 py-1 h-12 mb-3 text-lg text-grey-70 leading-loose dark:bg-grey-80 dark:text-white"
placeholder=${state.translate('emailPlaceholder')}
/>
<input
@@ -53,13 +47,17 @@ module.exports = function(trigger) {
type="submit"
/>
</form>
<button
class="my-3 link-blue font-medium"
title="${state.translate('deletePopupCancel')}"
onclick=${cancel}
>
${state.translate('deletePopupCancel')}
</button>
${state.user.loginRequired
? ''
: html`
<button
class="my-3 link-blue font-medium"
title="${state.translate('deletePopupCancel')}"
onclick=${cancel}
>
${state.translate('deletePopupCancel')}
</button>
`}
</section>
</send-signup-dialog>
`;

View File

@@ -76,6 +76,10 @@ export default class User {
return this.info.access_token;
}
get refreshToken() {
return this.info.refresh_token;
}
get maxSize() {
return this.loggedIn
? this.limits.MAX_FILE_SIZE
@@ -135,6 +139,7 @@ export default class User {
const code_challenge = await preparePkce(this.storage);
const options = {
action: 'email',
access_type: 'offline',
client_id: this.authConfig.client_id,
code_challenge,
code_challenge_method: 'S256',
@@ -192,12 +197,69 @@ export default class User {
});
const userInfo = await infoResponse.json();
userInfo.access_token = auth.access_token;
userInfo.refresh_token = auth.refresh_token;
userInfo.fileListKey = await getFileListKey(this.storage, auth.keys_jwe);
this.info = userInfo;
this.storage.remove('pkceVerifier');
}
logout() {
async refresh() {
if (!this.refreshToken) {
return false;
}
try {
const tokenResponse = await fetch(this.authConfig.token_endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
client_id: this.authConfig.client_id,
grant_type: 'refresh_token',
refresh_token: this.refreshToken
})
});
if (tokenResponse.ok) {
const auth = await tokenResponse.json();
const info = { ...this.info, access_token: auth.access_token };
this.info = info;
return true;
}
} catch (e) {
console.error(e);
}
await this.logout();
return false;
}
async logout() {
try {
if (this.refreshToken) {
await fetch(this.authConfig.revocation_endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
refresh_token: this.refreshToken
})
});
}
if (this.bearerToken) {
await fetch(this.authConfig.revocation_endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
token: this.bearerToken
})
});
}
} catch (e) {
console.error(e);
// oh well, we tried
}
this.storage.clearLocalFiles();
this.info = {};
}
@@ -211,6 +273,14 @@ export default class User {
const key = b64ToArray(this.info.fileListKey);
const sha = await crypto.subtle.digest('SHA-256', key);
const kid = arrayToB64(new Uint8Array(sha)).substring(0, 16);
const retry = async () => {
const refreshed = await this.refresh();
if (refreshed) {
return await this.syncFileList();
} else {
return { incoming: true };
}
};
try {
const encrypted = await getFileList(this.bearerToken, kid);
const decrypted = await streamToArrayBuffer(
@@ -219,8 +289,7 @@ export default class User {
list = JSON.parse(textDecoder.decode(decrypted));
} catch (e) {
if (e.message === '401') {
this.logout();
return { incoming: true };
return retry(e);
}
}
changes = await this.storage.merge(list);
@@ -236,7 +305,9 @@ export default class User {
);
await setFileList(this.bearerToken, kid, encrypted);
} catch (e) {
//
if (e.message === '401') {
return retry(e);
}
}
return changes;
}

View File

@@ -142,12 +142,16 @@ function openLinksInNewTab(links, should = true) {
function browserName() {
try {
// order of these matters
if (/firefox/i.test(navigator.userAgent)) {
return 'firefox';
}
if (/edge/i.test(navigator.userAgent)) {
return 'edge';
}
if (/edg/i.test(navigator.userAgent)) {
return 'edgium';
}
if (/trident/i.test(navigator.userAgent)) {
return 'ie';
}

1
assets/eye-off.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#8795a1" d="M256.1 144.8c56.2 0 101.9 45.3 101.9 101.1 0 13.1-2.6 25.5-7.3 37l59.5 59c30.8-25.5 55-58.4 69.9-96-35.3-88.7-122.3-151.6-224.2-151.6-28.5 0-55.8 5.1-81.1 14.1l44 43.7c11.6-4.6 24.1-7.3 37.3-7.3zM52.4 89.7l46.5 46.1 9.4 9.3c-33.9 26-60.4 60.8-76.3 100.8 35.2 88.7 122.2 151.6 224.1 151.6 31.6 0 61.7-6.1 89.2-17l8.6 8.5 59.7 59 25.9-25.7L78.2 64 52.4 89.7zM165 201.4l31.6 31.3c-1 4.2-1.6 8.7-1.6 13.1 0 33.5 27.3 60.6 61.1 60.6 4.5 0 9-.6 13.2-1.6l31.6 31.3c-13.6 6.7-28.7 10.7-44.8 10.7-56.2 0-101.9-45.3-101.9-101.1 0-15.8 4.1-30.7 10.8-44.3zm87.8-15.7l64.2 63.7.4-3.2c0-33.5-27.3-60.6-61.1-60.6l-3.5.1z"/></svg>

After

Width:  |  Height:  |  Size: 701 B

1
assets/eye.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#8795a1" d="M256 105c-101.8 0-188.4 62.4-224 151 35.6 88.6 122.2 151 224 151s188.4-62.4 224-151c-35.6-88.6-122.2-151-224-151zm0 251.7c-56 0-101.8-45.3-101.8-100.7S200 155.3 256 155.3 357.8 200.6 357.8 256 312 356.7 256 356.7zm0-161.1c-33.6 0-61.1 27.2-61.1 60.4s27.5 60.4 61.1 60.4 61.1-27.2 61.1-60.4-27.5-60.4-61.1-60.4z"/></svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -1,61 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg7"
sodipodi:docname="wordmark.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata13">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs11" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1874"
inkscape:window-height="1016"
id="namedview9"
showgrid="false"
inkscape:zoom="3.337544"
inkscape:cx="82.487885"
inkscape:cy="47.814478"
inkscape:window-x="1966"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg7" />
<symbol
id="logo"
viewBox="66 0 340 64">
<path
d="m 105.17,33.27 c -1.04895,-0.638175 -2.18377,-1.123082 -3.37,-1.44 -1.25,-0.34 -2.46,-0.63 -3.63,-0.88 l -3.08,-0.7 C 94.22073,30.069182 93.37751,29.78027 92.58,29.39 91.90449,29.074134 91.31719,28.596738 90.87,28 c -0.43741,-0.644047 -0.65489,-1.412243 -0.62,-2.19 -0.0406,-1.405196 0.53693,-2.75754 1.58,-3.7 1.06,-1 2.73,-1.44 5,-1.44 1.76437,-0.07198 3.51559,0.332147 5.07,1.17 1.35935,0.80694 2.51833,1.911219 3.39,3.23 l 2.79,-2.18 c -1.26761,-1.5933 -2.84201,-2.916072 -4.63,-3.89 -2.04373,-1.017745 -4.30804,-1.512526 -6.59,-1.44 -1.40785,-0.02195 -2.80876,0.201387 -4.14,0.66 -1.16063,0.399115 -2.24085,1.001871 -3.19,1.78 -0.8713,0.712445 -1.5718,1.611145 -2.05,2.63 -0.4819,1.011666 -0.72807,2.119452 -0.72,3.24 -0.05,1.231532 0.24064,2.452997 0.84,3.53 0.55827,0.895068 1.31002,1.653654 2.2,2.22 0.94422,0.612326 1.97599,1.077636 3.06,1.38 1.13,0.32 2.29,0.6 3.47,0.84 l 3.26,0.74 c 0.96945,0.22193 1.90929,0.557589 2.8,1 0.77256,0.367753 1.45522,0.900225 2,1.56 0.51019,0.701297 0.77072,1.553301 0.74,2.42 0.0438,1.566414 -0.62122,3.069031 -1.81,4.09 -1.52512,1.147855 -3.41702,1.699065 -5.32,1.55 -4.03416,0.15747 -7.83041,-1.90763 -9.89,-5.38 l -3,2.34 c 1.3876,1.880136 3.1735,3.430427 5.23,4.54 2.3855,1.197767 5.03194,1.782045 7.7,1.7 1.49114,0.02151 2.97422,-0.222285 4.38,-0.72 1.21788,-0.44929 2.33816,-1.128248 3.3,-2 0.88604,-0.797749 1.60053,-1.767412 2.1,-2.85 0.48895,-1.06318 0.74142,-2.219779 0.74,-3.39 0.0397,-1.336553 -0.30755,-2.656119 -1,-3.8 -0.62101,-0.95962 -1.44763,-1.769154 -2.42,-2.37 z m 27.51,-4.72 c -1.0207,-1.016684 -2.23916,-1.813109 -3.58,-2.34 -1.42831,-0.567565 -2.95311,-0.852828 -4.49,-0.84 -1.58532,-0.01887 -3.15769,0.287432 -4.62,0.9 -1.3691,0.572827 -2.61257,1.408599 -3.66,2.46 -2.1451,2.217513 -3.33989,5.184759 -3.33,8.27 -0.0138,1.54162 0.26439,3.071916 0.82,4.51 0.5255,1.363982 1.32922,2.603618 2.36,3.64 1.06096,1.043663 2.31862,1.866239 3.7,2.42 1.53222,0.610739 3.17082,0.909903 4.82,0.88 2.13421,0.08534 4.25095,-0.416179 6.12,-1.45 1.69947,-1.049265 3.13073,-2.480527 4.18,-4.18 l -2.88,-1.69 c -1.41279,2.768876 -4.32635,4.443291 -7.43,4.27 -1.09666,0.02103 -2.18793,-0.158593 -3.22,-0.53 -0.93382,-0.341463 -1.79784,-0.849713 -2.55,-1.5 -0.72694,-0.645531 -1.33013,-1.418157 -1.78,-2.28 -0.47812,-0.903522 -0.77374,-1.892313 -0.87,-2.91 h 19.59 v -1.52 c 0.0166,-1.555338 -0.27566,-3.098506 -0.86,-4.54 -0.54053,-1.333176 -1.33916,-2.54641 -2.35,-3.57 z m -16.28,6.67 c 0.18109,-0.958759 0.51895,-1.881119 1,-2.73 0.47186,-0.820757 1.07675,-1.557447 1.79,-2.18 0.72195,-0.61779 1.5482,-1.102022 2.44,-1.43 0.95944,-0.356614 1.97651,-0.532906 3,-0.52 4.04346,-0.224227 7.5255,2.82256 7.84,6.86 z M 158.82,28 c -0.83726,-0.883328 -1.8626,-1.566885 -3,-2 -1.25447,-0.462049 -2.58329,-0.689169 -3.92,-0.67 -1.60057,-0.03131 -3.18086,0.362037 -4.58,1.14 -1.28188,0.720594 -2.36173,1.752297 -3.14,3 v -3.65 h -3.29 V 48 h 3.37 V 35.67 c -0.0102,-1.001391 0.16968,-1.995625 0.53,-2.93 0.3373,-0.856524 0.84023,-1.638106 1.48,-2.3 0.62704,-0.649648 1.38331,-1.160636 2.22,-1.5 0.87089,-0.363534 1.8063,-0.547214 2.75,-0.54 1.87023,-0.128793 3.70135,0.578019 5,1.93 1.22147,1.441484 1.85048,3.292756 1.76,5.18 V 48 h 3.41 V 35.34 c 0.0211,-1.424123 -0.20214,-2.84132 -0.66,-4.19 -0.40985,-1.176324 -1.06809,-2.250653 -1.93,-3.15 z m 27,-12.42 v 14.1 c -0.43264,-0.685249 -0.96517,-1.302051 -1.58,-1.83 -0.60967,-0.53196 -1.28117,-0.98858 -2,-1.36 -0.73088,-0.369676 -1.5029,-0.651634 -2.3,-0.84 -0.78611,-0.187908 -1.59174,-0.281898 -2.4,-0.28 -1.50724,-0.0078 -3.00162,0.277523 -4.4,0.84 -1.34071,0.551089 -2.56038,1.35967 -3.59,2.38 -1.03697,1.047216 -1.85907,2.287165 -2.42,3.65 -1.17023,2.996466 -1.17023,6.323534 0,9.32 0.55964,1.361695 1.37424,2.603955 2.4,3.66 1.02081,1.031107 2.2428,1.841226 3.59,2.38 1.40561,0.561607 2.90636,0.846817 4.42,0.84 0.80981,-0.0026 1.6161,-0.106786 2.4,-0.31 0.79636,-0.199929 1.56783,-0.488392 2.3,-0.86 0.72123,-0.371416 1.39312,-0.831661 2,-1.37 0.61025,-0.540083 1.14205,-1.162767 1.58,-1.85 v 4 h 3.33 V 15.59 Z m -0.37,24.58 c -1.76276,4.229524 -6.6195,6.23041 -10.85,4.47 v 0 c -0.97862,-0.401365 -1.86378,-1.000551 -2.6,-1.76 -0.7522,-0.76312 -1.34086,-1.671634 -1.73,-2.67 -0.41974,-1.066531 -0.63023,-2.203893 -0.62,-3.35 -0.0103,-1.129892 0.20027,-2.250911 0.62,-3.3 0.39328,-0.993283 0.98151,-1.897738 1.73,-2.66 0.74207,-0.76001 1.62521,-1.368023 2.6,-1.79 2.07874,-0.890012 4.43126,-0.890012 6.51,0 0.98149,0.434716 1.87338,1.048526 2.63,1.81 0.74927,0.763509 1.33458,1.672102 1.72,2.67 0.41464,1.036611 0.62516,2.14355 0.62,3.26 -1.3e-4,1.141508 -0.22084,2.272237 -0.65,3.33 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:currentColor"
sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
</symbol>
<use
xlink:href="#logo"
id="use5" />
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<symbol id="logo">
<path d="m 105.17,33.27 c -1.04895,-0.638175 -2.18377,-1.123082 -3.37,-1.44 -1.25,-0.34 -2.46,-0.63 -3.63,-0.88 l -3.08,-0.7 C 94.22073,30.069182 93.37751,29.78027 92.58,29.39 91.90449,29.074134 91.31719,28.596738 90.87,28 c -0.43741,-0.644047 -0.65489,-1.412243 -0.62,-2.19 -0.0406,-1.405196 0.53693,-2.75754 1.58,-3.7 1.06,-1 2.73,-1.44 5,-1.44 1.76437,-0.07198 3.51559,0.332147 5.07,1.17 1.35935,0.80694 2.51833,1.911219 3.39,3.23 l 2.79,-2.18 c -1.26761,-1.5933 -2.84201,-2.916072 -4.63,-3.89 -2.04373,-1.017745 -4.30804,-1.512526 -6.59,-1.44 -1.40785,-0.02195 -2.80876,0.201387 -4.14,0.66 -1.16063,0.399115 -2.24085,1.001871 -3.19,1.78 -0.8713,0.712445 -1.5718,1.611145 -2.05,2.63 -0.4819,1.011666 -0.72807,2.119452 -0.72,3.24 -0.05,1.231532 0.24064,2.452997 0.84,3.53 0.55827,0.895068 1.31002,1.653654 2.2,2.22 0.94422,0.612326 1.97599,1.077636 3.06,1.38 1.13,0.32 2.29,0.6 3.47,0.84 l 3.26,0.74 c 0.96945,0.22193 1.90929,0.557589 2.8,1 0.77256,0.367753 1.45522,0.900225 2,1.56 0.51019,0.701297 0.77072,1.553301 0.74,2.42 0.0438,1.566414 -0.62122,3.069031 -1.81,4.09 -1.52512,1.147855 -3.41702,1.699065 -5.32,1.55 -4.03416,0.15747 -7.83041,-1.90763 -9.89,-5.38 l -3,2.34 c 1.3876,1.880136 3.1735,3.430427 5.23,4.54 2.3855,1.197767 5.03194,1.782045 7.7,1.7 1.49114,0.02151 2.97422,-0.222285 4.38,-0.72 1.21788,-0.44929 2.33816,-1.128248 3.3,-2 0.88604,-0.797749 1.60053,-1.767412 2.1,-2.85 0.48895,-1.06318 0.74142,-2.219779 0.74,-3.39 0.0397,-1.336553 -0.30755,-2.656119 -1,-3.8 -0.62101,-0.95962 -1.44763,-1.769154 -2.42,-2.37 z m 27.51,-4.72 c -1.0207,-1.016684 -2.23916,-1.813109 -3.58,-2.34 -1.42831,-0.567565 -2.95311,-0.852828 -4.49,-0.84 -1.58532,-0.01887 -3.15769,0.287432 -4.62,0.9 -1.3691,0.572827 -2.61257,1.408599 -3.66,2.46 -2.1451,2.217513 -3.33989,5.184759 -3.33,8.27 -0.0138,1.54162 0.26439,3.071916 0.82,4.51 0.5255,1.363982 1.32922,2.603618 2.36,3.64 1.06096,1.043663 2.31862,1.866239 3.7,2.42 1.53222,0.610739 3.17082,0.909903 4.82,0.88 2.13421,0.08534 4.25095,-0.416179 6.12,-1.45 1.69947,-1.049265 3.13073,-2.480527 4.18,-4.18 l -2.88,-1.69 c -1.41279,2.768876 -4.32635,4.443291 -7.43,4.27 -1.09666,0.02103 -2.18793,-0.158593 -3.22,-0.53 -0.93382,-0.341463 -1.79784,-0.849713 -2.55,-1.5 -0.72694,-0.645531 -1.33013,-1.418157 -1.78,-2.28 -0.47812,-0.903522 -0.77374,-1.892313 -0.87,-2.91 h 19.59 v -1.52 c 0.0166,-1.555338 -0.27566,-3.098506 -0.86,-4.54 -0.54053,-1.333176 -1.33916,-2.54641 -2.35,-3.57 z m -16.28,6.67 c 0.18109,-0.958759 0.51895,-1.881119 1,-2.73 0.47186,-0.820757 1.07675,-1.557447 1.79,-2.18 0.72195,-0.61779 1.5482,-1.102022 2.44,-1.43 0.95944,-0.356614 1.97651,-0.532906 3,-0.52 4.04346,-0.224227 7.5255,2.82256 7.84,6.86 z M 158.82,28 c -0.83726,-0.883328 -1.8626,-1.566885 -3,-2 -1.25447,-0.462049 -2.58329,-0.689169 -3.92,-0.67 -1.60057,-0.03131 -3.18086,0.362037 -4.58,1.14 -1.28188,0.720594 -2.36173,1.752297 -3.14,3 v -3.65 h -3.29 V 48 h 3.37 V 35.67 c -0.0102,-1.001391 0.16968,-1.995625 0.53,-2.93 0.3373,-0.856524 0.84023,-1.638106 1.48,-2.3 0.62704,-0.649648 1.38331,-1.160636 2.22,-1.5 0.87089,-0.363534 1.8063,-0.547214 2.75,-0.54 1.87023,-0.128793 3.70135,0.578019 5,1.93 1.22147,1.441484 1.85048,3.292756 1.76,5.18 V 48 h 3.41 V 35.34 c 0.0211,-1.424123 -0.20214,-2.84132 -0.66,-4.19 -0.40985,-1.176324 -1.06809,-2.250653 -1.93,-3.15 z m 27,-12.42 v 14.1 c -0.43264,-0.685249 -0.96517,-1.302051 -1.58,-1.83 -0.60967,-0.53196 -1.28117,-0.98858 -2,-1.36 -0.73088,-0.369676 -1.5029,-0.651634 -2.3,-0.84 -0.78611,-0.187908 -1.59174,-0.281898 -2.4,-0.28 -1.50724,-0.0078 -3.00162,0.277523 -4.4,0.84 -1.34071,0.551089 -2.56038,1.35967 -3.59,2.38 -1.03697,1.047216 -1.85907,2.287165 -2.42,3.65 -1.17023,2.996466 -1.17023,6.323534 0,9.32 0.55964,1.361695 1.37424,2.603955 2.4,3.66 1.02081,1.031107 2.2428,1.841226 3.59,2.38 1.40561,0.561607 2.90636,0.846817 4.42,0.84 0.80981,-0.0026 1.6161,-0.106786 2.4,-0.31 0.79636,-0.199929 1.56783,-0.488392 2.3,-0.86 0.72123,-0.371416 1.39312,-0.831661 2,-1.37 0.61025,-0.540083 1.14205,-1.162767 1.58,-1.85 v 4 h 3.33 V 15.59 Z m -0.37,24.58 c -1.76276,4.229524 -6.6195,6.23041 -10.85,4.47 v 0 c -0.97862,-0.401365 -1.86378,-1.000551 -2.6,-1.76 -0.7522,-0.76312 -1.34086,-1.671634 -1.73,-2.67 -0.41974,-1.066531 -0.63023,-2.203893 -0.62,-3.35 -0.0103,-1.129892 0.20027,-2.250911 0.62,-3.3 0.39328,-0.993283 0.98151,-1.897738 1.73,-2.66 0.74207,-0.76001 1.62521,-1.368023 2.6,-1.79 2.07874,-0.890012 4.43126,-0.890012 6.51,0 0.98149,0.434716 1.87338,1.048526 2.63,1.81 0.74927,0.763509 1.33458,1.672102 1.72,2.67 0.41464,1.036611 0.62516,2.14355 0.62,3.26 -1.3e-4,1.141508 -0.22084,2.272237 -0.65,3.33 z" fill="currentColor"/>
</symbol>
<use xlink:href="#logo"/>
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -2,4 +2,5 @@ last 2 chrome versions
last 2 firefox versions
last 2 safari versions
last 2 edge versions
edge 18
firefox esr

View File

@@ -1,2 +1,2 @@
# flod as main contact for string changes
public/locales/en-US/*.ftl @flodolo
# timvisee as main contact for string changes
public/locales/en-US/*.ftl @timvisee

View File

@@ -1,6 +1,6 @@
# File Encryption
Send use 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js).
Send uses 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js).
## Steps

3467
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"name": "send",
"description": "File Sharing Experiment",
"version": "3.1.0",
"version": "3.3.2",
"author": "Mozilla (https://mozilla.org)",
"contributors": [
"Tim Visee <3a4fb3964f@sinenomine.email> (https://timvisee.com)"
@@ -64,28 +64,28 @@
"node": "^12.16.3"
},
"devDependencies": {
"@babel/core": "^7.12.0",
"@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/core": "^7.12.3",
"@babel/plugin-proposal-class-properties": "^7.12.1",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/preset-env": "^7.12.0",
"@babel/preset-env": "^7.12.1",
"@dannycoates/webcrypto-liner": "^0.1.37",
"@fullhuman/postcss-purgecss": "^1.3.0",
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
"@sentry/browser": "^5.26.0",
"@sentry/browser": "^5.27.4",
"asmcrypto.js": "^0.22.0",
"babel-loader": "^8.0.6",
"babel-loader": "^8.2.1",
"babel-plugin-istanbul": "^5.2.0",
"base64-js": "^1.3.1",
"base64-js": "^1.5.1",
"content-disposition": "^0.5.3",
"copy-webpack-plugin": "^5.1.2",
"core-js": "^3.4.0",
"core-js": "^3.7.0",
"crc": "^3.8.0",
"cross-env": "^6.0.3",
"css-loader": "^3.6.0",
"css-mqpacker": "^7.0.0",
"cssnano": "^4.1.10",
"eslint": "^6.6.0",
"eslint-config-prettier": "^6.12.0",
"eslint-config-prettier": "^6.15.0",
"eslint-plugin-mocha": "^6.2.1",
"eslint-plugin-node": "^10.0.0",
"eslint-plugin-security": "^1.4.0",
@@ -118,12 +118,12 @@
"script-loader": "^0.7.2",
"sinon": "^7.5.0",
"string-hash": "^1.1.3",
"stylelint": "^11.1.1",
"stylelint": "^13.7.2",
"stylelint-config-standard": "^19.0.0",
"stylelint-no-unsupported-browser-features": "^3.0.2",
"stylelint-no-unsupported-browser-features": "^4.1.4",
"svgo": "^1.3.2",
"svgo-loader": "^2.2.1",
"tailwindcss": "^1.9.2",
"tailwindcss": "^1.9.6",
"val-loader": "^1.1.1",
"webpack": "4.38.0",
"webpack-cli": "^3.3.12",
@@ -136,16 +136,15 @@
"@dannycoates/express-ws": "^5.0.3",
"@fluent/bundle": "^0.13.0",
"@fluent/langneg": "^0.3.0",
"@google-cloud/storage": "^4.1.1",
"@sentry/node": "^5.26.0",
"aws-sdk": "^2.771.0",
"@google-cloud/storage": "^5.5.0",
"@sentry/node": "^5.27.4",
"aws-sdk": "^2.792.0",
"body-parser": "^1.19.0",
"choo": "^7.0.0",
"cldr-core": "^35.1.0",
"configstore": "github:dannycoates/configstore#master",
"convict": "^5.2.0",
"express": "^4.17.1",
"fxa-geodb": "^1.0.4",
"helmet": "^3.23.3",
"mkdirp": "^0.5.1",
"mozlog": "^2.2.0",

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Comentarios
importingFile = Se ye importando…
encryptingFile = Se ye cifrando…
decryptingFile = Se ye descifrando…

View File

@@ -1,5 +1,4 @@
title = فَيَرفُكس سِنْد
siteFeedback = الانطباعات
importingFile = يستورد…
encryptingFile = يعمّي…
decryptingFile = يفك التعمية…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Comentarios
importingFile = Importando...
encryptingFile = Cifrando...
decryptingFile = Descifrando...
@@ -107,7 +106,7 @@ tooManyArchives =
*[other] Namái se permiten { $count } archivos
}
expiredTitle = Esti enllaz caducó.
notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola versión última de { -firefox } y cola versión actual de la mayoría de restoladores.
notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola última versión de { -firefox } y l'actual de la mayoría de restoladores.
downloadFirefox = Baxar { -firefox }
legalTitle = Avisu de privacidá de { -send-short-brand }
legalDateStamp = Versión 1.0, con data del 12 de marzu de 2019
@@ -131,8 +130,8 @@ accountBenefitLargeFiles = Comparti ficheros d'hasta { $size }
accountBenefitDownloadCount = Comparti ficheros con más xente
accountBenefitTimeLimit =
{ $count ->
[one] Caltén activos los enllaces demientres 1 día
*[other] Caltén activos los enllaces demientres { $count } díes
[one] Caltién activos los enllaces demientres 1 día
*[other] Caltién activos los enllaces demientres { $count } díes
}
accountBenefitSync = Xestiona los ficheros compartíos dende cualesquier preséu
accountBenefitMoz = Deprendi más tocante a otros servicios de { -mozilla }

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Geri dönüş
importingFile = İdxal edilir…
encryptingFile = Şifrələnir...
decryptingFile = Şifrə açılır...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Nikan uelis tikijkuilos tein tiknemilijtos
importingFile = Mokalakijtok…
encryptingFile = Motatijtok…
decryptingFile = Kichiujtok se uelis kiixtajtoltis ya…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Водгук
importingFile = Імпартаванне...
encryptingFile = Зашыфроўка...
decryptingFile = Расшыфроўка...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = প্রতিক্রিয়া
importingFile = ইম্পোর্ট হচ্ছে...
encryptingFile = ইনক্রিপট হচ্ছে...
decryptingFile = ডিক্রিপট হচ্ছে...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Roit hoc'h ali
importingFile = Oc'h enporzhiañ …
encryptingFile = Oc'h enrinegañ..
decryptingFile = Oc'h ezrinegañ...

View File

@@ -1,6 +1,5 @@
title = Send
siteSubtitle = web eksperiment
siteFeedback = Povratne informacije
uploadPageHeader = Privatno, šifrovano dijeljenje datoteka
uploadPageExplainer = Pošaljite datoteke putem sigurne, privatne i šifrovane veze koja automatski ističe kako bi se osiguralo da vaše stvari ne ostaju na mreži zauvijek.
uploadPageLearnMore = Saznajte više

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Comentaris
importingFile = S'està important…
encryptingFile = S'està xifrant…
decryptingFile = S'està desxifrant…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Rutzijol
importingFile = Tajin nijik…
encryptingFile = Tajin newäx rusik'ixik…
decryptingFile = Tajin netamäx rusik'ixik...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = ڕەخنەوپێشنیار
importingFile = هاوردەکردن...
encryptingFile = بەهێماکردن...
decryptingFile = هێمالابردن...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Zpětná vazba
importingFile = Probíhá import…
encryptingFile = Probíhá šifrování…
decryptingFile = Probíhá dešifrování…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Adborth
importingFile = Mewnforio…
encryptingFile = Wrthi'n amgryptio…
decryptingFile = Wrthi'n dadgryptio…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Feedback
importingFile = Importerer…
encryptingFile = Krypterer…
decryptingFile = Dekrypterer…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Feedback
importingFile = Wird importiert…
encryptingFile = Wird verschlüsselt…
decryptingFile = Wird entschlüsselt…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Komentar
importingFile = Importěrujo se...
encryptingFile = Koděrujo se...
decryptingFile = Dešifrěrujo se...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Σχόλια
importingFile = Εισαγωγή…
encryptingFile = Κρυπτογράφηση…
decryptingFile = Αποκρυπτογράφηση…
@@ -138,7 +137,7 @@ accountBenefitSync = Διαχειριστείτε τα διαμοιρασμέν
accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla }
signOut = Αποσύνδεση
okButton = OK
downloadingTitle = Λήψη
downloadingTitle = Γίνεται λήψη
noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους.
noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης
noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Feedback
importingFile = Importing…
encryptingFile = Encrypting…
decryptingFile = Decrypting…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Feedback
importingFile = Importing…
encryptingFile = Encrypting…
decryptingFile = Decrypting…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Feedback
importingFile = Importing…
encryptingFile = Encrypting…
decryptingFile = Decrypting…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Opinión
importingFile = Importando…
encryptingFile = Cifrando…
decryptingFile = Descifrando…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Comentarios
importingFile = Importando…
encryptingFile = Cifrando…
decryptingFile = Descifrando…

View File

@@ -1,8 +1,7 @@
title = Send
siteFeedback = Comentario
importingFile = Importando...
encryptingFile = Encriptando...
decryptingFile = Desencriptando...
encryptingFile = Cifrando...
decryptingFile = Descifrando...
downloadCount =
{ $num ->
[one] 1 descarga
@@ -20,11 +19,11 @@ downloadButtonLabel = Descargar
downloadFinish = Descarga completa
fileSizeProgress = ({ $partialSize } de { $totalSize })
sendYourFilesLink = Prueba Send
errorPageHeader = ¡Se produjo un error!
errorPageHeader = ¡Se ha producido un error!
fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }.
linkExpiredAlt = Enlace caducado
notSupportedHeader = Tu navegador no está admitido.
notSupportedLink = ¿Por qué no se admite mi navegador?
notSupportedHeader = Tu navegador no es compatible.
notSupportedLink = ¿Por qué mi navegador no es compatible?
notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Send. Tendrás que actualizar tu navegador.
updateFirefox = Actualizar Firefox
deletePopupCancel = Cancelar
@@ -32,7 +31,7 @@ deleteButtonHover = Eliminar
footerLinkLegal = Legal
footerLinkPrivacy = Privacidad
footerLinkCookies = Cookies
passwordTryAgain = Contraseña incorrecta. Inténtelo de nuevo.
passwordTryAgain = Contraseña incorrecta. Inténtalo de nuevo.
javascriptRequired = Send requiere JavaScript
whyJavascript = ¿Por qué Send requiere JavaScript?
enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo.

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Comentario
importingFile = Importando...
encryptingFile = Encriptando…
decryptingFile = Desencriptando…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Tagasiside
importingFile = Importimine...
encryptingFile = Krüptimine…
decryptingFile = Dekrüptimine...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Iritzia
importingFile = Inportatzen…
encryptingFile = Zifratzen...
decryptingFile = Deszifratzen...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = بازخورد
importingFile = در حال وارد کردن…
encryptingFile = در حال رمزنگاری…
decryptingFile = در حال رمزگشایی…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Palaute
importingFile = Tuodaan…
encryptingFile = Salataan...
decryptingFile = Puretaan salausta...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Votre avis
importingFile = Importation…
encryptingFile = Chiffrement…
decryptingFile = Déchiffrement…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Kommentaar
importingFile = Ymportearje…
encryptingFile = Fersiferje…
decryptingFile = Untsiferje…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Jeejey
importingFile = Ojegueruhína…
encryptingFile = Moãmby…
decryptingFile = Ñemoão…
@@ -51,7 +50,7 @@ passwordSetError = Ndaikatúi oikóvo ko ñeẽñemi
-send-short-brand = Send
-firefox = Firefox
-mozilla = Mozilla
introTitle = Marandurenda ñemoambue hasy'ỹ ha ñemiguáva
introTitle = Marandurenda ñemoambue hasyỹ ha ñemiguáva
introDescription = { -send-brand } omoherakuãkuaa marandurenda papapýpe ñepyrũ guive opa peve ha juajuha opareíva ijehegui. Ikatu oreko ñemihápe emoherakuãva ha ehecháta mbaéicha ne mbaekuéra noĩri ñandutípe opa ára.
notifyUploadEncryptDone = Ne marandurenda oñemoã ha ikatúma emondo
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
@@ -135,7 +134,7 @@ accountBenefitTimeLimit =
*[other] Eguereko juajuha hendyhápe { $count } ára
}
accountBenefitSync = Eñangareko marandurenda moherakuãmbyrére oimeraẽ mbaeoka guive.
accountBenefitMoz = Eikuaa ambue { -mozilla } mba'epytyvõrã
accountBenefitMoz = Eikuaa ambue { -mozilla } mbaepytyvõrã
signOut = Emboty tembiapo
okButton = OK
downloadingTitle = Oñemboguejyhína
@@ -148,6 +147,6 @@ downloadFirefoxPromo = Ipyahúva { -firefox } omeẽse ndéve { -send-short-b
shareLinkDescription = Emoherakuã juajuha ne mbaeoka ndive:
shareLinkButton = Emoherakuã juajuha
# $name is the name of the file
shareMessage = Emboguejy “{ $name }” { -send-brand } ndive: emoherakuã marandurenda tasy'ỹ ha tekorosãme
shareMessage = Emboguejy “{ $name }” { -send-brand } ndive: emoherakuã marandurenda tasyỹ ha tekorosãme
trailheadPromo = Mbaéichapa emoãta ne ñemigua. Eipuru Firefox.
learnMore = Kuaave.

View File

@@ -1,6 +1,5 @@
title = Molawo
siteSubtitle = web yimontalo
siteFeedback = Potunu
uploadPageLearnMore = Pobalajariya po'olo
uploadPageBrowseButton = Tulawota berkas to delomo komputermu
uploadPageBrowseButton1 = Tulawota berkas u detohulo

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = משוב
importingFile = מתבצע ייבוא…
encryptingFile = מתבצעת הצפנה...
decryptingFile = מתבצע פענוח...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Povratne informacije
importingFile = Uvoz…
encryptingFile = Šifriranje …
decryptingFile = Dešifriranje …

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Komentar
importingFile = Importuje so...
encryptingFile = Zaklučuje so...
decryptingFile = Dešifruje so...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Visszajelzés
importingFile = Importálás…
encryptingFile = Titkosítás…
decryptingFile = Visszafejtés…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Ka olna' max jant'oj yab u t'ojnal alwa'
importingFile = k'wajat i chiyál...
encryptingFile = K'wajat i tsinat dheyál...
decryptingFile = K'wajat i exal ki wila'...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Արձագանք
importingFile = Ներմուծում...
encryptingFile = Գաղտնագրում…
decryptingFile = Վերծանում…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Reaction
importingFile = Importation…
encryptingFile = Cryptation...
decryptingFile = Decryptation…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Saran
importingFile = Mengimpor…
encryptingFile = Mengenkripsi...
decryptingFile = Mendekripsi...

View File

@@ -1,6 +1,4 @@
# Send is a brand name and should not be localized.
title = Zipu
siteFeedback = Nzaghachi
importingFile = Mbubata…
encryptingFile = ezoro ezo...
decryptingFile = Kpebie
@@ -30,7 +28,12 @@ notSupportedOutdatedDetail = Ọ dị nwute na ụdị Firefox a anaghị akwado
updateFirefox = Melite Firefox
deletePopupCancel = Kagbuo
deleteButtonHover = Hichapụ
whyJavascript = Kedu ihe kpatara Send jiri chọ JavaScript?
footerLinkLegal = n'Iwu
footerLinkPrivacy = nzuzo
footerLinkCookies = Kuki ga
passwordTryAgain = okwuntughe ezighi ezi.Nwaa ọzọ
javascriptRequired = Zipu chọrọ
whyJavascript = Kedu ihe kpatara Zipu jiri chọ JavaScript?
enableJavascript = Biko họrọ JavaScript ma nwaa ọzọ
# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m"
expiresHoursMinutes = { $hours }h { $minutes }m
@@ -43,11 +46,12 @@ passwordSetError = Enweghị ike ịtọ paswọọdụ a
## Send version 2 strings
-send-brand = Send
-send-brand = Zipu
-send-short-brand = Zipu, Ziga
-firefox = Firefox
-mozilla = Mozilla
introTitle = Mfe, nkekọrịta faịlụ nkeonwe
introDescription = na-ahapu gị ịkekọrịta faịlụ na izo ya na njedebe na njedebe na-akwụsị na akpaghị aka. Yabụ ị nwere ike idobe ihe ị na -eche ma hụ na ngwongwo gị agaghị adị n'ịntanetị ruo mgbe ebighi ebi.
notifyUploadEncryptDone = Failu gi zoro ezo ma di njikere iziga
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
archiveExpiryInfo = Ọ ga-agwu mgbe { $downloadCount } ma ọ bụ { $timespan } gasịrị
@@ -61,4 +65,27 @@ timespanWeeks =
[one] 1 izu
*[other] izu { $num }
}
# byte abbreviation
bytes = B
# kibibyte abbreviation
kb = KB
# mebibyte abbreviation
mb = MB
# gibibyte abbreviation
gb = GB
# localized number and byte abbreviation. example "2.5MB"
fileSize = { $Number } { $nkeji }
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
totalSize = { $nha }
# the next line after the colon contains a file name
copyLinkDescription = Detuo njikọ ahụ iji kee faịlụ gị
copyLinkButton = Detuo njikọ
downloadTitle = Budata faịlụ gasi
downloadDescription = Nkekọrịta faịlụ a site na site na iji zoo njedebe na-njedebe yana otu njikọ na-akwụsị na-akpaghị aka.
trySendDescription = Gbalịa maka nyefe faịlụ dị mfe.
expiredTitle = Njikọ a emebiela.
notSupportedDescription = agaghị eji ihe nchọgharị a rụọ ọrụ. na arụ ọrụ kacha mma na ụdị nke , ọ ga-arụkwa ụdị nke ihe nchọgharị ka ugbu a.
downloadFirefox = Budata
legalTitle = Nkwupụta Nzuzo
legalDateStamp = 1.dị 1.0, akara ụbọchị Maachi 12, 2019
okButton = O

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Feedback
importingFile = Importazione in corso…
encryptingFile = Crittazione in corso…
decryptingFile = Decrittazione in corso…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Aq'a yol sti'
importingFile = Eq'otzan
encryptingFile = La muj isik'lele
decryptingFile = Ni jaj ve't isik'lele'

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = フィードバック
importingFile = インポート中...
encryptingFile = 暗号化中...
decryptingFile = 復号化中...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = გამოხმაურება
importingFile = გადმოტანა...
encryptingFile = დაშიფვრა...
decryptingFile = გაშიფვრა...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Tikti
importingFile = Akter...
encryptingFile = Awgelhen...
decryptingFile = Azmek...
@@ -74,7 +73,7 @@ timespanWeeks =
fileCount =
{ $num ->
[one] 1 n ufaylu
*[other] { $num } n ifuyla
*[other] { $num } n yifuyla
}
# byte abbreviation
bytes = B

View File

@@ -1,6 +1,5 @@
# Send is a brand name and should not be localized.
title = Send
siteFeedback = 사용자 의견
importingFile = 가져오는 중…
encryptingFile = 암호화 중…
decryptingFile = 복호화 중…
@@ -96,7 +95,7 @@ tooManyArchives =
expiredTitle = 이 링크는 만료되었습니다.
notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다.
downloadFirefox = { -firefox } 다운로드
legalTitle = { -send-short-brand } 개인정보 보호 공지
legalTitle = { -send-short-brand } 개인정보처리방침
legalDateStamp = 버전 1.0, 2019년 3월 12일자
# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m"
expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Pateikti atsiliepimą
importingFile = Importuojama…
encryptingFile = Šifruojama…
decryptingFile = Iššifruojama…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Tu'un jianininu
importingFile = Nasia´a…
encryptingFile = Encriptando...
decryptingFile = Desencriptando…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Tu'un meu
importingFile = Ndakiin…
encryptingFile = Ndasami tu'un…
decryptingFile = Nchiko tu'un…

View File

@@ -1,5 +1,4 @@
title = ഫയർഫോക്സ് സെൻഡ്
siteFeedback = പ്രതികരണം
importingFile = ഇറക്കുമതി ചെയ്യുന്നു...
encryptingFile = എൻക്രിപ്റ്റ് ചെയ്യുന്നു...
decryptingFile = ഡീക്രിപ്റ്റ് ചെയ്യുന്നു...

View File

@@ -1,6 +1,5 @@
title = Send
siteSubtitle = experimen web
siteFeedback = Maklum balas
uploadPageHeader = Peribadi, Perkongsian Fail Dienkrip
uploadPageExplainer = Hantar fail melalui pautan yang selamat, peribadi dan dienkrip, yang akan luput secara automatik untuk memastikan fail anda itu tidak terus berada dalam talian selama-lamanya.
uploadPageLearnMore = Ketahui selanjutnya

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Tilbakemelding
importingFile = Importerer…
encryptingFile = Krypterer...
decryptingFile = Dekrypterer...

View File

@@ -1,8 +1,7 @@
title = Send
siteFeedback = Feedback
importingFile = Importeren…
encryptingFile = Versleutelen…
decryptingFile = Ontcijferen…
decryptingFile = Ontsleutelen…
downloadCount =
{ $num ->
[one] 1 download

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Tilbakemelding
importingFile = Importerer…
encryptingFile = Krypterer…
decryptingFile = Dekrypterer...

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Comentaris
importingFile = Importacion…
encryptingFile = Chiframent…
decryptingFile = Deschiframent…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = ਸੁਝਾਅ
importingFile = ...ਦਰਾਮਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ
encryptingFile = ...ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ
decryptingFile = ...ਡਿਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ

View File

@@ -1,4 +1,3 @@
siteFeedback = Tkweek uk kabyuwuha
## Send version 2 strings

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Wyślij opinię
importingFile = Importowanie…
encryptingFile = Szyfrowanie…
decryptingFile = Odszyfrowywanie…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Shitechnawati
importingFile = Mukalaktia nemi…
encryptingFile = Tikichtakawiat tinemit…
decryptingFile = Tikichtakapuat tinemit…

View File

@@ -1,5 +1,4 @@
title = Send
siteFeedback = Opinião
importingFile = Importando…
encryptingFile = Criptografando…
decryptingFile = Descriptografando…

Some files were not shown because too many files have changed in this diff Show More