EppClient.java
1    import javax.net.ssl.*; 
2    import java.security.KeyStore; 
3    import javax.security.cert.X509Certificate; 
4    import java.io.*; 
5    import java.net.SocketAddress; 
6    import java.net.InetSocketAddress; 
7     
8    /** 
9     *  Rudimentary command-line epp-client. 
10    */ 
11    
12   public class EppClient { 
13    
14     private static final String SERVER = "epp.registry.tryout.be"; 
15     private static final int PORT      = 33123; 
16    
17     private static final int TIME_OUT  = 3000; 
18    
19     private static final String KEYSTORE_FILE = "epp-tryout.ks"; 
20     private static final String KEYSTORE_PWD  = "test123"; 
21    
22     private static final String logout = 
23             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
24             "<epp xmlns=\"urn:ietf:params:xml:ns:epp-1.0\">\n" + 
25             " <command> <logout/> </command>\n" + 
26             "</epp>\n"; 
27    
28     private BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); 
29     private SSLSocket socket; 
30     private DataInputStream  dis; 
31     private DataOutputStream dos; 
32    
33     public static void main(String[] args) throws Exception { 
34       EppClient client = new EppClient(); 
35       client.run(); 
36     } 
37    
38     private String readOption (String message, String defaultvalue) throws Exception { 
39       System.out.print(message + " [" + defaultvalue + "] : "); 
40       String value = stdin.readLine(); 
41       if (value == null || value.length() == 0) { 
42         return defaultvalue; 
43       } 
44       return value; 
45     } 
46    
47     private int readOption (String message, int defaultvalue) throws Exception { 
48       System.out.print(message + " [" + defaultvalue + "] : "); 
49       String value = stdin.readLine(); 
50       if (value == null || value.length() == 0) { 
51         return defaultvalue; 
52       } 
53       return Integer.parseInt(value); 
54     } 
55    
56     private void run() throws Exception { 
57       String server = readOption("Enter name of the server",SERVER); 
58       int    port   = readOption("Enter remote port", PORT); 
59       SSLSocketFactory factory = null; 
60       SSLContext ctx = SSLContext.getInstance("TLS"); 
61       // add KeyManagers if server checks client certificates    
62       ctx.init(null, getTrustManagers(), null); 
63       factory = ctx.getSocketFactory(); 
64       socket = (SSLSocket)factory.createSocket(); 
65       int timeout = readOption ("Enter socket time-out", TIME_OUT); 
66       socket.setSoTimeout(timeout); 
67       SocketAddress addr = new InetSocketAddress(server,port); 
68       socket.connect(addr,timeout); 
69       System.out.println("Connected to " + socket.getRemoteSocketAddress()); 
70       dis = new DataInputStream(socket.getInputStream()); 
71       dos = new DataOutputStream(socket.getOutputStream()); 
72       X509Certificate chain[] = socket.getSession().getPeerCertificateChain(); 
73       for (int i = 0; i < chain.length; i++) { 
74         System.out.println("peer-certificate " + i); 
75         System.out.println(" Subject : " + chain[i].getSubjectDN().getName()); 
76         System.out.println(" Issuer  : " + chain[i].getIssuerDN().getName()); 
77       } 
78       pause("press <Enter> to read the initial greeting"); 
79       readEppString(); 
80       sendCommands(); 
81       System.out.println("closing the connection"); 
82       socket.close(); 
83     } 
84    
85     TrustManager[] getTrustManagers() throws Exception { 
86       String filename = readOption("Enter path of the keystore file", KEYSTORE_FILE); 
87       String password = readOption("Enter path of the keystore file", KEYSTORE_PWD); 
88       KeyStore keyStore = KeyStore.getInstance("JKS"); 
89       keyStore.load ( 
90           new FileInputStream(filename), 
91           password.toCharArray() 
92       ); 
93       TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
94       tmf.init (keyStore); 
95       return tmf.getTrustManagers(); 
96     } 
97    
98     private void sendCommands() throws Exception { 
99       while (true) { 
100        System.out.println("Please, enter one of the following:"); 
101        System.out.println("  STOP   : to quit immediately"); 
102        System.out.println("  LOGOUT : to log out and quit"); 
103        System.out.println("  the name of an UTF-encoded file to send to the server"); 
104        String input = stdin.readLine(); 
105        if ("STOP".equals(input)) { 
106          break; 
107        } else 
108        if ("LOGOUT".equals(input)) { 
109          writeEppString(logout); 
110          pause("press <Enter> to see the response"); 
111          readEppString(); 
112          break; 
113        } 
114        else { 
115          try { 
116            String eppCommand = readFile(input); 
117            writeEppString(eppCommand); 
118            pause("press <Enter> to see the response"); 
119            readEppString(); 
120          } catch (FileNotFoundException e) { 
121            System.out.println(e); 
122            System.out.println("============================"); 
123          } 
124        } 
125      } 
126    } 
127   
128    private String readFile (String filename) throws Exception { 
129      StringBuffer buffer = new StringBuffer(); 
130      BufferedReader file = new BufferedReader(new FileReader(filename)); 
131      try { 
132        String line; 
133        while ((line = file.readLine()) != null) { 
134          buffer.append(line); 
135          buffer.append("\n"); 
136        } 
137        return buffer.toString(); 
138      } finally { 
139        file.close(); 
140      } 
141    } 
142   
143    private String readEppString () throws IOException { 
144      int len = dis.readInt(); 
145      if (len > 4000) { 
146        throw new IOException ("Indicated length is unlikely long: " + len); 
147      } 
148      System.out.println("length of input: " + len + " bytes"); 
149      len = len - 4; 
150      byte bytes[] = new byte[len]; 
151      dis.readFully(bytes,0,len); 
152      String input = new String(bytes,"UTF-8"); 
153      System.out.println("========================================="); 
154      System.out.print (input); 
155      System.out.println("========================================="); 
156      return input; 
157    } 
158   
159    private void writeEppString (String output) throws IOException { 
160      byte[] bytes = output.getBytes("UTF-8"); 
161      int len = bytes.length + 4; 
162      System.out.println("sending " + len + " bytes"); 
163      System.out.println("==================================="); 
164      System.out.print (output); 
165      System.out.println("==================================="); 
166      dos.writeInt(len); 
167      dos.write(bytes); 
168    } 
169   
170    private void pause(String msg) throws Exception { 
171      System.out.print(msg); 
172      System.in.read(); 
173    } 
174   
175  } 
176