|
//
密码强度测试类核心JS脚本
var kNoCanonicalCounterpart = 0;
var kCapitalLetter = 0;
var kSmallLetter = 1;
var kDigit = 2;
var kPunctuation = 3;
var kAlpha = 4;
var kCanonicalizeLettersOnly = true;
var kCananicalizeEverything = false;
var gDebugOutput = null;
var kDebugTraceLevelNone = 0;
var kDebugTraceLevelSuperDetail = 120;
var kDebugTraceLevelRealDetail = 100;
var kDebugTraceLevelAll = 80;
var kDebugTraceLevelMost = 60;
var kDebugTraceLevelFew = 40;
var kDebugTraceLevelRare = 20;
var gDebugTraceLevel = kDebugTraceLevelNone;
function DebugPrint()
{
var string = "";
if (gDebugTraceLevel && gDebugOutput &&
DebugPrint.arguments && (DebugPrint.arguments.length >
1) && (DebugPrint.arguments[0] <=
gDebugTraceLevel))
{
for(var index = 1; index < DebugPrint.arguments.length;
index++)
{
string += DebugPrint.arguments[index] + " ";
}
string += "<br>\n";
gDebugOutput(string);
}
}
function CSimilarityMap()
{
this.m_elements = "";
this.m_canonicalCounterparts = "";
}
function SimilarityMap_Add(element, canonicalCounterpart)
{
this.m_elements += element;
this.m_canonicalCounterparts += canonicalCounterpart;
}
function SimilarityMap_Lookup(element)
{
var canonicalCounterpart = kNoCanonicalCounterpart;
var index = this.m_elements.indexOf(element);
if (index >= 0)
{
canonicalCounterpart =
this.m_canonicalCounterparts.charAt(index);
}
else
{
}
return canonicalCounterpart;
}
function SimilarityMap_GetCount()
{
return this.m_elements.length;
}
CSimilarityMap.prototype.Add = SimilarityMap_Add;
CSimilarityMap.prototype.Lookup = SimilarityMap_Lookup;
CSimilarityMap.prototype.GetCount = SimilarityMap_GetCount;
function CDictionaryEntry(length, wordList)
{
this.m_length = length;
this.m_wordList = wordList;
}
function DictionaryEntry_Lookup(strWord)
{
var fFound = false;
if (strWord.length == this.m_length)
{
var nFirst = 0;
var nLast = this.m_wordList.length - 1;
while( nFirst <= nLast )
{
var nCurrent = Math.floor((nFirst + nLast)/2);
if( strWord == this.m_wordList[nCurrent]) {
fFound = true;
break;
}
else if ( strWord > this.m_wordList[nCurrent])
{
nLast = nCurrent - 1;
}
else
{
nFirst = nCurrent + 1;
}
}
}
return fFound;
}
CDictionaryEntry.prototype.Lookup = DictionaryEntry_Lookup;
function CDictionary()
{
this.m_entries = new Array()
}
function Dictionary_Lookup(strWord)
{
for (var index = 0; index < this.m_entries.length;
index++)
{
if (this.m_entries[index].Lookup(strWord))
{
return true;
}
}
}
function Dictionary_Add(length, wordList)
{
var iL=this.m_entries.length;
var cD=new CDictionaryEntry(length, wordList)
this.m_entries[iL]=cD;
}
CDictionary.prototype.Lookup = Dictionary_Lookup;
CDictionary.prototype.Add = Dictionary_Add;
var gSimilarityMap = new CSimilarityMap();
var gDictionary = new CDictionary();
function CharacterSetChecks(type, fResult)
{
this.type = type;
this.fResult = fResult;
}
function isctype(character, type, nDebugLevel)
{
var fResult = false;
switch(type)
{
case kCapitalLetter:
if((character >= 'A') && (character <= 'Z'))
{
fResult = true;
}
break;
case kSmallLetter:
if ((character >= 'a') && (character <= 'z'))
{
fResult = true;
}
break;
case kDigit:
if ((character >= '0') && (character <= '9'))
{
fResult = true;
}
break;
case kPunctuation:
if ("!@#$%^&*()_+-='";:[{]}\|.>,</?`~".indexOf(character)
>= 0)
{
fResult = true;
}
break;
case kAlpha:
if (isctype(character, kCapitalLetter) || isctype(character,
kSmallLetter))
{
fResult = true;
}
break;
default:
break;
}
return fResult;
}
function CanonicalizeWord(strWord, similarityMap,
fLettersOnly)
{
var canonicalCounterpart = kNoCanonicalCounterpart;
var strCanonicalizedWord = "";
var nStringLength = 0;
if ((strWord != null) && (strWord.length > 0))
{
strCanonicalizedWord = strWord;
strCanonicalizedWord = strCanonicalizedWord.toLowerCase();
if (similarityMap.GetCount() > 0)
{
nStringLength = strCanonicalizedWord.length;
for(var index = 0; index < nStringLength; index++)
{
if (fLettersOnly &&
!isctype(strCanonicalizedWord.charAt(index), kSmallLetter,
kDebugTraceLevelSuperDetail))
{
continue;
}
canonicalCounterpart =
similarityMap.Lookup(strCanonicalizedWord.charAt(index));
if (canonicalCounterpart != kNoCanonicalCounterpart)
{
strCanonicalizedWord = strCanonicalizedWord.substring(0, index) +
canonicalCounterpart +
strCanonicalizedWord.substring(index + 1, nStringLength);
}
}
}
}
return strCanonicalizedWord;
}
function IsLongEnough(strWord, nAtLeastThisLong)
{
if ((strWord == null) || isNaN(nAtLeastThisLong))
{
return false;
}
else if (strWord.length < nAtLeastThisLong)
{
return false;
}
return true;
}
function SpansEnoughCharacterSets(strWord, nAtLeastThisMany)
{
var nCharSets = 0;
var characterSetChecks = new Array(
new CharacterSetChecks(kCapitalLetter, false),
new CharacterSetChecks(kSmallLetter, false),
new CharacterSetChecks(kDigit, false),
new CharacterSetChecks(kPunctuation, false)
);
if ((strWord == null) || isNaN(nAtLeastThisMany))
{
return false;
}
for(var index = 0; index < strWord.length; index++)
{
for(var nCharSet = 0; nCharSet <
characterSetChecks.length;nCharSet++)
{
if (!characterSetChecks[nCharSet].fResult &&
isctype(strWord.charAt(index), characterSetChecks[nCharSet].type,
kDebugTraceLevelAll))
{
characterSetChecks[nCharSet].fResult = true;
break;
}
}
}
for(var nCharSet = 0; nCharSet <
characterSetChecks.length;nCharSet++)
{
if (characterSetChecks[nCharSet].fResult)
{
nCharSets++;
}
}
if (nCharSets < nAtLeastThisMany)
{
return false;
}
return true;
}
function FoundInDictionary(strWord, similarityMap,
dictionary)
{
var strCanonicalizedWord = "";
if((strWord == null) || (similarityMap == null) || (dictionary
== null))
{
return true;
}
strCanonicalizedWord = CanonicalizeWord(strWord, similarityMap,
kCanonicalizeLettersOnly);
if (dictionary.Lookup(strCanonicalizedWord))
{
return true;
}
return false;
}
function IsCloseVariationOfAWordInDictionary(strWord, threshold,
similarityMap, dictionary)
{
var strCanonicalizedWord = "";
var nMinimumMeaningfulMatchLength = 0;
if((strWord == null) || isNaN(threshold) || (similarityMap ==
null) || (dictionary == null))
{
return true;
}
strCanonicalizedWord = CanonicalizeWord(strWord, similarityMap,
kCananicalizeEverything);
nMinimumMeaningfulMatchLength = Math.floor((threshold) *
strCanonicalizedWord.length);
for (var nSubStringLength = strCanonicalizedWord.length;
nSubStringLength >= nMinimumMeaningfulMatchLength;
nSubStringLength--)
{
for(var nSubStringStart = 0; (nSubStringStart +
nMinimumMeaningfulMatchLength) < strCanonicalizedWord.length;
nSubStringStart++)
{
var strSubWord = strCanonicalizedWord.substr(nSubStringStart,
nSubStringLength);
if (dictionary.Lookup(strSubWord))
{
return true;
}
}
}
return false;
}
function ClientSideStrongPassword()
{
return (IsLongEnough(ClientSideStrongPassword.arguments[0], "7")
&&
SpansEnoughCharacterSets(ClientSideStrongPassword.arguments[0],
"3") &&
(!(IsCloseVariationOfAWordInDictionary(ClientSideStrongPassword.arguments[0],
"0.6",
ClientSideStrongPassword.arguments[1],
ClientSideStrongPassword.arguments[2]))));
}
function ClientSideMediumPassword()
{
return (IsLongEnough(ClientSideMediumPassword.arguments[0], "7")
&&
SpansEnoughCharacterSets(ClientSideMediumPassword.arguments[0],
"2") &&
(!(FoundInDictionary(ClientSideMediumPassword.arguments[0],
ClientSideMediumPassword.arguments[1],
ClientSideMediumPassword.arguments[2]))));
}
function ClientSideWeakPassword()
{
return (IsLongEnough(ClientSideWeakPassword.arguments[0], "6")
||
(!(IsLongEnough(ClientSideWeakPassword.arguments[0], "0"))));
}
function GEId(sID){return document.getElementByIdx(sID);}
function
EvalPwdStrength(oF,sP){PadPasswd(oF,sP.length*2);if(ClientSideStrongPassword(sP,gSimilarityMap,gDictionary)){DispPwdStrength(3,'css0165');}else
if(ClientSideMediumPassword(sP,gSimilarityMap,gDictionary)){DispPwdStrength(2,'css0164');}else
if(ClientSideWeakPassword(sP,gSimilarityMap,gDictionary)){DispPwdStrength(1,'css0163');}else{DispPwdStrength(0,'css0162');}}function
SetPwdStrengthEx(oF,sP){EvalPwdStrength(oF,sP);if(ClientSideStrongPassword(sP,gSimilarityMap,gDictionary)){document.cookie="pwdstrength=3";}else
if(ClientSideMediumPassword(sP,gSimilarityMap,gDictionary)){document.cookie="pwdstrength=2";}else
if(ClientSideWeakPassword(sP,gSimilarityMap,gDictionary)){document.cookie="pwdstrength=1";}else{document.cookie="pwdstrength=0";}}function
SetPwdStrength(sP,oF){if(ClientSideStrongPassword(sP,gSimilarityMap,gDictionary)){oF.value
= 3;}else
if(ClientSideMediumPassword(sP,gSimilarityMap,gDictionary)){oF.value
= 2;}else
if(ClientSideWeakPassword(sP,gSimilarityMap,gDictionary)){oF.value
= 1;}else{oF.value = 0;}}function XPWCont(){if
(typeof(parent.opener.RegistrationFinishedCallback)!="undefined"){parent.opener.RegistrationFinishedCallback();}parent.close();}function
OnSigninSubmit(oF){if(g_fAS){return false;}if(typeof
oF!="object"){return false;}var
bL=true,bP=true,bI=true,bH=true;bL=Val(oF.login);var
sEM=oF.login.value;bL=ValEM(sEM);if(typeof
oF.passwd=="object"){bP=Val(oF.passwd);}if(typeof
oF.pin=="object"){bI=Val(oF.pin);}if(typeof
oF.HIPSolution=="object"){bH=Val(oF.HIPSolution);}if(!bL||!bP||!bI||!bH){var
fSF=true;var
aE=["i0518","i0519","i0512","i0527","i0545","i0562","i0517"];HDivs(aE);if(!bL){fSF=SwErr("i0519",oF.login,fSF)};if(!bI){fSF=SwErr("i0527",oF.pin,fSF)};if(!bH){fSF=SwErr("i0517",oF.HIPSolution,fSF)};if(!bP){fSF=SwErr("i0512",oF.passwd,fSF)};return
false;}if(typeof
oF.passwd=="object"){PadPasswd(oF,oF.passwd.value.length);}if(typeof
g_DO!="undefined"){var dom=sEM.substr(sEM.indexOf('@')+1);var
sU=g_DO[dom.toLowerCase()];if(sU){oF.action=sU;}}if(typeof
g_QS!="undefined"){if(g_QS){var
sS="&";if(oF.action.indexOf('?')==-1){sS="?";}if(oF.action.indexOf(g_QS)==-1){oF.action+=sS+g_QS;}}}g_fAS=true;oF.login.value=oF.login.value.toLowerCase();oF.submit();return
false;}function OnPadSubmit(oF){if(typeof
oF.CurrPW=="object"){PadPasswd(oF,oF.CurrPW.value.length);}oF.submit();return
false;}function OnPadSubmitWithAction(oF,szU){if(typeof
oF.CurrPW=="object"){PadPasswd(oF,oF.CurrPW.value.length);}return
OnSubmitWithAction(oF,szU);}function PadPasswd(oF,lPwd){if(typeof
oF.PwdPad=="object"){var
sPad="IfYouAreReadingThisYouHaveTooMuchFreeTime";var
lPad=sPad.length-lPwd;oF.PwdPad.value=sPad.substr(0,(lPad<0)?0:lPad);}}function
HDivs(aE){for(var i=0;i<aE.length;++i){var
o=GEId(aE[i]);if(o){o.style.display="none";}}}function
SwErr(sID,oFN,fSF){GEId(sID).style.display="block";if(fSF){oFN.focus();oFN.select();}return
false;
}
|