#!/bin/perl -- -*-perl-*- ########################################################### # # # Justino Martinez, 1998 (justino@jet.es) # # # # Ftp.cgi # # # ############################################################# # Este script puede copiarse y modificarse siempre y cuando # # no se borre ni modifique la cabecera ni este texto y se # # deje constancia clara del nombre y direccion de la persona# # que ha hecho las modificaciones y en que consisten estas. # # No obstante el autor no se hace responsable de usos # # malintencionados debido a modificaciones realizadas por # # otras personas. # ############################################################# # # # Funcion # # # # Realiza diversas tareas mediante ftp. Funciona junto con# # Tree.cgi y Lsremoto.cgi # # # ########################################################### # # # Instalacion # # # # 1.-Copiar este script en el mismo subdirectorio que # # lsremoto.cgi y tree.cgi # # 2.-Darle permisos 755 # # 3.-Cambiar las variables # # $root (Path completo hasta llegar al directorio del # # usuario) # # $ftp_root (Path completo hasta llegar al directorio # # raiz del usuario en un ftp convencional) # # $direccion_ftp (Direccion a la que hacemos el ftp) # # $ftpprog (Donde se halla el ftp) # # $ghost (Archivo que debe estar vacio) # # # ########################################################### # Path completo hasta llegar al directorio del usuario # $root = "/home/www/TR/cjav.org/ricosogorb/raiz"; # Subdirectorio raiz del FTP # $ftp_root = "/ricosogorb"; # Direccion a la que hacemos el ftp # $direccion_ftp = "/home/www/valor/usuarios/ricosogorb/public_html"; # Donde se halla el ftp # $ftpprog = "/bin/ftp"; #-- Esta variable no la debeis modificar si no habeis #-- cambiado el nombre del archivo # # nombre del archivo fantasma # $ghost = "/home/www/TR/cjav.org/ricosogorb/raiz/cgi2/ghost.txt"; ################################################################### #### A partir de aqui no hay que tocar nada ####################### ################################################################### # Cabecera de la hoja # print "Window-target: escondida\n"; print "Content-type: text/html\n\n"; print "
\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #establece el boundary ($bound) y el separador entre las dos parte # (el mail HTML y el attachment) # $bound = $ENV{'CONTENT_TYPE'}; $separador = $bound; $separador =~ /.+boundary=(.+)/; $separador ="--"."$1"; #separa los diferentes boundary (cada campo del formulario lleva #uno asociado), hasta hallar el fichero # # en $name se guarda el nombre del campo # en $mensaje se guarda lo que escribio el usuario en ese campo # @pairs = split(/$separador/, $buffer); foreach $pair (@pairs) { if ($pair =~ /filename=/) { # # en este caso $pair es el attachment # $fichero=$pair; ($primero,$segundo,$tercero) = split(/=/,$pair); ($tmp,$nombre_fichero) = split(/\"/,$tercero); } else { # # si no es asi es un campo # ($cabecera,$resto) = split(/=/,$pair); ($tmp, $name, $mensaje) = split(/\"/, $resto); # Quito los caracteres extranyos # @letras = split(//,$mensaje); $top = @letras-3; $limpio=""; for($i=4; $i<=$top; $i++){ $limpio = $limpio . $letras[$i]; } $FORM{$name} = $limpio; } } # Compruebo que se ha introducido el nombre de usuario # if ($FORM{'username'} eq ""){ &mensaje("No ha introducido el nombre de usuario. Intentelo de nuevo"); exit; } # Compruebo que se ha introducido el password # if ($FORM{'password'} eq ""){ &mensaje("No ha introducido el password. Intentelo de nuevo"); exit; } # Directorio de trabajo # $diract=$ftp_root.$FORM{'diract'}; if ($FORM{'diract'} eq "/") { $dircopy=$root.$FORM{'diract'}; } else { $dircopy=$root.$FORM{'diract'}."/"; } # Suponemos todo en blanco # $copiar="no"; $renombrar="no"; $modificar_privilegios="no"; $borrar_subdir="no"; $crear_subdir="no"; $borrar_archivo="no"; $conflicto = 0; # Determinamos la accion # if (($nombre_fichero ne "")&($FORM{'destino'} ne "")) { $copiar="si"; $conflicto++; } if ((($nombre_fichero eq "")&($FORM{'destino'} ne ""))&($FORM{'rarchivo'} ne "")){ $renombrar="si"; $conflicto++; } if ((($nombre_fichero eq "")&($FORM{'destino'} ne ""))&($FORM{'rarchivo'} eq "")){ $modificar_privilegios="si"; $conflicto++; } if ($FORM{'bsubdir'} ne "") { $borrar_subdir="si"; $conflicto++; } if ($FORM{'csubdir'} ne "") { $crear_subdir="si"; $conflicto++; } if ($FORM{'barchivo'} ne "") { $borrar_archivo="si"; $conflicto++; } # Si hay conflictos sale # if ($conflicto > 1) { &mensaje("Las peticiones multiples no estan soportadas. Operacion cancelada"); exit; } # Si no se ha pedido nada sale # if ($conflicto < 1) { &mensaje("Usted no ha hecho ninguna peticion.\\n\\nAsegurese de que ha introducido todos los datos requeridos"); exit; } # Crea los privilegios de destino # $privilegios = 0; $privilegios = $privilegios + 400 if($FORM{'rowner'}); $privilegios = $privilegios + 200 if($FORM{'wowner'}); $privilegios = $privilegios + 100 if($FORM{'xowner'}); $privilegios = $privilegios + 40 if($FORM{'rgroup'}); $privilegios = $privilegios + 20 if($FORM{'wgroup'}); $privilegios = $privilegios + 10 if($FORM{'xgroup'}); $privilegios = $privilegios + 4 if($FORM{'rworld'}); $privilegios = $privilegios + 2 if($FORM{'wworld'}); $privilegios = $privilegios + 1 if($FORM{'xworld'}); # Crear subdirectorio # if ($crear_subdir eq "si"){ &FTP("1",$diract,$FORM{'username'},$FORM{'password'},$FORM{'csubdir'},$privilegios); &mensaje("El subdirectorio $FORM{'csubdir'} ha sido creado"); exit; } # Borrar subdirectorio # if ($borrar_subdir eq "si"){ &FTP("2",$diract,$FORM{'username'},$FORM{'password'},$FORM{'bsubdir'},$privilegios); &mensaje("El subdirectorio $FORM{'bsubdir'} ha sido borrado"); exit; } # Borrar archivo # if ($borrar_archivo eq "si"){ &FTP("3",$diract,$FORM{'username'},$FORM{'password'},$FORM{'barchivo'},$privilegios); &mensaje("El archivo $FORM{'barchivo'} ha sido borrado"); exit; } # Modificar privilegios # if ($modificar_privilegios eq "si"){ if ($privilegios<600){ &mensaje("Estos privilegios no le permitirian leer y modificar su propio archivo.\n Operacion cancelada"); exit; } &FTP("4",$diract,$FORM{'username'},$FORM{'password'},$FORM{'destino'},$privilegios); &mensaje("Han sido establecidos los permisos $privilegios para $FORM{'destino'} "); exit; } # Renombrar # if ($renombrar eq "si"){ &FTP("5",$diract,$FORM{'username'},$FORM{'password'},$FORM{'destino'},$privilegios,$FORM{'rarchivo'}); &mensaje("$FORM{'rarchivo'} ha sido renombrado como $FORM{'destino'}"); exit; } # Copiar # if ($copiar eq "si"){ if ($privilegios<600){ &mensaje("Estos privilegios no le permitirian leer y modificar su propio archivo.\n Operacion cancelada"); exit; } &FTP("6",$diract,$FORM{'username'},$FORM{'password'},$FORM{'destino'},$privilegios,$fichero); $nombre_fichero=~ s/\\/\\\\/g; &mensaje("El archivo local $nombre_fichero ha sido copiado como $FORM{'destino'} con los permisos $privilegios"); exit; } ###############################3 # Mensajes # sub mensaje { local ($frase); $frase=@_[0]; print ""; } ############################### # FTP # sub FTP { local ($tipo,$cd,$user,$pass,$que,$pri,$salida); $tipo=@_[0]; $cd =@_[1]; $user = @_[2]; $pass = @_[3]; $que = @_[4]; $pri = @_[5]; print "\n"; open (FTP, "|$ftpprog -i -n")||die ('No puedo abrir el programa FTP'); $ok=print FTP "open $direccion_ftp\n"; if (!$ok){ &mensaje("No puedo conectar con $direccion_ftp.\\n\\nOperacion cancelada"); exit; } print "\n"; $ok=print FTP "user $user $pass\n"; if (!$ok){ &mensaje("Nombre de usuario o password incorrecto.\\n\\nOperacion cancelada"); exit; } $ok=print FTP "cd $cd\n"; if (!$ok){ &mensaje("No puedo acceder al subdirectorio $cd.\\n\\nOperacion cancelada"); exit; } print "\n"; # tipos # 1: crear subdirectorio # 2: borrar subdirectorio # 3: borrar archivo # 4: cambiar privilegios # 5: renombrar archivo # 6: copiar archivo en el servidor # if ($tipo eq "1"){ $ok=print FTP "mkdir $que\n"; if (!$ok){ &mensaje("No puedo crear el subdirectorio $que.\\n\\nOperacion cancelada"); exit; } } if ($tipo eq "2"){ $ok=print FTP "rmdir $que\n"; if (!$ok){ &mensaje("No puedo borrar el subdirectorio $que.\\n\\nOperacion cancelada"); exit; } } if ($tipo eq "3"){ $ok=print FTP "delete $que\n"; if (!$ok){ &mensaje("No puedo borrar el archivo $que.\\n\\nOperacion cancelada"); exit; } } if ($tipo eq "4"){ $ok=print FTP "chmod $pri $que\n"; if (!$ok){ &mensaje("No puedo establecer los privilegios $pri.\\n\\nOperacion cancelada"); exit; } } if ($tipo eq "5"){ $desde=@_[6]; $ok=print FTP "rename $desde $que\n"; if (!$ok){ &mensaje("No puedo renombrar $desde como $que.\\n\\nOperacion cancelada"); exit; } } if ($tipo eq "6"){ $desde=@_[6]; # Le ponemos permisos para poder escribir sobre el # $ok=print FTP "put $ghost $que\n"; if (!$ok){ &mensaje("No puedo crear el archivo $que.\\n\\nOperacion cancelada"); exit; } $ok=print FTP "chmod 716 $que\n"; if (!$ok){ &mensaje("No puedo establecer los permisos de escritura para $que.\\n\\nOperacion cancelada"); exit; } print FTP "bye"; close (FTP); # Corrige los retorno de carro enviados desde DOS # #$desde=~ s/chr(26)//g; # Separa en lineas # @lineas = split ("\n",$desde); $salida=$dircopy.$que; print "\n"; open (DATA, ">$salida"); # quita la cabecera tipica del mutipart form/data # $i=4; for ($i=4; $i<=$#lineas+1;$i++) { $ok=print DATA "$lineas[$i]\n"; if (!$ok){ &mensaje("Error inesperado durante la copia.\\n\\nOperacion abortada"); exit; } } close(DATA); # Pone los privilegios # open (FTP, "|$ftpprog -i -n")||die ('No puedo conectar'); $ok=print FTP "open $direccion_ftp\n"; if (!$ok){ &mensaje("No puedo conectar con $direccion_ftp.\\n\\nLos permisos no han sido establecidos.\n Operacion cancelada"); exit; } $ok=print FTP "user $user $pass\n"; if (!$ok){ &mensaje("Nombre de usuario o password incorrecto.\\n\\nLos permisos no han sido establecidos.\n Operacion cancelada"); exit; } $ok=print FTP "cd $cd\n"; if (!$ok){ &mensaje("No puedo acceder al subdirectorio $cd.\\n\\nLos permisos no han sido establecidos.\n Operacion cancelada"); exit; } print "\n"; $ok=print FTP "chmod $pri $que\n"; if (!$ok){ &mensaje("No puedo establecer los permisos $pri para $que.\\n\\nOperacion cancelada"); exit; } } print "\n"; print FTP "bye"; close (FTP); }