1
/* ***** BEGIN LICENSE BLOCK *****
2
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
* The contents of this file are subject to the Mozilla Public
5
* License Version 1.1 (the "MPL"); you may not use this file
6
* except in compliance with the MPL. You may obtain a copy of
7
* the MPL at http://www.mozilla.org/MPL/
9
* Software distributed under the MPL is distributed on an "AS
10
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11
* implied. See the MPL for the specific language governing
12
* rights and limitations under the MPL.
14
* The Original Code is Enigmail.
16
* The Initial Developer of the Original Code is Ramalingam Saravanan.
17
* Portions created by Ramalingam Saravanan <svn@xmlterm.org> are
18
* Copyright (C) 2002 Ramalingam Saravanan. All Rights Reserved.
21
* Patrick Brunschwig <patrick@mozilla-enigmail.org>
23
* Alternatively, the contents of this file may be used under the terms of
24
* either the GNU General Public License Version 2 or later (the "GPL"), or
25
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26
* in which case the provisions of the GPL or the LGPL are applicable instead
27
* of those above. If you wish to allow use of your version of this file only
28
* under the terms of either the GPL or the LGPL, and not to allow others to
29
* use your version of this file under the terms of the MPL, indicate your
30
* decision by deleting the provisions above and replace them with the notice
31
* and other provisions required by the GPL or the LGPL. If you do not delete
32
* the provisions above, a recipient may use your version of this file under
33
* the terms of any one of the MPL, the GPL or the LGPL.
34
* ***** END LICENSE BLOCK ***** */
36
// Uses: chrome://enigmail/content/enigmailCommon.js
37
Components.utils.import("resource://enigmail/enigmailCommon.jsm");
39
const Ec = EnigmailCommon;
41
// Initialize enigmailCommon
42
EnigInitCommon("enigmailKeygen");
44
var gAccountManager = Components.classes[ENIG_ACCOUNT_MANAGER_CONTRACTID].getService(Components.interfaces.nsIMsgAccountManager);
46
var gUserIdentityList;
47
var gUserIdentityListPopup;
52
var gGeneratedKey= null;
55
const KEYGEN_CANCELLED = "cancelled";
56
const KEYTYPE_DSA = 1;
57
const KEYTYPE_RSA = 2;
59
function enigmailKeygenLoad() {
60
DEBUG_LOG("enigmailKeygen.js: Load\n");
62
gUserIdentityList = document.getElementById("userIdentity");
63
gUserIdentityListPopup = document.getElementById("userIdentityPopup");
64
gUseForSigning = document.getElementById("useForSigning");
66
if (gUserIdentityListPopup) {
67
fillIdentityListPopup();
69
gUserIdentityList.focus();
71
enigmailKeygenUpdate(true, false);
73
var enigmailSvc = GetEnigmailSvc();
75
EnigAlert(EnigGetString("accessError"));
78
if (enigmailSvc.agentType != "gpg") {
79
EnigAlert(EnigGetString("onlyGPG"));
84
function enigmailOnClose() {
87
closeWin = EnigConfirm(EnigGetString("keyAbort"), EnigGetString("keyMan.button.generateKeyAbort"), EnigGetString("keyMan.button.generateKeyContinue"));
89
if (closeWin) abortKeyGeneration();
93
function enigmailKeygenUnload() {
94
DEBUG_LOG("enigmailKeygen.js: Unload\n");
96
enigmailKeygenCloseRequest();
100
function enigmailKeygenUpdate(getPrefs, setPrefs) {
101
DEBUG_LOG("enigmailKeygen.js: Update: "+getPrefs+", "+setPrefs+"\n");
103
var noPassphrase = document.getElementById("noPassphrase");
104
var noPassphraseChecked = getPrefs ? EnigGetPref("noPassphrase")
105
: noPassphrase.checked;
108
EnigSetPref("noPassphrase", noPassphraseChecked);
111
noPassphrase.checked = noPassphraseChecked;
113
var passphrase1 = document.getElementById("passphrase");
114
var passphrase2 = document.getElementById("passphraseRepeat");
115
passphrase1.disabled = noPassphraseChecked;
116
passphrase2.disabled = noPassphraseChecked;
118
var commentElement = document.getElementById("keyComment");
119
if (noPassphraseChecked) {
120
if (commentElement.value == "") commentElement.value = EnigGetString("keyGenNoPassphrase");
123
if (commentElement.value == EnigGetString("keyGenNoPassphrase")) commentElement.value = "";
127
function enigmailKeygenTerminate(exitCode) {
128
DEBUG_LOG("enigmailKeygen.js: Terminate:\n");
132
gKeygenRequest = null;
134
if ((! gGeneratedKey) || gGeneratedKey == KEYGEN_CANCELLED) return;
136
var progMeter = document.getElementById("keygenProgress");
137
progMeter.setAttribute("value", 100);
140
if (gUseForSigning.checked) {
141
curId.setBoolAttribute("enablePgp", true);
142
curId.setIntAttribute("pgpKeyMode", 1);
143
curId.setCharAttribute("pgpkeyId", "0x"+gGeneratedKey.substr(-8,8));
145
enigmailKeygenUpdate(false, true);
149
if (EnigConfirm(EnigGetString("keygenComplete", curId.email)+"\n\n"+EnigGetString("revokeCertRecommended"), EnigGetString("keyMan.button.generateCert"))) {
150
EnigCreateRevokeCert(gGeneratedKey, curId.email, closeAndReset);
156
if (EnigConfirm(EnigGetString("genCompleteNoSign")+"\n\n"+EnigGetString("revokeCertRecommended"), EnigGetString("keyMan.button.generateCert"))) {
157
EnigCreateRevokeCert(gGeneratedKey, curId.email, closeAndReset);
164
EnigAlert(EnigGetString("keyGenFailed"));
169
function closeAndReset() {
170
var enigmailSvc = GetEnigmailSvc();
171
enigmailSvc.invalidateUserIdList();
176
function enigmailKeygenCloseRequest() {
177
DEBUG_LOG("enigmailKeygen.js: CloseRequest\n");
179
if (gKeygenRequest) {
180
var p = gKeygenRequest;
181
gKeygenRequest = null;
186
function enigmailCheckPassphrase() {
187
var passphraseElement = document.getElementById("passphrase");
188
var passphrase2Element = document.getElementById("passphraseRepeat");
190
var passphrase = passphraseElement.value;
192
if (passphrase != passphrase2Element.value) {
193
EnigAlert(EnigGetString("passNoMatch"));
197
if (passphrase.search(/[\x80-\xFF]/)>=0) {
198
EnigAlert(EnigGetString("passCharProblem"));
201
if ((passphrase.search(/^\s/)==0) || (passphrase.search(/\s$/)>=0)) {
202
EnigAlert(EnigGetString("passSpaceProblem"));
210
function enigmailKeygenStart() {
211
DEBUG_LOG("enigmailKeygen.js: Start\n");
214
if (gKeygenRequest) {
215
let req = gKeygenRequest.QueryInterface(Components.interfaces.nsIRequest);
216
if (req.isPending()) {
217
EnigAlert(EnigGetString("genGoing"));
222
gGeneratedKey = null;
225
var enigmailSvc = GetEnigmailSvc();
227
EnigAlert(EnigGetString("accessError"));
231
var passphrase = enigmailCheckPassphrase();
232
if (passphrase == null) return;
234
var noPassphraseElement = document.getElementById("noPassphrase");
236
if (!passphrase && !noPassphraseElement.checked) {
237
EnigAlert(EnigGetString("passCheckBox"));
241
var commentElement = document.getElementById("keyComment");
242
var comment = commentElement.value;
244
var noExpiry = document.getElementById("noExpiry");
245
var expireInput = document.getElementById("expireInput");
246
var timeScale = document.getElementById("timeScale");
249
if (! noExpiry.checked) {
250
expiryTime = Number(expireInput.value) * Number(timeScale.value);
251
if (expiryTime > 36500) {
252
EnigAlert(EnigGetString("expiryTooLong"));
255
if (! (expiryTime > 0)) {
256
EnigAlert(EnigGetString("expiryTooShort"));
260
var keySize = Number(document.getElementById("keySize").value);
261
var keyType = Number(document.getElementById("keyType").value);
263
if ((keyType==KEYTYPE_DSA) && (keySize>3072)){
264
EnigAlert(EnigGetString("dsaSizeLimit"));
268
var curId = getCurrentIdentity();
271
var userName = curId.fullName;
272
var userEmail = curId.email;
275
EnigAlert(EnigGetString("passUserName"));
279
var idString = userName;
282
idString += " (" + comment + ")";
284
idString += " <" + userEmail + ">";
286
var confirmMsg = EnigGetString("keyConfirm", idString);
288
if (!EnigConfirm(confirmMsg, EnigGetString("keyMan.button.generateKey"))) {
295
onStartRequest: function () {},
296
onStopRequest: function(status) {
297
enigmailKeygenTerminate(status);
299
onDataAvailable: function(data) {
300
DEBUG_LOG("enigmailKeygen.js: onDataAvailable() "+data+"\n");
303
var keyCreatedIndex = gAllData.indexOf("[GNUPG:] KEY_CREATED");
304
if (keyCreatedIndex >0) {
305
gGeneratedKey = gAllData.substr(keyCreatedIndex);
306
gGeneratedKey = gGeneratedKey.replace(/(.*\[GNUPG:\] KEY_CREATED . )([a-fA-F0-9]+)([\n\r].*)*/, "$2");
307
gAllData = gAllData.replace(/\[GNUPG:\] KEY_CREATED . [a-fA-F0-9]+[\n\r]/, "");
309
gAllData = gAllData.replace(/[\r\n]*\[GNUPG:\] GOOD_PASSPHRASE/g, "").replace(/([\r\n]*\[GNUPG:\] PROGRESS primegen )(.)( \d+ \d+)/g, "$2");
310
var progMeter = document.getElementById("keygenProgress");
311
var progValue = Number(progMeter.value);
312
progValue += (1+(100-progValue)/200);
313
if (progValue >= 95) progValue=10;
314
progMeter.setAttribute("value", progValue);
319
gKeygenRequest = Ec.generateKey(window,
320
Ec.convertFromUnicode(userName),
321
Ec.convertFromUnicode(comment),
329
Ec.DEBUG_LOG("enigmailKeygen.js: generateKey() failed with "+ex.toString()+"\n"+ex.stack+"\n");
332
if (!gKeygenRequest) {
333
EnigAlert(EnigGetString("keyGenFailed"));
336
WRITE_LOG("enigmailKeygen.js: Start: gKeygenRequest = "+gKeygenRequest+"\n");
339
function abortKeyGeneration() {
340
gGeneratedKey = KEYGEN_CANCELLED;
341
enigmailKeygenCloseRequest();
344
function enigmailKeygenCancel() {
345
DEBUG_LOG("enigmailKeygen.js: Cancel\n");
348
if (gKeygenRequest) {
349
closeWin = EnigConfirm(EnigGetString("keyAbort"), EnigGetString("keyMan.button.generateKeyAbort"), EnigGetString("keyMan.button.generateKeyContinue"));
350
if (closeWin) abortKeyGeneration();
356
if (closeWin) window.close();
359
function onNoExpiry() {
360
var noExpiry = document.getElementById("noExpiry");
361
var expireInput = document.getElementById("expireInput");
362
var timeScale = document.getElementById("timeScale");
364
expireInput.disabled=noExpiry.checked;
365
timeScale.disabled=noExpiry.checked;
369
function queryISupArray(supportsArray, iid) {
374
for (i=0; i<supportsArray.Count(); i++) {
375
result.push(supportsArray.GetElementAt(i).QueryInterface(iid));
380
for (i=0; i<supportsArray.length; i++) {
381
result.push(supportsArray.queryElementAt(i, iid));
388
function getCurrentIdentity()
390
var item = gUserIdentityList.selectedItem;
391
var identityKey = item.getAttribute('id');
393
var identity = gAccountManager.getIdentity(identityKey);
398
function fillIdentityListPopup()
400
DEBUG_LOG("enigmailKeygen.js: fillIdentityListPopup\n");
402
var idSupports = gAccountManager.allIdentities;
403
var identities = queryISupArray(idSupports,
404
Components.interfaces.nsIMsgIdentity);
406
DEBUG_LOG("enigmailKeygen.js: fillIdentityListPopup: "+identities + "\n");
410
var defIdentities = gAccountManager.defaultAccount.identities;
413
if (defIdentities.length >= 1) {
414
defIdentity = defIdentities.queryElementAt(0, Components.interfaces.nsIMsgIdentity);
416
defIdentity = identities[0];
421
if (defIdentities.Count() >= 1) {
422
defIdentity = defIdentities.QueryElementAt(0, Components.interfaces.nsIMsgIdentity);
424
defIdentity = identities[0];
428
DEBUG_LOG("enigmailKeygen.js: fillIdentityListPopup: default="+defIdentity.key+"\n");
430
var selected = false;
431
for (var i=0; i<identities.length; i++) {
432
var identity = identities[i];
434
DEBUG_LOG("id.valid="+identity.valid+"\n");
435
if (!identity.valid || !identity.email)
438
var serverSupports, inServer;
441
serverSupports = gAccountManager.getServersForIdentity(identity);
442
if (serverSupports.length > 0) {
443
inServer = serverSupports.queryElementAt(0, Components.interfaces.nsIMsgIncomingServer);
448
serverSupports = gAccountManager.GetServersForIdentity(identity);
449
if (serverSupports.GetElementAt(0)) {
450
inServer = serverSupports.GetElementAt(0).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
455
var accountName = " - "+inServer.prettyName;
457
DEBUG_LOG("enigmailKeygen.js: accountName="+accountName+"\n");
458
DEBUG_LOG("enigmailKeygen.js: email="+identity.email+"\n");
460
var item = document.createElement('menuitem');
461
// item.setAttribute('label', identity.identityName);
462
item.setAttribute('label', identity.identityName + accountName);
463
item.setAttribute('class', 'identity-popup-item');
464
item.setAttribute('accountname', accountName);
465
item.setAttribute('id', identity.key);
466
item.setAttribute('email', identity.email);
468
gUserIdentityListPopup.appendChild(item);
471
gUserIdentityList.selectedItem = item;
473
if (identity.key == defIdentity.key) {
474
gUserIdentityList.selectedItem = item;