Skip to content

Commit

Permalink
upgrade ws library to 1.5.3 and remove outdated SNI code
Browse files Browse the repository at this point in the history
  • Loading branch information
or-else committed Nov 11, 2022
1 parent 37de7a0 commit 18655c9
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 106 deletions.
3 changes: 1 addition & 2 deletions tinodesdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ dependencies {
api 'com.fasterxml.jackson.core:jackson-databind:2.13.4'
api 'com.fasterxml.jackson.core:jackson-core:2.13.4'
api 'com.fasterxml.jackson.core:jackson-annotations:2.13.4'
//noinspection GradleDependency: 1.5.0 requires Android API 24.
api 'org.java-websocket:Java-WebSocket:1.4.1'
api 'org.java-websocket:Java-WebSocket:1.5.3'

implementation 'org.jetbrains:annotations:23.0.0'
testImplementation 'junit:junit:4.13.2'
Expand Down
88 changes: 5 additions & 83 deletions tinodesdk/src/main/java/co/tinode/tinodesdk/Connection.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,13 @@
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;

/**
* A thinly wrapped websocket connection.
*/
Expand Down Expand Up @@ -71,18 +60,6 @@ protected Connection(URI endpoint, String apikey, WsListener listener) {
mStatus = State.NEW;
mAutoreconnect = false;
mBackground = false;

// Horrible hack to support SNI on API<21
if ("wss".equals(getURI().getScheme())) {
try {
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);
SSLSocketFactory factory = sslContext.getSocketFactory();
setSocketFactory(new SNISocketFactory(factory));
} catch (NoSuchAlgorithmException | KeyManagementException ex) {
Log.w(TAG, "Failed to set up SSL", ex);
}
}
}

private static Map<String,String> wrapApiKey(String apikey) {
Expand Down Expand Up @@ -294,72 +271,17 @@ public void onError(Exception ex) {
}
}

static class WsListener {
WsListener() {}

protected void onConnect(Connection conn, boolean background) {
}

protected void onMessage(Connection conn, String message) {
}

protected void onDisconnect(Connection conn, boolean byServer, int code, String reason) {
}

protected void onError(Connection conn, Exception err) {
}
}

private class SNISocketFactory extends SocketFactory {
final SocketFactory mWrapped;

SNISocketFactory(SocketFactory parent) {
mWrapped = parent;
}

@Override
public Socket createSocket() throws IOException {
URI uri = getURI();
return createSocket(uri.getHost(), uri.getPort());
interface WsListener {
default void onConnect(Connection conn, boolean background) {
}

@Override
public Socket createSocket(String host, int port) throws IOException {
Socket socket = mWrapped.createSocket(host, port);
fixHostname(socket);
return socket;
default void onMessage(Connection conn, String message) {
}

@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
Socket socket = mWrapped.createSocket(host, port, localHost, localPort);
fixHostname(socket);
return socket;
default void onDisconnect(Connection conn, boolean byServer, int code, String reason) {
}

@Override
public Socket createSocket(InetAddress address, int port) throws IOException {
Socket socket = mWrapped.createSocket(address, port);
fixHostname(socket);
return socket;
}

@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
Socket socket = mWrapped.createSocket(address, port, localAddress, localPort);
fixHostname(socket);
return socket;
}

// SNI hack for earlier versions of Android
private void fixHostname(Socket socket) {
try {
// We don't know the actual class of the socket. Using reflection.
Method method = socket.getClass().getMethod("setHostname", String.class);
method.invoke(socket, getURI().getHost());
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | InvocationTargetException ex) {
Log.w(TAG, "SNI configuration failed", ex);
}
default void onError(Connection conn, Exception err) {
}
}
}
31 changes: 10 additions & 21 deletions tinodesdk/src/main/java/co/tinode/tinodesdk/Tinode.java
Original file line number Diff line number Diff line change
Expand Up @@ -2246,17 +2246,6 @@ synchronized String nextUniqueString() {
return Long.toString(((new Date().getTime() - 1414213562373L) << 16) + (mNameCounter & 0xFFFF), 32);
}

long getTimeAdjustment() {
return mTimeAdjustment;
}

/**
* Interface for converting mime type string to Jackson's JavaType.
*/
public interface MimeTypeResolver {
JavaType resolve(String mimeType);
}

/**
* Interface to be implemented by those clients which want to fetch topics
* using {@link Tinode#getFilteredTopics}
Expand Down Expand Up @@ -2305,7 +2294,7 @@ default void onLogin(int code, String text) {
*
* @param msg message to be processed
*/
default void onMessage(ServerMessage msg) {
default void onMessage(@SuppressWarnings("unused") ServerMessage msg) {
}

/**
Expand All @@ -2315,15 +2304,15 @@ default void onMessage(ServerMessage msg) {
*
* @param msg message to be processed
*/
default void onRawMessage(String msg) {
default void onRawMessage(@SuppressWarnings("unused") String msg) {
}

/**
* Handle control message
*
* @param ctrl control message to process
*/
default void onCtrlMessage(MsgServerCtrl ctrl) {
default void onCtrlMessage(@SuppressWarnings("unused") MsgServerCtrl ctrl) {
}

/**
Expand All @@ -2347,15 +2336,15 @@ default void onInfoMessage(MsgServerInfo info) {
*
* @param meta meta message to process
*/
default void onMetaMessage(MsgServerMeta meta) {
default void onMetaMessage(@SuppressWarnings("unused") MsgServerMeta meta) {
}

/**
* Handle presence message
*
* @param pres control message to process
*/
default void onPresMessage(MsgServerPres pres) {
default void onPresMessage(@SuppressWarnings("unused") MsgServerPres pres) {
}
}

Expand Down Expand Up @@ -2502,7 +2491,7 @@ private static class FutureHolder {
}

// Class which listens for websocket to connect.
private class ConnectedWsListener extends Connection.WsListener {
private class ConnectedWsListener implements Connection.WsListener {
final Vector<PromisedReply<ServerMessage>> mCompletionPromises;

ConnectedWsListener() {
Expand All @@ -2514,7 +2503,7 @@ void addPromise(PromisedReply<ServerMessage> promise) {
}

@Override
protected void onConnect(final Connection conn, final boolean background) {
public void onConnect(final Connection conn, final boolean background) {
// Connection established, send handshake, inform listener on success
hello(background).thenApply(
new PromisedReply.SuccessListener<ServerMessage>() {
Expand Down Expand Up @@ -2564,7 +2553,7 @@ public PromisedReply<ServerMessage> onSuccess(ServerMessage pkt) throws Exceptio
}

@Override
protected void onMessage(Connection conn, String message) {
public void onMessage(Connection conn, String message) {
try {
dispatchPacket(message);
} catch (Exception ex) {
Expand All @@ -2573,7 +2562,7 @@ protected void onMessage(Connection conn, String message) {
}

@Override
protected void onDisconnect(Connection conn, boolean byServer, int code, String reason) {
public void onDisconnect(Connection conn, boolean byServer, int code, String reason) {
handleDisconnect(byServer, -code, reason);
// Promises may have already been rejected if onError was called first.
try {
Expand All @@ -2584,7 +2573,7 @@ protected void onDisconnect(Connection conn, boolean byServer, int code, String
}

@Override
protected void onError(Connection conn, Exception err) {
public void onError(Connection conn, Exception err) {
// No need to call handleDisconnect here. It will be called from onDisconnect().

// If the promise is waiting, reject. Otherwise it's not our problem.
Expand Down

0 comments on commit 18655c9

Please sign in to comment.