mirror of
https://gitlab.com/timvisee/send.git
synced 2025-12-06 14:10:53 +03:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94f1eabbc7 | ||
|
|
902bc6628e | ||
|
|
460b741f17 | ||
|
|
d5c488196d | ||
|
|
9ad9c9feb2 | ||
|
|
6576e4a74c | ||
|
|
950872109e | ||
|
|
87051d27ed | ||
|
|
3451803b37 | ||
|
|
ac15153e8f | ||
|
|
924f5dc682 | ||
|
|
ff9be6a213 | ||
|
|
883728570e | ||
|
|
0435f17f9a | ||
|
|
1e1268fff0 | ||
|
|
252d7817e3 |
@@ -76,8 +76,8 @@ async function polyfillStreams() {
|
||||
}
|
||||
|
||||
export default async function getCapabilities() {
|
||||
const serviceWorker =
|
||||
'serviceWorker' in navigator && browserName() !== 'edge';
|
||||
const browser = browserName();
|
||||
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
|
||||
let crypto = await checkCrypto();
|
||||
const nativeStreams = checkStreams();
|
||||
let polyStreams = false;
|
||||
@@ -97,13 +97,16 @@ export default async function getCapabilities() {
|
||||
window.matchMedia('(display-mode: standalone)').matches ||
|
||||
navigator.standalone;
|
||||
|
||||
const mobileFirefox =
|
||||
browser === 'firefox' && /mobile/i.test(navigator.userAgent);
|
||||
|
||||
return {
|
||||
account,
|
||||
crypto,
|
||||
serviceWorker,
|
||||
streamUpload: nativeStreams || polyStreams,
|
||||
streamDownload:
|
||||
nativeStreams && serviceWorker && browserName() !== 'safari',
|
||||
nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
|
||||
multifile: nativeStreams || polyStreams,
|
||||
share,
|
||||
standalone
|
||||
|
||||
@@ -62,7 +62,7 @@ if (process.env.NODE_ENV === 'production') {
|
||||
fileInfo: null
|
||||
};
|
||||
|
||||
const app = routes(choo());
|
||||
const app = routes(choo({ hash: true }));
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
window.app = app;
|
||||
app.use(experiments);
|
||||
|
||||
@@ -2,7 +2,7 @@ const choo = require('choo');
|
||||
const download = require('./ui/download');
|
||||
const body = require('./ui/body');
|
||||
|
||||
module.exports = function(app = choo()) {
|
||||
module.exports = function(app = choo({ hash: true })) {
|
||||
app.route('/', body(require('./ui/home')));
|
||||
app.route('/download/:id', body(download));
|
||||
app.route('/download/:id/:key', body(download));
|
||||
|
||||
@@ -11,13 +11,14 @@ const map = new Map();
|
||||
const IMAGES = /.*\.(png|svg|jpg)$/;
|
||||
const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
|
||||
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
||||
const FONT = /\.woff2?$/;
|
||||
|
||||
self.addEventListener('install', event => {
|
||||
event.waitUntil(precache());
|
||||
});
|
||||
|
||||
self.addEventListener('activate', event => {
|
||||
event.waitUntil(self.clients.claim());
|
||||
event.waitUntil(self.clients.claim().then(cleanCache));
|
||||
});
|
||||
|
||||
async function decryptStream(id) {
|
||||
@@ -83,16 +84,23 @@ async function decryptStream(id) {
|
||||
}
|
||||
|
||||
async function precache() {
|
||||
const cache = await caches.open(version);
|
||||
const images = assets.match(IMAGES);
|
||||
await cache.addAll(images);
|
||||
return self.skipWaiting();
|
||||
}
|
||||
|
||||
async function cleanCache() {
|
||||
const oldCaches = await caches.keys();
|
||||
for (const c of oldCaches) {
|
||||
if (c !== version) {
|
||||
await caches.delete(c);
|
||||
}
|
||||
}
|
||||
const cache = await caches.open(version);
|
||||
const images = assets.match(IMAGES);
|
||||
await cache.addAll(images);
|
||||
return self.skipWaiting();
|
||||
}
|
||||
|
||||
function cacheable(url) {
|
||||
return VERSIONED_ASSET.test(url) || FONT.test(url);
|
||||
}
|
||||
|
||||
async function cachedOrFetched(req) {
|
||||
@@ -102,7 +110,7 @@ async function cachedOrFetched(req) {
|
||||
return cached;
|
||||
}
|
||||
const fetched = await fetch(req);
|
||||
if (fetched.ok && VERSIONED_ASSET.test(req.url)) {
|
||||
if (fetched.ok && cacheable(req.url)) {
|
||||
cache.put(req, fetched.clone());
|
||||
}
|
||||
return fetched;
|
||||
@@ -115,7 +123,7 @@ self.onfetch = event => {
|
||||
const dlmatch = DOWNLOAD_URL.exec(url.pathname);
|
||||
if (dlmatch) {
|
||||
event.respondWith(decryptStream(dlmatch[1]));
|
||||
} else if (VERSIONED_ASSET.test(url.pathname)) {
|
||||
} else if (cacheable(url.pathname)) {
|
||||
event.respondWith(cachedOrFetched(req));
|
||||
}
|
||||
};
|
||||
|
||||
750
package-lock.json
generated
750
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
45
package.json
45
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "firefox-send",
|
||||
"description": "File Sharing Experiment",
|
||||
"version": "3.0.16",
|
||||
"version": "3.0.17",
|
||||
"author": "Mozilla (https://mozilla.org)",
|
||||
"repository": "mozilla/send",
|
||||
"homepage": "https://github.com/mozilla/send/",
|
||||
@@ -35,7 +35,8 @@
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged",
|
||||
"pre-push": "npm test",
|
||||
"post-merge": "npm install"
|
||||
"post-merge": "npm install",
|
||||
"post-checkout": "scripts/sync-npm-dependencies.sh"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
@@ -67,7 +68,7 @@
|
||||
"@dannycoates/webcrypto-liner": "^0.1.37",
|
||||
"@fullhuman/postcss-purgecss": "^1.2.0",
|
||||
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
||||
"@sentry/browser": "^5.6.1",
|
||||
"@sentry/browser": "^5.6.3",
|
||||
"asmcrypto.js": "^0.22.0",
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-plugin-istanbul": "^5.2.0",
|
||||
@@ -76,14 +77,14 @@
|
||||
"copy-webpack-plugin": "^5.0.4",
|
||||
"core-js": "^3.2.1",
|
||||
"crc": "^3.8.0",
|
||||
"cross-env": "^5.2.0",
|
||||
"cross-env": "^5.2.1",
|
||||
"css-loader": "^3.2.0",
|
||||
"css-mqpacker": "^7.0.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"eslint": "^6.1.0",
|
||||
"eslint-config-prettier": "^6.0.0",
|
||||
"eslint-plugin-mocha": "^6.0.0",
|
||||
"eslint-plugin-node": "^9.1.0",
|
||||
"eslint": "^6.3.0",
|
||||
"eslint-config-prettier": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^6.1.0",
|
||||
"eslint-plugin-node": "^9.2.0",
|
||||
"eslint-plugin-security": "^1.4.0",
|
||||
"expose-loader": "^0.7.5",
|
||||
"extract-loader": "^3.1.0",
|
||||
@@ -93,13 +94,13 @@
|
||||
"git-rev-sync": "^1.12.0",
|
||||
"html-loader": "^0.5.5",
|
||||
"http_ece": "^1.1.0",
|
||||
"husky": "^3.0.3",
|
||||
"husky": "^3.0.5",
|
||||
"intl-pluralrules": "^1.0.3",
|
||||
"lint-staged": "^9.2.1",
|
||||
"lint-staged": "^9.2.5",
|
||||
"mocha": "^6.2.0",
|
||||
"morgan": "^1.9.1",
|
||||
"nanobus": "^4.4.0",
|
||||
"nanohtml": "^1.7.0",
|
||||
"nanohtml": "^1.8.1",
|
||||
"nanotiming": "^7.3.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"nyc": "^14.1.1",
|
||||
@@ -109,17 +110,17 @@
|
||||
"proxyquire": "^2.1.3",
|
||||
"puppeteer": "^1.19.0",
|
||||
"raw-loader": "^3.1.0",
|
||||
"redis-mock": "^0.45.0",
|
||||
"rimraf": "^2.6.3",
|
||||
"redis-mock": "^0.46.0",
|
||||
"rimraf": "^3.0.0",
|
||||
"script-loader": "^0.7.2",
|
||||
"sinon": "^7.4.1",
|
||||
"sinon": "^7.4.2",
|
||||
"string-hash": "^1.1.3",
|
||||
"stylelint": "^10.1.0",
|
||||
"stylelint-config-standard": "^18.3.0",
|
||||
"stylelint-no-unsupported-browser-features": "^3.0.2",
|
||||
"svgo": "^1.3.0",
|
||||
"svgo-loader": "^2.2.1",
|
||||
"tailwindcss": "^1.1.1",
|
||||
"tailwindcss": "^1.1.2",
|
||||
"val-loader": "^1.1.1",
|
||||
"wdio-docker-service": "^1.4.2",
|
||||
"wdio-dot-reporter": "0.0.10",
|
||||
@@ -130,8 +131,8 @@
|
||||
"wdio-spec-reporter": "^0.1.5",
|
||||
"webdriverio": "^4.14.4",
|
||||
"webpack": "4.38.0",
|
||||
"webpack-cli": "^3.3.6",
|
||||
"webpack-dev-middleware": "^3.7.0",
|
||||
"webpack-cli": "^3.3.7",
|
||||
"webpack-dev-middleware": "^3.7.1",
|
||||
"webpack-dev-server": "^3.8.0",
|
||||
"webpack-manifest-plugin": "^2.0.4",
|
||||
"webpack-unassert-loader": "^1.2.0"
|
||||
@@ -140,17 +141,17 @@
|
||||
"@dannycoates/express-ws": "^5.0.3",
|
||||
"@fluent/bundle": "^0.13.0",
|
||||
"@fluent/langneg": "^0.3.0",
|
||||
"@google-cloud/storage": "^3.1.0",
|
||||
"@sentry/node": "^5.6.1",
|
||||
"aws-sdk": "^2.507.0",
|
||||
"@google-cloud/storage": "^3.2.1",
|
||||
"@sentry/node": "^5.6.2",
|
||||
"aws-sdk": "^2.523.0",
|
||||
"body-parser": "^1.19.0",
|
||||
"choo": "^6.13.3",
|
||||
"choo": "^7.0.0",
|
||||
"cldr-core": "^35.1.0",
|
||||
"configstore": "github:dannycoates/configstore#master",
|
||||
"convict": "^5.1.0",
|
||||
"express": "^4.17.1",
|
||||
"fxa-geodb": "^1.0.4",
|
||||
"helmet": "^3.20.0",
|
||||
"helmet": "^3.21.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mozlog": "^2.2.0",
|
||||
"node-fetch": "^2.6.0",
|
||||
|
||||
@@ -126,7 +126,7 @@ addPassword = Protegido con contraseña
|
||||
emailPlaceholder = Ingresa tu correo electrónico
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Iniciar sesión para enviar hasta { $size }
|
||||
signInButton = Iniciar sesión/registrarse
|
||||
signInOnlyButton = Iniciar sesión
|
||||
accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
accountBenefitLargeFiles = Compartir archivos de hasta { $size }
|
||||
@@ -145,3 +145,11 @@ noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan gr
|
||||
noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador
|
||||
noStreamsOptionFirefox = Prueba nuestro navegador favorito
|
||||
noStreamsOptionDownload = Continuar con este navegador
|
||||
downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }.
|
||||
# the next line after the colon contains a file name
|
||||
shareLinkDescription = Comparte el enlace a tu archivo:
|
||||
shareLinkButton = Enlace para compartir
|
||||
# $name is the name of the file
|
||||
shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro
|
||||
trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox.
|
||||
learnMore = Saber más.
|
||||
|
||||
@@ -7,13 +7,13 @@ decryptingFile = מתבצע פענוח...
|
||||
downloadCount =
|
||||
{ $num ->
|
||||
[one] הורדה אחת
|
||||
*[other] { $number } הורדות
|
||||
*[other] { $num } הורדות
|
||||
}
|
||||
timespanHours =
|
||||
{ $num ->
|
||||
[one] שעה אחת
|
||||
[two] שעתיים
|
||||
*[other] { $number } שעות
|
||||
*[other] { $num } שעות
|
||||
}
|
||||
copiedUrl = הועתק!
|
||||
unlockInputPlaceholder = ססמה
|
||||
|
||||
@@ -123,7 +123,7 @@ dragAndDropFiles = Traher e deponer files
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
orClickWithSize = o cliccar pro inviar usque { $size }
|
||||
addPassword = Proteger per contrasigno
|
||||
emailPlaceholder = Insere tu adresse email
|
||||
emailPlaceholder = Insere tu adresse de e-mail
|
||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||
signInSizeBump = Accede pro inviar usque { $size }
|
||||
signInOnlyButton = Authentica te
|
||||
|
||||
@@ -140,4 +140,5 @@ shareLinkDescription = ファイルへのリンクを共有しましょう:
|
||||
shareLinkButton = リンクを共有
|
||||
# $name is the name of the file
|
||||
shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有
|
||||
trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。
|
||||
learnMore = 詳細情報
|
||||
|
||||
@@ -54,7 +54,7 @@ passwordSetError = Essa senha não pôde ser definida
|
||||
-firefox = Firefox
|
||||
-mozilla = Mozilla
|
||||
introTitle = Compartilhamento de arquivos fácil e privativo
|
||||
introDescription = O { -send-brand } permite compartilhar arquivos com criptografia ponto a ponto e um link que expira automaticamente. Assim você pode manter o que compartilha privativo e ter certeza que suas coisas não ficarão online para sempre.
|
||||
introDescription = O { -send-brand } permite compartilhar arquivos com criptografia de ponta a ponta e um link que expira automaticamente. Assim você pode manter o que compartilha privativo e ter certeza que suas coisas não ficarão online para sempre.
|
||||
notifyUploadEncryptDone = Seu arquivo foi criptografado e está pronto para ser enviado
|
||||
# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes'
|
||||
archiveExpiryInfo = Expirar após { $downloadCount } ou { $timespan }
|
||||
@@ -94,7 +94,7 @@ totalSize = Tamanho total: { $size }
|
||||
copyLinkDescription = Copie o link para compartilhar seu arquivo:
|
||||
copyLinkButton = Copiar link
|
||||
downloadTitle = Baixar arquivos
|
||||
downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia ponto a ponto e um link que expira automaticamente.
|
||||
downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia de ponta a ponta e um link que expira automaticamente.
|
||||
trySendDescription = Experimente o { -send-brand } para compartilhamento de arquivos simples e seguro.
|
||||
# count will always be > 10
|
||||
tooManyFiles =
|
||||
|
||||
@@ -87,7 +87,7 @@ totalSize = Tổng kích thước: { $size }
|
||||
# the next line after the colon contains a file name
|
||||
copyLinkDescription = Sao chép liên kết để chia sẻ tập tin của bạn:
|
||||
copyLinkButton = Sao chép liên kết
|
||||
downloadTitle = Tải tập tin
|
||||
downloadTitle = Tải xuống tập tin
|
||||
downloadDescription = Tập tin này đã được chia sẻ qua { -send-brand } với mã hóa đầu cuối và liên kết tự động hết hạn.
|
||||
trySendDescription = Hãy thử { -send-brand } để chia sẻ tập tin đơn giản, an toàn.
|
||||
# count will always be > 10
|
||||
|
||||
13
scripts/sync-npm-dependencies.sh
Executable file
13
scripts/sync-npm-dependencies.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "checking package-lock.json for changes"
|
||||
IFS=' '
|
||||
read -ra G_PARAMS <<< "$HUSKY_GIT_PARAMS"
|
||||
PREV=${G_PARAMS[0]}
|
||||
NEXT=${G_PARAMS[1]}
|
||||
if [ "$PREV" != "$NEXT" ]; then
|
||||
DIFF=$(git diff $PREV $NEXT package-lock.json)
|
||||
if [ "$DIFF" != "" ]; then
|
||||
npm install
|
||||
fi
|
||||
fi
|
||||
@@ -67,7 +67,10 @@ module.exports = function(app) {
|
||||
}
|
||||
app.use(function(req, res, next) {
|
||||
res.set('Pragma', 'no-cache');
|
||||
res.set('Cache-Control', 'no-cache');
|
||||
res.set(
|
||||
'Cache-Control',
|
||||
'private, no-cache, no-store, must-revalidate, max-age=0'
|
||||
);
|
||||
next();
|
||||
});
|
||||
app.use(bodyParser.json());
|
||||
|
||||
Reference in New Issue
Block a user