package Client;
use strict;
use Carp;
my @response;
my $data;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
if ((scalar(@_) % 2) != 0) {
croak "incorrect number of parameters";
}
while (@_) {
my $key = shift(@_);
my $value = shift(@_);
$self->{$key} = $value;
}
$self->_initialize;
return $self;
}
sub _initialize {
my $self = shift;
my $timeout;
if (!defined($self->{'Server'})) {
croak "Client not initialized properly : Server parameter missing";
}
if (!defined($self->{'Port'})) {
croak "Client not initialized properly : Port parameter missing";
}
if (!defined($self->{'SKey'})) {
croak "Client not initialized properly : SKey parameter missing";
}
if (!eval {$self->{'Socket'} = IO::Socket::INET->new(PeerAddr => $self->{'Server'},
PeerPort => $self->{'Port'},
Proto => 'tcp',
Reuse => 1); })
{
croak "Client couldn't establish a connection to $self->{'Server'}";
}
$self->{'Socket'}->autoflush(1);
srand($$|time()); # poor random generator should be replaced
$self->{'RKey'} = rand(100000000)+1000000;
$self->{'HCE'} = Crypt::HCE_SHA->new($self->{'SKey'}, $self->{'RKey'});
print { $self->{'Socket'} } "$self->{'RKey'}\n";
}
sub send {
my $self = shift;
my @items = @_;
my ($item, $enc_item);
if (defined($self->{'HCE'})) {
foreach $item (@items) {
# syslog('debug','Client encode: %s',$item);
$enc_item = $self->{'HCE'}->hce_block_encode_mime($item);
# syslog('debug','Client sending: %s', $enc_item);
print { $self->{'Socket'} } "$enc_item";
}
$enc_item = $self->{'HCE'}->hce_block_encode_mime("+END_OF_LIST");
print { $self->{'Socket'} } "$enc_item";
} else {
foreach $item (@items) {
# syslog('debug','Client sending: %s',$item);
print { $self->{'Socket'} } "$item\n";
}
print { $self->{'Socket'} } "+END_OF_LIST\n";
}
return 0;
}
sub recv {
my $self = shift;
my $fh = $self->{'Socket'};
my ($data, $dec_data);
if (defined($self->{'HCE'})) {
$data = "";
undef(@response);
while (<$fh>) {
chomp;
$data = 1;
# syslog('debug','Client recv: %s', $_);
$dec_data = $self->{'HCE'}->hce_block_decode_mime($_);
# syslog('debug','Client decode: %s', $dec_data);
last if ($dec_data eq "+END_OF_LIST");
push @response, $dec_data;
};
if (!defined $data) {
close ($self->{'Socket'});
return $data;
} else {
close ($self->{'Socket'});
return @response;
};
} else {
$data = "";
undef(@response);
while (<$fh>) {
chomp;
$data = 1;
push @response, $_;
};
if (!defined $data) {
close ($self->{'Socket'});
return $data;
} else {
close ($self->{'Socket'});
return @response;
};
}
}
1;
__END__
#------- POD ------