Ajouter un utilisateur sur un serveur ftp filezilla

Contenu du snippet

Bonjour a tous!
Il y a longtemps que je n'ai pas posté de code ici, mais je me suis dit que celui-ci pourrait être utile à certaines personnes..

Alors voila cest un code sans prétention qui sert à ajouter un utilisateur sur son serveur filezilla perso. Il suffit d'appeler la fonction en spécifiant le nom d'utilisateur, son repertoire , ses droits sur le repertoire et son mot de passe.

Le principe est simple , on se connecte au serveur FTP via le port d'administration (14147 par défaut) et on crée l'utilisateur.

Bien que le code soit simple, ça m'a pris un moment pour réussir à le faire puisque le protocol de communication de l'interface de gestion de filezilla n'est pas documenté.

Après avoir survoler le code source du serveur, armé de mon fidèle sniffer de paquets et de patience, j'ai décortiqué le protocol afin de pondre cette source qui je l'espere, vous seras utile.

Qu'est-ce que FileZilla Server?

FileZilla est le nom d'un client FTP open source très connu. C'est égallement le nom d'un serveur FTP leger et robuste pour windows.

Tester avec FileZilla Server 0.9.23

Source / Exemple :


<?php
if (create_ftpuser('username', 'password', 'C:\\path', $droit='239')) echo 'OK';

function create_ftpuser($username, $password, $path, $permissions='239') {
	if ($socket = fsockopen('127.0.0.1', '14147', $errno, $errstr, 10)) {
		$ConnectionState=1;
		while ($readString .= fread($socket,8192)) {
			switch ($ConnectionState) {
				case 1:
					if (substr($readString,0,3) == 'FZS') {
						$ConnectionState = 2;
						fputs($socket, bytes2string(array(8,0,0,0,0,12,1,0,0,0,0)));
					}
					$readString='';
					break;

				case 2:
					switch(ord($readString[0])) {
						case 33:
							fputs($socket, bytes2string(array(32,0,0,0,0)));
							break;
							
						case 9:
							fputs($socket, bytes2string(array(24,0,0,0,0)));
							$ConnectionState=3;
							break;
					}
					$readString='';
					break;
					
				case 3:
					switch(ord($readString[0])) {
						case 25:
							if (strlen($readString) == ((ord(substr($readString,2,1)) * 256) + ord(substr($readString,1,1)) + 5)) {
								$password= md5($password);
								$readString = substr($readString,4);
								$datass='';
								echo '<b>Nombre de comptes sur le serveur FTP: '.ord(substr($readString,4,1)).'</b><br>';
								$datass = bytes2string(array(0,0,0,ord(substr($readString,4,1))+1)).substr($readString,5);
								$datass.= bytes2string(array(0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,1,0,strlen($chemin))).$chemin;
								$datass.= bytes2string(array(0,0,1,$droit,0,0,10,0,0,0,0,10,0,0,0,0,0,0,strlen($pseudo)));
								$datass.= $pseudo.bytes2string(array(0, strlen($password))).$password;
								fputs($socket,create_request($datass,'24'));
								$ConnectionState=4;
								echo strlen($readString);
								$readString='';
							}
							break;
					}
					break;
					
				case 4:
					switch(ord($readString[0])) {
						case 25:
							fclose($socket);
							return true;
							break;
					}
					$readString='';
					break;
			}
		}
	}
	fclose($socket);
	return false;
}

function bytes2string($data) {
	$retour = '';
	if (is_array($data)) {
		foreach ($data as $char) {
			$retour .= chr($char);
		}
	}
	return $retour;
}

function create_request($data,$commande) {
	$req = chr($commande);
	if (strlen($data)>255) {
		$var1 = (strlen($data)/256);
		$var1 = substr($var1,0,strpos($var1,'.') );
		$var2 = (strlen($data)-($var1*256));
		$req .=chr($var2).chr($var1);
		$req .=chr(0).chr(0);
	} else {
		$var1 = (strlen($data)-($var1*256));
		$req .=chr($var1).chr(0);
		$req .=chr(0).chr(0);
	}
	$req .= $data;
	return $req;
}
?>

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.