1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-11-26 05:52:06 +01:00

Compare commits

..

No commits in common. "0cd3318b128e789a44dd97775ffbb4496a783418" and "daab6039a1af48199a709873020ba81096fb4b2d" have entirely different histories.

17 changed files with 57 additions and 174 deletions

View file

@ -1,7 +0,0 @@
Thank you for your contribution!
Before creating a Pull Request, please make sure to
* read https://github.com/igniterealtime/Smack/wiki/Guidelines-for-Smack-Developers-and-Contributors
* run `gradle check` successfully in order to make sure that your code does not break any JUnit tests and is conform to the projects code style.
* (if applicable) mention any Jira issue codes (eg. `SMACK-XXX`) in the *body* of your commit message (not the header), so that Jira automatically links the PR to the issue.
* squash your commits if possible/sensible.

View file

@ -80,7 +80,6 @@ debugger=console
### Where to place the properties file
The framework will first load the properties file from `~/.config/smack-integration-test/properties`
Overview of the components
--------------------------

View file

@ -4,7 +4,5 @@ This API is considered beta quality."""
dependencies {
compile project(':smack-core')
// See https://issues.igniterealtime.org/browse/SMACK-858 and
// comment in version.gradle why the specify the version this way.
compile 'org.igniterealtime.jbosh:jbosh:[0.9.1,0.9.999]'
compile 'org.igniterealtime.jbosh:jbosh:[0.9,0.10)'
}

View file

@ -19,8 +19,6 @@ package org.jivesoftware.smack.bosh;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.proxy.ProxyInfo;
@ -36,7 +34,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
private final boolean https;
private final String file;
private Map<String, String> httpHeaders;
private BOSHConfiguration(Builder builder) {
super(builder);
@ -52,7 +49,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
} else {
file = builder.file;
}
httpHeaders = builder.httpHeaders;
}
public boolean isProxyEnabled() {
@ -80,10 +76,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
return new URI((https ? "https://" : "http://") + this.host + ":" + this.port + file);
}
public Map<String, String> getHttpHeaders() {
return httpHeaders;
}
public static Builder builder() {
return new Builder();
}
@ -91,7 +83,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
public static final class Builder extends ConnectionConfiguration.Builder<Builder, BOSHConfiguration> {
private boolean https;
private String file;
private Map<String, String> httpHeaders = new HashMap<>();
private Builder() {
}
@ -110,11 +101,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
return this;
}
public Builder addHttpHeader(String name, String value) {
httpHeaders.put(name, value);
return this;
}
@Override
public BOSHConfiguration build() {
return new BOSHConfiguration(this);

View file

@ -22,7 +22,6 @@ import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.StringReader;
import java.io.Writer;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -158,13 +157,8 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
if (config.isProxyEnabled()) {
cfgBuilder.setProxy(config.getProxyAddress(), config.getProxyPort());
}
cfgBuilder.setCompressionEnabled(config.isCompressionEnabled());
for (Map.Entry<String, String> h : config.getHttpHeaders().entrySet()) {
cfgBuilder.addHttpHeader(h.getKey(), h.getValue());
}
client = BOSHClient.create(cfgBuilder.build());
client.addBOSHClientConnListener(new BOSHConnectionListener());

View file

@ -858,6 +858,9 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
ASYNC_BUT_ORDERED.performAsyncButOrdered(this, () -> {
currentConnectionException = exception;
synchronized (AbstractXMPPConnection.this) {
notifyAll();
}
for (StanzaCollector collector : collectors) {
collector.notifyConnectionError(exception);
@ -870,14 +873,10 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
// XMPPTCPConnection. Create delegation method?
// maybeCompressFeaturesReceived.reportGenericFailure(smackWrappedException);
synchronized (AbstractXMPPConnection.this) {
notifyAll();
// Closes the connection temporary. A if the connection supports stream management, then a reconnection is
// possible. Note that a connection listener of e.g. XMPPTCPConnection will drop the SM state in
// case the Exception is a StreamErrorException.
instantShutdown();
}
// Closes the connection temporary. A if the connection supports stream management, then a reconnection is
// possible. Note that a connection listener of e.g. XMPPTCPConnection will drop the SM state in
// case the Exception is a StreamErrorException.
instantShutdown();
Async.go(() -> {
// Notify connection listeners of the error.

View file

@ -58,7 +58,7 @@ class HTTPProxySocketConnection implements ProxySocketConnection {
proxyLine = "\r\nProxy-Authorization: Basic " + Base64.encode(username + ":" + password);
}
socket.getOutputStream().write((hostport + " HTTP/1.1\r\nHost: "
+ host + ":" + port + proxyLine + "\r\n\r\n").getBytes("UTF-8"));
+ hostport + proxyLine + "\r\n\r\n").getBytes("UTF-8"));
InputStream in = socket.getInputStream();
StringBuilder got = new StringBuilder(100);
@ -115,8 +115,7 @@ class HTTPProxySocketConnection implements ProxySocketConnection {
int code = Integer.parseInt(m.group(1));
if (code != HttpURLConnection.HTTP_OK) {
throw new ProxyException(ProxyInfo.ProxyType.HTTP,
"Error code in proxy response: " + code);
throw new ProxyException(ProxyInfo.ProxyType.HTTP);
}
}

View file

@ -152,11 +152,8 @@ public final class MultiUserChatManager extends Manager {
private AutoJoinFailedCallback autoJoinFailedCallback;
private final ServiceDiscoveryManager serviceDiscoveryManager;
private MultiUserChatManager(XMPPConnection connection) {
super(connection);
serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
// Listens for all messages that include a MUCUser extension and fire the invitation
// listeners if the message includes an invitation.
StanzaListener invitationPacketListener = new StanzaListener() {
@ -280,7 +277,7 @@ public final class MultiUserChatManager extends Manager {
* @throws InterruptedException
*/
public boolean isServiceEnabled(Jid user) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
return serviceDiscoveryManager.supportsFeature(user, MUCInitialPresence.NAMESPACE);
return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(user, MUCInitialPresence.NAMESPACE);
}
/**
@ -307,7 +304,7 @@ public final class MultiUserChatManager extends Manager {
public List<EntityBareJid> getJoinedRooms(EntityJid user) throws NoResponseException, XMPPErrorException,
NotConnectedException, InterruptedException {
// Send the disco packet to the user
DiscoverItems result = serviceDiscoveryManager.discoverItems(user, DISCO_NODE);
DiscoverItems result = ServiceDiscoveryManager.getInstanceFor(connection()).discoverItems(user, DISCO_NODE);
List<DiscoverItems.Item> items = result.getItems();
List<EntityBareJid> answer = new ArrayList<>(items.size());
// Collect the entityID for each returned item
@ -334,7 +331,7 @@ public final class MultiUserChatManager extends Manager {
* @throws InterruptedException
*/
public RoomInfo getRoomInfo(EntityBareJid room) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
DiscoverInfo info = serviceDiscoveryManager.discoverInfo(room);
DiscoverInfo info = ServiceDiscoveryManager.getInstanceFor(connection()).discoverInfo(room);
return new RoomInfo(info);
}
@ -348,7 +345,8 @@ public final class MultiUserChatManager extends Manager {
* @throws InterruptedException
*/
public List<DomainBareJid> getMucServiceDomains() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
return serviceDiscoveryManager.findServices(MUCInitialPresence.NAMESPACE, false, false);
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection());
return sdm.findServices(MUCInitialPresence.NAMESPACE, false, false);
}
/**
@ -381,7 +379,7 @@ public final class MultiUserChatManager extends Manager {
*/
public boolean providesMucService(DomainBareJid domainBareJid) throws NoResponseException,
XMPPErrorException, NotConnectedException, InterruptedException {
return serviceDiscoveryManager.supportsFeature(domainBareJid,
return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(domainBareJid,
MUCInitialPresence.NAMESPACE);
}
@ -404,7 +402,8 @@ public final class MultiUserChatManager extends Manager {
if (!providesMucService(serviceName)) {
throw new NotAMucServiceException(serviceName);
}
DiscoverItems discoverItems = serviceDiscoveryManager.discoverItems(serviceName);
ServiceDiscoveryManager discoManager = ServiceDiscoveryManager.getInstanceFor(connection());
DiscoverItems discoverItems = discoManager.discoverItems(serviceName);
List<DiscoverItems.Item> items = discoverItems.getItems();
Map<EntityBareJid, HostedRoom> answer = new HashMap<>(items.size());

View file

@ -447,19 +447,6 @@ public final class PingManager extends Manager {
pingFuture.onError(new ExceptionCallback<Exception>() {
@Override
public void processException(Exception exception) {
long lastStanzaReceived = connection.getLastStanzaReceived();
if (lastStanzaReceived > 0) {
long now = System.currentTimeMillis();
// Delta since the last stanza was received
int deltaInSeconds = (int) ((now - lastStanzaReceived) / 1000);
// If the delta is smaller then the ping interval, we have got an valid stanza in time
// So not error notification needed
if (deltaInSeconds < pingInterval) {
maybeSchedulePingServerTask(deltaInSeconds);
return;
}
}
for (PingFailedListener l : pingFailedListeners) {
l.pingFailed();
}

View file

@ -1,6 +1,6 @@
/**
*
* Copyright 2003-2007 Jive Software, 2016-2019 Florian Schmaus.
* Copyright 2003-2007 Jive Software, 2016-2017 Florian Schmaus.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -629,40 +629,14 @@ public final class Roster extends Manager {
* @throws NotLoggedInException If not logged in.
* @throws NotConnectedException
* @throws InterruptedException
* @deprecated use {@link #createItemAndRequestSubscription(BareJid, String, String[])} instead.
*/
// TODO: Remove in Smack 4.5.
@Deprecated
public void createEntry(BareJid user, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
createItemAndRequestSubscription(user, name, groups);
}
/**
* Creates a new roster item. The server will asynchronously update the roster with the subscription status.
* <p>
* There will be no presence subscription request. Consider using
* {@link #createItemAndRequestSubscription(BareJid, String, String[])} if you also want to request a presence
* subscription from the contact.
* </p>
*
* @param jid the XMPP address of the contact (e.g. johndoe@jabber.org)
* @param name the nickname of the user.
* @param groups the list of group names the entry will belong to, or <tt>null</tt> if the the roster entry won't
* belong to a group.
* @throws NoResponseException if there was no response from the server.
* @throws XMPPErrorException if an XMPP exception occurs.
* @throws NotLoggedInException If not logged in.
* @throws NotConnectedException
* @throws InterruptedException
* @since 4.4.0
*/
public void createItem(BareJid jid, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
final XMPPConnection connection = getAuthenticatedConnectionOrThrow();
// Create and send roster entry creation packet.
RosterPacket rosterPacket = new RosterPacket();
rosterPacket.setType(IQ.Type.set);
RosterPacket.Item item = new RosterPacket.Item(jid, name);
RosterPacket.Item item = new RosterPacket.Item(user, name);
if (groups != null) {
for (String group : groups) {
if (group != null && group.trim().length() > 0) {
@ -672,27 +646,8 @@ public final class Roster extends Manager {
}
rosterPacket.addRosterItem(item);
connection.createStanzaCollectorAndSend(rosterPacket).nextResultOrThrow();
}
/**
* Creates a new roster entry and presence subscription. The server will asynchronously
* update the roster with the subscription status.
*
* @param jid the XMPP address of the contact (e.g. johndoe@jabber.org)
* @param name the nickname of the user.
* @param groups the list of group names the entry will belong to, or <tt>null</tt> if the
* the roster entry won't belong to a group.
* @throws NoResponseException if there was no response from the server.
* @throws XMPPErrorException if an XMPP exception occurs.
* @throws NotLoggedInException If not logged in.
* @throws NotConnectedException
* @throws InterruptedException
* @since 4.4.0
*/
public void createItemAndRequestSubscription(BareJid jid, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
createItem(jid, name, groups);
sendSubscriptionRequest(jid);
sendSubscriptionRequest(user);
}
/**
@ -713,7 +668,7 @@ public final class Roster extends Manager {
*/
public void preApproveAndCreateEntry(BareJid user, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException, FeatureNotSupportedException {
preApprove(user);
createItemAndRequestSubscription(user, name, groups);
createEntry(user, name, groups);
}
/**

View file

@ -164,7 +164,7 @@ public class RosterTest extends InitSmackIm {
}
};
serverSimulator.start();
roster.createItemAndRequestSubscription(contactJID, contactName, contactGroup);
roster.createEntry(contactJID, contactName, contactGroup);
serverSimulator.join();
// Check if an error occurred within the simulator
@ -430,7 +430,7 @@ public class RosterTest extends InitSmackIm {
}
};
serverSimulator.start();
roster.createItemAndRequestSubscription(contactJID, contactName, contactGroup);
roster.createEntry(contactJID, contactName, contactGroup);
serverSimulator.join();
// Check if an error occurred within the simulator

View file

@ -299,32 +299,10 @@ public class XmppConnectionStressTest {
private ErrorsWhileSendingOrReceivingException(Map<XMPPConnection, Exception> sendExceptions,
Map<XMPPConnection, Exception> receiveExceptions) {
super(createMessageFrom(sendExceptions, receiveExceptions));
super("Exceptions while sending and/or receiving");
this.sendExceptions = sendExceptions;
this.receiveExceptions = receiveExceptions;
}
private static String createMessageFrom(Map<XMPPConnection, Exception> sendExceptions,
Map<XMPPConnection, Exception> receiveExceptions) {
StringBuilder sb = new StringBuilder(1024);
sb.append("Exceptions while sending and/or receiving.");
if (!sendExceptions.isEmpty()) {
sb.append(" Send exxceptions: ");
for (Map.Entry<XMPPConnection, Exception> entry : sendExceptions.entrySet()) {
sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(';');
}
}
if (!receiveExceptions.isEmpty()) {
sb.append(" Receive exceptions: ");
for (Map.Entry<XMPPConnection, Exception> entry : receiveExceptions.entrySet()) {
sb.append(entry.getKey()).append(": ").append(entry.getValue());
}
}
return sb.toString();
}
}
}
}

View file

@ -1,6 +1,6 @@
/**
*
* Copyright 2015-2019 Florian Schmaus
* Copyright 2015-2018 Florian Schmaus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -25,13 +25,11 @@ import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException.XMPPErrorException;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.roster.AbstractPresenceEventListener;
import org.jivesoftware.smack.roster.PresenceEventListener;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.roster.SubscribeListener;
import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.EntityFullJid;
import org.jxmpp.jid.Jid;
public class IntegrationTestRosterUtil {
@ -41,47 +39,41 @@ public class IntegrationTestRosterUtil {
ensureSubscribedTo(conTwo, conOne, timeout);
}
public static void ensureSubscribedTo(final XMPPConnection presenceRequestReceiverConnection, final XMPPConnection presenceRequestingConnection, long timeout) throws TimeoutException, Exception {
final Roster presenceRequestReceiverRoster = Roster.getInstanceFor(presenceRequestReceiverConnection);
final Roster presenceRequestingRoster = Roster.getInstanceFor(presenceRequestingConnection);
public static void ensureSubscribedTo(final XMPPConnection conOne, final XMPPConnection conTwo, long timeout) throws TimeoutException, Exception {
Roster rosterOne = Roster.getInstanceFor(conOne);
Roster rosterTwo = Roster.getInstanceFor(conTwo);
final EntityFullJid presenceRequestReceiverAddress = presenceRequestReceiverConnection.getUser();
final EntityFullJid presenceRequestingAddress = presenceRequestingConnection.getUser();
if (presenceRequestReceiverRoster.isSubscribedToMyPresence(presenceRequestingAddress)) {
if (rosterOne.isSubscribedToMyPresence(conTwo.getUser())) {
return;
}
final SubscribeListener subscribeListener = new SubscribeListener() {
@Override
public SubscribeAnswer processSubscribe(Jid from, Presence subscribeRequest) {
if (from.equals(presenceRequestingConnection.getUser().asBareJid())) {
if (from.equals(conTwo.getUser().asBareJid())) {
return SubscribeAnswer.Approve;
}
return SubscribeAnswer.Deny;
}
};
presenceRequestReceiverRoster.addSubscribeListener(subscribeListener);
rosterOne.addSubscribeListener(subscribeListener);
final SimpleResultSyncPoint syncPoint = new SimpleResultSyncPoint();
final PresenceEventListener presenceEventListener = new AbstractPresenceEventListener() {
rosterTwo.addPresenceEventListener(new AbstractPresenceEventListener() {
@Override
public void presenceSubscribed(BareJid address, Presence subscribedPresence) {
if (!address.equals(presenceRequestReceiverAddress.asBareJid())) {
if (!address.equals(conOne.getUser().asBareJid())) {
return;
}
syncPoint.signal();
}
};
presenceRequestingRoster.addPresenceEventListener(presenceEventListener);
});
rosterTwo.sendSubscriptionRequest(conOne.getUser().asBareJid());
try {
presenceRequestingRoster.sendSubscriptionRequest(presenceRequestReceiverAddress.asBareJid());
syncPoint.waitForResult(timeout);
} finally {
presenceRequestReceiverRoster.removeSubscribeListener(subscribeListener);
presenceRequestingRoster.removePresenceEventListener(presenceEventListener);
rosterOne.removeSubscribeListener(subscribeListener);
}
}

View file

@ -42,9 +42,12 @@ public class LowLevelRosterIntegrationTest extends AbstractSmackLowLevelIntegrat
final Roster rosterOne = Roster.getInstanceFor(conOne);
final Roster rosterTwo = Roster.getInstanceFor(conTwo);
rosterOne.createItem(conTwo.getUser().asBareJid(), "Con Two", null);
rosterTwo.createItem(conOne.getUser().asBareJid(), "Con One", null);
// TODO create Roster.createEntry() with boolean flag for subscribe or not.
rosterOne.createEntry(conTwo.getUser().asBareJid(), "Con Two", null);
rosterTwo.createEntry(conOne.getUser().asBareJid(), "Con One", null);
// TODO Change timeout form '5000' to something configurable.
final long timeout = 5000;
IntegrationTestRosterUtil.ensureBothAccountsAreSubscribedToEachOther(conOne, conTwo, timeout);
final SimpleResultSyncPoint offlineTriggered = new SimpleResultSyncPoint();

View file

@ -99,7 +99,7 @@ public class RosterIntegrationTest extends AbstractSmackIntegrationTest {
});
try {
rosterOne.createItemAndRequestSubscription(conTwo.getUser().asBareJid(), conTwosRosterName, null);
rosterOne.createEntry(conTwo.getUser().asBareJid(), conTwosRosterName, null);
assertTrue(addedAndSubscribed.waitForResult(2 * connection.getReplyTimeout()));
}

View file

@ -1,6 +1,6 @@
/**
*
* Copyright 2018 Paul Schaub, 2019 Florian Schmaus.
* Copyright 2018 Paul Schaub.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -18,6 +18,9 @@ package org.jivesoftware.smackx.mood;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.mood.element.MoodElement;
import org.igniterealtime.smack.inttest.AbstractSmackIntegrationTest;
import org.igniterealtime.smack.inttest.SmackIntegrationTest;
@ -25,6 +28,7 @@ import org.igniterealtime.smack.inttest.SmackIntegrationTestEnvironment;
import org.igniterealtime.smack.inttest.util.IntegrationTestRosterUtil;
import org.igniterealtime.smack.inttest.util.SimpleResultSyncPoint;
import org.junit.AfterClass;
import org.jxmpp.jid.BareJid;
public class MoodIntegrationTest extends AbstractSmackIntegrationTest {
@ -43,20 +47,18 @@ public class MoodIntegrationTest extends AbstractSmackIntegrationTest {
final SimpleResultSyncPoint moodReceived = new SimpleResultSyncPoint();
final MoodListener moodListener = (jid, message, moodElement) -> {
if (moodElement.getMood() == Mood.satisfied) {
moodReceived.signal();
mm2.addMoodListener(new MoodListener() {
@Override
public void onMoodUpdated(BareJid jid, Message message, MoodElement moodElement) {
if (moodElement.getMood() == Mood.satisfied) {
moodReceived.signal();
}
}
};
mm2.addMoodListener(moodListener);
});
try {
mm1.setMood(Mood.satisfied);
mm1.setMood(Mood.satisfied);
moodReceived.waitForResult(timeout);
} finally {
mm2.removeMoodListener(moodListener);
}
moodReceived.waitForResult(timeout);
}
@AfterClass

View file

@ -609,7 +609,6 @@ public class XMPPTCPConnection extends AbstractXMPPConnection {
proxyInfo.getProxySocketConnection().connect(socket, host, port, timeout);
} catch (IOException e) {
hostAddress.setException(e);
failedAddresses.add(hostAddress);
continue;
}
LOGGER.finer("Established TCP connection to " + hostAndPort);