File Coverage

blib/lib/Net/Etcd/Auth.pm
Criterion Covered Total %
statement 30 58 51.7
branch 0 10 0.0
condition 0 9 0.0
subroutine 10 15 66.6
pod 3 3 100.0
total 43 95 45.2


line stmt bran cond sub pod time code
1 9     9   52 use utf8;
  9         18  
  9         48  
2             package Net::Etcd::Auth;
3              
4 9     9   304 use strict;
  9         13  
  9         141  
5 9     9   37 use warnings;
  9         15  
  9         204  
6              
7             =encoding utf8
8              
9             =cut
10              
11 9     9   38 use Moo;
  9         14  
  9         42  
12 9     9   2495 use JSON;
  9         16  
  9         40  
13 9     9   748 use Carp;
  9         16  
  9         496  
14 9     9   4115 use Types::Standard qw(Str Int Bool HashRef ArrayRef);
  9         566751  
  9         94  
15 9     9   13531 use Net::Etcd::Auth::Role;
  9         43  
  9         304  
16 9     9   62 use Data::Dumper;
  9         18  
  9         592  
17              
18             with 'Net::Etcd::Role::Actions';
19              
20 9     9   66 use namespace::clean;
  9         19  
  9         64  
21              
22              
23             =head1 NAME
24              
25             Net::Etcd::Auth
26              
27             =cut
28              
29             our $VERSION = '0.020';
30              
31             =head1 DESCRIPTION
32              
33             Authentication
34              
35             =cut
36              
37             =head1 SYNOPSIS
38              
39             # enable auth
40             $etcd->user_add
41              
42             # add user
43             $etcd->user_add( { name => 'samba', password =>'P@$$' });
44              
45             # add role
46             $etcd->role( { name => 'myrole' })->add;
47              
48             # grant role
49             $etcd->user_role( { user => 'samba', role => 'myrole' })->grant;
50              
51             =cut
52              
53             =head2 endpoint
54              
55             =cut
56              
57             has endpoint => (
58             is => 'ro',
59             isa => Str,
60             );
61              
62             =head2 name
63              
64             Defaults to $etcd->name
65              
66             =cut
67              
68             has name => (
69             is => 'lazy',
70             );
71              
72             sub _build_name {
73 0     0     my ($self) = @_;
74 0           my $user = $self->etcd->name;
75 0 0         return $user if $user;
76 0           return;
77             }
78              
79             =head2 password
80              
81             Defaults to $etcd->password
82              
83             =cut
84              
85             has password => (
86             is => 'lazy',
87             );
88              
89             sub _build_password {
90 0     0     my ($self) = @_;
91 0           my $pwd = $self->etcd->password;
92 0 0         return $pwd if $pwd;
93 0           return;
94             }
95              
96             =head1 PUBLIC METHODS
97              
98             =head2 authenticate
99              
100             Returns token with valid authentication.
101              
102             my $token = $etcd->auth({ name => $user, password => $pass })->authenticate;
103              
104             =cut
105              
106             sub authenticate {
107 0     0 1   my ( $self, $options ) = @_;
108 0           $self->{endpoint} = '/auth/authenticate';
109 0 0 0       return unless ($self->password && $self->name);
110 0           $self->request;
111 0           my $auth = from_json($self->{response}{content});
112 0 0 0       if ($auth && defined $auth->{token}) {
113 0           $self->etcd->{auth_token} = $auth->{token};
114             }
115 0           return;
116             }
117              
118             =head2 enable
119              
120             Enable authentication.
121              
122             $etcd->auth()->enable;
123              
124             =cut
125              
126             sub enable {
127 0     0 1   my ( $self, $options ) = @_;
128 0           $self->{endpoint} = '/auth/enable';
129 0           $self->{json_args} = '{}';
130 0           $self->request;
131              
132             # init token
133 0           $self->etcd->auth()->authenticate;
134 0           return $self;
135             }
136              
137             =head2 disable
138              
139             Disable authentication, this requires a valid root password.
140              
141             $etcd->auth({ name => 'root', $password => $pass })->disable;
142              
143             =cut
144              
145             sub disable {
146 0     0 1   my ( $self, $options ) = @_;
147 0           $self->{endpoint} = '/auth/disable';
148 0 0 0       confess 'root name and password required for ' . __PACKAGE__ . '->disable'
149             unless ($self->password && $self->name);
150 0           $self->request;
151 0           $self->etcd->clear_auth_token;
152 0           return $self;
153             }
154              
155             1;