begin process at 2010 03 16 22:17:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

AddOns

 > SERVEUR FTP

SERVEUR FTP


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :AddOns Classé sous :serveur, ftp, socket, binvar Niveau :Initié Date de création :01/09/2009 Date de mise à jour :09/10/2009 15:55:07 Vu :1 769

Auteur : hisoka2501

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note


 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

TELECHARGEMENT DE FICHIER PAR PROTOCOLE HTTP 1.0 VIA SOCKET
ALIASES POUR FASCILITER L'USAGE DE MDX (FRAMEWORK)
Source avec Zip Source avec une capture MTOOLS : L'OUTIL DE MENCODER/MPLAYER
PENDU EN @WINDOW
JEU DE LA DEVINETTE

 Sources de la même categorie

TCL - AJOUT SUPPRESSION DE LOGS par Atok
BLACKLIST PSEUDOS/MASKS par usurpateur
Source avec une capture [XCHAT] ANTI KICK / AWAY C++ par GeroXXXX
JEU DU CODE par alanpersonproject
BANNIR LES AGES, LES HOMMES, LES FEMMES ET PSEUDO AVEC CHIFF... par cougar_du_havre

 Sources en rapport avec celle ci

Source avec une capture TORRENT VIEWER par kamikaze97441
TELECHARGEMENT DE FICHIER PAR PROTOCOLE HTTP 1.0 VIA SOCKET par hisoka2501
Source avec Zip Source avec une capture SERVEUR DE FICHIERS XDCC par donkishock
Source avec une capture QUOTES BASH ET BASHFR par Flyswat
Source avec Zip Source avec une capture PACMAN ONLINE - 4 JOUEURS par wims

Commentaires et avis

Commentaire de Zova le 01/09/2009 22:13:11 8/10

