source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Partage.pm @ 2506

Last change on this file since 2506 was 2506, checked in by nanardon, 2 years ago

Add support for RENATER/Partage

File size: 3.1 KB
Line 
1package LATMOS::Accounts::Bases::Partage;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases);
8use LATMOS::Accounts::Log;
9
10use LWP::UserAgent;
11use XML::Simple;
12use DateTime;
13use Digest::HMAC_SHA1;
14use XML::XPath;
15
16our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
17
18=head1 NAME
19
20    LATMOS::Accounts::Bases::Partage - Support for Renater mail solution
21
22=head1 SYNOPSIS
23
24  use LATMOS::Accounts::Bases;
25  my $base = LATMOS::Accounts::Bases->new('partage');
26  ...
27
28=head1 DESCRIPTION
29
30Support for Renater Mail Solution called Partage
31
32=cut
33
34sub new {
35    my ($class, %config) = @_;
36
37    $config{url} =~ s:/*$:: if ( $config{url} );
38
39    my $ua  = LWP::UserAgent->new(
40        timeout => 10,
41    );
42    $ua->env_proxy;
43
44    my $base = {
45        apikey => $config{apikey},
46        url    => $config{url} || 'https://api.partage.renater.fr/service/domain',
47        domain => $config{domain},
48        lwp    => $ua,
49    };
50
51    bless($base, $class);
52    $base->_connect or return;
53
54    $base;
55}
56
57sub _sendrequest {
58    my ( $self, $subUri, %param ) = @_;
59
60    my $ua = $self->{lwp};
61    my $Uri = $self->{url} . '/' . $subUri;
62
63    $Uri .= '/' . $self->{token} unless( $subUri eq 'Auth' );
64
65    la_log(LA_DEBUG, sprintf(
66            "Sending %s, %s",
67            $subUri,
68            join(', ', map { $_ . ' => ' . $param{ $_ } } sort keys %param)
69    ));
70
71    my $response = $ua->post( $Uri, \%param );
72
73    unless ( $response->is_success ) {
74        la_log(LA_ERR, "Cannot fetch $Uri: " . $response->status_line);
75        return;
76    }
77
78    warn $response->content;
79    return $response->content;
80}
81
82sub sendrequest {
83    my ( $self, $subUri, %param ) = @_;
84
85
86    my $res = $self->_sendrequest( $subUri, %param )
87        or return;
88
89    my $ref = XMLin(
90        $res,
91        forcearray => [ qw(account) ],
92        KeyAttr => [],
93    );
94
95    $ref;
96}
97
98sub sendrequestasxpath {
99    my ( $self, $subUri, %param ) = @_;
100
101    my $xml = $self->_sendrequest( $subUri, %param );
102
103    my $xpath = XML::XPath->new(xml => $xml);
104
105    if (my $node = $xpath->findnodes('//faultstring')) {
106        la_log(LA_ERR, "Saop error: %s", $node->string_value);
107        return;
108    }
109
110    return $xpath;
111}
112
113sub _connect {
114    my ( $self ) = @_;
115
116    my $epoch = DateTime->now->epoch;
117    my $clearPreauth = $self->{domain} . '|' . $epoch;
118    my $preauth = Digest::HMAC_SHA1::hmac_sha1_hex( $clearPreauth, $self->{apikey} );
119    my $res = $self->sendrequest(
120        'Auth',
121        domain    => $self->{domain},
122        timestamp => DateTime->now->epoch,
123        preauth   => $preauth,
124    ) or return;
125
126    $self->{token} = $res->{token};
127
128    return $self->{token};
129}
130
131sub DESTROY {
132    my ($self) = @_;
133    $self->{_db} && $self->{_db}->rollback;
134}
135
136
1371;
138
139__END__
140
141=head1 SEE ALSO
142
143=head1 AUTHOR
144
145Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
146
147=head1 COPYRIGHT AND LICENSE
148
149Copyright (C) 2008-2022 CNRS SA/CETP/LATMOS
150
151This library is free software; you can redistribute it and/or modify
152it under the same terms as Perl itself, either Perl version 5.10.0 or,
153at your option, any later version of Perl 5 you may have available.
154
155=cut
Note: See TracBrowser for help on using the repository browser.