]> andersk Git - moira.git/blame - 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
CommitLineData
1d3501d2 1package regapplet;
2
3import mit.cipher.*;
4import java.awt.*;
5import java.io.*;
6import java.net.*;
7
8public 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}
This page took 0.070868 seconds and 5 git commands to generate.