]>
Commit | Line | Data |
---|---|---|
1d3501d2 | 1 | package regapplet; |
2 | ||
3 | import mit.cipher.*; | |
4 | import java.awt.*; | |
5 | import java.io.*; | |
6 | import java.net.*; | |
7 | ||
8 | public class Parser { | |
9 | Socket s; | |
10 | InputStream is; | |
11 | Worker worker; | |
12 | public Encap encap; | |
13 | final static int LEN = 10; | |
14 | ||
15 | public Parser(Socket as, Worker aworker) throws IOException, RegAppletException { | |
16 | s = as; | |
17 | is = s.getInputStream(); | |
18 | worker = aworker; | |
19 | } | |
20 | public void read() throws MITCipherException, RegAppletException, IOException { | |
21 | byte [] data = null; | |
22 | int type = is.read(); | |
23 | if (type == 0x45 || type == 0x50) { | |
24 | int len = is.read(); | |
25 | len = (len << 8) + is.read(); | |
26 | int i = 0; | |
27 | int j = 0; | |
28 | data = new byte[len]; | |
29 | while (i < len) { | |
30 | j = is.read(data, i, len - i); | |
31 | if (j < 0) { | |
32 | throw new IOException("Short read"); | |
33 | } | |
34 | i += j; | |
35 | } | |
36 | if (type == 0x45) data = encap.decrypt(data); | |
37 | else System.arraycopy(data, 8, data, 0, data.length-8); | |
38 | } else { | |
3e1b94bd | 39 | throw new IOException("Unknown type code in data stream, or I/O Error"); |
1d3501d2 | 40 | } |
41 | String [] pdat = pparse(data); | |
42 | if (!pdat[0].equals("v1")) { | |
43 | throw new IOException("bad version number"); | |
44 | } | |
45 | if (pdat[3].equals("c")) worker.applet.clear(); | |
46 | else if (!pdat[3].equals("d")&& !pdat[1].equals("INIT")) | |
47 | throw new RegAppletException("Bad response from server."); | |
48 | if (pdat[1].equals("GETW")) { | |
49 | if (!pdat[2].equals("")) { | |
50 | worker.setState(Worker.DIALOG, Worker.SENDWORDS); | |
51 | worker.applet.showMessage(pdat[2], true); | |
52 | } else { | |
53 | worker.setState(Worker.SENDWORDS); | |
54 | worker.applet.showWordsDiag(); | |
55 | } | |
c05c41a2 | 56 | } else if (pdat[1].equals("GETI")) { |
57 | if (!pdat[2].equals("")) { | |
58 | worker.setState(Worker.DIALOG, Worker.SENDPIN); | |
59 | worker.applet.showMessage(pdat[2], true); | |
60 | } else { | |
61 | worker.setState(Worker.SENDPIN); | |
62 | worker.applet.showPinDiag(); | |
63 | } | |
1d3501d2 | 64 | } else if (pdat[1].equals("GETL")) { |
65 | if (!pdat[4].equals("")) { | |
66 | worker.applet.guesslogin = pdat[4]; | |
67 | } else worker.applet.guesslogin = ""; | |
68 | if (!pdat[2].equals("")) { | |
69 | worker.setState(Worker.DIALOG, Worker.SENDLOGIN); | |
70 | worker.applet.showMessage(pdat[2], true); | |
71 | } else { | |
72 | worker.setState(Worker.SENDLOGIN); | |
73 | worker.applet.showLoginDiag(); | |
74 | } | |
75 | } else if (pdat[1].equals("GETP")) { | |
76 | if (!pdat[2].equals("")) { | |
77 | worker.setState(Worker.DIALOG, Worker.SENDPASSWD); | |
78 | worker.applet.showMessage(pdat[2], true); | |
79 | } else { | |
80 | worker.setState(Worker.SENDPASSWD); | |
81 | worker.applet.showPassDiag(); | |
82 | } | |
83 | } else if (pdat[1].equals("GETN")) { | |
84 | if (!pdat[2].equals("")) { | |
85 | worker.setState(Worker.DIALOG, Worker.SENDNAME); | |
86 | worker.applet.showMessage(pdat[2], true); | |
87 | } else { | |
88 | worker.setState(Worker.SENDNAME); | |
89 | worker.applet.showNameDiag(); | |
90 | } | |
91 | } else if (pdat[1].equals("INIT")) { | |
92 | worker.applet.clear(); // Clear sensitive data *now* | |
93 | if (!pdat[2].equals("")) { | |
94 | worker.setState(Worker.DIALOG, Worker.INIT); | |
95 | worker.applet.showMessage(pdat[2], true); | |
96 | } else { | |
97 | if (worker.applet.isStandalone) { | |
98 | worker.close(); | |
99 | System.exit(0); | |
100 | } | |
101 | worker.applet.showInit(); | |
102 | } | |
103 | } | |
104 | } | |
105 | protected String [] pparse(byte [] data) throws IOException { | |
106 | String [] retval = new String [LEN]; | |
107 | int i = 0; | |
108 | int j = 0; | |
109 | int k = 0; | |
110 | for (j = 0; j < LEN; j++) retval[j] = ""; | |
111 | for (j = 0; j < data.length; j++) { | |
112 | if (data[j] == 0) { | |
113 | retval[i] = new String(data, 0, k, j - k); | |
114 | k = j+1; | |
115 | if (i++ == LEN) { | |
116 | throw new IOException("Too many tokens in string"); | |
117 | } | |
118 | } | |
119 | } | |
120 | return (retval); | |
121 | } | |
122 | } |