#!/usr/bin/perl
# Copyright 2004 Jerzy Wachowiak
use strict;
use warnings;
use Text::CSV_XS;
use Term::ANSIColor;
use Net::Jabber qw (Client);
use constant NS_REGISTER=>"jabber:iq:register";
use constant NS_AUTH=>"jabber:iq:auth";
use constant NS_FILTER=>"jabber:iq:filter";
use xdSRA;
my $filepath=shift;
defined( $filepath ) or usage();
my $result = xdSRA::create_sra_from( $filepath );
my @sender = @{ $result->{sender} };
my @receiver = @{ $result->{receiver} };
my @archivist = @{ $result->{archivist} };
my $c;
my $i;
for $i (0..$#sender) {
print"\n---Start jabber server registration for $sender[$i]{username}\@$sender[$i]{hostname}.---";
$c=Net::Jabber::Client->new();
# Open stream to the server..
print "\nConnecting to the jabber sever $sender[$i]{hostname} on port $sender[$i]{port}.\n";
defined($c->Connect(hostname=>$sender[$i]{hostname},
port=>$sender[$i]{port})) or die "Cannot reach the jabber server! Bye, bye...\n";
# For sender only registration needed,no forward rules to build
®isteruser($c, $sender[$i]{username},$sender[$i]{password},
$sender[$i]{resource});
&settypefilter( $c );
$c->Disconnect();
print"---End jabber server registration for $sender[$i]{username}\@$sender[$i]{hostname}---.\n\n";
sleep(5);
};
for $i (0..$#receiver) {
print"\n---Start jabber server registration for $receiver[$i]{username}\@$receiver[$i]{hostname}.---";
$c=Net::Jabber::Client->new();
# Open stream to the server..
print "\nConnecting to the jabber sever $receiver[$i]{hostname} on port $receiver[$i]{port}.\n";
defined($c->Connect(hostname=>$receiver[$i]{hostname},
port=>$receiver[$i]{port})) or die "Cannot reach the jabber server! Bye, bye...\n";
# For receiver only registration needed,no forward rules to build
®isteruser($c, $receiver[$i]{username},$receiver[$i]{password},
$receiver[$i]{resource});
&settypefilter( $c );
$c->Disconnect();
print"---End jabber server registration for $receiver[$i]{username}\@$receiver[$i]{hostname}---.\n\n";
sleep(5);
};
for $i (0..$#archivist) {
print"\n---Start jabber server registration for $archivist[$i]{username}\@$archivist[$i]{hostname}.---";
my $c=Net::Jabber::Client->new();
print "\nConnecting to the jabber sever $archivist[$i]{hostname} on port $archivist[$i]{port}.\n";
my $status=$c->Connect(hostname=>$archivist[$i]{hostname},
port=>$archivist[$i]{port});
defined($status) or die "$status Cannot reach the jabber server! Bye, bye...\n";
# Archivist needs registartion and forward rules
®isteruser($c, $archivist[$i]{username},$archivist[$i]{password},
$archivist[$i]{resource});
&setfilter($c, \@sender, \@receiver);
$c->Disconnect();
print"---End jabber server registration for $archivist[$i]{username}\@$archivist[$i]{hostname}---.\n\n";
if ($i != $#archivist) {sleep(5)};
};
exit;
sub registeruser{
my ($c, $username, $password, $resource);
$c=shift;
$username=shift;
$password=shift;
$resource=shift;
# Registering username and password
my $iq=new Net::Jabber::IQ();
$iq->SetType("set");
my $query=$iq->NewQuery(NS_REGISTER);
$query->SetUsername($username);
$query->SetPassword($password);
print "\nRegistering user $username with password $password:\n";
print color_XML( $iq->GetXML() ), "\n";
$iq=$c->SendAndReceiveWithID($iq);
# The account maybe already registered from a prevoius run...
print color_XML( $iq->GetXML() ), "\n";
if ($iq->GetType eq "error") {
SWITCH:{
if ($iq->GetErrorCode()==409){
print "Jabber: ", $iq->GetError()," (xDash: Account probably exists). Going on ! \n";
last SWITCH;
};
if ($iq->GetErrorCode()==406){
die "Jabber: ", $iq->GetError(),' (xDash: @, :, /, ", tabs, newlines, carriage return,',
"\n control characters, ASCI under 33 (decimal), in the username?). Bye, bye..."," \n";
};
die "Jabber: ", $iq->GetError(),". Bye, bye... \n";
}
}
$iq=new Net::Jabber::IQ();
$iq->SetType("set");
$query=$iq->NewQuery(NS_AUTH);
$query->SetUsername($username);
$query->SetPassword($password);
$query->SetResource($resource);
print "\nAuthorising user $username with password $password:\n";
print color_XML( $iq->GetXML() ), "\n";
$iq=$c->SendAndReceiveWithID($iq);
# Dev:the result should be checked against error 401- Not Authorized
print color_XML( $iq->GetXML() ), "\n";
if ($iq->GetType eq "error") {
SWITCH:{
if ($iq->GetErrorCode()==401){
die "Jabber: ", $iq->GetError()," (xDash: Right password? Really your account?). Bye, bye...\n";
};
die "Jabber: ", $iq->GetError(),". Bye, bye... \n";
}
}
print "\nDiscarding the jabber server welcome message if any.\n";
$c->SetCallBacks(message=>sub {my $message=shift;$message=shift;print $message->GetXML, "\n"});
$c->PresenceSend();
$c->Process(1);
}
sub setfilter{
my ($c, @sender, @receiver, $reference);
$c=shift;
$reference=shift;
@sender=@{$reference};
$reference=shift;
@receiver=@{$reference};
my $filterstart=""
.""
."normal"
."chat"
."groupchat"
."headline"
."job";
my $filterfrom="";
my $filterforward="";
my $filterend="";
my $i;
for $i (0..$#sender) {
$filterfrom=$filterfrom."".$sender[$i]{username}."\@".
$sender[$i]{hostname}."";
}
for $i (0..$#receiver) {
$filterforward=$filterforward."".$receiver[$i]{username}."\@".
$receiver[$i]{hostname}."";
}
my $filteriq=$filterstart.$filterfrom.$filterforward.$filterend;
print "\nSetting forward rules:\n";
print color_XML( $filteriq ), "\n";
$c->SetCallBacks(iq=>\&report);
my $id=$c->Send($filteriq);
$c->Process(1);
}
sub settypefilter{
my $c=shift;
my $filteriq= ""
.""
."normal"
."chat"
."groupchat"
."headline"
.""
."";
print "\nSetting forward rules:\n";
print color_XML( $filteriq ), "\n";
$c->SetCallBacks(iq=>\&report);
my $id=$c->Send($filteriq);
$c->Process(1);
}
sub report {
my $sid=shift;
my $iq=shift;
print color_XML( $iq->GetXML() ),"\n";
if ($iq->GetType eq "error") {
SWITCH:{
die "Jabber: ", $iq->GetError(),". Bye, bye... \n";
}
}
}
sub color_XML {
my $line = shift;
$line
=~ s/=\s*'([^']+)'/"='".colored( $1, 'yellow')."'"/ge;
$line
=~ s/=\s*"([^"]+)"/'="'.colored( $1, 'yellow').'"'/ge;
$line
=~ s/>([^>]+)'>'.colored( $1, ' yellow').'<'/ge;
return $line
}
sub usage {
print <