Sau đĩ, FollowURL( ) tạo ra một đối tượng URI::ldap mới bằng cách dùng chuỗi ký tự lưu trữ trong $url:
print "$url\n";
$link = URI::ldap->new( $url );
Một đối tượng URI::ldap cĩ một vài lệnh để cĩ được các thành phần của URL. Chúng ta sẽ bàn về các lệnh host( ), port( ), và dn( ), nĩ cho chúng ta biết tên host của LDAP server, cổng được dùng trong một kết nối mới, và hậu tố tìm kiếm cơ sở để sử dụng khi kết nối với server thư mục. Với các thơng tin mới này, bạn cĩ thể tạo ra một đối tượng Net::LDAP được kết nối tới server mới:
$ldap = Net::LDAP->new( $link->host( ),
port => $link->port( ), version => 3 )
or { warn $!; return; };
Cách thuận tiện nhất để tiếp tục truy vấn đến server mới là gọi search( ) lần nữa, thơng qua
ProcessSearch( ) như là một callback thường lệ.
$msg = $ldap->search( base => $link->dn( ), scope => "sub",
filter => "(cn=$ARGV[0])", callback => \&ProcessSearch ); $msg->error( ) if $msg->code( );
}
Lần đầu tiên bạn gọi lệnh search ( ), bạn đã kiểm tra xem liệu việc tìm kiếm cĩ trả về một referral hay khơng. Đừng thực hiện việc kiểm tra đĩ với lệnh FollowLink ( ), vì LDAP reference sẽ gởi yêu cầu của bạn tới server cĩ thể thực hiện việc truy vấn này. Nếu server mới gởi cho bạn một referral, đừng theo referral đĩ.
Giờ ta xem lại việc thực hiện của hàm ProcessReferral( ). Net::LDAP::Message cung cấp một vài lệnh để kiểm sốt điều kiện lỗi. Trong trường hợp của LDAP_REFERRAL, chương trình con the referrals( ) được dùng để cĩ được danh sách của các LDAP URL được trả về từ server. Việc thực hiện của ProcessReferral( ) là đơn giản vì bạn đã hồn thành hầu hết cơng việc trong lệnh FollowURL( ); nĩ chỉ đơn giản là một hàm đĩng gĩi, nĩ sẽ giải nén danh sách URL, và gọi hàm FollowURL( ) cho mỗi mục:
sub ProcessReferral { my ( @links ) = @_;
FollowURL($link); }
}
Khi được thực hiện, fullsearch.pl cho ra output như sau:
$ ./fullsearch.pl "test*" -------------------------------------------------------- dn:uid=testuser,ou=people,dc=plainjoe,dc=org objectClass: posixAccount uid: testuser uidNumber: 1013 gidNumber: 1000 homeDirectory: /home/tashtego/testuser loginShell: /bin/bash cn: testuser ldap://tashtego.plainjoe.org/ou=test1,dc=plainjoe,dc=org -------------------------------------------------------- dn:cn=test user,ou=test1,dc=plainjoe,dc=org objectClass: person sn: user cn: test user