NAME
    POE::Filter::Finger - A POE Filter for creating FINGER servers.

SYNOPSIS
       # A simple Fingerd using Test::POE::Server::TCP

       use strict;
       use warnings;
       use POE;
       use POE qw(Filter::Stackable Filter::Line Filter::Finger);
       use Test::POE::Server::TCP;

       POE::Session->create(
         package_states => [
            'main' => [qw(
                            _start
                            testd_client_input
            )],
         ],
       );
   
       $poe_kernel->run();
       exit 0;
   
       sub _start {
         my $heap = $_[HEAP];
         # Spawn the Test::POE::Server::TCP server.
         $heap->{testd} = Test::POE::Server::TCP->spawn(
            address => '127.0.0.1',
            port => 0,
            filter => POE::Filter::Stackable->new(
                    Filters => [
                            POE::Filter::Line->new(),
                            POE::Filter::Finger->new(),
                    ],
            ),
         );
         warn "Listening on port: ", $heap->{testd}->port(), "\n";
         return;
       }
   
       sub testd_client_input {
         my ($kernel,$heap,$sender,$id,$input) = @_[KERNEL,HEAP,SENDER,ARG0,ARG1];

         my $output;

         SWITCH: {
            if ( $input->{listing} ) {
                $output = 'listing of users rejected';
                last SWITCH;
            }
            if ( $input->{user} ) {
                my $username = $input->{user}->{username};
                $output = "query for information on alleged user <$username> rejected";
                last SWITCH;
            }
            if ( $input->{forward} ) {
                $output = 'finger forwarding service denied';
                last SWITCH;
            }
            $output = 'could not understand query';
         }

         $kernel->post( $sender, 'send_to_client', $id, $output );

         return;
       }

DESCRIPTION
    POE::Filter::Finger is a POE::Filter for the FINGER protocol, RFC 1288.

    It is for use on the server side and parses incoming finger requests
    from clients and produces hashrefs of information relating to those
    requests.

    The "put" method works in much the same way as POE::Filter::Stream and
    does not alter any data passed back to the client.

    The filter does not deal with chunking data received into lines. It is
    intended to be used in a stackable filter, POE::Filter::Stackable, with
    POE::Filter::Line.

    It is based on code borrowed from Net::Finger::Server.

CONSTRUCTOR
    "new"
        Creates a new POE::Filter::Finger object.

        Takes two optional parameters:

          'username_regex', override the regex used to match usernames in query string;
          'hostname_regex', override the regex used to match hostnames in query string;

METHODS
    "get"
    "get_one_start"
    "get_one"
        Takes an arrayref which contains lines of Finger protocol data,
        returns an arrayref of hashref records dependent on what was
        requested:

           listing request:

           {
                'listing' => { verbose => '' }, # verbose boolean; did client request a verbose reply?
           }

           user request:

           {
                'user' => {
                                'verbose' => '', # verbose boolean; did client request a verbose reply?
                                'username' => 'bingos' # the username requested.
                          }
           }

           forward request:

           {
                'forward' => {
                                'verbose' => '', # verbose boolean; did client request a verbose reply?
                                 'hosts' => [    # an arrayref of the hosts in the query, left to right
                                                'example.org',
                                                'example.com'
                                            ],
                                 'username' => 'bingos' # the user named in the query (if any)
                             }
            }

            unknown request:

            {
                    'unknown' => 'this is garbage' # passed the query string
            }

    "get_pending"
        Returns the filter's partial input buffer.

    "put"
        Passes any given data through without altering it.

    "clone"
        Makes a copy of the filter, and clears the copy's buffer.

AUTHOR
    Chris "BinGOs" Williams <chris@bingosnet.co.uk>

    Ricardo SIGNES <rjbs@cpan.org>

LICENSE
    Copyright © Chris Williams and Ricardo SIGNES

    This module may be used, modified, and distributed under the same terms
    as Perl itself. Please see the license that came with your Perl
    distribution for details.

SEE ALSO
    POE::Filter

    Net::Finger::Server

