X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2Fserver%2FConnectAction.java;h=a377ced597f2a6bd84d01fd008f7f5099b9409a3;hb=9af739b58e2cd5357a21d6fd0410049ab2a2bff3;hp=7d724248384d77a5ba459f4215a1aeebf80e7a13;hpb=8468bb79f0fc9c88fa21355509731625732eb10e;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/server/ConnectAction.java b/src/be/nikiroo/utils/serial/server/ConnectAction.java index 7d72424..a377ced 100644 --- a/src/be/nikiroo/utils/serial/server/ConnectAction.java +++ b/src/be/nikiroo/utils/serial/server/ConnectAction.java @@ -2,10 +2,13 @@ package be.nikiroo.utils.serial.server; import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; -import java.io.OutputStreamWriter; +import java.io.OutputStream; import java.net.Socket; +import javax.net.ssl.SSLException; + import be.nikiroo.utils.CryptUtils; import be.nikiroo.utils.Version; import be.nikiroo.utils.serial.Exporter; @@ -29,8 +32,8 @@ abstract class ConnectAction { private CryptUtils crypt; private Object lock = new Object(); - private BufferedReader in; - private OutputStreamWriter out; + private InputStream in; + private OutputStream out; private boolean contentToSend; private long bytesReceived; @@ -66,7 +69,8 @@ abstract class ConnectAction { * Handler called when an unexpected error occurs in the code. * * @param e - * the exception that occurred + * the exception that occurred, SSLException usually denotes a + * crypt error */ abstract protected void onError(Exception e); @@ -133,13 +137,19 @@ abstract class ConnectAction { */ public void connect() { try { - in = new BufferedReader(new InputStreamReader(s.getInputStream(), - "UTF-8")); + in = s.getInputStream(); try { - out = new OutputStreamWriter(s.getOutputStream(), "UTF-8"); + out = s.getOutputStream(); try { if (server) { - String line = readLine(in); + String line; + try { + line = readLine(in); + } catch (SSLException e) { + out.write("Unauthorized\n".getBytes()); + throw e; + } + if (line != null && line.startsWith("VERSION ")) { // "VERSION client-version" (VERSION 1.0.0) Version clientVersion = new Version( @@ -263,6 +273,8 @@ abstract class ConnectAction { * * @throws IOException * in case of I/O error + * @throws SSLException + * in case of crypt error */ protected String sendString(String line) throws IOException { synchronized (lock) { @@ -291,6 +303,8 @@ abstract class ConnectAction { * * @throws IOException * in case of I/O error + * @throws SSLException + * in case of crypt error */ protected String recString() throws IOException { synchronized (lock) { @@ -307,8 +321,24 @@ abstract class ConnectAction { } } - private String readLine(BufferedReader in) throws IOException { - String line = in.readLine(); + /** + * Read a possibly encrypted line. + * + * @param in + * the stream to read from + * @return the unencrypted line + * + * + * @throws IOException + * in case of I/O error + * @throws SSLException + * in case of crypt error + */ + private String readLine(InputStream in) throws IOException { + if (inReader == null) { + inReader = new BufferedReader(new InputStreamReader(in)); + } + String line = inReader.readLine(); if (line != null) { bytesReceived += line.length(); if (crypt != null) { @@ -319,18 +349,31 @@ abstract class ConnectAction { return line; } - private void writeLine(OutputStreamWriter out, String line) - throws IOException { + private BufferedReader inReader; + + /** + * Write a line, possible encrypted. + * + * @param out + * the stream to write to + * @param line + * the line to write + * @throws IOException + * in case of I/O error + * @throws SSLException + * in case of crypt error + */ + private void writeLine(OutputStream out, String line) throws IOException { if (crypt == null) { - out.write(line); + out.write(line.getBytes()); bytesSent += line.length(); } else { // TODO: how NOT to create so many big Strings? String b64 = crypt.encrypt64(line, false); - out.write(b64); + out.write(b64.getBytes()); bytesSent += b64.length(); } - out.write("\n"); + out.write("\n".getBytes()); bytesSent++; } } \ No newline at end of file