[Solved] Φόρτωση XML σε FMS Application

ActionScript και Flex Προγραμματισμός

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Φόρτωση XML σε FMS Application

Δημοσίευση από Cha0s » 08 Φεβ 2013 15:53

Προσπαθώ να φτιάξω ένα application για τον Flash Media Server όπου την ώρα που θα συνδέεται κάποιος πάνω στο service ανάλογα τι στοιχεία στέλνει (ως arguements στο FMS URL) τον κατατάσω σε 3 κατηγορίες.

PUBLISHER
VIEWER
WRONG USER/PASS

Ανάλογα την κατηγορία δίνω τα ανάλογα δικαιώματα ή κάνω reject το connection.


Αν το κάνω αυτό έχοντας καρφωτά το main.asc τα credentials δουλεύει μια χαρά.

Προσπαθώ τώρα να το πάω ένα βήμα παραπέρα και να κάνω το authentication μέσω PHP/MySQL ώστε να μπορώ να έχω τους users και ότι άλλα properties θέλω μέσα σε μία βάση για εύκολη διαχείριση και κυρίως για να μπορώ να αλλάζω users χωρίς να χρειάζεται reload όλο το appliaction (όπου θα κάνει disconnect όλους τους users).

Απότι διαβάζω στο documentation παίζουν 2 τρόποι να το κάνω αυτό.
Ο ένας με το XML Class και ο άλλος με το LoadVars Class.

Ο τρόπος λειτουργίας και των 2 είναι ίδιος (όσον αφορά το πρόβλημα που έχω).
Επέλεξα προς το παρόν να το κάνω με XML.

Έχω καταλήξει λοιπόν στον παρακάτω κώδικα.
Είναι η πρώτη φορά που γράφω actionscript, δεν έχω την παραμικρή ιδέα οπότε be gentle αν έχω κάνει καμιά χοντρή πατάτα :P

Κώδικας: Επιλογή όλων

