/* * $Id: SSLTunnelSocket.java,v 1.7 2006-09-05 13:19:53 tigran Exp $ */ package javatunnel; import javax.security.auth.Subject; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.security.Principal; import org.dcache.auth.UserNamePrincipal; public class SSLTunnelSocket extends Socket implements TunnelSocket { private final Socket sock; private Subject _subject = new Subject(); private boolean verified; SSLTunnelSocket(Socket s, UserValidatable uv ) { sock = s; try { int c; int pos = 0; byte[] buf = new byte[512]; InputStream in = sock.getInputStream(); boolean isGood = true; do { c = in.read(); if ( c < 0 ) { isGood = false; break; } buf[pos] = (byte)c; pos ++; }while(c != '\n'); if( isGood ) { String auth = new String(buf, 0 , pos-1); String user = auth.substring( auth.lastIndexOf('=') +1, auth.lastIndexOf(':')); String pass = auth.substring( auth.lastIndexOf(':') +1 ); if( uv.validateUser( user , pass ) ) { Principal principal = new UserNamePrincipal(user); _subject.getPrincipals().add(principal); _subject.setReadOnly(); } verified = true; } } catch( Exception e) { try { s.close(); } catch (IOException ignored ) {} } } @Override public OutputStream getOutputStream() throws IOException { return sock.getOutputStream(); } @Override public InputStream getInputStream() throws IOException { return sock.getInputStream(); } @Override public void close() throws IOException { sock.close(); } @Override public InetAddress getInetAddress() { return sock.getInetAddress(); } @Override public int getPort() { return sock.getPort(); } public String toString() { return sock.toString(); } public void setSubject(Subject subject) { _subject = subject; } @Override public boolean verify() { return verified; } @Override public Subject getSubject() { return _subject; } }