Guest User

Yahoo Mail password change client-side validation script

a guest
Nov 5th, 2013
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Yahoo mail prompted me to change my password today, and redirected me to a page that kept crashing with
  2. // Javascript exceptions. So I investigated, and found some pretty crazy code. Here's a fully unobfusticated
  3. // snippet. Not sure what's my favorite part: the 14 level deep nested if statement, using eval to match
  4. // regexes, or the inexplicable lengthToDataArray. The script crashes because of a typo in line 210, and an
  5. // undefined reference in line 209. Anyone else find anything awesomely bad? Fortunately the broken script
  6. // didn't prevent me from changing my password!
  7.  
  8. passwordMeter = function (e, obj) {
  9.     var testResult = "weak";
  10.     var myPassword = Y.one(obj[0]).get("value");
  11.     var len = false;
  12.     var letters = false;
  13.     var numbers = false;
  14.     var name = false;
  15.     var specials = false;
  16.     var repeat = false;
  17.     var order = false;
  18.     var testLength = function (str) {
  19.         var len = str.length;
  20.         if (len > 7 && len < 33) {
  21.             return true;
  22.         }
  23.         return false;
  24.     };
  25.     var testLetters = function (str) {
  26.         if (str.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {
  27.             return true;
  28.         }
  29.         return false;
  30.     };
  31.     var testNumbers = function (str) {
  32.         var hasNumber = false;
  33.         var hasLetter = false;
  34.         if (str.match(/\d+/)) {
  35.             hasNumber = true;
  36.         }
  37.         if (str.match(/[a-z].*/i)) {
  38.             hasLetter = true;
  39.         }
  40.         return (hasNumber && hasLetter);
  41.     };
  42.     var testSpecials = function (str) {
  43.         var allSpecials = str;
  44.         allSpecials = allSpecials.replace(/[!@#\$%^&\*?_~\(\)]*/, "");
  45.         if (allSpecials != "" && str.match(/[!,@,#,\$,%,^,&,\*,?,_,~]/)) {
  46.             return true;
  47.         }
  48.         return false;
  49.     };
  50.     var testName = function (str) {
  51.         return validPassword(e, validate.password);
  52.     };
  53.     var testLetterCase = function (str) {
  54.         if (str.match(/[a-z,A-Z]/)) {
  55.             if (!(str.match(/[A-Z]/))) {
  56.                 return false;
  57.             }
  58.         }
  59.         return true;
  60.     };
  61.     var updateMeter = function (strength) {
  62.         bgcolor = "meterEmpty";
  63.         meterMsg = infoMessages.password_initialState;
  64.         switch (strength) {
  65.         case "strongest":
  66.             meterMsg = infoMessages.password_strongest;
  67.             boxes = 4;
  68.             bgcolor = "meterGood";
  69.             break;
  70.         case "strong":
  71.             meterMsg = infoMessages.password_strong;
  72.             boxes = 3;
  73.             bgcolor = "meterGood";
  74.             break;
  75.         case "mediocre":
  76.             meterMsg = infoMessages.password_mediocre;
  77.             boxes = 2;
  78.             bgcolor = "meterFair";
  79.             break;
  80.         case "weak":
  81.             meterMsg = infoMessages.password_mediocre;
  82.             boxes = 1;
  83.             bgcolor = "meterBad";
  84.             break;
  85.         case "invalid":
  86.             meterMsg = infoMessages.password_invalid;
  87.             boxes = 1;
  88.             bgcolor = "meterBad";
  89.             break;
  90.         default:
  91.             meterMsg = infoMessages.password_initialState;
  92.             boxes = 0;
  93.             bgcolor = "meterEmpty";
  94.             break;
  95.         }
  96.         Y.one("#pwdmlabel").set("innerHTML", meterMsg);
  97.         for (i = 1; i < 5; i++) {
  98.             var meterBox = Y.one("#pwdm" + i);
  99.             if (meterBox) {
  100.                 meterBox.set("className", "");
  101.                 if (i > boxes) {
  102.                     bgcolor = "meterEmpty";
  103.                 }
  104.                 meterBox.addClass(bgcolor);
  105.             }
  106.         }
  107.     };
  108.     var results = [];
  109.     if (myPassword.length > 0) {
  110.         len = testLength(myPassword);
  111.         letters = testLetters(myPassword);
  112.         numbers = testNumbers(myPassword);
  113.         specials = testSpecials(myPassword);
  114.         name = testName(myPassword);
  115.         letterCase = testLetterCase(myPassword);
  116.     }
  117.     testResult = "weak";
  118.     if (myPassword.length < 1) {
  119.         testResult = "lame";
  120.     } else {
  121.         if (name) {
  122.             testResult = "invalid";
  123.         } else {
  124.             if (!len) {
  125.                 testResult = "weak";
  126.             } else {
  127.                 if (!letterCase) {
  128.                     testResult = "weak";
  129.                 } else {
  130.                     if (!len && !letters && !numbers && !specials) {
  131.                         testResult = "weak";
  132.                     } else {
  133.                         if (len && !letters && !numbers && !specials) {
  134.                             testResult = "weak";
  135.                         } else {
  136.                             if (len && letters && !numbers && !specials) {
  137.                                 testResult = "weak";
  138.                             } else {
  139.                                 if (len && !letters && numbers && !specials) {
  140.                                     testResult = "weak";
  141.                                 } else {
  142.                                     if (len && !letters && !numbers && specials) {
  143.                                         testResult = "weak";
  144.                                     } else {
  145.                                         if (len && !letters && numbers && specials) {
  146.                                             testResult = "weak";
  147.                                         } else {
  148.                                             if (len && letters && !numbers && specials) {
  149.                                                 testResult = "weak";
  150.                                             } else {
  151.                                                 if (len && letters && numbers && !specials) {
  152.                                                     testResult = "strongest";
  153.                                                 } else {
  154.                                                     if (len && letters && numbers && specials) {
  155.                                                         testResult = "strongest";
  156.                                                     } else {
  157.                                                         testResult = "weak";
  158.                                                     }
  159.                                                 }
  160.                                             }
  161.                                         }
  162.                                     }
  163.                                 }
  164.                             }
  165.                         }
  166.                     }
  167.                 }
  168.             }
  169.         }
  170.     }
  171.     updateMeter(testResult);
  172. };
  173. validPassword = function (e, obj) {
  174.     var errorType;
  175.     var myPassword = Y.one(obj[0]).get("value");
  176.     var oldPassword = Y.one("#opw").get("value");
  177.     var fname = config.fname.get("value");
  178.     var lname = config.lname.get("value");
  179.     var yid = config.yid.get("value");
  180.     if (myPassword === "") {
  181.         hasError = true;
  182.         errorType = "empty";
  183.     } else {
  184.         hasError = false;
  185.     } if (!hasError && myPassword) {
  186.         var numCheck = false;
  187.         var splCheck = false;
  188.         if (myPassword.match(/\d+/)) {
  189.             numCheck = true;
  190.         }
  191.         if (myPassword.match(/[!,@,#,\$,%,^,&,\*,?,_,~]/)) {
  192.             splCheck = true;
  193.         }
  194.         if (!(numCheck || splCheck)) {
  195.             hasError = true;
  196.             errorType = "alphaonlypwd";
  197.         }
  198.         if (!numCheck) {
  199.             hasError = true;
  200.             errorType = "nonumber";
  201.         }
  202.     }
  203.     if (!hasError && myPassword) {
  204.         if (!(myPassword.match(/[A-Z]/))) {
  205.             hasError = true;
  206.             errorType = "nouppercasepwd";
  207.         }
  208.     }
  209.     if (!hasError && myPassword && myPassword.length > 7 && myPassword.length < fuzzyLengthUpperLimit) {
  210.         var validationStatus = isSimmilar(fname, lname, myPassword);
  211.         validationStatus = (validationStatus === 0 ? true : false);
  212.         Y.fire("isSimilarToName", validationStatus);
  213.         if (!validationStatus) {
  214.             hasError = true;
  215.             errorType = "pwdsimilartoname";
  216.         }
  217.     }
  218.     if (!hasError && myPassword && oldPassword) {
  219.         var validationStatus = isSimmilarLD(myPassword, oldPassword);
  220.         validationStatus = (validationStatus === 1 ? true : false);
  221.         Y.fire("isSimilarToPrevPassword", validationStatus);
  222.         if (!validationStatus) {
  223.             hasError = true;
  224.             errorType = "pwdsimilartoold";
  225.         }
  226.     }
  227.     var len = myPassword.length;
  228.     if (len < 8 || len > 32) {
  229.         hasError = true;
  230.         writeLog("validPassword says: " + hasError);
  231.         errorType = "pwdwronglength";
  232.     }
  233.     var errorArray = new Array();
  234.     var regex = "";
  235.     var original = myPassword;
  236.     var re = "";
  237.     var lengthArray = new Array();
  238.     var lengthToDataArray = new Array();
  239.     if (fname != "") {
  240.         lengthArray[lengthArray.length] = fname.length;
  241.         lengthToDataArray[fname.length] = fname;
  242.     }
  243.     if (lname != "") {
  244.         lengthArray[lengthArray.length] = lname.length;
  245.         if (lengthToDataArray[lname.length] != undefined) {
  246.             lengthToDataArray[lname.length] += "|" + lname;
  247.         } else {
  248.             lengthToDataArray[lname.length] = lname;
  249.         }
  250.     }
  251.     if (yid != "") {
  252.         lengthArray[lengthArray.length] = yid.length;
  253.         if (lengthToDataArray[yid.length] != undefined) {
  254.             lengthToDataArray[yid.length] += "|" + yid;
  255.         } else {
  256.             lengthToDataArray[yid.length] = yid;
  257.         }
  258.     }
  259.     var pwd = "password";
  260.     lengthArray[lengthArray.length] = pwd.length;
  261.     if (lengthToDataArray[pwd.length] != undefined) {
  262.         lengthToDataArray[pwd.length] += "|" + pwd;
  263.     } else {
  264.         lengthToDataArray[pwd.length] = pwd;
  265.     }
  266.     lengthArray.sort(function (a, b) {
  267.         return b - a;
  268.     });
  269.     for (var i in lengthArray) {
  270.         if (lengthToDataArray[lengthArray[i]] != undefined && lengthToDataArray[lengthArray[i]] == null) {
  271.             continue;
  272.         } else {
  273.             if (lengthToDataArray[lengthArray[i]] != undefined && lengthToDataArray[lengthArray[i]] != null) {
  274.                 re += lengthToDataArray[lengthArray[i]] + "|";
  275.                 lengthToDataArray[lengthArray[i]] = null;
  276.             }
  277.         }
  278.     }
  279.     re = eval("/" + re + "/gi");
  280.     myPassword = myPassword.replace(re, "");
  281.     if (myPassword.length < 3) {
  282.         var pwdre = /password/gi;
  283.         if (original) {
  284.             if (pwdre.test(original)) {
  285.                 hasError = true;
  286.                 errorType = "pwdcontainspwdword";
  287.             }
  288.         }
  289.         if (fname) {
  290.             var fnamere = eval("/" + escapeRegEx(fname) + "/gi");
  291.             if (fnamere.test(original)) {
  292.                 hasError = true;
  293.                 errorType = "pwdcontainsfname";
  294.             }
  295.         }
  296.         if (lname) {
  297.             var lnamere = eval("/" + escapeRegEx(lname) + "/gi");
  298.             if (lnamere.test(original)) {
  299.                 hasError = true;
  300.                 errorType = "pwdcontainslname";
  301.             }
  302.         }
  303.         if (yid) {
  304.             var yidre = eval("/" + yid + "/gi");
  305.             if (yidre.test(original)) {
  306.                 hasError = true;
  307.                 errorType = "pwdcontainsyid";
  308.             }
  309.         }
  310.     } else {
  311.         if (fname != "" && myPassword.indexOf(fname) != -1) {
  312.             hasError = true;
  313.             errorType = "pwdcontainsfname";
  314.         }
  315.         if (lname != "" && myPassword.indexOf(lname) != -1) {
  316.             hasError = true;
  317.             errorType = "pwdcontainslname";
  318.         }
  319.         if (yid != "" && myPassword.indexOf(yid) != -1) {
  320.             hasError = true;
  321.             errorType = "pwdcontainsyid";
  322.         }
  323.         if (myPassword.indexOf(pwd) != -1) {
  324.             hasError = true;
  325.             errorType = "pwdcontainspwdword";
  326.         }
  327.     }
  328.     var myElementMsg = Y.one(obj[1] + "ErrorMsg");
  329.     var myParent = Y.one(obj[1] + "Field");
  330.     if (hasError === true) {
  331.         writeLog("error type: " + errorType);
  332.         handleError(myParent, myElementMsg, errorCode[errorType]);
  333.         writeLog("Found Error, final " + obj[0]);
  334.     } else {
  335.         clearError(myParent, myElementMsg);
  336.     }
  337.     return hasError;
  338. };
  339. escapeRegEx = function (text) {
  340.     return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  341. };
Add Comment
Please, Sign In to add comment