- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
guest 27.06.2011 15:19 # 0
Govno же
guest8 08.04.2019 21:01 # −999
guest8 09.04.2019 11:05 # −999
guest8 09.04.2019 18:09 # −999
111111 24.08.2021 20:56 # 0