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.