~ubuntu-branches/ubuntu/quantal/enigmail/quantal-security

« back to all changes in this revision

Viewing changes to mailnews/extensions/enigmail/ui/content/enigmailKeygen.js

  • Committer: Package Import Robot
  • Author(s): Chris Coulson
  • Date: 2013-09-13 16:02:15 UTC
  • mfrom: (0.12.16)
  • Revision ID: package-import@ubuntu.com-20130913160215-u3g8nmwa0pdwagwc
Tags: 2:1.5.2-0ubuntu0.12.10.1
* New upstream release v1.5.2 for Thunderbird 24

* Build enigmail using a stripped down Thunderbird 17 build system, as it's
  now quite difficult to build the way we were doing previously, with the
  latest Firefox build system
* Add debian/patches/no_libxpcom.patch - Don't link against libxpcom, as it
  doesn't exist anymore (but exists in the build system)
* Add debian/patches/use_sdk.patch - Use the SDK version of xpt.py and
  friends
* Drop debian/patches/ipc-pipe_rename.diff (not needed anymore)
* Drop debian/patches/makefile_depth.diff (not needed anymore)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ***** BEGIN LICENSE BLOCK *****
 
2
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 
3
 *
 
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/
 
8
 *
 
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.
 
13
 *
 
14
 * The Original Code is Enigmail.
 
15
 *
 
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.
 
19
 *
 
20
 * Contributor(s):
 
21
 * Patrick Brunschwig <patrick@mozilla-enigmail.org>
 
22
 *
 
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 ***** */
 
35
 
 
36
// Uses: chrome://enigmail/content/enigmailCommon.js
 
37
Components.utils.import("resource://enigmail/enigmailCommon.jsm");
 
38
 
 
39
const Ec = EnigmailCommon;
 
40
 
 
41
// Initialize enigmailCommon
 
42
EnigInitCommon("enigmailKeygen");
 
43
 
 
44
var gAccountManager = Components.classes[ENIG_ACCOUNT_MANAGER_CONTRACTID].getService(Components.interfaces.nsIMsgAccountManager);
 
45
 
 
46
var gUserIdentityList;
 
47
var gUserIdentityListPopup;
 
48
var gUseForSigning;
 
49
 
 
50
var gKeygenRequest;
 
51
var gAllData = "";
 
52
var gGeneratedKey= null;
 
53
var gUsedId;
 
54
 
 
55
const KEYGEN_CANCELLED = "cancelled";
 
56
const KEYTYPE_DSA = 1;
 
57
const KEYTYPE_RSA = 2;
 
58
 
 
59
function enigmailKeygenLoad() {
 
60
  DEBUG_LOG("enigmailKeygen.js: Load\n");
 
61
 
 
62
  gUserIdentityList      = document.getElementById("userIdentity");
 
63
  gUserIdentityListPopup = document.getElementById("userIdentityPopup");
 
64
  gUseForSigning     = document.getElementById("useForSigning");
 
65
 
 
66
  if (gUserIdentityListPopup) {
 
67
    fillIdentityListPopup();
 
68
  }
 
69
  gUserIdentityList.focus();
 
70
 
 
71
  enigmailKeygenUpdate(true, false);
 
72
 
 
73
  var enigmailSvc = GetEnigmailSvc();
 
74
  if (!enigmailSvc) {
 
75
     EnigAlert(EnigGetString("accessError"));
 
76
  }
 
77
 
 
78
  if (enigmailSvc.agentType != "gpg") {
 
79
     EnigAlert(EnigGetString("onlyGPG"));
 
80
     return;
 
81
  }
 
82
}
 
83
 
 
84
function enigmailOnClose() {
 
85
  var closeWin = true;
 
86
  if (gKeygenRequest) {
 
87
    closeWin = EnigConfirm(EnigGetString("keyAbort"), EnigGetString("keyMan.button.generateKeyAbort"), EnigGetString("keyMan.button.generateKeyContinue"));
 
88
  }
 
89
  if (closeWin) abortKeyGeneration();
 
90
  return closeWin;
 
91
}
 
