?? viewpasswords.js
字號:
# -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-## ***** 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 "License"); you may not use this file except in compliance with# the License. You may obtain a copy of the License at# http://www.mozilla.org/MPL/## Software distributed under the License is distributed on an "AS IS" basis,# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License# for the specific language governing rights and limitations under the# License.## The Original Code is Mozilla Communicator client code, released# March 31, 1998.## The Initial Developer of the Original Code is# Netscape Communications Corporation.# Portions created by the Initial Developer are Copyright (C) 1998# the Initial Developer. All Rights Reserved.## Contributor(s):# Ben "Count XULula" Goodger# Brian Ryner <bryner@brianryner.com>## 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 *****/*** =================== INITIALISATION CODE =================== ***/var kObserverService;var kSignonBundle;var gSelectUserInUse = false;// interface variablesvar passwordmanager = null;// password-manager listsvar signons = [];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); kSignonBundle = document.getElementById("signonBundle"); // be prepared to reload the display if anything changes kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); kObserverService.addObserver(signonReloadDisplay, "signonChanged", false); // be prepared to disable the buttons when selectuser dialog is in use kObserverService.addObserver(signonReloadDisplay, "signonSelectUser", false); signonsTree = document.getElementById("signonsTree"); rejectsTree = document.getElementById("rejectsTree"); // set initial password-manager tab 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();}function Shutdown() { kObserverService.removeObserver(signonReloadDisplay, "signonChanged"); kObserverService.removeObserver(signonReloadDisplay, "signonSelectUser");}var signonReloadDisplay = { observe: function(subject, topic, state) { if (topic == "signonChanged") { if (state == "signons") { signons.length = 0; if (lastSignonSortColumn == "host") { lastSignonSortAscending = !lastSignonSortAscending; // prevents sort from being reversed } LoadSignons(); } else if (state == "rejects") { rejects.length = 0; if (lastRejectSortColumn == "host") { lastRejectSortAscending = !lastRejectSortAscending; // prevents sort from being reversed } LoadRejects(); } } else if (topic == "signonSelectUser") { if (state == "suspend") { 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); if (selections.length > 0) { document.getElementById("removeSignon").disabled = false; } if (signons.length > 0) { document.getElementById("removeAllSignons").disabled = false; document.getElementById("togglePasswords").disabled = false; } } else if (state == "inUse") { gSelectUserInUse = true; } } }}/*** =================== SAVED SIGNONS CODE =================== ***/var signonsTreeView = { rowCount : 0, setTree : function(tree) {}, getImageSrc : function(row,column) {}, getProgressMode : function(row,column) {}, getCellValue : 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; }, cycleHeader : function(column) {}, getRowProperties : function(row,prop) {}, getColumnProperties : function(column,prop) {}, getCellProperties : function(row,column,prop) {} };var signonsTree;function Signon(number, host, user, rawuser, password) { this.number = number; this.host = host; this.user = user; this.rawuser = rawuser; this.password = password;}function LoadSignons() { // loads signons into table var enumerator = passwordmanager.enumerator; var count = 0; while (enumerator.hasMoreElements()) { var nextPassword; try { nextPassword = enumerator.getNext(); } catch(e) { /* user supplied invalid database key */ window.close(); return false; } nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword); var host = nextPassword.host; var user; var password; // try/catch in case decryption fails (invalid signon entry) try { user = nextPassword.user; password = nextPassword.password; } catch (e) { // hide this entry dump("could not decrypt user/password for host " + host + "\n"); continue; } var rawuser = user; // if no username supplied, try to parse it out of the url if (user == "") { var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); try { user = ioService.newURI(host, null, null).username; if (user == "") { user = kSignonBundle.getString('noUserNameForPassword'); } } catch(e) { user = kSignonBundle.getString('noUserNameForPassword'); } } signons[count] = new Signon(count++, host, user, rawuser, password); } signonsTreeView.rowCount = signons.length; // sort and display the table signonsTree.treeBoxObject.view = signonsTreeView; SignonColumnSort('host'); // 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;}function SignonSelected() { var selections = GetTreeSelections(signonsTree); if (selections.length && !gSelectUserInUse) { document.getElementById("removeSignon").removeAttribute("disabled"); }}function DeleteSignon() { DeleteSelectedItemFromTree(signonsTree, signonsTreeView, signons, deletedSignons, "removeSignon", "removeAllSignons"); FinalizeSignonDeletions();}function DeleteAllSignons() { var prompter = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
// Confirm the user wants to remove all passwords
var dummy = { value: false };
if (prompter.confirmEx(window,
kSignonBundle.getString("removeAllPasswordsTitle"),
kSignonBundle.getString("removeAllPasswordsPrompt"),
prompter.STD_YES_NO_BUTTONS + prompter.BUTTON_POS_1_DEFAULT,
null, null, null, null, dummy) == 1) // 1 == "No" button
return; DeleteAllFromTree(signonsTree, signonsTreeView, signons, deletedSignons, "removeSignon", "removeAllSignons"); 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 try { if (token.checkPassword("")) return AskUserShowPasswords(); } catch (ex) { // for some reason the call to checkPassword throws an exception for users who have never set a master // password before. 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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -