Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F35401023
enigmailKeyManager.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
30 KB
Subscribers
None
enigmailKeyManager.js
View Options
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "MPL"); you may not use this file
* except in compliance with the MPL. You may obtain a copy of
* the MPL at http://www.mozilla.org/MPL/
*
* Software distributed under the MPL is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the MPL for the specific language governing
* rights and limitations under the MPL.
*
* The Original Code is Enigmail.
*
* The Initial Developer of this code is Patrick Brunschwig.
* Portions created by Patrick Brunschwig <patrick.brunschwig@gmx.net>
* are Copyright (C) 2004 Patrick Brunschwig.
* All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License (the "GPL"), in which case
* the provisions of the GPL are applicable instead of
* those above. If you wish to allow use of your version of this
* file only under the terms of the GPL and not to allow
* others to use your version of this file under the MPL, indicate
* your decision by deleting the provisions above and replace them
* with the notice and other provisions required by the GPL.
* If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
// Uses: chrome://enigmail/content/enigmailCommon.js
// Initialize enigmailCommon
EnigInitCommon
(
"enigmailKeyManager"
);
const
INPUT
=
0
;
const
RESULT
=
1
;
// field ID's of key list (as described in the doc/DETAILS file in the GnuPG distribution)
const
KEY_TRUST
=
1
;
const
KEY_ID
=
4
;
const
CREATED
=
5
;
const
EXPIRY
=
6
;
const
OWNERTRUST
=
8
;
const
USER_ID
=
9
;
const
KEY_USE_FOR
=
11
;
const
KEY_EXPIRED
=
"e"
;
const
KEY_REVOKED
=
"r"
;
const
KEY_INVALID
=
"i"
;
const
KEY_DISABLED
=
"d"
;
const
KEY_NOT_VALID
=
KEY_EXPIRED
+
KEY_REVOKED
+
KEY_INVALID
+
KEY_DISABLED
;
var
gUserList
;
var
gResult
;
var
gSendEncrypted
=
true
;
var
gKeyList
;
var
gEnigRemoveListener
=
false
;
var
gEnigLastSelectedKeys
=
null
;
var
gKeySortList
=
null
;
var
gEnigIpcRequest
=
null
;
var
gEnigCallbackFunc
=
null
;
var
gClearButton
=
null
;
var
gFilterBox
=
null
;
var
gSearchTimer
=
null
;
var
gSearchInput
=
null
;
function
enigmailKeyManagerLoad
()
{
DEBUG_LOG
(
"enigmailKeyManager.js: Load\n"
);
gUserList
=
document
.
getElementById
(
"pgpKeyList"
);
gFilterBox
=
document
.
getElementById
(
"filterKey"
);
gClearButton
=
document
.
getElementById
(
"clearFilter"
);
gSearchInput
=
document
.
getElementById
(
"filterKey"
);
window
.
enigIpcRequest
=
null
;
enigmailBuildList
(
false
);
}
function
enigmailRefreshKeys
()
{
var
keyList
=
enigmailGetSelectedKeys
();
gEnigLastSelectedKeys
=
[];
for
(
var
i
=
0
;
i
<
keyList
.
length
;
i
++
)
{
gEnigLastSelectedKeys
[
keyList
[
i
]]
=
1
;
}
var
treeChildren
=
document
.
getElementById
(
"pgpKeyListChildren"
);
while
(
treeChildren
.
firstChild
)
{
treeChildren
.
removeChild
(
treeChildren
.
firstChild
);
}
enigmailBuildList
(
true
);
enigApplyFilter
();
}
function
enigLoadKeyList
(
secretOnly
,
refresh
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigLoadKeyList\n"
);
try
{
var
exitCodeObj
=
new
Object
();
var
statusFlagsObj
=
new
Object
();
var
errorMsgObj
=
new
Object
();
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
null
;
var
userList
=
enigmailSvc
.
getUserIdList
(
secretOnly
,
refresh
,
exitCodeObj
,
statusFlagsObj
,
errorMsgObj
);
if
(
exitCodeObj
.
value
!=
0
)
{
EnigAlert
(
errorMsgObj
.
value
);
return
null
;
}
}
catch
(
ex
)
{
ERROR_LOG
(
"ERROR in enigmailUserSelection: enigLoadKeyList\n"
);
}
if
(
typeof
(
userList
)
==
"string"
)
{
return
userList
.
split
(
/\n/
);
}
else
{
return
[];
}
}
function
enigmailBuildList
(
refresh
)
{
DEBUG_LOG
(
"enigmailUserSelection.js: enigmailBuildList\n"
);
var
sortUsers
=
function
(
a
,
b
)
{
if
(
a
.
userId
.
toLowerCase
()
<
b
.
userId
.
toLowerCase
())
{
return
-
1
;}
else
{
return
1
;
}
}
var
aGpgUserList
=
enigLoadKeyList
(
false
,
refresh
);
if
(
!
aGpgUserList
)
return
;
var
aGpgSecretsList
=
enigLoadKeyList
(
true
,
refresh
);
if
(
!
aGpgSecretsList
&&
!
refresh
)
{
if
(
EnigConfirm
(
EnigGetString
(
"noSecretKeys"
)))
{
EnigKeygen
();
enigmailRefreshKeys
(
true
);
}
}
gUserList
.
currentItem
=
null
;
var
treeChildren
=
document
.
getElementById
(
"pgpKeyListChildren"
);
gKeyList
=
new
Array
();
var
gKeySortList
=
new
Array
();
var
keyObj
=
new
Object
();
var
i
;
for
(
i
=
0
;
i
<
aGpgUserList
.
length
;
i
++
)
{
var
listRow
=
aGpgUserList
[
i
].
split
(
/:/
);
if
(
listRow
.
length
>=
0
)
{
switch
(
listRow
[
0
])
{
case
"pub"
:
keyObj
=
new
Object
();
keyObj
.
expiry
=
listRow
[
EXPIRY
];
keyObj
.
created
=
listRow
[
CREATED
];
keyObj
.
userId
=
EnigConvertGpgToUnicode
(
listRow
[
USER_ID
].
replace
(
/\\e3A/g
,
":"
));
keyObj
.
keyId
=
listRow
[
KEY_ID
];
keyObj
.
keyTrust
=
listRow
[
KEY_TRUST
];
keyObj
.
keyUseFor
=
listRow
[
KEY_USE_FOR
];
keyObj
.
ownerTrust
=
listRow
[
OWNERTRUST
];
keyObj
.
SubUserIds
=
new
Array
();
keyObj
.
fpr
=
""
;
keyObj
.
photoAvailable
=
false
;
keyObj
.
secretAvailable
=
false
;
gKeyList
[
listRow
[
KEY_ID
]]
=
keyObj
;
gKeySortList
.
push
({
userId
:
keyObj
.
userId
,
keyId
:
keyObj
.
keyId
});
break
;
case
"fpr"
:
keyObj
.
fpr
=
listRow
[
USER_ID
];
break
;
case
"uid"
:
var
subUserId
=
{
userId
:
EnigConvertGpgToUnicode
(
listRow
[
USER_ID
].
replace
(
/\\e3A/g
,
":"
)),
keyTrust
:
listRow
[
KEY_TRUST
],
type
:
"uid"
}
keyObj
.
SubUserIds
.
push
(
subUserId
);
break
;
case
"uat"
:
if
(
listRow
[
USER_ID
].
indexOf
(
"1 "
)
==
0
)
{
var
userId
=
EnigGetString
(
"userAtt.photo"
);
keyObj
.
SubUserIds
.
push
({
userId
:
userId
,
keyTrust
:
""
,
type
:
"uat"
});
keyObj
.
photoAvailable
=
true
;
}
}
}
}
// search and mark keys that have secret keys
for
(
i
=
0
;
i
<
aGpgSecretsList
.
length
;
i
++
)
{
listRow
=
aGpgSecretsList
[
i
].
split
(
/:/
);
if
(
listRow
.
length
>=
0
)
{
if
(
listRow
[
0
]
==
"sec"
)
{
if
(
typeof
(
gKeyList
[
listRow
[
KEY_ID
]])
==
"object"
)
{
gKeyList
[
listRow
[
KEY_ID
]].
secretAvailable
=
true
;
}
}
}
}
gKeySortList
.
sort
(
sortUsers
);
var
selectedItems
=
[];
for
(
i
=
0
;
i
<
gKeySortList
.
length
;
i
++
)
{
var
keyId
=
gKeySortList
[
i
].
keyId
;
if
(
gEnigLastSelectedKeys
&&
typeof
(
gEnigLastSelectedKeys
[
keyId
])
!=
"undefined"
)
selectedItems
.
push
(
i
);
var
treeItem
=
null
;
treeItem
=
enigUserSelCreateRow
(
gKeyList
[
keyId
],
-
1
)
if
(
gKeyList
[
keyId
].
SubUserIds
.
length
)
{
treeItem
.
setAttribute
(
"container"
,
"true"
);
var
subChildren
=
document
.
createElement
(
"treechildren"
);
for
(
var
subkey
=
0
;
subkey
<
gKeyList
[
keyId
].
SubUserIds
.
length
;
subkey
++
)
{
var
subItem
=
enigUserSelCreateRow
(
gKeyList
[
keyId
],
subkey
);
subChildren
.
appendChild
(
subItem
);
}
treeItem
.
appendChild
(
subChildren
);
}
if
(
treeItem
)
treeChildren
.
appendChild
(
treeItem
);
}
gUserList
.
appendChild
(
treeChildren
);
// select last selected key
if
(
selectedItems
.
length
>
0
)
{
gUserList
.
view
.
selection
.
select
(
selectedItems
[
0
]);
for
(
i
=
1
;
i
<
selectedItems
.
length
;
i
++
)
{
gUserList
.
view
.
selection
.
rangedSelect
(
selectedItems
[
i
],
selectedItems
[
i
],
true
)
}
}
else
{
gUserList
.
view
.
selection
.
select
(
0
);
}
}
// create a (sub) row for the user tree
function
enigUserSelCreateRow
(
keyObj
,
subKeyNum
)
{
var
expCol
=
document
.
createElement
(
"treecell"
);
var
userCol
=
document
.
createElement
(
"treecell"
);
var
keyCol
=
document
.
createElement
(
"treecell"
);
var
typeCol
=
document
.
createElement
(
"treecell"
);
var
validCol
=
document
.
createElement
(
"treecell"
);
var
trustCol
=
document
.
createElement
(
"treecell"
);
var
fprCol
=
document
.
createElement
(
"treecell"
);
var
userRow
=
document
.
createElement
(
"treerow"
);
var
treeItem
=
document
.
createElement
(
"treeitem"
);
userCol
.
setAttribute
(
"id"
,
"name"
);
if
(
subKeyNum
<
0
)
{
// primary key
userCol
.
setAttribute
(
"label"
,
keyObj
.
userId
);
keyCol
.
setAttribute
(
"label"
,
keyObj
.
keyId
.
substr
(
-
8
,
8
));
if
(
keyObj
.
secretAvailable
)
{
typeCol
.
setAttribute
(
"label"
,
EnigGetString
(
"keyType.publicAndSec"
));
}
else
{
typeCol
.
setAttribute
(
"label"
,
EnigGetString
(
"keyType.public"
));
}
var
keyTrust
=
keyObj
.
keyTrust
;
treeItem
.
setAttribute
(
"keytype"
,
"pub"
);
fprCol
.
setAttribute
(
"label"
,
EnigFormatFpr
(
keyObj
.
fpr
));
}
else
{
// secondary user id
keyObj
.
SubUserIds
[
subKeyNum
].
userId
=
EnigConvertGpgToUnicode
(
keyObj
.
SubUserIds
[
subKeyNum
].
userId
);
userCol
.
setAttribute
(
"label"
,
keyObj
.
SubUserIds
[
subKeyNum
].
userId
);
treeItem
.
setAttribute
(
"keytype"
,
keyObj
.
SubUserIds
[
subKeyNum
].
type
);
keyCol
.
setAttribute
(
"label"
,
""
);
typeCol
.
setAttribute
(
"label"
,
""
);
keyTrust
=
keyObj
.
SubUserIds
[
subKeyNum
].
keyTrust
;
}
var
keyTrustLabel
=
EnigGetTrustLabel
(
keyTrust
);
expCol
.
setAttribute
(
"label"
,
keyObj
.
expiry
);
expCol
.
setAttribute
(
"id"
,
"expiry"
);
if
(
keyObj
.
keyUseFor
.
indexOf
(
"D"
)
>=
0
)
{
keyTrustLabel
=
EnigGetString
(
"keyValid.disabled"
);
}
validCol
.
setAttribute
(
"label"
,
keyTrustLabel
);
trustCol
.
setAttribute
(
"label"
,
EnigGetTrustLabel
(
keyObj
.
ownerTrust
));
keyCol
.
setAttribute
(
"id"
,
"keyid"
);
typeCol
.
setAttribute
(
"id"
,
"keyType"
);
validCol
.
setAttribute
(
"id"
,
"keyValid"
);
trustCol
.
setAttribute
(
"id"
,
"ownerTrust"
)
userRow
.
appendChild
(
userCol
);
userRow
.
appendChild
(
keyCol
);
userRow
.
appendChild
(
typeCol
);
userRow
.
appendChild
(
validCol
);
userRow
.
appendChild
(
trustCol
);
userRow
.
appendChild
(
expCol
);
userRow
.
appendChild
(
fprCol
);
if
((
keyTrust
.
length
>
0
)
&&
(
KEY_NOT_VALID
.
indexOf
(
keyTrust
.
charAt
(
0
))
>=
0
)
||
(
keyObj
.
keyUseFor
.
indexOf
(
"D"
)
>=
0
))
{
for
(
var
node
=
userRow
.
firstChild
;
node
;
node
=
node
.
nextSibling
)
{
node
.
setAttribute
(
"properties"
,
"enigKeyInactive"
);
}
}
if
(
keyObj
.
secretAvailable
&&
subKeyNum
<
0
)
{
for
(
node
=
userRow
.
firstChild
;
node
;
node
=
node
.
nextSibling
)
{
var
attr
=
node
.
getAttribute
(
"properties"
);
if
(
typeof
(
attr
)
==
"string"
)
{
node
.
setAttribute
(
"properties"
,
attr
+
" enigmailOwnKey"
);
}
else
{
node
.
setAttribute
(
"properties"
,
"enigmailOwnKey"
);
}
}
}
treeItem
.
setAttribute
(
"id"
,
keyObj
.
keyId
);
treeItem
.
appendChild
(
userRow
);
return
treeItem
;
}
function
enigmailGetSelectedKeys
()
{
var
idList
=
new
Array
();
var
rangeCount
=
gUserList
.
view
.
selection
.
getRangeCount
();
for
(
var
i
=
0
;
i
<
rangeCount
;
i
++
)
{
var
start
=
{};
var
end
=
{};
gUserList
.
view
.
selection
.
getRangeAt
(
i
,
start
,
end
);
for
(
var
c
=
start
.
value
;
c
<=
end
.
value
;
c
++
)
{
try
{
idList
.
push
(
gUserList
.
view
.
getItemAtIndex
(
c
).
id
);
}
catch
(
ex
)
{
return
[];
}
}
}
return
idList
;
}
function
enigmailKeyMenu
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
==
1
&&
gKeyList
[
keyList
[
0
]].
secretAvailable
)
{
document
.
getElementById
(
"bcRevoke"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcManageUid"
).
removeAttribute
(
"disabled"
);
}
else
{
document
.
getElementById
(
"bcRevoke"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcManageUid"
).
setAttribute
(
"disabled"
,
"true"
);
}
if
(
keyList
.
length
==
1
&&
gKeyList
[
keyList
[
0
]].
photoAvailable
)
{
document
.
getElementById
(
"bcViewPhoto"
).
removeAttribute
(
"disabled"
);
}
else
{
document
.
getElementById
(
"bcViewPhoto"
).
setAttribute
(
"disabled"
,
"true"
);
}
if
(
keyList
.
length
==
1
)
{
document
.
getElementById
(
"bcSignKey"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcViewSig"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcKeyDetails"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcDeleteKey"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcEnableKey"
).
removeAttribute
(
"disabled"
);
if
(
gKeyList
[
keyList
[
0
]].
keyUseFor
.
indexOf
(
"D"
)
>
0
||
gKeyList
[
keyList
[
0
]].
keyTrust
.
indexOf
(
KEY_DISABLED
)
>=
0
)
{
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"label"
,
EnigGetString
(
"keyMan.enableKey"
))
}
else
{
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"label"
,
EnigGetString
(
"keyMan.disableKey"
))
}
}
else
{
document
.
getElementById
(
"bcSignKey"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcViewSig"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcKeyDetails"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcDeleteKey"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"disabled"
,
"true"
);
}
}
function
enigmailDblClick
(
event
)
{
var
keyList
=
enigmailGetSelectedKeys
();
var
keyType
=
""
;
if
(
keyList
.
length
==
1
)
{
var
rangeCount
=
gUserList
.
view
.
selection
.
getRangeCount
();
var
start
=
{};
var
end
=
{};
gUserList
.
view
.
selection
.
getRangeAt
(
0
,
start
,
end
);
try
{
keyType
=
gUserList
.
view
.
getItemAtIndex
(
start
.
value
).
getAttribute
(
"keytype"
);
}
catch
(
ex
)
{}
}
if
(
keyType
==
"uat"
)
{
enigShowPhoto
();
}
else
{
enigmailKeyDetails
();
}
}
function
enigmailKeyDetails
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
inputObj
=
{
keyId
:
keyList
[
0
],
secKey
:
gKeyList
[
keyList
[
0
]].
secretAvailable
};
window
.
openDialog
(
"chrome://enigmail/content/enigmailKeyDetailsDlg.xul"
,
""
,
"dialog,modal,centerscreen"
,
inputObj
);
}
function
enigmailDeleteKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
userId
=
"0x"
+
keyList
[
0
].
substr
(
-
8
,
8
)
+
" - "
+
gKeyList
[
keyList
[
0
]].
userId
;
var
deleteSecret
=
false
;
if
(
gKeyList
[
keyList
[
0
]].
secretAvailable
)
{
if
(
!
EnigConfirm
(
EnigGetString
(
"deleteSecretKey"
,
userId
)))
return
;
deleteSecret
=
true
;
}
else
{
if
(
!
EnigConfirm
(
EnigGetString
(
"deletePubKey"
,
userId
)))
return
;
}
var
errorMsgObj
=
{};
var
r
=
enigmailSvc
.
deleteKey
(
window
,
"0x"
+
keyList
[
0
],
deleteSecret
,
errorMsgObj
);
if
(
r
!=
0
)
{
EnigAlert
(
EnigGetString
(
"deleteKeyFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
}
else
{
EnigAlert
(
EnigGetString
(
"deleteKeyOk"
));
}
enigmailRefreshKeys
();
}
function
enigmailEnableKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
disableKey
=
(
gKeyList
[
keyList
[
0
]].
keyUseFor
.
indexOf
(
"D"
)
<
0
&&
gKeyList
[
keyList
[
0
]].
keyTrust
.
indexOf
(
KEY_DISABLED
)
<
0
);
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
errorMsgObj
=
{};
var
r
=
enigmailSvc
.
enableDisableKey
(
window
,
"0x"
+
keyList
[
0
],
disableKey
,
errorMsgObj
);
if
(
r
!=
0
)
{
EnigAlert
(
EnigGetString
(
"enableKeyFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
}
enigmailRefreshKeys
();
}
function
enigShowPhoto
()
{
var
keyList
=
enigmailGetSelectedKeys
();
EnigShowPhoto
(
keyList
[
0
],
gKeyList
[
keyList
[
0
]].
userId
);
}
function
enigEditKeyTrust
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
==
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
userIdList
=
[];
for
(
var
i
=
0
;
i
<
keyList
.
length
;
i
++
)
{
userIdList
.
push
(
gKeyList
[
keyList
[
i
]].
userId
);
}
EnigEditKeyTrust
(
userIdList
,
keyList
);
enigmailRefreshKeys
();
}
function
enigSignKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
==
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
EnigSignKey
(
gKeyList
[
keyList
[
0
]].
userId
,
keyList
[
0
],
null
);
enigmailRefreshKeys
();
}
function
enigmailRevokeKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
userId
=
"0x"
+
keyList
[
0
].
substr
(
-
8
,
8
)
+
" - "
+
gKeyList
[
keyList
[
0
]].
userId
;
if
(
!
EnigConfirm
(
EnigGetString
(
"revokeKeyAsk"
,
userId
)))
return
;
var
tmpDir
=
EnigGetTempDir
();
try
{
var
revFile
=
Components
.
classes
[
ENIG_LOCAL_FILE_CONTRACTID
].
createInstance
(
Components
.
interfaces
.
nsILocalFile
);
revFile
.
initWithPath
(
tmpDir
);
if
(
!
(
revFile
.
isDirectory
()
&&
revFile
.
isWritable
()))
{
EnigAlert
(
EnigGetString
(
"noTempDir"
));
return
;
}
}
catch
(
ex
)
{}
revFile
.
append
(
"revkey.asc"
);
revFile
.
createUnique
(
Components
.
interfaces
.
nsIFile
.
NORMAL_FILE_TYPE
,
0600
);
var
errorMsgObj
=
{};
var
r
=
enigmailSvc
.
genRevokeCert
(
window
,
"0x"
+
keyList
[
0
],
revFile
.
path
,
"0"
,
""
,
errorMsgObj
);
if
(
r
!=
0
)
{
revFile
.
remove
(
false
);
EnigAlert
(
EnigGetString
(
"revokeKeyFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
return
;
}
r
=
enigmailSvc
.
importKeyFromFile
(
window
,
revFile
.
path
,
errorMsgObj
);
revFile
.
remove
(
false
);
if
(
r
!=
0
)
{
EnigAlert
(
EnigGetString
(
"revokeKeyFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
}
else
{
EnigAlert
(
EnigGetString
(
"revokeKeyOk"
));
}
enigmailRefreshKeys
();
}
function
enigCreateRevokeCert
()
{
var
keyList
=
enigmailGetSelectedKeys
();
EnigCreateRevokeCert
(
keyList
[
0
],
gKeyList
[
keyList
[
0
]].
userId
);
}
function
enigmailExportKeys
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
==
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
if
(
keyList
.
length
==
1
)
{
var
defaultFileName
=
gKeyList
[
keyList
[
0
]].
userId
.
replace
(
/[\<\>]/g
,
""
);
defaultFileName
+=
" (0x"
+
keyList
[
0
].
substr
(
-
8
,
8
)
+
") pub.asc"
}
else
{
defaultFileName
=
EnigGetString
(
"defaultPubKeyFilename"
)
+
".asc"
}
var
outFile
=
EnigFilePicker
(
EnigGetString
(
"exportToFile"
),
""
,
true
,
"*.asc"
,
defaultFileName
,
[
EnigGetString
(
"asciiArmorFile"
),
"*.asc"
]);
if
(
!
outFile
)
return
;
var
keyListStr
=
"0x"
+
keyList
.
join
(
" 0x"
);
var
exitCodeObj
=
{};
var
errorMsgObj
=
{};
enigmailSvc
.
extractKey
(
window
,
0
,
keyListStr
,
outFile
.
path
,
exitCodeObj
,
errorMsgObj
);
if
(
exitCodeObj
.
value
!=
0
)
{
EnigAlert
(
EnigGetString
(
"saveKeysFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
}
else
{
EnigAlert
(
EnigGetString
(
"saveKeysOK"
));
}
}
function
enigmailImportKeysFromFile
()
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
inFile
=
EnigFilePicker
(
EnigGetString
(
"importFile"
),
""
,
false
,
"*.asc"
,
""
,
[
EnigGetString
(
"asciiArmorFile"
),
"*.asc"
,
EnigGetString
(
"gnupgFile"
),
"*.gpg"
,
EnigGetString
(
"pgpFile"
),
"*.pgp"
]);
if
(
!
inFile
)
return
;
var
errorMsgObj
=
{};
var
exitCode
=
enigmailSvc
.
importKeyFromFile
(
window
,
inFile
.
path
,
errorMsgObj
);
if
(
exitCode
!=
0
)
{
EnigAlert
(
EnigGetString
(
"importKeysFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
}
else
{
EnigLongAlert
(
EnigGetString
(
"successKeyImport"
)
+
"\n\n"
+
errorMsgObj
.
value
);
}
enigmailRefreshKeys
();
}
function
enigmailSearchKeys
()
{
var
inputObj
=
{
searchList
:
""
};
var
resultObj
=
new
Object
();
window
.
openDialog
(
"chrome://enigmail/content/enigmailSearchKey.xul"
,
""
,
"dialog,modal,centerscreen"
,
inputObj
,
resultObj
);
if
(
resultObj
.
importedKeys
>
0
)
{
enigmailRefreshKeys
();
}
}
function
enigmailListSig
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
inputObj
=
{
keyId
:
keyList
[
0
],
keyListArr
:
gKeyList
};
window
.
openDialog
(
"chrome://enigmail/content/enigmailViewKeySigDlg.xul"
,
""
,
"dialog,modal,centerscreen,resizable=yes"
,
inputObj
);
}
function
enigmailManageUids
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
inputObj
=
{
keyId
:
keyList
[
0
]
};
window
.
openDialog
(
"chrome://enigmail/content/enigmailManageUidDlg.xul"
,
""
,
"dialog,modal,centerscreen,resizable"
,
inputObj
);
enigmailRefreshKeys
();
}
function
enigmailImportFromClipbrd
()
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
if
(
!
EnigConfirm
(
EnigGetString
(
"importFromClip"
)))
{
return
;
}
var
clipBoard
=
Components
.
classes
[
ENIG_CLIPBOARD_CONTRACTID
].
getService
(
Components
.
interfaces
.
nsIClipboard
);
try
{
var
transferable
=
Components
.
classes
[
ENIG_TRANSFERABLE_CONTRACTID
].
createInstance
(
Components
.
interfaces
.
nsITransferable
);
transferable
.
addDataFlavor
(
"text/unicode"
);
clipBoard
.
getData
(
transferable
,
clipBoard
.
kGlobalClipboard
);
var
flavour
=
{};
var
data
=
{};
var
length
=
{};
transferable
.
getAnyTransferData
(
flavour
,
data
,
length
);
var
cBoardContent
=
data
.
value
.
QueryInterface
(
Components
.
interfaces
.
nsISupportsString
).
data
;
DEBUG_LOG
(
"enigmailKeyManager.js: enigmailImportFromClipbrd: got data from clipboard"
);
}
catch
(
ex
)
{}
var
errorMsgObj
=
{};
var
r
=
enigmailSvc
.
importKey
(
window
,
0
,
cBoardContent
,
""
,
errorMsgObj
);
EnigLongAlert
(
errorMsgObj
.
value
);
enigmailRefreshKeys
();
}
function
enigmailCopyToClipbrd
()
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
==
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
exitCodeObj
=
{};
var
errorMsgObj
=
{};
var
keyData
=
enigmailSvc
.
extractKey
(
window
,
0
,
"0x"
+
keyList
.
join
(
" 0x"
),
null
,
exitCodeObj
,
errorMsgObj
);
if
(
exitCodeObj
.
value
!=
0
)
{
EnigAlert
(
EnigGetString
(
"copyToClipbrdFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
return
;
}
var
clipBoard
=
Components
.
classes
[
ENIG_CLIPBOARD_CONTRACTID
].
getService
(
Components
.
interfaces
.
nsIClipboard
);
try
{
clipBoardHlp
=
Components
.
classes
[
ENIG_CLIPBOARD_HELPER_CONTRACTID
].
getService
(
Components
.
interfaces
.
nsIClipboardHelper
);
clipBoardHlp
.
copyStringToClipboard
(
keyData
,
clipBoard
.
kGlobalClipboard
);
if
(
clipBoard
.
supportsSelectionClipboard
())
{
clipBoardHlp
.
copyStringToClipboard
(
keyData
,
clipBoard
.
kSelectionClipboard
);
}
DEBUG_LOG
(
"enigmailKeyManager.js: enigmailImportFromClipbrd: got data from clipboard"
);
EnigAlert
(
EnigGetString
(
"copyToClipbrdOK"
));
}
catch
(
ex
)
{
EnigAlert
(
EnigGetString
(
"copyToClipbrdFailed"
));
}
}
function
enigmailSearchKey
()
{
var
inputObj
=
{
searchList
:
null
};
var
resultObj
=
new
Object
();
window
.
openDialog
(
"chrome://enigmail/content/enigmailSearchKey.xul"
,
""
,
"dialog,modal,centerscreen"
,
inputObj
,
resultObj
);
if
(
resultObj
.
importedKeys
>
0
)
{
enigmailRefreshKeys
();
}
}
function
enigmailUploadKeys
()
{
enigmailKeyServerAcess
(
nsIEnigmail
.
UPLOAD_KEY
,
enigmailUploadKeysCb
);
}
function
enigmailUploadKeysCb
(
exitCode
,
errorMsg
,
msgBox
)
{
if
(
msgBox
)
{
if
(
exitCode
!=
0
)
{
EnigAlert
(
EnigGetString
(
"sendKeysFailed"
)
+
"\n"
+
errorMsg
);
}
}
else
{
return
(
EnigGetString
(
exitCode
==
0
?
"sendKeysOK"
:
"sendKeysFailed"
));
}
return
""
;
}
function
enigmailReceiveKey
()
{
enigmailKeyServerAcess
(
nsIEnigmail
.
DOWNLOAD_KEY
,
enigmailReceiveKeyCb
);
}
function
enigmailReceiveKeyCb
(
exitCode
,
errorMsg
,
msgBox
)
{
if
(
msgBox
)
{
if
(
exitCode
==
0
)
{
EnigAlert
(
EnigGetString
(
"receiveKeysOk"
)
+
"\n"
+
errorMsg
);
enigmailRefreshKeys
();
}
else
{
EnigAlert
(
EnigGetString
(
"receiveKeysFailed"
)
+
"\n"
+
errorMsg
);
}
}
else
{
return
(
EnigGetString
(
exitCode
==
0
?
"receiveKeysOk"
:
"receiveKeysFailed"
));
}
return
""
;
}
//
// ----- key filtering functionality -----
//
function
onSearchInput
(
returnKeyHit
)
{
if
(
gSearchTimer
)
{
clearTimeout
(
gSearchTimer
);
gSearchTimer
=
null
;
}
// only select the text when the return key was hit
if
(
returnKeyHit
)
{
gSearchInput
.
select
();
onEnterInSearchBar
();
}
else
{
gSearchTimer
=
setTimeout
(
"onEnterInSearchBar();"
,
800
);
}
}
function
onSearchKeyPress
(
event
)
{
// 13 == return
if
(
event
&&
event
.
keyCode
==
13
)
{
event
.
stopPropagation
();
// make sure the dialog is not closed...
onSearchInput
(
true
);
}
}
function
onEnterInSearchBar
()
{
if
(
gSearchInput
.
value
==
""
)
{
onResetFilter
();
return
;
}
gClearButton
.
setAttribute
(
"disabled"
,
false
);
enigApplyFilter
();
}
function
getFirstNode
()
{
return
document
.
getElementById
(
"pgpKeyListChildren"
).
firstChild
;
}
function
onResetFilter
()
{
gFilterBox
.
value
=
""
;
var
node
=
getFirstNode
();
while
(
node
)
{
node
.
hidden
=
false
;
node
=
node
.
nextSibling
;
}
gClearButton
.
setAttribute
(
"disabled"
,
true
);
}
function
enigApplyFilter
()
{
var
searchTxt
=
gSearchInput
.
value
;
if
(
!
searchTxt
||
searchTxt
.
length
==
0
)
return
;
searchTxt
=
searchTxt
.
toLowerCase
();
var
node
=
getFirstNode
();
while
(
node
)
{
var
uid
=
gKeyList
[
node
.
id
].
userId
;
var
hideNode
=
true
;
if
((
uid
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
)
||
(
node
.
id
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
))
{
hideNode
=
false
;
}
for
(
var
subUid
=
0
;
subUid
<
gKeyList
[
node
.
id
].
SubUserIds
.
length
;
subUid
++
)
{
uid
=
gKeyList
[
node
.
id
].
SubUserIds
[
subUid
].
userId
;
if
(
uid
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
)
{
hideNode
=
false
;
}
}
node
.
hidden
=
hideNode
;
node
=
node
.
nextSibling
;
}
}
//
// ----- keyserver related functionality ----
//
function
enigmailKeyServerAcess
(
accessType
,
callbackFunc
)
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
resultObj
=
{};
if
(
accessType
==
nsIEnigmail
.
UPLOAD_KEY
)
{
var
inputObj
=
{
upload
:
true
};
}
else
{
inputObj
=
{};
}
var
selKeyList
=
enigmailGetSelectedKeys
();
if
(
selKeyList
.
length
==
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
keyList
=
[];
for
(
var
i
=
0
;
i
<
selKeyList
.
length
;
i
++
)
{
keyList
.
push
(
"0x"
+
selKeyList
[
i
].
substr
(
-
8
,
8
)
+
" - "
+
gKeyList
[
selKeyList
[
i
]].
userId
);
}
inputObj
.
keyId
=
keyList
.
join
(
", "
);
window
.
openDialog
(
"chrome://enigmail/content/enigmailKeyserverDlg.xul"
,
""
,
"dialog,modal,centerscreen"
,
inputObj
,
resultObj
);
if
(
!
resultObj
.
value
)
{
return
;
}
var
progressBar
=
Components
.
classes
[
"@mozilla.org/messenger/progress;1"
].
createInstance
(
Components
.
interfaces
.
nsIMsgProgress
);
var
requestObserver
=
new
EnigRequestObserver
(
enigSendKeyTerminate
,
{
'progressBar'
:
progressBar
,
'callType'
:
1
});
var
progressListener
=
{
onStateChange
:
function
(
aWebProgress
,
aRequest
,
aStateFlags
,
aStatus
)
{
if
(
aStateFlags
&
Components
.
interfaces
.
nsIWebProgressListener
.
STATE_STOP
)
{
if
(
progressBar
.
processCanceledByUser
)
enigSendKeyCancel
(
progressBar
);
}
},
onProgressChange
:
function
(
aWebProgress
,
aRequest
,
aCurSelfProgress
,
aMaxSelfProgress
,
aCurTotalProgress
,
aMaxTotalProgress
)
{},
onLocationChange
:
function
(
aWebProgress
,
aRequest
,
aLocation
)
{},
onStatusChange
:
function
(
aWebProgress
,
aRequest
,
aStatus
,
aMessage
)
{},
onSecurityChange
:
function
(
aWebProgress
,
aRequest
,
state
)
{},
QueryInterface
:
function
(
iid
)
{
if
(
iid
.
equals
(
Components
.
interfaces
.
nsIWebProgressListener
)
||
iid
.
equals
(
Components
.
interfaces
.
nsISupportsWeakReference
)
||
iid
.
equals
(
Components
.
interfaces
.
nsISupports
))
return
this
;
throw
Components
.
results
.
NS_NOINTERFACE
;
}
};
progressBar
.
registerListener
(
progressListener
);
var
errorMsgObj
=
{};
gEnigIpcRequest
=
enigmailSvc
.
receiveKey
(
accessType
,
resultObj
.
value
,
"0x"
+
selKeyList
.
join
(
" 0x"
),
requestObserver
,
errorMsgObj
);
if
(
gEnigIpcRequest
==
null
)
{
callbackFunc
(
-
1
,
errorMsgObj
.
value
,
true
);
return
;
}
gEnigCallbackFunc
=
callbackFunc
;
if
(
accessType
==
nsIEnigmail
.
UPLOAD_KEY
)
{
document
.
getElementById
(
"statusText"
).
value
=
EnigGetString
(
"uploadingKey"
);
}
else
{
document
.
getElementById
(
"statusText"
).
value
=
EnigGetString
(
"downloadingKey"
);
}
document
.
getElementById
(
"progressBar"
).
removeAttribute
(
"collapsed"
);
document
.
getElementById
(
"cancelBox"
).
removeAttribute
(
"collapsed"
);
}
function
enigSendKeyTerminate
(
terminateArg
,
ipcRequest
)
{
DEBUG_LOG
(
"enigmailKeyManager.js: enigSendKeyTerminate\n"
);
if
(
terminateArg
&&
terminateArg
.
progressBar
)
{
terminateArg
.
progressBar
.
onStateChange
(
null
,
null
,
Components
.
interfaces
.
nsIWebProgressListener
.
STATE_STOP
,
0
);
}
if
(
gEnigIpcRequest
)
{
var
cbFunc
=
gEnigCallbackFunc
;
var
keyRetrProcess
=
gEnigIpcRequest
.
pipeTransport
;
var
exitCode
;
var
statusText
=
document
.
getElementById
(
"statusText"
);
document
.
getElementById
(
"progressBar"
).
setAttribute
(
"collapsed"
,
"true"
);
document
.
getElementById
(
"cancelBox"
).
setAttribute
(
"collapsed"
,
"true"
);
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
keyRetrProcess
&&
!
keyRetrProcess
.
isAttached
())
{
keyRetrProcess
.
terminate
();
exitCode
=
keyRetrProcess
.
exitCode
();
DEBUG_LOG
(
"enigmailKeyManager.js: enigSendKeyTerminate: exitCode = "
+
exitCode
+
"\n"
);
if
(
enigmailSvc
)
{
exitCode
=
enigmailSvc
.
fixExitCode
(
exitCode
,
0
);
}
}
statusText
.
value
=
cbFunc
(
exitCode
,
""
,
false
);
var
errorMsg
=
""
;
try
{
var
gpgConsole
=
gEnigIpcRequest
.
stderrConsole
.
QueryInterface
(
Components
.
interfaces
.
nsIPipeConsole
);
if
(
gpgConsole
&&
gpgConsole
.
hasNewData
())
{
errorMsg
=
gpgConsole
.
getData
();
if
(
enigmailSvc
)
{
var
statusFlagsObj
=
new
Object
();
var
statusMsgObj
=
new
Object
();
errorMsg
=
enigmailSvc
.
parseErrorOutput
(
errorMsg
,
statusFlagsObj
,
statusMsgObj
);
}
}
}
catch
(
ex
)
{}
DEBUG_LOG
(
"enigmailKeyManager.js: enigSendKeyTerminate: errorMsg="
+
errorMsg
);
if
(
errorMsg
.
search
(
/ec=\d+/i
)
>=
0
)
{
exitCode
=-
1
;
}
statusText
.
value
=
cbFunc
(
exitCode
,
""
,
false
);
cbFunc
(
exitCode
,
errorMsg
,
true
);
window
.
setTimeout
(
enigHideStatus
,
5000
);
gEnigIpcRequest
.
close
(
true
);
}
}
function
enigSendKeyCancel
()
{
document
.
getElementById
(
"cancelButton"
).
setAttribute
(
"collapsed"
,
"true"
);
var
keyRetrProcess
=
gEnigIpcRequest
.
pipeTransport
;
if
(
keyRetrProcess
&&
!
keyRetrProcess
.
isAttached
())
{
keyRetrProcess
.
terminate
();
}
gEnigIpcRequest
.
close
(
true
);
document
.
getElementById
(
"statusText"
).
value
=
EnigGetString
(
"keyserverAccessAborted"
);
document
.
getElementById
(
"progressBar"
).
setAttribute
(
"collapsed"
,
"true"
);
window
.
setTimeout
(
enigHideStatus
,
5000
);
gEnigIpcRequest
=
null
;
gEnigCallbackFunc
=
null
;
}
function
enigHideStatus
()
{
document
.
getElementById
(
"statusText"
).
value
=
""
;
document
.
getElementById
(
"progressBar"
).
setAttribute
(
"collapsed"
,
"true"
);
document
.
getElementById
(
"cancelBox"
).
setAttribute
(
"collapsed"
,
"true"
);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Feb 7, 5:29 PM (1 d, 7 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
0c/e3/3dc1f0e5c406a72f991923d31747
Attached To
rENIG Enigmail
Event Timeline
Log In to Comment