92
 
 
93
function enigmailKeygenUnload() {
 
94
   DEBUG_LOG("enigmailKeygen.js: Unload\n");
 
95
 
 
96
   enigmailKeygenCloseRequest();
 
97
}
 
98
 
 
99
 
 
100
function enigmailKeygenUpdate(getPrefs, setPrefs) {
 
101
  DEBUG_LOG("enigmailKeygen.js: Update: "+getPrefs+", "+setPrefs+"\n");
 
102
 
 
103
  var noPassphrase        = document.getElementById("noPassphrase");
 
104
  var noPassphraseChecked = getPrefs ? EnigGetPref("noPassphrase")
 
105
                                     : noPassphrase.checked;
 
106
 
 
107
  if (setPrefs) {
 
108
    EnigSetPref("noPassphrase", noPassphraseChecked);
 
109
  }
 
110
 
 
111
  noPassphrase.checked = noPassphraseChecked;
 
112
 
 
113
  var passphrase1 = document.getElementById("passphrase");
 
114
  var passphrase2 = document.getElementById("passphraseRepeat");
 
115
  passphrase1.disabled = noPassphraseChecked;
 
116
  passphrase2.disabled = noPassphraseChecked;
 
117
 
 
118
  var commentElement = document.getElementById("keyComment");
 
119
  if (noPassphraseChecked) {
 
120
    if (commentElement.value == "") commentElement.value = EnigGetString("keyGenNoPassphrase");
 
121
  }
 
122
  else {
 
123
    if (commentElement.value == EnigGetString("keyGenNoPassphrase")) commentElement.value = "";
 
124
  }
 
125
}
 
126
 
 
127
function enigmailKeygenTerminate(exitCode) {
 
128
   DEBUG_LOG("enigmailKeygen.js: Terminate:\n");
 
129
 
 
130
   var curId = gUsedId;
 
131
 
 
132
   gKeygenRequest = null;
 
133
 
 
134
   if ((! gGeneratedKey) || gGeneratedKey == KEYGEN_CANCELLED) return;
 
135
 
 
136
  var progMeter = document.getElementById("keygenProgress");
 
137
  progMeter.setAttribute("value", 100);
 
138
 
 
139
  if (gGeneratedKey) {
 
140
     if (gUseForSigning.checked) {
 
141
        curId.setBoolAttribute("enablePgp", true);
 
142
        curId.setIntAttribute("pgpKeyMode", 1);
 
143
        curId.setCharAttribute("pgpkeyId", "0x"+gGeneratedKey.substr(-8,8));
 
144
 
 
145
        enigmailKeygenUpdate(false, true);
 
146
 
 
147
        EnigSavePrefs();
 
148
 
 
149
        if (EnigConfirm(EnigGetString("keygenComplete", curId.email)+"\n\n"+EnigGetString("revokeCertRecommended"), EnigGetString("keyMan.button.generateCert"))) {
 
150
            EnigCreateRevokeCert(gGeneratedKey, curId.email, closeAndReset);
 
151
        }
 
152
        else
 
153
          closeAndReset();
 
154
     }
 
155
     else {
 
156
       if (EnigConfirm(EnigGetString("genCompleteNoSign")+"\n\n"+EnigGetString("revokeCertRecommended"), EnigGetString("keyMan.button.generateCert"))) {
 
157
          EnigCreateRevokeCert(gGeneratedKey, curId.email, closeAndReset);
 
158
       }
 
159
       else
 
160
          closeAndReset();
 
161
     }
 
162
   }
 
163
   else {
 
164
      EnigAlert(EnigGetString("keyGenFailed"));
 
165
      window.close();
 
166
   }
 
167
}
 
