Advertisement
Guest User

Untitled

a guest
Sep 17th, 2010
2,708
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package
  2. {
  3.     import com.hurlant.crypto.hash.MD5;
  4.    
  5.     import flash.net.URLVariables;
  6.     import flash.utils.ByteArray;
  7.    
  8.     import mx.utils.Base64Decoder;
  9.     import mx.utils.Base64Encoder;
  10.    
  11.     import org.igniterealtime.xiff.auth.SASLAuth;
  12.     import org.igniterealtime.xiff.core.XMPPConnection;
  13.    
  14.     public class FacebookSaslAuth extends SASLAuth
  15.     {
  16.         public static const MECHANISM:String = "X-FACEBOOK-PLATFORM";
  17.        
  18.         public static const NS:String = "urn:ietf:params:xml:ns:xmpp-sasl";
  19.        
  20.         public static var apiKey:String;
  21.        
  22.         public static var sessionKey:String;
  23.        
  24.         // hardcode for now, can get it dynamically or something later
  25.         public static var fbApiSecret:String;
  26.        
  27.         public function FacebookSaslAuth(connection:XMPPConnection)
  28.         {
  29.             req.setNamespace( FacebookSaslAuth.NS );
  30.             req.@mechanism = FacebookSaslAuth.MECHANISM;
  31.            
  32.             stage = 0;
  33.         }
  34.        
  35.         /**
  36.          * <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
  37.          * dmVyc2lvbj0xJm1ldGhvZD1hdXRoLnhtcHBfbG9naW4mbm9uY2U9NDM0NkI5QkZDNUExNjBENDZBRjI1NzMyQUNGQzdDQzM=
  38.          * </challenge>
  39.          */
  40.         public override function handleChallenge(stage:int, challenge:XML):XML
  41.         {
  42.             var base64Challenge:String = challenge.text()[0].toString();
  43.             var decoder:Base64Decoder = new Base64Decoder();
  44.             decoder.decode(base64Challenge);
  45.             var byteArray:ByteArray = decoder.flush();
  46.             var decodedString:String = byteArray.toString();
  47.            
  48.             trace(decodedString);
  49.            
  50.             var urlVars:URLVariables = new URLVariables(decodedString);
  51.            
  52.             var responseUrlVars:URLVariables = new URLVariables();
  53.             responseUrlVars.api_key = apiKey;
  54.             responseUrlVars.call_id = Math.floor(new Date().valueOf() / 1000);
  55.             responseUrlVars.method = urlVars.method;
  56.             responseUrlVars.nonce = urlVars.nonce;
  57.             responseUrlVars.session_key = sessionKey;
  58.             responseUrlVars.v = "1.0";
  59.            
  60.             var sig:String =
  61.                 'api_key=' + responseUrlVars.api_key +
  62.                 'call_id=' + responseUrlVars.call_id +
  63.                 'method=' + responseUrlVars.method +
  64.                 'nonce=' + responseUrlVars.nonce +
  65.                 'session_key=' + responseUrlVars.session_key +
  66.                 'v=' + responseUrlVars.v +
  67.                 fbApiSecret;
  68.            
  69.             var sigBytes:ByteArray = new ByteArray();
  70.             sigBytes.writeUTFBytes(sig);
  71.            
  72.             var md5:MD5 = new MD5();
  73.             var hash:ByteArray = md5.hash(sigBytes);
  74.             hash.position = 0;
  75.             var hashStr:String = hash.toString();
  76.             responseUrlVars.sig = "";
  77.  
  78.             for(var x:Number = 0; x < hashStr.length; x++) {
  79.                 responseUrlVars.sig += hashStr.charCodeAt(x).toString(16);
  80.             }
  81.    
  82.             var responseString:String = responseUrlVars.toString();
  83.            
  84.             var encoder:Base64Encoder = new Base64Encoder();
  85.             encoder.encode(responseString);
  86.             var responseBase64:String = encoder.toString();
  87.            
  88.             var responseXML:XML =
  89.             <response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
  90.                 {responseBase64}
  91.             </response>;
  92.            
  93.             return responseXML;
  94.         }
  95.        
  96.         public override function handleResponse(stage:int, response:XML):Object
  97.         {
  98.             var success:Boolean = response.localName() == "success";
  99.             return {
  100.                 authComplete: true,
  101.                 authSuccess: success,
  102.                 authStage: stage++
  103.             };
  104.         }
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement