BZ-Client
view release on metacpan or search on metacpan
lib/BZ/Client.pm view on Meta::CPAN
#!/bin/false
# ABSTRACT: A client for the Bugzilla web services API.
# PODNAME: BZ::Client
use strict;
use warnings 'all';
package BZ::Client;
$BZ::Client::VERSION = '4.4004';
use BZ::Client::XMLRPC;
use BZ::Client::Exception;
use HTTP::CookieJar;
sub new {
my $class = shift;
my $self = {@_};
bless( $self, ref($class) || $class );
return $self
}
sub url {
my $self = shift;
if (@_) {
$self->{'url'} = shift;
}
else {
return $self->{'url'};
}
}
sub api_key {
my $self = shift;
if (@_) {
$self->{'api_key'} = shift;
}
else {
return $self->{'api_key'};
}
}
sub user {
my $self = shift;
if (@_) {
$self->{'user'} = shift;
}
else {
return $self->{'user'};
}
}
sub password {
my $self = shift;
if (@_) {
$self->{'password'} = shift;
}
else {
return $self->{'password'};
}
}
sub autologin {
my $self = shift;
if (@_) {
$self->{'autologin'} = shift;
}
else {
$self->{'autologin'} = 1
unless defined($self->{'autologin'});
return $self->{'autologin'};
}
}
lib/BZ/Client.pm view on Meta::CPAN
return $self->{'logger'};
}
}
sub logDirectory {
my $self = shift;
if (@_) {
$self->{'logDirectory'} = shift;
}
else {
return $self->{'logDirectory'};
}
}
sub xmlrpc {
my $self = shift;
if (@_) {
$self->{'xmlrpc'} = shift;
}
else {
my $xmlrpc = $self->{'xmlrpc'};
if ( !$xmlrpc ) {
my $url = $self->url()
|| $self->error('The Bugzilla servers URL is not set.');
$xmlrpc = BZ::Client::XMLRPC->new(
url => $url,
connect => $self->{'connect'} );
$xmlrpc->logDirectory( $self->logDirectory() );
$xmlrpc->logger( $self->logger() );
$self->xmlrpc($xmlrpc);
}
return $xmlrpc;
}
}
sub login {
my $self = shift;
if ($self->api_key()) {
$self->log( 'debug', 'BZ::Client::login, no need for User.login call when using api_key' );
return 1
}
my $rl = BZ::Client::XMLRPC::boolean->new($self->{'restrictlogin'} ? 1 : 0);
my %params = (
'remember' => BZ::Client::XMLRPC::boolean->FALSE, # dropped in 4.4 as cookies no longer used
'restrictlogin' => $rl, # added in 3.6
'restrict_login' => $rl, # added in 4.4 for tokens
);
# FIXME username and password can be provided to any function and it will be ok
my $user = $self->user()
or $self->error('The Bugzilla servers user name is not set.');
my $password = $self->password()
or $self->error('The Bugzilla servers password is not set.');
$params{login} = $user;
$params{password} = $password;
$self->log( 'debug', 'BZ::Client::login, going to log in with username and password' );
my $cookies = HTTP::CookieJar->new();
my $response = $self->_api_call( 'User.login', \%params, { cookies => $cookies } );
if ( not defined( $response->{'id'} )
or $response->{'id'} !~ m/^\d+$/s )
{
$self->error('Server did not return a valid user ID.');
}
$self->log( 'debug', 'BZ::Client::login, got ID ' . $response->{'id'} );
if ( my $token = $response->{'token'} ) { # for 4.4.3 onward
$self->{'token'} = $token;
$self->log( 'debug', 'BZ::Client::login, got token ' . $token );
}
else {
$self->{'cookies'} = $cookies;
}
return 1
}
sub logout {
my $self = shift;
return 1 unless $self->is_logged_in;
my $response = 1; # if have not cookie or token, return 1
my $cookies = $self->{'cookies'};
my $token = $self->{'token'};
if ($cookies or $token) {
my %params;
$params{'token'} = $self->{'token'}
if $self->{'token'};
# Note: A good response from User.logout is empty so, empty_response_ok => 1
$response = $self->_api_call( 'User.logout', \%params, { empty_response_ok => 1 } );
$cookies->clear() if $cookies;
delete $self->{'token'};
delete $self->{'cookies'};
}
return $response
}
sub is_logged_in {
my $self = shift;
return 1 if $self->{'cookies'};
return 1 if $self->{'token'};
return 1 if $self->{'api_key'};
return
}
sub api_call {
my ( $self, $methodName, $params, $options ) = @_;
$params ||= {};
$options ||= {};
if ( $self->autologin && not $self->is_logged_in() ) {
$self->login();
}
return $self->_api_call( $methodName, $params, $options )
}
sub _api_call {
( run in 0.701 second using v1.01-cache-2.11-cpan-e1769b4cff6 )