package mit.krb4.example ;

public class Server
{

	public static void main( String[] args )
	{
		try
		{
			if( 3 == args.length )
			{
				String srvtabFilename = args[ 0 ] ;
				String clientTicketFilename = args[ 1 ] ;
				String clientIPAddress = args[ 2 ] ;

				byte[] srvtab = getBytesFromFile( srvtabFilename ) ;
				byte[] clientTicket = getBytesFromFile( clientTicketFilename ) ;
				byte[] clientIPAddrBytes = getBytesFromString( clientIPAddress ) ;
				mit.krb4.Authenticate authenticate
					= new mit.krb4.Authenticate() ;
				String sessionKey
					= authenticate.isValidClient
					( clientTicket
					, clientIPAddrBytes
					, srvtab
					) ;
				System.out.println
					( "Client has session key: " + sessionKey 
					+ "\n" + clientTicket 
					+ "\n" + clientIPAddrBytes
					) ;
			}
			else
			{
				System.out.println( "Usage: java mit.krb4.example.Server srvtabFilename ticketString clientIPAddr " ) ;
			}
		}
		catch( Throwable ex )
		{
			ex.printStackTrace() ;
		}
	}

	private static byte[] getBytesFromFile( String filename )
	throws Throwable
	{
		java.io.FileInputStream in = new java.io.FileInputStream( filename ) ;
		byte[] srvtab = new byte[ 0 ] ;
		int length = 0 ;
		int available = 0 ;
		while( 0 != in.available() )
		{
			available = in.available() ;
			byte[] newsrvtab = new byte[ length + available ] ;
			System.arraycopy( srvtab , 0 , newsrvtab , 0 , length ) ;
			in.read( newsrvtab , length , available ) ;
			srvtab = newsrvtab ;
			length += available ;
		}
		in.close() ;
		return srvtab ;
	}

	private static byte[] getBytesFromString( String ipAddr )
	throws Throwable
	{
		byte[] ipAddrBytes = new byte[ 4 ] ;
		java.util.StringTokenizer st = new java.util.StringTokenizer( ipAddr , "." ) ;
		ipAddrBytes[ 0 ] = ( byte ) Integer.parseInt( st.nextToken() ) ;
		ipAddrBytes[ 1 ] = ( byte ) Integer.parseInt( st.nextToken() ) ;
		ipAddrBytes[ 2 ] = ( byte ) Integer.parseInt( st.nextToken() ) ;
		ipAddrBytes[ 3 ] = ( byte ) Integer.parseInt( st.nextToken() ) ;
		return ipAddrBytes ;
	}

}
