зеркало из https://github.com/mozilla/gecko-dev.git
Bug 239241 - (seamonkey port) option to show/display saved passwords. r=bryner
This commit is contained in:
Родитель
7f997de803
Коммит
26d76b3f96
|
@ -37,6 +37,8 @@ var rejects = [];
|
|||
var deletedSignons = [];
|
||||
var deletedRejects = [];
|
||||
|
||||
var showingPasswords = false;
|
||||
|
||||
function Startup() {
|
||||
// xpconnect to password manager interfaces
|
||||
passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"].getService(Components.interfaces.nsIPasswordManager);
|
||||
|
@ -57,15 +59,15 @@ function Startup() {
|
|||
var tabBox = document.getElementById("tabbox");
|
||||
tabBox.selectedTab = document.getElementById("signonsTab");
|
||||
|
||||
// label the show/hide password button and the close button
|
||||
document.getElementById("togglePasswords").label = kSignonBundle.getString(showingPasswords ? "hidePasswords" : "showPasswords");
|
||||
document.documentElement.getButton("accept").label = kSignonBundle.getString("close");
|
||||
|
||||
// load password manager items
|
||||
if (!LoadSignons()) {
|
||||
return; /* user failed to unlock the database */
|
||||
}
|
||||
LoadRejects();
|
||||
|
||||
|
||||
// label the close button
|
||||
document.documentElement.getButton("accept").label = kSignonBundle.getString("close");
|
||||
}
|
||||
|
||||
function Shutdown() {
|
||||
|
@ -94,6 +96,7 @@ var signonReloadDisplay = {
|
|||
gSelectUserInUse = true;
|
||||
document.getElementById("removeSignon").disabled = true;
|
||||
document.getElementById("removeAllSignons").disabled = true;
|
||||
document.getElementById("togglePasswords").disabled = true;
|
||||
} else if (state == "resume") {
|
||||
gSelectUserInUse = false;
|
||||
var selections = GetTreeSelections(signonsTree);
|
||||
|
@ -102,6 +105,7 @@ var signonReloadDisplay = {
|
|||
}
|
||||
if (signons.length > 0) {
|
||||
document.getElementById("removeAllSignons").disabled = false;
|
||||
document.getElementById("togglePasswords").disabled = false;
|
||||
}
|
||||
} else if (state == "inUse") {
|
||||
gSelectUserInUse = true;
|
||||
|
@ -114,22 +118,24 @@ var signonReloadDisplay = {
|
|||
|
||||
var signonsTreeView = {
|
||||
rowCount : 0,
|
||||
setTree : function(tree){},
|
||||
setTree : function(tree) {},
|
||||
getImageSrc : function(row,column) {},
|
||||
getProgressMode : function(row,column) {},
|
||||
getCellValue : function(row,column) {},
|
||||
getCellText : function(row,column){
|
||||
getCellText : function(row,column) {
|
||||
var rv="";
|
||||
if (column.id=="siteCol") {
|
||||
rv = signons[row].host;
|
||||
} else if (column.id=="userCol") {
|
||||
rv = signons[row].user;
|
||||
} else if (column.id=="passwordCol") {
|
||||
rv = signons[row].password;
|
||||
}
|
||||
return rv;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isSorted: function() { return false; },
|
||||
isContainer : function(index) {return false;},
|
||||
isSeparator : function(index) { return false; },
|
||||
isSorted : function() { return false; },
|
||||
isContainer : function(index) { return false; },
|
||||
cycleHeader : function(column) {},
|
||||
getRowProperties : function(row,prop) {},
|
||||
getColumnProperties : function(column,prop) {},
|
||||
|
@ -137,11 +143,12 @@ var signonsTreeView = {
|
|||
};
|
||||
var signonsTree;
|
||||
|
||||
function Signon(number, host, user, rawuser) {
|
||||
function Signon(number, host, user, rawuser, password) {
|
||||
this.number = number;
|
||||
this.host = host;
|
||||
this.user = user;
|
||||
this.rawuser = rawuser;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
function LoadSignons() {
|
||||
|
@ -161,27 +168,24 @@ function LoadSignons() {
|
|||
nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
|
||||
var host = nextPassword.host;
|
||||
var user = nextPassword.user;
|
||||
var password = nextPassword.password;
|
||||
var rawuser = user;
|
||||
|
||||
// if no username supplied, try to parse it out of the url
|
||||
if (user == "") {
|
||||
var unused = { };
|
||||
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
||||
.getService(Components.interfaces.nsIIOService);
|
||||
var username;
|
||||
try {
|
||||
username = ioService.newURI(host, null, null).username;
|
||||
user = ioService.newURI(host, null, null).username;
|
||||
if (user == "") {
|
||||
user = "<>";
|
||||
}
|
||||
} catch(e) {
|
||||
username = "";
|
||||
}
|
||||
if (username != "") {
|
||||
user = username;
|
||||
} else {
|
||||
user = "<>";
|
||||
}
|
||||
}
|
||||
|
||||
signons[count] = new Signon(count++, host, user, rawuser);
|
||||
signons[count] = new Signon(count++, host, user, rawuser, password);
|
||||
}
|
||||
signonsTreeView.rowCount = signons.length;
|
||||
|
||||
|
@ -191,10 +195,13 @@ function LoadSignons() {
|
|||
|
||||
// disable "remove all signons" button if there are no signons
|
||||
var element = document.getElementById("removeAllSignons");
|
||||
var toggle = document.getElementById("togglePasswords");
|
||||
if (signons.length == 0 || gSelectUserInUse) {
|
||||
element.setAttribute("disabled","true");
|
||||
toggle.setAttribute("disabled","true");
|
||||
} else {
|
||||
element.removeAttribute("disabled");
|
||||
toggle.removeAttribute("disabled");
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -221,6 +228,50 @@ function DeleteAllSignons() {
|
|||
FinalizeSignonDeletions();
|
||||
}
|
||||
|
||||
function TogglePasswordVisible() {
|
||||
if (!showingPasswords && !ConfirmShowPasswords())
|
||||
return;
|
||||
|
||||
showingPasswords = !showingPasswords;
|
||||
document.getElementById("togglePasswords").label = kSignonBundle.getString(showingPasswords ? "hidePasswords" : "showPasswords");
|
||||
document.getElementById("passwordCol").hidden = !showingPasswords;
|
||||
}
|
||||
|
||||
function AskUserShowPasswords() {
|
||||
var prompter = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
|
||||
var dummy = { value: false };
|
||||
|
||||
// Confirm the user wants to display passwords
|
||||
return prompter.confirmEx(window,
|
||||
null,
|
||||
kSignonBundle.getString("noMasterPasswordPrompt"),
|
||||
prompter.BUTTON_TITLE_YES * prompter.BUTTON_POS_0 + prompter.BUTTON_TITLE_NO * prompter.BUTTON_POS_1,
|
||||
null, null, null, null, dummy) == 0; // 0=="Yes" button
|
||||
}
|
||||
|
||||
function ConfirmShowPasswords() {
|
||||
// This doesn't harm if passwords are not encrypted
|
||||
var tokendb = Components.classes["@mozilla.org/security/pk11tokendb;1"]
|
||||
.createInstance(Components.interfaces.nsIPK11TokenDB);
|
||||
var token = tokendb.getInternalKeyToken();
|
||||
|
||||
// If there is no master password, still give the user a chance to opt-out of displaying passwords
|
||||
if (token.checkPassword(""))
|
||||
return AskUserShowPasswords();
|
||||
|
||||
// So there's a master password. But since checkPassword didn't succeed, we're logged out (per nsIPK11Token.idl).
|
||||
try {
|
||||
// Relogin and ask for the master password.
|
||||
token.login(true); // 'true' means always prompt for token password. User will be prompted until
|
||||
// clicking 'Cancel' or entering the correct password.
|
||||
} catch (e) {
|
||||
// An exception will be thrown if the user cancels the login prompt dialog.
|
||||
// User is also logged out of Software Security Device.
|
||||
}
|
||||
|
||||
return token.isLoggedIn();
|
||||
}
|
||||
|
||||
function FinalizeSignonDeletions() {
|
||||
for (var s=0; s<deletedSignons.length; s++) {
|
||||
passwordmanager.removeUser(deletedSignons[s].host, deletedSignons[s].rawuser);
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
persist="screenX screenY width height">
|
||||
|
||||
<script src="chrome://passwordmgr/content/passwordManager.js"/>
|
||||
<script src="chrome://global/content/strres.js"/>
|
||||
|
||||
<stringbundle id="signonBundle"
|
||||
src="chrome://passwordmgr/locale/passwordmgr.properties"/>
|
||||
|
@ -58,6 +57,10 @@
|
|||
<splitter class="tree-splitter"/>
|
||||
<treecol id="userCol" label="&treehead.username.label;" flex="2"
|
||||
onclick="SignonColumnSort('user');" persist="width"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="passwordCol" label="&treehead.password.label;" flex="2"
|
||||
onclick="SignonColumnSort('password');" persist="width"
|
||||
hidden="true"/>
|
||||
</treecols>
|
||||
<treechildren/>
|
||||
</tree>
|
||||
|
@ -68,6 +71,9 @@
|
|||
<button id="removeAllSignons"
|
||||
label="&removeall.label;"
|
||||
oncommand="DeleteAllSignons();"/>
|
||||
<spacer flex="1"/>
|
||||
<button id="togglePasswords"
|
||||
oncommand="TogglePasswordVisible();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
<!-- rejected signon sites -->
|
||||
|
|
Загрузка…
Ссылка в новой задаче