public void commandAction(Command c, Displayable s) { if (c.getCommandType() == Command.EXIT) notifyDestroyed(); else { Form waitForm = new Form("Connecting..."); mDisplay.setCurrent(waitForm); Thread t = new Thread(this); t.start(); } }
public void run() { // Gather the values we'll need. long timestamp = System.currentTimeMillis(); long randomNumber = mRandom.nextLong(); String user = mUserField.getString(); byte[] userBytes = user.getBytes(); byte[] timestampBytes = getBytes(timestamp); byte[] randomBytes = getBytes(randomNumber); String password = mPasswordField.getString(); byte[] passwordBytes = password.getBytes();
// Create the message digest. Digest digest = new SHA1Digest(); // Calculate the digest value. digest.update(userBytes, 0, userBytes.length); digest.update(timestampBytes, 0, timestampBytes.length); digest.update(randomBytes, 0, randomBytes.length); digest.update(passwordBytes, 0, passwordBytes.length); byte[] digestValue = new byte[digest.getDigestSize()]; digest.doFinal(digestValue, 0);
// Create the GET URL. The hex encoded message digest value is // included as a parameter. URLBuilder ub = new URLBuilder(getAppProperty("PasswordMIDlet-URL")); ub.addParameter("user", user); ub.addParameter("timestamp", new String(HexCodec.bytesToHex(timestampBytes))); ub.addParameter("random", new String(HexCodec.bytesToHex(randomBytes))); ub.addParameter("digest", new String(HexCodec.bytesToHex(digestValue))); String url = ub.toString();
try { // Query the server and retrieve the response. HttpConnection hc = (HttpConnection)Connector.open(url); InputStream in = hc.openInputStream();
int length = (int)hc.getLength(); byte[] raw = new byte[length]; in.read(raw); String response = new String(raw); Alert a = new Alert("Response", response, null, null); a.setTimeout(Alert.FOREVER); mDisplay.setCurrent(a, mForm); in.close(); hc.close(); } catch (IOException ioe) { Alert a = new Alert("Exception", ioe.toString(), null, null); a.setTimeout(Alert.FOREVER); mDisplay.setCurrent(a, mForm); } }
private byte[] getBytes(long x) { byte[] bytes = new byte[8]; for (int i = 0; i < 8; i++) bytes[i] = (byte)(x >> ((7 - i) * 8)); return bytes; }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { } }
class URLBuilder { private StringBuffer mBuffer; private boolean mHasparameters;
public URLBuilder(String base) { mBuffer = new StringBuffer(base); mHasParameters = false; }
public void addParameter(String name, String value) { // Append a separator. if (mHasParameters == false) { mBuffer.append('?'); mHasParameters = true; } else mBuffer.append('&'); // Now tack on the name and value pair. These should // really be URL encoded (see java.net.URLEncoder in // J2SE) but this class appends the name and value // as is, for simplicity. Names or values with spaces // or other special characters will not work correctly. mBuffer.append(name); mBuffer.append('='); mBuffer.append(value); }
public String toString() { return mBuffer.toString(); } }
public static char[] bytesToHex(byte[] raw) { int length = raw.length; char[] hex = new char[length * 2]; for (int i = 0; i < length; i++) { int value = (raw[i] + 256) % 256; int highIndex = value >> 4; int lowIndex = value & 0x0f; hex[i * 2 + 0] = kDigits[highIndex]; hex[i * 2 + 1] = kDigits[lowIndex]; } return hex; }
public static byte[] hexToBytes(char[] hex) { int length = hex.length / 2; byte[] raw = new byte[length]; for (int i = 0; i < length; i++) { int high = Character.digit(hex[i * 2], 16); int low = Character.digit(hex[i * 2 + 1], 16); int value = (high << 4) low; if (value > 127) value -= 256; raw[i] = (byte)value; } return raw; }
public static byte[] hexToBytes(String hex) { return hexToBytes(hex.toCharArray()); } }