Unable to ADD or MODIFY entries using NET::LDAP

piet paaltjens <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.ldap
Message-ID <[email protected]>
Hi,
i'm new to Net::LDAP and have difficulty to make Net::LDAP execute an 'add' or 'modify'. Can somebody point out what i'm doing wrong?
This is my code:
#!d:\perl\bin\perl.exe

use Data::Dumper;
use Net::LDAP;

use strict;

my ($attr,$ldap,$mesg,$userToAuthenticate,$passwd,@ocs,@atts,@bju_attrs,%add_attrs,%modify_attrs);

@bju_attrs = qw ( givenName sn physicalDeliveryOfficeName telephoneNumber streetAddress postOfficeBox l st postalCode c co countryCode homePhone pager mobile facsimileTelephoneNumber ipPhone title department company manager directReports);

$add_attrs { givenName } = "JustaName";
$modify_attrs {company} = "Roodbms";

$userToAuthenticate = $ARGV[0];
#print STDOUT ("userToAuthenticate= $userToAuthenticate\n");
$passwd = $ARGV[1];
#print STDOUT ("passwd= $passwd\n");

$ldap = Net::LDAP->new ( "mymachine.mydomain" ) or die "$@";

$mesg = $ldap->bind ( "$userToAuthenticate",		
                       password => "$passwd",
                       version => 3 );

print STDOUT ("After: bind\, mesg= \n".Dumper(%$mesg)."\n\n");

#my @Attrs = qw( );		# request all available attributes
				# to be returned.

#my $result = LDAPsearch ( $ldap, "sn=ordinary", \@Attrs);
my $result = LDAPsearch ( $ldap, "sn=ordinary", \@bju_attrs);
print STDOUT ("result= \n".Dumper(%$result)."\n\n");
print_result_by_entry($result);
#
# Now attempt to add/modify (a) value(s) to/of a DN
#
my $dn = "DC=Roodbms,CN=Users,CN=ordinary"; # This is shown in LDAPExplorerTool2
#
# First attempt: ADD
#
foreach $attr (keys %add_attrs)
{
  print STDOUT ("Adding attribute: $attr with value: ".$add_attrs{$attr}."\n");
}

my $result = LDAPaddUsingHash ( $ldap, $dn, \%add_attrs );
$result = LDAPsearch ( $ldap, "sn=ordinary", \@bju_attrs);
print STDOUT ("result (after add)= \n".Dumper(%$result)."\n\n");
print_result_by_entry($result);
#
# Then attempt: MODIFY
#
foreach $attr (keys %modify_attrs)
{
  print STDOUT ("Modifying attribute: $attr to: ".$modify_attrs{$attr}."\n");
}

my $result = LDAPmodifyUsingHash ( $ldap, $dn, \%modify_attrs );
$result = LDAPsearch ( $ldap, "sn=ordinary", \@bju_attrs);
print STDOUT ("result (after modify)= \n".Dumper(%$result)."\n\n");
print_result_by_entry($result);

$ldap->unbind;

#
# Several functions to use
#

sub print_result_by_entry
{
  my ($result) = @_;

  my @entries = $result->entries;

  my $entr;
  foreach $entr ( @entries )
  {
    print "DN: ", $entr->dn, "\n";

    my $attr;
    foreach $attr ( sort $entr->attributes )
    {
# skip binary we can't handle
      next if ( $attr =~ /;binary$/ );
      print "  $attr : ", $entr->get_value ( $attr ) ,"\n";
    }
    print "#-------------------------------\n";
  }
}

sub print_result_by_struct
{
  my ($struct) = @_;

#------------
#
# Accessing the data as if in a structure
#  i.e. Using the "as_struct"  method
#

  my $href = $result->as_struct;

# get an array of the DN names

  my @arrayOfDNs  = keys %$href;        # use DN hashes

# process each DN using it as a key
 
  foreach ( @arrayOfDNs )
  {
    print $_, "\n";
    my $valref = $$href{$_};

# get an array of the attribute names
# passed for this one DN.

    my @arrayOfAttrs = sort keys %$valref; #use Attr hashes

    my $attrName;	
    foreach $attrName (@arrayOfAttrs)
    {

# skip any binary data: yuck!

      next if ( $attrName =~ /;binary$/ );

# get the attribute value (pointer) using the
# attribute name as the hash

      my $attrVal =  @$valref{$attrName};
      print "\t $attrName: @$attrVal \n";
    }
    print "#-------------------------------\n";
  }
}

sub LDAPsearch
{
  my ($ldap,$searchString,$attrs,$base) = @_;

# if they don't pass a base... set it for them

  if (!$base ) { $base = "dc=Roodbms"; }

# if they don't pass an array of attributes...
# set up something for them

#  if (!$attrs ) { $attrs = [ 'cn','mail' ]; }
#  if (!$attrs ) { $attrs = [ 'cn', 'userPrincipalName' ]; }

  my $result = $ldap->search ( base    => "$base",
                               scope   => "sub",
                               filter  => "$searchString",
                               attrs   =>  $attrs
                             );

  return $result;
}

