]> andersk Git - moira.git/blob - clients/regapplet/regapplet/Parser.java
Add a "PIN" screen that's an alternative to the six words screen;
[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("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        }
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 }
This page took 0.04877 seconds and 5 git commands to generate.