mirror of
https://gitlab.com/timvisee/send.git
synced 2025-12-07 14:40:55 +03:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea1ea2aa68 | ||
|
|
90d06d71d3 | ||
|
|
11f2deb7a6 | ||
|
|
0f5edf023a | ||
|
|
3be0621647 | ||
|
|
fc07bfdb85 | ||
|
|
581a989304 | ||
|
|
047d6a85ab | ||
|
|
90f6a07d4a | ||
|
|
8f4a53db64 | ||
|
|
c2dd51c638 | ||
|
|
cdd98af86a | ||
|
|
883f2bc0f9 |
@@ -1,10 +1,8 @@
|
|||||||
node_modules
|
.circleci
|
||||||
.git
|
|
||||||
.tox
|
|
||||||
.DS_Store
|
|
||||||
firefox
|
|
||||||
assets
|
|
||||||
docs
|
|
||||||
test
|
|
||||||
coverage
|
|
||||||
.nyc_output
|
.nyc_output
|
||||||
|
.vscode
|
||||||
|
.DS_Store
|
||||||
|
coverage
|
||||||
|
docs
|
||||||
|
firefox
|
||||||
|
node_modules
|
||||||
60
Dockerfile
60
Dockerfile
@@ -1,19 +1,59 @@
|
|||||||
FROM node:10 AS builder
|
##
|
||||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
# Firefox Send - Mozilla
|
||||||
COPY package*.json /app/
|
#
|
||||||
WORKDIR /app
|
# License https://github.com/mozilla/send/blob/master/LICENSE
|
||||||
RUN npm install --production
|
##
|
||||||
|
|
||||||
FROM node:10-slim
|
|
||||||
RUN addgroup --gid 10001 app && adduser --disabled-password --gecos '' --gid 10001 --home /app --uid 10001 app
|
# Build project
|
||||||
|
FROM node:10 AS builder
|
||||||
|
RUN set -x \
|
||||||
|
# Add user
|
||||||
|
&& addgroup --gid 10001 app \
|
||||||
|
&& adduser --disabled-password \
|
||||||
|
--gecos '' \
|
||||||
|
--gid 10001 \
|
||||||
|
--home /app \
|
||||||
|
--uid 10001 \
|
||||||
|
app
|
||||||
|
COPY --chown=app:app . /app
|
||||||
USER app
|
USER app
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --chown=app:app --from=builder /app .
|
RUN ls -la
|
||||||
COPY --chown=app:app . .
|
RUN set -x \
|
||||||
|
# Build
|
||||||
|
&& npm ci \
|
||||||
|
&& npm run build
|
||||||
|
|
||||||
|
|
||||||
|
# Main image
|
||||||
|
FROM node:10-slim
|
||||||
|
RUN set -x \
|
||||||
|
# Add user
|
||||||
|
&& addgroup --gid 10001 app \
|
||||||
|
&& adduser --disabled-password \
|
||||||
|
--gecos '' \
|
||||||
|
--gid 10001 \
|
||||||
|
--home /app \
|
||||||
|
--uid 10001 \
|
||||||
|
app
|
||||||
|
RUN apt-get update && apt-get -y install git-core
|
||||||
|
USER app
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --chown=app:app package*.json ./
|
||||||
|
COPY --chown=app:app app app
|
||||||
|
COPY --chown=app:app common common
|
||||||
|
COPY --chown=app:app public/locales public/locales
|
||||||
|
COPY --chown=app:app server server
|
||||||
|
COPY --chown=app:app --from=builder /app/dist dist
|
||||||
|
|
||||||
|
RUN ls -la
|
||||||
|
RUN npm ci --production && npm cache clean --force
|
||||||
RUN mkdir -p /app/.config/configstore
|
RUN mkdir -p /app/.config/configstore
|
||||||
RUN ln -s dist/version.json version.json
|
RUN ln -s dist/version.json version.json
|
||||||
|
|
||||||
ENV PORT=1443
|
ENV PORT=1443
|
||||||
EXPOSE $PORT
|
|
||||||
|
EXPOSE ${PORT}
|
||||||
|
|
||||||
CMD ["node", "server/bin/prod.js"]
|
CMD ["node", "server/bin/prod.js"]
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ A file sharing experiment which allows you to send encrypted files to other user
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- [Node.js 10.0+](https://nodejs.org/)
|
- [Node.js 10.x](https://nodejs.org/)
|
||||||
- [Redis server](https://redis.io/) (optional for development)
|
- [Redis server](https://redis.io/) (optional for development)
|
||||||
- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional)
|
- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional)
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)$/;
|
|||||||
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/;
|
||||||
const FONT = /\.woff2?$/;
|
const FONT = /\.woff2?$/;
|
||||||
|
|
||||||
self.addEventListener('install', event => {
|
self.addEventListener('install', () => {
|
||||||
event.waitUntil(precache());
|
self.skipWaiting();
|
||||||
});
|
});
|
||||||
|
|
||||||
self.addEventListener('activate', event => {
|
self.addEventListener('activate', event => {
|
||||||
event.waitUntil(self.clients.claim().then(cleanCache));
|
event.waitUntil(self.clients.claim().then(precache));
|
||||||
});
|
});
|
||||||
|
|
||||||
async function decryptStream(id) {
|
async function decryptStream(id) {
|
||||||
@@ -84,10 +84,15 @@ async function decryptStream(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function precache() {
|
async function precache() {
|
||||||
|
try {
|
||||||
|
await cleanCache();
|
||||||
const cache = await caches.open(version);
|
const cache = await caches.open(version);
|
||||||
const images = assets.match(IMAGES);
|
const images = assets.match(IMAGES);
|
||||||
await cache.addAll(images);
|
await cache.addAll(images);
|
||||||
return self.skipWaiting();
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
// cache will get populated on demand
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cleanCache() {
|
async function cleanCache() {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Custom Loaders
|
# Custom Loaders
|
||||||
|
|
||||||
## Generate Asset Map
|
## Android Index Plugin
|
||||||
|
|
||||||
This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site.
|
Generates the `index.html` page for the native android client
|
||||||
|
|
||||||
## Version Plugin
|
## Version Plugin
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const genmap = require('../build/generate_asset_map');
|
const genmap = require('./generate_asset_map');
|
||||||
const isServer = typeof genmap === 'function';
|
const isServer = typeof genmap === 'function';
|
||||||
let prefix = '';
|
let prefix = '';
|
||||||
let manifest = {};
|
let manifest = {};
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
# Common Code
|
# Common Code
|
||||||
|
|
||||||
This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`).
|
This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`).
|
||||||
|
|
||||||
|
## Generate Asset Map
|
||||||
|
|
||||||
|
This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site.
|
||||||
@@ -1,13 +1,6 @@
|
|||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Before building the Docker image, you must build the production assets:
|
Run `docker build -t send:latest .` to create an image or `docker-compose up` to run a full testable stack. *We don't recommend using docker-compose for production.*
|
||||||
|
|
||||||
```sh
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you can run either `docker build` or `docker-compose up`.
|
|
||||||
|
|
||||||
|
|
||||||
## Environment variables:
|
## Environment variables:
|
||||||
|
|
||||||
|
|||||||
1106
package-lock.json
generated
1106
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
34
package.json
34
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "firefox-send",
|
"name": "firefox-send",
|
||||||
"description": "File Sharing Experiment",
|
"description": "File Sharing Experiment",
|
||||||
"version": "3.0.17",
|
"version": "3.0.19",
|
||||||
"author": "Mozilla (https://mozilla.org)",
|
"author": "Mozilla (https://mozilla.org)",
|
||||||
"repository": "mozilla/send",
|
"repository": "mozilla/send",
|
||||||
"homepage": "https://github.com/mozilla/send/",
|
"homepage": "https://github.com/mozilla/send/",
|
||||||
@@ -58,15 +58,15 @@
|
|||||||
"cache": true
|
"cache": true
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0 <11.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.5.5",
|
"@babel/core": "^7.6.0",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.5.5",
|
"@babel/plugin-proposal-class-properties": "^7.5.5",
|
||||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||||
"@babel/preset-env": "^7.5.5",
|
"@babel/preset-env": "^7.6.0",
|
||||||
"@dannycoates/webcrypto-liner": "^0.1.37",
|
"@dannycoates/webcrypto-liner": "^0.1.37",
|
||||||
"@fullhuman/postcss-purgecss": "^1.2.0",
|
"@fullhuman/postcss-purgecss": "^1.3.0",
|
||||||
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
|
||||||
"@sentry/browser": "^5.6.3",
|
"@sentry/browser": "^5.6.3",
|
||||||
"asmcrypto.js": "^0.22.0",
|
"asmcrypto.js": "^0.22.0",
|
||||||
@@ -81,9 +81,9 @@
|
|||||||
"css-loader": "^3.2.0",
|
"css-loader": "^3.2.0",
|
||||||
"css-mqpacker": "^7.0.0",
|
"css-mqpacker": "^7.0.0",
|
||||||
"cssnano": "^4.1.10",
|
"cssnano": "^4.1.10",
|
||||||
"eslint": "^6.3.0",
|
"eslint": "^6.4.0",
|
||||||
"eslint-config-prettier": "^6.2.0",
|
"eslint-config-prettier": "^6.3.0",
|
||||||
"eslint-plugin-mocha": "^6.1.0",
|
"eslint-plugin-mocha": "^6.1.1",
|
||||||
"eslint-plugin-node": "^9.2.0",
|
"eslint-plugin-node": "^9.2.0",
|
||||||
"eslint-plugin-security": "^1.4.0",
|
"eslint-plugin-security": "^1.4.0",
|
||||||
"expose-loader": "^0.7.5",
|
"expose-loader": "^0.7.5",
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
"http_ece": "^1.1.0",
|
"http_ece": "^1.1.0",
|
||||||
"husky": "^3.0.5",
|
"husky": "^3.0.5",
|
||||||
"intl-pluralrules": "^1.0.3",
|
"intl-pluralrules": "^1.0.3",
|
||||||
"lint-staged": "^9.2.5",
|
"lint-staged": "^9.3.0",
|
||||||
"mocha": "^6.2.0",
|
"mocha": "^6.2.0",
|
||||||
"morgan": "^1.9.1",
|
"morgan": "^1.9.1",
|
||||||
"nanobus": "^4.4.0",
|
"nanobus": "^4.4.0",
|
||||||
@@ -108,12 +108,12 @@
|
|||||||
"postcss-preset-env": "^6.7.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
"prettier": "^1.18.2",
|
"prettier": "^1.18.2",
|
||||||
"proxyquire": "^2.1.3",
|
"proxyquire": "^2.1.3",
|
||||||
"puppeteer": "^1.19.0",
|
"puppeteer": "^1.20.0",
|
||||||
"raw-loader": "^3.1.0",
|
"raw-loader": "^3.1.0",
|
||||||
"redis-mock": "^0.46.0",
|
"redis-mock": "^0.46.0",
|
||||||
"rimraf": "^3.0.0",
|
"rimraf": "^3.0.0",
|
||||||
"script-loader": "^0.7.2",
|
"script-loader": "^0.7.2",
|
||||||
"sinon": "^7.4.2",
|
"sinon": "^7.5.0",
|
||||||
"string-hash": "^1.1.3",
|
"string-hash": "^1.1.3",
|
||||||
"stylelint": "^10.1.0",
|
"stylelint": "^10.1.0",
|
||||||
"stylelint-config-standard": "^18.3.0",
|
"stylelint-config-standard": "^18.3.0",
|
||||||
@@ -131,19 +131,19 @@
|
|||||||
"wdio-spec-reporter": "^0.1.5",
|
"wdio-spec-reporter": "^0.1.5",
|
||||||
"webdriverio": "^4.14.4",
|
"webdriverio": "^4.14.4",
|
||||||
"webpack": "4.38.0",
|
"webpack": "4.38.0",
|
||||||
"webpack-cli": "^3.3.7",
|
"webpack-cli": "^3.3.9",
|
||||||
"webpack-dev-middleware": "^3.7.1",
|
"webpack-dev-middleware": "^3.7.1",
|
||||||
"webpack-dev-server": "^3.8.0",
|
"webpack-dev-server": "^3.8.1",
|
||||||
"webpack-manifest-plugin": "^2.0.4",
|
"webpack-manifest-plugin": "^2.1.0",
|
||||||
"webpack-unassert-loader": "^1.2.0"
|
"webpack-unassert-loader": "^1.2.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dannycoates/express-ws": "^5.0.3",
|
"@dannycoates/express-ws": "^5.0.3",
|
||||||
"@fluent/bundle": "^0.13.0",
|
"@fluent/bundle": "^0.13.0",
|
||||||
"@fluent/langneg": "^0.3.0",
|
"@fluent/langneg": "^0.3.0",
|
||||||
"@google-cloud/storage": "^3.2.1",
|
"@google-cloud/storage": "^3.3.0",
|
||||||
"@sentry/node": "^5.6.2",
|
"@sentry/node": "^5.6.2",
|
||||||
"aws-sdk": "^2.523.0",
|
"aws-sdk": "^2.533.0",
|
||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
"choo": "^7.0.0",
|
"choo": "^7.0.0",
|
||||||
"cldr-core": "^35.1.0",
|
"cldr-core": "^35.1.0",
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
"convict": "^5.1.0",
|
"convict": "^5.1.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"fxa-geodb": "^1.0.4",
|
"fxa-geodb": "^1.0.4",
|
||||||
"helmet": "^3.21.0",
|
"helmet": "^3.21.1",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"mozlog": "^2.2.0",
|
"mozlog": "^2.2.0",
|
||||||
"node-fetch": "^2.6.0",
|
"node-fetch": "^2.6.0",
|
||||||
|
|||||||
@@ -182,4 +182,5 @@ shareLinkDescription = شارِك الرابط الذي يصل إلى الملف
|
|||||||
shareLinkButton = شارِك الرابط
|
shareLinkButton = شارِك الرابط
|
||||||
# $name is the name of the file
|
# $name is the name of the file
|
||||||
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
|
shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة
|
||||||
|
trailheadPromo = يمكنك حماية خصوصيتك، طبعا. انضم إلى فَيَرفُكس.
|
||||||
learnMore = اطّلع على المزيد.
|
learnMore = اطّلع على المزيد.
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ passwordSetError = امکان ثبت این گذواژه نیست
|
|||||||
-send-short-brand = ارسال
|
-send-short-brand = ارسال
|
||||||
-firefox = فایرفاکس
|
-firefox = فایرفاکس
|
||||||
-mozilla = موزیلا
|
-mozilla = موزیلا
|
||||||
|
introTitle = اشتراکگذاری ساده و خصوصیِ پروندهها
|
||||||
# byte abbreviation
|
# byte abbreviation
|
||||||
bytes = B
|
bytes = B
|
||||||
# kibibyte abbreviation
|
# kibibyte abbreviation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Firefox Send is a brand name and should not be localized.
|
# Firefox Send is a brand name and should not be localized.
|
||||||
title = Firefox Send
|
title = Firefox Send
|
||||||
siteFeedback = משוב
|
siteFeedback = משוב
|
||||||
importingFile = מתבצע ייבוא...
|
importingFile = מתבצע ייבוא…
|
||||||
encryptingFile = מתבצעת הצפנה...
|
encryptingFile = מתבצעת הצפנה...
|
||||||
decryptingFile = מתבצע פענוח...
|
decryptingFile = מתבצע פענוח...
|
||||||
downloadCount =
|
downloadCount =
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ importingFile = 가져오는 중…
|
|||||||
encryptingFile = 암호화 중…
|
encryptingFile = 암호화 중…
|
||||||
decryptingFile = 복호화 중…
|
decryptingFile = 복호화 중…
|
||||||
downloadCount = 다운로드 { $num }회
|
downloadCount = 다운로드 { $num }회
|
||||||
timespanHours = 1 시간
|
timespanHours = { $num }시간
|
||||||
copiedUrl = 복사 완료!
|
copiedUrl = 복사 완료!
|
||||||
unlockInputPlaceholder = 비밀번호
|
unlockInputPlaceholder = 비밀번호
|
||||||
unlockButtonLabel = 잠금 해제
|
unlockButtonLabel = 잠금 해제
|
||||||
|
|||||||
@@ -127,17 +127,17 @@ emailPlaceholder = Informe seu e-mail
|
|||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
signInSizeBump = Entre na sua conta para enviar até { $size }
|
signInSizeBump = Entre na sua conta para enviar até { $size }
|
||||||
signInOnlyButton = Entrar
|
signInOnlyButton = Entrar
|
||||||
accountBenefitTitle = Crie uma Conta { -firefox } ou entre na sua conta
|
accountBenefitTitle = Crie uma Conta { -firefox } ou entre se já tiver
|
||||||
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB")
|
||||||
accountBenefitLargeFiles = Compartilhe arquivos até { $size }
|
accountBenefitLargeFiles = Compartilhe arquivos até { $size }.
|
||||||
accountBenefitDownloadCount = Compartilhe arquivos com mais pessoas
|
accountBenefitDownloadCount = Compartilhe arquivos com mais pessoas.
|
||||||
accountBenefitTimeLimit =
|
accountBenefitTimeLimit =
|
||||||
{ $count ->
|
{ $count ->
|
||||||
[one] Mantenha links ativos por até 1 dia
|
[one] Mantenha links ativos por até 1 dia.
|
||||||
*[other] Mantenha links ativos por até { $count } dias
|
*[other] Mantenha links ativos por até { $count } dias.
|
||||||
}
|
}
|
||||||
accountBenefitSync = Gerencie arquivos compartilhados a partir de qualquer dispositivo
|
accountBenefitSync = Gerencie arquivos compartilhados a partir de qualquer dispositivo.
|
||||||
accountBenefitMoz = Conheça outros serviços da { -mozilla }
|
accountBenefitMoz = Conheça outros serviços da { -mozilla }.
|
||||||
signOut = Sair
|
signOut = Sair
|
||||||
okButton = OK
|
okButton = OK
|
||||||
downloadingTitle = Baixando
|
downloadingTitle = Baixando
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ const serviceWorker = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
// loads all assets from assets/ for use by common/assets.js
|
// loads all assets from assets/ for use by common/assets.js
|
||||||
test: require.resolve('./build/generate_asset_map.js'),
|
test: require.resolve('./common/generate_asset_map.js'),
|
||||||
use: ['babel-loader', 'val-loader']
|
use: ['babel-loader', 'val-loader']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -176,7 +176,7 @@ const web = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
// loads all assets from assets/ for use by common/assets.js
|
// loads all assets from assets/ for use by common/assets.js
|
||||||
test: require.resolve('./build/generate_asset_map.js'),
|
test: require.resolve('./common/generate_asset_map.js'),
|
||||||
use: ['babel-loader', 'val-loader']
|
use: ['babel-loader', 'val-loader']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user