mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Replaced prompt() into a AskPopupView.password() Promise
This commit is contained in:
parent
1f0af5c0ac
commit
d9f50fa829
3 changed files with 38 additions and 8 deletions
|
|
@ -11,8 +11,12 @@ import Remote from 'Remote/User/Fetch';
|
||||||
|
|
||||||
import { showScreenPopup } from 'Knoin/Knoin';
|
import { showScreenPopup } from 'Knoin/Knoin';
|
||||||
import { OpenPgpKeyPopupView } from 'View/Popup/OpenPgpKey';
|
import { OpenPgpKeyPopupView } from 'View/Popup/OpenPgpKey';
|
||||||
|
import { AskPopupView } from 'View/Popup/Ask';
|
||||||
|
|
||||||
const
|
const
|
||||||
|
askPassphrase = async privateKey =>
|
||||||
|
await AskPopupView.password('GnuPG key<br>' + privateKey.id + ' ' + privateKey.emails[0]),
|
||||||
|
|
||||||
findGnuPGKey = (keys, query, sign) =>
|
findGnuPGKey = (keys, query, sign) =>
|
||||||
keys.find(key =>
|
keys.find(key =>
|
||||||
key[sign ? 'can_sign' : 'can_decrypt']
|
key[sign ? 'can_sign' : 'can_decrypt']
|
||||||
|
|
@ -169,7 +173,7 @@ export const GnuPGUserStore = new class {
|
||||||
Uid: message.uid,
|
Uid: message.uid,
|
||||||
PartId: pgpInfo.PartId,
|
PartId: pgpInfo.PartId,
|
||||||
KeyId: key.id,
|
KeyId: key.id,
|
||||||
Passphrase: prompt('GnuPG Passphrase for ' + key.id + ' ' + key.uids[0].uid),
|
Passphrase: await askPassphrase(key),
|
||||||
Data: '' // message.plain() optional
|
Data: '' // message.plain() optional
|
||||||
}
|
}
|
||||||
if (null !== params.Passphrase) {
|
if (null !== params.Passphrase) {
|
||||||
|
|
@ -199,4 +203,12 @@ export const GnuPGUserStore = new class {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async sign(/*text, privateKey, detached*/) {
|
||||||
|
throw 'Sign failed';
|
||||||
|
}
|
||||||
|
|
||||||
|
async encrypt(/*text, recipients, signPrivateKey*/) {
|
||||||
|
throw 'Encrypt failed';
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import Remote from 'Remote/User/Fetch';
|
||||||
|
|
||||||
import { showScreenPopup } from 'Knoin/Knoin';
|
import { showScreenPopup } from 'Knoin/Knoin';
|
||||||
import { OpenPgpKeyPopupView } from 'View/Popup/OpenPgpKey';
|
import { OpenPgpKeyPopupView } from 'View/Popup/OpenPgpKey';
|
||||||
|
import { AskPopupView } from 'View/Popup/Ask';
|
||||||
|
|
||||||
const
|
const
|
||||||
findOpenPGPKey = (keys, query/*, sign*/) =>
|
findOpenPGPKey = (keys, query/*, sign*/) =>
|
||||||
|
|
@ -18,6 +19,9 @@ const
|
||||||
key.emails.includes(query) || query == key.id || query == key.fingerprint
|
key.emails.includes(query) || query == key.id || query == key.fingerprint
|
||||||
),
|
),
|
||||||
|
|
||||||
|
askPassphrase = async privateKey =>
|
||||||
|
await AskPopupView.password('OpenPGP.js key<br>' + privateKey.id + ' ' + privateKey.emails[0]),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OpenPGP.js v5 removed the localStorage (keyring)
|
* OpenPGP.js v5 removed the localStorage (keyring)
|
||||||
* This should be compatible with the old OpenPGP.js v2
|
* This should be compatible with the old OpenPGP.js v2
|
||||||
|
|
@ -180,8 +184,8 @@ export const OpenPGPUserStore = new class {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (privateKey) try {
|
if (privateKey) try {
|
||||||
// Ask passphrase of private key
|
const passphrase = await askPassphrase(privateKey);
|
||||||
const passphrase = prompt('OpenPGP.js Passphrase for ' + privateKey.id + ' ' + privateKey.emails[0]);
|
|
||||||
if (null !== passphrase) {
|
if (null !== passphrase) {
|
||||||
const
|
const
|
||||||
publicKey = findOpenPGPKey(this.publicKeys, sender/*, sign*/),
|
publicKey = findOpenPGPKey(this.publicKeys, sender/*, sign*/),
|
||||||
|
|
@ -243,7 +247,7 @@ export const OpenPGPUserStore = new class {
|
||||||
* https://docs.openpgpjs.org/global.html#sign
|
* https://docs.openpgpjs.org/global.html#sign
|
||||||
*/
|
*/
|
||||||
async sign(text, privateKey, detached) {
|
async sign(text, privateKey, detached) {
|
||||||
const passphrase = prompt('OpenPGP.js Passphrase for ' + privateKey.id + ' ' + privateKey.emails[0]);
|
const passphrase = await askPassphrase(privateKey);
|
||||||
if (null !== passphrase) {
|
if (null !== passphrase) {
|
||||||
privateKey = await openpgp.decryptKey({
|
privateKey = await openpgp.decryptKey({
|
||||||
privateKey: privateKey.key,
|
privateKey: privateKey.key,
|
||||||
|
|
@ -258,7 +262,7 @@ export const OpenPGPUserStore = new class {
|
||||||
detached: !!detached
|
detached: !!detached
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return false;
|
throw 'Sign cancelled';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -269,7 +273,7 @@ export const OpenPGPUserStore = new class {
|
||||||
recipients = recipients.map(email => this.publicKeys().find(key => key.emails.includes(email))).filter(key => key);
|
recipients = recipients.map(email => this.publicKeys().find(key => key.emails.includes(email))).filter(key => key);
|
||||||
if (count === recipients.length) {
|
if (count === recipients.length) {
|
||||||
if (signPrivateKey) {
|
if (signPrivateKey) {
|
||||||
const passphrase = prompt('OpenPGP.js Passphrase for ' + signPrivateKey.id + ' ' + signPrivateKey.emails[0]);
|
const passphrase = await askPassphrase(signPrivateKey);
|
||||||
if (null === passphrase) {
|
if (null === passphrase) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -285,6 +289,7 @@ export const OpenPGPUserStore = new class {
|
||||||
// signature
|
// signature
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
throw 'Encrypt failed';
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,8 @@ class AskPopupView extends AbstractViewPopup {
|
||||||
* @param {boolean=} bFocusYesOnShow = true
|
* @param {boolean=} bFocusYesOnShow = true
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
onShow(askDesc, fYesFunc = null, fNoFunc = null, yesButton = '', noButton = '', isFocusYesOnShow = true) {
|
onShow(sAskDesc, fYesFunc = null, fNoFunc = null, yesButton = '', noButton = '', isFocusYesOnShow = true) {
|
||||||
this.askDesc(askDesc || '');
|
this.askDesc(sAskDesc || '');
|
||||||
this.yesButton(yesButton || i18n('POPUPS_ASK/BUTTON_YES'));
|
this.yesButton(yesButton || i18n('POPUPS_ASK/BUTTON_YES'));
|
||||||
this.noButton(noButton || i18n('POPUPS_ASK/BUTTON_NO'));
|
this.noButton(noButton || i18n('POPUPS_ASK/BUTTON_NO'));
|
||||||
this.fYesAction = fYesFunc;
|
this.fYesAction = fYesFunc;
|
||||||
|
|
@ -75,4 +75,17 @@ class AskPopupView extends AbstractViewPopup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AskPopupView.password = function(sAskDesc) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
this.showModal([
|
||||||
|
sAskDesc + `<p>${i18n('GLOBAL/PASSWORD')}: <input type="password" autofocus=""></p>`,
|
||||||
|
() => resolve(this.__dom.querySelector('input[type="password"]').value),
|
||||||
|
() => resolve(null),
|
||||||
|
'',
|
||||||
|
i18n('GLOBAL/CANCEL'),
|
||||||
|
false
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export { AskPopupView, AskPopupView as default };
|
export { AskPopupView, AskPopupView as default };
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue