Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F34621556
enigmailKeyManager.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
45 KB
Subscribers
None
enigmailKeyManager.js
View Options
/*global Components: false, EnigInitCommon: false, EnigmailDialog: false */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* 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 the Original Code is Patrick Brunschwig.
* Portions created by Patrick Brunschwig <patrick@enigmail.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
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* ***** END LICENSE BLOCK ***** */
// Uses: chrome://enigmail/content/enigmailCommon.js
// Initialize enigmailCommon
EnigInitCommon
(
"enigmailKeyManager"
);
const
Cc
=
Components
.
classes
;
const
Ci
=
Components
.
interfaces
;
const
Cu
=
Components
.
utils
;
Components
.
utils
.
import
(
"resource://enigmail/streams.jsm"
);
/*global EnigmailStreams: false */
const
INPUT
=
0
;
const
RESULT
=
1
;
const
IOSERVICE_CONTRACTID
=
"@mozilla.org/network/io-service;1"
;
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
gSearchInput
=
null
;
var
gShowAllKeysElement
=
null
;
var
gTreeChildren
=
null
;
var
gShowInvalidKeys
=
null
;
var
gShowUntrustedKeys
=
null
;
var
gShowOthersKeys
=
null
;
function
enigmailKeyManagerLoad
()
{
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigmailKeyManagerLoad\n"
);
gUserList
=
document
.
getElementById
(
"pgpKeyList"
);
gSearchInput
=
document
.
getElementById
(
"filterKey"
);
gShowAllKeysElement
=
document
.
getElementById
(
"showAllKeys"
);
gTreeChildren
=
document
.
getElementById
(
"pgpKeyListChildren"
);
gShowInvalidKeys
=
document
.
getElementById
(
"showInvalidKeys"
);
gShowUntrustedKeys
=
document
.
getElementById
(
"showUntrustedKeys"
);
gShowOthersKeys
=
document
.
getElementById
(
"showOthersKeys"
);
if
(
EnigGetPref
(
"keyManShowAllKeys"
))
{
gShowAllKeysElement
.
setAttribute
(
"checked"
,
"true"
);
}
gUserList
.
addEventListener
(
'click'
,
enigmailOnClick
,
true
);
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"label"
,
EnigGetString
(
"keyMan.disableKey"
));
window
.
enigIpcRequest
=
null
;
document
.
getElementById
(
"pleaseWait"
).
showPopup
(
gSearchInput
,
-
1
,
-
1
,
"tooltip"
,
"after_end"
,
""
);
document
.
getElementById
(
"statusText"
).
value
=
EnigGetString
(
"keyMan.loadingKeys"
);
document
.
getElementById
(
"progressBar"
).
removeAttribute
(
"collapsed"
);
EnigmailEvents
.
dispatchEvent
(
loadkeyList
,
100
,
null
);
gSearchInput
.
focus
();
}
function
displayFullList
()
{
return
(
gShowAllKeysElement
.
getAttribute
(
"checked"
)
==
"true"
);
}
function
loadkeyList
()
{
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: loadkeyList\n"
);
//enigmailBuildList(false);
sortTree
();
showOrHideAllKeys
();
document
.
getElementById
(
"pleaseWait"
).
hidePopup
();
document
.
getElementById
(
"statusText"
).
value
=
" "
;
document
.
getElementById
(
"progressBar"
).
setAttribute
(
"collapsed"
,
"true"
);
}
function
enigmailRefreshKeys
()
{
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigmailRefreshKeys\n"
);
var
keyList
=
enigmailGetSelectedKeys
();
gEnigLastSelectedKeys
=
[];
for
(
var
i
=
0
;
i
<
keyList
.
length
;
i
++
)
{
gEnigLastSelectedKeys
[
keyList
[
i
]]
=
1
;
}
enigmailClearTree
();
enigmailBuildList
(
true
);
enigApplyFilter
();
}
function
enigmailClearTree
()
{
var
treeChildren
=
gTreeChildren
;
while
(
treeChildren
.
firstChild
)
{
treeChildren
.
removeChild
(
treeChildren
.
firstChild
);
}
}
function
enigmailBuildList
(
refresh
)
{
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigmailBuildList\n"
);
var
keyListObj
=
{};
EnigLoadKeyList
(
refresh
,
keyListObj
,
getSortColumn
(),
getSortDirection
());
if
(
!
keyListObj
.
keySortList
)
return
;
gKeyList
=
keyListObj
.
keyList
;
gKeySortList
=
keyListObj
.
keySortList
;
gUserList
.
currentItem
=
null
;
var
treeChildren
=
gTreeChildren
;
var
selectedItems
=
[];
for
(
var
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
);
treeItem
.
setAttribute
(
"container"
,
"true"
);
var
subChildren
=
document
.
createElement
(
"treechildren"
);
treeItem
.
appendChild
(
subChildren
);
var
uidItem
=
document
.
createElement
(
"treeitem"
);
subChildren
.
appendChild
(
uidItem
);
var
uidRow
=
document
.
createElement
(
"treerow"
);
var
uidCell
=
document
.
createElement
(
"treecell"
);
uidCell
.
setAttribute
(
"label"
,
EnigGetString
(
"keylist.noOtherUids"
));
uidRow
.
appendChild
(
uidCell
);
uidItem
.
appendChild
(
uidRow
);
uidItem
.
setAttribute
(
"keytype"
,
"none"
);
uidItem
.
setAttribute
(
"id"
,
keyId
);
var
uidChildren
=
document
.
createElement
(
"treechildren"
);
uidItem
.
appendChild
(
uidChildren
);
var
uatItem
=
document
.
createElement
(
"treeitem"
);
uatItem
.
setAttribute
(
"id"
,
keyId
);
uatItem
.
setAttribute
(
"keytype"
,
"none"
);
subChildren
.
appendChild
(
uatItem
);
var
uatRow
=
document
.
createElement
(
"treerow"
);
var
uatCell
=
document
.
createElement
(
"treecell"
);
uatCell
.
setAttribute
(
"label"
,
EnigGetString
(
"keylist.noPhotos"
));
uatRow
.
appendChild
(
uatCell
);
uatItem
.
appendChild
(
uatRow
);
var
uatChildren
=
document
.
createElement
(
"treechildren"
);
uatItem
.
appendChild
(
uatChildren
);
for
(
var
subkey
=
0
;
subkey
<
gKeyList
[
keyId
].
SubUserIds
.
length
;
subkey
++
)
{
var
subItem
=
enigUserSelCreateRow
(
gKeyList
[
keyId
],
subkey
);
if
(
gKeyList
[
keyId
].
SubUserIds
[
subkey
].
type
==
"uat"
)
{
uatItem
.
setAttribute
(
"container"
,
"true"
);
uatCell
.
setAttribute
(
"label"
,
EnigGetString
(
"keylist.hasPhotos"
));
uatChildren
.
appendChild
(
subItem
);
uatItem
.
setAttribute
(
"open"
,
"true"
);
}
else
{
uidItem
.
setAttribute
(
"container"
,
"true"
);
uidCell
.
setAttribute
(
"label"
,
EnigGetString
(
"keylist.hasOtherUids"
));
uidChildren
.
appendChild
(
subItem
);
uidItem
.
setAttribute
(
"open"
,
"true"
);
}
}
if
(
treeItem
)
treeChildren
.
appendChild
(
treeItem
);
}
// 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
);
}
}
// gUserList.focus();
}
// 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"
);
var
keyTrust
;
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"
));
}
keyTrust
=
keyObj
.
keyTrust
;
treeItem
.
setAttribute
(
"keytype"
,
"pub"
);
fprCol
.
setAttribute
(
"label"
,
EnigFormatFpr
(
keyObj
.
fpr
));
}
else
{
// secondary user id
keyObj
.
SubUserIds
[
subKeyNum
].
userId
=
keyObj
.
SubUserIds
[
subKeyNum
].
userId
;
userCol
.
setAttribute
(
"label"
,
keyObj
.
SubUserIds
[
subKeyNum
].
userId
);
treeItem
.
setAttribute
(
"keytype"
,
keyObj
.
SubUserIds
[
subKeyNum
].
type
);
if
(
keyObj
.
SubUserIds
[
subKeyNum
].
type
==
"uid"
)
treeItem
.
setAttribute
(
"uidNum"
,
subKeyNum
);
if
(
keyObj
.
SubUserIds
[
subKeyNum
].
type
==
"uat"
)
{
treeItem
.
setAttribute
(
"uatNum"
,
keyObj
.
SubUserIds
[
subKeyNum
].
uatNum
);
}
keyCol
.
setAttribute
(
"label"
,
""
);
typeCol
.
setAttribute
(
"label"
,
""
);
keyTrust
=
keyObj
.
SubUserIds
[
subKeyNum
].
keyTrust
;
}
var
keyTrustLabel
=
EnigGetTrustLabel
(
keyTrust
);
var
keyTrustStyle
=
""
;
switch
(
keyTrust
)
{
case
'q'
:
keyTrustStyle
=
"enigmail_keyValid_unknown"
;
break
;
case
'i'
:
keyTrustStyle
=
"enigmail_keyValid_invalid"
;
break
;
case
'd'
:
keyTrustStyle
=
"enigmail_keyValid_disabled"
;
break
;
case
'r'
:
keyTrustStyle
=
"enigmail_keyValid_revoked"
;
break
;
case
'e'
:
keyTrustStyle
=
"enigmail_keyValid_expired"
;
break
;
case
'n'
:
keyTrustStyle
=
"enigmail_keyTrust_untrusted"
;
break
;
case
'm'
:
keyTrustStyle
=
"enigmail_keyTrust_marginal"
;
break
;
case
'f'
:
keyTrustStyle
=
"enigmail_keyTrust_full"
;
break
;
case
'u'
:
keyTrustStyle
=
"enigmail_keyTrust_ultimate"
;
break
;
case
'-'
:
keyTrustStyle
=
"enigmail_keyTrust_unknown"
;
break
;
default
:
keyTrustStyle
=
"enigmail_keyTrust_unknown"
;
break
;
}
expCol
.
setAttribute
(
"label"
,
keyObj
.
expiry
);
expCol
.
setAttribute
(
"id"
,
"expiry"
);
if
(
keyObj
.
keyUseFor
.
indexOf
(
"D"
)
>=
0
)
{
keyTrustLabel
=
EnigGetString
(
"keyValid.disabled"
);
keyTrustStyle
=
"enigmail_keyValid_disabled"
;
}
validCol
.
setAttribute
(
"label"
,
keyTrustLabel
);
validCol
.
setAttribute
(
"properties"
,
keyTrustStyle
);
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
);
var
attr
;
if
((
keyTrust
.
length
>
0
)
&&
(
ENIG_KEY_NOT_VALID
.
indexOf
(
keyTrust
.
charAt
(
0
))
>=
0
)
||
(
keyObj
.
keyUseFor
.
indexOf
(
"D"
)
>=
0
))
{
for
(
let
node
=
userRow
.
firstChild
;
node
;
node
=
node
.
nextSibling
)
{
attr
=
node
.
getAttribute
(
"properties"
);
if
(
typeof
(
attr
)
==
"string"
)
{
node
.
setAttribute
(
"properties"
,
attr
+
" enigKeyInactive"
);
}
else
{
node
.
setAttribute
(
"properties"
,
"enigKeyInactive"
);
}
}
}
if
(
keyObj
.
secretAvailable
&&
subKeyNum
<
0
)
{
for
(
let
node
=
userRow
.
firstChild
;
node
;
node
=
node
.
nextSibling
)
{
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
=
[];
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
(
"bcEditKey"
).
removeAttribute
(
"disabled"
);
}
else
{
document
.
getElementById
(
"bcRevoke"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcEditKey"
).
setAttribute
(
"disabled"
,
"true"
);
}
if
(
keyList
.
length
==
1
&&
gKeyList
[
keyList
[
0
]].
photoAvailable
)
{
document
.
getElementById
(
"bcViewPhoto"
).
removeAttribute
(
"disabled"
);
}
else
{
document
.
getElementById
(
"bcViewPhoto"
).
setAttribute
(
"disabled"
,
"true"
);
}
if
(
enigGetClipboard
().
length
>
0
)
{
document
.
getElementById
(
"bcClipbrd"
).
removeAttribute
(
"disabled"
);
}
else
{
document
.
getElementById
(
"bcClipbrd"
).
setAttribute
(
"disabled"
,
"true"
);
}
if
(
keyList
.
length
>=
1
)
{
document
.
getElementById
(
"bcEnableKey"
).
removeAttribute
(
"disabled"
);
if
(
gKeyList
[
keyList
[
0
]].
keyUseFor
.
indexOf
(
"D"
)
>
0
||
gKeyList
[
keyList
[
0
]].
keyTrust
.
indexOf
(
ENIG_KEY_DISABLED
)
>=
0
)
{
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"label"
,
EnigGetString
(
"keyMan.enableKey"
));
}
else
{
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"label"
,
EnigGetString
(
"keyMan.disableKey"
));
}
}
if
(
keyList
.
length
==
1
)
{
document
.
getElementById
(
"bcSignKey"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcViewSig"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcOneKey"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcDeleteKey"
).
removeAttribute
(
"disabled"
);
document
.
getElementById
(
"bcNoKey"
).
removeAttribute
(
"disabled"
);
}
else
{
if
(
keyList
.
length
===
0
)
{
document
.
getElementById
(
"bcNoKey"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcEnableKey"
).
setAttribute
(
"disabled"
,
"true"
);
}
else
{
document
.
getElementById
(
"bcNoKey"
).
removeAttribute
(
"disabled"
);
}
document
.
getElementById
(
"bcSignKey"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcViewSig"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcOneKey"
).
setAttribute
(
"disabled"
,
"true"
);
document
.
getElementById
(
"bcDeleteKey"
).
setAttribute
(
"disabled"
,
"true"
);
}
}
function
enigmailOnClick
(
event
)
{
if
(
event
.
detail
!=
2
)
{
return
;
}
// do not propagate double clicks
event
.
stopPropagation
();
var
keyList
=
enigmailGetSelectedKeys
();
var
keyType
=
""
;
var
uatNum
=
""
;
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"
);
uatNum
=
gUserList
.
view
.
getItemAtIndex
(
start
.
value
).
getAttribute
(
"uatNum"
);
}
catch
(
ex
)
{}
}
if
(
keyType
==
"uat"
)
{
enigShowSpecificPhoto
(
uatNum
);
}
else
{
enigmailKeyDetails
();
}
}
function
enigmailSelectAllKeys
()
{
gUserList
.
view
.
selection
.
selectAll
();
}
function
enigmailKeyDetails
()
{
var
keyList
=
enigmailGetSelectedKeys
();
EnigDisplayKeyDetails
(
keyList
[
0
],
false
);
}
function
enigmailDeleteKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
deleteSecret
=
false
;
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
if
(
keyList
.
length
==
1
)
{
// one key selected
var
userId
=
"0x"
+
keyList
[
0
].
substr
(
-
8
,
8
)
+
" - "
+
gKeyList
[
keyList
[
0
]].
userId
;
if
(
gKeyList
[
keyList
[
0
]].
secretAvailable
)
{
if
(
!
EnigConfirm
(
EnigGetString
(
"deleteSecretKey"
,
userId
),
EnigGetString
(
"dlg.button.delete"
)))
return
;
deleteSecret
=
true
;
}
else
{
if
(
!
EnigConfirm
(
EnigGetString
(
"deletePubKey"
,
userId
),
EnigGetString
(
"dlg.button.delete"
)))
return
;
}
}
else
{
// several keys selected
for
(
var
i
=
0
;
i
<
keyList
.
length
;
i
++
)
{
if
(
gKeyList
[
keyList
[
i
]].
secretAvailable
)
deleteSecret
=
true
;
}
if
(
deleteSecret
)
{
if
(
!
EnigConfirm
(
EnigGetString
(
"deleteMix"
),
EnigGetString
(
"dlg.button.delete"
)))
return
;
}
else
{
if
(
!
EnigConfirm
(
EnigGetString
(
"deleteSelectedPubKey"
),
EnigGetString
(
"dlg.button.delete"
)))
return
;
}
}
let
fprArr
=
[];
for
(
let
j
in
keyList
)
{
fprArr
.
push
(
"0x"
+
gKeyList
[
keyList
[
j
]].
fpr
);
}
EnigmailKeyEditor
.
deleteKey
(
window
,
fprArr
.
join
(
" "
),
deleteSecret
,
function
(
exitCode
,
errorMsg
)
{
if
(
exitCode
!==
0
)
{
EnigAlert
(
EnigGetString
(
"deleteKeyFailed"
)
+
"\n\n"
+
errorMsg
);
return
;
}
enigmailRefreshKeys
();
});
}
function
enigmailEnableKey
()
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
keyList
=
enigmailGetSelectedKeys
();
var
disableKey
=
(
gKeyList
[
keyList
[
0
]].
keyUseFor
.
indexOf
(
"D"
)
<
0
&&
gKeyList
[
keyList
[
0
]].
keyTrust
.
indexOf
(
ENIG_KEY_DISABLED
)
<
0
);
var
keyIndex
=
0
;
function
processNextKey
()
{
EnigmailKeyEditor
.
enableDisableKey
(
window
,
"0x"
+
keyList
[
keyIndex
],
disableKey
,
function
_enDisCb
(
exitCode
,
errorMsg
)
{
if
(
exitCode
===
0
)
{
++
keyIndex
;
if
(
keyIndex
<
keyList
.
length
)
{
processNextKey
();
return
;
}
else
{
enigmailRefreshKeys
();
}
}
else
{
EnigAlert
(
EnigGetString
(
"enableKeyFailed"
)
+
"\n\n"
+
errorMsg
);
if
(
keyIndex
>
0
)
enigmailRefreshKeys
();
}
});
}
processNextKey
();
}
function
enigShowPhoto
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
keyType
=
""
;
var
uatNum
=
""
;
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"
);
uatNum
=
gUserList
.
view
.
getItemAtIndex
(
start
.
value
).
getAttribute
(
"uatNum"
);
}
catch
(
ex
)
{}
if
(
keyType
==
"uat"
)
{
enigShowSpecificPhoto
(
uatNum
);
return
;
}
}
enigShowSpecificPhoto
(
null
);
}
function
enigShowSpecificPhoto
(
uatNumber
)
{
var
keyList
=
enigmailGetSelectedKeys
();
EnigShowPhoto
(
keyList
[
0
],
gKeyList
[
keyList
[
0
]].
userId
,
uatNumber
);
}
function
enigmailAddPhoto
()
{
var
keyList
=
enigmailGetSelectedKeys
();
keyMgrAddPhoto
(
gKeyList
[
keyList
[
0
]].
userId
,
keyList
[
0
]);
}
function
keyMgrAddPhoto
(
userId
,
keyId
)
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
inFile
;
var
validFile
=
false
;
while
(
!
validFile
)
{
inFile
=
EnigFilePicker
(
EnigGetString
(
"keyMan.addphoto.filepicker.title"
),
""
,
false
,
"*.jpg"
,
null
,
[
"JPG"
,
"*.jpg"
,
"JPEG"
,
"*.jpeg"
]);
if
(
!
inFile
)
return
;
var
jpgHeader
=
EnigReadFileContents
(
inFile
,
10
);
validFile
=
(
jpgHeader
.
charCodeAt
(
0
)
==
0xFF
&&
jpgHeader
.
charCodeAt
(
1
)
==
0xD8
&&
jpgHeader
.
substr
(
6
,
4
)
==
"JFIF"
);
if
(
!
validFile
)
{
EnigAlert
(
EnigGetString
(
"keyMan.addphoto.noJpegFile"
));
}
}
if
(
inFile
.
fileSize
>
25600
)
{
// warn if file size > 25 kB
if
(
!
EnigConfirm
(
EnigGetString
(
"keyMan.addphoto.warnLargeFile"
),
EnigGetString
(
"dlg.button.continue"
),
EnigGetString
(
"dlg.button.cancel"
)))
return
;
}
var
ioServ
=
enigGetService
(
ENIG_IOSERVICE_CONTRACTID
,
"nsIIOService"
);
var
photoUri
=
ioServ
.
newFileURI
(
inFile
).
spec
;
var
argsObj
=
{
photoUri
:
photoUri
,
userId
:
userId
,
keyId
:
keyId
,
okPressed
:
false
};
window
.
openDialog
(
"chrome://enigmail/content/enigmailImportPhoto.xul"
,
inFile
,
"chrome,modal=1,resizable=1,dialog=1,centerscreen"
,
argsObj
);
if
(
!
argsObj
.
okPressed
)
return
;
EnigmailKeyEditor
.
addPhoto
(
window
,
"0x"
+
keyId
,
inFile
,
function
(
exitCode
,
errorMsg
)
{
if
(
exitCode
!==
0
)
{
EnigAlert
(
EnigGetString
(
"keyMan.addphoto.failed"
)
+
"\n\n"
+
errorMsg
);
return
;
}
enigmailRefreshKeys
();
});
}
function
enigCreateKeyMsg
()
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
===
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
tmpDir
=
EnigGetTempDir
();
var
tmpFile
;
try
{
tmpFile
=
Cc
[
ENIG_LOCAL_FILE_CONTRACTID
].
createInstance
(
EnigGetLocalFileApi
());
tmpFile
.
initWithPath
(
tmpDir
);
if
(
!
(
tmpFile
.
isDirectory
()
&&
tmpFile
.
isWritable
()))
{
EnigAlert
(
EnigGetString
(
"noTempDir"
));
return
;
}
}
catch
(
ex
)
{}
tmpFile
.
append
(
"key.asc"
);
tmpFile
.
createUnique
(
Ci
.
nsIFile
.
NORMAL_FILE_TYPE
,
0600
);
// save file
var
exitCodeObj
=
{};
var
errorMsgObj
=
{};
EnigmailKeyRing
.
extractKey
(
window
,
0
,
"0x"
+
keyList
.
join
(
" 0x"
),
tmpFile
,
exitCodeObj
,
errorMsgObj
);
if
(
exitCodeObj
.
value
!==
0
)
{
EnigAlert
(
errorMsgObj
.
value
);
return
;
}
// create attachment
var
ioServ
=
Cc
[
ENIG_IOSERVICE_CONTRACTID
].
getService
(
Ci
.
nsIIOService
);
var
tmpFileURI
=
ioServ
.
newFileURI
(
tmpFile
);
var
keyAttachment
=
Cc
[
"@mozilla.org/messengercompose/attachment;1"
].
createInstance
(
Ci
.
nsIMsgAttachment
);
keyAttachment
.
url
=
tmpFileURI
.
spec
;
if
(
keyList
.
length
==
1
)
{
keyAttachment
.
name
=
"0x"
+
keyList
[
0
].
substr
(
-
8
,
8
)
+
".asc"
;
}
else
{
keyAttachment
.
name
=
"pgpkeys.asc"
;
}
keyAttachment
.
temporary
=
true
;
keyAttachment
.
contentType
=
"application/pgp-keys"
;
// create Msg
var
msgCompFields
=
Cc
[
"@mozilla.org/messengercompose/composefields;1"
].
createInstance
(
Ci
.
nsIMsgCompFields
);
msgCompFields
.
addAttachment
(
keyAttachment
);
var
acctManager
=
Cc
[
"@mozilla.org/messenger/account-manager;1"
].
createInstance
(
Ci
.
nsIMsgAccountManager
);
var
msgCompSvc
=
Cc
[
"@mozilla.org/messengercompose;1"
].
getService
(
Ci
.
nsIMsgComposeService
);
var
msgCompParam
=
Cc
[
"@mozilla.org/messengercompose/composeparams;1"
].
createInstance
(
Ci
.
nsIMsgComposeParams
);
msgCompParam
.
composeFields
=
msgCompFields
;
msgCompParam
.
identity
=
acctManager
.
defaultAccount
.
defaultIdentity
;
msgCompParam
.
type
=
Ci
.
nsIMsgCompType
.
New
;
msgCompParam
.
format
=
Ci
.
nsIMsgCompFormat
.
Default
;
msgCompParam
.
originalMsgURI
=
""
;
msgCompSvc
.
OpenComposeWindowWithParams
(
""
,
msgCompParam
);
}
function
createNewMail
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
===
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
addresses
=
[];
var
rangeCount
=
gUserList
.
view
.
selection
.
getRangeCount
();
var
start
=
{};
var
end
=
{};
var
keyType
,
keyId
,
r
,
i
;
for
(
i
=
0
;
i
<
rangeCount
;
i
++
)
{
gUserList
.
view
.
selection
.
getRangeAt
(
i
,
start
,
end
);
for
(
r
=
start
.
value
;
r
<=
end
.
value
;
r
++
)
{
try
{
keyType
=
gUserList
.
view
.
getItemAtIndex
(
r
).
getAttribute
(
"keytype"
);
keyId
=
gUserList
.
view
.
getItemAtIndex
(
r
).
getAttribute
(
"id"
);
if
(
keyType
==
"uid"
)
{
var
uidNum
=
Number
(
gUserList
.
view
.
getItemAtIndex
(
r
).
getAttribute
(
"uidNum"
));
addresses
.
push
(
gKeyList
[
keyId
].
SubUserIds
[
uidNum
].
userId
);
}
else
addresses
.
push
(
gKeyList
[
keyId
].
userId
);
}
catch
(
ex
)
{}
}
}
// create Msg
var
msgCompFields
=
Cc
[
"@mozilla.org/messengercompose/composefields;1"
].
createInstance
(
Ci
.
nsIMsgCompFields
);
msgCompFields
.
to
=
addresses
.
join
(
", "
);
var
acctManager
=
Cc
[
"@mozilla.org/messenger/account-manager;1"
].
createInstance
(
Ci
.
nsIMsgAccountManager
);
var
msgCompSvc
=
Cc
[
"@mozilla.org/messengercompose;1"
].
getService
(
Ci
.
nsIMsgComposeService
);
var
msgCompParam
=
Cc
[
"@mozilla.org/messengercompose/composeparams;1"
].
createInstance
(
Ci
.
nsIMsgComposeParams
);
msgCompParam
.
composeFields
=
msgCompFields
;
msgCompParam
.
identity
=
acctManager
.
defaultAccount
.
defaultIdentity
;
msgCompParam
.
type
=
Ci
.
nsIMsgCompType
.
New
;
msgCompParam
.
format
=
Ci
.
nsIMsgCompFormat
.
Default
;
msgCompParam
.
originalMsgURI
=
""
;
msgCompSvc
.
OpenComposeWindowWithParams
(
""
,
msgCompParam
);
}
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
);
}
if
(
EnigEditKeyTrust
(
userIdList
,
keyList
))
{
enigmailRefreshKeys
();
}
}
function
enigEditKeyExpiry
()
{
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
);
}
if
(
EnigEditKeyExpiry
(
userIdList
,
keyList
))
{
enigmailRefreshKeys
();
}
}
function
enigSignKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
===
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
if
(
EnigSignKey
(
gKeyList
[
keyList
[
0
]].
userId
,
keyList
[
0
],
null
))
{
enigmailRefreshKeys
();
}
}
function
enigmailRevokeKey
()
{
var
keyList
=
enigmailGetSelectedKeys
();
EnigRevokeKey
(
keyList
[
0
],
gKeyList
[
keyList
[
0
]].
userId
,
function
_revokeKeyCb
(
success
)
{
if
(
success
)
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
;
}
// check whether we want to export a private key anywhere in the key list
var
secretFound
=
false
;
for
(
var
i
=
0
;
i
<
keyList
.
length
&&
!
secretFound
;
++
i
)
{
if
(
gKeyList
[
keyList
[
i
]].
secretAvailable
)
{
secretFound
=
true
;
}
}
var
exportFlags
=
0
;
if
(
secretFound
)
{
// double check that also the pivate keys shall be exportet
var
r
=
EnigLongAlert
(
EnigGetString
(
"exportSecretKey"
),
null
,
EnigGetString
(
"keyMan.button.exportPubKey"
),
EnigGetString
(
"keyMan.button.exportSecKey"
),
":cancel"
);
switch
(
r
)
{
case
0
:
// export pub key only
break
;
case
1
:
// export secret key
exportFlags
|=
nsIEnigmail
.
EXTRACT_SECRET_KEY
;
break
;
case
2
:
// cancel
return
;
}
}
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
defaultFileName
;
if
(
keyList
.
length
==
1
)
{
defaultFileName
=
gKeyList
[
keyList
[
0
]].
userId
.
replace
(
/[<\>]/g
,
""
);
if
(
exportFlags
&
nsIEnigmail
.
EXTRACT_SECRET_KEY
)
{
defaultFileName
=
EnigGetString
(
"specificPubSecKeyFilename"
,
defaultFileName
,
keyList
[
0
].
substr
(
-
8
,
8
))
+
".asc"
;
}
else
{
defaultFileName
=
EnigGetString
(
"specificPubKeyFilename"
,
defaultFileName
,
keyList
[
0
].
substr
(
-
8
,
8
))
+
".asc"
;
}
}
else
{
if
(
exportFlags
&
nsIEnigmail
.
EXTRACT_SECRET_KEY
)
{
defaultFileName
=
EnigGetString
(
"defaultPubSecKeyFilename"
)
+
".asc"
;
}
else
{
defaultFileName
=
EnigGetString
(
"defaultPubKeyFilename"
)
+
".asc"
;
}
}
var
FilePickerLabel
=
""
;
if
(
exportFlags
&
nsIEnigmail
.
EXTRACT_SECRET_KEY
)
{
FilePickerLabel
=
EnigGetString
(
"exportKeypairToFile"
);
}
else
{
FilePickerLabel
=
EnigGetString
(
"exportToFile"
);
}
var
outFile
=
EnigFilePicker
(
FilePickerLabel
,
""
,
true
,
"*.asc"
,
defaultFileName
,
[
EnigGetString
(
"asciiArmorFile"
),
"*.asc"
]);
if
(
!
outFile
)
return
;
var
keyListStr
=
"0x"
+
keyList
.
join
(
" 0x"
);
var
exitCodeObj
=
{};
var
errorMsgObj
=
{};
EnigmailKeyRing
.
extractKey
(
window
,
exportFlags
,
keyListStr
,
outFile
,
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
(
"importKeyFile"
),
""
,
false
,
"*.asc"
,
""
,
[
EnigGetString
(
"gnupgFile"
),
"*.asc;*.gpg;*.pgp"
]);
if
(
!
inFile
)
return
;
var
errorMsgObj
=
{};
var
keyListObj
=
{};
var
exitCode
=
EnigmailKeyRing
.
importKeyFromFile
(
window
,
inFile
,
errorMsgObj
,
keyListObj
);
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
=
{};
EnigDownloadKeys
(
inputObj
,
resultObj
);
if
(
resultObj
.
importedKeys
>
0
)
{
enigmailRefreshKeys
();
}
}
function
enigmailListSig
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
inputObj
=
{
keyId
:
keyList
[
0
],
keyListArr
:
gKeyList
};
var
resultObj
=
{};
window
.
openDialog
(
"chrome://enigmail/content/enigmailViewKeySigDlg.xul"
,
""
,
"chrome,dialog,modal,centerscreen,resizable=yes"
,
inputObj
,
resultObj
);
if
(
resultObj
.
refresh
)
{
enigmailRefreshKeys
();
}
}
function
enigmailManageUids
()
{
var
keyList
=
enigmailGetSelectedKeys
();
var
inputObj
=
{
keyId
:
keyList
[
0
],
ownKey
:
gKeyList
[
keyList
[
0
]].
secretAvailable
};
var
resultObj
=
{
refresh
:
false
};
window
.
openDialog
(
"chrome://enigmail/content/enigmailManageUidDlg.xul"
,
""
,
"dialog,modal,centerscreen,resizable=yes"
,
inputObj
,
resultObj
);
if
(
resultObj
.
refresh
)
{
enigmailRefreshKeys
();
}
}
function
enigmailChangePwd
()
{
var
keyList
=
enigmailGetSelectedKeys
();
EnigChangeKeyPwd
(
keyList
[
0
],
gKeyList
[
keyList
[
0
]].
userId
);
}
function
enigGetClipboard
()
{
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigGetClipboard:\n"
);
var
cBoardContent
=
""
;
var
clipBoard
=
Cc
[
ENIG_CLIPBOARD_CONTRACTID
].
getService
(
Ci
.
nsIClipboard
);
try
{
var
transferable
=
Cc
[
ENIG_TRANSFERABLE_CONTRACTID
].
createInstance
(
Ci
.
nsITransferable
);
transferable
.
addDataFlavor
(
"text/unicode"
);
clipBoard
.
getData
(
transferable
,
clipBoard
.
kGlobalClipboard
);
var
flavour
=
{};
var
data
=
{};
var
length
=
{};
transferable
.
getAnyTransferData
(
flavour
,
data
,
length
);
cBoardContent
=
data
.
value
.
QueryInterface
(
Ci
.
nsISupportsString
).
data
;
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigGetClipboard: got data\n"
);
}
catch
(
ex
)
{}
return
cBoardContent
;
}
function
enigmailImportFromClipbrd
()
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
if
(
!
EnigConfirm
(
EnigGetString
(
"importFromClip"
),
EnigGetString
(
"keyMan.button.import"
)))
{
return
;
}
var
cBoardContent
=
enigGetClipboard
();
var
errorMsgObj
=
{};
var
r
=
EnigmailKeyRing
.
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
=
EnigmailKeyRing
.
extractKey
(
window
,
0
,
"0x"
+
keyList
.
join
(
" 0x"
),
null
,
exitCodeObj
,
errorMsgObj
);
if
(
exitCodeObj
.
value
!==
0
)
{
EnigAlert
(
EnigGetString
(
"copyToClipbrdFailed"
)
+
"\n\n"
+
errorMsgObj
.
value
);
return
;
}
var
clipBoard
=
Cc
[
ENIG_CLIPBOARD_CONTRACTID
].
getService
(
Ci
.
nsIClipboard
);
try
{
clipBoardHlp
=
Cc
[
ENIG_CLIPBOARD_HELPER_CONTRACTID
].
getService
(
Ci
.
nsIClipboardHelper
);
clipBoardHlp
.
copyStringToClipboard
(
keyData
,
clipBoard
.
kGlobalClipboard
);
if
(
clipBoard
.
supportsSelectionClipboard
())
{
clipBoardHlp
.
copyStringToClipboard
(
keyData
,
clipBoard
.
kSelectionClipboard
);
}
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigmailImportFromClipbrd: got data from clipboard"
);
EnigAlert
(
EnigGetString
(
"copyToClipbrdOK"
));
}
catch
(
ex
)
{
EnigAlert
(
EnigGetString
(
"copyToClipbrdFailed"
));
}
}
function
enigmailSearchKey
()
{
var
inputObj
=
{
searchList
:
null
};
var
resultObj
=
{};
EnigDownloadKeys
(
inputObj
,
resultObj
);
if
(
resultObj
.
importedKeys
>
0
)
{
enigmailRefreshKeys
();
}
}
function
enigmailUploadKeys
()
{
enigmailKeyServerAcess
(
nsIEnigmail
.
UPLOAD_KEY
,
enigmailUploadKeysCb
);
}
function
enigmailUploadKeysCb
(
exitCode
,
errorMsg
,
msgBox
)
{
if
(
msgBox
)
{
if
(
exitCode
!==
0
)
{
EnigLongAlert
(
EnigGetString
(
"sendKeysFailed"
)
+
"\n"
+
errorMsg
);
}
}
else
{
return
(
EnigGetString
(
exitCode
===
0
?
"sendKeysOk"
:
"sendKeysFailed"
));
}
return
""
;
}
function
enigmailReceiveKey
()
{
enigmailKeyServerAcess
(
nsIEnigmail
.
DOWNLOAD_KEY
,
enigmailReceiveKeyCb
);
}
function
enigmailRefreshAllKeys
()
{
var
checkedObj
=
{};
var
doIt
=
false
;
if
(
!
EnigGetPref
(
"warnRefreshAll"
))
{
doIt
=
true
;
}
else
if
(
EnigLongAlert
(
EnigGetString
(
"refreshKey.warn"
),
EnigGetString
(
"dlgNoPrompt"
),
EnigGetString
(
"dlg.button.continue"
),
":cancel"
,
null
,
checkedObj
)
===
0
)
{
if
(
checkedObj
.
value
)
{
EnigSetPref
(
"warnRefreshAll"
,
false
);
}
doIt
=
true
;
}
if
(
doIt
)
enigmailKeyServerAcess
(
nsIEnigmail
.
REFRESH_KEY
,
enigmailReceiveKeyCb
);
}
// Iterate through contact emails and download them
function
enigmailDowloadContactKeysEngine
()
{
let
abManager
=
Cc
[
"@mozilla.org/abmanager;1"
].
getService
(
Ci
.
nsIAbManager
);
let
allAddressBooks
=
abManager
.
directories
;
let
emails
=
[];
while
(
allAddressBooks
.
hasMoreElements
())
{
let
addressBook
=
allAddressBooks
.
getNext
().
QueryInterface
(
Ci
.
nsIAbDirectory
);
if
(
addressBook
instanceof
Ci
.
nsIAbDirectory
)
{
// or nsIAbItem or nsIAbCollection
// ask for confirmation for each address book:
var
doIt
=
EnigmailDialog
.
confirmDlg
(
window
,
EnigGetString
(
"downloadContactsKeys.importFrom"
,
addressBook
.
dirName
),
EnigGetString
(
"dlgYes"
),
EnigGetString
(
"dlg.button.skip"
));
if
(
!
doIt
)
{
continue
;
// SKIP this address book
}
let
allChildCards
=
addressBook
.
childCards
;
while
(
allChildCards
.
hasMoreElements
())
{
let
card
=
allChildCards
.
getNext
().
QueryInterface
(
Ci
.
nsIAbCard
);
try
{
let
email
=
card
.
getPropertyAsAString
(
"PrimaryEmail"
);
if
(
email
&&
email
.
indexOf
(
"@"
)
>=
0
)
{
emails
.
push
(
email
);
}
}
catch
(
e
)
{}
try
{
let
email
=
card
.
getPropertyAsAString
(
"SecondEmail"
);
if
(
email
&&
email
.
indexOf
(
"@"
)
>=
0
)
{
emails
.
push
(
email
);
}
}
catch
(
e
)
{}
}
}
}
// list of emails might be emoty here, in which case we do nothing
if
(
emails
.
length
<=
0
)
{
return
;
}
// sort the e-mail array
emails
.
sort
();
//remove duplicates
var
i
=
0
;
while
(
i
<
emails
.
length
-
1
)
{
if
(
emails
[
i
]
==
emails
[
i
+
1
])
{
emails
.
splice
(
i
,
1
);
}
else
{
i
=
i
+
1
;
}
}
var
inputObj
=
{
searchList
:
emails
};
var
resultObj
=
{};
EnigmailWindows
.
downloadKeys
(
window
,
inputObj
,
resultObj
);
if
(
resultObj
.
importedKeys
>
0
)
{
enigmailRefreshKeys
();
}
}
function
enigmailDownloadContactKeys
()
{
var
doIt
=
EnigmailDialog
.
confirmPref
(
window
,
EnigGetString
(
"downloadContactsKeys.warn"
),
"warnDownloadContactKeys"
,
EnigGetString
(
"dlg.button.continue"
),
EnigGetString
(
"dlg.button.cancel"
));
if
(
doIt
)
enigmailDowloadContactKeysEngine
();
}
function
displayResult
(
arrayOfMsgText
)
{
EnigLongAlert
(
arrayOfMsgText
.
join
(
"\n"
));
}
function
enigmailReceiveKeyCb
(
exitCode
,
errorMsg
,
msgBox
)
{
EnigmailLog
.
DEBUG
(
"enigmailKeyManager.js: enigmailReceiveKeyCb\n"
);
if
(
msgBox
)
{
if
(
exitCode
===
0
)
{
enigmailRefreshKeys
();
EnigmailEvents
.
dispatchEvent
(
displayResult
,
100
,
[
EnigGetString
(
"receiveKeysOk"
),
errorMsg
]);
}
else
{
EnigmailEvents
.
dispatchEvent
(
displayResult
,
100
,
[
EnigGetString
(
"receiveKeysFailed"
),
errorMsg
]);
}
}
else
{
return
(
EnigGetString
(
exitCode
===
0
?
"receiveKeysOk"
:
"receiveKeysFailed"
));
}
return
""
;
}
function
addToPRRule
()
{
var
keyList
=
enigmailGetSelectedKeys
();
if
(
keyList
.
length
===
0
)
{
EnigAlert
(
EnigGetString
(
"noKeySelected"
));
return
;
}
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
inputObj
=
{
keyId
:
keyList
[
0
],
userId
:
gKeyList
[
keyList
[
0
]].
userId
};
window
.
openDialog
(
"chrome://enigmail/content/enigmailSelectRule.xul"
,
""
,
"dialog,modal,centerscreen"
,
inputObj
);
}
function
enigmailImportKeysFromUrl
()
{
var
value
=
{
"value"
:
""
};
if
(
EnigmailDialog
.
promptValue
(
window
,
EnigGetString
(
"importFromUrl"
),
value
))
{
var
p
=
new
Promise
(
function
(
resolve
,
reject
)
{
var
cbFunc
=
function
_cb
(
data
)
{
EnigmailLog
.
DEBUG
(
"enigmailImportKeysFromUrl: _cbFunc()"
);
var
errorMsgObj
=
{};
EnigmailKeyRing
.
importKey
(
window
,
0
,
data
,
""
,
errorMsgObj
);
resolve
(
errorMsgObj
);
};
try
{
var
bufferListener
=
EnigmailStreams
.
newStringStreamListener
(
cbFunc
);
var
ioServ
=
Cc
[
IOSERVICE_CONTRACTID
].
getService
(
Components
.
interfaces
.
nsIIOService
);
var
msgUri
=
ioServ
.
newURI
(
value
.
value
,
null
,
null
);
var
channel
=
ioServ
.
newChannelFromURI
(
msgUri
);
channel
.
asyncOpen
(
bufferListener
,
msgUri
);
}
catch
(
ex
)
{
var
err
=
{
value
:
ex
};
reject
(
err
);
}
}
);
p
.
then
(
function
(
errorMsgObj
)
{
EnigLongAlert
(
errorMsgObj
.
value
);
enigmailRefreshKeys
();
})
.
catch
(
function
(
reason
)
{
EnigLongAlert
(
"Error: "
+
reason
.
value
);
});
}
}
//
// ----- key filtering functionality -----
//
function
onSearchInput
()
{
if
(
gSearchInput
.
value
===
""
)
{
onResetFilter
();
return
;
}
enigApplyFilter
();
}
function
getFirstNode
()
{
return
gTreeChildren
.
firstChild
;
}
function
onResetFilter
()
{
gSearchInput
.
value
=
""
;
showOrHideAllKeys
();
}
function
enigmailToggleShowAll
()
{
// gShowAllKeysElement.checked = (! gShowAllKeysElement.checked);
EnigSetPref
(
"keyManShowAllKeys"
,
displayFullList
());
if
(
!
gSearchInput
.
value
||
gSearchInput
.
value
.
length
===
0
)
{
showOrHideAllKeys
();
}
}
function
showOrHideAllKeys
()
{
var
hideNode
=
!
displayFullList
();
var
initHint
=
document
.
getElementById
(
"emptyTree"
);
var
showInvalidKeys
=
gShowInvalidKeys
.
getAttribute
(
"checked"
)
==
"true"
;
var
showUntrustedKeys
=
gShowUntrustedKeys
.
getAttribute
(
"checked"
)
==
"true"
;
var
showOthersKeys
=
gShowOthersKeys
.
getAttribute
(
"checked"
)
==
"true"
;
document
.
getElementById
(
"nothingFound"
).
hidePopup
();
if
(
hideNode
)
{
initHint
.
showPopup
(
gTreeChildren
,
-
1
,
-
1
,
"tooltip"
,
"after_end"
,
""
);
}
else
{
initHint
.
hidePopup
();
}
var
node
=
getFirstNode
();
while
(
node
)
{
node
.
hidden
=
hideNode
;
if
(
!
determineHiddenKeys
(
gKeyList
[
node
.
id
],
showInvalidKeys
,
showUntrustedKeys
,
showOthersKeys
))
{
node
.
hidden
=
true
;
}
node
=
node
.
nextSibling
;
}
}
function
determineHiddenKeys
(
keyObj
,
showInvalidKeys
,
showUntrustedKeys
,
showOthersKeys
)
{
var
show
=
true
;
const
INVALID_KEYS
=
"ierdD"
;
const
UNTRUSTED_KEYS
=
"n-"
;
if
((
!
showInvalidKeys
)
&&
INVALID_KEYS
.
indexOf
(
EnigGetTrustCode
(
keyObj
))
>=
0
)
show
=
false
;
if
((
!
showUntrustedKeys
)
&&
UNTRUSTED_KEYS
.
indexOf
(
keyObj
.
ownerTrust
)
>=
0
)
show
=
false
;
if
((
!
showOthersKeys
)
&&
(
!
keyObj
.
secretAvailable
))
show
=
false
;
return
show
;
}
function
enigApplyFilter
()
{
var
searchTxt
=
gSearchInput
.
value
;
var
nothingFoundElem
=
document
.
getElementById
(
"nothingFound"
);
nothingFoundElem
.
hidePopup
();
var
showInvalidKeys
=
gShowInvalidKeys
.
getAttribute
(
"checked"
)
==
"true"
;
var
showUntrustedKeys
=
gShowUntrustedKeys
.
getAttribute
(
"checked"
)
==
"true"
;
var
showOthersKeys
=
gShowOthersKeys
.
getAttribute
(
"checked"
)
==
"true"
;
if
(
!
searchTxt
||
searchTxt
.
length
===
0
)
{
showOrHideAllKeys
();
return
;
}
document
.
getElementById
(
"emptyTree"
).
hidePopup
();
// skip leading 0x in case we search for a key:
if
(
searchTxt
.
length
>
2
&&
searchTxt
.
substr
(
0
,
2
).
toLowerCase
()
==
"0x"
)
{
searchTxt
=
searchTxt
.
substr
(
2
);
}
searchTxt
=
searchTxt
.
toLowerCase
();
searchTxt
=
searchTxt
.
replace
(
/^(\s*)(.*)/
,
"$2"
).
replace
(
/\s+$/
,
""
);
// trim spaces
// check if we search for a full fingerprint (with optional spaces every 4 letters)
var
fpr
=
null
;
if
(
searchTxt
.
length
==
49
)
{
// possible fingerprint with spaces?
if
(
searchTxt
.
search
(
/^[0-9a-f ]*$/
)
>=
0
&&
searchTxt
[
4
]
==
' '
&&
searchTxt
[
9
]
==
' '
&&
searchTxt
[
14
]
==
' '
&&
searchTxt
[
19
]
==
' '
&&
searchTxt
[
24
]
==
' '
&&
searchTxt
[
29
]
==
' '
&&
searchTxt
[
34
]
==
' '
&&
searchTxt
[
39
]
==
' '
&&
searchTxt
[
44
]
==
' '
)
{
fpr
=
searchTxt
.
replace
(
/ /g
,
""
);
}
}
else
if
(
searchTxt
.
length
==
40
)
{
// possible fingerprint without spaces
if
(
searchTxt
.
search
(
/^[0-9a-f ]*$/
)
>=
0
)
{
fpr
=
searchTxt
;
}
}
var
foundResult
=
false
;
var
node
=
getFirstNode
();
while
(
node
)
{
var
uid
=
gKeyList
[
node
.
id
].
userId
;
var
showNode
=
false
;
if
(
uid
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
)
{
showNode
=
true
;
}
// does the full fingerprint (without spaces) match?
// - no partial match check because this is special for the collapsed spaces inside the fingerprint
if
(
showNode
===
false
&&
fpr
&&
gKeyList
[
node
.
id
].
fpr
.
toLowerCase
()
==
fpr
)
{
showNode
=
true
;
}
// does the fingerprint (partially) match?
if
(
showNode
===
false
&&
gKeyList
[
node
.
id
].
fpr
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
)
{
showNode
=
true
;
}
// does a sub user (partially) match?
if
(
showNode
===
false
)
{
for
(
var
subUidIdx
=
0
;
subUidIdx
<
gKeyList
[
node
.
id
].
SubUserIds
.
length
;
subUidIdx
++
)
{
uid
=
gKeyList
[
node
.
id
].
SubUserIds
[
subUidIdx
].
userId
;
if
(
uid
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
)
{
showNode
=
true
;
}
}
}
// does a sub key of (partially) match?
if
(
showNode
===
false
)
{
for
(
var
subKeyIdx
=
0
;
subKeyIdx
<
gKeyList
[
node
.
id
].
subKeys
.
length
;
subKeyIdx
++
)
{
subkey
=
gKeyList
[
node
.
id
].
subKeys
[
subKeyIdx
].
keyId
;
if
(
subkey
.
toLowerCase
().
indexOf
(
searchTxt
)
>=
0
)
{
showNode
=
true
;
}
}
}
// take option to show invalid/untrusted... keys into account
var
hideNode
=
true
;
if
(
showNode
&&
determineHiddenKeys
(
gKeyList
[
node
.
id
],
showInvalidKeys
,
showUntrustedKeys
,
showOthersKeys
))
{
hideNode
=
false
;
foundResult
=
true
;
}
node
.
hidden
=
hideNode
;
node
=
node
.
nextSibling
;
}
if
(
!
foundResult
)
{
nothingFoundElem
.
showPopup
(
gTreeChildren
,
-
1
,
-
1
,
"tooltip"
,
"after_end"
,
""
);
}
}
//
// ----- keyserver related functionality ----
//
function
enigmailKeyServerAcess
(
accessType
,
callbackFunc
)
{
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
resultObj
=
{};
var
inputObj
=
{};
if
(
accessType
==
nsIEnigmail
.
UPLOAD_KEY
)
{
inputObj
.
upload
=
true
;
}
var
selKeyList
=
enigmailGetSelectedKeys
();
if
(
accessType
!=
nsIEnigmail
.
REFRESH_KEY
&&
selKeyList
.
length
===
0
)
{
if
(
EnigConfirm
(
EnigGetString
(
"refreshAllQuestion"
),
EnigGetString
(
"keyMan.button.refreshAll"
)))
{
accessType
=
nsIEnigmail
.
REFRESH_KEY
;
EnigAlertPref
(
EnigGetString
(
"refreshKey.warn"
),
"warnRefreshAll"
);
}
else
{
return
;
}
}
if
(
accessType
!=
nsIEnigmail
.
REFRESH_KEY
)
{
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
(
", "
);
}
else
{
inputObj
.
keyId
=
""
;
}
window
.
openDialog
(
"chrome://enigmail/content/enigmailKeyserverDlg.xul"
,
""
,
"dialog,modal,centerscreen"
,
inputObj
,
resultObj
);
if
(
!
resultObj
.
value
)
{
return
;
}
var
keyDlObj
=
{
accessType
:
accessType
,
keyServer
:
resultObj
.
value
,
keyList
:
"0x"
+
selKeyList
.
join
(
" 0x"
),
cbFunc
:
callbackFunc
};
window
.
openDialog
(
"chrome://enigmail/content/enigRetrieveProgress.xul"
,
""
,
"dialog,modal,centerscreen"
,
keyDlObj
,
resultObj
);
if
(
accessType
!=
nsIEnigmail
.
UPLOAD_KEY
&&
resultObj
.
result
)
{
enigmailRefreshKeys
();
}
}
function
getSortDirection
()
{
return
gUserList
.
getAttribute
(
"sortDirection"
)
==
"ascending"
?
1
:
-
1
;
}
function
sortTree
(
column
)
{
var
columnName
;
var
order
=
getSortDirection
();
//if the column is passed and it's already sorted by that column, reverse sort
if
(
column
)
{
columnName
=
column
.
id
;
if
(
gUserList
.
getAttribute
(
"sortResource"
)
==
columnName
)
{
order
*=
-
1
;
}
else
{
document
.
getElementById
(
gUserList
.
getAttribute
(
"sortResource"
)).
removeAttribute
(
"sortDirection"
);
order
=
1
;
}
}
else
{
columnName
=
gUserList
.
getAttribute
(
"sortResource"
);
}
gUserList
.
setAttribute
(
"sortDirection"
,
order
==
1
?
"ascending"
:
"descending"
);
gUserList
.
setAttribute
(
"sortResource"
,
columnName
);
document
.
getElementById
(
columnName
).
setAttribute
(
"sortDirection"
,
order
==
1
?
"ascending"
:
"descending"
);
enigmailClearTree
();
enigmailBuildList
(
false
);
enigApplyFilter
();
}
function
getSortColumn
()
{
switch
(
gUserList
.
getAttribute
(
"sortResource"
))
{
case
"enigUserNameCol"
:
return
"userid"
;
case
"keyCol"
:
return
"keyidshort"
;
case
"typeCol"
:
return
"keytype"
;
case
"validityCol"
:
return
"validity"
;
case
"trustCol"
:
return
"trust"
;
// ownerTrust
case
"expCol"
:
return
"expiry"
;
case
"fprCol"
:
return
"fpr"
;
default
:
return
"?"
;
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Jan 20, 1:35 AM (19 h, 32 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
a7/4c/82f53967fc7477a2be900a513802
Attached To
rENIG Enigmail
Event Timeline
Log In to Comment