Import Debian changes 1.23-1.1
[cascardo/sendxmpp.git] / sendxmpp
index d5546ce..8348398 100755 (executable)
--- a/sendxmpp
+++ b/sendxmpp
@@ -10,14 +10,12 @@ if 0; # not running under some shell
 # Author:     Dirk-Jan C. Binnema <djcb AT djcbsoftware.nl>
 # Maintainer: Lubomir Host 'rajo' <rajo AT platon.sk>
 # Copyright (c) 2004 - 2005 Dirk-Jan C. Binnema
-# Copyright (c) 2006 - 2009 Lubomir Host 'rajo'
+# Copyright (c) 2006 - 2012 Lubomir Host 'rajo'
 #
-# Homepage: http://sendxmpp.platon.sk
+# Homepage: http://sendxmpp.hostname.sk
 #
 # Released under the terms of the GNU General Public License v2
 #
-# $Platon: sendxmpp/sendxmpp,v 1.15 2008-10-21 21:31:53 rajo Exp $
-# $Id: $
 
 use Authen::SASL qw(Perl); # authentication broken if Authen::SASL::Cyrus module installed
 use Net::XMPP;
@@ -28,7 +26,7 @@ use open ':utf8';
 use open ':std';
 
 # subroutines decls
-sub xmpp_login($$$$$$$$);
+sub xmpp_login($$$$$$$$$$$);
 sub xmpp_send ($$$$);
 sub xmpp_send_raw_xml($$);
 sub xmpp_send_message($$$$$$);
@@ -44,12 +42,13 @@ sub terminate();
 sub main();
 
 my # MakeMaker
-$VERSION       = [ q$Revision: 1.15 $ =~ m/(\S+)\s*$/g ]->[0];
+$VERSION       = [ q$Revision: 1.23 $ =~ m/(\S+)\s*$/g ]->[0];
 my $RESOURCE = 'sendxmpp';
 my $VERBOSE  = 0;
 my $DEBUG    = 0;
-my @suppported_message_types   = qw( message chat headline );
-my $message_type                               = 'message'; # default message type
+# http://tools.ietf.org/html/rfc3921#section-2  section 2.1.1 - Types of Message
+my @suppported_message_types   = qw( chat error groupchat headline );
+my $message_type                               = 'chat'; # default message type
 
 # start!
 &main;
@@ -71,12 +70,15 @@ sub main () {
 
     # login to xmpp
     my $cnx =  xmpp_login ($$cmdline{'jserver'}  || $$config{'jserver'},
-                          $$cmdline{'port'}     || $$config{'port'},
+                          $$cmdline{'port'}     || $$config{'port'} || ($$cmdline{'ssl'} ? 5223 : 5222),
                           $$cmdline{'username'} || $$config{'username'},
                           $$cmdline{'password'} || $$config{'password'},
                           $$cmdline{'component'}|| $$config{'component'},
-                          $$cmdline{'resource'},
-                          $$cmdline{'tls'},
+                          $$cmdline{'resource'},
+                          $$cmdline{'tls'} || $$config{'tls'},
+                          $$cmdline{'no-tls-verify'} || $$config{'no-tls-verify'},
+                          $$cmdline{'tls-ca-path'} || $$config{'tls-ca-path'} || '',
+                          $$cmdline{'ssl'},
                           $$cmdline{'debug'})
       or error_exit("cannot login: $!");
 
@@ -176,7 +178,7 @@ sub read_config_file ($) {
                # account with specific connection host
                if ($config{'jserver'}  =~ /(.*);([-\.\w]+)/) {
                        $config{'jserver'}      = $2;
-                       $config{'username'}     .= "\@$1";
+                       $config{'username'}     .= "\@$1" unless $config{'component'};
                }
        }
 
@@ -205,7 +207,9 @@ sub parse_cmdline () {
     usage() unless (scalar(@ARGV));
 
        my ($subject,$file,$resource,$jserver,$port,$username,$password,$component,
-       $message, $chatroom, $headline, $debug, $tls, $interactive, $help, $raw, $verbose);
+       $message, $chatroom, $headline, $debug, $tls, $ssl,
+       $no_tls_verify, $tls_ca_path,
+       $interactive, $help, $raw, $verbose);
     my $res = GetOptions ('subject|s=s'    => \$subject,
                          'file|f=s'       => \$file,
                          'resource|r=s'   => \$resource,
@@ -218,6 +222,9 @@ sub parse_cmdline () {
                          'message-type=s' => \$message_type,
                          'chatroom|c'     => \$chatroom,
                          'tls|t'          => \$tls,
+                         'no-tls-verify|n' => \$no_tls_verify,
+                         'tls-ca-path|a=s' => \$tls_ca_path,
+                         'ssl|e'          => \$ssl,
                          'interactive|i'  => \$interactive,
                          'help|usage|h'   => \$help,
                          'debug|d'        => \$debug,
@@ -244,6 +251,10 @@ sub parse_cmdline () {
        if (scalar(grep { $message_type eq $_ } @suppported_message_types) == 0) {
                error_exit("Unsupported message type '$message_type'");
        }
+       
+       if ($ssl && $tls) {
+           error_exit("Connect securely wether using -e (--ssl) or -t (--tls)");
+       }
 
        if ($headline) {
                # --headline withouth --message-type
@@ -272,6 +283,9 @@ sub parse_cmdline () {
                'message-type'    => $message_type,
                'interactive' => ($interactive or 0),
                'tls'         => ($tls or 0),
+               'no-tls-verify' => ($no_tls_verify or 0),
+               'tls-ca-path' => ($tls_ca_path or ''),
+               'ssl'         => ($ssl or 0),
                'debug'       => ($debug or 0),
                'verbose'     => ($verbose or 0),
                'raw'         => ($raw or 0),
@@ -290,30 +304,41 @@ sub parse_cmdline () {
 
 #
 # xmpp_login: login to the xmpp (jabber) server
-# input: hostname,port,username,password,resource,tls,debug
+# input: hostname,port,username,password,resource,tls,ssl,debug
 # output: an XMPP connection object
 #
-sub xmpp_login ($$$$$$$$) {
+sub xmpp_login ($$$$$$$$$$$) {
 
-    my ($host, $port, $user, $pw, $comp, $res, $tls, $debug) = @_;
+    my ($host, $port, $user, $pw, $comp, $res, $tls, $no_tls_verify, $tls_ca_path, $ssl, $debug) = @_;
     my $cnx = new Net::XMPP::Client(debuglevel=>($debug?2:0));
     error_exit "could not create XMPP client object: $!"
        unless ($cnx);
 
+       my $ssl_verify = 0x01;
+       if ($no_tls_verify) { $ssl_verify = 0x00; }
+       debug_print "ssl_verify: $ssl_verify";
+
+       debug_print "tls_ca_path: $tls_ca_path";
+
     my @res;
        my $arghash = {
                hostname                => $host,
+               port            => $port,
                tls                             => $tls,
+               ssl_verify              => $ssl_verify,
+               ssl_ca_path             => $tls_ca_path,
+               ssl             => $ssl,
                connectiontype  => 'tcpip',
                componentname   => $comp
        };
-       $arghash->{port} = $port if ($port);
-       if (!$port) {
+
+       delete $arghash->{port} unless $port; 
+       if ($arghash->{port}) {
                @res = $cnx->Connect(%$arghash);
-               error_exit ("Could not connect to server '$host': $@") unless @res;
+               error_exit ("Could not connect to '$host' on port $port: $@") unless @res;
        } else {
                @res = $cnx->Connect(%$arghash);
-               error_exit ("Could not connect to '$host' on port $port: $@") unless @res;
+               error_exit ("Could not connect to server '$host': $@") unless @res;
        }
 
     xmpp_check_result("Connect",\@res,$cnx);
@@ -394,7 +419,8 @@ sub xmpp_send_message ($$$$$$) {
     my ($cnx, $rcpt, $comp, $subject, $message_type, $msg) = @_;
 
     # for some reason, MessageSend does not return anything
-    $cnx->MessageSend('to'      => $rcpt . ( $comp ? "\@$comp" : '' ),
+       # mimeit01@xmpp.hs-esslingen.de: if $comp IS set, AND the rcpt DOESN'T contain an @, then @comp is added
+    $cnx->MessageSend('to'      => $rcpt . ( ($comp && index($rcpt, "@") == -1) ? "\@$comp" : '' ),
                'type'          => $message_type,
                'subject'       => $subject,
                'body'          => $msg);
@@ -579,6 +605,18 @@ Use resource I<res> for the sender [default: 'sendxmpp']; when sending to a chat
 
 Connect securely, using TLS
 
+=item B<-e>,B<--ssl>
+
+Connect securely, using SSL
+
+=item B<-n>,B<--no-tls-verify>
+
+Deactivate the verification of SSL certificates. Better way is to use parameter B<--tls-ca-path> with the needed path to CA certificates.
+
+=item B<-a>,B<--tls-ca-path>
+
+Path to your custom CA certificates, so you can verificate SSL certificates during connecting.
+
 =item B<-l>,B<--headline>
 
 Backward compatibility option. You should use B<--message-type=headline> instead. Send a headline type message (not stored in offline messages)
@@ -675,12 +713,12 @@ Documentation for the L<Net::XMPP> module
 
 The jabber homepage: L<http://www.jabber.org/>
 
-The sendxmpp homepage: L<http://sendxmpp.platon.sk>
+The sendxmpp homepage: L<http://sendxmpp.hostname.sk>
 
 =head1 AUTHOR
 
 sendxmpp has been written by Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>, and uses
 the L<Net::XMPP> modules written by Ryan Eatmon. Current maintainer is
-Lubomir Host 'rajo' <rajo AT platon.sk>, L<http://rajo.platon.sk>
+Lubomir Host 'rajo' <rajo AT platon.sk>, L<http://blog.hostname.sk>
 
 =cut