[LON-CAPA-cvs] cvs: loncom / lonssl.pm
foxr
lon-capa-cvs@mail.lon-capa.org
Wed, 26 May 2004 11:12:59 -0000
foxr Wed May 26 07:12:59 2004 EDT
Modified files:
/loncom lonssl.pm
Log:
Add coded versions of:
PromoteClientSocket
PromoteServerSocket
Close
Who knows if I commit often enough, maybe I'll win!!
Index: loncom/lonssl.pm
diff -u loncom/lonssl.pm:1.1 loncom/lonssl.pm:1.2
--- loncom/lonssl.pm:1.1 Wed May 26 06:19:54 2004
+++ loncom/lonssl.pm Wed May 26 07:12:58 2004
@@ -0,0 +1,135 @@
+#
+# $Id: lonssl.pm,v 1.2 2004/05/26 11:12:58 foxr Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+
+# lonssl.pm
+# This file contains common functions used by lond and lonc when
+# negotiating the exchange of the session encryption key via an
+# SSL tunnel.
+# See the POD sections and function documentation for more information.
+#
+
+use strict;
+use IO::Socket::INET;
+use IO::Socket::SSL;
+
+
+#--------------------------------------------------------------------------
+#
+# Name PromoteClientSocket
+# Description Given an ordinary IO::Socket::INET Creates an SSL socket
+# for a client that is connected to the same server.
+# Parameters Name Type Description
+# Socket IO::Socket::INET Original ordinary socket.
+# CACert string Full path name to the certificate
+# authority certificate file.
+# MyCert string Full path name to the certificate
+# issued to this host.
+# KeyFile string Full pathname to the host's private
+# key file for the certificate.
+# Returns
+# - Reference to an SSL socket on success
+# - undef on failure. Reason for failure can be interrogated from
+# IO::Socket::SSL
+
+sub PromoteClientSocket {
+ my $PlaintextSocket = shift;
+ my $CACert = shift;
+ my $MyCert = shift;
+ my $KeyFile = shift;
+
+ # To create the ssl socket we need to duplicate the existing
+ # socket. Otherwise closing the ssl socket will close the plaintext socket
+ # too:
+
+ open (DUPLICATE, "+>$PlaintextSocket");
+
+ my $client = IO::Socket::SSL->new_from_fd(fileno(DUPLICATE),
+ SSL_user_cert => 1,
+ SSL_key_file => $KeyFile,
+ SSL_cert_file => $MyCert,
+ SSL_ca_fie => $$CACert);
+
+ return $client; # Undef if the client negotiation fails.
+}
+
+#----------------------------------------------------------------------
+# Name PromoteServerSocket
+# Description Given an ordinary IO::Socket::INET Creates an SSL socket
+# for a server that is connected to the same client.l
+# Parameters Name Type Description
+# Socket IO::Socket::INET Original ordinary socket.
+# CACert string Full path name to the certificate
+# authority certificate file.
+# MyCert string Full path name to the certificate
+# issued to this host.
+# KeyFile string Full pathname to the host's private
+# key file for the certificate.
+# Returns
+# - Reference to an SSL socket on success
+# - undef on failure. Reason for failure can be interrogated from
+# IO::Socket::SSL
+sub PromoteServerSocket
+{
+ my $PlaintextSocket = shift;
+ my $CACert = shift;
+ my $MyCert = shift;
+ my $KeyFile = shift;
+
+
+ # To create the ssl socket we need to duplicate the existing
+ # socket. Otherwise closing the ssl socket will close the plaintext socket
+ # too:
+
+ open (DUPLICATE, "+>$PlaintextSocket");
+
+ my $client = IO::Socket::SSL->new_from_fd(fileno(DUPLICATE),
+ SSL_server => 1, # Server role.
+ SSL_user_cert => 1,
+ SSL_key_file => $KeyFile,
+ SSL_cert_file => $MyCert,
+ SSL_ca_fie => $$CACert);
+ return $client;
+}
+
+#-------------------------------------------------------------------------
+#
+# Name: Close
+# Description: Properly closes an ssl client or ssl server socket in
+# a way that keeps the parent socket open.
+# Parameters: Name Type Description
+# Socket IO::Socket::SSL SSL Socket gotten from either
+# PromoteClientSocket or
+# PromoteServerSocket
+# Returns:
+# NONE
+#
+sub Close {
+ my $Socket = shift;
+
+ $Socket->close(SSL_no_shutdown =>1); # Otherwise the parent socket
+ # gets torn down.
+}
+