PheMail-Server
view release on metacpan or search on metacpan
my $ipaddr= shift;
return $ipaddr;
}
sub exor($) {
my $string = shift;
if (!$xor) { return $string; }
my $enc = xor_buf($string,ReadConfig("salt"));
return $enc;
}
sub process_request {
my $self = shift;
do_log(0,"connect ".ResolveHost($self->{server}->{'peeraddr'}));
print "PheMaild ".$VERSION.": Hello ".$self->{server}->{'peeraddr'}."\r\n";
if ($restrict) {
if ($self->{server}->{'peeraddr'} ne ReadConfig("serverhost")) {
print "I'm gonna have to cut you off.\r\n";
print "I am only accepting trusted hosts.\r\nGoodbye.\r\n";
return;
}
}
print "PheMaild ".$VERSION.": Ready.\r\n";
print ":FOO:\r\n";
$peers{$self->{server}->{'peeraddr'}} = "on";
eval {
while (<STDIN>) {
local $SIG{ALRM} = sub {
die;
};
$timeout = $timeout_sec; # give the user 30 seconds
$previous_alarm = alarm($timeout);
$_ =~ s/\r?\n//g;
$whatsaid = $_;
if($_ eq 'requestsalt') {
print "salt=|".md5_hex(ReadConfig("salt"))."|:FOO:\r\n";
do_log(0,ResolveHost($self->{server}->{'peeraddr'})." requested serversalt.");
next;
}
if($_ eq 'xor') {
if ($xor) {
print "xor=|xor|:FOO:\r\n";
} else {
print "xor=|foo|:FOO:\r\n";
}
next;
}
if($_ eq 'noop') {
print exor("ok")."\r\n";
next;
}
if($_ eq 'who') {
do_log(0,ResolveHost($self->{server}->{'peeraddr'})." Requesting who-list");
print "clients=|";
foreach my $client (keys %peers) {
print $client.",";
}
print "|:FOO:\r\n";
next;
}
if($_ eq 'username') {
print "username=|".exor(getpwuid($<))."|:FOO:\r\n";
next;
}
if($_ eq 'load') {
open(LOAD,"uptime|") or print "Couldn't open uptime: $!\r\n";
while(<LOAD>) {
if (/^$/) { next; }
print "load=|".exor($1)."|:FOO:\r\n" if /load\s*averages?:\s(.+)$/;
}
close(LOAD);
next;
}
if($_ eq 'uptime') {
open(UPTIME,"uptime|") or print "Couldn't open uptime: $!\r\n";
while(<UPTIME>) {
if (/^$/) { next; }
print "uptime=|".exor($1)."|:FOO:\r\n" if /up +(.*), +\d+ users?,/;
}
close(UPTIME);
next;
}
if($_ eq 'whoareyou') {
print "iam=|".exor(ReadConfig("whoami"))."|:FOO:\r\n";
next;
}
if($_ eq 'quit') {
do_log(0,"disconnect ".ResolveHost($self->{server}->{'peeraddr'}));
print "PheMaild ".$VERSION.": Goodbye.\n";
return;
} else {
do_log(3,ResolveHost($self->{server}->{'peeraddr'})." sent: ".$whatsaid);
}
}
alarm($previous_alarm); # initialize previous alarm
};
if($@=~/timed out/i){
return;
}
}
sub RunServer {
__PACKAGE__->run(port => $port);
}
1;
__END__
# Below is stub documentation for your module. You better edit it!
=head1 NAME
PheMail::Server - PheMail slaveserver
=head1 SYNOPSIS
use PheMail::Server;
PheMail::Server->RunServer();
=head1 DESCRIPTION
Runs a server on a specified port, listening for connections from the mothership.
This server is used in project PheMail for slaveservers.
They can receive instructions from the mothership, via this server.
All communication between the servers are explicitly encrypted in XOR.
( run in 1.303 second using v1.01-cache-2.11-cpan-2398b32b56e )