Hi, this is outside the scope of this list, but I would not expect that a perl object survives between two invocations of a CGI script.
Regards Peter On Monday, 18. September 2006 22:35, Andrej Ricnik-Bay wrote: > On 9/19/06, Peter Marschall <[EMAIL PROTECTED]> wrote: > > Hi, > > Hi Peter, > > > Please keep your reply to the list !!! > > You deprive others of the help you get if you send personal mail > > in response to posts that help you with your requests. > > Sorry, only clicking on the reply is a bad habit, I'll watch it. > > > You still do work with packages ! > > Nope - that was just to point out that I had used the package in the > original script since you asked about that. The new version doesn't > have it at all > > > Why don't you do it the clean way: > > pass the $ldap object as a parameter to search_it() > > instead of relying on global variables, which is > > a bad habit anyway. > > I had tried that, too, with no effect. > > > From what I can tell, the problem described is neither > > a timing problem nor a problem of perl-ldap. > > Hmmm ... where else to look (if it blows the scope of the list)? > > Here's the full script (not overly elegant, I admit). > > --------8<--------8<--------8<--------8<--------8<--------8<--------8<----- >--- #!/usr/bin/perl -w > # Andrej - [EMAIL PROTECTED] > # On our way to a CGI script that queries LDAP and outputs CSV > use strict; > use Net::LDAP; > use Net::LDAP::Search; > use Net::LDAP::Entry; > > our ( > $ldap, $ldapbasedn, $ldappassword, > $value, $data, $ldapuser, > $mesg, $query, %token, > $attr, $entr, $param, > @entry > ); #declared via "our" because we have external components writing to > these use vars qw($pair @pairs $name $data $ldappassword $ldapuser $query); > # for when "our" isn't good enough =/ > sub print_header() { > print <<END; > Content-type: text/html\n\n > <HTML> > <HEAD> > <meta http-equiv="Content-Type" content="text/html"> > <meta name="GENERATOR" content="vim - baby!"> > <title>LDAP query => CSV output</title> > </HEAD> > <BODY> > END > } > > sub print_footer() { > print <<END; > </BODY> > </HTML> > END > } > > > #ldap connection for spitting data at. > sub ldapconnect { > #Connect > $ldap = Net::LDAP->new( "auth", port => 389, async => 0 ); > if ( !defined $ldap ) { > exit; > } > > #Authenticate > print "<br>in ldapconnect<br>\n"; > my $mesg = $ldap->bind( $ldapuser, password => $ldappassword ); > my $result = parseldapresponse($mesg); > if ( $result ne "0000" ) { > # debug-info > print "<br>leaving ldapconnect with error<br>\n"; > exit; > } > # debug-info > print "<br>leaving ldapconnect<br>\n"; > } > > > sub parseldapresponse { > my ($mesg) = @_; > my $errorcode = $mesg->code; > # debug-info > print "<BR<BR>Errorcode: $errorcode <BR><BR>\n"; > return "0000" if ( $errorcode == 0 ); > return "2003" > if ( $errorcode == 20 || $errorcode == 68 ) > ; # attribute exists or value exists > return "2000" > if ( ( $errorcode > 15 && $errorcode < 37 ) > > || ( $errorcode > 63 && $errorcode < 71 ) > || $errorcode == 53 ); > > return "3000"; > } > > sub show_attrs { > print <<END; > <FORM METHOD="POST" ACTION="./ldapcsv.cgi"> > <SELECT NAME="Attributes" SIZE="10" MULTIPLE> > END > > open MYLIST, '<../htdocs/attributes.conf' or die "Can't open file"; > while( <MYLIST>){ > print "<OPTION VALUE=\"$_\">$_</OPTION>\n"; > }; > close MYLIST; > > print <<END2; > </SELECT> > <INPUT TYPE="SUBMIT" NAME="Process"> > END2 > } > > sub search_it { > print "<BR>In search_it: <BR>\n"; > my ( $param ) = @_ ; > $mesg = $ldap->search( > base => 'ou=people,ou=users,o=org', > filter => "(uid=*)", > scope => 'sub', > attrs => [ $param ], > timelimit => 90 > ); > if ( $mesg->code == 0 ) { > my @entry = $mesg->entries; > if (@entry) { > foreach my $entr (@entry) { > my $attr; > foreach $attr ( sort $entr->attributes ) { > print " $attr : ", $entr->get_value($attr), "\n"; > } > } > } > } > } > > sub process_attrs { > @pairs = split( "&", $data); > #print "Anything here at all? $data <BR>\n"; > foreach $pair (@pairs) { > $name=""; $value=""; > # print "<BR>SPACER<BR> $#pairs <BR>\n"; > $pair =~ tr/+/ /; > $pair =~ s/%(..)/pack("C", hex($1))/eg; > $pair =~ m/(\w+)(?:=)?(.+)/ ; > if( defined $2 && $2 ne "=" ) { > $name=$1; > $value=$2; > chomp $name; > chomp $value; > if ( $name =~ /Attributes/ && defined $query ){ > $query .= ", '".$value."'" > } else { > $query = "'".$value."'" > } > } > } > } > > > sub get_login { > @pairs = split( "&", $data); > foreach $pair (@pairs) { > $pair =~ tr/+/ /; > $pair =~ s/%(..)/pack("C", hex($1))/eg; > $pair =~ m/(\w+)(?:=)?(.+)/ ; > if( defined $2) { > $name=$1; > $value=$2; > chomp $name; > chomp $value; > print "<BR>Name: $name \tValue: $value <BR> \n"; > $token{$name} = $value; > } > } > $ldapuser = $token{"cn"}; > $ldappassword = $token{"passwd"}; > } > > sub print_login { > print <<END; > <HTML> > <HEAD> > <TITLE>ldap query</TITLE> > </HEAD> > <BODY> > <P>Please supply your LDAP credentials</P> > <FORM METHOD="POST" ACTION="./ldapcsv.cgi"> > <INPUT TYPE="TEXT" NAME="cn" MAXLENGTH="25" SIZE="25" ><BR> > <INPUT TYPE="PASSWORD" NAME="passwd" SIZE="25" MAXLENGTH="25"><BR> > <INPUT TYPE="SUBMIT" NAME="Login"> > </BODY> > </HTML> > END > } > > print_header(); > read( STDIN, $data, $ENV{"CONTENT_LENGTH"}); > if( length $data == 0 ){ > print_login(); > } > if( $data =~ /Login/){ > get_login(); > print "<BR> $ldapuser<BR>\n"; > ldapconnect(); > show_attrs(); > } > if( $data =~ /Process/){ > print "<BR>Process clicked!<BR>\n"; > process_attrs(); > print "<BR> $query <BR>\n"; > search_it( $query ); > } > print_footer(); > > --------8<--------8<--------8<--------8<--------8<--------8<--------8<----- >--- I still find it odd that connect & bind work, but search fails... > > > Peter > > Cheers, > Andrej -- Peter Marschall [EMAIL PROTECTED]