application.onConnect = function(clientObj)
{

	//USER AUTHENTICATION SYSTEM START
	var username = "";
	var password = "";
	var clienturi = clientObj.uri; 
		
	var clientParams = new Array();
	clientParams = clienturi.split("?");
	var clientargs = clientParams[1];
	var uriargs = clientParams[0];
	
	//Extract user/pass
	var uripairs = new LoadVars();
    uripairs.decode(clientargs);
    for (var urip in uripairs) {
     	var urival = uripairs[urip];
        //trace("nv["+urip+"]=val["+urival+"]");
        if (urip.localeCompare("user")==0) {
        	username = urival;
        }else if (urip.localeCompare("pass")==0) {
        	password = urival;
        }
	}
	
	trace ("USERNAME SENT:"+username);
	trace ("PASSWORD SENT:"+password);

	//Extract channel name
	var uriParams = uriargs.split("/");
	var ChannelName = uriParams[4];
	
	trace ("CHANNEL NAME IS: "+ChannelName);


	// FETCH XML
	var login_str = "<login username=\""+username+"\" password=\""+password+"\" channel=\""+ChannelName+"\" />"; 
	var my_xml = new XML&#40;login_str&#41;; 
	var myLoginReply_xml = new XML&#40;&#41;;
	myLoginReply_xml.ignoreWhite = true; 
	myLoginReply_xml.onLoad = function&#40;success&#41;&#123;
		if &#40;success&#41; &#123; 
			phpauth = this.firstChild.firstChild.firstChild.nodeValue;
			trace &#40;"XML Fetched successfuly"&#41;;
		&#125;else&#123; 
			trace &#40;"XML connection failed"&#41;; 
		&#125; 
	&#125;; 
	my_xml.sendAndLoad&#40;"http&#58;//somehost/some.php", myLoginReply_xml&#41;;	


	if &#40; phpauth == "PUBLISHER" &#41;&#123;
		//Consider client a publisher so give full rights
		trace&#40;"PUBLISHER "+username+" FOR CHANNEL "+ChannelName+" CONNECTED FROM IP "+clientObj.ip &#41;;
		clientObj.readAccess = "/";
		clientObj.writeAccess = "/";
	&#125;else if &#40; phpauth == "VIEWER" &#41;&#123; 
		//Consider client a simple viewer so drop all write rights
		trace&#40;"VIEWER CONNECTED FROM IP "+clientObj.ip+" FOR CHANNEL "+ChannelName+". REFERRER&#58; "+clientObj.referrer &#41;;
		clientObj.readAccess = "/";
		clientObj.writeAccess = "";
	&#125;else if &#40; phpauth == "WRONG CREDENTIALS" &#41;&#123; 
		//Wrong credentials supplied so reject connection.
		trace &#40;"REJECTED PUBLISHER "+username+" FOR CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". WRONG USER/PASS"&#41;;
		err.message = "Wrong user/pass";
        application.rejectConnection&#40;clientObj, err&#41;;
	&#125;else&#123;
		//PHP Script replied with no or unknown value so rejecting connection.
		trace &#40;"UNKNOWN USER MODE FOR CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". REJECTED"&#41;;
		var err = new Object&#40;&#41;;
        err.message = "Malformed connection";
        application.rejectConnection&#40;clientObj, err&#41;;
	&#125;	
		
	trace&#40;"TOTAL USERS CONNECTED&#58; " +application.clients.length&#41;;	
		
	application.acceptConnection&#40;clientObj&#41;;

&#125;
Το πρόβλημα με τον παραπάνω κώδικα είναι ότι επειδή η XML.SendAndLoad() τρέχει ασύγχρονα δεν προλαβαίνει να γίνει set η phpauth variable οπότε το if else που έχω για να κάνω τους ελέγχους μου δεν παίζει, πάει πάντα στο else.

Καμιά ιδέα πως να το κάνω να περιμένει να λάβει πρώτα το αποτέλεσμα από το XML πριν μπει στο if else;


Εναλλακτικά αν βάλω τους ελέγχους μου εντός του xml.onLoad = function(success){ τότε η phpauth περιέχει τα δεδομένα την στιγμή που τα τραβάει από το PHP Script/XML αλλά δεν περνάει μέσα το clientObj, οπότε πρακτικά δεν μπορώ να κάνω accept/reject τους clients.

Έτσι δηλαδή:

Κώδικας: Επιλογή όλων

application.onConnect = function&#40;clientObj&#41;
&#123;

	//USER AUTHENTICATION SYSTEM START
	var username = "";
	var password = "";
	var clienturi = clientObj.uri; 
		
	var clientParams = new Array&#40;&#41;;
	clientParams = clienturi.split&#40;"?"&#41;;
	var clientargs = clientParams&#91;1&#93;;
	var uriargs = clientParams&#91;0&#93;;
	
	//Extract user/pass
	var uripairs = new LoadVars&#40;&#41;;
    uripairs.decode&#40;clientargs&#41;;
    for &#40;var urip in uripairs&#41; &#123;
     	var urival = uripairs&#91;urip&#93;;
        //trace&#40;"nv&#91;"+urip+"&#93;=val&#91;"+urival+"&#93;"&#41;;
        if &#40;urip.localeCompare&#40;"user"&#41;==0&#41; &#123;
        	username = urival;
        &#125;else if &#40;urip.localeCompare&#40;"pass"&#41;==0&#41; &#123;
        	password = urival;
        &#125;
	&#125;
	
	trace &#40;"USERNAME SENT&#58;"+username&#41;;
	trace &#40;"PASSWORD SENT&#58;"+password&#41;;

	//Extract channel name
	var uriParams = uriargs.split&#40;"/"&#41;;
	var ChannelName = uriParams&#91;4&#93;;
	
	trace &#40;"CHANNEL NAME IS&#58; "+ChannelName&#41;;


	// FETCH XML
	var login_str = "<login username=\""+username+"\" password=\""+password+"\" channel=\""+ChannelName+"\" />"; 
	var my_xml = new XML&#40;login_str&#41;; 
	var myLoginReply_xml = new XML&#40;&#41;;
	myLoginReply_xml.ignoreWhite = true; 
	myLoginReply_xml.onLoad = function&#40;success&#41;&#123;
		if &#40;success&#41; &#123; 
			phpauth = this.firstChild.firstChild.firstChild.nodeValue;
			trace &#40;"XML Fetched successfuly"&#41;;
			

			if &#40; phpauth == "PUBLISHER" &#41;&#123;
				//Consider client a publisher so give full rights
				trace&#40;"PUBLISHER "+username+" FOR CHANNEL "+ChannelName+" CONNECTED FROM IP "+clientObj.ip &#41;;
				clientObj.readAccess = "/";
				clientObj.writeAccess = "/";
			&#125;else if &#40; phpauth == "VIEWER" &#41;&#123; 
				//Consider client a simple viewer so drop all write rights
				trace&#40;"VIEWER CONNECTED FROM IP "+clientObj.ip+" FOR CHANNEL "+ChannelName+". REFERRER&#58; "+clientObj.referrer &#41;;
				clientObj.readAccess = "/";
				clientObj.writeAccess = "";
			&#125;else if &#40; phpauth == "WRONG CREDENTIALS" &#41;&#123; 
				//Wrong credentials supplied so reject connection.
				trace &#40;"REJECTED PUBLISHER "+username+" FOR CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". WRONG USER/PASS"&#41;;
				err.message = "Wrong user/pass";
				application.rejectConnection&#40;clientObj, err&#41;;
			&#125;else&#123;
				//PHP Script replied with no or unknown value so rejecting connection.
				trace &#40;"UNKNOWN USER MODE FOR CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". REJECTED"&#41;;
				var err = new Object&#40;&#41;;
				err.message = "Malformed connection";
				application.rejectConnection&#40;clientObj, err&#41;;
			&#125;	
				
			trace&#40;"TOTAL USERS CONNECTED&#58; " +application.clients.length&#41;;	
				
			application.acceptConnection&#40;clientObj&#41;;			
			
			
			
		&#125;else&#123; 
			trace &#40;"XML connection failed"&#41;; 
		&#125; 
	&#125;; 
	my_xml.sendAndLoad&#40;"http&#58;//somehost/some.php", myLoginReply_xml&#41;;	

&#125;

Καμιά ιδέα πως να περάσω το clientObj μέσα στην onLoad() ώστε να μπορώ να κουμαντάρω τα connections;


Μπορεί να είμαι και σε εντελώς λάθος δρόμο για το πως πάω να το υλοποιήσω.
Κάθε βοήθεια/κατεύθυνση δεκτή :)


PS: Το xml που κάνω post και παίρνω την απάντηση από την PHP, ξέρω ότι είναι λίγο ότι νάναι.
Δεν με καίει ιδιαίτερα σε πρώτη φάση αυτό, θα το σουλουπώσω αργότερα, εκτός αν παίζει με κάποιο τρόπο ρόλο στην λειτουργία του script.
Τελευταία επεξεργασία από το μέλος Cha0s την 09 Φεβ 2013 16:10, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[Solved] Φόρτωση XML σε FMS Application

Δημοσίευση από Cha0s » 09 Φεβ 2013 16:08

Δεν ξέρω πως/γιατί μου δούλεψε, αλλά με την παρακάτω υλοποίηση, μου παίζει μια χαρά!

Παραθέτω τον κώδικα. Αν κάποιος τον βρει χρήσιμο μπορεί να τον χρησιμοποιήσει ελεύθερα :)

