AddressBook
view release on metacpan or search on metacpan
lib/AddressBook.pm view on Meta::CPAN
114115116117118119120121122123124125126127128129130131132133134the key_fields of
each
.
=over 6
=item Z<>
If no match is found, the entry is added to the master.
=item Z<>
If multiple matches are found, an error occurrs.
=item Z<>
If one match is found, then:
=over 8
=item Z<>
If the records match, nothing is done.
lib/AddressBook/DB/HTML.pm view on Meta::CPAN
106107108109110111112113114115116117118119120121122123124125126
$attributes
{
$key
} =
join
(
$self
->{intra_attr_sep},
map
{a({
-href
=>
"mailto:$_"
},
$_
)} @{
$attr
->{
$key
}->{value}});
}
}
$format
=
$self
->{write_format};
foreach
(
values
%{
$self
->{config}->{db2generic}->{
$self
->{db_name}}}) {
$format
=~ s/\$(
$_
)/\
$attributes
{$1}/g;
}
my
@attributes
= (
sort
{
$attr
->{
$a
}->{meta}->{order} <=>
$attr
->{
$b
}->{meta}->{order}} (
keys
%attributes
));
$format
=~ s
'keys %attributes'
@attributes
'g;
eval
qq{\$ret = $format}
;
warn
"Syntax error in HTML backend \"write_format\": $@"
if
$@;
return
$ret
;
}
sub
entry_form {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
my
$entry
=
shift
;
my
$formname
=
shift
;
my
(
$format
,
$ret
,
$key
,
$option
,
@options
,
%selected
,
$i
,
%result
,
$default
);
#$entry->calculate;
lib/AddressBook/DB/HTML.pm view on Meta::CPAN
204205206207208209210211212213214215216217218219220221222223224
$result
{
$key
} .=
"<input type=hidden name=\"_${key}_count\" value=$#options>"
;
}
}
%attributes
=
%result
;
$format
=
$self
->{form_format};
foreach
(
values
%{
$self
->{config}->{db2generic}->{
$self
->{db_name}}}) {
$format
=~ s/\$(
$_
)/\
$attributes
{$1}/g;
}
my
@attributes
= (
sort
{
$attr
->{
$a
}->{meta}->{order} <=>
$attr
->{
$b
}->{meta}->{order}} (
keys
%attributes
));
$format
=~ s
'keys %attributes'
@attributes
'g;
eval
qq{\$ret = $format}
;
warn
"Syntax error in HTML backend \"form_format\": $@"
if
$@;
return
$ret
;
}
sub
read_from_args {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
my
$query
=
shift
;
my
(
$key
,
$canon_field_name
,
@value
,
$i
,
$key_count
);
my
$entry
= AddressBook::Entry->new(
config
=>
$self
->{config});
foreach
$key
(
keys
%{
$self
->{config}->{db2generic}->{
$self
->{db_name}}}) {
lib/AddressBook/DB/LDAP.pm view on Meta::CPAN
555657585960616263646566676869707172737475
dn_calculate=
"'cn=' . $cn . ',mail=' . $mail"
=back
Any of these options may be specified in the constructor, or in the configuration file.
=cut
use
strict;
use
Net::LDAP;
use
AddressBook;
use
Date::Manip;
use
Carp;
$VERSION
=
'0.13'
;
@ISA
=
qw(AddressBook)
;
=head2 new
lib/AddressBook/DB/LDAP.pm view on Meta::CPAN
9899100101102103104105106107108109110111112113114115116117118119
(
$hostname
,
$base
) =
split
"/"
,
$self
->{dsn};
}
$self
->{hostname} =
$hostname
||
$self
->{hostname};
$self
->{base} =
$base
||
$self
->{base};
$self
->{ldap} = Net::LDAP->new(
$self
->{hostname},
async
=> 1 || croak $@);
unless
(
$self
->{anonymous}) {
$mesg
=
$self
->{ldap}->
bind
(
$self
->{username},
password
=>
$self
->{password});
}
else
{
$mesg
=
$self
->{ldap}->
bind
;
}
if
(
$mesg
->is_error) {
croak
"could not bind to LDAP server: "
.
$mesg
->error;
}
return
$self
;
}
sub
search {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call."
;
my
@ret
;
my
%arg
=
@_
;
my
$max_size
=
$arg
{entries} || 0;
lib/AddressBook/DB/LDAP.pm view on Meta::CPAN
150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
}
$filter
=
"(| $filter)"
;
$self
->{so} =
$self
->{ldap}->search(
base
=>
$self
->{base} ||
''
,
async
=> 1,
sizelimit
=>
$max_size
,
timelimit
=>
$max_time
,
filter
=>
"(&(objectclass="
.
$self
->{objectclass} .
')'
.
$filter
.
')'
);
if
(
$self
->{so}->code) {
$self
->{code} = ldap_error_text(
$self
->{so}->code);
return
0;
}
}
else
{
# We need to return everything;
$self
->{so} =
$self
->{ldap}->search(
base
=>
$self
->{base} ||
''
,
async
=> 1,
filter
=>
"objectclass="
.
$self
->{objectclass});
if
(
$self
->{so}->code) {
$self
->{code} = ldap_error_text(
$self
->{so}->code) ;
return
0;
}
}
undef
$self
->{code};
return
$self
->{so}->count;
}
sub
read
{
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
lib/AddressBook/DB/LDAP.pm view on Meta::CPAN
185186187188189190191192193194195196197198199200201202203204205
my
$ret
= AddressBook::Entry->new(
config
=>
$self
->{config});
foreach
$attr
(
$entry
->attributes) {
if
(
exists
$self
->{config}->{db2generic}->{
$self
->{db_name}}->{
$attr
}) {
$ret
->add(
db
=>
$self
->{db_name},
attr
=>{
$attr
=>[
$entry
->get_value(
$attr
)]});
}
}
$ret
->{timestamp} = _get_timestamp(
$entry
);
undef
$self
->{code};
return
$ret
;
}
else
{
$self
->{code} = ldap_error_text(
$self
->{so}->code) ;
return
undef
;
}
}
sub
_get_timestamp {
my
$entry
=
shift
;
my
$timestamp
;
if
(
$entry
->
exists
(
"modifytimestamp"
)) {
(
$timestamp
) =
$entry
->get_value(
"modifytimestamp"
);
}
elsif
(
$entry
->
exists
(
"createtimestamp"
)) {
lib/AddressBook/DB/LDAP.pm view on Meta::CPAN
230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
}
my
$entry
=
$args
{entry};
$entry
->calculate;
my
$old_entry
=
$self
->
read
;
my
$rdn
=
$self
->_rdn_from_entry(
$entry
);
my
$old_rdn
=
$self
->_rdn_from_entry(
$old_entry
);
my
$result
;
if
(
$rdn
ne
$old_rdn
) {
$result
=
$self
->{ldap}->moddn(
"$old_rdn,"
.
$self
->{base},
deleteoldrdn
=>1,
newrdn
=>
$rdn
);
if
(
$result
->code) {
$self
->{code} = ldap_error_text(
$result
->code) ;
return
0;
}
}
my
%attr
= %{
$entry
->get(
db
=>
$self
->{db_name},
values_only
=>
'1'
)};
$result
=
$self
->{ldap}->modify(
"$rdn,"
.
$self
->{base},
replace
=>[
%attr
]);
if
(
$result
->code) {
$self
->{code} = ldap_error_text(
$result
->code) ;
return
0;
}
undef
$self
->{code};
return
1;
}
sub
add {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
my
$entry
=
shift
;
$entry
->calculate;
my
$dn
=
$self
->_rdn_from_entry(
$entry
) .
","
.
$self
->{base};
my
%attr
= %{
$entry
->get(
db
=>
$self
->{db_name},
values_only
=>
'1'
)};
$attr
{objectclass} = [
$self
->{objectclass}];
my
$result
=
$self
->{ldap}->add(
$dn
,
attrs
=> [
%attr
]);
if
(
$result
->code) {
$self
->{code} = ldap_error_text(
$result
->code) ;
return
0;
}
undef
$self
->{code};
return
1;
}
sub
write
{
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
return
$self
->add(
@_
);
}
sub
delete
{
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call."
;
my
$entry
=
shift
;
$entry
->calculate;
my
$dn
=
$self
->_rdn_from_entry(
$entry
) .
","
.
$self
->{base};
my
$result
=
$self
->{ldap}->
delete
(
$dn
);
if
(
$result
->code) {
$self
->{code} = ldap_error_text(
$result
->code) ;
return
0;
}
undef
$self
->{code};
return
1;
}
sub
code {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call."
;
return
$self
->{code};
}
sub
_rdn_from_entry {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
my
$entry
=
shift
|| croak
"Need an entry"
;
my
(
$dn
,
$dn_calculate
);
my
%attr
= %{
$entry
->get(
db
=>
$self
->{db_name},
values_only
=>
'1'
)};
(
$dn_calculate
=
$self
->{dn_calculate}) =~ s/\$(\w*)/\
$attr
{$1}->[0]/g;
eval
qq{\$dn = $dn_calculate}
;
warn
"Syntax error in dn_calculate: $@"
if
$@;
return
$dn
;
}
1;
__END__
=head2 Timestamps
For syncronization purposes, all records are timestamped using the "modifytimestamp"
LDAP attribute. If the record has no "modifytimestamp", "createtimestamp" is used.
lib/AddressBook/DB/LDIF.pm view on Meta::CPAN
141142143144145146147148149150151152153154155156157158159160161
$self
->{ldif}->
write
(
$ldap_entry
);
}
sub
_dn_from_entry {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
my
$entry
=
shift
|| croak
"Need an entry"
;
my
(
$dn
,
$dn_calculate
);
my
%attr
= %{
$entry
->get(
db
=>
$self
->{db_name},
values_only
=>
'1'
)};
(
$dn_calculate
=
$self
->{dn_calculate}) =~ s/\$(\w*)/\
$attr
{$1}->[0]/g;
eval
qq{\$dn = $dn_calculate}
;
warn
"Syntax error in dn_calculate: $@"
if
$@;
$dn
.=
","
.
$self
->{base};
return
$dn
;
}
sub
_get_timestamp {
my
$self
=
shift
;
my
$class
=
ref
$self
|| croak
"Not a method call"
;
my
@stat
=
stat
(
$self
->{filename});
return
ParseDateString(
"epoch $stat[9]"
);
}
lib/AddressBook/DB/PDB.pm view on Meta::CPAN
200201202203204205206207208209210211212213214215216217218219220
$value
=
join
$self
->{intra_attr_sep_char}, @{
$attrs
->{
$field
}->{value}};
$record
->{phoneLabel}->[
$phone_index
] =
$self
->{phone_labels}->{
$field
};
$record
->{entry}->[
$phone_index
+3] =
$value
;
$phone_index
++;
if
(
$phone_index
== 5) {
last
}
# there is only room for 5 "phone" fields
}
for
(
$i
=0;
$i
<=
keys
%labels
;
$i
++) {
unless
(
$record
->{entry}->[
$i
]) {
$record
->{entry}->[
$i
] =
undef
}
}
(
$phone_display_calc
=
$self
->{phone_display}) =~ s/\$([\w-]+)/\
$attrs
->{$1}->{value}->[0]/g;
eval
qq{ \$phone_display = $phone_display_calc }
;
warn
"Syntax error in phone_display_calc: $@"
if
$@;
@phone_display
=
split
","
,
$phone_display
;
find_phone:
for
(
$i
=0;
$i
<=
$#phone_display
;
$i
++) {
if
(
$attrs
->{
$phone_display
[
$i
]}->{value}->[0]) {
$phone_target
=
$self
->{phone_labels}->{
$phone_display
[
$i
]};
for
(
$j
=0;
$j
<=$
#{$record->{phoneLabel}};$j++) {
if
(
$record
->{phoneLabel}->[
$j
] ==
$phone_target
) {
$record
->{showPhone} =
$j
;
last
find_phone;
}
}
( run in 0.504 second using v1.01-cache-2.11-cpan-e5176c747c2 )