You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.5 KiB
118 lines
2.5 KiB
package LDV::LDAP; |
|
|
|
use strict; |
|
use warnings; |
|
use utf8; |
|
|
|
use Net::LDAP; |
|
use Net::LDAP::Util qw(ldap_error_name); |
|
|
|
sub new { |
|
my ($class, $opts) = @_; |
|
my $self = { |
|
server => undef, |
|
binddn => undef, |
|
bindpass => undef, |
|
userbase => undef, |
|
userfilter => "(class=InetOrgPerson)", |
|
%$opts, |
|
}; |
|
|
|
return bless($self, $class); |
|
} |
|
|
|
sub _connect { |
|
my ($self) = @_; |
|
my $conn = Net::LDAP->new($self->{server}, onerror => 'die'); |
|
$conn->bind($self->{binddn}, password => $self->{bindpass}); |
|
|
|
return $conn; |
|
} |
|
|
|
sub _escape { |
|
my ($self, $str) = @_; |
|
$str =~ s|\\|\\\\|go; |
|
$str =~ s|\(|\\\(|go; |
|
$str =~ s|\)|\\\)|go; |
|
return $str; |
|
} |
|
|
|
sub _filter_username { |
|
my ($self, $uid) = @_; |
|
return bless({and => |
|
[{equalityMatch => {attributeDesc => 'objectClass', |
|
assertionValue => 'inetOrgPerson'}}, |
|
{equalityMatch => {attributeDesc => 'uid', |
|
assertionValue => $uid}} |
|
]}, 'Net::LDAP::Filter'); |
|
}; |
|
|
|
sub create { |
|
my ($self, $uid) = @_; |
|
my $conn = $self->_connect(); |
|
$uid = $self->_escape($uid); |
|
my $data = $self->get($uid); |
|
return "User already exists" |
|
if ($data); |
|
|
|
my $dn = sprintf "uid=%s,%s", $uid, $self->{userbase}; |
|
my $result = $conn->add($dn, attr => [ |
|
objectClass => ['inetOrgPerson'], |
|
uid => $uid, |
|
sn => 'just', |
|
cn => 'created', |
|
]); |
|
return $result->error if ($result->code); |
|
$conn->unbind; |
|
return; |
|
} |
|
|
|
sub update { |
|
my ($self, $uid, $attrs) = @_; |
|
return "Attrs isn't HASH" |
|
if (ref($attrs) ne 'HASH'); |
|
|
|
my $conn = $self->_connect(); |
|
$uid = $self->_escape($uid); |
|
|
|
my $data = $self->get($uid); |
|
return "No such user" |
|
unless ($data); |
|
|
|
my $dn = sprintf "uid=%s,%s", $uid, $self->{userbase}; |
|
foreach my $key (keys($attrs)) { |
|
... |
|
} |
|
|
|
return; |
|
} |
|
|
|
sub delete { |
|
my ($self, $uid) = @_; |
|
my $conn = $self->_connect(); |
|
$uid = $self->_escape($uid); |
|
my $dn = sprintf "uid=%s,%s", $uid, $self->{userbase}; |
|
my $result = $conn->delete($dn); |
|
$conn->unbind; |
|
return; |
|
} |
|
|
|
sub get { |
|
my ($self, $uid) = @_; |
|
my $conn = $self->_connect(); |
|
my $filter = $self->_filter_username($uid); |
|
my $mesg = $conn->search(base => $self->{userbase}, scope => 'one', |
|
deref => 'never', filter => $filter); |
|
$conn->unbind; |
|
return unless $mesg->count; |
|
my $entry = $mesg->pop_entry(); |
|
my $data = {}; |
|
foreach my $attr ($entry->attributes) { |
|
$data->{$attr} = $entry->get_value($attr); |
|
} |
|
|
|
delete $data->{userPassword}; |
|
return $data; |
|
} |
|
|
|
1;
|
|
|