168
 
 
169
function closeAndReset() {
 
170
  var enigmailSvc = GetEnigmailSvc();
 
171
  enigmailSvc.invalidateUserIdList();
 
172
  window.close();
 
173
}
 
174
 
 
175
// Cleanup
 
176
function enigmailKeygenCloseRequest() {
 
177
   DEBUG_LOG("enigmailKeygen.js: CloseRequest\n");
 
178
 
 
179
  if (gKeygenRequest) {
 
180
    var p = gKeygenRequest;
 
181
    gKeygenRequest = null;
 
182
    p.kill(false);
 
183
  }
 
184
}
 
185
 
 
186
function enigmailCheckPassphrase() {
 
187
  var passphraseElement = document.getElementById("passphrase");
 
188
  var passphrase2Element = document.getElementById("passphraseRepeat");
 
189
 
 
190
  var passphrase = passphraseElement.value;
 
191
 
 
192
  if (passphrase != passphrase2Element.value) {
 
193
    EnigAlert(EnigGetString("passNoMatch"));
 
194
    return null;
 
195
  }
 
196
 
 
197
  if (passphrase.search(/[\x80-\xFF]/)>=0) {
 
198
    EnigAlert(EnigGetString("passCharProblem"));
 
199
    return null;
 
200
  }
 
201
  if ((passphrase.search(/^\s/)==0) || (passphrase.search(/\s$/)>=0)) {
 
202
    EnigAlert(EnigGetString("passSpaceProblem"));
 
203
    return null;
 
204
  }
 
205
  return passphrase;
 
206
}
 
207
 
 
208
 
 
209
 
 
210
function enigmailKeygenStart() {
 
211
   DEBUG_LOG("enigmailKeygen.js: Start\n");
 
212
 
 
213
 
 
214
   if (gKeygenRequest) {
 
215
      let req = gKeygenRequest.QueryInterface(Components.interfaces.nsIRequest);
 
216
      if (req.isPending()) {
 
217
         EnigAlert(EnigGetString("genGoing"));
 
218
         return;
 
219
      }
 
220
   }
 
221
 
 
222
   gGeneratedKey = null;
 
223
   gAllData = "";
 
224
 
 
225
   var enigmailSvc = GetEnigmailSvc();
 
226
   if (!enigmailSvc) {
 
227
      EnigAlert(EnigGetString("accessError"));
 
228
      return;
 
229
   }
 
230
 
 
231
   var passphrase = enigmailCheckPassphrase();
 
232
   if (passphrase == null) return;
 
233
 
 
234
   var noPassphraseElement = document.getElementById("noPassphrase");
 
235
 
 
236
   if (!passphrase && !noPassphraseElement.checked) {
 
237
      EnigAlert(EnigGetString("passCheckBox"));
 
238
      return;
 
239
   }
 
240
 
 
241
   var commentElement = document.getElementById("keyComment");
 
242
   var comment = commentElement.value;
 
243
 
 
244
   var noExpiry = document.getElementById("noExpiry");
 
245
   var expireInput = document.getElementById("expireInput");
 
246
   var timeScale = document.getElementById("timeScale");
 
247
 
 
248
   var expiryTime = 0;
 
249
   if (! noExpiry.checked) {
 
250
      expiryTime = Number(expireInput.value) * Number(timeScale.value);
 
251
      if (expiryTime > 36500) {
 
252
        EnigAlert(EnigGetString("expiryTooLong"));
 
253
        return;
 
254
      }
 
255
      if (! (expiryTime > 0)) {
 
256
        EnigAlert(EnigGetString("expiryTooShort"));
 
257
        return;
 
258
      }
 
259
   }
 
260
   var keySize = Number(document.getElementById("keySize").value);
 
261
   var keyType = Number(document.getElementById("keyType").value);
 
262
 
 
263
   if ((keyType==KEYTYPE_DSA) && (keySize>3072)){
 
264
     EnigAlert(EnigGetString("dsaSizeLimit"));
 
265
     keySize = 3072;
 
266
   }
 
267
 
 
268
   var curId = getCurrentIdentity();
 
269
   gUsedId = curId;
 
270
 
 
271
   var userName = curId.fullName;
 
272
   var userEmail = curId.email;
 
273
 
 
274
   if (!userName) {
 
275
      EnigAlert(EnigGetString("passUserName"));
 
276
      return;
 
277
   }
 
278
 
 
279
   var idString = userName;
 
280
 
 
281
   if (comment)
 
282
      idString += " (" + comment + ")";
 
283
 
 
284
   idString += " <" + userEmail + ">";
 
285
 
 
286
   var confirmMsg = EnigGetString("keyConfirm", idString);
 
287
 
 
288
   if (!EnigConfirm(confirmMsg, EnigGetString("keyMan.button.generateKey"))) {
 
289
     return;
 
290
   }
 
291
 
 
292
   var proc = null;
 
293
 
 
294
   var listener = {
 
295
      onStartRequest: function () {},
 
296
      onStopRequest: function(status) {
 
297
        enigmailKeygenTerminate(status);
 
298
      },
 
299
      onDataAvailable: function(data) {
 
300
        DEBUG_LOG("enigmailKeygen.js: onDataAvailable() "+data+"\n");
 
301
 
 
302
        gAllData += data;
 
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]/, "");
 
308
        }
 
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);
 
315
      }
 
316
   };
 
317
 
 
318
   try {
 
319
      gKeygenRequest = Ec.generateKey(window,
 
320
                         Ec.convertFromUnicode(userName),
 
321
                         Ec.convertFromUnicode(comment),
 
322
                         userEmail,
 
323
                         expiryTime,
 
324
                         keySize,
 
325
                         keyType,
 
326
                         passphrase,
 
327
                         listener);
 
328
   } catch (ex) {
 
329
      Ec.DEBUG_LOG("enigmailKeygen.js: generateKey() failed with "+ex.toString()+"\n"+ex.stack+"\n");
 
330
   }
 
331
 
 
332
   if (!gKeygenRequest) {
 
333
      EnigAlert(EnigGetString("keyGenFailed"));
 
334
   }
 
335
 
 
336
   WRITE_LOG("enigmailKeygen.js: Start: gKeygenRequest = "+gKeygenRequest+"\n");
 
337
}
 
338
 
 
339
function abortKeyGeneration() {
 
340
  gGeneratedKey = KEYGEN_CANCELLED;
 
341
  enigmailKeygenCloseRequest();
 
342
}
 
343
 
 
344
function enigmailKeygenCancel() {
 
345
  DEBUG_LOG("enigmailKeygen.js: Cancel\n");
 
346
  var closeWin=false;
 
347
 
 
348
  if (gKeygenRequest) {
 
349
    closeWin = EnigConfirm(EnigGetString("keyAbort"), EnigGetString("keyMan.button.generateKeyAbort"), EnigGetString("keyMan.button.generateKeyContinue"));
 
350
    if (closeWin) abortKeyGeneration();
 
351
  }
 
352
  else {
 
353
    closeWin=true;
 
354
  }
 
355
 
 
356
  if (closeWin) window.close();
 
357
}
 
358
 
 
359
function onNoExpiry() {
 
360
  var noExpiry = document.getElementById("noExpiry");
 
361
  var expireInput = document.getElementById("expireInput");
 
362
  var timeScale = document.getElementById("timeScale");
 
363
 
 
364
  expireInput.disabled=noExpiry.checked;
 
365
  timeScale.disabled=noExpiry.checked;
 
366
}
 
367
 
 
368
 
 
369
function queryISupArray(supportsArray, iid) {
 
370
  var result = [];
 
371
  var i;
 
372
  try {
 
373
    // Gecko <= 20
 
374
    for (i=0; i<supportsArray.Count(); i++) {
 
375
      result.push(supportsArray.GetElementAt(i).QueryInterface(iid));
 
376
    }
 
377
  }
 
378
  catch(ex) {
 
379
    // Gecko > 20
 
380
    for (i=0; i<supportsArray.length; i++) {
 
381
      result.push(supportsArray.queryElementAt(i, iid));
 
382
    }
 
383
  }
 
384
 
 
385
  return result;
 
386
}
 
387
 
 
388
function getCurrentIdentity()
 
389
{
 
390
  var item = gUserIdentityList.selectedItem;
 
391
  var identityKey = item.getAttribute('id');
 
392
 
 
393
  var identity = gAccountManager.getIdentity(identityKey);
 
394
 
 
395
  return identity;
 
396
}
 
397
 
 
398
function fillIdentityListPopup()
 
399
{
 
400
  DEBUG_LOG("enigmailKeygen.js: fillIdentityListPopup\n");
 
401
 
 
402
  var idSupports = gAccountManager.allIdentities;
 
403
  var identities = queryISupArray(idSupports,
 
404
                                       Components.interfaces.nsIMsgIdentity);
 
405
 
 
406
  DEBUG_LOG("enigmailKeygen.js: fillIdentityListPopup: "+identities + "\n");
 
407
 
 
408
  // Default identity
 
409
  var defIdentity;
 
410
  var defIdentities = gAccountManager.defaultAccount.identities;
 
411
  try {
 
412
    // Gecko >= 20
 
413
    if (defIdentities.length >= 1) {
 
414
      defIdentity = defIdentities.queryElementAt(0, Components.interfaces.nsIMsgIdentity);
 
415
    } else {
 
416
      defIdentity = identities[0];
 
417
    }
 
418
  }
 
419
  catch (ex) {
 
420
    // Gecko < 20
 
421
    if (defIdentities.Count() >= 1) {
 
422
      defIdentity = defIdentities.QueryElementAt(0, Components.interfaces.nsIMsgIdentity);
 
423
    } else {
 
424
      defIdentity = identities[0];
 
425
    }
 
426
  }
 
427
 
 
428
  DEBUG_LOG("enigmailKeygen.js: fillIdentityListPopup: default="+defIdentity.key+"\n");
 
429
 
 
430
  var selected = false;
 
431
  for (var i=0; i<identities.length; i++) {
 
432
    var identity = identities[i];
 
433
 
 
434
    DEBUG_LOG("id.valid="+identity.valid+"\n");
 
435
    if (!identity.valid || !identity.email)
 
436
      continue;
 
437
 
 
438
    var serverSupports, inServer;
 
439
    try {
 
440
      // Gecko >= 20
 
441
      serverSupports = gAccountManager.getServersForIdentity(identity);
 
442
      if (serverSupports.length > 0) {
 
443
        inServer = serverSupports.queryElementAt(0, Components.interfaces.nsIMsgIncomingServer);
 
444
      }
 
445
    }
 
446
    catch (ex) {
 
447
      // Gecko < 20
 
448
      serverSupports = gAccountManager.GetServersForIdentity(identity);
 
449
      if (serverSupports.GetElementAt(0)) {
 
450
        inServer = serverSupports.GetElementAt(0).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
 
451
      }
 
452
    }
 
453
 
 
454
    if (inServer) {
 
455
      var accountName = " - "+inServer.prettyName;
 
456
 
 
457
      DEBUG_LOG("enigmailKeygen.js: accountName="+accountName+"\n");
 
458
      DEBUG_LOG("enigmailKeygen.js: email="+identity.email+"\n");
 
459
 
 
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);
 
467
 
 
468
      gUserIdentityListPopup.appendChild(item);
 
469
 
 
470
      if (!selected)
 
471
        gUserIdentityList.selectedItem = item;
 
472
 
 
473
      if (identity.key == defIdentity.key) {
 
474
        gUserIdentityList.selectedItem = item;
 
475
        selected = true;
 
476
      }
 
477
    }
 
478
  }
 
479
 
 
480
}