Accueil > > > SERVEUR FTP
SERVEUR FTP
Information sur la source
Description
ceci est un serveur FTP en mirc script tout se passe avec une seulle et unique commande: /wbs.ftpserver notation: je notre entre () les parametres optionels et entre [] les obligatoires partager un répertoire: /wbs.ftpserver add [login] [pass] (folder) si (folder) n'est pas spécifié alors une fenetre de selection de répertoire ($sdir) s'ouvrira. demarer le serveur: /wbs.ftpserver start stoper le serveur: /wbs.ftpserver stop status du serveur: /wbs.ftpserver status lister les partages: /Wbs.ftpserver list avoir uen aide sommaire: /wbs.ftpserver (help)
Source
- ;Socknames:
- ;listen: wbs.ftpserver
- ;com: wbs.ftpserver.[client-ip]
- ;data: wbs.ftpserver@[client-ip]
-
- on *:load:{
- if ($version < 6.35) {
- wecho $sname error: Woops ! your version of mirc is $version but 6.35 or newer is needed !!! sorry but i cant work
- aptitude remove $sname
- }
- else {
- writeini $wcfg $sname enable 0
- writeini $wcfg $sname maxco 2
- writeini $wcfg $sname port 21
- writeini $wcfg $sname nopasv 0
- writeini $wcfg $sname quiet 1
- writeini $wcfg $sname pasv-range 1000 1010
- wecho $sname info: to specify manualy the ip of the server you can type:
- wecho $sname info: //writeini $wcfg $sname serverip [your IP]
- wecho $sname info: dont forget to redirect/open ports on you're router/firewall
- }
- }
-
- on *:unload:{
- if ($sock($sname)) wbs.ftpserver stop
- remove $wcfg
- }
-
- alias -l sname return wbs.ftpserver
-
- on *:start:{
- if ($readini($wcfg,$sname,enable)) socklisten $sname $iif($readini($wcfg,$sname,port),$v1,21)
- }
-
- alias wbs.ftpserver {
- wecho $sname $iif($1-,$v1,help)
- if ($1 == start) {
- if ($sock($sname)) wecho $sname error: server is already started
- else {
- writeini $wcfg $sname enable 1
- socklisten $sname $iif($readini($wcfg,$sname,port),$v1,21)
- wecho $sname server started
- }
- }
- elseif ($1 == stop) {
- if (!$sock($sname)) wecho $sname error: server is not started
- else {
- writeini $wcfg $sname enable 0
- sockclose $+($sname,*)
- wecho $sname server stoped
- }
- }
- elseif ($1 == status) wecho $sname Server is curently $iif($sock($sname),started,stoped)
- elseif ($1 == close) {
- if (!$2) wecho $sname error: this function need the ip as argument.
- elseif ($sock($+($sname,.,$2))) sockclose $v1
- else wecho $sname error: stop $qt($2) : invalid ip
- }
- elseif ($1 == add) {
- if ((!$4) && ($3)) tokenize 32 $1- $$sfile($mircdir)
- if (!$4) wecho $sname error: syntax: /wbs.ftpserver add [login] [pass] [folder]
- elseif (!$exists($4-)) wecho $sname error: directory dosent exists
- else {
- writeini $wcfg wbs.ftpserver.shares $+($2,@,$3) 0 0 $noqt($4-)
- wecho $sname Successfuly added with permision: read only, to edit: /wbs.ftpserver chmod $+($2,@,$3) rw.
- }
- }
- elseif ($1 == chmod) wecho $sname info: todo
- elseif ($1 == list) {
- var %n = $sock($sname $+ .*,0)
- if (!%n) wecho $sname No open socket.
- else {
- wecho $sname open connection(s): %n
- while (%n) {
- wecho $sname ip: $sock($sname $+ .*,%n).ip $+ : $+ $sock($sname $+ .*,%n).port
- dec %n
- }
- }
- }
- elseif ((!$1) || ($1 == help)) {
- wecho $sname help for $sname
- wecho $sname availables commands are:
- wecho $sname start - start the ftp server
- wecho $sname stop - stop the ftp server
- wecho $sname add [login] [pass] (folder) - add the folder in sharinf for user [login]
- wecho $sname list - list all open connection for the ftp server
- wecho $sname close [ip] - close the specified [IP]
- }
- else wecho $sname error: unknow command : $qt($1)
- }
-
- on *:socklisten:wbs.ftpserver:{
- var %ip = $iif($sock($sockname).ip,$v1,127.0.0.1) , %sockname = $+(wbs.ftpserver.,%ip)
- if ($sock(%sockname)) {
- sockwrite -n %sockname 500 You are trying to reconnect on the server but just one connection is allowed per ip : closing this one: now !
- sockclose %sockname
- }
- sockaccept %sockname
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,new connection from $sock($sockname).ip on port $sock($sockname).port)
- sockwrite -n %sockname 220 $sname FTP server ready
- }
-
- on *:sockopen:wbs.ftpserver.*:{
- if ($hget($sockname)) hfree $sockname
- }
- on *:sockread:wbs.ftpserver.*:{
- var %buffer
- sockread -f %buffer
- wbs.ftpserver.events %buffer
- }
-
- on *:sockclose:wbs.ftpserver.*:{
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,connection closed for $sock($sockname).ip)
- if ($hget($sockname)) hfree $sockname
- }
-
- alias wbs.ftpserver.events {
- if (!$1) return
- elseif ($1 == USER) {
- hadd -m $sockname login $2
- sw 331 Password required for $sname
- }
- elseif ($1 == PASS) {
- var %data = $readini($wcfg,wbs.ftpserver.shares,$+($hget($sockname,login),@,$2))
- if (!%data) {
- noop $tip($sname,$sname,Bad login form $sock($sockname).ip : $2)
- sockloose
- }
- else {
- hadd -m $sockname auth 1
- hadd $sockname root $noqt($gettok(%data,3-,32))
- hadd $sockname pwd /
- hadd $sockname serverip $iif($sock($sockname).ip == $ip,127.0.0.1,$sock($sockname).ip)
- hadd $sockname writeperm $gettok(%data,2,32)
- if ($readini($wcfg,$sname,serverip)) hadd $sockname serverip $v1
- writeini $wcfg wbs.ftpserver.shares $+($hget($sockname,login),@,$2) $calc($gettok(%data,1,32) +1) $gettok(%data,2-,32)
- sw 230 Ok
- }
- }
- elseif ($1 == QUIT) {
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,$sock($sockname).ip has quit.)
- sockloose
- }
- elseif ($1 == FEAT) sw 211 SIZE REST
- else {
- if (!$hget($sockname,auth)) sockloose
- elseif (.. isin $hget($sockname,pwd)) sockloose
- elseif ($1 == NOOP) sw 200 NOOP command successful
- elseif ($1 == SYST) sw 215 UNIX Type: L8
- elseif ($1 == PWD) sw 257 $+(",$hget($sockname,pwd),") is current directory.
- elseif ($1 == CDUP) {
- var %pwd = $hget($sockname,pwd)
- if (%pwd == /) sw 500 You are already at the root.
- elseif ($2) sw 500 Too many argument.
- else {
- hadd $sockname pwd $deltok(%pwd,-1,47)
- sw 250 CWD command successful.
- }
- }
- elseif ($1 == DELE) {
- var %file = $qt($+($hget($sockname,root),$hget($sockname,pwd),$2-))
- echo -a %file
- if (!$hget($sockname,writeperm)) sw 500 You dont have the permission to do that !
- elseif (!$2) sw 500 This function need a argument (the filename).
- elseif (!$exists(%file)) sw 500 The target dosent exists.
- elseif ((/../ isin $2-) || (\..\ isin $2-)) sw 500 Hacking attemp detected: abord
- else {
- .remove %file
- sw 250 Ok
- }
- }
- elseif ($1 == REST) {
- if (!$2) sw 500 Missing argument
- elseif ($2 !isnum) sw 500 Invalid argument: must be a int
- else {
- hadd $sockname filepos $2
- sw 226 ready to resume transfer at position $2
- }
- }
- elseif ($1 == TYPE) {
- if (!$istok(A;I,$2,59)) sw 500 Invalid type: must be A or I
- else {
- hadd $sockname type $2
- sw 200 Type set to $2
- }
- }
- elseif ($1 == CWD) {
- var %target = $strip($2-) , %cdir = $hget($sockname,pwd) , %path = $+($hget($sockname,root),%cdir,$iif($right(%cdir,1) != /,/),%target))
- if ($left(%target,1) == /) var %path = $+($hget($sockname,root),%target)
- if (%target == /) {
- hadd $sockname pwd /
- sw 250 command successful.
- return
- }
- if (!%target) sw 500 Missing argument
- elseif (!$exists(%path)) sw 500 Invalid argument: directory dosent exists.
- elseif ((/../ isin %target) || (\..\ isin %target)) sw 500 Hacking attemp detected: abord
- else {
- if ($left($2,1) != /) hadd $sockname pwd $replace(/ $+ %cdir $+ $nopath($2-) $+ /,//,/)
- else hadd $sockname pwd $2-
- sw 250 CWD command successful.
- }
- }
- elseif ($1 == PASV) {
- if ($readini($wcfg,$sname,nopasv)) sw 550 Command disabled in server config file.
- else {
- var %sockname = $+($sname,@,$sock($sockname).ip) , %secure = 100
- if ($readini($wcfg,$sname,pasv-range)) {
- tokenize 32 $v1
- if (!$2) %port = $1
- else {
- var %port = $r($1,$2)
- while ((!$portfree(%port)) && (%secure)) {
- var %port = $r($1,$2)
- dec %secure
- }
- if (!%secure) {
- wecho $sname error: unable to get a port in range $1- : set a larger plage of port in portrange.
- sw 500 Internal server error: cannot found a port free on the server side.
- return
- }
- }
- var %p1 = $int($calc(%port / 256)) , %p2 = %port % 256
- if ($sock(%sockname)) sockclose %sockname
- hadd -m $sockname pasv %sockname $sock($sockname).ip %port
- socklisten wbs.ftpserver-data %port
- sw 227 Entering Passive Mode $+($chr(40),$replace($hget($sockname,serverip),.,$chr(44)),$chr(44),%p1,$chr(44),%p2,$chr(41)) .
- }
- else sw 500 Bad configuration.
- }
- }
- elseif ($1 == PORT) {
- var %port = $calc($gettok($2,5,44) * 256 + $calc($gettok($2,6,44))) , %sockname = $+($sname,@,$sock($sockname).ip)
- if (!%port) sockclose $sockname
- else {
- if ($sock(%sockname)) sockclose %sockname
- hadd -m $sockname pasv %sockname $sock($sockname).ip %port
- sockopen %sockname $replace($gettok($2,1-4,44),$chr(44),.) %port
- }
- }
- elseif ($1 == MKD) {
- var %target = $replace($+($hget($sockname,root),$hget($sockname,pwd),/,$2-),//,/)
- if (!$2) sw 500 Missing argument.
- elseif ($istok(.;..;/;../;\;~;#; $+ $chr(35),$2-,59)) sw 500 Invalid argument.
- elseif ($regex($2,/(\/|\\)\.\.\1/)) sw 500 Invalid argument
- elseif ($exists(%target)) sw 500 Unable to create: already exists
- else {
- mkdir $qt(%target)
- sw 257 $qt($nopath($2-)) Directory created.
- }
- }
- elseif ($1 == ABOR) {
- var %sockdata = $gettok($hget($sockname,pasv),1,32)
- if ($sock(%sockdata)) sockclose %sockdata
- sw 200 Abord: ok
- }
- elseif ($1 == RETR) {
- var %sockdata = $gettok($hget($sockname,pasv),1,32) , %file = $qt($+($hget($sockname,root),$hget($sockname,pwd),$2-))
- if (!$sock(%sockdata)) sw 500 Unable to transfer: data socket not opened
- ;elseif ($hget($sockname,type) != I) sw 500 Unable to transfer: invalid type $qt($v1) > I is needed for trasnfers
- elseif (!$2) sw 500 Missing argument
- elseif (.. isin $2-) sw 500 Unallowed charaters in file name
- elseif (!$exists(%file)) sw 500 Unable to find $qt($2-)
- else {
- if ($fopen(%sockdata)) .fclose %sockdata
- if ($hget(%sockdata)) hfree %sockdata
- if ($hget($sockname,filepos)) {
- var %pos = $v1
- if ($file(%file).size < %pos) sw 500 Error: you requested to resume at %pos but the file size is $v1
- else hadd -m %sockdata filepos %pos
- hdel $sockname filepos
- }
- else hadd -m %sockdata filepos 0
- hadd %sockdata parent $sockname
- hadd %sockdata file %file
- sockmark %sockdata $1
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,Transfering $nopath(%file) to $sock($sockname).ip on %sockdata)
- sw 150 Opening Binary mode data connection for file list
- .fopen %sockdata %file
- .fseek %sockdata $hget(%sockdata,filepos)
- noop $fread(%sockdata,4000,&data)
- if ($hget($sockname,type) == A) sockwrite -n %sockdata $bvar(&data,1,4000).text
- else sockwrite %sockdata &data
- }
- }
- elseif ($1 == STOR) {
- var %sockdata = $gettok($hget($sockname,pasv),1,32) , %filepos = $iif($hget(%sockdata,filepos),$v1,0) , %file = $qt($+($hget($sockname,root),$hget($sockname,pwd),$2-))
- if (!$hget($sockname,writeperm)) sw 500 You dont have the permission to do that !
- elseif (!$sock(%sockdata)) sw 500 Unable to transfer: data socket not opened
- elseif (!$2) sw 500 Missing argument.
- elseif (.. isin $2-) sw 500 Unallowed charaters in file name
- else {
- if ($hget(%sockdata)) hfree %sockdata
- hadd -m %sockdata parent $sockname
- hadd %sockdata file %file
- sockmark %sockdata $1
- if ($fopen(%sockdata)) .fclose %sockdata
- .fopen -o %sockdata %file
- sw 150 Opening Binary mode data connection for file list
- }
- }
- elseif ($1 == LIST) {
- var %sockdata = $gettok($hget($sockname,pasv),1,32)
- if (!$sock(%sockdata)) sw 500 No data socket opened
- elseif ($hget($sockname,type) != A) sw 500 Unsuported TYPE mode for listing: please use TYPE A
- else {
- var %dir = $+($hget($sockname,root),$hget($sockname,pwd))
- sockwrite -n %sockdata DIR drwxr-sr-t 14 web site 4096 Feb 13 23:39 .
- if ($hget($sockname,pwd) != /) sockwrite -n %sockdata DIR drwxr-sr-t 14 web site 4096 $asctime($ctime,mmm dd) ..
- noop $finddir(%dir,*.*,0,0,sockwrite -n %sockdata DIR drwxr-sr-t 14 web site 4096 Feb 13 23:39 $nopath($1-))
- noop $findfile(%dir,*.*,0,0,sockwrite -n %sockdata -rw-r--r-- 1 web site $file($1-).size $asctime($file($1-).ctime,mmm dd) $time $nopath($1-))
- sockclose %sockdata
- sw 226 Transfer complete.
- }
- }
- else sw 500 Unknow command
- }
- ;wecho $sname < $1-
- }
- on *:socklisten:wbs.ftpserver-data*:{
- var %table = $+($sname,.,$sock($sockname).ip) , %data = $hget(%table,pasv) , %sock = $$gettok(%data,1,32)
- if (%data) sockaccept %sock
- sockmark %sock $hget(%table,type)
- sockclose $sockname
- }
- on *:sockopen:wbs.ftpserver@*:{
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,opened active connection for $sock($sockname).ip)
- }
- on *:sockwrite:wbs.ftpserver@*:{
- if ((!$hget($sockname)) && (!$fopen($sockname)) && (!$sock($sockname).mark) && ($sock($sockname).sq > 4000)) { sockloose | return }
- hinc $sockname filepos 4000
- noop $fread($sockname,4000,&data)
- if ($hget($hget($sockname,parent),type) == A) sockwrite -n $sockname $bvar(&data,1,4000).text
- sockwrite $sockname &data
- if (!$bvar(&data,0)) {
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,File $nopath($hget($sockname,file)) was successfully transfered to $sock($sockname).ip on port $sock($sockname).port in $duration($sock($sockname).to))
- sockwrite -n $hget($sockname,parent) 226 Transfer complete.
- sockloose
- }
- }
- alias -l sockloose {
- if ($hget($sockname)) hfree $sockname
- if ($fopen($sockname)) .fclose $sockname
- sockclose $sockname
- }
- on *:sockclose:wbs.ftpserver@*:{
- if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,Client $sock($sockname).ip closed the data socket)
- sockwrite -n $hget($sockname,parent) 226 Transfer complete.
- if ($hget($sockname)) hfree $sockname
- if ($fopen($sockname)) .fclose $sockname
- }
- on *:sockread:wbs.ftpserver@*:{
- sockread &buffer
- if (!$hget($sockname)) sockloose
- else {
- ;bwrite $hget($sockname,file) -1 -1 &buffer
- .fwrite -b $sockname &buffer
- }
- }
- alias -l sw {
- ;wecho $sname > $1-
- sockwrite -n $sockname $1-
- }
-
-
- alias -l wecho echo -a $+($chr(91),$sname,$chr(93)) $$1-
- alias wcfg return $qt($mircdirFtpServer-Config.ini)
;Socknames:
;listen: wbs.ftpserver
;com: wbs.ftpserver.[client-ip]
;data: wbs.ftpserver@[client-ip]
on *:load:{
if ($version < 6.35) {
wecho $sname error: Woops ! your version of mirc is $version but 6.35 or newer is needed !!! sorry but i cant work
aptitude remove $sname
}
else {
writeini $wcfg $sname enable 0
writeini $wcfg $sname maxco 2
writeini $wcfg $sname port 21
writeini $wcfg $sname nopasv 0
writeini $wcfg $sname quiet 1
writeini $wcfg $sname pasv-range 1000 1010
wecho $sname info: to specify manualy the ip of the server you can type:
wecho $sname info: //writeini $wcfg $sname serverip [your IP]
wecho $sname info: dont forget to redirect/open ports on you're router/firewall
}
}
on *:unload:{
if ($sock($sname)) wbs.ftpserver stop
remove $wcfg
}
alias -l sname return wbs.ftpserver
on *:start:{
if ($readini($wcfg,$sname,enable)) socklisten $sname $iif($readini($wcfg,$sname,port),$v1,21)
}
alias wbs.ftpserver {
wecho $sname $iif($1-,$v1,help)
if ($1 == start) {
if ($sock($sname)) wecho $sname error: server is already started
else {
writeini $wcfg $sname enable 1
socklisten $sname $iif($readini($wcfg,$sname,port),$v1,21)
wecho $sname server started
}
}
elseif ($1 == stop) {
if (!$sock($sname)) wecho $sname error: server is not started
else {
writeini $wcfg $sname enable 0
sockclose $+($sname,*)
wecho $sname server stoped
}
}
elseif ($1 == status) wecho $sname Server is curently $iif($sock($sname),started,stoped)
elseif ($1 == close) {
if (!$2) wecho $sname error: this function need the ip as argument.
elseif ($sock($+($sname,.,$2))) sockclose $v1
else wecho $sname error: stop $qt($2) : invalid ip
}
elseif ($1 == add) {
if ((!$4) && ($3)) tokenize 32 $1- $$sfile($mircdir)
if (!$4) wecho $sname error: syntax: /wbs.ftpserver add [login] [pass] [folder]
elseif (!$exists($4-)) wecho $sname error: directory dosent exists
else {
writeini $wcfg wbs.ftpserver.shares $+($2,@,$3) 0 0 $noqt($4-)
wecho $sname Successfuly added with permision: read only, to edit: /wbs.ftpserver chmod $+($2,@,$3) rw.
}
}
elseif ($1 == chmod) wecho $sname info: todo
elseif ($1 == list) {
var %n = $sock($sname $+ .*,0)
if (!%n) wecho $sname No open socket.
else {
wecho $sname open connection(s): %n
while (%n) {
wecho $sname ip: $sock($sname $+ .*,%n).ip $+ : $+ $sock($sname $+ .*,%n).port
dec %n
}
}
}
elseif ((!$1) || ($1 == help)) {
wecho $sname help for $sname
wecho $sname availables commands are:
wecho $sname start - start the ftp server
wecho $sname stop - stop the ftp server
wecho $sname add [login] [pass] (folder) - add the folder in sharinf for user [login]
wecho $sname list - list all open connection for the ftp server
wecho $sname close [ip] - close the specified [IP]
}
else wecho $sname error: unknow command : $qt($1)
}
on *:socklisten:wbs.ftpserver:{
var %ip = $iif($sock($sockname).ip,$v1,127.0.0.1) , %sockname = $+(wbs.ftpserver.,%ip)
if ($sock(%sockname)) {
sockwrite -n %sockname 500 You are trying to reconnect on the server but just one connection is allowed per ip : closing this one: now !
sockclose %sockname
}
sockaccept %sockname
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,new connection from $sock($sockname).ip on port $sock($sockname).port)
sockwrite -n %sockname 220 $sname FTP server ready
}
on *:sockopen:wbs.ftpserver.*:{
if ($hget($sockname)) hfree $sockname
}
on *:sockread:wbs.ftpserver.*:{
var %buffer
sockread -f %buffer
wbs.ftpserver.events %buffer
}
on *:sockclose:wbs.ftpserver.*:{
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,connection closed for $sock($sockname).ip)
if ($hget($sockname)) hfree $sockname
}
alias wbs.ftpserver.events {
if (!$1) return
elseif ($1 == USER) {
hadd -m $sockname login $2
sw 331 Password required for $sname
}
elseif ($1 == PASS) {
var %data = $readini($wcfg,wbs.ftpserver.shares,$+($hget($sockname,login),@,$2))
if (!%data) {
noop $tip($sname,$sname,Bad login form $sock($sockname).ip : $2)
sockloose
}
else {
hadd -m $sockname auth 1
hadd $sockname root $noqt($gettok(%data,3-,32))
hadd $sockname pwd /
hadd $sockname serverip $iif($sock($sockname).ip == $ip,127.0.0.1,$sock($sockname).ip)
hadd $sockname writeperm $gettok(%data,2,32)
if ($readini($wcfg,$sname,serverip)) hadd $sockname serverip $v1
writeini $wcfg wbs.ftpserver.shares $+($hget($sockname,login),@,$2) $calc($gettok(%data,1,32) +1) $gettok(%data,2-,32)
sw 230 Ok
}
}
elseif ($1 == QUIT) {
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,$sock($sockname).ip has quit.)
sockloose
}
elseif ($1 == FEAT) sw 211 SIZE REST
else {
if (!$hget($sockname,auth)) sockloose
elseif (.. isin $hget($sockname,pwd)) sockloose
elseif ($1 == NOOP) sw 200 NOOP command successful
elseif ($1 == SYST) sw 215 UNIX Type: L8
elseif ($1 == PWD) sw 257 $+(",$hget($sockname,pwd),") is current directory.
elseif ($1 == CDUP) {
var %pwd = $hget($sockname,pwd)
if (%pwd == /) sw 500 You are already at the root.
elseif ($2) sw 500 Too many argument.
else {
hadd $sockname pwd $deltok(%pwd,-1,47)
sw 250 CWD command successful.
}
}
elseif ($1 == DELE) {
var %file = $qt($+($hget($sockname,root),$hget($sockname,pwd),$2-))
echo -a %file
if (!$hget($sockname,writeperm)) sw 500 You dont have the permission to do that !
elseif (!$2) sw 500 This function need a argument (the filename).
elseif (!$exists(%file)) sw 500 The target dosent exists.
elseif ((/../ isin $2-) || (\..\ isin $2-)) sw 500 Hacking attemp detected: abord
else {
.remove %file
sw 250 Ok
}
}
elseif ($1 == REST) {
if (!$2) sw 500 Missing argument
elseif ($2 !isnum) sw 500 Invalid argument: must be a int
else {
hadd $sockname filepos $2
sw 226 ready to resume transfer at position $2
}
}
elseif ($1 == TYPE) {
if (!$istok(A;I,$2,59)) sw 500 Invalid type: must be A or I
else {
hadd $sockname type $2
sw 200 Type set to $2
}
}
elseif ($1 == CWD) {
var %target = $strip($2-) , %cdir = $hget($sockname,pwd) , %path = $+($hget($sockname,root),%cdir,$iif($right(%cdir,1) != /,/),%target))
if ($left(%target,1) == /) var %path = $+($hget($sockname,root),%target)
if (%target == /) {
hadd $sockname pwd /
sw 250 command successful.
return
}
if (!%target) sw 500 Missing argument
elseif (!$exists(%path)) sw 500 Invalid argument: directory dosent exists.
elseif ((/../ isin %target) || (\..\ isin %target)) sw 500 Hacking attemp detected: abord
else {
if ($left($2,1) != /) hadd $sockname pwd $replace(/ $+ %cdir $+ $nopath($2-) $+ /,//,/)
else hadd $sockname pwd $2-
sw 250 CWD command successful.
}
}
elseif ($1 == PASV) {
if ($readini($wcfg,$sname,nopasv)) sw 550 Command disabled in server config file.
else {
var %sockname = $+($sname,@,$sock($sockname).ip) , %secure = 100
if ($readini($wcfg,$sname,pasv-range)) {
tokenize 32 $v1
if (!$2) %port = $1
else {
var %port = $r($1,$2)
while ((!$portfree(%port)) && (%secure)) {
var %port = $r($1,$2)
dec %secure
}
if (!%secure) {
wecho $sname error: unable to get a port in range $1- : set a larger plage of port in portrange.
sw 500 Internal server error: cannot found a port free on the server side.
return
}
}
var %p1 = $int($calc(%port / 256)) , %p2 = %port % 256
if ($sock(%sockname)) sockclose %sockname
hadd -m $sockname pasv %sockname $sock($sockname).ip %port
socklisten wbs.ftpserver-data %port
sw 227 Entering Passive Mode $+($chr(40),$replace($hget($sockname,serverip),.,$chr(44)),$chr(44),%p1,$chr(44),%p2,$chr(41)) .
}
else sw 500 Bad configuration.
}
}
elseif ($1 == PORT) {
var %port = $calc($gettok($2,5,44) * 256 + $calc($gettok($2,6,44))) , %sockname = $+($sname,@,$sock($sockname).ip)
if (!%port) sockclose $sockname
else {
if ($sock(%sockname)) sockclose %sockname
hadd -m $sockname pasv %sockname $sock($sockname).ip %port
sockopen %sockname $replace($gettok($2,1-4,44),$chr(44),.) %port
}
}
elseif ($1 == MKD) {
var %target = $replace($+($hget($sockname,root),$hget($sockname,pwd),/,$2-),//,/)
if (!$2) sw 500 Missing argument.
elseif ($istok(.;..;/;../;\;~;#; $+ $chr(35),$2-,59)) sw 500 Invalid argument.
elseif ($regex($2,/(\/|\\)\.\.\1/)) sw 500 Invalid argument
elseif ($exists(%target)) sw 500 Unable to create: already exists
else {
mkdir $qt(%target)
sw 257 $qt($nopath($2-)) Directory created.
}
}
elseif ($1 == ABOR) {
var %sockdata = $gettok($hget($sockname,pasv),1,32)
if ($sock(%sockdata)) sockclose %sockdata
sw 200 Abord: ok
}
elseif ($1 == RETR) {
var %sockdata = $gettok($hget($sockname,pasv),1,32) , %file = $qt($+($hget($sockname,root),$hget($sockname,pwd),$2-))
if (!$sock(%sockdata)) sw 500 Unable to transfer: data socket not opened
;elseif ($hget($sockname,type) != I) sw 500 Unable to transfer: invalid type $qt($v1) > I is needed for trasnfers
elseif (!$2) sw 500 Missing argument
elseif (.. isin $2-) sw 500 Unallowed charaters in file name
elseif (!$exists(%file)) sw 500 Unable to find $qt($2-)
else {
if ($fopen(%sockdata)) .fclose %sockdata
if ($hget(%sockdata)) hfree %sockdata
if ($hget($sockname,filepos)) {
var %pos = $v1
if ($file(%file).size < %pos) sw 500 Error: you requested to resume at %pos but the file size is $v1
else hadd -m %sockdata filepos %pos
hdel $sockname filepos
}
else hadd -m %sockdata filepos 0
hadd %sockdata parent $sockname
hadd %sockdata file %file
sockmark %sockdata $1
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,Transfering $nopath(%file) to $sock($sockname).ip on %sockdata)
sw 150 Opening Binary mode data connection for file list
.fopen %sockdata %file
.fseek %sockdata $hget(%sockdata,filepos)
noop $fread(%sockdata,4000,&data)
if ($hget($sockname,type) == A) sockwrite -n %sockdata $bvar(&data,1,4000).text
else sockwrite %sockdata &data
}
}
elseif ($1 == STOR) {
var %sockdata = $gettok($hget($sockname,pasv),1,32) , %filepos = $iif($hget(%sockdata,filepos),$v1,0) , %file = $qt($+($hget($sockname,root),$hget($sockname,pwd),$2-))
if (!$hget($sockname,writeperm)) sw 500 You dont have the permission to do that !
elseif (!$sock(%sockdata)) sw 500 Unable to transfer: data socket not opened
elseif (!$2) sw 500 Missing argument.
elseif (.. isin $2-) sw 500 Unallowed charaters in file name
else {
if ($hget(%sockdata)) hfree %sockdata
hadd -m %sockdata parent $sockname
hadd %sockdata file %file
sockmark %sockdata $1
if ($fopen(%sockdata)) .fclose %sockdata
.fopen -o %sockdata %file
sw 150 Opening Binary mode data connection for file list
}
}
elseif ($1 == LIST) {
var %sockdata = $gettok($hget($sockname,pasv),1,32)
if (!$sock(%sockdata)) sw 500 No data socket opened
elseif ($hget($sockname,type) != A) sw 500 Unsuported TYPE mode for listing: please use TYPE A
else {
var %dir = $+($hget($sockname,root),$hget($sockname,pwd))
sockwrite -n %sockdata DIR drwxr-sr-t 14 web site 4096 Feb 13 23:39 .
if ($hget($sockname,pwd) != /) sockwrite -n %sockdata DIR drwxr-sr-t 14 web site 4096 $asctime($ctime,mmm dd) ..
noop $finddir(%dir,*.*,0,0,sockwrite -n %sockdata DIR drwxr-sr-t 14 web site 4096 Feb 13 23:39 $nopath($1-))
noop $findfile(%dir,*.*,0,0,sockwrite -n %sockdata -rw-r--r-- 1 web site $file($1-).size $asctime($file($1-).ctime,mmm dd) $time $nopath($1-))
sockclose %sockdata
sw 226 Transfer complete.
}
}
else sw 500 Unknow command
}
;wecho $sname < $1-
}
on *:socklisten:wbs.ftpserver-data*:{
var %table = $+($sname,.,$sock($sockname).ip) , %data = $hget(%table,pasv) , %sock = $$gettok(%data,1,32)
if (%data) sockaccept %sock
sockmark %sock $hget(%table,type)
sockclose $sockname
}
on *:sockopen:wbs.ftpserver@*:{
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,opened active connection for $sock($sockname).ip)
}
on *:sockwrite:wbs.ftpserver@*:{
if ((!$hget($sockname)) && (!$fopen($sockname)) && (!$sock($sockname).mark) && ($sock($sockname).sq > 4000)) { sockloose | return }
hinc $sockname filepos 4000
noop $fread($sockname,4000,&data)
if ($hget($hget($sockname,parent),type) == A) sockwrite -n $sockname $bvar(&data,1,4000).text
sockwrite $sockname &data
if (!$bvar(&data,0)) {
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,File $nopath($hget($sockname,file)) was successfully transfered to $sock($sockname).ip on port $sock($sockname).port in $duration($sock($sockname).to))
sockwrite -n $hget($sockname,parent) 226 Transfer complete.
sockloose
}
}
alias -l sockloose {
if ($hget($sockname)) hfree $sockname
if ($fopen($sockname)) .fclose $sockname
sockclose $sockname
}
on *:sockclose:wbs.ftpserver@*:{
if (!$readini($wcfg,$sname,quiet)) noop $tip($sname,$sname,Client $sock($sockname).ip closed the data socket)
sockwrite -n $hget($sockname,parent) 226 Transfer complete.
if ($hget($sockname)) hfree $sockname
if ($fopen($sockname)) .fclose $sockname
}
on *:sockread:wbs.ftpserver@*:{
sockread &buffer
if (!$hget($sockname)) sockloose
else {
;bwrite $hget($sockname,file) -1 -1 &buffer
.fwrite -b $sockname &buffer
}
}
alias -l sw {
;wecho $sname > $1-
sockwrite -n $sockname $1-
}
alias -l wecho echo -a $+($chr(91),$sname,$chr(93)) $$1-
alias wcfg return $qt($mircdirFtpServer-Config.ini)
Conclusion
il es encore en phase de developement mais il es deja fonctionel
pour le moment les listing de répertoires DOIVENT se faire en mode ascii (TYPE A) et les transfers en binaire (TYPE I) j'effectue mes tests avec FlashFxp et tout marche bien, pour le moment je ne sais pas encore comment faire mon listing en binaire
Historique
- 01 septembre 2009 15:05:46 :
- petit oubli :$
- 08 septembre 2009 03:46:51 :
- gestion des upload dans le sens client > serveur
transfers des fichier en mode ascii
- 08 septembre 2009 03:50:30 :
- oublis
- 08 septembre 2009 06:10:38 :
- optimisations diverses (merci a Wims)
- 08 septembre 2009 15:42:02 :
- optimisation (again)
- 09 octobre 2009 15:55:07 :
- les transfers dans le sens CLIENT => SERVEUR se font maintenan en file handling
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
serveur ftp [ par Erwanou ]
bonjour , je cherche un serveur ftp pour stoker mes fichier mais je ny connais rien alors si kk1 pouvasi me donner un lien ou deux sa marrangerai !!!m
2 petites questions. [ par ckemoua2 ]
Bonjour, En fait la première question c'est simplement par curiosité.. 1: Y'a t'il une commande qui permet d'afficher la fenetre Status. en
Une petite pub pour un serveur IRC qui vient d'ouvrir, Soda-Chat [ par DeViL66 ]
Salut à tous,Un peu de publicité pour un serveur IRC que je vient d'ouvrir avec un pote il y a a peine 1 mois, Soda-Chat. Nous proposon
Socket HTTP [ par Landwest ]
J'ai copié le code suivant dans mle tuto sur les sockets, mais je ne comprend pas pourquoi il me retourne: _____________________________ HTTP/1.1 200
Recherche Warbot [ par AvA BlamM ]
Bonjour, je recherche un warbot permettant le suivi d'un match sur un serveur internet et retranscris sur Mirc.Je me souviens en avoir eu un il y a qu
Probleme avec plusieurs serveurs [ par LOLESKE88 ]
Bonjour, Je suis en train de faire un script. Il vérifie des informations le premier serveur ( quakenet ) mais il a également besoin
PB de timerNOM off [ par LOLESKE88 ]
Bonsoir, Voici mon probleme, on *:TEXT:*nouveau*serveur*:#channel:{ /var %serveur $strip($5, burc) echo @Pic
serveur irc [ par by43 ]
Bonjour, Voilà j'aimerais créer un serveur IRC ... ont m'a parlé de shell, d'ircd ... Mais je comprend rien Et lorsque je demande de l
commande serveur [ par tdg ]
Voila j'aimerais savoir comment est ce que l'on peut envoyer une commande en irc a un serveur cs 1.6?? Par exemple un sv_restart 1 en tapant !rsps&nbs
Socket basique ( dur pour moi :'( ) [ par Dabouille ]
Voila j'essaye d'apprendre les sockets mais la je desespere tout seul a 5h du matin :'(Si quelqu'un voit des erreux peut il me le signaler?merci bcpal
|
Derniers Blogs
TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : ON RAWMODERE : ON RAWMODE par WorldDMT
Cliquez pour lire la suite par WorldDMT AVERTISSMENT ET KIKKAVERTISSMENT ET KIKK par mouhcine951990
Cliquez pour lire la suite par mouhcine951990
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|