Κώδικας: Επιλογή όλων

application.onConnect = function&#40;clientObj&#41;
&#123;
	
	//USER AUTHENTICATION SYSTEM START
	
	//Drop all privileges until authentication is done
	clientObj.readAccess = "";
	clientObj.writeAccess = "";
	
	var username = "";
	var password = "";
	var clienturi = clientObj.uri; 
	var clientid = clientObj.id;
		
	var clientParams = new Array&#40;&#41;;
	clientParams = clienturi.split&#40;"?"&#41;;
	var clientargs = clientParams&#91;1&#93;;
	var uriargs = clientParams&#91;0&#93;;
	
	//Extract user/pass
	var uripairs = new LoadVars&#40;&#41;;
    uripairs.decode&#40;clientargs&#41;;
    for &#40;var urip in uripairs&#41; &#123;
     	var urival = uripairs&#91;urip&#93;;
        //trace&#40;"nv&#91;"+urip+"&#93;=val&#91;"+urival+"&#93;"&#41;;
        if &#40;urip.localeCompare&#40;"user"&#41;==0&#41; &#123;
        	username = urival;
        &#125;
        else if &#40;urip.localeCompare&#40;"pass"&#41;==0&#41; &#123;
        	password = urival;
        &#125;
	&#125;
	
	//Extract channel name
	var uriParams = uriargs.split&#40;"/"&#41;;
	var ChannelName = uriParams&#91;4&#93;;
	
	
	var my_lv = new LoadVars&#40;&#41;; 
	my_lv.username = username;
	my_lv.password = password;
	my_lv.channel  = ChannelName;
	
	var my_lv_return = new LoadVars&#40;&#41;; 
	my_lv_return.onLoad = function&#40;success&#41;&#123;
	
		if &#40;success&#41; &#123; 
			
			phpauth = this.status;

			if &#40; phpauth == "publisher" &#41;&#123;
				trace&#40;"PUBLISHER "+username+" FOR CHANNEL "+ChannelName+" CONNECTED FROM IP "+clientObj.ip &#41;;
				clientObj.readAccess = "/";
				clientObj.writeAccess = "/";
			&#125;else if &#40; phpauth == "viewer" &#41;&#123; 
				trace&#40;"VIEWER CONNECTED FROM IP "+clientObj.ip+" FOR CHANNEL "+ChannelName+". REFERRER&#58; "+clientObj.referrer &#41;;
				clientObj.readAccess = "/";
				clientObj.writeAccess = "";
			&#125;else if &#40; phpauth == "denied" &#41;&#123; 
				trace &#40;"REJECTED PUBLISHER "+username+" FOR CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". WRONG USER/PASS"&#41;;
				var err = new Object&#40;&#41;;
				err.message = "Wrong user/pass";
				application.rejectConnection&#40;clientObj, err&#41;;
			&#125;else if &#40; phpauth == "wrongchannel" &#41;&#123; 
				trace &#40;"INVALID CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". WRONG CHANNEL"&#41;;
				var err = new Object&#40;&#41;;
				err.message = "Invalid Channel Name";
				application.rejectConnection&#40;clientObj, err&#41;;
			&#125;else&#123;
				trace &#40;"UNKNOWN USER MODE FOR CHANNEL "+ChannelName+" FROM IP "+clientObj.ip+". REJECTED"&#41;;
				var err = new Object&#40;&#41;;
				err.message = "Malformed connection";
				application.rejectConnection&#40;clientObj, err&#41;;
			&#125;				
			
			//FINALLY - ACCEPT CONNECTION!
			application.acceptConnection&#40;clientObj&#41;;						
			
		&#125; else &#123; 
			trace &#40;"ERROR CONTACTING AUTH SERVER FOR CHANNEL "+ChannelName+" FOR USER FROM IP "+clientObj.ip+". TEMPORARY ERROR"&#41;;
			var err = new Object&#40;&#41;;
        	err.message = "Could not contact authentication server. Please try again.";
        	application.rejectConnection&#40;clientObj, err&#41;;
		&#125;
	
	&#125;; 
	
	//Call PHP script.
	my_lv.sendAndLoad&#40;"http&#58;//example.com/fms.php", my_lv_return&#41;;	
	
	// USER AUTHENTICATION SYSTEM END

&#125;

Απάντηση

Επιστροφή στο “ActionScript και Flex Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες