#!/usr/bin/perl # -*- indent-tabs-mode: nil; -*- # vim:ft=perl:et:sw=4 # $Id$ # Sympa - SYsteme de Multi-Postage Automatique # # Copyright (c) 1997, 1998, 1999 Institut Pasteur & Christophe Wolfhugel # Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Comite Reseau des Universites # Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016, 2017 GIP RENATER # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use lib '/usr/share/sympa/lib'; use strict; use warnings; use Getopt::Long; use HTTP::Cookies; #use SOAP::Lite +trace; use SOAP::Lite; use Sympa::Tools::Data; my ($reponse, @ret, $val, %fault); my $usage = "$0 is a perl soap client for Sympa for TEST ONLY. Use it to illustrate how to code access to features of Sympa soap server. Authentication can be done via user/password or user cookie or as a trusted remote application Usage: $0 --soap_url= --service= --trusted_application= --trusted_application_password= --proxy_vars= --service_parameters= OR usage: $0 --soap_url= --user_email= --user_password= --session_id= --service= --service_parameters= OR usage: $0 --soap_url= --cookie= Example: $0 --soap_url= --cookie=sympauser=someone\@cru.fr "; my %options; unless ( GetOptions( \%main::options, 'soap_url=s', 'service=s', 'trusted_application=s', 'trusted_application_password=s', 'user_email=s', 'user_password=s', 'cookie=s', 'proxy_vars=s', 'service_parameters=s', 'session_id=s' ) ) { printf ""; } my $soap_url = $main::options{'soap_url'}; unless (defined $soap_url) { printf "error : missing soap_url parameter\n"; printf $usage; exit 1; } my $user_email = $main::options{'user_email'}; my $user_password = $main::options{'user_password'}; my $session_id = $main::options{'session_id'}; my $trusted_application = $main::options{'trusted_application'}; my $trusted_application_password = $main::options{'trusted_application_password'}; my $proxy_vars = $main::options{'proxy_vars'}; my $service = $main::options{'service'}; my $service_parameters = $main::options{'service_parameters'}; my $cookie = $main::options{'cookie'}; if (defined $trusted_application) { unless (defined $trusted_application_password) { printf "error : missing trusted_application_password parameter\n"; printf $usage; exit 1; } unless (defined $service) { printf "error : missing service parameter\n"; printf $usage; exit 1; } unless (defined $proxy_vars) { printf "error : missing proxy_vars parameter\n"; printf $usage; exit 1; } play_soap_as_trusted($soap_url, $trusted_application, $trusted_application_password, $service, $proxy_vars, $service_parameters); } elsif ($service eq 'getUserEmailByCookie') { play_soap( soap_url => $soap_url, session_id => $session_id, service => $service ); } elsif (defined $cookie) { printf "error : get_email_cookie\n"; get_email($soap_url, $cookie); exit 1; } else { unless (defined $session_id || (defined $user_email && defined $user_password)) { printf "error : missing session_id OR user_email+user_passwors parameters\n"; printf $usage; exit 1; } play_soap( soap_url => $soap_url, user_email => $user_email, user_password => $user_password, session_id => $session_id, service => $service, service_parameters => $service_parameters ); } sub play_soap_as_trusted { my $soap_url = shift; my $trusted_application = shift; my $trusted_application_password = shift; my $service = shift; my $proxy_vars = shift; my $service_parameters = shift; my $soap = SOAP::Lite->new(); $soap->uri('urn:sympasoap'); $soap->proxy($soap_url); my @parameters; if (defined $service_parameters) { @parameters = split /,/, $service_parameters; } else { @parameters = (); } my $p = join(',', @parameters); printf "calling authenticateRemoteAppAndRun( $trusted_application, $trusted_application_password, $proxy_vars,$service,$p)\n"; my $reponse = $soap->authenticateRemoteAppAndRun($trusted_application, $trusted_application_password, $proxy_vars, $service, \@parameters); print_result($reponse); } sub get_email { my $soap_url = shift; my $cookie = shift; my ($service, $reponse, @ret, $val, %fault); ## Cookies management # my $uri = URI->new($soap_url); # my $cookies = HTTP::Cookies->new(ignore_discard => 1, # file => '/tmp/my_cookies' ); # $cookies->load(); printf "cookie : %s\n", $cookie; my $soap = SOAP::Lite->new(); #$soap->on_debug(sub{print@_}); $soap->uri('urn:sympasoap'); $soap->proxy($soap_url); #, cookie_jar =>$cookies); print "\n\ngetEmailUserByCookie....\n"; $reponse = $soap->getUserEmailByCookie($cookie); print_result($reponse); exit; } sub play_soap { my %param = @_; my $soap_url = $param{'soap_url'}; my $user_email = $param{'user_email'}; my $user_password = $param{'user_password'}; my $session_id = $param{'session_id'}; my $service = $param{'service'}; my $service_parameters = $param{'service_parameters'}; my ($reponse, @ret, $val, %fault); ## Cookies management # my $uri = URI->new($soap_url); my $cookies = HTTP::Cookies->new( ignore_discard => 1, file => '/tmp/my_cookies' ); $cookies->load(); printf "cookie : %s\n", $cookies->as_string(); my @parameters; @parameters = split(/,/, $service_parameters) if (defined $service_parameters); my $p = join(',', @parameters); foreach my $tmpParam (@parameters) { printf "param: %s\n", $tmpParam; } # Change to the path of Sympa.wsdl #$service = SOAP::Lite->service($soap_url); #$reponse = $service->login($user_email,$user_password); #my $soap = SOAP::Lite->service($soap_url); my $soap = SOAP::Lite->new() || die; #$soap->on_debug(sub{print@_}); $soap->uri('urn:sympasoap'); $soap->proxy($soap_url, cookie_jar => $cookies); ## Do the login unless a session_id is provided if ($session_id) { print "Using Session_id $session_id\n"; } else { print "LOGIN....\n"; #$reponse = $soap->casLogin($soap_url); $reponse = $soap->login($user_email, $user_password); $cookies->save; print_result($reponse); $session_id = $reponse->result; } ## Don't use authenticateAndRun for lists command ## Split parameters if ($service_parameters && $service_parameters ne '') { @parameters = split /,/, $service_parameters; } if ($service eq 'lists') { printf "\n\nlists....\n"; $reponse = $soap->lists(); } elsif ($service eq 'subscribe') { printf "\n\n$service....\n"; $reponse = $soap->subscribe(@parameters); } elsif ($service eq 'signoff') { printf "\n\n$service....\n"; $reponse = $soap->signoff(@parameters); } elsif ($service eq 'add') { printf "\n\n$service....\n"; $reponse = $soap->add(@parameters); } elsif ($service eq 'del') { printf "\n\n$service....\n"; $reponse = $soap->del(@parameters); } elsif ($service eq 'getUserEmailByCookie') { printf "\n\n$service....\n"; $reponse = $soap->getUserEmailByCookie($session_id); } else { printf "\n\nAuthenticateAndRun service=%s;(session_id=%s)....\n", $service, $session_id; $reponse = $soap->authenticateAndRun($user_email, $session_id, $service, \@parameters); } print_result($reponse); } sub print_result { my $r = shift; # If we get a fault if (defined $r && $r->fault) { print "Soap error :\n"; my %fault = %{$r->fault}; foreach $val (keys %fault) { print "$val = $fault{$val}\n"; } } else { if (ref($r->result) =~ /^ARRAY/) { #printf "R: $r->result\n"; @ret = @{$r->result}; } elsif (ref $r->result) { print "Pb " . ($r->result) . "\n"; return undef; } else { @ret = $r->result; } Sympa::Tools::Data::dump_var(\@ret, 0, \*STDOUT); } return 1; }