home *** CD-ROM | disk | FTP | other *** search
/ ftp.swcp.com / ftp.swcp.com.zip / ftp.swcp.com / mac / mozilla-macos9-1.3.1.sea.bin / Mozilla1.3.1 / Chrome / comm.jar / content / communicator / wallet / SignonViewer.js < prev    next >
Text File  |  2003-06-08  |  20KB  |  658 lines

  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  *
  13.  * The Original Code is Mozilla Communicator client code, released March
  14.  * 31, 1998.
  15.  *
  16.  * The Initial Developer of the Original Code is Netscape Communications
  17.  * Corporation. Portions created by Netscape are
  18.  * Copyright (C) 1998 Netscape Communications Corporation. All
  19.  * Rights Reserved.
  20.  *
  21.  * Contributor(s): 
  22.  *   Ben "Count XULula" Goodger
  23.  */
  24.  
  25. /*** =================== INITIALISATION CODE =================== ***/
  26.  
  27. var kObserverService;
  28. var kSignonBundle;
  29. var gSelectUserInUse = false;
  30.  
  31. // interface variables
  32. var signonviewer        = null;
  33. var passwordmanager     = null;
  34.  
  35. // password-manager lists
  36. var signons             = [];
  37. var rejects             = [];
  38. var deletedSignons      = [];
  39. var deletedRejects      = [];
  40.  
  41. // form-manager lists
  42. var nopreviews          = [];
  43. var nocaptures          = [];
  44. var deletedNopreviews   = [];
  45. var deletedNocaptures   = [];
  46.  
  47. // delete the following lines !!!!!
  48. var goneNP              = ""; // nopreview
  49. var goneNC              = ""; // nocapture
  50.  
  51. // differentiate between password manager and form manager
  52. var isPasswordManager = (window.arguments[0] == "S");
  53.  
  54. // variables for encryption
  55. var encrypted = "";
  56.  
  57. function Startup() {
  58.  
  59.   // xpconnect to password manager interfaces
  60.   signonviewer = Components.classes["@mozilla.org/signonviewer/signonviewer-world;1"].createInstance();
  61.   signonviewer = signonviewer.QueryInterface(Components.interfaces.nsISignonViewer);
  62.   passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"].getService();
  63.   passwordmanager = passwordmanager.QueryInterface(Components.interfaces.nsIPasswordManager);
  64.  
  65.   // determine if database is encrypted
  66.   try {
  67.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  68.                      .getService(Components.interfaces.nsIPrefBranch);
  69.     try {
  70.       encrypted = pref.getBoolPref("wallet.crypto");
  71.     } catch(e) {
  72.       dump("wallet.crypto pref is missing from all.js");
  73.     }
  74.  
  75.   } catch (ex) {
  76.     dump("failed to get prefs service!\n");
  77.     pref = null;
  78.   }
  79.  
  80.   // determine whether to run in password-manager mode or form-manager mode
  81.   var tabBox = document.getElementById("tabbox");
  82.   kSignonBundle = document.getElementById("signonBundle");
  83.   var element;
  84.   if (isPasswordManager) {
  85.  
  86.     // be prepared to reload the display if anything changes
  87.     kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  88.     kObserverService.addObserver(signonReloadDisplay, "signonChanged", false);
  89.  
  90.     // be prepared to disable the buttons when selectuser dialog is in use
  91.     kObserverService.addObserver(signonReloadDisplay, "signonSelectUser", false);
  92.  
  93.     signonsTree = document.getElementById("signonsTree");
  94.     rejectsTree = document.getElementById("rejectsTree");
  95.  
  96.     // set initial password-manager tab
  97.     element = document.getElementById("signonsTab");
  98.     tabBox.selectedTab = element;
  99.  
  100.     // hide form-manager tabs
  101.     element = document.getElementById("nopreviewsTab");
  102.     element.hidden = "true";
  103.     element = document.getElementById("nocapturesTab");
  104.     element.hidden = "true"
  105.  
  106.     // load password manager items
  107.     if (!LoadSignons()) {
  108.       return; /* user failed to unlock the database */
  109.     }
  110.     LoadRejects();
  111.  
  112.   } else {
  113.  
  114.     nopreviewsTree = document.getElementById("nopreviewsTree");
  115.     nocapturesTree = document.getElementById("nocapturesTree");
  116.  
  117.     // change title on window
  118.     var wind = document.getElementById("signonviewer");
  119.     wind.setAttribute("title", wind.getAttribute("alttitle"));
  120.  
  121.     // set initial form-manager tab
  122.     element = document.getElementById("nopreviewsTab");
  123.     tabBox.selectedTab = element;
  124.  
  125.     // hide password-manager tabs
  126.     element = document.getElementById("signonsTab");
  127.     element.hidden = "true";
  128.     element = document.getElementById("signonsitesTab");
  129.     element.hidden = "true";
  130.  
  131.     // load form manager items
  132.     LoadNopreview();
  133.     LoadNocapture();
  134.   }
  135.  
  136.   // label the close button
  137.   document.documentElement.getButton("accept").label = kSignonBundle.getString("close");
  138. }
  139.  
  140. function Shutdown() {
  141.   if (isPasswordManager) {
  142.     kObserverService.removeObserver(signonReloadDisplay, "signonChanged");
  143.     kObserverService.removeObserver(signonReloadDisplay, "signonSelectUser");
  144.   }
  145. }
  146.  
  147. var signonReloadDisplay = {
  148.   observe: function(subject, topic, state) {
  149.     if (topic == "signonChanged") {
  150.       if (state == "signons") {
  151.         signons.length = 0;
  152.         if (lastSignonSortColumn == "host") {
  153.           lastSignonSortAscending = !lastSignonSortAscending; // prevents sort from being reversed
  154.         }
  155.         LoadSignons();
  156.       } else if (state == "rejects") {
  157.         rejects.length = 0;
  158.         if (lastRejectSortColumn == "host") {
  159.           lastRejectSortAscending = !lastRejectSortAscending; // prevents sort from being reversed
  160.         }
  161.         LoadRejects();
  162.       } else if (state == "nocaptures") {
  163.         nocaptures.length = 0;
  164.         if (lastNocaptureSortColumn == "host") {
  165.           lastNocaptureSortAscending = !lastNocaptureSortAscending; // prevents sort from being reversed
  166.         }
  167.         LoadNocapture();
  168.       } else if (state == "nopreviews") {
  169.         nopreviews.length = 0;
  170.         if (lastNopreviewSortColumn == "host") {
  171.           lastNopreviewSortAscending = !lastNopreviewSortAscending; // prevents sort from being reversed
  172.         }
  173.         LoadNopreview();
  174.       }
  175.     } else if (topic == "signonSelectUser") {
  176.       if (state == "suspend") {
  177.         gSelectUserInUse = true;
  178.         document.getElementById("removeSignon").disabled = true;
  179.         document.getElementById("removeAllSignons").disabled = true;
  180.       } else if (state == "resume") {
  181.         gSelectUserInUse = false;
  182.         var selections = GetTreeSelections(signonsTree);
  183.         if (selections.length > 0) {
  184.           document.getElementById("removeSignon").disabled = false;
  185.         }
  186.         if (signons.length > 0) {
  187.           document.getElementById("removeAllSignons").disabled = false;
  188.         }
  189.       } else if (state == "inUse") {
  190.         gSelectUserInUse = true;
  191.       }
  192.     }
  193.   }
  194. }
  195.  
  196. /*** =================== SAVED SIGNONS CODE =================== ***/
  197.  
  198. var signonsTreeView = {
  199.   rowCount : 0,
  200.   setTree : function(tree){},
  201.   getImageSrc : function(row,column) {},
  202.   getProgressMode : function(row,column) {},
  203.   getCellValue : function(row,column) {},
  204.   getCellText : function(row,column){
  205.     var rv="";
  206.     if (column=="siteCol") {
  207.       rv = signons[row].host;
  208.     } else if (column=="userCol") {
  209.       rv = signons[row].user;
  210.     }
  211.     return rv;
  212.   },
  213.   isSeparator : function(index) {return false;},
  214.   isSorted: function() { return false; },
  215.   isContainer : function(index) {return false;},
  216.   cycleHeader : function(aColId, aElt) {},
  217.   getRowProperties : function(row,column,prop){},
  218.   getColumnProperties : function(column,columnElement,prop){},
  219.   getCellProperties : function(row,prop){}
  220.  };
  221. var signonsTree;
  222.  
  223. function Signon(number, host, user, rawuser) {
  224.   this.number = number;
  225.   this.host = host;
  226.   this.user = user;
  227.   this.rawuser = rawuser;
  228. }
  229.  
  230. function LoadSignons() {
  231.   // loads signons into table
  232.   var enumerator = passwordmanager.enumerator;
  233.   var count = 0;
  234.  
  235.   while (enumerator.hasMoreElements()) {
  236.     var nextPassword;
  237.     try {
  238.       nextPassword = enumerator.getNext();
  239.     } catch(e) {
  240.       /* user supplied invalid database key */
  241.       window.close();
  242.       return false;
  243.     }
  244.     nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
  245.     var host = nextPassword.host;
  246.     var user = nextPassword.user;
  247.     var rawuser = user;
  248.  
  249.     // if no username supplied, try to parse it out of the url
  250.     if (user == "") {
  251.       var unused = { };
  252.       var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  253.                     .getService(Components.interfaces.nsIIOService);
  254.       var username;
  255.       try {
  256.         username = ioService.newURI(host, null, null).username;
  257.       } catch(e) {
  258.         username = "";
  259.       }
  260.       if (username != "") {
  261.         user = username;
  262.       } else {
  263.         user = "<>";
  264.       }
  265.     }
  266.  
  267.     if (encrypted) {
  268.       user = kSignonBundle.getFormattedString("encrypted", [user], 1);
  269.     }
  270.  
  271.     signons[count] = new Signon(count++, host, user, rawuser);
  272.   }
  273.   signonsTreeView.rowCount = signons.length;
  274.  
  275.   // sort and display the table
  276.   signonsTree.treeBoxObject.view = signonsTreeView;
  277.   SignonColumnSort('host');
  278.  
  279.   // disable "remove all signons" button if there are no signons
  280.   var element = document.getElementById("removeAllSignons");
  281.   if (signons.length == 0 || gSelectUserInUse) {
  282.     element.setAttribute("disabled","true");
  283.   } else {
  284.     element.removeAttribute("disabled");
  285.   }
  286.  
  287.   return true;
  288. }
  289.  
  290. function SignonSelected() {
  291.   var selections = GetTreeSelections(signonsTree);
  292.   if (selections.length && !gSelectUserInUse) {
  293.     document.getElementById("removeSignon").removeAttribute("disabled");
  294.   }
  295. }
  296.  
  297. function DeleteSignon() {
  298.   DeleteSelectedItemFromTree(signonsTree, signonsTreeView,
  299.                                  signons, deletedSignons,
  300.                                  "removeSignon", "removeAllSignons");
  301.   FinalizeSignonDeletions();
  302. }
  303.  
  304. function DeleteAllSignons() {
  305.   DeleteAllFromTree(signonsTree, signonsTreeView,
  306.                         signons, deletedSignons,
  307.                         "removeSignon", "removeAllSignons");
  308.   FinalizeSignonDeletions();
  309. }
  310.  
  311. function FinalizeSignonDeletions() {
  312.   for (var s=0; s<deletedSignons.length; s++) {
  313.     passwordmanager.removeUser(deletedSignons[s].host, deletedSignons[s].rawuser);
  314.   }
  315.   deletedSignons.length = 0;
  316. }
  317.  
  318. function HandleSignonKeyPress(e) {
  319.   if (e.keyCode == 46) {
  320.     DeleteSignonSelected();
  321.   }
  322. }
  323.  
  324. var lastSignonSortColumn = "";
  325. var lastSignonSortAscending = false;
  326.  
  327. function SignonColumnSort(column) {
  328.   lastSignonSortAscending =
  329.     SortTree(signonsTree, signonsTreeView, signons,
  330.                  column, lastSignonSortColumn, lastSignonSortAscending);
  331.   lastSignonSortColumn = column;
  332. }
  333.  
  334. /*** =================== REJECTED SIGNONS CODE =================== ***/
  335.  
  336. var rejectsTreeView = {
  337.   rowCount : 0,
  338.   setTree : function(tree){},
  339.   getImageSrc : function(row,column) {},
  340.   getProgressMode : function(row,column) {},
  341.   getCellValue : function(row,column) {},
  342.   getCellText : function(row,column){
  343.     var rv="";
  344.     if (column=="rejectCol") {
  345.       rv = rejects[row].host;
  346.     }
  347.     return rv;
  348.   },
  349.   isSeparator : function(index) {return false;},
  350.   isSorted: function() { return false; },
  351.   isContainer : function(index) {return false;},
  352.   cycleHeader : function(aColId, aElt) {},
  353.   getRowProperties : function(row,column,prop){},
  354.   getColumnProperties : function(column,columnElement,prop){},
  355.   getCellProperties : function(row,prop){}
  356.  };
  357. var rejectsTree;
  358.  
  359. function Reject(number, host) {
  360.   this.number = number;
  361.   this.host = host;
  362. }
  363.  
  364. function LoadRejects() {
  365.   var enumerator = passwordmanager.rejectEnumerator;
  366.   var count = 0;
  367.   while (enumerator.hasMoreElements()) {
  368.     var nextReject = enumerator.getNext();
  369.     nextReject = nextReject.QueryInterface(Components.interfaces.nsIPassword);
  370.     var host = nextReject.host;
  371.     rejects[count] = new Reject(count++, host);
  372.   }
  373.   rejectsTreeView.rowCount = rejects.length;
  374.  
  375.   // sort and display the table
  376.   rejectsTree.treeBoxObject.view = rejectsTreeView;
  377.   RejectColumnSort('host');
  378.  
  379.   var element = document.getElementById("removeAllRejects");
  380.   if (rejects.length == 0) {
  381.     element.setAttribute("disabled","true");
  382.   } else {
  383.     element.removeAttribute("disabled");
  384.   }
  385. }
  386.  
  387. function RejectSelected() {
  388.   var selections = GetTreeSelections(rejectsTree);
  389.   if (selections.length) {
  390.     document.getElementById("removeReject").removeAttribute("disabled");
  391.   }
  392. }
  393.  
  394. function DeleteReject() {
  395.   DeleteSelectedItemFromTree(rejectsTree, rejectsTreeView,
  396.                                  rejects, deletedRejects,
  397.                                  "removeReject", "removeAllRejects");
  398.   FinalizeRejectDeletions();
  399. }
  400.  
  401. function DeleteAllRejects() {
  402.   DeleteAllFromTree(rejectsTree, rejectsTreeView,
  403.                         rejects, deletedRejects,
  404.                         "removeReject", "removeAllRejects");
  405.   FinalizeRejectDeletions();
  406. }
  407.  
  408. function FinalizeRejectDeletions() {
  409.   for (var r=0; r<deletedRejects.length; r++) {
  410.     passwordmanager.removeReject(deletedRejects[r].host);
  411.   }
  412.   deletedRejects.length = 0;
  413. }
  414.  
  415. function HandleRejectKeyPress(e) {
  416.   if (e.keyCode == 46) {
  417.     DeleteRejectSelected();
  418.   }
  419. }
  420.  
  421. var lastRejectSortColumn = "";
  422. var lastRejectSortAscending = false;
  423.  
  424. function RejectColumnSort(column) {
  425.   lastRejectSortAscending =
  426.     SortTree(rejectsTree, rejectsTreeView, rejects,
  427.                  column, lastRejectSortColumn, lastRejectSortAscending);
  428.   lastRejectSortColumn = column;
  429. }
  430.  
  431. /*** =================== NO PREVIEW FORMS CODE =================== ***/
  432.  
  433. var nopreviewsTreeView = {
  434.   rowCount : 0,
  435.   setTree : function(tree){},
  436.   getImageSrc : function(row,column) {},
  437.   getProgressMode : function(row,column) {},
  438.   getCellValue : function(row,column) {},
  439.   getCellText : function(row,column){
  440.     var rv="";
  441.     if (column=="nopreviewCol") {
  442.       rv = nopreviews[row].host;
  443.     }
  444.     return rv;
  445.   },
  446.   isSeparator : function(index) {return false;},
  447.   isSorted: function() { return false; },
  448.   isContainer : function(index) {return false;},
  449.   cycleHeader : function(aColId, aElt) {},
  450.   getRowProperties : function(row,column,prop){},
  451.   getColumnProperties : function(column,columnElement,prop){},
  452.   getCellProperties : function(row,prop){}
  453.  };
  454. var nopreviewsTree;
  455.  
  456. function Nopreview(number, host) {
  457.   this.number = number;
  458.   this.host = host;
  459. }
  460.  
  461. function LoadNopreview() {
  462.   var list = signonviewer.getNopreviewValue();
  463.   var count = 0;
  464.   if (list.length > 0) {
  465.     var delim = list[0];
  466.     list = list.split(delim);
  467.   }
  468.   for (var i = 1; i < list.length; i++) {
  469.     var host = TrimString(list[i]);
  470.     nopreviews[count] = new Nopreview(count++, host);
  471.   }
  472.   nopreviewsTreeView.rowCount = nopreviews.length;
  473.  
  474.   // sort and display the table
  475.   nopreviewsTree.treeBoxObject.view = nopreviewsTreeView;
  476.   NopreviewColumnSort('host');
  477.  
  478.   var element = document.getElementById("removeAllNopreviews");
  479.   if (nopreviews.length == 0) {
  480.     element.setAttribute("disabled","true");
  481.   } else {
  482.     element.removeAttribute("disabled");
  483.   }
  484. }
  485.  
  486. function NopreviewSelected() {
  487.   var selections = GetTreeSelections(nopreviewsTree);
  488.   if (selections.length) {
  489.     document.getElementById("removeNopreview").removeAttribute("disabled");
  490.   }
  491. }
  492.  
  493. function DeleteNopreview() {
  494.   DeleteSelectedItemFromTree(nopreviewsTree, nopreviewsTreeView,
  495.                                  nopreviews, deletedNopreviews,
  496.                                  "removeNopreview", "removeAllNopreviews");
  497.   FinalizeNopreviewDeletions();
  498. }
  499.  
  500. function DeleteAllNopreviews() {
  501.   DeleteAllFromTree(nopreviewsTree, nopreviewsTreeView,
  502.                         nopreviews, deletedNopreviews,
  503.                         "removeNopreview", "removeAllNopreviews");
  504.   FinalizeNopreviewDeletions();
  505. }
  506.  
  507. function FinalizeNopreviewDeletions() {
  508.   var i;
  509.   var result = "|goneP|";
  510.   for (i=0; i<deletedNopreviews.length; i++) {
  511.     result += deletedNopreviews[i].number;
  512.     result += ",";
  513.   }
  514.   result += "|";
  515.   signonviewer.setValue(result, window);
  516.   deletedNoPreviews.length = 0;
  517. }
  518.  
  519. function HandleNopreviewKeyPress(e) {
  520.   if (e.keyCode == 46) {
  521.     DeleteNopreviewSelected();
  522.   }
  523. }
  524.  
  525. var lastNopreviewSortColumn = "";
  526. var lastNopreviewSortAscending = false;
  527.  
  528. function NopreviewColumnSort(column) {
  529.   lastNopreviewSortAscending =
  530.     SortTree(nopreviewsTree, nopreviewsTreeView, nopreviews,
  531.                  column, lastNopreviewSortColumn, lastNopreviewSortAscending);
  532.   lastNopreviewSortColumn = column;
  533. }
  534.  
  535. /*** =================== NO CAPTURE FORMS CODE =================== ***/
  536.  
  537.  
  538. var nocapturesTreeView = {
  539.   rowCount : 0,
  540.   setTree : function(tree){},
  541.   getImageSrc : function(row,column) {},
  542.   getProgressMode : function(row,column) {},
  543.   getCellValue : function(row,column) {},
  544.   getCellText : function(row,column){
  545.     var rv="";
  546.     if (column=="nocaptureCol") {
  547.       rv = nocaptures[row].host;
  548.     }
  549.     return rv;
  550.   },
  551.   isSeparator : function(index) {return false;},
  552.   isSorted: function() { return false; },
  553.   isContainer : function(index) {return false;},
  554.   cycleHeader : function(aColId, aElt) {},
  555.   getRowProperties : function(row,column,prop){},
  556.   getColumnProperties : function(column,columnElement,prop){},
  557.   getCellProperties : function(row,prop){}
  558.  };
  559. var nocapturesTree;
  560.  
  561. function Nocapture(number, host) {
  562.   this.number = number;
  563.   this.host = host;
  564. }
  565.  
  566. function LoadNocapture() {
  567.   var list = signonviewer.getNocaptureValue();
  568.   var count = 0;
  569.   if (list.length > 0) {
  570.     var delim = list[0];
  571.     list = list.split(delim);
  572.   }
  573.   for (var i = 1; i < list.length; i++) {
  574.     var host = TrimString(list[i]);
  575.     nocaptures[count] = new Nocapture(count++, host);
  576.   }
  577.   nocapturesTreeView.rowCount = nocaptures.length;
  578.  
  579.   // sort and display the table
  580.   nocapturesTree.treeBoxObject.view = nocapturesTreeView;
  581.   NocaptureColumnSort('host');
  582.  
  583.   var element = document.getElementById("removeAllNocaptures");
  584.   if (nocaptures.length == 0) {
  585.     element.setAttribute("disabled","true");
  586.   } else {
  587.     element.removeAttribute("disabled");
  588.   }
  589. }
  590.  
  591. function NocaptureSelected() {
  592.   var selections = GetTreeSelections(nocapturesTree);
  593.   if (selections.length) {
  594.     document.getElementById("removeNocapture").removeAttribute("disabled");
  595.   }
  596. }
  597.  
  598. function DeleteNocapture() {
  599.   DeleteSelectedItemFromTree(nocapturesTree, nocapturesTreeView,
  600.                                  nocaptures, deletedNocaptures,
  601.                                  "removeNocapture", "removeAllNocaptures");
  602.   FinalizeNocaptureDeletions();
  603. }
  604.  
  605. function DeleteAllNocaptures() {
  606.   DeleteAllFromTree(nocapturesTree, nocapturesTreeView,
  607.                         nocaptures, deletedNocaptures,
  608.                         "removeNocapture", "removeAllNocaptures");
  609.   FinalizeNocaptureDeletions();
  610. }
  611.  
  612. function FinalizeNocaptureDeletions() {
  613.   var i;
  614.   var result = "|goneC|";
  615.   for (i=0; i<deletedNocaptures.length; i++) {
  616.     result += deletedNocaptures[i].number;
  617.     result += ",";
  618.   }
  619.   result += "|";
  620.   signonviewer.setValue(result, window);
  621.   deletedNoCaptures.length = 0;
  622. }
  623.  
  624. function HandleNocaptureKeyPress(e) {
  625.   if (e.keyCode == 46) {
  626.     DeleteNocaptureSelected();
  627.   }
  628. }
  629.  
  630. var lastNocaptureSortColumn = "";
  631. var lastNocaptureSortAscending = false;
  632.  
  633. function NocaptureColumnSort(column) {
  634.   lastNocaptureSortAscending =
  635.     SortTree(nocapturesTree, nocapturesTreeView, nocaptures,
  636.                  column, lastNocaptureSortColumn, lastNocaptureSortAscending);
  637.   lastNocaptureSortColumn = column;
  638. }
  639.  
  640. /*** =================== GENERAL CODE =================== ***/
  641.  
  642. // Remove whitespace from both ends of a string
  643. function TrimString(string)
  644. {
  645.   if (!string) {
  646.     return "";
  647.   }
  648.   return string.replace(/(^\s+)|(\s+$)/g, '')
  649. }
  650.  
  651. function doHelpButton() {
  652.   if (isPasswordManager) {
  653.      openHelp("password_mgr");
  654.   } else {
  655.      openHelp("forms_sites");
  656.   }
  657. }
  658.