On Thu, May 18, 2006 11:14 am, Quanah Gibson-Mount wrote:
>
> I was able to use Authen::SASL to do GSSAPI authentication via finger &
> whois, using the Authen-SASL-GSSAPI-server package.
What you show below is basically what most modules, eg Net::POP3 and
Net::LDAP, do behind the scenes.
I think the question that Dennis needs answered is what to use as callback
values when authenticating using Kerberos, SASL and GSSAPI
Graham.
>
> The following are my code snippets that may help you in the right
> direction:
>
> ############################################################################
> # SASL related subroutines
> ############################################################################
>
> sub sendreply
> {
> $SIG{PIPE} = 'IGNORE'; # Client is closing too fast
> my ($s,$so) = @_;
> $s = " " unless $s;
> #print "Sendreply: ",substr($s,0,10),"\n";
> syswrite ($so,$s);
> }
>
> sub getreply
> {
> my ($so) = @_;
> my $s;
> #print "Getreply is waiting.\n";
> sysread($so,$s,4096);
> #print "Getreply: ",substr($s,0,10),"\n";
> return $s;
> }
>
>
> sub query_server {
> my ($server, $query, $port) = @_;
>
> # I tried using IO::Socket here, but the load time was noticeable.
> # Using Getopt::Long is bad enough. On top of that, IO::Socket
> doesn't
> # return meaningful error codes that I can see, so one can't
> distinguish
> # between, say, "connection refused" and "host unreachable."
> my $address = inet_aton ($server)
> or die "Can't resolve server name $server\n";
> my $proto = getprotobyname 'tcp';
> $port ||= 43;
> if ($port =~ /\D/) {
> my $service = $port;
> $port = getservbyname ($service, 'tcp')
> or die "Unknown service $service\n";
> }
>
> socket (S, PF_INET, SOCK_STREAM, $proto)
> or die "Can't create local socket: $!\n";
> connect (S, sockaddr_in ($port, $address))
> or die "Can't connect to $server: $!\n";
> my $oldfh = select S; $| = 1; select $oldfh;
>
> my $remote_ip = inet_ntoa($address);
> my ($local_port, $local_ip) = sockaddr_in(getsockname(S));
> $local_ip = inet_ntoa($local_ip);
> #print "$local_ip;$local_port $remote_ip;$port\n";
>
> my $saslClient = Authen::SASL->new (
> mechanism => "GSSAPI",
> callback => {
> }
> );
> my $conn = $saslClient->client_new("host", "$remote_ip",
> "$local_ip;$local_port", "$remote_ip;$port");
>
> sendreply($conn->client_start(),\*S,0);
> while ($conn->need_step) {
> sendreply($conn->client_step(&getreply(\*S) ), \*S );
> }
>
>
>
>
>
> --Quanah
>
>
> --
> Quanah Gibson-Mount
> Principal Software Developer
> ITS/Shared Application Services
> Stanford University
> GnuPG Public Key: http://www.stanford.edu/~quanah/pgp.html
>
>