# -*- Mode: Python; tab-width: 4 -*-

import filesys
import ftp_server
import string

# create a 'dummy' authorizer (one that lets everyone in) that returns
# a read-only filesystem rooted at '/homes/ftp'

class email_authorizer:
	def __init__ (self, root='/'):
		self.root = root
	def authorize (self, channel, username, password):
		channel.persona = -1, -1
		# writes will be caught by the channel 'open' method.
		channel.read_only = 0
		return 1, 'Ok.', filesys.os_filesystem (self.root)

authorizer = email_authorizer ('/homes/ftp')

# Create an ftp server using this authorizer, running on port 8021
# [the standard port is 21, but you are probably already running
#  a server there]

import StringIO
import os
import socket

class email_file:

	def __init__ (self, from_whom):
		self.buffer = []
		self.from_whom = from_whom

	def write (self, data):
		self.buffer.append (data)
		return len(data)

	def close (self):
		import nnfmp
		self.buffer.insert (0, 'From: <%s>\n\n' % self.from_whom)
		nnfmp.send_message (
			#['carlp@eGroups.net'],
			['rushing@seattle.nightmare.com'],
			string.join (self.buffer, ''),
			self.from_whom
			)

class email_ftp_channel (ftp_server.ftp_channel):

	read_only = 0

	def open (self, path, mode):
		print 'open: %s %s' % (path, mode)
		if not 'r' in mode:
			# XXX: DoS with huge input?
			return email_file (self.user)
		else:
			return ftp_server.ftp_channel.open (self, path, mode)

class email_ftp_server (ftp_server.ftp_server):

	ftp_channel_class = email_ftp_channel

fs = email_ftp_server (authorizer, port=9021)

import asyncore
asyncore.loop()

# to test this server, try
# $ ftp myhost 8021
# when using the standard bsd ftp client,
# $ ncftp -p 8021 myhost
# when using ncftp, and
# ftp://myhost:8021/
# from a web browser.