13 final static int LEN = 10;
15 public Parser(Socket as, Worker aworker) throws IOException, RegAppletException {
17 is = s.getInputStream();
20 public void read() throws MITCipherException, RegAppletException, IOException {
23 if (type == 0x45 || type == 0x50) {
25 len = (len << 8) + is.read();
30 j = is.read(data, i, len - i);
32 throw new IOException("Short read");
36 if (type == 0x45) data = encap.decrypt(data);
37 else System.arraycopy(data, 8, data, 0, data.length-8);
39 throw new IOException("Unknown type code in data stream, or I/O Error");
41 String [] pdat = pparse(data);
42 if (!pdat[0].equals("v1")) {
43 throw new IOException("bad version number");
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);
53 worker.setState(Worker.SENDWORDS);
54 worker.applet.showWordsDiag();
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);
61 worker.setState(Worker.SENDPIN);
62 worker.applet.showPinDiag();
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);
72 worker.setState(Worker.SENDLOGIN);
73 worker.applet.showLoginDiag();
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);
80 worker.setState(Worker.SENDPASSWD);
81 worker.applet.showPassDiag();
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);
88 worker.setState(Worker.SENDNAME);
89 worker.applet.showNameDiag();
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);
97 if (worker.applet.isStandalone) {
101 worker.applet.showInit();
105 protected String [] pparse(byte [] data) throws IOException {
106 String [] retval = new String [LEN];
110 for (j = 0; j < LEN; j++) retval[j] = "";
111 for (j = 0; j < data.length; j++) {
113 retval[i] = new String(data, 0, k, j - k);
116 throw new IOException("Too many tokens in string");