chore: dependency updates (#448)

This commit is contained in:
2022-04-13 15:44:42 +02:00
committed by GitHub
parent 2cb74c8268
commit e916177569
11 changed files with 1384 additions and 1761 deletions

1
.gitignore vendored
View File

@@ -2,4 +2,5 @@
/dist /dist
/.cache /.cache
/.env /.env
/.tmp
*.log *.log

View File

@@ -2,6 +2,6 @@ const path = require('path');
module.exports = { module.exports = {
preset: 'ts-jest', preset: 'ts-jest',
testEnvironment: 'node', //testEnvironment: 'node',
testEnvironment: path.join(__dirname, 'tests', 'env.js'), testEnvironment: path.join(__dirname, 'tests', 'env-ts.js'),
}; };

View File

@@ -20,7 +20,6 @@
"@types/html-webpack-plugin": "^3.2.6", "@types/html-webpack-plugin": "^3.2.6",
"@types/jest": "^27.4.1", "@types/jest": "^27.4.1",
"@types/jszip": "^3.4.1", "@types/jszip": "^3.4.1",
"@types/openpgp": "^4.4.18",
"@types/react": "^18.0.3", "@types/react": "^18.0.3",
"@types/react-dom": "^18.0.0", "@types/react-dom": "^18.0.0",
"@types/react-router": "^5.1.18", "@types/react-router": "^5.1.18",
@@ -32,38 +31,38 @@
"axios": "^0.26.1", "axios": "^0.26.1",
"babel-loader": "^8.2.4", "babel-loader": "^8.2.4",
"babel-plugin-transform-inline-environment-variables": "^0.4.3", "babel-plugin-transform-inline-environment-variables": "^0.4.3",
"css-loader": "^5.2.7", "css-loader": "^6.7.1",
"dotenv": "^16.0.0", "dotenv": "^16.0.0",
"express": "^4.17.3", "express": "^4.17.3",
"fs-extra": "^10.0.1", "fs-extra": "^10.0.1",
"get-port": "^5.1.1", "get-port": "^5",
"html-webpack-plugin": "^4.5.2", "html-webpack-plugin": "^5.5.0",
"jest": "^26.6.3", "jest": "^27.5.1",
"offline-plugin": "^5.0.7", "offline-plugin": "^5.0.7",
"parcel-bundler": "^1.12.5", "parcel-bundler": "^1.12.5",
"puppeteer": "^13.5.2", "puppeteer": "^13.5.2",
"react-hot-loader": "^4.13.0", "react-hot-loader": "^4.13.0",
"style-loader": "^2.0.0", "style-loader": "^3.3.1",
"ts-jest": "^26.5.6", "ts-jest": "^27.1.4",
"ts-node": "^9.1.1", "ts-node": "^10.7.0",
"typescript": "^4.6.3", "typescript": "^4.6.3",
"webpack": "^4.44.1", "webpack": "^5.72.0",
"webpack-cli": "^4.9.2", "webpack-cli": "^4.9.2",
"webpack-dev-server": "^4.8.1", "webpack-dev-server": "^4.8.1",
"webpack-pwa-manifest": "^4.3.0", "webpack-pwa-manifest": "^4.3.0",
"webpack-subresource-integrity": "^1.5.2", "webpack-subresource-integrity": "^5.1.0",
"workbox-webpack-plugin": "^6.5.3" "workbox-webpack-plugin": "^6.5.3"
}, },
"dependencies": { "dependencies": {
"jszip": "^3.9.1", "jszip": "^3.9.1",
"nanoid": "^3.3.2", "nanoid": "^3.3.2",
"openpgp": "^4.10.10", "openpgp": "^5.2.1",
"react": "^17.0.2", "react": "^18.0.0",
"react-dom": "^17.0.2", "react-dom": "^18.0.0",
"react-dropzone": "^12.0.5", "react-dropzone": "^12.0.5",
"react-feather": "^2.0.9", "react-feather": "^2.0.9",
"react-router": "^5.2.0", "react-router": "^6.3.0",
"react-router-dom": "^5.3.0", "react-router-dom": "^6.3.0",
"styled-components": "^5.3.5" "styled-components": "^5.3.5"
}, },
"browserslist": [ "browserslist": [

View File

@@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
import { import {
Switch, Routes,
Route, Route,
useHistory, useNavigate,
} from 'react-router-dom'; } from 'react-router-dom';
import { HomeFilled } from '@ant-design/icons'; import { HomeFilled } from '@ant-design/icons';
import { Layout, Button, Space } from 'antd'; import { Layout, Button, Space } from 'antd';
@@ -15,38 +15,26 @@ import Welcome from './screens/Welcome';
import Debug from './screens/Debug'; import Debug from './screens/Debug';
const AppRouter: React.FC = () => { const AppRouter: React.FC = () => {
const history = useHistory(); const navigate = useNavigate();
return ( return (
<> <>
<Space> <Space>
<Button <Button
onClick={() => history.push('/')} onClick={() => navigate('/')}
icon={<HomeFilled />} icon={<HomeFilled />}
> >
Home Home
</Button> </Button>
</Space> </Space>
<Layout.Content style={{ padding: '25px', maxWidth: '800px', width: '100%', margin: 'auto' }}> <Layout.Content style={{ padding: '25px', maxWidth: '800px', width: '100%', margin: 'auto' }}>
<Switch> <Routes>
<Route path="/debug"> <Route path="/debug" element={<Debug />} />
<Debug /> <Route path="/welcome" element={<Welcome />} />
</Route> <Route path="/key" element={<SetupKey />} />
<Route path="/welcome"> <Route path="/receive" element={<Decrypt />} />
<Welcome /> <Route path="/send" element={<Encrypt />} />
</Route> <Route path="/" element={<Intro />} />
<Route path="/key"> </Routes>
<SetupKey />
</Route>
<Route path="/receive">
<Decrypt />
</Route>
<Route path="/send">
<Encrypt />
</Route>
<Route path="/">
<Intro />
</Route>
</Switch>
</Layout.Content> </Layout.Content>
</> </>
); );

View File

@@ -1,5 +1,5 @@
import React, { useState, useCallback, useContext, createContext, useEffect } from 'react'; import React, { useState, useCallback, useContext, createContext, useEffect } from 'react';
import * as openpgp from 'openpgp'; import { readMessage, readKey, decrypt as pgpDecrypt, readPrivateKeys, readPrivateKey, generateKey } from 'openpgp';
import GithubContext from './Github'; import GithubContext from './Github';
import FileType from '../types/File'; import FileType from '../types/File';
import { createFile } from '../helpers/files'; import { createFile } from '../helpers/files';
@@ -31,15 +31,17 @@ const DecryptionContext = createContext<DecryptionContextType>({
}); });
const decrypt = async (privateKey: string, keys: string[], content: string) => { const decrypt = async (privateKey: string, keys: string[], content: string) => {
const armoredKeys = await Promise.all(keys.map(openpgp.key.readArmored)); const armoredKeys = await Promise.all(
const message = await openpgp.message.readArmored(content); keys.map(key => readKey({ armoredKey: key })),
const encrypted = await openpgp.decrypt({ );
const message = await readMessage({ armoredMessage: content });
const encrypted = await pgpDecrypt({
message, message,
privateKeys: [...(await openpgp.key.readArmored(privateKey)).keys], decryptionKeys: await readPrivateKeys({ armoredKeys: privateKey }),
publicKeys: armoredKeys.reduce<any>((output, key: any) => [...output, ...key.keys], []), verificationKeys: armoredKeys.reduce<any>((output, key: any) => [...output, ...key], []),
}); });
const { data } = encrypted; const { data } = encrypted;
const blob = new Blob([data], { const blob = new Blob([data as any], {
type: 'text/text', type: 'text/text',
}); });
return blob; return blob;
@@ -65,8 +67,8 @@ const DecryptionProvider: React.FC = ({
const currentRawKey = localStorage.getItem('key'); const currentRawKey = localStorage.getItem('key');
if (currentRawKey) { if (currentRawKey) {
setPrivateKey(currentRawKey); setPrivateKey(currentRawKey);
const key = await openpgp.key.readArmored(currentRawKey); const key = await readPrivateKey({ armoredKey: currentRawKey });
setPublicKey(key.keys[0].toPublic().armor()); setPublicKey(key.toPublic().armor());
} }
}; };
@@ -80,14 +82,14 @@ const DecryptionProvider: React.FC = ({
}; };
const createKey = async () => { const createKey = async () => {
const key = await openpgp.generateKey({ const key = await generateKey({
userIds: [{ name: 'unknown unknown', email: 'unknown@unknown.foo'}], userIDs: [{ name: 'unknown unknown', email: 'unknown@unknown.foo'}],
curve: 'ed25519', curve: 'ed25519',
}); });
setPrivateKey(key.privateKeyArmored); setPrivateKey(key.privateKey);
setPublicKey(key.publicKeyArmored); setPublicKey(key.publicKey);
localStorage.setItem('key', key.privateKeyArmored); localStorage.setItem('key', key.privateKey);
} }
const addFile = useCallback(async (file: File) => { const addFile = useCallback(async (file: File) => {

View File

@@ -19,15 +19,16 @@ const EncryptionContext = createContext<EncryptionContextType>({
}); });
const encrypt = async (keys: string[], content: string) => { const encrypt = async (keys: string[], content: string) => {
const armoredKeys = await Promise.all(keys.map(openpgp.key.readArmored)); const armoredKeys = await Promise.all(
const message = openpgp.message.fromText(content); keys.map(key => openpgp.readKeys({ armoredKeys: key })),
);
const message = await openpgp.createMessage({ text: content });
const encrypted = await openpgp.encrypt({ const encrypted = await openpgp.encrypt({
message, message,
armor: true, encryptionKeys: armoredKeys.reduce<any>((output, key: any) => [...output, ...key], []),
publicKeys: armoredKeys.reduce<any>((output, key: any) => [...output, ...key.keys], []),
}); });
const { data } = encrypted; const data = encrypted;
const blob = new Blob([data], { const blob = new Blob([data as any], {
type: 'text/text', type: 'text/text',
}); });
return blob; return blob;

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { useHistory } from 'react-router'; import { useNavigate } from 'react-router';
import Welcome from './Welcome'; import Welcome from './Welcome';
import { import {
Button, Button,
@@ -18,14 +18,14 @@ const Thumb: React.FC = ({
link, link,
className, className,
}) => { }) => {
const history = useHistory(); const navigate = useNavigate();
return ( return (
<Button <Button
size="large" size="large"
icon={<Icon />} icon={<Icon />}
type="link" type="link"
className={className} className={className}
onClick={() => history.push(link)} onClick={() => navigate(link)}
> >
{title} {title}
</Button> </Button>

View File

@@ -2,7 +2,7 @@ import puppeteer, { Browser, Page } from 'puppeteer';
import path from 'path'; import path from 'path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
import openpgp, { key, message } from 'openpgp'; import * as openpgp from 'openpgp';
const sleep = (time: number) => new Promise((resolve) => setTimeout(resolve, time)); const sleep = (time: number) => new Promise((resolve) => setTimeout(resolve, time));
@@ -10,7 +10,7 @@ describe('encryption', () => {
let browser: Browser; let browser: Browser;
let page: Page; let page: Page;
let tmpDir: string; let tmpDir: string;
let keys: key.KeyResult; let keys: openpgp.PrivateKey;
const getText = async (elm: any) => { const getText = async (elm: any) => {
const text = await page.evaluate(el => el.textContent, elm); const text = await page.evaluate(el => el.textContent, elm);
@@ -24,7 +24,7 @@ describe('encryption', () => {
path.join(__dirname, '..', 'test-assets', 'key'), path.join(__dirname, '..', 'test-assets', 'key'),
'utf-8', 'utf-8',
); );
keys = await key.readArmored(data); keys = await openpgp.readPrivateKey({ armoredKey: data });
}); });
beforeEach(async () => { beforeEach(async () => {
@@ -68,8 +68,8 @@ describe('encryption', () => {
const data = await fs.readFile(downloadPath, 'utf-8'); const data = await fs.readFile(downloadPath, 'utf-8');
const decrypted = await openpgp.decrypt({ const decrypted = await openpgp.decrypt({
message: await message.readArmored(data), message: await openpgp.readMessage({ armoredMessage: data }),
privateKeys: keys.keys[0], decryptionKeys: keys,
}); });
expect(decrypted.data).toBe('Bar'); expect(decrypted.data).toBe('Bar');
}); });

View File

@@ -1,19 +1,19 @@
import NodeEnvironment from 'jest-environment-node'; const NodeEnvironment = require('jest-environment-node');
import { Server, createServer } from 'http'; const { Server, createServer } = require('http');
import getPort from 'get-port'; const getPort = require('get-port');
import webpack from 'webpack'; const webpack = require('webpack');
import path from 'path'; const path = require('path');
import express from 'express'; const express = require('express');
import createConfig from '../webpack.config'; const { default: createConfig } = require('../webpack.config');
const build = () => new Promise<Server>(async (resolve, reject) => { const build = () => new Promise(async (resolve, reject) => {
const config = await createConfig({ const config = await createConfig({
test: true, test: true,
}); });
const port = await getPort(); const port = await getPort();
const bundler = webpack(config); const bundler = webpack(config);
bundler.run((err, stats) => { bundler.run((err, stats) => {
if (err) { if (err || !stats) {
return reject(err); return reject(err);
} else if (stats.hasErrors()) { } else if (stats.hasErrors()) {
return reject(new Error('Webpack errors')); return reject(new Error('Webpack errors'));
@@ -28,22 +28,23 @@ const build = () => new Promise<Server>(async (resolve, reject) => {
}); });
class CustomEnvironment extends NodeEnvironment { class CustomEnvironment extends NodeEnvironment {
private _server?: Server; constructor(config) {
constructor(config: any) {
super(config); super(config);
} }
async setup() { async setup() {
await super.setup(); await super.setup();
this._server = await build(); this._server = await build();
const address: any = this._server?.address(); const address = this._server.address();
this.global.testUrl = `http://${address.address}:${address.port}` this.global.testUrl = `http://${address.address}:${address.port}`
} }
async teardown() { async teardown() {
await super.teardown(); await super.teardown();
this._server?.close(); if (!this._server) {
return;
}
this._server.close();
} }
} }

View File

@@ -92,7 +92,6 @@ const createConfig = async (options: Options = {
(config as any).devServer = { (config as any).devServer = {
hot: true, hot: true,
contentBase: './dist',
}; };
return config; return config;

2986
yarn.lock

File diff suppressed because it is too large Load Diff