237 lines
4.3 KiB
Perl
237 lines
4.3 KiB
Perl
#! /usr/bin/env perl
|
|
|
|
package API::Base;
|
|
|
|
use v5.10.1;
|
|
use strict;
|
|
use warnings;
|
|
use HTTP::Request::Common qw(GET POST);
|
|
use LWP::UserAgent;
|
|
use XML::LibXML;
|
|
use XML::SAX::ParserFactory;
|
|
|
|
use constant API_URL => "https://noyce.acu.epita.fr/api/";
|
|
#use constant API_URL => "https://rasmus.acu.epita.fr/intra/api/";
|
|
|
|
use ACU::Log;
|
|
|
|
sub make_response($$)
|
|
{
|
|
my $doc = XML::LibXML::Document->new('1.0');
|
|
my $root = $doc->createElement("response");
|
|
|
|
my $result = $doc->createElement("result");
|
|
$result->appendText(shift);
|
|
$root->appendChild($result);
|
|
|
|
my $message = $doc->createElement("message");
|
|
$message->appendText(shift);
|
|
$root->appendChild($message);
|
|
|
|
$doc->setDocumentElement( $root );
|
|
|
|
return $doc->toString();
|
|
}
|
|
|
|
sub parse($$)
|
|
{
|
|
my $mod = shift;
|
|
my $parsed = {};
|
|
|
|
my $sax_handler;
|
|
$sax_handler = ResultHandler->new($parsed) if ($mod eq "ResultHandler");
|
|
if ($mod eq "ProjectHandler")
|
|
{
|
|
use ACU::Project;
|
|
$sax_handler = ProjectHandler->new($parsed);
|
|
}
|
|
$sax_handler = ProjectMemberHandler->new($parsed) if ($mod eq "ProjectMemberHandler");
|
|
|
|
my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler );
|
|
|
|
eval {
|
|
$parser->parse_string(shift);
|
|
};
|
|
if ($@)
|
|
{
|
|
$parsed->{result} = 256;
|
|
$parsed->{message} = "Erreur du parser : $@";
|
|
log WARN, "Erreur du parser.";
|
|
}
|
|
|
|
if (! exists $parsed->{result})
|
|
{
|
|
$parsed->{result} = -1;
|
|
$parsed->{message} = "Pas de code de retour fourni." if (! exists $parsed->{message});
|
|
}
|
|
$parsed->{message} = "" if (! exists $parsed->{message});
|
|
|
|
return $parsed;
|
|
}
|
|
|
|
sub get($$)
|
|
{
|
|
my $next = shift;
|
|
my $url = shift;
|
|
my $ua = LWP::UserAgent->new;
|
|
|
|
# Some old version of LWP::UserAgent doesn't support ssl_opts, this is not required
|
|
eval {
|
|
$ua->ssl_opts(SSL_ca_file => "/etc/ldap/cacert.pem");
|
|
};
|
|
|
|
log(DEBUG, 'GET Request to ', API_URL, $url);
|
|
my $req = GET API_URL . $url;
|
|
|
|
my $cnt = $ua->request($req)->content;
|
|
|
|
log TRACE, $cnt;
|
|
|
|
return parse($next, $cnt);
|
|
}
|
|
|
|
sub send($$$)
|
|
{
|
|
my $next = shift;
|
|
my $url = shift;
|
|
my $ua = LWP::UserAgent->new;
|
|
|
|
# Some old version of LWP::UserAgent doesn't support ssl_opts, this is not required
|
|
eval {
|
|
$ua->ssl_opts(SSL_ca_file => "/etc/ldap/cacert.pem");
|
|
};
|
|
|
|
log(DEBUG, 'POST Request to ', API_URL, $url);
|
|
my $req = POST API_URL . $url, shift;
|
|
|
|
my $cnt = $ua->request($req)->content;
|
|
|
|
log TRACE, $cnt;
|
|
|
|
return parse($next, $cnt);
|
|
}
|
|
|
|
|
|
package ResultHandler;
|
|
|
|
use v5.10.1;
|
|
use strict;
|
|
use warnings;
|
|
|
|
sub new ($$)
|
|
{
|
|
my $class = shift;
|
|
my $self = {
|
|
parsed => shift,
|
|
inResult => 0,
|
|
inMessage => 0,
|
|
values => ""
|
|
};
|
|
|
|
bless $self, $class;
|
|
|
|
return $self;
|
|
}
|
|
|
|
sub start_element
|
|
{
|
|
my ($self, $element) = @_;
|
|
|
|
if ($element->{Name} eq "result") {
|
|
$self->{inResult} = 1;
|
|
}
|
|
elsif ($element->{Name} eq "message") {
|
|
$self->{inMessage} = 1;
|
|
}
|
|
}
|
|
|
|
sub characters
|
|
{
|
|
my ($self, $characters) = @_;
|
|
|
|
if ($self->{inResult} || $self->{inMessage}) {
|
|
$self->{values} .= $characters->{Data};
|
|
}
|
|
}
|
|
|
|
sub end_element
|
|
{
|
|
my ($self, $element) = @_;
|
|
|
|
if ($element->{Name} eq "result")
|
|
{
|
|
$self->{parsed}{result} = $self->{values};
|
|
$self->{inResult} = 0;
|
|
$self->{values} = "";
|
|
}
|
|
elsif ($element->{Name} eq "message")
|
|
{
|
|
$self->{parsed}{message} = $self->{values};
|
|
$self->{inMessage} = 0;
|
|
$self->{values} = "";
|
|
}
|
|
}
|
|
|
|
|
|
package ProjectMemberHandler;
|
|
|
|
use v5.10.1;
|
|
use strict;
|
|
use warnings;
|
|
|
|
sub new ($$)
|
|
{
|
|
my $class = shift;
|
|
my $self = {
|
|
parsed => shift,
|
|
inResult => 0,
|
|
inUser => 0,
|
|
values => ""
|
|
};
|
|
|
|
bless $self, $class;
|
|
|
|
return $self;
|
|
}
|
|
|
|
sub start_element
|
|
{
|
|
my ($self, $element) = @_;
|
|
|
|
if ($element->{Name} eq "result") {
|
|
$self->{inResult} = 1;
|
|
}
|
|
elsif ($element->{Name} eq "user") {
|
|
$self->{inUser} = 1;
|
|
}
|
|
}
|
|
|
|
sub characters
|
|
{
|
|
my ($self, $characters) = @_;
|
|
|
|
if ($self->{inResult} or $self->{inUser}) {
|
|
$self->{values} .= $characters->{Data};
|
|
}
|
|
}
|
|
|
|
sub end_element
|
|
{
|
|
my ($self, $element) = @_;
|
|
|
|
if ($element->{Name} eq "result") {
|
|
$self->{parsed}{result} = $self->{values};
|
|
$self->{inResult} = 0;
|
|
$self->{values} = "";
|
|
}
|
|
elsif ($element->{Name} eq "user") {
|
|
if (!$self->{parsed}{user}) {
|
|
$self->{parsed}{user} = ();
|
|
}
|
|
push @{ $self->{parsed}{user} }, $self->{values};
|
|
$self->{inUser} = 0;
|
|
$self->{values} = "";
|
|
}
|
|
}
|
|
|
|
1;
|