home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / komunikace / netscape / nsb-install-8-1-2.exe / chrome / browser.jar / content / browser / passcardUtils.js < prev    next >
Text File  |  2006-01-06  |  32KB  |  1,082 lines

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