home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December / PCWorld_2005-12_cd.bin / komunikace / netscape / nsb-install-8-0.exe / chrome / browser.jar / content / browser / passcardUtils.js < prev    next >
Text File  |  2005-09-26  |  30KB  |  1,026 lines

  1. /*
  2. PasscardUtils
  3. Initial refactoring of code from browser.js: JMckenty
  4. */
  5.  
  6. var kDefaultPasscard = "DefaultPasscard";
  7.  
  8. var gPasscardMgr = null;
  9.  
  10. function passcardUtilsInit()
  11. {
  12.     gPasscardMgr = Components.classes["@mozilla.org/passwordmanager;1"]
  13.                              .getService(Components.interfaces.nsIPasswordManager);
  14. }
  15.  
  16. function passcardDebug(aStr)
  17. {
  18.     if (gPrefService.getPrefType("passcard.debug") &&
  19.         gPrefService.getBoolPref("passcard.debug"))
  20.     {
  21.         dump('PASSCARD: '+aStr+'\n');
  22.     }
  23. }
  24.  
  25. function PasscardBlacklistSite()
  26. {
  27.     gPasscardMgr.addReject(gBrowser.currentURI.host);
  28. }
  29.  
  30. function PasscardIsSiteBlacklisted(aURI)
  31. {
  32.     if (!aURI) return false;
  33.     if (!(aURI.scheme == 'http' || aURI.scheme == 'https'))
  34.         return false;
  35.  
  36.     var dotTestHost = '.'+aURI.host.toLowerCase();
  37.  
  38.     var enumerator = gPasscardMgr.rejectEnumerator;
  39.     while (enumerator.hasMoreElements()) {
  40.         var nextReject = enumerator.getNext();
  41.         nextReject.QueryInterface(Components.interfaces.nsIPassword);
  42.         var dotRejectHost = '.'+nextReject.host.toLowerCase();
  43.         var idx = dotTestHost.indexOf(dotRejectHost);
  44.         if (idx == -1) continue;
  45.         var tmp = dotTestHost.substring(idx);
  46.         if (tmp == dotRejectHost) return true;
  47.     }
  48.     return false;
  49. }
  50.  
  51. function SetAsPasscardDefault(menulist)
  52. {
  53.     passcardDebug('passcard uniqueID: ' + menulist.selectedItem.value);
  54.  
  55.     var realm = new Object();
  56.     gPasscardMgr.getDomain(gBrowser.currentURI, realm);
  57.     passcardDebug('SetAsPasscardDefault(): realm: ' + realm.value);
  58.     gPasscardMgr.setAsLastUsedSignon(realm.value, menulist.selectedItem.value);
  59.  
  60.     // update the passcard button label on the toolbar
  61.     SetPasscard();
  62.  
  63.     /* used for testing
  64.     dump('***Passcard URI: ' + gBrowser.currentURI.host + '\n');
  65.     var enumerator = passwordManager.enumerator;
  66.     while (enumerator.hasMoreElements()) {
  67.         var nextPassword = enumerator.getNext();
  68.         nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
  69.         dump("***Passcard -- passcard: " + nextPassword.passcard +
  70.                     " uniqueID: " + nextPassword.uniqueID + " lastUsed: " + nextPassword.lastUsed + "\n");
  71.     }
  72.     */
  73. }
  74.  
  75. // MERC - JCH: Fix for BLT#161274. If notification bar "Don't Show Again" checkbox
  76. // is checked, hide the notification bar whenever passcard detects the site.
  77. function SetDoNotShowPasscardMessageBar(list,checkbox)
  78. {
  79.     if (gPasscardMgr == null)
  80.         return;
  81.  
  82.     const DONT_SHOW_NOTIFICATION_BAR = 3;
  83.     const SHOW_NOTIFICATION_BAR = 0;
  84.  
  85.     var currentURI = getWebNavigation().currentURI;
  86.  
  87.     // realm is the base domain
  88.     var realm = new Object();
  89.     gPasscardMgr.getDomain(currentURI, realm);
  90.  
  91.     var passcard = GetPasscard(realm.value, list.label);
  92.     var newval;
  93.  
  94.     if (checkbox.checked) {
  95.         newval = DONT_SHOW_NOTIFICATION_BAR;
  96.     } else {
  97.         newval = SHOW_NOTIFICATION_BAR;
  98.     }
  99.  
  100.     // Update passcard data.
  101.     gPasscardMgr.updateSignon(passcard.host, passcard.passcard, passcard.user, passcard.password,
  102.                               newval, passcard.protect, passcard.lastUsed, 
  103.                               passcard.uniqueID, passcard.advancedFields);
  104.  
  105.  
  106.  
  107. }
  108.  
  109. function isPasscardHighlight()
  110. {
  111.     if (passcardPreferences('Highlight') != "0")
  112.         return true;
  113.     return false;
  114. }
  115.  
  116. function openSelectedPasscard(menulist) {
  117.     //var menulist = document.getElementById('messagePasscardList');
  118.     var passcardName = menulist.selectedItem.getAttribute('label');
  119.     gPrefService.setCharPref('browser.passcard.selectedcard', passcardName);
  120.     openPasscardPrefs();
  121. }
  122.  
  123. // MERC - JCH : need to select the proper tab when pref dialog opens
  124. function openPasscardPrefs() {
  125.     gPrefService.setCharPref('browser.preferences.formfillORpasscard', 'passcardtab');
  126.     openPrefs(5);
  127. }
  128.  
  129. // MERC JVL
  130. // Save the current fields on the form as a passcard
  131. function savePasscard() {
  132.     var hpDoc = getTridentDocument();
  133.     if (hpDoc) {
  134.         // fire Trident side
  135.         passcardDebug('********* SavePasscard via Trident **********');
  136.         hpDoc.savePasscard();
  137.     }
  138.     else
  139.     {
  140.         // fire Gecko side
  141.         passcardDebug('********* SavePasscard via Gecko **********');
  142.         gPasscardMgr.savePasscard(gBrowser.contentDocument);
  143.     }
  144. }
  145.  
  146.  
  147. // delete the old passcard menu items
  148. function clearPasscardMenu() {
  149.     var menu = document.getElementById('combinedFormFillPopup');
  150.     if (!menu) return;
  151.     var pcSep = document.getElementById('combinedFormFillPasscardSep');
  152.     pcSep.setAttribute('hidden', 'true');
  153.     var child = menu.lastChild;
  154.     while (child) {
  155.         nextChild = child.previousSibling;
  156.         if (child.hasAttribute('passcard')) {
  157.             menu.removeChild(child);
  158.         }
  159.         child = nextChild;
  160.     }
  161. }
  162.  
  163.  
  164. function GetWebmailPasscard(domain, key)
  165. {
  166.     if (!domain || domain == '') return null;
  167.     passcardDebug('GetWebmailPasscard('+domain+', '+key+')');
  168.     var enumerator = gPasscardMgr.enumerator;
  169.     while (enumerator.hasMoreElements()) {
  170.         var nextPasscard = enumerator.getNext();
  171.         nextPasscard = nextPasscard.QueryInterface(Components.interfaces.nsIPassword);
  172.         if ((domain == nextPasscard.host) && (nextPasscard.passcard == key)) {
  173.             return nextPasscard;
  174.         }
  175.     }
  176.     return null;
  177. }
  178.  
  179.  
  180. function GetDefaultPasscard()
  181. {
  182.     return GetPasscard('DefaultPasscard', 'DefaultPasscard');
  183. }
  184.  
  185.  
  186. function GetPasscard(domain, key)
  187. {
  188.     if (!domain || domain == '') return null;
  189.     passcardDebug('GetPasscard('+domain+', '+key+')');
  190.     var enumerator = gPasscardMgr.enumerator;
  191.     while (enumerator.hasMoreElements()) {
  192.         var nextPasscard = enumerator.getNext();
  193.         nextPasscard = nextPasscard.QueryInterface(Components.interfaces.nsIPassword);
  194.         if ((domain == nextPasscard.host) && (nextPasscard.passcard == key)) {
  195.             return nextPasscard;
  196.         }
  197.     }
  198.     return null;
  199. }
  200.  
  201.  
  202. function GetFirstPasscardForSite(domain)
  203. {
  204.     if (!domain || domain == '') return null;
  205.     passcardDebug('GetPasscard('+domain+')');
  206.     var enumerator = gPasscardMgr.enumerator;
  207.     while (enumerator.hasMoreElements()) {
  208.         var nextPasscard = enumerator.getNext();
  209.         nextPasscard = nextPasscard.QueryInterface(Components.interfaces.nsIPassword);
  210.         if ((domain == nextPasscard.host)) {
  211.             return nextPasscard;
  212.         }
  213.     }
  214.     return null;
  215. }
  216.  
  217.  
  218. // MERC (DP): get a list of passcards for URL
  219. // MERC - JCH: Changing menu ids for new combined datacard-passcard button.
  220. function updatePasscardMenu(menu) {
  221.     // keep track of number of passcards found for the specific realm
  222.     var passcardCount = 0;
  223.  
  224.     var foundSitePasscards = false;
  225.     var addDefaultPasscard = false;
  226.     var defaultName = "";
  227.     var defaultUniqueID = -1;
  228.  
  229.     var currentURI = getWebNavigation().currentURI;
  230.  
  231.     try {
  232.         // realm is the base domain
  233.         var realm = new Object();
  234.         gPasscardMgr.getDomain(currentURI, realm);
  235.         passcardDebug('***Passcard -- realm: ' + realm.value);
  236.         var enumerator = gPasscardMgr.enumerator;
  237.         while (enumerator.hasMoreElements()) {
  238.             var nextPasscard = enumerator.getNext();
  239.             nextPasscard = nextPasscard.QueryInterface(Components.interfaces.nsIPassword);
  240.  
  241.             var host = nextPasscard.host;
  242.             passcardDebug("***Passcard -- host: " + host);
  243.             if (realm.value && realm.value == host) {
  244.                 var uniqueID = nextPasscard.uniqueID;
  245.                 var passcard = nextPasscard.passcard;
  246.                 var lastUsed = nextPasscard.lastUsed;
  247.                 passcardDebug("***Passcard -- passcard: " + passcard +
  248.                                             " uniqueID: " + uniqueID + " lastUsed: " + lastUsed);
  249.  
  250.                 /* // if this is the first passcard menu item, put a menu separator before
  251.                 var menuitem;
  252.                 if (passcardCount == 0) {
  253.                     menuitem = document.createElement("menuseparator");
  254.                     menu.appendChild(menuitem);
  255.                 } */
  256.  
  257.                 // create a new menuitem to add to the dropdown list
  258.                 menuitem = document.createElement("menuitem");
  259.                 menuitem.setAttribute('label', passcard);
  260.                 menuitem.setAttribute('host', host);
  261.                 menuitem.setAttribute('uniqueID', uniqueID);
  262.                 menuitem.setAttribute('lastUsed', lastUsed);
  263.                 menuitem.setAttribute('type', 'checkbox');
  264.                 menuitem.setAttribute('passcard', 'true');
  265.                 //menuitem.setAttribute('tooltiptext', 'UserID: ' + user);
  266.                 menuitem.setAttribute('oncommand', 'setPasscardDefault(this);');
  267.  
  268.                 // find the default passcard for site
  269.                 if (eval(lastUsed)) {
  270.                     menuitem.setAttribute('checked', 'true');
  271.                 } else {
  272.                     menuitem.setAttribute('checked', 'false');
  273.                 }
  274.                 menu.appendChild(menuitem);
  275.                 passcardCount++;
  276.                 foundSitePasscards = true;
  277.             }
  278.             else if (kDefaultPasscard == host) {
  279.                 defaultName = nextPasscard.passcard;
  280.                 defaultUniqueID = nextPasscard.uniqueID;
  281.  
  282.                 // if it is protected, we will assume that the user has a valid Default Passcard
  283.                 addDefaultPasscard = IsProtectedAndPopulatedPasscard(nextPasscard);
  284.             }
  285.         } // while
  286.     } catch(e) {}
  287.  
  288.     // Toggle visibility of menu separator, depending on whether
  289.     // passcards were listed
  290.     var pcSep = document.getElementById('combinedFormFillPasscardSep');
  291.     if (pcSep && foundSitePasscards) {
  292.         pcSep.removeAttribute('hidden');
  293.     } else {
  294.         pcSep.setAttribute('hidden', 'true');
  295.     }
  296.  
  297.     if (addDefaultPasscard && !foundSitePasscards &&
  298.             defaultName.length > 0 &&    defaultUniqueID != -1)
  299.     {
  300.         dump("***Default Passcard -- passcard: " + defaultName +    " uniqueID: " + defaultUniqueID + "\n");
  301.  
  302.         // add a menu separator before
  303.         //menu.appendChild(document.createElement("menuseparator"));
  304.         pcSep.removeAttribute('hidden');
  305.  
  306.         // create a new menuitem to add to the dropdown list
  307.         var menuitem = document.createElement("menuitem");
  308.         menuitem.setAttribute('label', defaultName);
  309.         menuitem.setAttribute('host', kDefaultPasscard);
  310.         menuitem.setAttribute('uniqueID', defaultUniqueID);
  311.         menuitem.setAttribute('lastUsed', '1');
  312.         menuitem.setAttribute('type', 'checkbox');
  313.         //menuitem.setAttribute('tooltiptext', 'UserID: ' + user);
  314.         menuitem.setAttribute('oncommand', 'setPasscardDefault(this);');
  315.         menuitem.setAttribute('checked', 'true');
  316.         menuitem.setAttribute('passcard', 'true');
  317.         menu.appendChild(menuitem);
  318.         passcardCount++;
  319.     }
  320.  
  321.     // if there are no passcards found, disable fill menu item
  322.     var fillItem = document.getElementById('combinedFillFormMenuItem');
  323.     var fillSubmitItem = document.getElementById('combinedFillAndSubmitMenuItem');
  324.     if (passcardCount > 0) {
  325.         fillItem.removeAttribute('disabled');
  326.         fillSubmitItem.removeAttribute('disabled');
  327.     } else {
  328.         fillItem.setAttribute('disabled', 'true');
  329.         fillSubmitItem.setAttribute('disabled', 'true');
  330.     }
  331.  
  332.     // MERC JVL
  333.     // if there are no password fields (HTML INPUT type fields)
  334.     // on the form, disable the Save Passcard menu item
  335.     // var savePasscardMenuItem = document.getElementById('savePasscardMenuItem');
  336.     var savePasscardMenuItem = document.getElementById('combinedSaveMenuItem');
  337.     if (CheckIsPasscardable(false) && !PasscardIsSiteBlacklisted(currentURI))
  338.     {
  339.         passcardDebug(' - enabling save');
  340.         savePasscardMenuItem.removeAttribute('disabled');
  341.     }
  342.     else
  343.     {
  344.         passcardDebug(' - disabling save');
  345.         savePasscardMenuItem.setAttribute('disabled', 'true');
  346.     }
  347. }
  348.  
  349. // MERC JVL
  350. // helper function to check of a passcard is protected and has a username/password
  351. function IsProtectedAndPopulatedPasscard(passcard)
  352. {
  353.     // if it is protected, we will assume that the user has a populated Passcard
  354.     if (passcard.protect == 0 &&
  355.         (passcard.user.length < 1 || passcard.password.length < 1))
  356.     {
  357.         return false;
  358.     }
  359.  
  360.     return true;
  361. }
  362.  
  363. // MERC JVL
  364. // helper function to check if a passcard can be
  365. // applied to the form, regardless of engine
  366. function CheckIsPasscardable(bIgnoreValue)
  367. {
  368.     var bIsPasscardable = false;
  369.  
  370.     var hpDoc = getTridentDocument();
  371.     if (hpDoc)
  372.     {
  373.         // fire Trident side
  374.         bIsPasscardable = hpDoc.isPasscardable(bIgnoreValue);
  375.     }
  376.     else
  377.     {
  378.         // fire Gecko side
  379.         bIsPasscardable = IsPasscardable(gBrowser.contentDocument, bIgnoreValue);
  380.     }
  381.  
  382.     return bIsPasscardable;
  383. }
  384.  
  385. // TODO JVL : Would be useful in XPCom - move functionality to XPCom when there's a chance to do so
  386. // MERC JVL
  387. // Checks current document and its 'frame' ('iframe' and 'object' as well) for a
  388. // potential Passcard (looks for documents with only one password field and not two)
  389. // RECURSIVE!!!
  390. const NO_PASSWORD_FIELD = 0;
  391. const FOUND_A_PASSCARD = 1;
  392. const NOT_A_PASSCARD = 2;
  393. function IsPasscardable(doc, bIgnoreValue)
  394. {
  395.     if (!doc)
  396.         return false;
  397.  
  398.     var inputTextElement = null;
  399.     var isPasscard = NO_PASSWORD_FIELD;
  400.     var idx = 0;
  401.     var inputElements = doc.getElementsByTagName('input');
  402.     while (isPasscard != NOT_A_PASSCARD && idx < inputElements.length)
  403.     {
  404.         var inputElement = inputElements.item(idx);
  405.         if (inputElement != null)
  406.         {
  407.             var elementType = inputElement.getAttribute('type');
  408.             if (elementType == 'text' || elementType == null)
  409.             {
  410.                 // found a text field, may be the username field,
  411.                 // store reference to object for later use
  412.                 inputTextElement = inputElement;
  413.             }
  414.             else if (elementType == 'password')
  415.             {
  416.                 // if we encountered a second password field,
  417.                 // this form is probably not passcardable, bail
  418.                 if (isPasscard == FOUND_A_PASSCARD)
  419.                 {
  420.                     isPasscard = NOT_A_PASSCARD;
  421.                 }
  422.                 else if (isPasscard == NO_PASSWORD_FIELD)
  423.                 {
  424.                     // look for a set of username/password fields
  425.                     if (inputElement.value != "" || bIgnoreValue)
  426.                     {
  427.                         if (inputTextElement != null)
  428.                         {
  429.                             if (inputTextElement.value != "" || bIgnoreValue)
  430.                             {
  431.                                 // found a set of username/password fields
  432.                                 isPasscard = FOUND_A_PASSCARD;
  433.                             }
  434.                         }
  435.                         // TODO JVL - Added to handle static username input text field case
  436.                         else
  437.                         {
  438.                             isPasscard = FOUND_A_PASSCARD;
  439.                         }
  440.                     }
  441.                 }
  442.             }
  443.         }
  444.  
  445.         idx++;
  446.     }
  447.  
  448.     // haven't found a password field in this frame, check child frames
  449.     if (isPasscard == NO_PASSWORD_FIELD)
  450.     {
  451.         isPasscard = IsPasscardInFrames(doc, 'iframe', bIgnoreValue);
  452.         if (isPasscard == NO_PASSWORD_FIELD)
  453.             isPasscard = IsPasscardInFrames(doc, 'frame', bIgnoreValue);
  454.         if (isPasscard == NO_PASSWORD_FIELD)
  455.             isPasscard = IsPasscardInFrames(doc, 'object', bIgnoreValue);
  456.     }
  457.  
  458.     return isPasscard == FOUND_A_PASSCARD;
  459. }
  460.  
  461. // MERC JVL
  462. // Checks for a passcard in a 'frame' document ('iframe' and 'object' as well)
  463. // RECURSIVE!!!
  464. function IsPasscardInFrames(doc, elementName, bIgnoreValue)
  465. {
  466.     var isPasscard = NO_PASSWORD_FIELD;
  467.     var iframeElements = doc.getElementsByTagName(elementName);
  468.     var idx = 0; // JMC: Bad strict, should not redeclare
  469.     while (isPasscard == NO_PASSWORD_FIELD && idx < iframeElements.length)
  470.     {
  471.         var iframeElement = iframeElements.item(idx);
  472.         if (iframeElement)
  473.         {
  474.             if (IsPasscardable(iframeElement.contentDocument, bIgnoreValue))
  475.                 isPasscard = FOUND_A_PASSCARD;
  476.         }
  477.  
  478.         idx++;
  479.     }
  480.  
  481.     return isPasscard;
  482. }
  483.  
  484. function passcardAllowHost(aHost)
  485. {
  486.     // showStack();
  487.     passcardDebug(" is " + aHost + " an allowed passcard host?");
  488.     var enumerator = gPasscardMgr.rejectEnumerator;
  489.     while (enumerator.hasMoreElements())
  490.     {
  491.         var nextReject = enumerator.getNext();
  492.         nextReject = nextReject.QueryInterface(Components.interfaces.nsIPassword);
  493.         if (nextReject.host == aHost)
  494.         {
  495.             passcardDebug("It's a reject");
  496.             return false;
  497.         }
  498.     }
  499.  
  500.     if (gOptout.isInList(aHost))
  501.     {
  502.         passcardDebug("It's an Optout");
  503.         return false;
  504.     }
  505.  
  506.     return true;
  507. }
  508.  
  509. // MERC - JCH: Check if the page has a password field.
  510. // If so, alert the user with notification bar.
  511. function CheckForPasscardField()
  512. {
  513.     // realm is the base domain
  514.     var realm = new Object();
  515.     if (gBrowser.currentURI && (gBrowser.currentURI.schemeIs("http") ||
  516.                                 gBrowser.currentURI.schemeIs("https")) )
  517.     {
  518.         var passcardMgrInternal = Components.classes["@mozilla.org/passwordmanager;1"]
  519.                                             .getService(Components.interfaces.nsIPasswordManagerInternal);
  520.         if (!passcardMgrInternal)
  521.             return false;
  522.  
  523.         passcardDebug('uri (as a spec): ' + gBrowser.currentURI.spec);
  524.         passcardMgrInternal.ParseRealm(gBrowser.currentURI, realm, true, false);
  525.         passcardDebug('realm: ' + realm.value);
  526.         if (realm.value == null)
  527.             return false;
  528.     } else {
  529.         return false;
  530.     }
  531.  
  532.     if (!passcardAllowHost(realm.value))
  533.     {
  534.         return false;
  535.     }
  536.  
  537.     var bFoundPasscard = false;
  538.     var bShowNotification = false;
  539.  
  540.   try {
  541.     // now check if the passcard is set to prompt
  542.     enumerator = gPasscardMgr.enumerator;
  543.     while (!bFoundPasscard && enumerator.hasMoreElements())
  544.     {
  545.       var nextPasscard = enumerator.getNext();
  546.       nextPasscard = nextPasscard.QueryInterface(Components.interfaces.nsIPassword);
  547.       if (nextPasscard.host == realm.value &&
  548.           nextPasscard.lastUsed == 1)
  549.       {
  550.  
  551.                 bFoundPasscard = true;
  552.                 bShowNotification = nextPasscard.autologin == 0 &&                                    // display prompt
  553.                                                         IsProtectedAndPopulatedPasscard(nextPasscard);
  554.       }
  555.     }
  556.   } catch (ex) { }
  557.  
  558.     if (!bFoundPasscard)
  559.     {
  560.         bShowNotification = IsDisplayBrowserBarForDefaultPasscard();
  561.         passcardDebug('Checking if DefaultPasscard exists: ' + bShowNotification);
  562.     }
  563.  
  564.   var bPasswordFieldExists = CheckIsPasscardable(true);
  565.     passcardDebug('Is Passcardable?: ' + bPasswordFieldExists);
  566.     passcardDebug('***** Notification bar state: '+gCurrentNotificationBar);
  567.  
  568.   // If password field exists and passcard is set to show a prompt,
  569.   // then show the notification bar.
  570.   if (bShowNotification && bPasswordFieldExists)
  571.   {
  572.         ShowPasscardBar();
  573.     }
  574.     else
  575.     {
  576.         HidePasscardBar();
  577.     }
  578.  
  579.     // if there is a password field, we don't want to display the datacard notification bar even if
  580.     // the passcard notification bar is not displayed
  581.     return bPasswordFieldExists;
  582. }
  583.  
  584. function ShowPasscardBar()
  585. {
  586.     displayNotificationBar("passcard");
  587.     /*    var message;
  588.     var bundle_browser = document.getElementById("bundle_browser");
  589.     message = bundle_browser.getString("passcardMsg");
  590.  
  591.     gBrowser.showMessage(gBrowser.selectedBrowser, "chrome://browser/skin/icons/passwordsm_h.png",
  592.                                                 message, "", null, null, null, "top", true, 1); */
  593. }
  594.  
  595. function HidePasscardBar()
  596. {
  597.     if (gCurrentNotificationBar == 'passcard') {
  598.         var tabbrowser = getBrowser();
  599.         tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  600.     }
  601. }
  602.  
  603. function IsDisplayBrowserBarForDefaultPasscard()
  604. {
  605.     // search for default passcard
  606.     var enumerator = gPasscardMgr.enumerator;
  607.     while (enumerator.hasMoreElements())
  608.     {
  609.         try
  610.         {
  611.             var nextPasscard = enumerator.getNext();
  612.  
  613.             // get all info for the passcard
  614.             nextPasscard = nextPasscard.QueryInterface(Components.interfaces.nsIPassword);
  615.             if (nextPasscard.host == kDefaultPasscard)
  616.             {
  617.                 return nextPasscard.autologin == 0 && IsProtectedAndPopulatedPasscard(nextPasscard);
  618.             }
  619.         }
  620.         catch (ex) {}
  621.     }
  622.     return false;
  623. }
  624.  
  625. function setPasscardDefault(menuitem) {
  626.     if(eval(menuitem.getAttribute('lastUsed')))
  627.         return;
  628.  
  629.     // if the menuitem is NOT the default passcard...
  630.     var enumerator = gPasscardMgr.enumerator;
  631.  
  632.     // realm is the base domain
  633.     var realm = new Object();
  634.     gPasscardMgr.getDomain(getWebNavigation().currentURI, realm);
  635.     if (realm.value == null)
  636.         return;        // currentURI was probably null
  637.  
  638.     // set select passcard as lastUsed
  639.     // NOTE: This operation does not reset the checked state for the selected menuitem
  640.     gPasscardMgr.setAsLastUsedSignon(menuitem.getAttribute('host'),
  641.     menuitem.getAttribute('uniqueID'));
  642.  
  643.     // update the browser message bar if it is shown
  644.     UpdatePasscardMessageBar(menuitem.getAttribute('label'));
  645.  
  646.     // update the passcard button label on the toolbar
  647.     SetPasscard();
  648.  
  649.     passcardDebug('***default -- passcard: ' + menuitem.getAttribute('label'));
  650.     fillUsernamePassword(menuitem, false);
  651. }
  652.  
  653. // update the browser message bar (if it is shown) with the current passcard
  654. function UpdatePasscardMessageBar(menuLabel)
  655. {
  656.     if (gCurrentNotificationBar != "passcard")
  657.         return;
  658.  
  659.     if (menuLabel == null || menuLabel.length < 1)
  660.         return;
  661.  
  662.     var theMenulist = document.getAnonymousElementByAttribute(gBrowser.mCurrentBrowser.previousSibling, 'anonid', 'messagePasscardList');
  663.     if (theMenulist == null)
  664.         return;
  665.  
  666.     var theMenupopup = theMenulist.childNodes[0];
  667.     if (!theMenupopup || theMenupopup.localName != 'menupopup')
  668.         return;
  669.  
  670.     var i;
  671.     for (i = 0; i < theMenupopup.childNodes.length; i++)
  672.     {
  673.         var child = theMenupopup.childNodes[i];
  674.         //passcardDebug('*** menuitem: child: ' + child.getAttribute('label') + ', menuitem: ' + menuLabel);
  675.         if (child.getAttribute('label') == menuLabel)
  676.         {
  677.             theMenulist.selectedIndex = i;
  678.             break;
  679.         }
  680.     }
  681. }
  682.  
  683. //MERC: Durga
  684. //Display default passcard on toolbar in text mode
  685. function SetPasscard()
  686. {
  687.     passcardDebug('SetPasscard()');
  688.  
  689.     var enumerator = gPasscardMgr.enumerator;
  690.  
  691.     var realm = new Object();
  692.     var host;
  693.     var password;
  694.     var passcard;
  695.  
  696.     var nextPassword;
  697.     var numFound = 0;
  698.     var lastUsed;
  699.     var lastUsedName;
  700.     /*    var filler1 = new Object();
  701.     var filler2 = new Object();
  702.     var filler3 = new Object();
  703.     var filler4 = new Object();
  704.     var filler5 = new Object();
  705.     var filler6 = new Object();
  706.     */
  707.     // If passcard button is not present, no need to update it
  708.     // MERC - JCH: Use the combined datacard/passcard button ID
  709.     var button = document.getElementById("combined-autofill-button");
  710.     if (!button) return;
  711.  
  712.     // Update button to generic setting
  713.     // MERC - JCH: Changing button name from 'passcard' to 'autofill'.
  714.     button.setAttribute("label", "Autofill");
  715.     button.removeAttribute("match");
  716.  
  717.     // Check for realm
  718.     gPasscardMgr.getDomain(getWebNavigation().currentURI, realm);
  719.     if (realm.value == null) 
  720.         return; // currentURI was probably null
  721.     passcardDebug("***Passcard -- realm: " + realm.value);
  722.  
  723.     // search for default passcard
  724.     while (enumerator.hasMoreElements()) {
  725.         try {
  726.             nextPassword = enumerator.getNext();
  727.  
  728.             // get all info for the passcard
  729.             nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
  730.             host = nextPassword.host;
  731.             lastUsed = nextPassword.lastUsed;
  732.             passcard = nextPassword.passcard;
  733.  
  734.             if (realm.value == host) {
  735.                 // This passcard matches the site
  736.                 passcardDebug("***Passcard -- lastUsed: " + lastUsed);
  737.                 passcardDebug("***Passcard -- passcard: " + passcard);
  738.                 numFound++;
  739.                 if (lastUsed == 1) {
  740.                     // Set button label
  741.                     button.setAttribute("label", passcard);
  742.                     button.setAttribute("match", "true");
  743.                 }
  744.                 if (lastUsed == 1 || !lastUsedName) {
  745.                     lastUsedName = passcard;
  746.                 }
  747.             }
  748.         }
  749.         catch(e)
  750.         {
  751.             passcardDebug ("caught exception: " + e);
  752.         }
  753.     }
  754.     if (numFound > 1) {
  755.         button.setAttribute("label", lastUsedName + '+'+numFound);
  756.         button.setAttribute("match", "true");
  757.     }
  758.  
  759. } // end function
  760.  
  761. // MERC - JCH: This function is called from browser.xml: "browsermessage" binding.
  762. // When submitFlag is false we don't submit the passcard info, when it's true we do.
  763. function ParameterizedDoPasscard(submitFlag)
  764. {
  765.     var hpDoc = getTridentDocument();
  766.     if (hpDoc)
  767.     {
  768.         // fire Trident side
  769.         if (submitFlag)
  770.         {
  771.             passcardDebug('********* DoFillFormAndSubmit via Trident **********');
  772.             hpDoc.doPasscardFillFormAndSubmit();
  773.         }
  774.         else
  775.         {
  776.             passcardDebug('********* DoFillForm via Trident **********');
  777.             hpDoc.doPasscardFillForm();
  778.         }
  779.     }
  780.     else
  781.     {
  782.         // fire Gecko side
  783.         passcardDebug('********* DoPasscardOneTime via Gecko **********');
  784.         var enumerator = gPasscardMgr.enumerator;
  785.  
  786.         var realm = new Object();
  787.         var host;
  788.         var password;
  789.         var uniqueID;
  790.  
  791.         var nextPassword;
  792.         var lastUsed;
  793.         var passcardFound = false;
  794.  
  795.         var filler1 = new Object();
  796.         var filler2 = new Object();
  797.         var filler3 = new Object();
  798.         var filler4 = new Object();
  799.         var filler5 = new Object();
  800.         var filler6 = new Object();
  801.         var filler7 = new Object();
  802.         var filler8 = new Object();
  803.         var filler9 = new Object();
  804.         var filler10 = new Object();
  805.  
  806.         if (enumerator.hasMoreElements())
  807.         {
  808.             gPasscardMgr.getDomain(getWebNavigation().currentURI, realm);
  809.             //passcardDebug('REALM: ' + realm + ' VALUE: ' + realm.value);
  810.             if (realm.value != null)
  811.             {
  812.                 passcardDebug("***Passcard -- realm: " + realm.value);
  813.  
  814.                 // search for default passcard
  815.                 while (enumerator.hasMoreElements() && !passcardFound) {
  816.                     try {
  817.                         nextPassword = enumerator.getNext();
  818.  
  819.                         // get all info for the passcard
  820.                         nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
  821.                         host = nextPassword.host;
  822.                         lastUsed = nextPassword.lastUsed;
  823.                         uniqueID = nextPassword.uniqueID;
  824.  
  825.                         if (realm.value == host && lastUsed==1)
  826.                         {
  827.                             passcardDebug("***Passcard -- lastUsed: " + lastUsed);
  828.                             passcardFound = true;
  829.                             passcardDebug('********* DoPasscardOneTime via Gecko, found passcard! **********');
  830.                             gPasscardMgr.passcardFillRootDoc(gBrowser.contentDocument, host, uniqueID, submitFlag, false);
  831.                         }
  832.                     }    catch(e) {}
  833.                 }
  834.             }
  835.         }
  836.  
  837.         if (!passcardFound) {
  838.             // use default user/password
  839.             passcardDebug('********* ParameterizedDoPasscard via Gecko, use default! **********');
  840.             gPasscardMgr.passcardDefaultRootDoc(gBrowser.contentDocument, submitFlag, true);
  841.         }
  842.     }
  843. } // end function
  844.  
  845. function passcardPreferences(prefName) {
  846.  
  847.     var prefAutologin = new Object();
  848.     var prefAutologinPrompt = new Object();
  849.     var prefAutosave = new Object();
  850.     var prefAutosavePrompt = new Object();
  851.     var prefHighlight = new Object();
  852.     var prefFillAndSubmit = new Object();
  853.     var prefDefaultPrompt = new Object();
  854.     var prefDefaultUser = new Object();
  855.     var prefDefaultPassword = new Object();
  856.     var prefProtect = new Object();
  857.     var prefPrompt = new Object();
  858.     var prefExpire = new Object();
  859.  
  860.     gPasscardMgr.getPreferences(prefAutologin, prefAutologinPrompt, prefAutosave,
  861.                                                             prefAutosavePrompt, prefHighlight, prefFillAndSubmit,
  862.                                                             prefDefaultPrompt, prefDefaultUser, prefDefaultPassword,
  863.                                                             prefProtect, prefPrompt, prefExpire);
  864.  
  865.     return eval('pref' + prefName + '.value'); //JMC: Cheap Hack
  866. }
  867.  
  868. //MERC: Durga
  869. //Retrieve passcard for specific url when toolbar button is clicked
  870. function DoPasscardOneTime()
  871. {
  872.     var hpDoc = getTridentDocument();
  873.     if (hpDoc)
  874.     {
  875.         // fire Trident side
  876.         passcardDebug('********* DoPasscardOneTime via Trident **********');
  877.         hpDoc.doPasscardOneTime();        // if Fill & Submit preference set, doPasscardOneTime() will call submit (see Trident CPasscards::OnToolbarButton())
  878.     }
  879.     else
  880.     {
  881.         // fire Gecko side
  882.         passcardDebug('********* DoPasscardOneTime via Gecko **********');
  883.         var enumerator = gPasscardMgr.enumerator;
  884.  
  885.         var realm = new Object();
  886.         var host;
  887.         var password;
  888.         var uniqueID;
  889.  
  890.         var nextPassword;
  891.         var lastUsed;
  892.         var passcardFound = false;
  893.         var filler1 = new Object();
  894.         var filler2 = new Object();
  895.         var filler3 = new Object();
  896.         var filler4 = new Object();
  897.         var filler5 = new Object();
  898.         var filler6 = new Object();
  899.         var filler7 = new Object();
  900.         var filler8 = new Object();
  901.         var filler9 = new Object();
  902.         var filler10 = new Object();
  903.  
  904.         var bSubmitForm = isPasscardFillAndSubmit();
  905.  
  906.         if (enumerator.hasMoreElements())
  907.         {
  908.             gPasscardMgr.getDomain(getWebNavigation().currentURI, realm);
  909.             //passcardDebug('REALM: ' + realm + ' VALUE: ' + realm.value);
  910.             if (realm.value != null)
  911.             {
  912.                 passcardDebug("***Passcard -- realm: " + realm.value);
  913.  
  914.                 // search for default passcard
  915.                 while (enumerator.hasMoreElements() && !passcardFound) {
  916.                     try {
  917.                         nextPassword = enumerator.getNext();
  918.  
  919.                         // get all info for the passcard
  920.                         nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
  921.                         host = nextPassword.host;
  922.                         lastUsed = nextPassword.lastUsed;
  923.                         uniqueID = nextPassword.uniqueID;
  924.  
  925.                         if(realm.value == host && lastUsed==1)
  926.                         {
  927.                             passcardDebug("***Passcard -- lastUsed: " + lastUsed);
  928.                             passcardFound = true;
  929.                             passcardDebug('********* DoPasscardOneTime via Gecko, found passcard! **********');
  930.                             gPasscardMgr.passcardFillRootDoc(gBrowser.contentDocument, host, uniqueID, bSubmitForm, false);
  931.                         }
  932.                     } catch(e) {}
  933.                 }
  934.             }
  935.         }
  936.  
  937.         if (!passcardFound) {
  938.             // use default user/password
  939.             passcardDebug('********* DoPasscardOneTime via Gecko, use default! **********');
  940.             gPasscardMgr.passcardDefaultRootDoc(gBrowser.contentDocument, bSubmitForm, false);
  941.         }
  942.     }
  943. } // end function
  944.  
  945. function isPasscardFillAndSubmit()
  946. {
  947.     // TODO JVL : Need to revisit when passcard preferences are stored in browser prefs, but for now, this will do
  948.     if (gPasscardMgr == null)
  949.         return false;
  950.  
  951.     var prefAutologin = new Object();
  952.     var prefAutologinPrompt = new Object();
  953.     var prefAutosave = new Object();
  954.     var prefAutosavePrompt = new Object();
  955.     var prefHighlight = new Object();
  956.     var prefFillAndSubmit = new Object();
  957.     var prefDefaultPrompt = new Object();
  958.     var prefUserID = new Object();
  959.     var prefPassword = new Object();
  960.     var prefProtect = new Object();
  961.     var prefPrompt = new Object();
  962.     var prefExpire = new Object();
  963.  
  964.     gPasscardMgr.getPreferences(prefAutologin, prefAutologinPrompt, prefAutosave,
  965.                                                             prefAutosavePrompt, prefHighlight, prefFillAndSubmit,
  966.                                                             prefDefaultPrompt, prefUserID, prefPassword,
  967.                                                             prefProtect, prefPrompt, prefExpire);
  968.  
  969.     if (prefFillAndSubmit.value != "0")
  970.         return true;
  971.  
  972.     return false;
  973. }
  974.  
  975. function fillUsernamePassword(menuitem, bSubmitForm) {
  976.     var hpDoc = getTridentDocument();
  977.     if (hpDoc)
  978.     {
  979.         // fire Trident side
  980.         if (bSubmitForm)
  981.         {
  982.             passcardDebug('********* DoFillFormAndSubmit via Trident **********');
  983.             hpDoc.doPasscardFillFormAndSubmit();
  984.         }
  985.         else
  986.         {
  987.             passcardDebug('********* DoFillForm via Trident **********');
  988.             hpDoc.doPasscardFillForm();
  989.         }
  990.     }
  991.     else
  992.     {
  993.         var bFound = false;
  994.         var myHost = menuitem.getAttribute('host');
  995.         var myUniqueID = menuitem.getAttribute('uniqueID');
  996.         if (myHost.length > 0 && myUniqueID.length > 0)
  997.         {
  998.             bFound = true;
  999.         }
  1000.         else
  1001.         {
  1002.             var nextItem = menuitem.nextSibling;
  1003.             while (!bFound && nextItem != null)
  1004.             {
  1005.                 if (nextItem.getAttribute('lastUsed') == "1")
  1006.                 {
  1007.                     myHost = nextItem.getAttribute('host');
  1008.                     myUniqueID = nextItem.getAttribute('uniqueID');
  1009.                     bFound = true;
  1010.                 }
  1011.                 else
  1012.                 {
  1013.                     nextItem = nextItem.nextSibling;
  1014.                 }
  1015.             }
  1016.         }
  1017.  
  1018.         if (bFound)
  1019.         {
  1020.             passcardDebug('*********** fillUsernamePassword() ********************');
  1021.             passcardDebug('host: ' + myHost + ' ID: ' + myUniqueID + ' submitForm: ' + bSubmitForm);
  1022.             gPasscardMgr.passcardFillRootDoc(gBrowser.contentDocument, myHost, myUniqueID, bSubmitForm, false);
  1023.         }
  1024.     }
  1025. }
  1026.