Par défaut, le moteur d’exécution recherche un fichier de régulation socket transmis à partir du port 843. Comme dans le cas des fichiers de régulation d’URL, ce fichier est appelé
Fichier de régulation maître
.
Lors de l’introduction des fichiers de régulation dans Flash Player 6, les fichiers socket n’étaient pas pris en charge. Les connexions aux serveurs socket étaient autorisées par un fichier de régulation figurant à l’emplacement par défaut sur un serveur HTTP à condition d’utiliser le port 80 du même hôte que le serveur socket. Flash Player 9 prend toujours cette fonctionnalité en charge mais ce n’est pas le cas de Flash Player 10. Dans Flash Player 10, seuls les fichiers de régulation socket peuvent autoriser les connexions socket.
A l’instar des fichiers de régulation d’URL, les fichiers de régulation socket prennent en charge une instruction de méta-régulation qui identifie les ports dédiés aux fichiers de régulation. La méta-régulation des fichiers de régulation socket est définie sur « all », plutôt que sur « master-only ». Par conséquent, à moins qu’un paramètre plus restrictif soit défini dans le fichier de régulation maître, Flash Player considère comme acquis que n’importe quel socket de l’hôte peut servir un fichier de régulation socket.
L’accès aux connexions socket et socket XML est désactivé par défaut, même si le socket auquel vous vous connectez se trouve dans le même domaine que le fichier SWF. Vous pouvez autoriser l’accès de niveau socket en servant un fichier de régulation socket à partir d’un des emplacements suivants :
-
Le port 843 (emplacement du fichier de régulation maître)
-
Le même port que la connexion socket principale
-
Un autre port que la connexion socket principale
Par défaut, Flash Player recherche un fichier de régulation socket sur le port 843 et sur le même port que la connexion socket principale. Si vous souhaitez servir un fichier de régulation socket à partir d’un autre port, le fichier SWF doit appeler
Security.loadPolicyFile()
.
La syntaxe d’un fichier de régulation socket est identique à celle d’un fichier de régulation d’URL, à la différence qu’elle doit aussi spécifier les ports accessibles. Un fichier de régulation socket servi via un port dont le numéro est inférieur à 1024 peut autoriser l’accès à tous les ports. Un fichier de régulation transmis via le port 1024 ou supérieur ne peut définir l’accès qu’au port 1024 et aux ports supérieurs. Les ports accessibles sont spécifiés par l’attribut
to-ports
dans la balise
<allow-access-from>
. Il est possible d’utiliser des numéros de ports, des plages de ports et des caractères génériques.
Voici un exemple de fichier de régulation socket :
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.example.com" to-ports="507,516" />
<allow-access-from domain="*.example.org" to-ports="516-523" />
<allow-access-from domain="adobe.com" to-ports="507,516-523" />
<allow-access-from domain="192.0.34.166" to-ports="*" />
</cross-domain-policy>
Pour récupérer un fichier de régulation socket sur le port 843 ou sur le même port que la connexion socket principale, appelez la méthode
Socket.connect()
ou
XMLSocket.connect()
. Flash Player recherche d’abord un fichier de régulation maître sur le port 843. S’il en trouve un, il vérifie s’il contient une instruction de méta-régulation interdisant les fichiers de régulation socket sur le port cible. Si l’accès n’est pas interdit, Flash Player recherche l’instruction
allow-access-from
appropriée dans le fichier de régulation maître. En l’absence d’une telle instruction, il recherche un fichier de régulation sur le même port que la connexion socket principale.
Pour récupérer un fichier de régulation socket à un autre emplacement, appelez d’abord la méthode
Security.loadPolicyFile()
en utilisant la syntaxe
"xmlsocket"
spéciale, comme illustré ci-dessous :
Security.loadPolicyFile("xmlsocket://server.com:2525");
Appelez la méthode
Security.loadPolicyFile()
avant d’appeler
Socket.connect()
ou
XMLSocket.connect()
. Flash Player peut alors attendre le retour de votre requête de fichier de régulation avant de décider ou non d’autoriser la connexion principale. Cependant, si le fichier de régulation maître spécifie que l’emplacement cible ne peut pas servir des fichiers de régulation, l’appel à
loadPolicyFile()
est sans effet, même si un fichier de régulation se trouve à l’emplacement en question.
Si vous implémentez un serveur socket et que vous devez fournir un fichier de régulation socket, vous devez choisir entre fournir le fichier de régulation sur le port qui accepte les connexions principales et utiliser un autre port. Dans les deux cas, votre serveur doit attendre la première transmission en provenance de votre client avant d’envoyer une réponse.
Lorsque Flash Player demande un fichier de régulation, il transmet toujours la chaîne suivante dès que la connexion est établie :
<policy-file-request/>
Une fois que le serveur a reçu la chaîne, il peut transmettre le fichier de régulation. La requête émise par Flash Player se termine toujours par un octet nul et la réponse du serveur doit se terminer de même.
N’envisagez pas d’utiliser la même connexion pour la requête de fichier de régulation et pour la connexion principale. Vous devez fermer la connexion une fois le fichier de régulation transmis. A défaut, Flash Player ferme la connexion du fichier de régulation, puis établit une autre connexion pour la connexion principale.