home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / pippki.jar / content / pippki / password.js < prev    next >
Text File  |  2002-08-23  |  9KB  |  330 lines

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is mozilla.org code.
  13.  *
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are
  16.  * Copyright (C) 2001 Netscape Communications Corporation. All
  17.  * Rights Reserved.
  18.  *
  19.  * Contributor(s):
  20.  *  Bob Lord <lord@netscape.com>
  21.  *  Terry Hayes <thayes@netscape.com>
  22.  */
  23. const nsPK11TokenDB = "@mozilla.org/security/pk11tokendb;1";
  24. const nsIPK11TokenDB = Components.interfaces.nsIPK11TokenDB;
  25. const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock;
  26. const nsPKCS11ModuleDB = "@mozilla.org/security/pkcs11moduledb;1";
  27. const nsIPKCS11ModuleDB = Components.interfaces.nsIPKCS11ModuleDB;
  28. const nsIPKCS11Slot = Components.interfaces.nsIPKCS11Slot;
  29. const nsIPK11Token = Components.interfaces.nsIPK11Token;
  30.  
  31.  
  32. var params;
  33. var tokenName="";
  34. var pw1;
  35.  
  36. function onLoad()
  37. {
  38.  
  39.   pw1 = document.getElementById("pw1");
  40.   try {
  41.      params = window.arguments[0].QueryInterface(nsIDialogParamBlock);
  42.      tokenName = params.GetString(1);
  43.   } catch(exception) {
  44.       // this should not happen.
  45.       // previously we had self.name, but self.name was a bad idea
  46.       // as window name must be a subset of ascii, and the code was
  47.       // previously trying to assign unicode to the window's name.
  48.       // I checked all the places where we get a password prompt and
  49.       // all of them pass an argument as part of this patch.
  50.       tokenName="";
  51.   }
  52.       
  53.  
  54.   if(tokenName=="") {
  55.      var sectokdb = Components.classes[nsPK11TokenDB].getService(nsIPK11TokenDB);
  56.      var tokenList = sectokdb.listTokens();
  57.      var enumElement;
  58.      var i=0;
  59.      var menu = document.getElementById("tokenMenu");
  60.      try {
  61.         for ( ; !tokenList.isDone(); tokenList.next()) {
  62.            enumElement = tokenList.currentItem();
  63.            var token = enumElement.QueryInterface(nsIPK11Token);
  64.            if(token.needsLogin() || !(token.needsUserInit)) {
  65.               var menuItemNode = document.createElement("menuitem");
  66.               menuItemNode.setAttribute("value", token.tokenName);
  67.               menuItemNode.setAttribute("label", token.tokenName);
  68.               menu.firstChild.appendChild(menuItemNode);
  69.               if (i == 0) {
  70.                  menu.selectedItem = menuItemNode;
  71.                  tokenName = token.tokenName;
  72.               }
  73.               i++;
  74.            }
  75.         }
  76.      }catch(exception){}
  77.   } else {
  78.     var sel = document.getElementById("tokenMenu");
  79.     sel.setAttribute("hidden", "true");
  80.     var tag = document.getElementById("tokenName");
  81.     tag.setAttribute("value",tokenName);
  82.   }
  83.           
  84.   process();
  85. }
  86.  
  87. function onMenuChange()
  88. {
  89.    //get the selected token
  90.    var list = document.getElementById("tokenMenu");
  91.    tokenName = list.value;
  92.  
  93.    process();
  94. }
  95.  
  96.  
  97. function process()
  98. {
  99.    var secmoddb = Components.classes[nsPKCS11ModuleDB].getService(nsIPKCS11ModuleDB);
  100.    var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  101.  
  102.    // If the token is unitialized, don't use the old password box.
  103.    // Otherwise, do.
  104.  
  105.    var slot = secmoddb.findSlotByName(tokenName);
  106.    if (slot) {
  107.      var oldpwbox = document.getElementById("oldpw");
  108.      var msgBox = document.getElementById("message");
  109.      var status = slot.status;
  110.      if (status == nsIPKCS11Slot.SLOT_UNINITIALIZED
  111.          || status == nsIPKCS11Slot.SLOT_READY) {
  112.       
  113.        oldpwbox.setAttribute("hidden", "true");
  114.        msgBox.setAttribute("value", bundle.GetStringFromName("password_not_set")); 
  115.        msgBox.setAttribute("hidden", "false");
  116.  
  117.        if (status == nsIPKCS11Slot.SLOT_READY) {
  118.          oldpwbox.setAttribute("inited", "empty");
  119.        } else {
  120.          oldpwbox.setAttribute("inited", "true");
  121.        }
  122.       
  123.        // Select first password field
  124.        document.getElementById('pw1').focus();
  125.     
  126.      } else {
  127.        // Select old password field
  128.        oldpwbox.setAttribute("hidden", "false");
  129.        msgBox.setAttribute("hidden", "true");
  130.        oldpwbox.setAttribute("inited", "false");
  131.        oldpwbox.focus();
  132.      }
  133.    }
  134.  
  135.   if (params) {
  136.     // Return value 0 means "canceled"
  137.     params.SetInt(1, 0);
  138.   }
  139.   
  140.   checkPasswords();
  141. }
  142.  
  143. function onP12Load()
  144. {
  145.   pw1 = document.getElementById("pw1");
  146.   params = window.arguments[0].QueryInterface(nsIDialogParamBlock);
  147.   // Select first password field
  148.   document.getElementById('pw1').focus();
  149. }
  150.  
  151. function setPassword()
  152. {
  153.   var pk11db = Components.classes[nsPK11TokenDB].getService(nsIPK11TokenDB);
  154.   var token = pk11db.findTokenByName(tokenName);
  155.  
  156.   var oldpwbox = document.getElementById("oldpw");
  157.   var initpw = oldpwbox.getAttribute("inited");
  158.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  159.   
  160.   var success = false;
  161.   
  162.   if (initpw == "false" || initpw == "empty") {
  163.     try {
  164.       var oldpw = "";
  165.       var passok = 0;
  166.       
  167.       if (initpw == "empty") {
  168.         passok = 1;
  169.       } else {
  170.         oldpw = oldpwbox.value;
  171.         passok = token.checkPassword(oldpw);
  172.       }
  173.       
  174.       if (passok) {
  175.         if (initpw == "empty" && pw1.value == "") {
  176.           // This makes no sense that we arrive here, 
  177.           // we reached a case that should have been prevented by checkPasswords.
  178.         } else {
  179.           if (pw1.value == "") {
  180.             var secmoddb = Components.classes[nsPKCS11ModuleDB].getService(nsIPKCS11ModuleDB);
  181.             if (secmoddb.isFIPSEnabled) {
  182.               // empty passwords are not allowed in FIPS mode
  183.               alert(bundle.GetStringFromName("pw_change2empty_in_fips_mode"));
  184.               passok = 0;
  185.             }
  186.           }
  187.           if (passok) {
  188.             token.changePassword(oldpw, pw1.value);
  189.             if (pw1.value == "") {
  190.               alert(bundle.GetStringFromName("pw_erased_ok")
  191.                     + " "
  192.                     + bundle.GetStringFromName("pw_empty_warning"));
  193.             } else {
  194.               alert(bundle.GetStringFromName("pw_change_ok")); 
  195.             }
  196.             success = true;
  197.           }
  198.         }
  199.       } else {
  200.         oldpwbox.focus();
  201.         oldpwbox.setAttribute("value", "");
  202.         alert(bundle.GetStringFromName("incorrect_pw")); 
  203.       }
  204.     } catch (e) {
  205.       alert(bundle.GetStringFromName("failed_pw_change")); 
  206.     }
  207.   } else {
  208.     token.initPassword(pw1.value);
  209.     if (pw1.value == "") {
  210.       alert(bundle.GetStringFromName("pw_not_wanted")
  211.             + " " 
  212.             + bundle.GetStringFromName("pw_empty_warning"));
  213.     }
  214.     success = true;
  215.   }
  216.  
  217.   // Terminate dialog
  218.   if (success) {
  219.     if (params) {
  220.       // Return value 1 means "successfully executed ok"
  221.       params.SetInt(1, 1);
  222.     }
  223.  
  224.     window.close();
  225.   }
  226. }
  227.  
  228. function getPassword()
  229. {
  230.   // grab what was entered
  231.   params.SetString(2, pw1.value);
  232.   // Return value
  233.   params.SetInt(1, 1);
  234.   // Terminate dialog
  235.   window.close();
  236. }
  237.  
  238. function setP12Password()
  239. {
  240.   // grab what was entered
  241.   params.SetString(2, pw1.value);
  242.   // Return value
  243.   params.SetInt(1, 1);
  244.   // Terminate dialog
  245.   window.close();
  246. }
  247.  
  248. function setPasswordStrength()
  249. {
  250. // Here is how we weigh the quality of the password
  251. // number of characters
  252. // numbers
  253. // non-alpha-numeric chars
  254. // upper and lower case characters
  255.  
  256.   var pw=document.getElementById('pw1').value;
  257. //  alert("password='" + pw +"'");
  258.  
  259. //length of the password
  260.   var pwlength=(pw.length);
  261.   if (pwlength>5)
  262.     pwlength=5;
  263.  
  264.  
  265. //use of numbers in the password
  266.   var numnumeric = pw.replace (/[0-9]/g, "");
  267.   var numeric=(pw.length - numnumeric.length);
  268.   if (numeric>3)
  269.     numeric=3;
  270.  
  271. //use of symbols in the password
  272.   var symbols = pw.replace (/\W/g, "");
  273.   var numsymbols=(pw.length - symbols.length);
  274.   if (numsymbols>3)
  275.     numsymbols=3;
  276.  
  277. //use of uppercase in the password
  278.   var numupper = pw.replace (/[A-Z]/g, "");
  279.   var upper=(pw.length - numupper.length);
  280.   if (upper>3)
  281.     upper=3;
  282.  
  283.  
  284.   var pwstrength=((pwlength*10)-20) + (numeric*10) + (numsymbols*15) + (upper*10);
  285.  
  286.   // make sure we're give a value between 0 and 100
  287.   if ( pwstrength < 0 ) {
  288.     pwstrength = 0;
  289.   }
  290.   
  291.   if ( pwstrength > 100 ) {
  292.     pwstrength = 100;
  293.   }
  294.  
  295.   var mymeter=document.getElementById('pwmeter');
  296.   mymeter.setAttribute("value",pwstrength);
  297.  
  298.   return;
  299. }
  300.  
  301. function checkPasswords()
  302. {
  303.   var pw1=document.getElementById('pw1').value;
  304.   var pw2=document.getElementById('pw2').value;
  305.  
  306.   var ok=document.getElementById('ok-button');
  307.  
  308.   var oldpwbox = document.getElementById("oldpw");
  309.   if (oldpwbox) {
  310.     var initpw = oldpwbox.getAttribute("inited");
  311.  
  312.     if (initpw == "empty" && pw1 == "") {
  313.       // The token has already been initialized, therefore this dialog
  314.       // was called with the intention to change the password.
  315.       // The token currently uses an empty password.
  316.       // We will not allow changing the password from empty to empty.
  317.       ok.setAttribute("disabled","true");
  318.       return;
  319.     }
  320.   }
  321.  
  322.   if (pw1 == pw2){
  323.     ok.setAttribute("disabled","false");
  324.   } else
  325.   {
  326.     ok.setAttribute("disabled","true");
  327.   }
  328.  
  329. }
  330.