#!/usr/bin/env python

# fingerd.py 
# By A.M. Kuchling (amk@amk.ca)
#
# This little program illustrates how easy it is to write network
# servers using the classes in the SocketServer module.
# 
# The finger protocol is a very simple TCP-based protocol; the client
# sends a single line containing the name of the user whose
# information is being requested, followed by a newline.
# Information about the user should then be sent over the socket 
# connection to the client.  In this implementation, the server simply
# tells you who you've fingered; you'd probably want it to retrieve 
# information from the user's home directory or a database of some sort.
#

import SocketServer

class FingerHandler(SocketServer.StreamRequestHandler):
    def handle(self):
	# Read a line of text, limiting it to 512 bytes. 
	# This will prevent someone trying to crash the server machine
	# by sending megabytes of data.  
	username=self.rfile.readline(512)

	# Remove any leading and trailing whitespace, including the
	# trailing newline.
	import string
	username=string.strip(username)

	# Call the method to get the user's information, and return it
	# to the client.  The SocketServer classes make self.wfile 
	# available to send data to the client.
	info = self.find_user_info(username)
	self.wfile.write(info)

    # The following method takes a string containing the username,
    # and returns another string containing whatever information is
    # desired.  You can subclass the FingerHandler class and override
    # this method with your own to produce customized output.

    def find_user_info(self, username):
	"Return a string containing the desired user information."
	return "You fingered the user %s\n" % (repr(username),)

# If this script is being run directly, it'll start acting as a finger
# daemon.  If someone's importing it in order to subclass
# FingerHandler, that shouldn't be done.  The following "if" statement
# is the usual Python idiom for running code only in a script.

if __name__=='__main__':
    # Create an instance of our server class
    server=SocketServer.TCPServer( ('', 79), FingerHandler)

    # Enter an infinite loop, waiting for requests and then servicing them.  
    server.serve_forever()