"
],
@@ -416,9 +578,25 @@ ava.default('parseKeys - revoked', async t => {
"format": "armored",
"keyDetails": [
{
- "public": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxjMEYW8BThYJKwYBBAHaRw8BAQdAYtEoS4d+3cwQWXcs3lvMQueypexTYai7\nuXQmxqyOoKrCjAQgFgoAHQUCYW8CLBYhBDkxt0E9uy+mDO+Fzl8Vl4kQoXgK\nACEJEF8Vl4kQoXgKFiEEOTG3QT27L6YM74XOXxWXiRCheAqk5AEApn8X3Oe7\nEFgdfo5lkgh6ubpmgyRUpfYHkQE2/S6K+T0BAPGs2py515aUVAgiRy7bJuoY\nDKKbOPL1Npd0bgenKgMGzRVyZXZvZWtkQGZsb3djcnlwdC5jb23CXgQTFgoA\nBgUCYW8BawAKCRBfFZeJEKF4ChD/AP9gdm4riyAzyGhD4P8ZGW3GtREk56sW\nRBB3A/+RUX+qbAEA3FWCs2bUl6pmasXP8QAi0/zoruZiShR2Y2mVAM3T1ATN\nFXJldm9rZWRAZmxvd2NyeXB0LmNvbcJeBBMWCgAGBQJhbwFrAAoJEF8Vl4kQ\noXgKecoBALdrD8nkptLlT8Dg4cF+3swfY1urlbdEfEvIjN60HRDLAP4w3qeS\nzZ+OyuqPFaw7dM2KOu4++WigtbxRpDhpQ9U8BQ==\n=bMwq\n-----END PGP PUBLIC KEY BLOCK-----\n",
+ "public": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" +
+ "\n" +
+ "xjMEYW8BThYJKwYBBAHaRw8BAQdAYtEoS4d+3cwQWXcs3lvMQueypexTYai7\n" +
+ "uXQmxqyOoKrCjAQgFgoAHQUCYW8CLBYhBDkxt0E9uy+mDO+Fzl8Vl4kQoXgK\n" +
+ "ACEJEF8Vl4kQoXgKFiEEOTG3QT27L6YM74XOXxWXiRCheAqk5AEApn8X3Oe7\n" +
+ "EFgdfo5lkgh6ubpmgyRUpfYHkQE2/S6K+T0BAPGs2py515aUVAgiRy7bJuoY\n" +
+ "DKKbOPL1Npd0bgenKgMGzRVyZXZvZWtkQGZsb3djcnlwdC5jb23CXgQTFgoA\n" +
+ "BgUCYW8BawAKCRBfFZeJEKF4ChD/AP9gdm4riyAzyGhD4P8ZGW3GtREk56sW\n" +
+ "RBB3A/+RUX+qbAEA3FWCs2bUl6pmasXP8QAi0/zoruZiShR2Y2mVAM3T1ATN\n" +
+ "FXJldm9rZWRAZmxvd2NyeXB0LmNvbcJeBBMWCgAGBQJhbwFrAAoJEF8Vl4kQ\n" +
+ "oXgKecoBALdrD8nkptLlT8Dg4cF+3swfY1urlbdEfEvIjN60HRDLAP4w3qeS\n" +
+ "zZ+OyuqPFaw7dM2KOu4++WigtbxRpDhpQ9U8BQ==\n" +
+ "=bMwq\n" +
+ "-----END PGP PUBLIC KEY BLOCK-----\n",
"users": ["revoekd@flowcrypt.com", "revoked@flowcrypt.com"],
- "ids": [{ "fingerprint": "3931B7413DBB2FA60CEF85CE5F15978910A1780A", "longid": "5F15978910A1780A", "shortid": "10A1780A", "keywords": "GALLERY PROTECT TIME CANDY BLEAK ACCESS" }],
+ "ids": [{
+ "fingerprint": "3931B7413DBB2FA60CEF85CE5F15978910A1780A", "longid": "5F15978910A1780A",
+ "shortid": "10A1780A", "keywords": "GALLERY PROTECT TIME CANDY BLEAK ACCESS"
+ }],
"algo": { "algorithm": "eddsa", "curve": "ed25519", "algorithmId": 22 },
"created": 1634664782,
"lastModified": 1634664811,
@@ -433,8 +611,10 @@ ava.default('parseKeys - revoked', async t => {
ava.default('decryptKey', async t => {
const { keys: [key] } = getKeypairs('rsa1');
- const { data, json } = parseResponse(await endpoints.decryptKey({ armored: key.private, passphrases: [key.passphrase] }));
- const decryptedKey = await readKey({armoredKey: json.decryptedKey});
+ const { data, json } =
+ parseResponse(await endpoints.decryptKey({ armored: key.private, passphrases: [key.passphrase] }));
+ // tslint:disable-next-line:no-unsafe-any
+ const decryptedKey = await readKey({ armoredKey: json.decryptedKey });
expect(isFullyDecrypted(decryptedKey)).to.be.true;
expect(isFullyEncrypted(decryptedKey)).to.be.false;
expectNoData(data);
@@ -445,12 +625,13 @@ ava.default('encryptKey', async t => {
const passphrase = 'this is some pass phrase';
const { decrypted: [decryptedKey] } = getKeypairs('rsa1');
const { data, json } = parseResponse(await endpoints.encryptKey({ armored: decryptedKey, passphrase }));
- const encryptedKey = await readKey({armoredKey: json.encryptedKey});
+ // tslint:disable-next-line:no-unsafe-any
+ const encryptedKey = await readKey({ armoredKey: json.encryptedKey });
expect(isFullyEncrypted(encryptedKey)).to.be.true;
expect(isFullyDecrypted(encryptedKey)).to.be.false;
expect(await decryptKey({
privateKey: (encryptedKey as PrivateKey),
- passphrase: passphrase
+ passphrase
})).is.not.null;
expectNoData(data);
t.pass();
@@ -458,21 +639,24 @@ ava.default('encryptKey', async t => {
ava.default('decryptKey gpg-dummy', async t => {
const { keys: [key] } = getKeypairs('gpg-dummy');
- const encryptedKey = await readKey({armoredKey: key.private});
+ const encryptedKey = await readKey({ armoredKey: key.private });
expect(isFullyEncrypted(encryptedKey)).to.be.true;
expect(isFullyDecrypted(encryptedKey)).to.be.false;
const { json } = parseResponse(await endpoints.decryptKey({ armored: key.private, passphrases: [key.passphrase] }));
- const decryptedKey = await readKey({armoredKey: json.decryptedKey});
+ // tslint:disable-next-line:no-unsafe-any
+ const decryptedKey = await readKey({ armoredKey: json.decryptedKey });
expect(isFullyEncrypted(decryptedKey)).to.be.false;
expect(isFullyDecrypted(decryptedKey)).to.be.true;
const { json: json2 } = parseResponse(await endpoints.encryptKey(
{ armored: decryptedKey.armor(), passphrase: 'another pass phrase' }));
- const reEncryptedKey = await readKey({armoredKey: json2.encryptedKey});
+ // tslint:disable-next-line:no-unsafe-any
+ const reEncryptedKey = await readKey({ armoredKey: json2.encryptedKey });
expect(isFullyEncrypted(reEncryptedKey)).to.be.true;
expect(isFullyDecrypted(reEncryptedKey)).to.be.false;
const { json: json3 } = parseResponse(await endpoints.decryptKey(
{ armored: reEncryptedKey.armor(), passphrases: ['another pass phrase'] }));
- const reDecryptedKey = await readKey({armoredKey: json3.decryptedKey});
+ // tslint:disable-next-line:no-unsafe-any
+ const reDecryptedKey = await readKey({ armoredKey: json3.decryptedKey });
expect(isFullyEncrypted(reDecryptedKey)).to.be.false;
expect(isFullyDecrypted(reDecryptedKey)).to.be.true;
t.pass();
@@ -480,7 +664,8 @@ ava.default('decryptKey gpg-dummy', async t => {
ava.default('parseDecryptMsg compat direct-encrypted-text', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys }, [await getCompatAsset('direct-encrypted-text')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys }, [await getCompatAsset('direct-encrypted-text')]));
expectData(blocks, 'msgBlocks', [{ rendered: true, frameColor: 'green', htmlContent }]);
expect(decryptJson).to.deep.equal({ text, replyType: 'encrypted' });
t.pass();
@@ -488,7 +673,8 @@ ava.default('parseDecryptMsg compat direct-encrypted-text', async t => {
ava.default('parseDecryptMsg compat direct-encrypted-pgpmime', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys }, [await getCompatAsset('direct-encrypted-pgpmime')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys }, [await getCompatAsset('direct-encrypted-pgpmime')]));
expectData(blocks, 'msgBlocks', [{ rendered: true, frameColor: 'green', htmlContent }]);
expect(decryptJson).to.deep.equal({ text, replyType: 'encrypted', subject: 'direct encrypted pgpmime' });
t.pass();
@@ -496,7 +682,8 @@ ava.default('parseDecryptMsg compat direct-encrypted-pgpmime', async t => {
ava.default('parseDecryptMsg compat mime-email-plain', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-plain')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-plain')]));
expectData(blocks, 'msgBlocks', [{ rendered: true, frameColor: 'plain', htmlContent }]);
expect(decryptJson).to.deep.equal({ text, replyType: 'plain', subject: 'mime email plain' });
t.pass();
@@ -504,25 +691,37 @@ ava.default('parseDecryptMsg compat mime-email-plain', async t => {
ava.default('parseDecryptMsg compat mime-email-plain-iso-2201-jp', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-plain-iso-2201-jp')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-plain-iso-2201-jp')]));
const msg = 'Dear Tomas,\n \nWe\'ve sent you a new message about your app, ' +
'Enterprise FlowCrypt, app Apple ID: 1591462989. To view or reply to the ' +
'message, go to Resolution Center in App Store Connect.\n \nBest regards,\n' +
' App Store Review\n';
+ // tslint:disable:no-unsafe-any
expect(decryptJson.text).to.contain(msg);
expect(decryptJson.subject).to.eq('New Message from App Store Review Regarding Enterprise FlowCrypt');
expect(decryptJson.replyType).to.eq('plain');
- const html = 'Dear Tomas,
We\'ve sent you a new message about your app, Enterprise FlowCrypt, app Apple ID: 1591462989. To view or reply to the message, go to Resolution Center in App Store Connect.
Best regards,
App Store Review
';
+ // tslint:enable:no-unsafe-any
+ const html = 'Dear Tomas,
We\'ve sent you a new message about your app, Enterprise FlowCrypt, ' +
+ 'app Apple ID: 1591462989. To view or reply to the message, ' +
+ 'go to ' +
+ 'Resolution Center in App Store Connect.
Best regards,
App Store Review
';
const blocksObj = JSON.parse(blocks.toString().replace(/\\n/g, '').replace(/\s+/g, ' '));
+ // tslint:disable:no-unsafe-any
expect(blocksObj.type).eq('plainHtml');
expect(blocksObj.complete).eq(true);
expect(blocksObj.content).contains(html);
+ // tslint:enable:no-unsafe-any
t.pass();
});
ava.default('parseDecryptMsg compat mime-email-encrypted-inline-text', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-encrypted-inline-text')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-encrypted-inline-text')]));
expectData(blocks, 'msgBlocks', [{ rendered: true, frameColor: 'green', htmlContent }]);
expect(decryptJson).to.deep.equal({ text, replyType: 'encrypted', subject: 'mime email encrypted inline text' });
t.pass();
@@ -530,14 +729,17 @@ ava.default('parseDecryptMsg compat mime-email-encrypted-inline-text', async t =
ava.default('parseDecryptMsg compat mime-email-encrypted-inline-pgpmime', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-encrypted-inline-pgpmime')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-encrypted-inline-pgpmime')]));
expectData(blocks, 'msgBlocks', [{ rendered: true, frameColor: 'green', htmlContent }]);
expect(decryptJson).to.deep.equal({ text, replyType: 'encrypted', subject: 'mime email encrypted inline pgpmime' });
t.pass();
});
ava.default('zxcvbnStrengthBar', async t => {
- const { data, json } = parseResponse(await endpoints.zxcvbnStrengthBar({ guesses: 88946283684265, purpose: 'passphrase' }));
+ const { data, json } =
+ parseResponse(await endpoints.zxcvbnStrengthBar({ guesses: 88946283684265, purpose: 'passphrase' }));
expectNoData(data);
expect(json).to.deep.equal({
word: {
@@ -555,7 +757,9 @@ ava.default('zxcvbnStrengthBar', async t => {
ava.default('parseDecryptMsg compat mime-email-encrypted-inline-text-2 Mime-TextEncoder', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-encrypted-inline-text-2')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-encrypted-inline-text-2')]));
expectData(blocks, 'msgBlocks', [{ rendered: true, frameColor: 'green', htmlContent }]);
expect(decryptJson).to.deep.equal({ text, replyType: 'encrypted', subject: 'mime email encrytped inline text 2' });
t.pass();
@@ -563,10 +767,25 @@ ava.default('parseDecryptMsg compat mime-email-encrypted-inline-text-2 Mime-Text
ava.default('parseDecryptMsg - decryptErr wrong key when dencrypting content', async t => {
const { keys } = getKeypairs('rsa2'); // intentional key mismatch
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys }, [await getCompatAsset('direct-encrypted-text')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys },
+ [await getCompatAsset('direct-encrypted-text')]));
expectData(blocks, 'msgBlocks', [{
"type": "decryptErr",
- "content": "-----BEGIN PGP MESSAGE-----\nVersion: FlowCrypt [BUILD_REPLACEABLE_VERSION] Gmail Encryption\nComment: Seamlessly send and receive encrypted email\n\nwcBMAwurnAGLJl0iAQf+I2exIah3XL/zfPozDmVFSLJk4tBFIlIyFfGYcw5W\n+ebOL3Gu/+/oCIIlXrdP0FxIVEYnSEaevmB9p0FfXGpcw4Wr8PBnSubCkn2s\n+V//k6W1Uu915GmiwCgDkLTCP7vEHvwUglNvgAatDtNdJ3xrf2gjOOFiYQnn\n4JSI1msMfL5tmdFCyXm1g4mUe9MdVXfphrXIyvGu1Sufhv+T5FgteDW0c6lM\ng7G6jgX4q5xiT8r2LTxKlxHVlQSqvGlnx/yRXwqBs3PAMiS4u5JlKJX4aKVy\nFyN+gq++tWZC1XCSFzXfAf0rXcoDZ7nEkxdkKQqXgA6LCsFD79FMCtuenvzU\nU9JEAdvmmpGlextZcfCUmGgclQXgowDnjaXy5Uc6Bzmi8AlY/4MFo0Q3bOU4\nkNhLCiXTGNJlFDd0HLz8Cy7YXzLWZ94IuGk=\n=Bvit\n-----END PGP MESSAGE-----\n",
+ "content": "-----BEGIN PGP MESSAGE-----\n" +
+ "Version: FlowCrypt [BUILD_REPLACEABLE_VERSION] Gmail Encryption\n" +
+ "Comment: Seamlessly send and receive encrypted email\n" +
+ "\n" +
+ "wcBMAwurnAGLJl0iAQf+I2exIah3XL/zfPozDmVFSLJk4tBFIlIyFfGYcw5W\n" +
+ "+ebOL3Gu/+/oCIIlXrdP0FxIVEYnSEaevmB9p0FfXGpcw4Wr8PBnSubCkn2s\n" +
+ "+V//k6W1Uu915GmiwCgDkLTCP7vEHvwUglNvgAatDtNdJ3xrf2gjOOFiYQnn\n" +
+ "4JSI1msMfL5tmdFCyXm1g4mUe9MdVXfphrXIyvGu1Sufhv+T5FgteDW0c6lM\n" +
+ "g7G6jgX4q5xiT8r2LTxKlxHVlQSqvGlnx/yRXwqBs3PAMiS4u5JlKJX4aKVy\n" +
+ "FyN+gq++tWZC1XCSFzXfAf0rXcoDZ7nEkxdkKQqXgA6LCsFD79FMCtuenvzU\n" +
+ "U9JEAdvmmpGlextZcfCUmGgclQXgowDnjaXy5Uc6Bzmi8AlY/4MFo0Q3bOU4\n" +
+ "kNhLCiXTGNJlFDd0HLz8Cy7YXzLWZ94IuGk=\n" +
+ "=Bvit\n" +
+ "-----END PGP MESSAGE-----\n",
"decryptErr": {
"success": false,
"error": {
@@ -589,7 +808,9 @@ ava.default('parseDecryptMsg - decryptErr wrong key when dencrypting content', a
ava.default('decryptFile - decryptErr wrong key when decrypting attachment', async t => {
const jsonReq = { keys: getKeypairs('rsa2').keys }; // intentional key mismatch
- const { json: decryptJson } = parseResponse(await endpoints.decryptFile(jsonReq, [await getCompatAsset('direct-encrypted-key-mismatch-file')]));
+ const { json: decryptJson } =
+ parseResponse(await endpoints.decryptFile(jsonReq,
+ [await getCompatAsset('direct-encrypted-key-mismatch-file')]));
expect(decryptJson).to.deep.equal({
"decryptErr": {
"success": false,
@@ -611,27 +832,104 @@ ava.default('decryptFile - decryptErr wrong key when decrypting attachment', asy
ava.default('parseDecryptMsg compat mime-email-plain-html', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-plain-html')]));
- expectData(blocks, 'msgBlocks', [{ frameColor: 'plain', htmlContent: 'paragraph 1
paragraph 2 with bold
paragraph 3 with red i
', rendered: true }]);
- expect(decryptJson).to.deep.equal({ text: `paragraph 1\nparagraph 2 with bold\nparagraph 3 with red i`, replyType: 'plain', subject: 'mime email plain html' });
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-plain-html')]));
+ expectData(blocks, 'msgBlocks', [{
+ frameColor: 'plain',
+ htmlContent: 'paragraph 1
paragraph 2 with bold
paragraph 3 with ' +
+ 'red i
', rendered: true
+ }]);
+ expect(decryptJson).to.deep.equal({
+ text: `paragraph 1\nparagraph 2 with bold\nparagraph 3 with red i`,
+ replyType: 'plain', subject: 'mime email plain html'
+ });
t.pass();
});
ava.default('parseDecryptMsg compat mime-email-plain-with-pubkey', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-plain-with-pubkey')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-plain-with-pubkey')]));
const expected = [
{ rendered: true, frameColor: 'plain', htmlContent },
{
"type": "publicKey",
- "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxsBNBFwBWOEBB/9uIqBYIPDQbBqHMvGXhgnm+b2i5rNLXrrGoalrp7wYQ654\nZln/+ffxzttRLRiwRQAOG0z78aMDXAHRfI9d3GaRKTkhTqVY+C02E8NxgB3+\nmbSsF0Ui+oh1//LT1ic6ZnISCA7Q2h2U/DSAPNxDZUMu9kjh9TjkKlR81fiA\nlxuD05ivRxCnmZnzqZtHoUvvCqsENgRjO9a5oWpMwtdItjdRFF7UFKYpfeA+\nct0uUNMRVdPK7MXBEr2FdWiKN1K21dQ1pWiAwj/5cTA8hu5Jue2RcF8FcPfs\nniRihQkNqtLDsfY5no1B3xeSnyO2SES1bAHw8ObXZn/C/6jxFztkn4NbABEB\nAAHNEFRlc3QgPHRAZXN0LmNvbT7CwH8EEAEIACkFAlwBWOEGCwkHCAMCCRA6\nMPTMCpqPEAQVCAoCAxYCAQIZAQIbAwIeAQAKCRA6MPTMCpqPENaTB/0faBFR\n2k3RM7P427HyZOsZtqEPxuynsLUqmsAAup6LtPhir4CAsb5DSvgYrzC8pbrf\njCaodoB7hMXc8RxTbSh+vQc5Su4QwY8sqy7hyMXOGGWsRxnuZ8t8BeEJBIHy\nPguXIR+wYvo1eveC+NMxHhTtjoSIn/E4vW0W9j5OlFeTK7HTNCuidIE0Hk2k\nXnEEoNO7ztxPPxsHz9g56uMhyAhf3mqKfvUFo/FLLRBOpxLO0kk64yAMcAHm\nc6ZI5Fz10y48+hHEv/RFOwfub9asF5NWHltanqyiZ+kHeoaieYJFc6t7Mt3j\ng8qxMKTUKAEeCfHt1UJCjp/aIgJRU4JRXgYXzsBNBFwBWOEBB/9nclmx98vf\noSpPUccBczvuZxmqk+jY6Id+vBhBFoEhtdTSpaw/JNstf0dTXN8RCFjB0lHt\na51llTjSobqcFwAU54/HKDOW3qMVbvadaGILpuCMCxdMgLWlpZdYY7BApv1N\n9zpN+iQ2tIrvnUQ312xKOXF/W83NUJ1nTObQYNpsUZLLG2N3kz11HuBS3E9F\ngEOYYy1tLT53hs5btqvQ5Jp4Iw5cBoBoTAmv+dPMDKYBroBPwuFeNRIokwLT\nrVcxrXajxlXaGXmmGS3PZ00HXq2g7vKIqWliMLLIWFl+LlVb6O8bMeXOT1l0\nXSO9GlLOSMDEc7pY26vkmAjbWv7iUWHNABEBAAHCwGkEGAEIABMFAlwBWOEJ\nEDow9MwKmo8QAhsMAAoJEDow9MwKmo8QjTcH/1pYXyXW/rpBrDg7w/dXJCfT\n8+RVYlhW3kqMxbid7EB8zgGVTDr3us/ki99hc2HjsKbxUqrGBxeh3Mmui7OD\nCI8XFeYl7lSDbgU6mZ5J4iXzdR8LNqIib4Horlx/Y24dOuvikSUNpDtFAYfa\nbZwxyKa/ihZT1rS1GO3V7tdAB9BJagJqVRssF5g5GBUAX3sxQ2p62HoUxPlJ\nOOr4AaCc1na92xScBJL8dtBBRQ5pUZWOjb2UHp9L5QdPaBX8T9ZAieOiTlSt\nQxoUfCk7RU0/TnsM3KqFnDFoCzkGxKAmU4LmGtP48qV+v2Jzvl+qcmqYuKtw\nH6FWd+EZH07MfdEIiTI=\n=wXbX\n-----END PGP PUBLIC KEY BLOCK-----\n",
+ "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" +
+ "\n" +
+ "xsBNBFwBWOEBB/9uIqBYIPDQbBqHMvGXhgnm+b2i5rNLXrrGoalrp7wYQ654\n" +
+ "Zln/+ffxzttRLRiwRQAOG0z78aMDXAHRfI9d3GaRKTkhTqVY+C02E8NxgB3+\n" +
+ "mbSsF0Ui+oh1//LT1ic6ZnISCA7Q2h2U/DSAPNxDZUMu9kjh9TjkKlR81fiA\n" +
+ "lxuD05ivRxCnmZnzqZtHoUvvCqsENgRjO9a5oWpMwtdItjdRFF7UFKYpfeA+\n" +
+ "ct0uUNMRVdPK7MXBEr2FdWiKN1K21dQ1pWiAwj/5cTA8hu5Jue2RcF8FcPfs\n" +
+ "niRihQkNqtLDsfY5no1B3xeSnyO2SES1bAHw8ObXZn/C/6jxFztkn4NbABEB\n" +
+ "AAHNEFRlc3QgPHRAZXN0LmNvbT7CwH8EEAEIACkFAlwBWOEGCwkHCAMCCRA6\n" +
+ "MPTMCpqPEAQVCAoCAxYCAQIZAQIbAwIeAQAKCRA6MPTMCpqPENaTB/0faBFR\n" +
+ "2k3RM7P427HyZOsZtqEPxuynsLUqmsAAup6LtPhir4CAsb5DSvgYrzC8pbrf\n" +
+ "jCaodoB7hMXc8RxTbSh+vQc5Su4QwY8sqy7hyMXOGGWsRxnuZ8t8BeEJBIHy\n" +
+ "PguXIR+wYvo1eveC+NMxHhTtjoSIn/E4vW0W9j5OlFeTK7HTNCuidIE0Hk2k\n" +
+ "XnEEoNO7ztxPPxsHz9g56uMhyAhf3mqKfvUFo/FLLRBOpxLO0kk64yAMcAHm\n" +
+ "c6ZI5Fz10y48+hHEv/RFOwfub9asF5NWHltanqyiZ+kHeoaieYJFc6t7Mt3j\n" +
+ "g8qxMKTUKAEeCfHt1UJCjp/aIgJRU4JRXgYXzsBNBFwBWOEBB/9nclmx98vf\n" +
+ "oSpPUccBczvuZxmqk+jY6Id+vBhBFoEhtdTSpaw/JNstf0dTXN8RCFjB0lHt\n" +
+ "a51llTjSobqcFwAU54/HKDOW3qMVbvadaGILpuCMCxdMgLWlpZdYY7BApv1N\n" +
+ "9zpN+iQ2tIrvnUQ312xKOXF/W83NUJ1nTObQYNpsUZLLG2N3kz11HuBS3E9F\n" +
+ "gEOYYy1tLT53hs5btqvQ5Jp4Iw5cBoBoTAmv+dPMDKYBroBPwuFeNRIokwLT\n" +
+ "rVcxrXajxlXaGXmmGS3PZ00HXq2g7vKIqWliMLLIWFl+LlVb6O8bMeXOT1l0\n" +
+ "XSO9GlLOSMDEc7pY26vkmAjbWv7iUWHNABEBAAHCwGkEGAEIABMFAlwBWOEJ\n" +
+ "EDow9MwKmo8QAhsMAAoJEDow9MwKmo8QjTcH/1pYXyXW/rpBrDg7w/dXJCfT\n" +
+ "8+RVYlhW3kqMxbid7EB8zgGVTDr3us/ki99hc2HjsKbxUqrGBxeh3Mmui7OD\n" +
+ "CI8XFeYl7lSDbgU6mZ5J4iXzdR8LNqIib4Horlx/Y24dOuvikSUNpDtFAYfa\n" +
+ "bZwxyKa/ihZT1rS1GO3V7tdAB9BJagJqVRssF5g5GBUAX3sxQ2p62HoUxPlJ\n" +
+ "OOr4AaCc1na92xScBJL8dtBBRQ5pUZWOjb2UHp9L5QdPaBX8T9ZAieOiTlSt\n" +
+ "QxoUfCk7RU0/TnsM3KqFnDFoCzkGxKAmU4LmGtP48qV+v2Jzvl+qcmqYuKtw\n" +
+ "H6FWd+EZH07MfdEIiTI=\n" +
+ "=wXbX\n" +
+ "-----END PGP PUBLIC KEY BLOCK-----\n",
"complete": true,
"keyDetails": {
- "public": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxsBNBFwBWOEBB/9uIqBYIPDQbBqHMvGXhgnm+b2i5rNLXrrGoalrp7wYQ654\nZln/+ffxzttRLRiwRQAOG0z78aMDXAHRfI9d3GaRKTkhTqVY+C02E8NxgB3+\nmbSsF0Ui+oh1//LT1ic6ZnISCA7Q2h2U/DSAPNxDZUMu9kjh9TjkKlR81fiA\nlxuD05ivRxCnmZnzqZtHoUvvCqsENgRjO9a5oWpMwtdItjdRFF7UFKYpfeA+\nct0uUNMRVdPK7MXBEr2FdWiKN1K21dQ1pWiAwj/5cTA8hu5Jue2RcF8FcPfs\nniRihQkNqtLDsfY5no1B3xeSnyO2SES1bAHw8ObXZn/C/6jxFztkn4NbABEB\nAAHNEFRlc3QgPHRAZXN0LmNvbT7CwH8EEAEIACkFAlwBWOEGCwkHCAMCCRA6\nMPTMCpqPEAQVCAoCAxYCAQIZAQIbAwIeAQAKCRA6MPTMCpqPENaTB/0faBFR\n2k3RM7P427HyZOsZtqEPxuynsLUqmsAAup6LtPhir4CAsb5DSvgYrzC8pbrf\njCaodoB7hMXc8RxTbSh+vQc5Su4QwY8sqy7hyMXOGGWsRxnuZ8t8BeEJBIHy\nPguXIR+wYvo1eveC+NMxHhTtjoSIn/E4vW0W9j5OlFeTK7HTNCuidIE0Hk2k\nXnEEoNO7ztxPPxsHz9g56uMhyAhf3mqKfvUFo/FLLRBOpxLO0kk64yAMcAHm\nc6ZI5Fz10y48+hHEv/RFOwfub9asF5NWHltanqyiZ+kHeoaieYJFc6t7Mt3j\ng8qxMKTUKAEeCfHt1UJCjp/aIgJRU4JRXgYXzsBNBFwBWOEBB/9nclmx98vf\noSpPUccBczvuZxmqk+jY6Id+vBhBFoEhtdTSpaw/JNstf0dTXN8RCFjB0lHt\na51llTjSobqcFwAU54/HKDOW3qMVbvadaGILpuCMCxdMgLWlpZdYY7BApv1N\n9zpN+iQ2tIrvnUQ312xKOXF/W83NUJ1nTObQYNpsUZLLG2N3kz11HuBS3E9F\ngEOYYy1tLT53hs5btqvQ5Jp4Iw5cBoBoTAmv+dPMDKYBroBPwuFeNRIokwLT\nrVcxrXajxlXaGXmmGS3PZ00HXq2g7vKIqWliMLLIWFl+LlVb6O8bMeXOT1l0\nXSO9GlLOSMDEc7pY26vkmAjbWv7iUWHNABEBAAHCwGkEGAEIABMFAlwBWOEJ\nEDow9MwKmo8QAhsMAAoJEDow9MwKmo8QjTcH/1pYXyXW/rpBrDg7w/dXJCfT\n8+RVYlhW3kqMxbid7EB8zgGVTDr3us/ki99hc2HjsKbxUqrGBxeh3Mmui7OD\nCI8XFeYl7lSDbgU6mZ5J4iXzdR8LNqIib4Horlx/Y24dOuvikSUNpDtFAYfa\nbZwxyKa/ihZT1rS1GO3V7tdAB9BJagJqVRssF5g5GBUAX3sxQ2p62HoUxPlJ\nOOr4AaCc1na92xScBJL8dtBBRQ5pUZWOjb2UHp9L5QdPaBX8T9ZAieOiTlSt\nQxoUfCk7RU0/TnsM3KqFnDFoCzkGxKAmU4LmGtP48qV+v2Jzvl+qcmqYuKtw\nH6FWd+EZH07MfdEIiTI=\n=wXbX\n-----END PGP PUBLIC KEY BLOCK-----\n",
+ "public": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" +
+ "\n" +
+ "xsBNBFwBWOEBB/9uIqBYIPDQbBqHMvGXhgnm+b2i5rNLXrrGoalrp7wYQ654\n" +
+ "Zln/+ffxzttRLRiwRQAOG0z78aMDXAHRfI9d3GaRKTkhTqVY+C02E8NxgB3+\n" +
+ "mbSsF0Ui+oh1//LT1ic6ZnISCA7Q2h2U/DSAPNxDZUMu9kjh9TjkKlR81fiA\n" +
+ "lxuD05ivRxCnmZnzqZtHoUvvCqsENgRjO9a5oWpMwtdItjdRFF7UFKYpfeA+\n" +
+ "ct0uUNMRVdPK7MXBEr2FdWiKN1K21dQ1pWiAwj/5cTA8hu5Jue2RcF8FcPfs\n" +
+ "niRihQkNqtLDsfY5no1B3xeSnyO2SES1bAHw8ObXZn/C/6jxFztkn4NbABEB\n" +
+ "AAHNEFRlc3QgPHRAZXN0LmNvbT7CwH8EEAEIACkFAlwBWOEGCwkHCAMCCRA6\n" +
+ "MPTMCpqPEAQVCAoCAxYCAQIZAQIbAwIeAQAKCRA6MPTMCpqPENaTB/0faBFR\n" +
+ "2k3RM7P427HyZOsZtqEPxuynsLUqmsAAup6LtPhir4CAsb5DSvgYrzC8pbrf\n" +
+ "jCaodoB7hMXc8RxTbSh+vQc5Su4QwY8sqy7hyMXOGGWsRxnuZ8t8BeEJBIHy\n" +
+ "PguXIR+wYvo1eveC+NMxHhTtjoSIn/E4vW0W9j5OlFeTK7HTNCuidIE0Hk2k\n" +
+ "XnEEoNO7ztxPPxsHz9g56uMhyAhf3mqKfvUFo/FLLRBOpxLO0kk64yAMcAHm\n" +
+ "c6ZI5Fz10y48+hHEv/RFOwfub9asF5NWHltanqyiZ+kHeoaieYJFc6t7Mt3j\n" +
+ "g8qxMKTUKAEeCfHt1UJCjp/aIgJRU4JRXgYXzsBNBFwBWOEBB/9nclmx98vf\n" +
+ "oSpPUccBczvuZxmqk+jY6Id+vBhBFoEhtdTSpaw/JNstf0dTXN8RCFjB0lHt\n" +
+ "a51llTjSobqcFwAU54/HKDOW3qMVbvadaGILpuCMCxdMgLWlpZdYY7BApv1N\n" +
+ "9zpN+iQ2tIrvnUQ312xKOXF/W83NUJ1nTObQYNpsUZLLG2N3kz11HuBS3E9F\n" +
+ "gEOYYy1tLT53hs5btqvQ5Jp4Iw5cBoBoTAmv+dPMDKYBroBPwuFeNRIokwLT\n" +
+ "rVcxrXajxlXaGXmmGS3PZ00HXq2g7vKIqWliMLLIWFl+LlVb6O8bMeXOT1l0\n" +
+ "XSO9GlLOSMDEc7pY26vkmAjbWv7iUWHNABEBAAHCwGkEGAEIABMFAlwBWOEJ\n" +
+ "EDow9MwKmo8QAhsMAAoJEDow9MwKmo8QjTcH/1pYXyXW/rpBrDg7w/dXJCfT\n" +
+ "8+RVYlhW3kqMxbid7EB8zgGVTDr3us/ki99hc2HjsKbxUqrGBxeh3Mmui7OD\n" +
+ "CI8XFeYl7lSDbgU6mZ5J4iXzdR8LNqIib4Horlx/Y24dOuvikSUNpDtFAYfa\n" +
+ "bZwxyKa/ihZT1rS1GO3V7tdAB9BJagJqVRssF5g5GBUAX3sxQ2p62HoUxPlJ\n" +
+ "OOr4AaCc1na92xScBJL8dtBBRQ5pUZWOjb2UHp9L5QdPaBX8T9ZAieOiTlSt\n" +
+ "QxoUfCk7RU0/TnsM3KqFnDFoCzkGxKAmU4LmGtP48qV+v2Jzvl+qcmqYuKtw\n" +
+ "H6FWd+EZH07MfdEIiTI=\n" +
+ "=wXbX\n" +
+ "-----END PGP PUBLIC KEY BLOCK-----\n",
"users": ["Test "],
"ids": [
- { "fingerprint": "E76853E128A0D376CAE47C143A30F4CC0A9A8F10", "longid": "3A30F4CC0A9A8F10", "shortid": "0A9A8F10", "keywords": "DEMAND MARBLE CREDIT BENEFIT POTTERY CAPITAL" },
- { "fingerprint": "9EF2F8F36A841C0D5FAB8B0F0BAB9C018B265D22", "longid": "0BAB9C018B265D22", "shortid": "8B265D22", "keywords": "ARM FRIEND ABOUT BIND GRAPE CATTLE" }
+ {
+ "fingerprint": "E76853E128A0D376CAE47C143A30F4CC0A9A8F10", "longid": "3A30F4CC0A9A8F10",
+ "shortid": "0A9A8F10", "keywords": "DEMAND MARBLE CREDIT BENEFIT POTTERY CAPITAL"
+ },
+ {
+ "fingerprint": "9EF2F8F36A841C0D5FAB8B0F0BAB9C018B265D22", "longid": "0BAB9C018B265D22",
+ "shortid": "8B265D22", "keywords": "ARM FRIEND ABOUT BIND GRAPE CATTLE"
+ }
],
"algo": { "algorithm": "rsaEncryptSign", "bits": 2047, "algorithmId": 1 },
"created": 1543592161,
@@ -647,7 +945,9 @@ ava.default('parseDecryptMsg compat mime-email-plain-with-pubkey', async t => {
ava.default('parseDecryptMsg plainAtt', async t => {
const { keys } = getKeypairs('rsa1');
- const { data: blocks, json: decryptJson } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true }, [await getCompatAsset('mime-email-plain-with-attachment')]));
+ const { data: blocks, json: decryptJson } =
+ parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true },
+ [await getCompatAsset('mime-email-plain-with-attachment')]));
expectData(blocks, 'msgBlocks', [
{ rendered: true, frameColor: 'plain', htmlContent },
{
@@ -681,12 +981,16 @@ ava.default('can process dirty html without throwing', async t => {
ava.default('verify encrypted+signed message by providing it correct public key', async t => {
const { keys, pubKeys } = getKeypairs('rsa1');
- const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys }, [await getCompatAsset('mime-email-encrypted-inline-text-signed')]));
+ const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg(
+ { keys, isEmail: true, verificationPubkeys: pubKeys },
+ [await getCompatAsset('mime-email-encrypted-inline-text-signed')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('encrypted');
expect(decryptJson.subject).equals('mime email encrypted inline text signed');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
expect(parsedDecryptData.verifyRes.match).equals(true);
+ // tslint:enable:no-unsafe-any
t.pass();
});
@@ -696,35 +1000,49 @@ ava.default('verify encrypted+signed message by providing it one wrong and one c
const allPubKeys = [];
for (const pubkey of pubKeys2) allPubKeys.push(pubkey);
for (const pubkey of pubKeys) allPubKeys.push(pubkey);
- const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys }, [await getCompatAsset('mime-email-encrypted-inline-text-signed')]));
+ const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg(
+ { keys, isEmail: true, verificationPubkeys: pubKeys },
+ [await getCompatAsset('mime-email-encrypted-inline-text-signed')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('encrypted');
expect(decryptJson.subject).equals('mime email encrypted inline text signed');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
expect(parsedDecryptData.verifyRes.match).equals(true);
+ // tslint:enable:no-unsafe-any
t.pass();
});
-ava.default('verify encrypted+signed message by providing it only a wrong public key (fail: cannot verify)', async t => {
- const { keys } = getKeypairs('rsa1');
- const { pubKeys: pubKeys2 } = getKeypairs('rsa2');
- const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys2 }, [await getCompatAsset('mime-email-encrypted-inline-text-signed')]));
- expect(decryptJson.replyType).equals('encrypted');
- expect(decryptJson.subject).equals('mime email encrypted inline text signed');
- const parsedDecryptData = JSON.parse(decryptData.toString());
- expect(!!parsedDecryptData.verifyRes).equals(true);
- expect(parsedDecryptData.verifyRes.match).equals(null);
- t.pass();
-});
+ava.default('verify encrypted+signed message by providing it only a wrong public key (fail: cannot verify)',
+ async t => {
+ const { keys } = getKeypairs('rsa1');
+ const { pubKeys: pubKeys2 } = getKeypairs('rsa2');
+ const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg(
+ { keys, isEmail: true, verificationPubkeys: pubKeys2 },
+ [await getCompatAsset('mime-email-encrypted-inline-text-signed')]));
+ // tslint:disable:no-unsafe-any
+ expect(decryptJson.replyType).equals('encrypted');
+ expect(decryptJson.subject).equals('mime email encrypted inline text signed');
+ const parsedDecryptData = JSON.parse(decryptData.toString());
+ expect(!!parsedDecryptData.verifyRes).equals(true);
+ /* tslint:disable-next-line:no-null-keyword */
+ expect(parsedDecryptData.verifyRes.match).equals(null);
+ // tslint:enable:no-unsafe-any
+ t.pass();
+ });
ava.default('verify plain-text signed message by providing it correct key', async t => {
const { keys, pubKeys } = getKeypairs('rsa1');
- const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys }, [await getCompatAsset('mime-email-plain-signed')]));
+ const { json: decryptJson, data: decryptData } = parseResponse(await endpoints.parseDecryptMsg(
+ { keys, isEmail: true, verificationPubkeys: pubKeys },
+ [await getCompatAsset('mime-email-plain-signed')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('plain');
expect(decryptJson.subject).equals('mime email plain signed');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
expect(parsedDecryptData.verifyRes.match).equals(true);
+ // tslint:enable:no-unsafe-any
t.pass();
});
@@ -737,11 +1055,13 @@ ava.default('verify plain-text signed message by providing it both correct and i
const { json: decryptJson, data: decryptData } = parseResponse(
await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys },
[await getCompatAsset('mime-email-plain-signed')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('plain');
expect(decryptJson.subject).equals('mime email plain signed');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
expect(parsedDecryptData.verifyRes.match).equals(true);
+ // tslint:enable:no-unsafe-any
t.pass();
});
@@ -751,24 +1071,31 @@ ava.default('verify plain-text signed message by providing it wrong key (fail: c
const { json: decryptJson, data: decryptData } = parseResponse(
await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys2 },
[await getCompatAsset('mime-email-plain-signed')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('plain');
expect(decryptJson.subject).equals('mime email plain signed');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
+ /* tslint:disable:no-null-keyword */
expect(parsedDecryptData.verifyRes.match).equals(null);
+ /* tslint:enable:no-null-keyword */
+ // tslint:enable:no-unsafe-any
t.pass();
});
+// eslint-disable-next-line max-len
ava.default('verify plain-text signed message that you edited after signing. This invalidates the signature. With correct key. (fail: signature mismatch)', async t => {
const { keys, pubKeys } = getKeypairs('rsa1');
const { json: decryptJson, data: decryptData } = parseResponse(
await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys },
[await getCompatAsset('mime-email-plain-signed-edited')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('plain');
expect(decryptJson.subject).equals('mime email plain signed');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
expect(parsedDecryptData.verifyRes.match).is.null;
+ // tslint:enable:no-unsafe-any
t.pass();
});
@@ -777,11 +1104,13 @@ ava.default('verify signed message with detached signature by providing it corre
const { json: decryptJson, data: decryptData } = parseResponse(
await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys },
[await getCompatAsset('mime-email-plain-signed-detached')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('plain');
expect(decryptJson.subject).equals('mime email plain signed detached');
const parsedDecryptData = JSON.parse(decryptData.toString());
expect(!!parsedDecryptData.verifyRes).equals(true);
expect(parsedDecryptData.verifyRes.match).equals(true);
+ // tslint:enable:no-unsafe-any
t.pass();
});
@@ -790,10 +1119,12 @@ ava.default('decryptErr for not integrity protected message', async t => {
const { json: decryptJson, data: decryptData } = parseResponse(
await endpoints.parseDecryptMsg({ keys, isEmail: true, verificationPubkeys: pubKeys },
[await getCompatAsset('mime-email-not-integrity-protected')]));
+ // tslint:disable:no-unsafe-any
expect(decryptJson.replyType).equals('plain');
expect(decryptJson.subject).equals('not integrity protected - should show a warning and not decrypt automatically');
const blocks = decryptData.toString().split('\n').map(block => JSON.parse(block));
expect(blocks[1].decryptErr.error.type).equals('no_mdc');
+ // tslint:enable:no-unsafe-any
t.pass();
});
@@ -929,6 +1260,7 @@ FraCqKUj088pjlLZsORJCsLOgugt7y4O9lf7fNiRo3I81LZsqegqdzcvCeK9
PBcqDCjq5jgMhU1oyVclRK7jJdmu0Azvwo2lleLAFLdCzHEXWXUz
=//ru
-----END PGP PRIVATE KEY BLOCK-----`;
- expect((await PgpKey.parse(unencryptedCorruptedRsaKey)).error).to.equals('Key is invalid');
+ const res = await PgpKey.parse(unencryptedCorruptedRsaKey);
+ expect(res.error).to.equals('Key is invalid');
t.pass();
});
diff --git a/Core/source/test/subprocess.ts b/Core/source/test/subprocess.ts
index f83589d68..9a7e7fce0 100644
--- a/Core/source/test/subprocess.ts
+++ b/Core/source/test/subprocess.ts
@@ -1,4 +1,4 @@
-/* © 2016-present FlowCrypt a. s. Limitations apply. Contact human@flowcrypt.com */
+/* ©️ 2016 - present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com */
import * as child_process from 'child_process';
import * as setNodeCleanupCb from 'node-cleanup';
@@ -22,52 +22,62 @@ export class Subprocess {
/**
* user to replace this with a callback
*/
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
public static onStdout = (r: { stdout: Buffer, cmd: string, args: string[] }): void => undefined;
/**
* user to replace this with a callback
*/
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
public static onStderr = (r: { stderr: Buffer, cmd: string, args: string[] }): void => undefined;
- public static spawn = (cmd: string, rawArgs: (string | number)[], readiness_indicator?: string, env?: { [k: string]: string }): Promise => new Promise((resolve, reject) => {
- let ready = false;
- const args = rawArgs.map(String);
- const p: child_process.ChildProcess = child_process.spawn(cmd, args, { env });
- PROCESSES.push(p);
- if (p.stdout) {
- p.stdout.on('data', (stdout: Buffer) => {
- Subprocess.onStdout({ cmd, args, stdout: stdout });
- if (readiness_indicator && !ready && stdout.indexOf(readiness_indicator) !== -1) {
- ready = true;
- resolve(p);
- }
- });
- }
- if (p.stderr) {
- p.stderr.on('data', (stderr: Buffer) => {
- Subprocess.onStderr({ cmd, args, stderr: stderr });
- if (readiness_indicator && !ready && stderr.indexOf(readiness_indicator) !== -1) {
- ready = true;
- resolve(p);
- }
- });
- }
- if (readiness_indicator) {
- setTimeout(() => {
- if (!ready) {
- reject(new ProcessNotReady(`Process did not become ready in ${SPAWN_READINESS_TIMEOUT} by outputting <${readiness_indicator}>`, [cmd].concat(rawArgs as string[])));
- p.kill();
- }
- }, SPAWN_READINESS_TIMEOUT);
- } else {
- resolve(p);
- }
- });
+ public static spawn = (cmd: string, rawArgs: (string | number)[], readiness_indicator?: string,
+ env?: { [k: string]: string }): Promise => {
+ return new Promise((resolve, reject) => {
+ let ready = false;
+ const args = rawArgs.map(String);
+ const p: child_process.ChildProcess = child_process.spawn(cmd, args, { env });
+ PROCESSES.push(p);
+ if (p.stdout) {
+ p.stdout.on('data', (stdout: Buffer) => {
+ Subprocess.onStdout({ cmd, args, stdout: stdout });
+ if (readiness_indicator && !ready && stdout.indexOf(readiness_indicator) !== -1) {
+ ready = true;
+ resolve(p);
+ }
+ });
+ }
+ if (p.stderr) {
+ p.stderr.on('data', (stderr: Buffer) => {
+ Subprocess.onStderr({ cmd, args, stderr: stderr });
+ if (readiness_indicator && !ready && stderr.indexOf(readiness_indicator) !== -1) {
+ ready = true;
+ resolve(p);
+ }
+ });
+ }
+ if (readiness_indicator) {
+ setTimeout(() => {
+ if (!ready) {
+ reject(new ProcessNotReady(
+ `Process did not become ready in ${SPAWN_READINESS_TIMEOUT} ` +
+ `by outputting <${readiness_indicator}>`, [cmd].concat(rawArgs as string[])));
+ p.kill();
+ }
+ }, SPAWN_READINESS_TIMEOUT);
+ } else {
+ resolve(p);
+ }
+ });
+ };
- public static exec = (file: string, ...args: (string | number)[]): Promise<{ stdout: string, stderr: string }> => new Promise((resolve, reject) => {
- const p = child_process.execFile(file, args.map(String), (err, stdout, stderr) => err ? reject(err) : resolve({ stdout, stderr }));
- PROCESSES.push(p);
- });
+ public static exec = (file: string, ...args: (string | number)[]): Promise<{ stdout: string, stderr: string }> => {
+ return new Promise((resolve, reject) => {
+ const p = child_process.execFile(file, args.map(String), (err, stdout, stderr) =>
+ err ? reject(err) : resolve({ stdout, stderr }));
+ PROCESSES.push(p);
+ });
+ };
public static killall = (signal: 'SIGINT' | 'SIGKILL' | 'SIGTERM' = 'SIGTERM') => {
for (const p of PROCESSES) {
@@ -76,9 +86,9 @@ export class Subprocess {
}
}
};
-
}
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
setNodeCleanupCb((exit_code, signal) => {
Subprocess.killall('SIGTERM');
return undefined;
diff --git a/Core/source/test/test-utils.ts b/Core/source/test/test-utils.ts
index 396329d01..243d49bc1 100644
--- a/Core/source/test/test-utils.ts
+++ b/Core/source/test/test-utils.ts
@@ -1,4 +1,4 @@
-/* © 2016-present FlowCrypt a. s. Limitations apply. Contact human@flowcrypt.com */
+/* ©️ 2016 - present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com */
'use strict';
@@ -8,7 +8,7 @@ import * as fs from 'fs';
import { config, expect } from 'chai';
import { Buf } from '../core/buf';
import { EndpointRes } from '../mobile-interface/format-output';
-config.truncateThreshold = 0
+config.truncateThreshold = 0;
export type AvaContext = ava.ExecutionContext;
type JsonDict = { [k: string]: any };
@@ -16,12 +16,13 @@ type TestKey = { pubKey: string, private: string, decrypted: string, passphrase:
export const parseResponse = (response: EndpointRes) => {
return { json: JSON.parse(response.json), data: response.data };
-}
+};
export const httpGet = async (url: string): Promise => {
return await new Promise((resolve, reject) => {
const req = https.request(url, r => {
const buffers: Buffer[] = [];
+ // tslint:disable-next-line:no-unsafe-any
r.on('data', buffer => buffers.push(buffer));
r.on('end', () => {
const buf = Buf.fromUint8(Buffer.concat(buffers));
@@ -36,18 +37,19 @@ export const httpGet = async (url: string): Promise => {
req.on('error', reject);
req.end();
});
-}
+};
export const expectEmptyJson = (json: JsonDict) => {
expect(Object.keys(json)).to.have.property('length').that.equals(0);
-}
+};
export const expectNoData = (data: Uint8Array) => {
expect(data).to.be.instanceof(Uint8Array);
expect(data).to.have.property('length').that.equals(0);
-}
+};
-export const expectData = (_data: Uint8Array, type?: 'armoredMsg' | 'msgBlocks' | 'binary', details?: any[] | Buffer) => {
+export const expectData = (_data: Uint8Array, type?: 'armoredMsg' | 'msgBlocks' | 'binary',
+ details?: any[] | Buffer) => {
expect(_data).to.be.instanceof(Uint8Array);
const data = Buffer.from(_data);
expect(data).to.have.property('length').that.does.not.equal(0);
@@ -56,27 +58,38 @@ export const expectData = (_data: Uint8Array, type?: 'armoredMsg' | 'msgBlocks'
expect(dataStr).to.contain('-----BEGIN PGP MESSAGE-----');
expect(dataStr).to.contain('-----END PGP MESSAGE-----');
} else if (type === 'msgBlocks') {
+ // tslint:disable-next-line:no-unsafe-any
const blocks = data.toString().split('\n').map(block => JSON.parse(block));
expect(details).to.be.instanceOf(Array);
const expectedBlocks = details as any[];
expect(blocks).to.have.property('length').which.is.greaterThan(0);
- expect(blocks[0]).to.have.property('type').which.equals('plainHtml'); // todo plainHtml - should be renambed - legacy compat reasons
+ // todo plainHtml - should be renambed - legacy compat reasons
+ expect(blocks[0]).to.have.property('type').which.equals('plainHtml');
const renderedContentBlocksBlock = blocks.shift();
+ // tslint:disable-next-line:no-unsafe-any
const [head, body, foot] = renderedContentBlocksBlock.content.split(/<\/?body>/g);
expect(head).to.contain('');
expect(head).to.contain('