# -*- 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 # Ehsan Akhgari # Ronny Perinke # # 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 ***** /*** =================== SAVED SIGNONS CODE =================== ***/ var kSignonBundle; function SignonsStartup() { kSignonBundle = document.getElementById("signonBundle"); document.getElementById("togglePasswords").label = kSignonBundle.getString("showPasswords"); document.getElementById("togglePasswords").accessKey = kSignonBundle.getString("showPasswordsAccessKey"); document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsSpielAll"); LoadSignons(); // filter the table if requested by caller if (window.arguments && window.arguments[0] && window.arguments[0].filterString) setFilter(window.arguments[0].filterString); FocusFilterBox(); } function setFilter(aFilterString) { document.getElementById("filter").value = aFilterString; _filterPasswords(); } var signonsTreeView = { _filterSet : [], _lastSelectedRanges : [], selection: null, rowCount : 0, setTree : function(tree) {}, getImageSrc : function(row,column) {}, getProgressMode : function(row,column) {}, getCellValue : function(row,column) {}, getCellText : function(row,column) { var signon = this._filterSet.length ? this._filterSet[row] : signons[row]; switch (column.id) { case "siteCol": return signon.httpRealm ? (signon.hostname + " (" + signon.httpRealm + ")"): signon.hostname; case "userCol": return signon.username || ""; case "passwordCol": return signon.password || ""; default: return ""; } }, 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) { if (column.element.getAttribute("id") == "siteCol") prop.AppendElement(kLTRAtom); } }; function LoadSignons() { // loads signons into table try { signons = passwordmanager.getAllLogins(); } catch (e) { signons = []; } signonsTreeView.rowCount = signons.length; // sort and display the table signonsTree.treeBoxObject.view = signonsTreeView; // The sort column didn't change. SortTree (called by // SignonColumnSort) assumes we want to toggle the sort // direction but here we don't so we have to trick it lastSignonSortAscending = !lastSignonSortAscending; SignonColumnSort(lastSignonSortColumn); // 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() { var syncNeeded = (signonsTreeView._filterSet.length != 0); DeleteSelectedItemFromTree(signonsTree, signonsTreeView, signonsTreeView._filterSet.length ? signonsTreeView._filterSet : signons, deletedSignons, "removeSignon", "removeAllSignons"); FinalizeSignonDeletions(syncNeeded); } 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; var syncNeeded = (signonsTreeView._filterSet.length != 0); DeleteAllFromTree(signonsTree, signonsTreeView, signonsTreeView._filterSet.length ? signonsTreeView._filterSet : signons, deletedSignons, "removeSignon", "removeAllSignons"); FinalizeSignonDeletions(syncNeeded); } function TogglePasswordVisible() { if (showingPasswords || ConfirmShowPasswords()) { showingPasswords = !showingPasswords; document.getElementById("togglePasswords").label = kSignonBundle.getString(showingPasswords ? "hidePasswords" : "showPasswords"); document.getElementById("togglePasswords").accessKey = kSignonBundle.getString(showingPasswords ? "hidePasswordsAccessKey" : "showPasswordsAccessKey"); document.getElementById("passwordCol").hidden = !showingPasswords; _filterPasswords(); } // Notify observers that the password visibility toggling is // completed. (Mostly useful for tests) Components.classes["@mozilla.org/observer-service;1"] .getService(Components.interfaces.nsIObserverService) .notifyObservers(null, "passwordmgr-password-toggle-complete", null); } 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.STD_YES_NO_BUTTONS, 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(syncNeeded) { for (var s=0; s 0) signonsTreeView.selection.select(0); document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsSpielFiltered"); } function CopyPassword() { // Copy selected signon's password to clipboard var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"]. getService(Components.interfaces.nsIClipboardHelper); var row = document.getElementById("signonsTree").currentIndex; var password = signonsTreeView.getCellText(row, {id : "passwordCol" }); clipboard.copyString(password); } function UpdateCopyPassword() { var singleSelection = (signonsTreeView.selection.count == 1); var menuitem = document.getElementById("context-copypassword"); if (singleSelection) menuitem.removeAttribute("disabled"); else menuitem.setAttribute("disabled", "true"); }