ça y'est tu l'as posté, tu sais bien ce que j'en penses, mais j'aime beaucoup l'idée ça peut s'avérer pratique et peut montrer un bon exemple d'utilisation des sockets pour autre chose que récupérer une page web :p
Puis ça changes des codes useless qui font une grande partie des derniers codes postés :(
Sinon :

L.62-261-268 : while (%n > 0) {
> while (%n)

L.187: %p2 = $calc(%port % 256)
> %p2 = %port % 256

L.246-247 :
        if ($hget($sockname,type) == A) sockwrite %sockdata $bvar(&data,4000).text
        else sockwrite %sockdata &data
> sockwrite %sockdata $iif($hget($sockname,type) == A,$bvar(&data,4000).text,&data)

voilou c'est juste histoire de chercher la ptite bète, sinon j'ai rien à dire :p

Commentaire de nexper le 07/09/2009 16:02:46

une question débile & dépalcé : comment faire pour exécuter le script ? faut-il l'intégrer au client irc ? mise en liaison entre ircd & le ftpd ? port ? un petit Howto , ce serait sympa pr les néophytes comme moi .

Merci à l'avance .

Commentaire de hisoka2501 le 08/09/2009 02:36:34

pour faire simple tu fait juste:
/wbs.ftpserver start
dans n'importe quelle fenetre
/wbs.ftpserver add [login] [pass] (dossier a partager)

et apres tu lance un client ftp genre flashfxp (c'est avec lui que je fait mes tests) et tu entre l'ip 127.0.0.1 port 21 (par defaut) le login et le pass et c'est bon, marche aussi en distand et non aucune interaction avec l'ircd, tout es du coté de mirc

Commentaire de nexper le 08/09/2009 10:48:53

d'accord merci de ta réponse,mais comme je suis un tantinet trop curieux et borné,j'aurai d'autres questions :

donc ,j'en déduis que mirc peut se substituer à un client ftp ordinaire (flashfxp, filezilla,....) ; cad que depuis mirc je pourrais m'identifier sur un server distant (ftp)ainsi uqe dwl et upl des fichirs (xdcc) ? c'est ça ?

Commentaire de hisoka2501 le 08/09/2009 13:08:40

effectivement, il es possible de coder un client ftp en mirc script mirc ne gerant pas le ftp en natif
peu etre me pencherais-je sur un tel client une fois que mon serveur sera completement finalisé (je compte encore ajouter un systeme de gestion des permissions ainsi qu'un gui)

Commentaire de nexper le 08/09/2009 13:23:32

ok , donc la principale fonctionnalité de ton script est d'installer un ftp sur un ircd existant , c'est ça ? dsl , si je pose trop de question , mais je peux pas résister à la tentation lol ....:P, sachant que je suis plutot orienté web mais tjrs tenté par l'irc scripting ...

Commentaire de hisoka2501 le 08/09/2009 15:43:53

ircd = serveur irc (le D veut dire "daemon")
l'ircd n'a rien a voir avec ma source
ma source a pour utilitée d'installer un serveur ftp sur mIRC
mIRC ne veut pas dire IRC

IRC c'est le protocole
mIRC le client qui se connecte a un reseau irc
ircd est un serveur utilisant le protocole irc

Commentaire de dominique029 le 11/09/2009 14:23:20

bonjour
j'ai loader cet addon que j'ai nomme wbs.ftpserver.mrc
le pb c'est que des que je tape la cmd de start
mon mirc me repond: Commande inconnue: /WBS.FTPSERVER :(
Etant tres newbie en la matiere j'ai du louper qq chose mais je vois pas
pourrais tu m'expliquer ce que j'ai oublie
j'ai essaye sur un 6.35 un 6.34 et un 6.17
merci pour ta reponse
cordialement

Commentaire de nexper le 11/09/2009 14:38:12

ca pourrait marcher sur un autre client ,(eg:kvirc)

Commentaire de wims le 11/09/2009 20:53:10

mon mirc me repond: Commande inconnue: /WBS.FTPSERVER :(

Le fait que mirc te réponde en français signifie que la version de mirc que tu utilises a été crackée.Je doute qu'on veuille bien t'aider alors qu'il se pourrait très bien que ça vienne de ça.Télécharge un mirc vierge 6.35 ici : http://www.mirc.com/get.html et rééssaye.Sinon, l'erreur signifirai qu'il ne trouve pas l'alias, donc que tu ne l'est pas, tu est sur d'avoir charger le code ?

Commentaire de dominique029 le 11/09/2009 22:28:06

Re bonjour ou plutot bonsoir
Comme tu ma dis Wims j'ai dl un 6.35 tout neuf tout beau ,loader le fichier wbs.ftpserver.mrc comme je load d'habitude c'est a dire par l'editeur de script et meme motif meme punition Commande inconnue  en anglais cette fois
Pour info le mirc que j'utilise n'est pas cracké j'en ai meme profite pour changer l'exe par celui de la 6.35 c'est un script je bidouille a partir de plusieurs script et addon divers
Merci pour l'aide
Cordialement

Commentaire de WorldDMT le 09/10/2009 14:06:23

Salut

j'ai pas tout lus je vais repasser apres

pour le ON UNLOAD a mon propre avis mieu d'utiliser /remove au lieu de /remini

on *:unload:{
  if ($sock($sname)) sockclose $+($v1,*)
  remove $wcfg
}

@+

Commentaire de hisoka2501 le 09/10/2009 16:00:10

"mon mirc me repond: Commande inconnue: /WBS.FTPSERVER :(" <== tu a mal du loader le fichier: //load -rs $qt($sfile($mircdir))
si le probleme persiste: ca vient de ton mirc craqué > suit ce que wims a dit.

"ca pourrait marcher sur un autre client ,(eg:kvirc)" > non, kvirc ne supporte pas le mirc script et je doute qu'il ne le supporte un jour.

WorldDMT > j'ai mis  un remove $wcfg dans ma moddif, en fait a la base je passai pas un remini du a mon systeme de packages, je ne supprimais que la partie du script du fichier ini de config de tout mes scripts :p (fichier de config comun :p)

il a besoin de mirc 6.35 pour tourner ^^

Commentaire de WorldDMT le 18/10/2009 19:06:32

"(fichier de config comun :p)"
tres mauvaise idée a mon avis chaque addon doit etre unique, une fois desinstallé tout les fichiers de sa création doivent etre supprimer sauf si c'etait un scipt complet
c'est mon propre avis en tout cas :)

 Ajouter un commentaire


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&#232;re question c'est simplement par curiosit&#233;.. 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 &#224; tous,Un peu de publicit&#233; pour un serveur IRC que je vient d'ouvrir avec un pote il y a&nbsp;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&#233;rifie des informations le premier serveur ( quakenet ) mais il a &#233;galement besoin&nbsp; PB de timerNOM off [ par LOLESKE88 ] Bonsoir, Voici mon probleme, on *:TEXT:*nouveau*serveur*:#channel:{ &nbsp;&nbsp;&nbsp; /var %serveur $strip($5, burc) &nbsp;&nbsp;&nbsp; echo @Pic serveur irc [ par by43 ] Bonjour, Voil&#224; j'aimerais cr&#233;er un serveur IRC ... ont m'a parl&#233; 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


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales