]> andersk Git - moira.git/blob - clients/regapplet/regapplet/Parser.java
1353bc1e4b23b14aae209422dd4c2a414dda5b04
[moira.git] / clients / regapplet / regapplet / Parser.java
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 {
39        throw new IOException("Unknown type code in data stream, or I/O Error");
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         }
56      } else if (pdat[1].equals("GETL")) {
57        if (!pdat[4].equals("")) {
58          worker.applet.guesslogin = pdat[4];
59        } else worker.applet.guesslogin = "";
60        if (!pdat[2].equals("")) {
61           worker.setState(Worker.DIALOG, Worker.SENDLOGIN);
62           worker.applet.showMessage(pdat[2], true);
63        } else {
64           worker.setState(Worker.SENDLOGIN);
65           worker.applet.showLoginDiag();
66        }
67      } else if (pdat[1].equals("GETP")) {
68        if (!pdat[2].equals("")) {
69           worker.setState(Worker.DIALOG, Worker.SENDPASSWD);
70           worker.applet.showMessage(pdat[2], true);
71        } else {
72           worker.setState(Worker.SENDPASSWD);
73           worker.applet.showPassDiag();
74        }
75      } else if (pdat[1].equals("GETN")) {
76        if (!pdat[2].equals("")) {
77           worker.setState(Worker.DIALOG, Worker.SENDNAME);
78           worker.applet.showMessage(pdat[2], true);
79        } else {
80           worker.setState(Worker.SENDNAME);
81           worker.applet.showNameDiag();
82        }
83      } else if (pdat[1].equals("INIT")) {
84        worker.applet.clear();   // Clear sensitive data *now*
85        if (!pdat[2].equals("")) {
86          worker.setState(Worker.DIALOG, Worker.INIT);
87          worker.applet.showMessage(pdat[2], true);
88        } else {
89          if (worker.applet.isStandalone) {
90            worker.close();
91            System.exit(0);
92          }
93          worker.applet.showInit();
94        }
95      }
96   }
97   protected String [] pparse(byte [] data) throws IOException {
98      String [] retval = new String [LEN];
99      int i = 0;
100      int j = 0;
101      int k = 0;
102      for (j = 0; j < LEN; j++) retval[j] = "";
103      for (j = 0; j < data.length; j++) {
104          if (data[j] == 0) {
105             retval[i] = new String(data, 0, k, j - k);
106             k = j+1;
107             if (i++ == LEN) {
108                throw new IOException("Too many tokens in string");
109             }
110          }
111      }
112      return (retval);
113   }
114 }
This page took 0.035507 seconds and 3 git commands to generate.