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 License Version
5
* 1.1 (the "License"); you may not use this file except in compliance with
6
* the License. You may obtain a copy of the License at
7
* http://www.mozilla.org/MPL/
9
* Software distributed under the License is distributed on an "AS IS" basis,
10
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
* for the specific language governing rights and limitations under the
14
* The Original Code is FireGPG.
16
* The Initial Developer of the Original Code is
18
* Portions created by the Initial Developer are Copyright (C) 2007
19
* the Initial Developer. All Rights Reserved.
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.
35
* ***** END LICENSE BLOCK ***** */
39
this.initialized = true;
40
this.strings = document.getElementById( "firegpg-strings" );
42
this.prefs = Components.classes["@mozilla.org/preferences-service;1"].
43
getService(Components.interfaces.nsIPrefService);
44
this.prefs = this.prefs.getBranch("extensions.firegpg.");
46
if ( this.prefs.prefHasUserValue( "enable_gpgapi" ) ) {
47
var gpgapi_enabled = this.prefs.getBoolPref( "enable_gpgapi" );
49
var gpgapi_enabled = true;
52
if ( gpgapi_enabled ) {
53
window.addEventListener( "firegpg:hello", this.hello, false, true );
54
window.addEventListener( "firegpg:auth", this.auth, false, true );
55
window.addEventListener( "firegpg:register", this.register, false, true );
56
window.addEventListener( "firegpg:listkey", this.listkey, false, true );
57
window.addEventListener( "firegpg:listprivkey", this.listprivkey, false, true );
58
window.addEventListener( "firegpg:check", this.check, false, true );
59
window.addEventListener( "firegpg:sign", this.sign, false, true );
60
window.addEventListener( "firegpg:decrypt", this.decrypt, false, true );
61
window.addEventListener( "firegpg:encrypt", this.encrypt, false, true );
62
window.addEventListener( "firegpg:signandencrypt", this.signandencrypt, false, true );
63
window.addEventListener( "unload", function() { gpgApi.listenerUnload() }, false );
68
listenerUnload: function( event ) {
69
window.removeEventListener( "firegpg:hello", this.hello, false, true );
70
window.removeEventListener( "firegpg:auth", this.auth, false, true );
71
window.removeEventListener( "firegpg:register", this.register, false, true );
72
window.removeEventListener( "firegpg:listkey", this.listkey, false, true );
73
window.removeEventListener( "firegpg:listprivkey", this.listprivkey, false, true );
74
window.removeEventListener( "firegpg:check", this.check, false, true );
75
window.removeEventListener( "firegpg:sign", this.sign, false, true );
76
window.removeEventListener( "firegpg:decrypt", this.decrypt, false, true );
77
window.removeEventListener( "firegpg:encrypt", this.encrypt, false, true );
78
window.removeEventListener( "firegpg:signandencrypt", this.signandencrypt, false, true );
83
//Return 'firegpg-ok' in 'result' (useful to test firegpg's api presence)
84
hello: function ( event ) {
86
returnData = gpgApi.getReturnDataNode(event.target);
88
returnData.setAttribute('result', 'firegpg-ok');
94
//Return 'auth-ok' in 'result' (or 'auth-fail' is the website have rights to use the api
95
//Paramters : 'auth_key' --> the key for the website
96
auth: function ( event ) {
99
data = gpgApi.getDataNode(event.target);
101
key_auth = data.getAttribute('auth_key');
103
returnData = gpgApi.getReturnDataNode(event.target);
105
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
107
returnData.setAttribute('result', 'auth-fail');
111
returnData.setAttribute('result', 'auth-ok');
115
//Try to register a webpage (ask the user). Put 'register-ok' in 'result' or 'register-fail'. It's all is ok, put the auth key in 'auth_key'
116
register: function ( event ) {
118
domain = gpgApi.getDomain(event.target.ownerDocument.location);
120
var texte = document.getElementById("firegpg-strings").getString('api-accept');
122
var reg=new RegExp("\!D\!", "g");
123
texte = texte.replace(reg,domain);
124
var reg=new RegExp("\!N\!", "g");
125
texte = texte.replace(reg,"\n");
127
if (confirm(texte) == false)
129
returnData.setAttribute('result', 'register-fail');
133
access = gpgApi.getAccessList();
136
auth_key = genreate_api_key();
138
while (access[auth_key] != null) {
139
auth_key = genreate_api_key();
142
access[auth_key] = domain;
144
gpgApi.setAccessList(access);
146
returnData = gpgApi.getReturnDataNode(event.target);
148
returnData.setAttribute('auth_key', auth_key);
149
returnData.setAttribute('result', 'register-ok');
155
// Return the node with data attributes for return
156
getDataNode: function(d) {
158
liste = d.getElementsByTagName( "firegpg:data" );
164
//Return 'list-ok' in 'result' (or 'list-err' is there is a problem), and the list of public key in list
165
//Paramters : 'auth_key' --> the key for the website
166
listkey: function ( event ) {
169
data = gpgApi.getDataNode(event.target);
171
key_auth = data.getAttribute('auth_key');
173
returnData = gpgApi.getReturnDataNode(event.target);
175
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
180
keylistcall = FireGPG.listKeys();
182
if (keylistcall.result == RESULT_SUCCESS)
183
keylist = keylistcall.keylist;
189
for (key in keylist) {
191
return_list = return_list + gpgApi.removeDoublePoint(keylist[key].keyId) + ":" + gpgApi.removeDoublePoint(keylist[key].keyName) + ",";
194
returnData.setAttribute('list', return_list);
195
returnData.setAttribute('result', 'list-ok');
199
//Return 'list-ok' in 'result' (or 'list-err' is there is a problem), and the list of private key in list
200
//Paramters : 'auth_key' --> the key for the website
201
listprivkey: function ( event ) {
204
data = gpgApi.getDataNode(event.target);
206
key_auth = data.getAttribute('auth_key');
208
returnData = gpgApi.getReturnDataNode(event.target);
210
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
215
keylistcall = FireGPG.listKeys(true);
217
if (keylistcall.result == RESULT_SUCCESS)
218
keylist = keylistcall.keylist;
224
for (key in keylist) {
226
return_list = return_list + gpgApi.removeDoublePoint(keylist[key].keyId) + ":" + gpgApi.removeDoublePoint(keylist[key].keyName) + ",";
229
returnData.setAttribute('list', return_list);
230
returnData.setAttribute('result', 'list-ok');
234
// Return 'check-ok' in 'result' (or 'check-err' is there is a problem) if the sign is valid.
235
// Return in 'ckeck-infos' info on sign
236
// Paramters : 'auth_key' --> the key for the website, 'text' -> the text to check
237
check: function ( event ) {
240
data = gpgApi.getDataNode(event.target);
242
key_auth = data.getAttribute('auth_key');
244
returnData = gpgApi.getReturnDataNode(event.target);
246
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
251
text = data.getAttribute('text');
254
returnData.setAttribute('result', 'check-err');
255
returnData.setAttribute('error', 'no-data');
259
var result = FireGPG.verify(true,text);
262
var i18n = document.getElementById("firegpg-strings");
263
//TODO : multi signs ?
264
if (result.result == RESULT_ERROR_NO_GPG_DATA) {
265
returnData.setAttribute('result', 'check-err');
266
returnData.setAttribute('error', 'no-gpg');
269
else if (result.result != RESULT_SUCCESS)
271
returnData.setAttribute('result', 'check-err');
272
returnData.setAttribute('error', 'unknow');
275
else if (result.signresult== RESULT_ERROR_BAD_SIGN)
277
returnData.setAttribute('result', 'check-err');
278
returnData.setAttribute('error', 'bad-sign');
281
else if (result.signresult == RESULT_ERROR_NO_KEY)
283
returnData.setAttribute('result', 'check-err');
284
returnData.setAttribute('error', 'no-key');
289
returnData.setAttribute('result', 'check-ok');
290
returnData.setAttribute('check-infos', result.signresulttext);
296
returnData.setAttribute('result', 'check-err');
297
returnData.setAttribute('error', 'unknow');
301
// Return 'sign-ok' in 'result' (or 'sign-err' is there is a problem) if makeing a sign was successfull
302
// Return in 'text' a signed text
303
// Paramters : 'auth_key' --> the key for the website, 'text' -> the text to check, 'force-key' --> optional, to force the gpg's key to use
304
sign: function ( event ) {
306
data = gpgApi.getDataNode(event.target);
308
key_auth = data.getAttribute('auth_key');
310
returnData = gpgApi.getReturnDataNode(event.target);
312
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
317
text = data.getAttribute('text');
318
keyID = data.getAttribute('force-key');
321
returnData.setAttribute('result', 'sign-err');
322
returnData.setAttribute('error', 'no-data');
328
keyID = getSelfKey();
332
var password = getPrivateKeyPassword(false,gpgApi.getDomain(event.target.ownerDocument.location));
336
var result = FireGPG.sign(true,text,keyID,password);
339
var i18n = document.getElementById("firegpg-strings");
341
if (result.result == RESULT_SUCCESS)
343
returnData.setAttribute('result', 'sign-ok');
344
returnData.setAttribute('text', result.signed);
348
else if (result.result == RESULT_ERROR_PASSWORD)
350
returnData.setAttribute('result', 'sign-err');
351
returnData.setAttribute('error', 'bad-pass');
356
returnData.setAttribute('result', 'sign-err');
357
returnData.setAttribute('error', 'unknow');
362
returnData.setAttribute('result', 'sign-err');
363
returnData.setAttribute('error', 'unknow');
367
// Return 'signandencrypt-ok' in 'result' (or 'signandencrypt-err' is there is a problem) if makeing a signed and encrypted text was successfull
368
// Return in 'text' the encrypted text
369
// Paramters : 'auth_key' --> the key for the website, 'text' -> the text to check, 'keys' --> the keys list, 'force-key' --> optional, to force the gpg's key to use
370
signandencrypt: function ( event ) {
373
data = gpgApi.getDataNode(event.target);
375
key_auth = data.getAttribute('auth_key');
377
returnData = gpgApi.getReturnDataNode(event.target);
379
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
384
text = data.getAttribute('text');
385
keys = data.getAttribute('keys');
388
returnData.setAttribute('result', 'signandencrypt-err');
389
returnData.setAttribute('error', 'no-data');
393
keyID = data.getAttribute('force-key');
397
keyID = getSelfKey();
401
keyIdList = keys.split(/;/g);
404
var password = getPrivateKeyPassword(false,gpgApi.getDomain(event.target.ownerDocument.location));
409
var result = FireGPG.cryptAndSign(true,text,keyIdList,false,password,keyID);
411
if (result.result == RESULT_SUCCESS)
413
returnData.setAttribute('result', 'signandencrypt-ok');
414
returnData.setAttribute('text', result.encrypted);
418
else if (result.result == RESULT_ERROR_PASSWORD)
420
returnData.setAttribute('result', 'signandencrypt-err');
421
returnData.setAttribute('error', 'bad-pass');
426
returnData.setAttribute('result', 'signandencrypt-err');
427
returnData.setAttribute('error', 'unknow');
432
returnData.setAttribute('result', 'signandencrypt-err');
433
returnData.setAttribute('error', 'unknow');
438
// Return 'encrypt-ok' in 'result' (or 'encrypt-err' is there is a problem) if makeing a ecnrypted text was successfull
439
// Return in 'text' the encrypted text
440
// Paramters : 'auth_key' --> the key for the website, 'text' -> the text to check, 'keys' --> the keys list
441
encrypt: function ( event ) {
444
data = gpgApi.getDataNode(event.target);
446
key_auth = data.getAttribute('auth_key');
448
returnData = gpgApi.getReturnDataNode(event.target);
450
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
455
text = data.getAttribute('text');
456
keys = data.getAttribute('keys');
459
returnData.setAttribute('result', 'encrypt-err');
460
returnData.setAttribute('error', 'no-data');
464
keyIdList = keys.split(/;/g);
467
var result = FireGPG.crypt(true, text, keyIdList);
469
if (result.result == RESULT_SUCCESS)
471
returnData.setAttribute('result', 'encrypt-ok');
472
returnData.setAttribute('text', result.encrypted);
478
returnData.setAttribute('result', 'encrypt-err');
479
returnData.setAttribute('error', 'unknow');
484
returnData.setAttribute('result', 'encrypt-err');
485
returnData.setAttribute('error', 'unknow');
489
// Return 'decrypt-ok' in 'result' (or 'decrypt-err' is there is a problem) if trying to decrypt a text was successfull
490
// Return in 'text' the decrypted text
491
// Paramters : 'auth_key' --> the key for the website, 'text' -> the text to decrypt
492
decrypt: function ( event ) {
495
data = gpgApi.getDataNode(event.target);
497
key_auth = data.getAttribute('auth_key');
499
returnData = gpgApi.getReturnDataNode(event.target);
501
if (key_auth == '' || key_auth == undefined || gpgApi.isAuth(key_auth, event.target.ownerDocument) == false )
506
text = data.getAttribute('text');
509
returnData.setAttribute('result', 'decrypt-err');
510
returnData.setAttribute('error', 'no-data');
514
// Needed for decrypt
516
var password = getPrivateKeyPassword(false,gpgApi.getDomain(event.target.ownerDocument.location));
521
var result = FireGPG.decrypt(true, text,password);
525
var i18n = document.getElementById("firegpg-strings");
527
if (result.result == RESULT_SUCCESS)
529
//If there was a sign with the crypted text
530
if (result.signresult == RESULT_SUCCESS)
532
returnData.setAttribute('sign-info', result.signresulttext);
536
returnData.setAttribute('result', 'decrypt-ok');
537
returnData.setAttribute('text', result.decrypted);
541
else if (result.result == RESULT_ERROR_PASSWORD)
543
returnData.setAttribute('result', 'decrypt-err');
544
returnData.setAttribute('error', 'bad-pass');
549
returnData.setAttribute('result', 'decrypt-err');
550
returnData.setAttribute('error', 'unknow');
555
returnData.setAttribute('result', 'decrypt-err');
556
returnData.setAttribute('error', 'unknow');
563
// Change # to #1, : to #2 and , to #3 in a string
564
removeDoublePoint: function(s) {
568
s = s.replace(/#/g,"#1");
569
s = s.replace(/:/g,"#2");
570
s = s.replace(/,/g,"#2");
576
// Return the node with data attributes for return
577
getReturnDataNode: function(d) {
579
liste = d.getElementsByTagName( "firegpg:returndata" );
585
// Return true if the user have sign to use FireGPG's api
586
isAuth: function(key, document) {
590
access = this.getAccessList();
592
if (access[key.toString()] == gpgApi.getDomain(document.location))
601
//Get the current domain for the page, or the webpage if we're in local (file://)
602
getDomain: function(url) {
605
var first_split = url.toString().split("//");
607
if (first_split[0] == "file:")
609
url = url.toString().replace(",","GPG1");
610
url = url.toString().replace(";","GPG2");
614
var without_resource = first_split[1];
616
var second_split = without_resource.split("/");
618
var domain = second_split[0];
624
//Return the list of access
625
getAccessList: function() {
627
var array_return = new Array();
629
var prefs = Components.classes["@mozilla.org/preferences-service;1"].
630
getService(Components.interfaces.nsIPrefService);
631
prefs = prefs.getBranch("extensions.firegpg.");
632
var auths_chain = ";,;";
634
auths_chain = prefs.getCharPref("api_list_auth");
635
} catch (e) { auths_chain = ";,;"; }
637
if (auths_chain == ";,;" || auths_chain == "" || auths_chain == null)
640
var reg=new RegExp(";", "g");
642
splitage = auths_chain.split(reg);
644
for (var i=0; i< splitage.length; i++) {
646
domain_and_key = splitage[i];
648
var reg2 = new RegExp(",", "g");
650
domain_and_key = domain_and_key.split(reg2);
652
if (domain_and_key[1] != undefined && domain_and_key[1] != "" && domain_and_key[1] != 0) {
654
array_return[domain_and_key[1]] = domain_and_key[0];
663
//Set a new list of access
664
setAccessList: function(arrayy) {
666
var final_data = ';';
668
for (var key in arrayy) {
670
final_data = final_data + arrayy[key] + ',' + key + ';';
674
var prefs = Components.classes["@mozilla.org/preferences-service;1"].
675
getService(Components.interfaces.nsIPrefService);
676
prefs = prefs.getBranch("extensions.firegpg.");
678
prefs.setCharPref("api_list_auth",final_data);
686
window.addEventListener("load", function(e) { gpgApi.onLoad(e); }, false);