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