Commit b46e4902 authored by Andreas Jung's avatar Andreas Jung

merged FTP globbing/recursive patch

parent 1ca0eb84
...@@ -100,10 +100,18 @@ import string ...@@ -100,10 +100,18 @@ import string
class FTPRequest(HTTPRequest): class FTPRequest(HTTPRequest):
def __init__(self, path, command, channel, response, stdin=None, def __init__(self, path, command, channel, response, stdin=None,
environ=None): environ=None,globbing=None,recursive=0):
# we need to store the globbing information to pass it
# to the ZPublisher and the manage_FTPlist function
# (ajung)
self.globbing = globbing
self.recursive= recursive
if stdin is None: stdin=StringIO() if stdin is None: stdin=StringIO()
if environ is None: if environ is None:
environ=self._get_env(path, command, channel, stdin) environ=self._get_env(path, command, channel, stdin)
self._orig_env=environ self._orig_env=environ
HTTPRequest.__init__(self, stdin, environ, response, clean=1) HTTPRequest.__init__(self, stdin, environ, response, clean=1)
...@@ -174,6 +182,11 @@ class FTPRequest(HTTPRequest): ...@@ -174,6 +182,11 @@ class FTPRequest(HTTPRequest):
env['CONTENT_LENGTH']=len(stdin.getvalue()) env['CONTENT_LENGTH']=len(stdin.getvalue())
else: else:
env['PATH_INFO']=self._join_paths(channel.path, path, command) env['PATH_INFO']=self._join_paths(channel.path, path, command)
# Fake in globbing information
env['GLOBBING'] = self.globbing
env['FTP_RECURSIVE'] = self.recursive
return env return env
def _join_paths(self,*args): def _join_paths(self,*args):
......
...@@ -140,6 +140,7 @@ from PubCore import handle ...@@ -140,6 +140,7 @@ from PubCore import handle
from medusa.ftp_server import ftp_channel, ftp_server, recv_channel from medusa.ftp_server import ftp_channel, ftp_server, recv_channel
import asyncore, asynchat import asyncore, asynchat
from medusa import filesys from medusa import filesys
from FTPResponse import make_response from FTPResponse import make_response
from FTPRequest import FTPRequest from FTPRequest import FTPRequest
...@@ -203,28 +204,45 @@ class zope_ftp_channel(ftp_channel): ...@@ -203,28 +204,45 @@ class zope_ftp_channel(ftp_channel):
self.get_dir_list(line,1) self.get_dir_list(line,1)
def get_dir_list(self, line, long=0): def get_dir_list(self, line, long=0):
self.globbing = None
self.recursive = 0
# we need to scan the command line for arguments to '/bin/ls'... # we need to scan the command line for arguments to '/bin/ls'...
# XXX clean this up, maybe with getopts # XXX clean this up, maybe with getopts
if len(line) > 1: if len(line) > 1:
args = string.split(line[1]) args = string.split(line[1])
else: else:
args =[] args =[]
path_args = [] path_args = []
# Extract globbing information
for i in range(len(args)):
x = args[i]
if string.find(x,'*')!=-1 or string.find(x,'?')!=-1:
self.globbing = x
args[i] = '.'
for arg in args: for arg in args:
if arg[0] != '-': if arg[0] != '-':
path_args.append (arg) path_args.append (arg)
else: else:
if 'l' in arg: if 'l' in arg:
long=1 long=1
if 'R' in arg:
self.recursive = 1
if len(path_args) < 1: if len(path_args) < 1:
dir = '.' dir = '.'
else: else:
dir = path_args[0] dir = path_args[0]
self.listdir(dir, long) self.listdir(dir, long)
def listdir (self, path, long=0): def listdir (self, path, long=0):
response=make_response(self, self.listdir_completion, long) response=make_response(self, self.listdir_completion, long)
request=FTPRequest(path, 'LST', self, response) request=FTPRequest(path, 'LST', self, response,globbing=self.globbing,recursive=self.recursive)
handle(self.module, request, response) handle(self.module, request, response)
def listdir_completion(self, long, response): def listdir_completion(self, long, response):
......
...@@ -100,10 +100,18 @@ import string ...@@ -100,10 +100,18 @@ import string
class FTPRequest(HTTPRequest): class FTPRequest(HTTPRequest):
def __init__(self, path, command, channel, response, stdin=None, def __init__(self, path, command, channel, response, stdin=None,
environ=None): environ=None,globbing=None,recursive=0):
# we need to store the globbing information to pass it
# to the ZPublisher and the manage_FTPlist function
# (ajung)
self.globbing = globbing
self.recursive= recursive
if stdin is None: stdin=StringIO() if stdin is None: stdin=StringIO()
if environ is None: if environ is None:
environ=self._get_env(path, command, channel, stdin) environ=self._get_env(path, command, channel, stdin)
self._orig_env=environ self._orig_env=environ
HTTPRequest.__init__(self, stdin, environ, response, clean=1) HTTPRequest.__init__(self, stdin, environ, response, clean=1)
...@@ -174,6 +182,11 @@ class FTPRequest(HTTPRequest): ...@@ -174,6 +182,11 @@ class FTPRequest(HTTPRequest):
env['CONTENT_LENGTH']=len(stdin.getvalue()) env['CONTENT_LENGTH']=len(stdin.getvalue())
else: else:
env['PATH_INFO']=self._join_paths(channel.path, path, command) env['PATH_INFO']=self._join_paths(channel.path, path, command)
# Fake in globbing information
env['GLOBBING'] = self.globbing
env['FTP_RECURSIVE'] = self.recursive
return env return env
def _join_paths(self,*args): def _join_paths(self,*args):
......
...@@ -140,6 +140,7 @@ from PubCore import handle ...@@ -140,6 +140,7 @@ from PubCore import handle
from medusa.ftp_server import ftp_channel, ftp_server, recv_channel from medusa.ftp_server import ftp_channel, ftp_server, recv_channel
import asyncore, asynchat import asyncore, asynchat
from medusa import filesys from medusa import filesys
from FTPResponse import make_response from FTPResponse import make_response
from FTPRequest import FTPRequest from FTPRequest import FTPRequest
...@@ -203,28 +204,45 @@ class zope_ftp_channel(ftp_channel): ...@@ -203,28 +204,45 @@ class zope_ftp_channel(ftp_channel):
self.get_dir_list(line,1) self.get_dir_list(line,1)
def get_dir_list(self, line, long=0): def get_dir_list(self, line, long=0):
self.globbing = None
self.recursive = 0
# we need to scan the command line for arguments to '/bin/ls'... # we need to scan the command line for arguments to '/bin/ls'...
# XXX clean this up, maybe with getopts # XXX clean this up, maybe with getopts
if len(line) > 1: if len(line) > 1:
args = string.split(line[1]) args = string.split(line[1])
else: else:
args =[] args =[]
path_args = [] path_args = []
# Extract globbing information
for i in range(len(args)):
x = args[i]
if string.find(x,'*')!=-1 or string.find(x,'?')!=-1:
self.globbing = x
args[i] = '.'
for arg in args: for arg in args:
if arg[0] != '-': if arg[0] != '-':
path_args.append (arg) path_args.append (arg)
else: else:
if 'l' in arg: if 'l' in arg:
long=1 long=1
if 'R' in arg:
self.recursive = 1
if len(path_args) < 1: if len(path_args) < 1:
dir = '.' dir = '.'
else: else:
dir = path_args[0] dir = path_args[0]
self.listdir(dir, long) self.listdir(dir, long)
def listdir (self, path, long=0): def listdir (self, path, long=0):
response=make_response(self, self.listdir_completion, long) response=make_response(self, self.listdir_completion, long)
request=FTPRequest(path, 'LST', self, response) request=FTPRequest(path, 'LST', self, response,globbing=self.globbing,recursive=self.recursive)
handle(self.module, request, response) handle(self.module, request, response)
def listdir_completion(self, long, response): def listdir_completion(self, long, response):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment