0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
private function formatResponse( map:Dictionary ):String
{
// В этой функции было больше строчек, я оставил только те, где используется map
ha1_1.writeUTFBytes( map.username + ":" + map.realm + ":" + password );
ha1_2.writeUTFBytes( ":" + map.nonce + ":" + map.cnonce );
ha2.writeUTFBytes( "AUTHENTICATE:" + map[ "digest-uri" ] );
b.writeUTFBytes( sha1 + ":" + map.nonce + ":" + map.nc + ":" + map.cnonce + ":" + map.qop + ":" + sha2 );
return Hex.fromArray( b );
}
override public function handleChallenge( stage:int, challenge:XML ):XML
{
var decodedChallenge:String = Base64.decode( challenge );
var challengeKeyValuePairs:Array = decodedChallenge.replace( /\"/g, "").split( "," );
var challengeMap:Dictionary = new Dictionary();
for each( var keyValuePair:String in challengeKeyValuePairs )
{
var keyValue:Array = keyValuePair.split( "=" );
challengeMap[ keyValue[ 0 ] ] = keyValue[ 1 ];
}
var resp:XML = new XML( response );
resp.setNamespace( DigestMD5.NS );
if( !challengeMap.rspauth )
{
var responseMap:Dictionary = new Dictionary();
responseMap.username = connection.username;
responseMap.realm = challengeMap.realm ? challengeMap.realm : "";
responseMap.nonce = challengeMap.nonce;
responseMap.cnonce = new Date().time;
responseMap.nc = "00000001";
responseMap.qop = challengeMap.qop ? challengeMap.qop : "auth";
responseMap[ "digest-uri" ] = "xmpp/" + ( challengeMap.realm ? challengeMap.realm : connection.domain );
responseMap.charset = challengeMap.charset;
responseMap.response = formatResponse( responseMap );
var challengeResponse:String = "username=\"" + responseMap.username + "\"";
if( challengeMap.realm ) challengeResponse += ",realm=\"" + responseMap.realm + "\"";
challengeResponse += ",nonce=\"" + responseMap.nonce + "\"";
challengeResponse += ",cnonce=\"" + responseMap.cnonce + "\"";
challengeResponse += ",nc=" + responseMap.nc;
challengeResponse += ",qop=" + responseMap.qop;
challengeResponse += ",digest-uri=\"" + responseMap[ "digest-uri" ] + "\"";
challengeResponse += ",response=" + responseMap.response;
challengeResponse += ",charset=" + responseMap.charset;
challengeResponse = Base64.encode( challengeResponse );
resp.setChildren( challengeResponse );
}
return resp;
}
Тут довольно много читать, но если вы не побоитесь и все же осилите, то откроете для себя еще один уголок прекрасного. Часть кода из первой функции вырезана т.как приниципиального значения не имела. Код явно переписан с чего-то похожего на Java человеком который ни разу не открыл маны по AS3.
Целиком обозреть бессмертное творение можно тут: http://fisheye.igniterealtime.org/browse/~raw,r=12385/sparkweb/trunk/SparkWeb2/src/org/igniterealtime/xiff/auth/DigestMD5.as
Запостил:
wvxvw ,
27.06.2011 (Updated 25.03.2018 )
Govno же