sub LDAPmodifyUsingHash
{
  my ($ldap, $dn, $whatToChange ) = @_;

  my $entry = Net::LDAP::Entry->new('DN');

  print STDOUT ("whatToChange= \n".Dumper(%$whatToChange)."\n\n");
#  my $result = $ldap->modify ( $dn,
#                               replace => { $whatToChange }
#                             );
#  return $result;

  $entry->changetype('modify'); 
  $entry->replace(%$whatToChange); # for adding and updating 
#  $entry->replace( "company" => "Roodbms");
  $entry->update($ldap);

  return $entry;
}

sub LDAPaddUsingHash
{
  my ($ldap, $dn, $whatToChange ) = @_;

  my $entry = Net::LDAP::Entry->new('DN');
  $entry->changetype('add'); 

  print STDOUT ("whatToChange= \n".Dumper(%$whatToChange)."\n\n");
#  my $result = $ldap->modify ( $dn,
#                               add => { $whatToChange }
#                             );
#  return $result;

  foreach my $attr (keys %$whatToChange)
  {
    $entry->add( $attr => $$whatToChange{$attr});
    $entry->update($ldap);
  }
  r eturn $entry;

}

and this is the result I get:
After: bind, mesg= 
$VAR1 = 'parent';
$VAR2 = bless( {
                 'net_ldap_version' => 3,
                 'net_ldap_scheme' => 'ldap',
                 'net_ldap_debug' => 0,
                 'net_ldap_socket' => bless( \*Symbol::GEN0, 'IO::Socket::INET' ),
                 'net_ldap_host' => 'mymachine.mydomain',
                 'net_ldap_uri' => 'mymachine.mydomain',
                 'net_ldap_resp' => {},
                 'net_ldap_mesg' => {},
                 'net_ldap_async' => 0,
                 'net_ldap_port' => 389,
                 'net_ldap_refcnt' => 1
               }, 'Net::LDAP' );
$VAR3 = 'errorMessage';
$VAR4 = '';
$VAR5 = 'ctrl_hash';
$VAR6 = undef;
$VAR7 = 'resultCode';
$VAR8 = 0;
$VAR9 = 'callback';
$VAR10 = undef;
$VAR11 = 'mesgid';
$VAR12 = 1;
$VAR13 = 'matchedDN';
$VAR14 = '';
$VAR15 = 'controls';
$VAR16 = undef;
$VAR17 = 'raw';
$VAR18 = undef;


result= 
$VAR1 = 'parent';
$VAR2 = bless( {
                 'net_ldap_version' => 3,
                 'net_ldap_scheme' => 'ldap',
                 'net_ldap_debug' => 0,
                 'net_ldap_socket' => bless( \*Symbol::GEN0, 'IO::Socket::INET' ),
                 'net_ldap_host' => 'mymachine.mydomain',
                 'net_ldap_uri' => 'mymachine.mydomain',
                 'net_ldap_resp' => {},
                 'net_ldap_mesg' => {},
                 'net_ldap_async' => 0,
                 'net_ldap_port' => 389,
                 'net_ldap_refcnt' => 1
               }, 'Net::LDAP' );
$VAR3 = 'entries';
$VAR4 = [
          bless( {
                   'changes' => [],
                   'changetype' => 'modify',
                   'asn' => {
                              'objectName' => 'CN=ordinary,CN=Users,DC=Roodbms',
                              'attributes' => [
                                                {
                                                  'type' => 'sn',
                                                  'vals' => [
                                                              'ordinary'
                                                            ]
                                                },
                                                {
                                                  'type' => 'title',
                                                  'vals' => [
                                                              'Functienaam'
                                                            ]
                                                },
                                                {
                                                  'type' => 'company',
                                                  'vals' => [
                                                              'BJU'
                                                            ]
                                                },
                                                {
                                                  'type' => 'countryCode',
                                                  'vals' => [
                                                              '0'
                                                            ]
                                                }
                                              ]
                            }
                 }, 'Net::LDAP::Entry' )
        ];
$VAR5 = 'errorMessage';
$VAR6 = '';
$VAR7 = 'ctrl_hash';
$VAR8 = undef;
$VAR9 = 'resultCode';
$VAR10 = 0;
$VAR11 = 'callback';
$VAR12 = undef;
$VAR13 = 'matchedDN';
$VAR14 = '';
$VAR15 = 'mesgid';
$VAR16 = 2;
$VAR17 = 'controls';
$VAR18 = undef;
$VAR19 = 'raw';
$VAR20 = undef;


DN: CN=ordinary,CN=Users,DC=Roodbms
  company : BJU
  countryCode : 0
  sn : ordinary
  title : Functienaam
#-------------------------------
Adding attribute: givenName with value: JustaName
whatToChange= 
$VAR1 = 'givenName';
$VAR2 = 'JustaName';


result (after add)= 
$VAR1 = 'parent';
$VAR2 = bless( {
                 'net_ldap_version' => 3,
                 'net_ldap_scheme' => 'ldap',
                 'net_ldap_debug' => 0,
                 'net_ldap_socket' => bless( \*Symbol::GEN0, 'IO::Socket::INET' ),
                 'net_ldap_host' => 'mymachine.mydomain',
                 'net_ldap_uri' => 'mymachine.mydomain',
                 'net_ldap_resp' => {},
                 'net_ldap_mesg' => {},
                 'net_ldap_async' => 0,
                 'net_ldap_port' => 389,
                 'net_ldap_refcnt' => 1
               }, 'Net::LDAP' );
$VAR3 = 'entries';
$VAR4 = [
          bless( {
                   'changes' => [],
                   'changetype' => 'modify',
                   'asn' => {
                              'objectName' => 'CN=ordinary,CN=Users,DC=Roodbms',
                              'attributes' => [
                                                {
                                                  'type' => 'sn',
                                                  'vals' => [
                                                              'ordinary'
                                                            ]
                                                },
                                                {
                                                  'type' => 'title',
                                                  'vals' => [
                                                              'Functienaam'
                                                            ]
                                                },
                                                {
                                                  'type' => 'company',
                                                  'vals' => [
                                                              'BJU'
                                                            ]
                                                },
                                                {
                                                  'type' => 'countryCode',
                                                  'vals' => [
                                                              '0'
                                                            ]
                                                }
                                              ]
                            }
                 }, 'Net::LDAP::Entry' )
        ];
$VAR5 = 'errorMessage';
$VAR6 = '';
$VAR7 = 'ctrl_hash';
$VAR8 = undef;
$VAR9 = 'resultCode';
$VAR10 = 0;
$VAR11 = 'callback';
$VAR12 = undef;
$VAR13 = 'matchedDN';
$VAR14 = '';
$VAR15 = 'mesgid';
$VAR16 = 4;
$VAR17 = 'controls';
$VAR18 = undef;
$VAR19 = 'raw';
$VAR20 = undef;


DN: CN=ordinary,CN=Users,DC=Roodbms
  company : BJU
  countryCode : 0
  sn : ordinary
  title : Functienaam
#-------------------------------
Modifying attribute: company to: Roodbms
whatToChange= 
$VAR1 = 'company';
$VAR2 = 'Roodbms';


result (after modify)= 
$VAR1 = 'parent';
$VAR2 = bless( {
                 'net_ldap_version' => 3,
                 'net_ldap_scheme' => 'ldap',
                 'net_ldap_debug' => 0,
                 'net_ldap_socket' => bless( \*Symbol::GEN0, 'IO::Socket::INET' ),
                 'net_ldap_host' => 'mymachine.mydomain',
                 'net_ldap_uri' => 'mymachine.mydomain',
                 'net_ldap_resp' => {},
                 'net_ldap_mesg' => {},
                 'net_ldap_async' => 0,
                 'net_ldap_port' => 389,
                 'net_ldap_refcnt' => 1
               }, 'Net::LDAP' );
$VAR3 = 'entries';
$VAR4 = [
          bless( {
                   'changes' => [],
                   'changetype' => 'modify',
                   'asn' => {
                              'objectName' => 'CN=ordinary,CN=Users,DC=Roodbms',
                              'attributes' => [
                                                {
                                                  'type' => 'sn',
                                                  'vals' => [
                                                              'ordinary'
                                                            ]
                                                },
                                                {
                                                  'type' => 'title',
                                                  'vals' => [
                                                              'Functienaam'
                                                            ]
                                                },
                                                {
                                                  'type' => 'company',
                                                  'vals' => [
                                                              'BJU'
                                                            ]
                                                },
                                                {
                                                  'type' => 'countryCode',
                                                  'vals' => [
                                                              '0'
                                                            ]
                                                }
                                              ]
                            }
                 }, 'Net::LDAP::Entry' )
        ];
$VAR5 = 'errorMessage';
$VAR6 = '';
$VAR7 = 'ctrl_hash';
$VAR8 = undef;
$VAR9 = 'resultCode';
$VAR10 = 0;
$VAR11 = 'callback';
$VAR12 = undef;
$VAR13 = 'matchedDN';
$VAR14 = '';
$VAR15 = 'mesgid';
$VAR16 = 6;
$VAR17 = 'controls';
$VAR18 = undef;
$VAR19 = 'raw';
$VAR20 = undef;


DN: CN=ordinary,CN=Users,DC=Roodbms
  company : BJU
  countryCode : 0
  sn : ordinary
  title : Functienaam
#-------------------------------

Thanks for any useful help that is offered!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.