--- loncom/LondConnection.pm 2004/06/17 09:26:09 1.31 +++ loncom/LondConnection.pm 2005/05/27 21:49:18 1.37 @@ -1,7 +1,7 @@ # This module defines and implements a class that represents # a connection to a lond daemon. # -# $Id: LondConnection.pm,v 1.31 2004/06/17 09:26:09 foxr Exp $ +# $Id: LondConnection.pm,v 1.37 2005/05/27 21:49:18 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use LONCAPA::lonssl; -my $DebugLevel=11; +my $DebugLevel=0; my %hostshash; my %perlvar; my $LocalDns = ""; # Need not be defined for managers. @@ -153,9 +153,19 @@ Dump the internal state of the object: F sub Dump { my $self = shift; + my $level = shift; + my $now = time; + my $local = localtime($now); + + if ($level >= $DebugLevel) { + return; + } + + my $key; my $value; - print STDERR "Dumping LondConnectionObject:\n"; + print STDERR "[ $local ] Dumping LondConnectionObject:\n"; + print STDERR join(':',caller(1))."\n"; while(($key, $value) = each %$self) { print STDERR "$key -> $value\n"; } @@ -225,6 +235,9 @@ sub new { my @ConfigLine = @{$hostshash{$Hostname}}; my $DnsName = $ConfigLine[3]; # 4'th item is dns of host. Debug(5, "Connecting to ".$DnsName); + # if it is me use loopback for connection + if ($DnsName eq $LocalDns) { $DnsName="127.0.0.1"; } + Debug(8, "Connecting to $DnsName I am $LocalDns"); # Now create the object... my $self = { Host => $DnsName, LoncapaHim => $Hostname, @@ -250,16 +263,16 @@ sub new { Type => SOCK_STREAM, Proto => "tcp", Timeout => 3)) { + Debug(8, "Error? \n$@ \n$!"); return undef; # Inidicates the socket could not be made. } my $socket = $self->{Socket}; # For local use only. - # If we are local, we'll first try local auth mode, otherwise, we'll try the - # ssl auth mode: + # If we are local, we'll first try local auth mode, otherwise, we'll try + # the ssl auth mode: - Debug(8, "Connecting to $DnsName I am $LocalDns"); my $key; my $keyfile; - if ($DnsName eq $LocalDns) { + if ($DnsName eq '127.0.0.1') { $self->{AuthenticationMode} = "local"; ($key, $keyfile) = lonlocal::CreateKeyFile(); Debug(8, "Local key: $key, stored in $keyfile"); @@ -284,10 +297,29 @@ sub new { return undef; } - } + } else { - $self->{AuthenticationMode} = "ssl"; - $self->{TransactionRequest} = "init:ssl\n"; + # Remote peer: I'd like to do ssl, but if my host key or certificates + # are not all installed, my only choice is insecure, if that's + # allowed: + + my ($ca, $cert) = lonssl::CertificateFile; + my $sslkeyfile = lonssl::KeyFile; + + if((defined $ca) && (defined $cert) && (defined $sslkeyfile)) { + + $self->{AuthenticationMode} = "ssl"; + $self->{TransactionRequest} = "init:ssl\n"; + } else { + if($InsecureOk) { # Allowed to do insecure: + $self->{AuthenticationMode} = "insecure"; + $self->{TransactionRequest} = "init\n"; + } + else { # Not allowed to do insecure... + $socket->close; + return undef; + } + } } # @@ -315,7 +347,7 @@ sub new { # return the object : Debug(9, "Initial object state: "); - $self->Dump(); + $self->Dump(9); return $self; } @@ -527,7 +559,7 @@ sub Readable { my $answer = $self->{TransactionReply}; if($answer =~ /^enc\:/) { $answer = $self->Decrypt($answer); - $self->{TransactionReply} = $answer; + $self->{TransactionReply} = "$answer\n"; } # finish the transaction @@ -925,6 +957,7 @@ sub Decrypt { # $length tells us the actual length of the decrypted string: $decrypted = substr($decrypted, 0, $length); + Debug(9, "Decrypted $EncryptedString to $decrypted"); return $decrypted; @@ -978,7 +1011,7 @@ sub CreateCipher { if($cipher) { $self->{Cipher} = $cipher; Debug("Cipher created dumping socket: "); - $self->Dump(); + $self->Dump(9); return 1; } else { @@ -1156,7 +1189,7 @@ sub read_conf #---------------------- Subroutine read_hosts: Read a LON-CAPA hosts.tab # formatted configuration file. # -my $RequiredCount = 5; # Required item count in hosts.tab. +my $RequiredCount = 4; # Required item count in hosts.tab. my $DefaultMaxCon = 5; # Default value for maximum connections. my $DefaultIdle = 1000; # Default connection idle time in seconds. my $DefaultMinCon = 0; # Default value for minimum connections. @@ -1165,9 +1198,10 @@ sub read_hosts { my $Filename = shift; my %HostsTab; - open(CONFIG,'<'.$Filename) or die("Can't read $Filename"); + open(CONFIG,'<'.$Filename) or die("Can't read $Filename"); while (my $line = ) { - if (!($line =~ /^\s*\#/)) { + if ($line !~ /^\s*\#/) { + $line=~s/\s*$//; my @items = split(/:/, $line); if(scalar @items >= $RequiredCount) { if (scalar @items == $RequiredCount) { # Only required items: