mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-25 21:42:07 +01:00
Compare commits
18 commits
9d626bf787
...
16e438a108
Author | SHA1 | Date | |
---|---|---|---|
|
16e438a108 | ||
|
3adb6c290a | ||
|
78be8f3a04 | ||
|
961e56a47c | ||
|
b6ad737aa4 | ||
|
be2fc23f41 | ||
|
22d64ebe6b | ||
|
7b5186f651 | ||
|
80e9bcf496 | ||
|
4a6f49e414 | ||
|
876aba9866 | ||
1051cd2640 | |||
|
6edbe640cb | ||
|
ee3d25751d | ||
5fd638545d | |||
|
a6e2523648 | ||
|
14cc0c1e41 | ||
|
7afd1fdf46 |
18 changed files with 186 additions and 192 deletions
|
@ -18,7 +18,7 @@ cache:
|
||||||
- $HOME/.m2
|
- $HOME/.m2
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- export GRADLE_VERSION=5.5.1
|
- export GRADLE_VERSION=6.2
|
||||||
- wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip
|
- wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip
|
||||||
- unzip -q gradle-${GRADLE_VERSION}-all.zip
|
- unzip -q gradle-${GRADLE_VERSION}-all.zip
|
||||||
- export PATH="$(pwd)/gradle-${GRADLE_VERSION}/bin:$PATH"
|
- export PATH="$(pwd)/gradle-${GRADLE_VERSION}/bin:$PATH"
|
||||||
|
|
|
@ -13,7 +13,7 @@ buildscript {
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id 'ru.vyarus.animalsniffer' version '1.5.0'
|
id 'ru.vyarus.animalsniffer' version '1.5.0'
|
||||||
id 'net.ltgt.errorprone' version '0.8.1'
|
id 'net.ltgt.errorprone' version '1.1.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'org.kordamp.gradle.markdown'
|
apply plugin: 'org.kordamp.gradle.markdown'
|
||||||
|
@ -129,7 +129,7 @@ allprojects {
|
||||||
':smack-omemo-signal',
|
':smack-omemo-signal',
|
||||||
':smack-openpgp',
|
':smack-openpgp',
|
||||||
].collect { project(it) }
|
].collect { project(it) }
|
||||||
junitVersion = '5.4.2'
|
junitVersion = '5.6.0'
|
||||||
powerMockVersion = '2.0.2'
|
powerMockVersion = '2.0.2'
|
||||||
commonsIoVersion = '2.6'
|
commonsIoVersion = '2.6'
|
||||||
}
|
}
|
||||||
|
@ -680,7 +680,7 @@ def getAndroidRuntimeJar() {
|
||||||
if (androidJar.isFile()) {
|
if (androidJar.isFile()) {
|
||||||
return androidJar
|
return androidJar
|
||||||
} else {
|
} else {
|
||||||
throw new Exception("Can't find android.jar for $androidApiLevel API. Please install corresponding SDK platform package")
|
throw new Exception("Can't find android.jar for API level ${androidApiLevel}. Please install corresponding SDK platform package")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2015-2016 Florian Schmaus.
|
* Copyright 2015-2019 Florian Schmaus.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -21,6 +21,16 @@ import java.net.Socket;
|
||||||
|
|
||||||
public interface ProxySocketConnection {
|
public interface ProxySocketConnection {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initiate a connection to the given host on the given port. Note that the caller is responsible for closing the
|
||||||
|
* socket in case this method throws.
|
||||||
|
*
|
||||||
|
* @param socket the socket to use to initiate the connection to the proxy.
|
||||||
|
* @param host the host to connect to.
|
||||||
|
* @param port the port to connect to.
|
||||||
|
* @param timeout the timeout in milliseconds.
|
||||||
|
* @throws IOException in case an I/O error occurs.
|
||||||
|
*/
|
||||||
void connect(Socket socket, String host, int port, int timeout)
|
void connect(Socket socket, String host, int port, int timeout)
|
||||||
throws IOException;
|
throws IOException;
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smack.proxy;
|
package org.jivesoftware.smack.proxy;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
@ -24,6 +26,8 @@ import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.util.OutputStreamUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Socket factory for socks4 proxy.
|
* Socket factory for socks4 proxy.
|
||||||
*
|
*
|
||||||
|
@ -39,20 +43,17 @@ public class Socks4ProxySocketConnection implements ProxySocketConnection {
|
||||||
@Override
|
@Override
|
||||||
public void connect(Socket socket, String host, int port, int timeout)
|
public void connect(Socket socket, String host, int port, int timeout)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
InputStream in = null;
|
|
||||||
OutputStream out = null;
|
|
||||||
String proxy_host = proxy.getProxyAddress();
|
String proxy_host = proxy.getProxyAddress();
|
||||||
int proxy_port = proxy.getProxyPort();
|
int proxy_port = proxy.getProxyPort();
|
||||||
String user = proxy.getProxyUsername();
|
String user = proxy.getProxyUsername();
|
||||||
|
|
||||||
try {
|
socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout);
|
||||||
socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout);
|
InputStream in = socket.getInputStream();
|
||||||
in = socket.getInputStream();
|
DataInputStream dis = new DataInputStream(in);
|
||||||
out = socket.getOutputStream();
|
OutputStream out = socket.getOutputStream();
|
||||||
socket.setTcpNoDelay(true);
|
|
||||||
|
|
||||||
byte[] buf = new byte[1024];
|
ByteArrayOutputStream outBuf = new ByteArrayOutputStream();
|
||||||
int index = 0;
|
byte[] inBuf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
1) CONNECT
|
1) CONNECT
|
||||||
|
@ -72,25 +73,22 @@ public class Socks4ProxySocketConnection implements ProxySocketConnection {
|
||||||
of all zero bits.
|
of all zero bits.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
buf[index++] = 4;
|
outBuf.write(4);
|
||||||
buf[index++] = 1;
|
outBuf.write(1);
|
||||||
|
|
||||||
buf[index++] = (byte) (port >>> 8);
|
outBuf.write(port >>> 8);
|
||||||
buf[index++] = (byte) (port & 0xff);
|
outBuf.write(port & 0xff);
|
||||||
|
|
||||||
InetAddress inetAddress = InetAddress.getByName(proxy_host);
|
InetAddress inetAddress = InetAddress.getByName(proxy_host);
|
||||||
byte[] byteAddress = inetAddress.getAddress();
|
byte[] byteAddress = inetAddress.getAddress();
|
||||||
for (int i = 0; i < byteAddress.length; i++) {
|
outBuf.write(byteAddress);
|
||||||
buf[index++] = byteAddress[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
byte[] userBytes = user.getBytes(StandardCharsets.UTF_8);
|
byte[] userBytes = user.getBytes(StandardCharsets.UTF_8);
|
||||||
System.arraycopy(userBytes, 0, buf, index, user.length());
|
outBuf.write(userBytes);
|
||||||
index += user.length();
|
}
|
||||||
}
|
outBuf.write(0);
|
||||||
buf[index++] = 0;
|
OutputStreamUtil.writeResetAndFlush(outBuf, out);
|
||||||
out.write(buf, 0, index);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The SOCKS server checks to see whether such a request should be granted
|
The SOCKS server checks to see whether such a request should be granted
|
||||||
|
@ -119,43 +117,17 @@ public class Socks4ProxySocketConnection implements ProxySocketConnection {
|
||||||
The remaining fields are ignored.
|
The remaining fields are ignored.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int len = 6;
|
inBuf = new byte[6];
|
||||||
int s = 0;
|
dis.readFully(inBuf);
|
||||||
while (s < len) {
|
if (inBuf[0] != 0) {
|
||||||
int i = in.read(buf, s, len - s);
|
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4,
|
||||||
if (i <= 0) {
|
"server returns VN " + inBuf[0]);
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4,
|
|
||||||
"stream is closed");
|
|
||||||
}
|
|
||||||
s += i;
|
|
||||||
}
|
|
||||||
if (buf[0] != 0) {
|
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4,
|
|
||||||
"server returns VN " + buf[0]);
|
|
||||||
}
|
|
||||||
if (buf[1] != 90) {
|
|
||||||
try {
|
|
||||||
socket.close();
|
|
||||||
}
|
|
||||||
catch (Exception eee) {
|
|
||||||
}
|
|
||||||
String message = "ProxySOCKS4: server returns CD " + buf[1];
|
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, message);
|
|
||||||
}
|
|
||||||
byte[] temp = new byte[2];
|
|
||||||
in.read(temp, 0, 2);
|
|
||||||
}
|
}
|
||||||
catch (RuntimeException e) {
|
if (inBuf[1] != 90) {
|
||||||
throw e;
|
String message = "ProxySOCKS4: server returns CD " + inBuf[1];
|
||||||
}
|
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, message);
|
||||||
catch (Exception e) {
|
|
||||||
try {
|
|
||||||
socket.close();
|
|
||||||
}
|
|
||||||
catch (Exception eee) {
|
|
||||||
}
|
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, e.toString());
|
|
||||||
}
|
}
|
||||||
|
inBuf = new byte[2];
|
||||||
|
dis.readFully(inBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,15 +16,16 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smack.proxy;
|
package org.jivesoftware.smack.proxy;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import org.jivesoftware.smack.util.CloseableUtil;
|
import org.jivesoftware.smack.util.OutputStreamUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Socket factory for Socks5 proxy.
|
* Socket factory for Socks5 proxy.
|
||||||
|
@ -32,7 +33,6 @@ import org.jivesoftware.smack.util.CloseableUtil;
|
||||||
* @author Atul Aggarwal
|
* @author Atul Aggarwal
|
||||||
*/
|
*/
|
||||||
public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
private static final Logger LOGGER = Logger.getLogger(Socks5ProxySocketConnection.class.getName());
|
|
||||||
|
|
||||||
private final ProxyInfo proxy;
|
private final ProxyInfo proxy;
|
||||||
|
|
||||||
|
@ -43,22 +43,18 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
@Override
|
@Override
|
||||||
public void connect(Socket socket, String host, int port, int timeout)
|
public void connect(Socket socket, String host, int port, int timeout)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
InputStream in = null;
|
|
||||||
OutputStream out = null;
|
|
||||||
String proxy_host = proxy.getProxyAddress();
|
String proxy_host = proxy.getProxyAddress();
|
||||||
int proxy_port = proxy.getProxyPort();
|
int proxy_port = proxy.getProxyPort();
|
||||||
String user = proxy.getProxyUsername();
|
String user = proxy.getProxyUsername();
|
||||||
String passwd = proxy.getProxyPassword();
|
String passwd = proxy.getProxyPassword();
|
||||||
|
|
||||||
try {
|
socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout);
|
||||||
socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout);
|
InputStream in = socket.getInputStream();
|
||||||
in = socket.getInputStream();
|
DataInputStream dis = new DataInputStream(in);
|
||||||
out = socket.getOutputStream();
|
OutputStream out = socket.getOutputStream();
|
||||||
|
|
||||||
socket.setTcpNoDelay(true);
|
ByteArrayOutputStream outBuf = new ByteArrayOutputStream();
|
||||||
|
byte[] inBuf;
|
||||||
byte[] buf = new byte[1024];
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
+----+----------+----------+
|
+----+----------+----------+
|
||||||
|
@ -81,13 +77,13 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
o X'FF' NO ACCEPTABLE METHODS
|
o X'FF' NO ACCEPTABLE METHODS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
buf[index++] = 5;
|
outBuf.write(5);
|
||||||
|
|
||||||
buf[index++] = 2;
|
outBuf.write(2);
|
||||||
buf[index++] = 0; // NO AUTHENTICATION REQUIRED
|
outBuf.write(0); // NO AUTHENTICATION REQUIRED
|
||||||
buf[index++] = 2; // USERNAME/PASSWORD
|
outBuf.write(2); // USERNAME/PASSWORD
|
||||||
|
|
||||||
out.write(buf, 0, index);
|
OutputStreamUtil.writeResetAndFlush(outBuf, out);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The server selects from one of the methods given in METHODS, and
|
The server selects from one of the methods given in METHODS, and
|
||||||
|
@ -99,17 +95,18 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
| 1 | 1 |
|
| 1 | 1 |
|
||||||
+----+--------+
|
+----+--------+
|
||||||
*/
|
*/
|
||||||
fill(in, buf, 2);
|
inBuf = new byte[2];
|
||||||
|
dis.readFully(inBuf);
|
||||||
|
|
||||||
boolean check = false;
|
boolean check = false;
|
||||||
switch (buf[1] & 0xff) {
|
switch (inBuf[1] & 0xff) {
|
||||||
case 0: // NO AUTHENTICATION REQUIRED
|
case 0: // NO AUTHENTICATION REQUIRED
|
||||||
check = true;
|
check = true;
|
||||||
|
break;
|
||||||
|
case 2: // USERNAME/PASSWORD
|
||||||
|
if (user == null || passwd == null) {
|
||||||
break;
|
break;
|
||||||
case 2: // USERNAME/PASSWORD
|
}
|
||||||
if (user == null || passwd == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Once the SOCKS V5 server has started, and the client has selected the
|
Once the SOCKS V5 server has started, and the client has selected the
|
||||||
|
@ -130,20 +127,16 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
PASSWD field that follows. The PASSWD field contains the password
|
PASSWD field that follows. The PASSWD field contains the password
|
||||||
association with the given UNAME.
|
association with the given UNAME.
|
||||||
*/
|
*/
|
||||||
index = 0;
|
outBuf.write(1);
|
||||||
buf[index++] = 1;
|
byte[] userBytes = user.getBytes(StandardCharsets.UTF_8);
|
||||||
buf[index++] = (byte) user.length();
|
OutputStreamUtil.writeByteSafe(outBuf, userBytes.length, "Username to long");
|
||||||
byte[] userBytes = user.getBytes(StandardCharsets.UTF_8);
|
outBuf.write(userBytes);
|
||||||
System.arraycopy(userBytes, 0, buf, index,
|
|
||||||
user.length());
|
|
||||||
index += user.length();
|
|
||||||
byte[] passwordBytes = passwd.getBytes(StandardCharsets.UTF_8);
|
|
||||||
buf[index++] = (byte) passwordBytes.length;
|
|
||||||
System.arraycopy(passwordBytes, 0, buf, index,
|
|
||||||
passwd.length());
|
|
||||||
index += passwd.length();
|
|
||||||
|
|
||||||
out.write(buf, 0, index);
|
byte[] passwordBytes = passwd.getBytes(StandardCharsets.UTF_8);
|
||||||
|
OutputStreamUtil.writeByteSafe(outBuf, passwordBytes.length, "Password to long");
|
||||||
|
outBuf.write(passwordBytes);
|
||||||
|
|
||||||
|
OutputStreamUtil.writeResetAndFlush(outBuf, out);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The server verifies the supplied UNAME and PASSWD, and sends the
|
The server verifies the supplied UNAME and PASSWD, and sends the
|
||||||
|
@ -159,19 +152,19 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
`failure' (STATUS value other than X'00') status, it MUST close the
|
`failure' (STATUS value other than X'00') status, it MUST close the
|
||||||
connection.
|
connection.
|
||||||
*/
|
*/
|
||||||
fill(in, buf, 2);
|
inBuf = new byte[2];
|
||||||
if (buf[1] == 0) {
|
dis.readFully(inBuf);
|
||||||
check = true;
|
if (inBuf[1] == 0) {
|
||||||
}
|
check = true;
|
||||||
break;
|
}
|
||||||
default:
|
break;
|
||||||
}
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
if (!check) {
|
if (!check) {
|
||||||
CloseableUtil.maybeClose(socket, LOGGER);
|
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5,
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5,
|
"fail in SOCKS5 proxy");
|
||||||
"fail in SOCKS5 proxy");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The SOCKS request is formed as follows:
|
The SOCKS request is formed as follows:
|
||||||
|
@ -199,21 +192,19 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
order
|
order
|
||||||
*/
|
*/
|
||||||
|
|
||||||
index = 0;
|
outBuf.write(5);
|
||||||
buf[index++] = 5;
|
outBuf.write(1); // CONNECT
|
||||||
buf[index++] = 1; // CONNECT
|
outBuf.write(0);
|
||||||
buf[index++] = 0;
|
|
||||||
|
|
||||||
byte[] hostb = host.getBytes(StandardCharsets.UTF_8);
|
byte[] hostb = host.getBytes(StandardCharsets.UTF_8);
|
||||||
int len = hostb.length;
|
int len = hostb.length;
|
||||||
buf[index++] = 3; // DOMAINNAME
|
outBuf.write(3); // DOMAINNAME
|
||||||
buf[index++] = (byte) len;
|
OutputStreamUtil.writeByteSafe(outBuf, len, "Hostname too long");
|
||||||
System.arraycopy(hostb, 0, buf, index, len);
|
outBuf.write(hostb);
|
||||||
index += len;
|
outBuf.write(port >>> 8);
|
||||||
buf[index++] = (byte) (port >>> 8);
|
outBuf.write(port & 0xff);
|
||||||
buf[index++] = (byte) (port & 0xff);
|
|
||||||
|
|
||||||
out.write(buf, 0, index);
|
OutputStreamUtil.writeResetAndFlush(outBuf, out);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The SOCKS request information is sent by the client as soon as it has
|
The SOCKS request information is sent by the client as soon as it has
|
||||||
|
@ -250,49 +241,33 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
|
||||||
o BND.PORT server bound port in network octet order
|
o BND.PORT server bound port in network octet order
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fill(in, buf, 4);
|
inBuf = new byte[4];
|
||||||
|
dis.readFully(inBuf);
|
||||||
|
|
||||||
if (buf[1] != 0) {
|
if (inBuf[1] != 0) {
|
||||||
CloseableUtil.maybeClose(socket, LOGGER);
|
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5,
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5,
|
"server returns " + inBuf[1]);
|
||||||
"server returns " + buf[1]);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
switch (buf[3] & 0xff) {
|
final int addressBytes;
|
||||||
case 1:
|
// TODO: Use Byte.toUnsignedInt() once Smack's minimum Android SDK level is 26 or higher.
|
||||||
fill(in, buf, 6);
|
final int atyp = inBuf[3] & 0xff;
|
||||||
break;
|
switch (atyp) {
|
||||||
case 3:
|
case 1:
|
||||||
fill(in, buf, 1);
|
addressBytes = 4;
|
||||||
fill(in, buf, (buf[0] & 0xff) + 2);
|
break;
|
||||||
break;
|
case 3:
|
||||||
case 4:
|
byte domainnameLengthByte = dis.readByte();
|
||||||
fill(in, buf, 18);
|
// TODO: Use Byte.toUnsignedInt() once Smack's minimum Android SDK level is 26 or higher.
|
||||||
break;
|
addressBytes = domainnameLengthByte & 0xff;
|
||||||
default:
|
break;
|
||||||
}
|
case 4:
|
||||||
}
|
addressBytes = 16;
|
||||||
catch (RuntimeException e) {
|
break;
|
||||||
throw e;
|
default:
|
||||||
}
|
throw new IOException("Unknown ATYP value: " + atyp);
|
||||||
catch (Exception e) {
|
|
||||||
CloseableUtil.maybeClose(socket, LOGGER);
|
|
||||||
// TODO convert to IOException(e) when minimum Android API level is 9 or higher
|
|
||||||
throw new IOException(e.getLocalizedMessage());
|
|
||||||
}
|
}
|
||||||
|
inBuf = new byte[addressBytes + 2];
|
||||||
|
dis.readFully(inBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void fill(InputStream in, byte[] buf, int len)
|
|
||||||
throws IOException {
|
|
||||||
int s = 0;
|
|
||||||
while (s < len) {
|
|
||||||
int i = in.read(buf, s, len - s);
|
|
||||||
if (i <= 0) {
|
|
||||||
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5, "stream " +
|
|
||||||
"is closed");
|
|
||||||
}
|
|
||||||
s += i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2019 Florian Schmaus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smack.util;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class OutputStreamUtil {
|
||||||
|
|
||||||
|
public static void writeByteSafe(OutputStream outputStream, int i, String message) throws IOException {
|
||||||
|
if (i < 0 || i > 0xff) {
|
||||||
|
throw new IOException(message + ". The value " + i + " is not within the allowed range for bytes");
|
||||||
|
}
|
||||||
|
outputStream.write(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeResetAndFlush(ByteArrayOutputStream byteArrayOutputStream, OutputStream outputStream)
|
||||||
|
throws IOException {
|
||||||
|
byteArrayOutputStream.writeTo(outputStream);
|
||||||
|
byteArrayOutputStream.reset();
|
||||||
|
outputStream.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -45,7 +45,7 @@ public class Base32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ2345678";
|
private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
||||||
|
|
||||||
public static StringEncoder<String> getStringEncoder() {
|
public static StringEncoder<String> getStringEncoder() {
|
||||||
return base32Stringencoder;
|
return base32Stringencoder;
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smack.parsing;
|
package org.jivesoftware.smack.parsing;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
|
||||||
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
|
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
|
||||||
import org.jivesoftware.smackx.forward.packet.Forwarded;
|
import org.jivesoftware.smackx.forward.packet.Forwarded;
|
||||||
|
import org.jivesoftware.smackx.mam.MamManager.MamQueryArgs;
|
||||||
import org.jivesoftware.smackx.mam.element.MamElements;
|
import org.jivesoftware.smackx.mam.element.MamElements;
|
||||||
import org.jivesoftware.smackx.mam.element.MamElements.MamResultExtension;
|
import org.jivesoftware.smackx.mam.element.MamElements.MamResultExtension;
|
||||||
import org.jivesoftware.smackx.mam.element.MamFinIQ;
|
import org.jivesoftware.smackx.mam.element.MamFinIQ;
|
||||||
|
|
|
@ -16,10 +16,10 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.forward;
|
package org.jivesoftware.smackx.forward;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.iqversion;
|
package org.jivesoftware.smackx.iqversion;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import org.jivesoftware.smack.DummyConnection;
|
import org.jivesoftware.smack.DummyConnection;
|
||||||
|
|
|
@ -16,10 +16,10 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.ping;
|
package org.jivesoftware.smackx.ping;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.jxmpp.jid.JidTestUtil.DUMMY_AT_EXAMPLE_ORG;
|
import static org.jxmpp.jid.JidTestUtil.DUMMY_AT_EXAMPLE_ORG;
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.pubsub.provider;
|
package org.jivesoftware.smackx.pubsub.provider;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.receipts;
|
package org.jivesoftware.smackx.receipts;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
package org.jivesoftware.smackx.xhtmlim.provider;
|
package org.jivesoftware.smackx.xhtmlim.provider;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.instanceOf;
|
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2015-2019 Florian Schmaus
|
* Copyright 2015-2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -19,6 +19,7 @@ package org.igniterealtime.smack.inttest.unittest;
|
||||||
import static org.igniterealtime.smack.inttest.SmackIntegrationTestUnitTestUtil.getFrameworkForUnitTest;
|
import static org.igniterealtime.smack.inttest.SmackIntegrationTestUnitTestUtil.getFrameworkForUnitTest;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertThrows;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -43,15 +44,10 @@ import org.igniterealtime.smack.inttest.SmackIntegrationTestFramework;
|
||||||
import org.igniterealtime.smack.inttest.SmackIntegrationTestFramework.TestRunResult;
|
import org.igniterealtime.smack.inttest.SmackIntegrationTestFramework.TestRunResult;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Rule;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
|
||||||
|
|
||||||
public class SmackIntegrationTestFrameworkUnitTest {
|
public class SmackIntegrationTestFrameworkUnitTest {
|
||||||
|
|
||||||
@Rule
|
|
||||||
public ExpectedException expectedException = ExpectedException.none();
|
|
||||||
|
|
||||||
private static boolean beforeClassInvoked;
|
private static boolean beforeClassInvoked;
|
||||||
private static boolean afterClassInvoked;
|
private static boolean afterClassInvoked;
|
||||||
|
|
||||||
|
@ -68,10 +64,10 @@ public class SmackIntegrationTestFrameworkUnitTest {
|
||||||
@Test
|
@Test
|
||||||
public void throwsRuntimeExceptionsTest() throws KeyManagementException, NoSuchAlgorithmException, SmackException,
|
public void throwsRuntimeExceptionsTest() throws KeyManagementException, NoSuchAlgorithmException, SmackException,
|
||||||
IOException, XMPPException, InterruptedException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
IOException, XMPPException, InterruptedException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
expectedException.expect(RuntimeException.class);
|
|
||||||
expectedException.expectMessage(ThrowsRuntimeExceptionDummyTest.RUNTIME_EXCEPTION_MESSAGE);
|
|
||||||
DummySmackIntegrationTestFramework sinttest = getFrameworkForUnitTest(ThrowsRuntimeExceptionDummyTest.class);
|
DummySmackIntegrationTestFramework sinttest = getFrameworkForUnitTest(ThrowsRuntimeExceptionDummyTest.class);
|
||||||
sinttest.run();
|
assertThrows(RuntimeException.class, () -> {
|
||||||
|
sinttest.run();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ThrowsRuntimeExceptionDummyTest extends AbstractSmackIntegrationTest {
|
public static class ThrowsRuntimeExceptionDummyTest extends AbstractSmackIntegrationTest {
|
||||||
|
|
|
@ -274,13 +274,13 @@ public class OmemoMessageBuilder<T_IdKeyPair, T_IdKey, T_PreKey, T_SigPreKey, T_
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a 16 byte initialization vector for AES encryption.
|
* Generate a 12 byte initialization vector for AES encryption.
|
||||||
*
|
*
|
||||||
* @return iv TODO javadoc me please
|
* @return iv initialization vector
|
||||||
*/
|
*/
|
||||||
public static byte[] generateIv() {
|
public static byte[] generateIv() {
|
||||||
SecureRandom random = new SecureRandom();
|
SecureRandom random = new SecureRandom();
|
||||||
byte[] iv = new byte[16];
|
byte[] iv = new byte[12];
|
||||||
random.nextBytes(iv);
|
random.nextBytes(iv);
|
||||||
return iv;
|
return iv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -606,6 +606,7 @@ public class XMPPTCPConnection extends AbstractXMPPConnection {
|
||||||
try {
|
try {
|
||||||
proxyInfo.getProxySocketConnection().connect(socket, host, port, timeout);
|
proxyInfo.getProxySocketConnection().connect(socket, host, port, timeout);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
CloseableUtil.maybeClose(socket, LOGGER);
|
||||||
hostAddress.setException(e);
|
hostAddress.setException(e);
|
||||||
failedAddresses.add(hostAddress);
|
failedAddresses.add(hostAddress);
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in a new issue