mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-09-03 23:55:08 +00:00
Add method documentation to LanLinkProvider.java
Summary: This adds some simple explanation to the `identityPacketReceived` and `addLink` methods. Test Plan: N/A Reviewers: #kde_connect, mtijink Reviewed By: #kde_connect, mtijink Differential Revision: https://phabricator.kde.org/D11672
This commit is contained in:
committed by
Nicolas Fella
parent
2cb025e368
commit
fda08929af
@@ -27,6 +27,7 @@ import android.preference.PreferenceManager;
|
|||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.kde.kdeconnect.Backends.BaseLink;
|
||||||
import org.kde.kdeconnect.Backends.BaseLinkProvider;
|
import org.kde.kdeconnect.Backends.BaseLinkProvider;
|
||||||
import org.kde.kdeconnect.BackgroundService;
|
import org.kde.kdeconnect.BackgroundService;
|
||||||
import org.kde.kdeconnect.Device;
|
import org.kde.kdeconnect.Device;
|
||||||
@@ -59,6 +60,13 @@ import javax.net.ssl.HandshakeCompletedEvent;
|
|||||||
import javax.net.ssl.HandshakeCompletedListener;
|
import javax.net.ssl.HandshakeCompletedListener;
|
||||||
import javax.net.ssl.SSLSocket;
|
import javax.net.ssl.SSLSocket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This BaseLinkProvider creates {@link LanLink}s to other devices on the same
|
||||||
|
* WiFi network. The first packet sent over a socket must be an
|
||||||
|
* {@link NetworkPacket#createIdentityPacket(Context)}.
|
||||||
|
*
|
||||||
|
* @see #identityPacketReceived(NetworkPacket, Socket, LanLink.ConnectionStarted)
|
||||||
|
*/
|
||||||
public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDisconnectedCallback {
|
public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDisconnectedCallback {
|
||||||
|
|
||||||
public static final Object mutex = new Object();
|
public static final Object mutex = new Object();
|
||||||
@@ -165,14 +173,14 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
Log.e("KDE/LanLinkProvider", "Cannot connect to " + address);
|
Log.e("KDE/LanLinkProvider", "Cannot connect to " + address);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
if (!reverseConnectionBlackList.contains(address)) {
|
if (!reverseConnectionBlackList.contains(address)) {
|
||||||
Log.w("KDE/LanLinkProvider","Blacklisting "+address);
|
Log.w("KDE/LanLinkProvider", "Blacklisting " + address);
|
||||||
reverseConnectionBlackList.add(address);
|
reverseConnectionBlackList.add(address);
|
||||||
new Timer().schedule(new TimerTask() {
|
new Timer().schedule(new TimerTask() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
reverseConnectionBlackList.remove(address);
|
reverseConnectionBlackList.remove(address);
|
||||||
}
|
}
|
||||||
}, 5*1000);
|
}, 5 * 1000);
|
||||||
|
|
||||||
// Try to cause a reverse connection
|
// Try to cause a reverse connection
|
||||||
onNetworkChange();
|
onNetworkChange();
|
||||||
@@ -189,6 +197,18 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a new 'identity' packet is received. Those are passed here by
|
||||||
|
* {@link #tcpPacketReceived(Socket)} and {@link #udpPacketReceived(DatagramPacket)}.
|
||||||
|
* <p>
|
||||||
|
* If the remote device should be connected, this calls {@link #addLink}.
|
||||||
|
* Otherwise, if there was an Exception, we unpair from that device.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param identityPacket identity of a remote device
|
||||||
|
* @param socket a new Socket, which should be used to receive packets from the remote device
|
||||||
|
* @param connectionStarted which side started this connection
|
||||||
|
*/
|
||||||
private void identityPacketReceived(final NetworkPacket identityPacket, final Socket socket, final LanLink.ConnectionStarted connectionStarted) {
|
private void identityPacketReceived(final NetworkPacket identityPacket, final Socket socket, final LanLink.ConnectionStarted connectionStarted) {
|
||||||
|
|
||||||
String myId = DeviceHelper.getDeviceId(context);
|
String myId = DeviceHelper.getDeviceId(context);
|
||||||
@@ -222,20 +242,20 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.i("KDE/LanLinkProvider","Starting SSL handshake with " + identityPacket.getString("deviceName") + " trusted:"+isDeviceTrusted);
|
Log.i("KDE/LanLinkProvider", "Starting SSL handshake with " + identityPacket.getString("deviceName") + " trusted:" + isDeviceTrusted);
|
||||||
|
|
||||||
final SSLSocket sslsocket = SslHelper.convertToSslSocket(context, socket, deviceId, isDeviceTrusted, clientMode);
|
final SSLSocket sslsocket = SslHelper.convertToSslSocket(context, socket, deviceId, isDeviceTrusted, clientMode);
|
||||||
sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() {
|
sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() {
|
||||||
@Override
|
@Override
|
||||||
public void handshakeCompleted(HandshakeCompletedEvent event) {
|
public void handshakeCompleted(HandshakeCompletedEvent event) {
|
||||||
String mode = clientMode? "client" : "server";
|
String mode = clientMode ? "client" : "server";
|
||||||
try {
|
try {
|
||||||
Certificate certificate = event.getPeerCertificates()[0];
|
Certificate certificate = event.getPeerCertificates()[0];
|
||||||
identityPacket.set("certificate", Base64.encodeToString(certificate.getEncoded(), 0));
|
identityPacket.set("certificate", Base64.encodeToString(certificate.getEncoded(), 0));
|
||||||
Log.i("KDE/LanLinkProvider","Handshake as " + mode + " successful with " + identityPacket.getString("deviceName") + " secured with " + event.getCipherSuite());
|
Log.i("KDE/LanLinkProvider", "Handshake as " + mode + " successful with " + identityPacket.getString("deviceName") + " secured with " + event.getCipherSuite());
|
||||||
addLink(identityPacket, sslsocket, connectionStarted);
|
addLink(identityPacket, sslsocket, connectionStarted);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e("KDE/LanLinkProvider","Handshake as " + mode + " failed with " + identityPacket.getString("deviceName"));
|
Log.e("KDE/LanLinkProvider", "Handshake as " + mode + " failed with " + identityPacket.getString("deviceName"));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
|
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
|
||||||
@Override
|
@Override
|
||||||
@@ -257,7 +277,7 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
sslsocket.startHandshake();
|
sslsocket.startHandshake();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e("KDE/LanLinkProvider","Handshake failed with " + identityPacket.getString("deviceName"));
|
Log.e("KDE/LanLinkProvider", "Handshake failed with " + identityPacket.getString("deviceName"));
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
//String[] ciphers = sslsocket.getSupportedCipherSuites();
|
//String[] ciphers = sslsocket.getSupportedCipherSuites();
|
||||||
@@ -276,6 +296,19 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add or update a link in the {@link #visibleComputers} map. This method is synchronized, which ensures that only one
|
||||||
|
* link is operated on at a time.
|
||||||
|
* <p>
|
||||||
|
* Without synchronization, the call to {@link SslHelper#parseCertificate(byte[])} in
|
||||||
|
* {@link Device#addLink(NetworkPacket, BaseLink)} crashes on some devices running Oreo 8.1 (SDK level 27).
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param identityPacket representation of remote device
|
||||||
|
* @param socket a new Socket, which should be used to receive packets from the remote device
|
||||||
|
* @param connectionOrigin which side started this connection
|
||||||
|
* @throws IOException if an exception is thrown by {@link LanLink#reset(Socket, LanLink.ConnectionStarted)}
|
||||||
|
*/
|
||||||
private void addLink(final NetworkPacket identityPacket, Socket socket, LanLink.ConnectionStarted connectionOrigin) throws IOException {
|
private void addLink(final NetworkPacket identityPacket, Socket socket, LanLink.ConnectionStarted connectionOrigin) throws IOException {
|
||||||
|
|
||||||
String deviceId = identityPacket.getString("deviceId");
|
String deviceId = identityPacket.getString("deviceId");
|
||||||
@@ -324,7 +357,7 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
Log.e("LanLinkProvider", "UdpReceive exception");
|
Log.e("LanLinkProvider", "UdpReceive exception");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.w("UdpListener","Stopping UDP listener");
|
Log.w("UdpListener", "Stopping UDP listener");
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
return server;
|
return server;
|
||||||
@@ -361,13 +394,13 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
|
|
||||||
static ServerSocket openServerSocketOnFreePort(int minPort) throws IOException {
|
static ServerSocket openServerSocketOnFreePort(int minPort) throws IOException {
|
||||||
int tcpPort = minPort;
|
int tcpPort = minPort;
|
||||||
while(tcpPort < MAX_PORT) {
|
while (tcpPort < MAX_PORT) {
|
||||||
try {
|
try {
|
||||||
ServerSocket candidateServer = new ServerSocket();
|
ServerSocket candidateServer = new ServerSocket();
|
||||||
candidateServer.bind(new InetSocketAddress(tcpPort));
|
candidateServer.bind(new InetSocketAddress(tcpPort));
|
||||||
Log.i("KDE/LanLink", "Using port "+tcpPort);
|
Log.i("KDE/LanLink", "Using port " + tcpPort);
|
||||||
return candidateServer;
|
return candidateServer;
|
||||||
} catch(IOException e) {
|
} catch (IOException e) {
|
||||||
tcpPort++;
|
tcpPort++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -404,7 +437,7 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
bytes = identity.serialize().getBytes(StringsHelper.UTF8);
|
bytes = identity.serialize().getBytes(StringsHelper.UTF8);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Log.e("KDE/LanLinkProvider","Failed to create DatagramSocket");
|
Log.e("KDE/LanLinkProvider", "Failed to create DatagramSocket");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytes != null) {
|
if (bytes != null) {
|
||||||
@@ -429,6 +462,7 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
//Log.i("KDE/LanLinkProvider", "onStart");
|
//Log.i("KDE/LanLinkProvider", "onStart");
|
||||||
@@ -445,7 +479,7 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
// and newer android versions. Although devices with android version less than ICS cannot connect to other devices who also have android version less
|
// and newer android versions. Although devices with android version less than ICS cannot connect to other devices who also have android version less
|
||||||
// than ICS because server is disabled on both
|
// than ICS because server is disabled on both
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||||
Log.w("KDE/LanLinkProvider","Not starting a TCP server because it's not supported on Android < 14. Operating only as client.");
|
Log.w("KDE/LanLinkProvider", "Not starting a TCP server because it's not supported on Android < 14. Operating only as client.");
|
||||||
} else {
|
} else {
|
||||||
setupTcpListener();
|
setupTcpListener();
|
||||||
}
|
}
|
||||||
@@ -465,17 +499,17 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis
|
|||||||
listening = false;
|
listening = false;
|
||||||
try {
|
try {
|
||||||
tcpServer.close();
|
tcpServer.close();
|
||||||
} catch (Exception e){
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
udpServer.close();
|
udpServer.close();
|
||||||
} catch (Exception e){
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
udpServerOldPort.close();
|
udpServerOldPort.close();
|
||||||
} catch (Exception e){
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user