Repair broken path behavior, remove unneeded #path_to_dn 'relative'
flag. FossilOrigin-Name: f8d9867129a2b157da3800f5e726e928a5bba06ea15cdf5f34ec156e4b34f437
This commit is contained in:
parent
38c021a71d
commit
f76e7b1acf
1 changed files with 55 additions and 59 deletions
98
shelldap
98
shelldap
|
|
@ -195,16 +195,16 @@ add a list of attributes to display. Use '+' for server side attributes.
|
||||||
|
|
||||||
=item B< cd>
|
=item B< cd>
|
||||||
|
|
||||||
Change DN. Translated to LDAP, this changes the current basedn.
|
Change directory. Translated to LDAP, this changes the current basedn.
|
||||||
All commands after a 'cd' operate within the new basedn.
|
All commands after a 'cd' operate within the new basedn.
|
||||||
|
|
||||||
cd change to 'home' basedn
|
cd change to 'home' basedn
|
||||||
cd ~ same thing
|
cd ~ change to the binddn, or basedn if anonymously bound
|
||||||
cd - change to previous node
|
cd - change to previous node
|
||||||
cd ou=People change to explicit path below current node
|
cd ou=People change to explicit path below current node
|
||||||
cd .. change to parent node
|
cd .. change to parent node
|
||||||
cd ..,..,ou=Groups change to node ou=Groups, which is a sibling
|
cd ../../ou=Groups change to node ou=Groups, which is a sibling
|
||||||
to the current node's parent node
|
to the current node's grandparent
|
||||||
|
|
||||||
Since LDAP doesn't actually limit what can be a container object, you
|
Since LDAP doesn't actually limit what can be a container object, you
|
||||||
can actually cd into any entry. Many commands then work on '.', meaning
|
can actually cd into any entry. Many commands then work on '.', meaning
|
||||||
|
|
@ -372,8 +372,8 @@ use warnings;
|
||||||
use Term::ReadKey;
|
use Term::ReadKey;
|
||||||
use Term::Shell;
|
use Term::Shell;
|
||||||
use Digest::MD5;
|
use Digest::MD5;
|
||||||
use Net::LDAP qw(LDAP_SUCCESS LDAP_SERVER_DOWN);
|
use Net::LDAP qw/ LDAP_SUCCESS LDAP_SERVER_DOWN /;
|
||||||
use Net::LDAP::Util qw(canonical_dn ldap_explode_dn);
|
use Net::LDAP::Util qw/ canonical_dn ldap_explode_dn /;
|
||||||
use Net::LDAP::LDIF;
|
use Net::LDAP::LDIF;
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
use File::Temp;
|
use File::Temp;
|
||||||
|
|
@ -733,51 +733,54 @@ sub update_entries
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert a given path to a DN: deal with '..', '.', '~'
|
# convert a given path to a DN: deal with '..', '.'
|
||||||
# Synopsis: $dn = $self->path_to_dn($path, [relative => N]);
|
# Synopsis: $dn = $self->path_to_dn( $path );
|
||||||
sub path_to_dn
|
sub path_to_dn
|
||||||
{
|
{
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $path = shift;
|
my $path = shift;
|
||||||
my %flags = @_;
|
my %flags = @_;
|
||||||
my $base = $self->base();
|
my $curbase = $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 current base DN
|
||||||
return($base) if ($path eq '.');
|
return $curbase if $path eq '.';
|
||||||
|
|
||||||
if ($path =~ /^\.\./o) { # relative path
|
# support 'cd -'
|
||||||
|
return $self->{'previous_base'} if $path eq '-';
|
||||||
|
|
||||||
|
# support empty 'cd' or 'cd ~' going to root
|
||||||
|
return $conf->{'basedn'} if $path eq '~' || ! $path;
|
||||||
|
|
||||||
|
# relative path, upwards
|
||||||
|
#
|
||||||
|
if ( $path =~ /^\.\./o ) {
|
||||||
# support '..' (possibly iterated and as prefix to a DN)
|
# support '..' (possibly iterated and as prefix to a DN)
|
||||||
my @base = @{ldap_explode_dn($base, casefold => 'none')};
|
my @base = @{ ldap_explode_dn($curbase, casefold => 'none') };
|
||||||
|
|
||||||
# deal with leading ..,
|
# deal with leading ..,
|
||||||
while ($path =~ /^\.\./) {
|
while ( $path =~ /^\.\./ ) {
|
||||||
shift(@base) if (@base);
|
shift( @base ) if @base;
|
||||||
$path =~ s/^\.\.//;
|
$path =~ s/^\.\.//;
|
||||||
last if ($path !~ /,\s*/);
|
last if $path !~ /[,\/]\s*/;
|
||||||
$path =~ s/,\s*//;
|
$path =~ s/[,\/]\s*//;
|
||||||
}
|
}
|
||||||
|
|
||||||
# build a new absolute DN
|
# append the new dn to the node if one was specified:
|
||||||
$path .= ',' . canonical_dn(\@base, casefold => 'none')
|
# cd ../../cn=somewhere vs
|
||||||
if (@base);
|
# cd ../../
|
||||||
}
|
#
|
||||||
elsif ($path =~ /,\s*~$/o) { # absolute path
|
my $newbase_root = canonical_dn( \@base, casefold => 'none' );
|
||||||
$path =~ s/,\s*~$//;
|
$path = $path ? $path . ',' . $newbase_root : $newbase_root;
|
||||||
$path.= ','.$conf->{basedn}
|
|
||||||
if ($conf->{basedn});
|
|
||||||
}
|
|
||||||
else { # relative or absolute path
|
|
||||||
$path.= ','.$conf->{basedn}
|
|
||||||
if ($conf->{basedn} && $flags{relative});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return($path);
|
# attach the base if it isn't already there (this takes care of
|
||||||
|
# deeper relative nodes and absolutes)
|
||||||
|
#
|
||||||
|
else {
|
||||||
|
$path = "$path," . $curbase unless $path =~ /$curbase/;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
# given an array ref of shell-like globs,
|
# given an array ref of shell-like globs,
|
||||||
|
|
@ -985,7 +988,7 @@ sub run_cat
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
# convert given path to DN
|
# convert given path to DN
|
||||||
$dn = $self->path_to_dn($dn, relative => 1);
|
$dn = $self->path_to_dn( $dn );
|
||||||
$s = $self->search({
|
$s = $self->search({
|
||||||
base => $dn,
|
base => $dn,
|
||||||
vals => 1,
|
vals => 1,
|
||||||
|
|
@ -1010,16 +1013,8 @@ sub run_cd
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $newbase = join ' ', @_;
|
my $newbase = join ' ', @_;
|
||||||
|
|
||||||
# support 'cd' going to root
|
|
||||||
$newbase ||= $conf->{'basedn'};
|
|
||||||
|
|
||||||
# support 'cd -'
|
|
||||||
if ( $newbase eq '-' ) {
|
|
||||||
$newbase = $self->{'previous_base'} || return;
|
|
||||||
}
|
|
||||||
|
|
||||||
# convert given path to a DN
|
# convert given path to a DN
|
||||||
$newbase = $self->path_to_dn($newbase, relative => 1);
|
$newbase = $self->path_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";
|
||||||
|
|
@ -1067,7 +1062,7 @@ sub run_copy
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert given source path to DN
|
# convert given source path to DN
|
||||||
$s_dn = $self->path_to_dn($s_dn, relative => 1);
|
$s_dn = $self->path_to_dn( $s_dn );
|
||||||
|
|
||||||
my $s = $self->search({ base => $s_dn, vals => 1 });
|
my $s = $self->search({ base => $s_dn, vals => 1 });
|
||||||
unless ( $s->{'code'} == LDAP_SUCCESS ) {
|
unless ( $s->{'code'} == LDAP_SUCCESS ) {
|
||||||
|
|
@ -1236,7 +1231,7 @@ sub run_edit
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert given path to DN
|
# convert given path to DN
|
||||||
$dn = $self->path_to_dn($dn, relative => 1);
|
$dn = $self->path_to_dn( $dn );
|
||||||
|
|
||||||
my $s = $self->search({ base => $dn, vals => 1 });
|
my $s = $self->search({ base => $dn, vals => 1 });
|
||||||
|
|
||||||
|
|
@ -1398,8 +1393,9 @@ sub run_grep
|
||||||
print "No search base specified.\n";
|
print "No search base specified.\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert base path to DN
|
# convert base path to DN
|
||||||
$base = $self->path_to_dn($base, relative => 1);
|
$base = $self->path_to_dn( $base );
|
||||||
|
|
||||||
$self->debug("Filter parsed as: " . $filter->as_string() . "\n");
|
$self->debug("Filter parsed as: " . $filter->as_string() . "\n");
|
||||||
|
|
||||||
|
|
@ -1574,7 +1570,7 @@ sub run_mkdir
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert given path to DN
|
# convert given path to DN
|
||||||
$dir = $self->path_to_dn($dir, relative => 1);
|
$dir = $self->path_to_dn( $dir );
|
||||||
|
|
||||||
# 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));
|
||||||
|
|
@ -1625,7 +1621,7 @@ sub run_move
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert given source path to DN
|
# convert given source path to DN
|
||||||
$s_dn = $self->path_to_dn($s_dn, relative => 1);
|
$s_dn = $self->path_to_dn( $s_dn );
|
||||||
|
|
||||||
unless ( $self->is_valid_dn( $s_dn ) ) {
|
unless ( $self->is_valid_dn( $s_dn ) ) {
|
||||||
print "No such object\n";
|
print "No such object\n";
|
||||||
|
|
@ -1666,7 +1662,7 @@ sub run_passwd
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert given path to DN
|
# convert given path to DN
|
||||||
$self->path_to_dn($dn, relative => 1);
|
$self->path_to_dn( $dn );
|
||||||
|
|
||||||
my $s = $self->search( { base => $dn, scope => 'base' } );
|
my $s = $self->search( { base => $dn, scope => 'base' } );
|
||||||
if ( $s->{'code'} ) {
|
if ( $s->{'code'} ) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue