add method path_to_dn() to convert a given "path" to a DN
path_to_dn() replaces the occurrences of '~', '.' and '..' in a path given and returns a DN. However, it does not check whether the DN is valid. Especially: - on return it is not guaranteed that the DN exists - on return the first part does not need to be a valid RDN FossilOrigin-Name: 1a4e3173146358f3a34c1e0c1d220b87c85a4827431c677adb9f0249bab73982
This commit is contained in:
parent
1f684aa21d
commit
7fb1878c47
1 changed files with 51 additions and 21 deletions
72
shelldap
72
shelldap
|
|
@ -754,6 +754,53 @@ sub update_entries
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# convert a given path to a DN: deal with '..', '.', '~'
|
||||||
|
# Synopsis: $dn = $self->path_to_dn($path, [relative => N]);
|
||||||
|
sub path_to_dn
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $path = shift;
|
||||||
|
my %flags = @_;
|
||||||
|
my $base = $self->base();
|
||||||
|
|
||||||
|
# fail on wrong / missing parameter
|
||||||
|
return undef if (!defined($path));
|
||||||
|
|
||||||
|
# return configured base DN
|
||||||
|
return($conf->{basedn}) if ($path eq '~');
|
||||||
|
|
||||||
|
# return current base DN
|
||||||
|
return($base) if ($path eq '.');
|
||||||
|
|
||||||
|
if ($path =~ /^\.\./o) { # relative path
|
||||||
|
# support '..' (possibly iterated and as prefix to a DN)
|
||||||
|
my @base = @{ldap_explode_dn($base, casefold => 'none')};
|
||||||
|
|
||||||
|
# deal with leading ..,
|
||||||
|
while ($path =~ /^\.\./) {
|
||||||
|
shift(@base) if (@base);
|
||||||
|
$path =~ s/^\.\.//;
|
||||||
|
last if ($path !~ /,\s*/);
|
||||||
|
$path =~ s/,\s*//;
|
||||||
|
}
|
||||||
|
|
||||||
|
# build a new absolute DN
|
||||||
|
$path .= ',' . canonical_dn(\@base, casefold => 'none')
|
||||||
|
if (@base);
|
||||||
|
}
|
||||||
|
elsif ($path =~ /,\s*~$/o) { # absolute path
|
||||||
|
$path =~ s/,\s*~$//;
|
||||||
|
$path.= ','.$conf->{basedn}
|
||||||
|
if ($conf->{basedn});
|
||||||
|
}
|
||||||
|
else { # relative or absolute path
|
||||||
|
$path.= ','.$conf->{basedn}
|
||||||
|
if ($conf->{basedn} && $flags{relative});
|
||||||
|
}
|
||||||
|
|
||||||
|
return($path);
|
||||||
|
}
|
||||||
|
|
||||||
# given an array ref of shell-like globs,
|
# given an array ref of shell-like globs,
|
||||||
# make and return an LDAP filter object.
|
# make and return an LDAP filter object.
|
||||||
#
|
#
|
||||||
|
|
@ -991,25 +1038,8 @@ sub run_cd
|
||||||
$newbase = $self->{'previous_base'} || return;
|
$newbase = $self->{'previous_base'} || return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# support '..' (possibly iterated and as prefix to a DN)
|
# convert given path to a DN
|
||||||
if ( $newbase =~ /^\.\.,?/ ) {
|
$newbase = $self->path_to_dn($newbase, relative => 1);
|
||||||
my @curbase = @{ldap_explode_dn($self->base(), casefold => 'none')};
|
|
||||||
|
|
||||||
# deal with leading ..,
|
|
||||||
while ($newbase =~ /^\.\./) {
|
|
||||||
shift(@curbase) if (@curbase);
|
|
||||||
$newbase =~ s/^\.\.//;
|
|
||||||
last if ($newbase !~ /,\s*/);
|
|
||||||
$newbase =~ s/,\s*//;
|
|
||||||
}
|
|
||||||
|
|
||||||
# build a new absolute DN
|
|
||||||
$newbase .= ',' . canonical_dn(\@curbase, casefold => 'none')
|
|
||||||
if (@curbase);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$self->rdn_to_dn( \$newbase );
|
|
||||||
}
|
|
||||||
|
|
||||||
unless ( $self->is_valid_dn( $newbase ) ) {
|
unless ( $self->is_valid_dn( $newbase ) ) {
|
||||||
print "No such object\n";
|
print "No such object\n";
|
||||||
|
|
@ -1562,8 +1592,8 @@ sub run_mkdir
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ToDo: path_to_dn
|
# convert given path to DN
|
||||||
$self->rdn_to_dn( \$dir );
|
$dir = $self->path_to_dn($dir, relative => 1);
|
||||||
|
|
||||||
# normalize name, if it is not yet a legal DN
|
# normalize name, if it is not yet a legal DN
|
||||||
$dir = 'ou='.$dir if (!canonical_dn($dir));
|
$dir = 'ou='.$dir if (!canonical_dn($dir));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue