Merge branch 'master' into development

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java   |  3 
src/main/java/eu/siacs/conversations/persistance/FileBackend.java |  6 
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java     | 60 
3 files changed, 35 insertions(+), 34 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java 🔗

@@ -101,6 +101,9 @@ public class ScramSha1 extends SaslMechanism {
 	public String getResponse(final String challenge) throws AuthenticationException {
 		switch (state) {
 			case AUTH_TEXT_SENT:
+				if (challenge == null) {
+					throw new AuthenticationException("challenge can not be null");
+				}
 				serverFirstMessage = Base64.decode(challenge, Base64.DEFAULT);
 				final Tokenizer tokenizer = new Tokenizer(serverFirstMessage);
 				String nonce = "";

src/main/java/eu/siacs/conversations/persistance/FileBackend.java 🔗

@@ -358,11 +358,7 @@ public class FileBackend {
 					file.delete();
 					return false;
 				}
-			} catch (FileNotFoundException e) {
-				return false;
-			} catch (IOException e) {
-				return false;
-			} catch (NoSuchAlgorithmException e) {
+			} catch (IllegalArgumentException | IOException | NoSuchAlgorithmException e) {
 				return false;
 			} finally {
 				close(os);

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -150,7 +150,6 @@ public class XmppConnection implements Runnable {
 			shouldAuthenticate = shouldBind = !account.isOptionSet(Account.OPTION_REGISTER);
 			tagReader = new XmlReader(wakeLock);
 			tagWriter = new TagWriter();
-			packetCallbacks.clear();
 			this.changeStatus(Account.State.CONNECTING);
 			if (DNSHelper.isIp(account.getServer().toString())) {
 				socket = new Socket();
@@ -197,10 +196,7 @@ public class XmppConnection implements Runnable {
 							socket = new Socket();
 							socket.connect(addr, Config.SOCKET_TIMEOUT * 1000);
 							socketError = false;
-						} catch (final UnknownHostException e) {
-							Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
-							i++;
-						} catch (final IOException e) {
+						} catch (final Throwable e) {
 							Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
 							i++;
 						}
@@ -470,26 +466,28 @@ public class XmppConnection implements Runnable {
 				this.jingleListener.onJinglePacketReceived(account,(JinglePacket) packet);
 			}
 		} else {
-			if (packetCallbacks.containsKey(packet.getId())) {
-				final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId());
-				// Packets to the server should have responses from the server
-				if (packetCallbackDuple.first.toServer(account)) {
-					if (packet.fromServer(account)) {
-						packetCallbackDuple.second.onIqPacketReceived(account, packet);
-						packetCallbacks.remove(packet.getId());
-					} else {
-						Log.e(Config.LOGTAG,account.getJid().toBareJid().toString()+": ignoring spoofed iq packet");
-					}
-				} else {
-					if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) {
-						packetCallbackDuple.second.onIqPacketReceived(account, packet);
-						packetCallbacks.remove(packet.getId());
+			synchronized (this.packetCallbacks) {
+				if (packetCallbacks.containsKey(packet.getId())) {
+					final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId());
+					// Packets to the server should have responses from the server
+					if (packetCallbackDuple.first.toServer(account)) {
+						if (packet.fromServer(account)) {
+							packetCallbackDuple.second.onIqPacketReceived(account, packet);
+							packetCallbacks.remove(packet.getId());
+						} else {
+							Log.e(Config.LOGTAG, account.getJid().toBareJid().toString() + ": ignoring spoofed iq packet");
+						}
 					} else {
-						Log.e(Config.LOGTAG,account.getJid().toBareJid().toString()+": ignoring spoofed iq packet");
+						if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) {
+							packetCallbackDuple.second.onIqPacketReceived(account, packet);
+							packetCallbacks.remove(packet.getId());
+						} else {
+							Log.e(Config.LOGTAG, account.getJid().toBareJid().toString() + ": ignoring spoofed iq packet");
+						}
 					}
+				} else if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) {
+					this.unregisteredIqListener.onIqPacketReceived(account, packet);
 				}
-			} else if (packet.getType() == IqPacket.TYPE.GET|| packet.getType() == IqPacket.TYPE.SET) {
-				this.unregisteredIqListener.onIqPacketReceived(account, packet);
 			}
 		}
 	}
@@ -720,13 +718,15 @@ public class XmppConnection implements Runnable {
 	}
 
 	private void clearIqCallbacks() {
-		Log.d(Config.LOGTAG,account.getJid().toBareJid()+": clearing iq iq callbacks");
+		Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": clearing iq iq callbacks");
 		final IqPacket failurePacket = new IqPacket(IqPacket.TYPE.ERROR);
-		Iterator<Entry<String, Pair<IqPacket, OnIqPacketReceived>>> iterator = this.packetCallbacks.entrySet().iterator();
-		while(iterator.hasNext()) {
-			Entry<String, Pair<IqPacket, OnIqPacketReceived>> entry = iterator.next();
-			entry.getValue().second.onIqPacketReceived(account,failurePacket);
-			iterator.remove();
+		synchronized (this.packetCallbacks) {
+			Iterator<Entry<String, Pair<IqPacket, OnIqPacketReceived>>> iterator = this.packetCallbacks.entrySet().iterator();
+			while (iterator.hasNext()) {
+				Entry<String, Pair<IqPacket, OnIqPacketReceived>> entry = iterator.next();
+				entry.getValue().second.onIqPacketReceived(account, failurePacket);
+				iterator.remove();
+			}
 		}
 	}
 
@@ -899,7 +899,9 @@ public class XmppConnection implements Runnable {
 			packet.setAttribute("id", id);
 		}
 		if (callback != null) {
-			packetCallbacks.put(packet.getId(), new Pair<>(packet, callback));
+			synchronized (this.packetCallbacks) {
+				packetCallbacks.put(packet.getId(), new Pair<>(packet, callback));
+			}
 		}
 		this.sendPacket(packet);
 	}