Commit Graph

2448 Commits

Author SHA1 Message Date
Florian Schmaus 403ecff2b2 Add SCRAM-SHA1 support
Thanks to Stefan Karlsson for helping with the implementation.

Also add SASLMechanism.checkIfSuccessfulOrThrow(), to increase the
security by verifying the mechanisms state at the end of SASL
authentication.

SASLMechanism now has a SASLPrep StringTransformer.

Refactor SHA1 functions out of StringUtils into SHA1 utility class.

Add MAC utility class.

Make DummyConnection getSentpacket() methods use generics to make unit
testing SCRAM-SHA1 easier.

Fixes SMACK-398
2014-10-21 15:03:48 +02:00
Florian Schmaus 6a2bc0c02d Fix MUC invitationPacketListener ClassCastException
Make sure that the Packets are of type Message. To prevent:

E/AbstractXMPPConnection﹕ Exception in packet listener
    java.lang.ClassCastException: org.jivesoftware.smack.packet.Presence cannot be cast to org.jivesoftware.smack.packet.Message
            at org.jivesoftware.smackx.muc.MultiUserChatManager$2.processPacket(MultiUserChatM anager.java:124)
            at org.jivesoftware.smack.AbstractXMPPConnection.notifiyReceivedListeners(Abstract XMPPConnection.java:854)
            at org.jivesoftware.smack.AbstractXMPPConnection$ListenerNotification.run(Abstract XMPPConnection.java:876)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201 (ScheduledThreadPoolExecutor.java:153)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Schedu ledThreadPoolExecutor.java:267)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:856)
2014-10-21 10:38:01 +02:00
Florian Schmaus b348ebfd6d Make ProviderManager handle StreamFeatureProvider(s)
when a new ProviderLoader is added. This was previously missing.
2014-10-20 23:05:10 +02:00
Florian Schmaus 5ad4e85ed5 Setup Roster before sending initial presence
Thanks to Phil Winder for reporting the issue.
2014-10-20 21:58:20 +02:00
Florian Schmaus 47e327f2e6 Fix NPE in MultiUserChatManager.getMultiUserchat()
Since the HashMap has WeakReferences as values, there are two levels at
which values could be null.
2014-10-20 21:12:51 +02:00
Florian Schmaus 5d963f7f9b Fix NPE in MUCItem if role is null 2014-10-20 21:12:33 +02:00
Florian Schmaus dfc4173e5b Fix initialization order issue with DEBUG_ENABLED
If a user enabled Smack debug via the property 'smack.debugEnabled', a
ConnectionConfiguration could be created where debuggerEnabled is
'false', because Smack is not yet initialized.

Also make sure that if the property is not set, it won't overwrite
DEBUG_ENABLED = true.

Thanks to William Murphy for providing a detailed issue description and
supposing a fix.
2014-10-19 21:48:17 +02:00
Florian Schmaus 3733a6aaa5 Cache the parser availability of the roundtrip feature
As otherwise there would be multiple log statements (which are of level
fine but nevertheless).

PacketParserUtils: XmlPullParser does not support XML_ROUNDTRIP org.xmlpull.v1.XmlPullParserException: unsupported feature: http://xmlpull.org/v1/doc/features.html#xml-roundtrip (position:START_DOCUMENT null@1:1)
PacketParserUtils: 	at org.kxml2.io.KXmlParser.setFeature(KXmlParser.java:2091)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:150)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:172)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection.openStream(XMPPTCPConnection.java:963)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketWriter.access$2600(XMPPTCPConnection.java:1224)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketWriter$1.run(XMPPTCPConnection.java:1263)
PacketParserUtils: XmlPullParser does not support XML_ROUNDTRIP org.xmlpull.v1.XmlPullParserException: unsupported feature: http://xmlpull.org/v1/doc/features.html#xml-roundtrip (position:START_DOCUMENT null@1:1)
PacketParserUtils: 	at org.kxml2.io.KXmlParser.setFeature(KXmlParser.java:2091)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:150)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:172)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection.openStream(XMPPTCPConnection.java:963)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:970)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:989)
PacketParserUtils: XmlPullParser does not support XML_ROUNDTRIP org.xmlpull.v1.XmlPullParserException: unsupported feature: http://xmlpull.org/v1/doc/features.html#xml-roundtrip (position:START_DOCUMENT null@1:1)
PacketParserUtils: 	at org.kxml2.io.KXmlParser.setFeature(KXmlParser.java:2091)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:150)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:172)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection.openStream(XMPPTCPConnection.java:963)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:970)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:989)
PacketParserUtils: XmlPullParser does not support XML_ROUNDTRIP org.xmlpull.v1.XmlPullParserException: unsupported feature: http://xmlpull.org/v1/doc/features.html#xml-roundtrip (position:START_DOCUMENT null@1:1)
PacketParserUtils: 	at org.kxml2.io.KXmlParser.setFeature(KXmlParser.java:2091)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:150)
PacketParserUtils: 	at org.jivesoftware.smack.util.PacketParserUtils.newXmppParser(PacketParserUtils.java:172)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection.openStream(XMPPTCPConnection.java:963)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:970)
PacketParserUtils: 	at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:989)
2014-10-19 20:58:42 +02:00
Florian Schmaus ee67bb8aa5 Fix typos in README.md 2014-10-19 11:51:53 +02:00
Florian Schmaus 79380e189e Fix MiniDnsResolver NPE when query returns 'null' 2014-10-19 11:50:09 +02:00
Florian Schmaus a90c1ac845 Remove 'throws Exception' from DNSUtil.resolve…(String) 2014-10-19 11:49:45 +02:00
Florian Schmaus 994e45acae Smack 4.1.0-alpha5-SNAPSHOT 2014-10-18 01:47:54 +02:00
Florian Schmaus 2172fb7126 Smack 4.1.0-alpha4 2014-10-18 01:42:06 +02:00
Florian Schmaus 17bb738e9e Make PubSubManager.getNode(String) more robust
I've got reports from users that in some cases there can be multiple
identities. Not just one, and in this case, the node type may not be the
first identity. We now iterate over all identities until we either found
one of type "leaf" or "collection".

For example one user reports an ejabberd with PEP case, where the first
identity is of type "pep", the second of type "leaf" and a third one
with category "account" and type "registered".

Also extend DiscoverInfo API with hasIdentity(String, String) and
getIdentities(String, String).
2014-10-17 14:26:06 +02:00
Florian Schmaus 8d7b329432 Update debugging.md
The lite debugger is also only found in smack-debug. Only the console
debugger is shipped with smack-core.
2014-10-16 16:50:52 +02:00
Florian Schmaus 888de7e1c1 Remove nullOrEmpty check for setSessionID()
in AdHocCommandData.

This check was added in 3a37b71e19, but a
session ID can be null, if it's the first invocation. This prevented
RemoteCommand.execute() from executing, since RemoteCommand's sessionID
member will be null at the first invocation.
2014-10-16 13:02:06 +02:00
Florian Schmaus 9edf06e1bb Fix typos and closing javadoc tag in RemoteCommand 2014-10-16 12:55:17 +02:00
Florian Schmaus ed58abbee7 Support XML_ROUNDTRIP where possible
The approach to avoid XmlPullParser's XML_ROUNDTRIP feature prevents
Smack from handling XML namespaces on e.g. PubSub payloads on platforms
where support for XML_ROUNDTRIP would be available.

We now check for this XmlPullParser feature and use it if it's
available.
2014-10-15 22:50:48 +02:00
Florian Schmaus 9a6d042652 Rework and redesign ReconnectionManager
Move reconnection manager setting from ConnectionConfiguration into
ReconnectionManager.

Apply Manager pattern to ReconnectionManager.
2014-10-15 00:34:55 +02:00
Florian Schmaus b5328d38fa MUC: Establish callbacks before sending the presence 2014-10-14 09:41:48 +02:00
Florian Schmaus ce203e76b5 Use AbstractNodeInformationProvider where possible 2014-10-13 22:35:45 +02:00
Florian Schmaus b54d133b36 Add MultiUserChatManager
apply the Manager pattern to 'muc'. This prevents the user creating
multiple MultiUserChat instances for the same MUC.

Move the static method from MultiUserChat to MultiUserChatManager.

Also add AbstractNodeInformationProvider.
2014-10-13 22:32:34 +02:00
Florian Schmaus 0ef50bfd1e Add javadoc for XMPPConnection.send(PlainStreamElement) 2014-10-13 19:52:09 +02:00
Florian Schmaus c674808a4a Improve MultiUserChat
Use CopyOnWriteArraySet for listeners, remove the old reflection based
listener invocation approach.

Remove unnecessary casts.

Return List instead of Collection where possible.

sendMessage(Message) now set's the MUC as 'to' and the message type to
groupchat.
2014-10-13 16:39:17 +02:00
Florian Schmaus 365c71db79 Rework MultiUserChat
remove PacketMultiplexListener, RoomListenerMultiplexor and
ConnectionDetachedPacketCollector(Test), which was a bunch of
(in same cases redundant) code that formed a complex construct that
presumably tried to make MultiUserChat instances easily garbage
collect-able.

Now, MultiUserChat should be eligible for gc if the userHashLeft() is
invoked before the reference to the instance is dropped, which should be
the case in the most scenarios. Otherwise the connection may references
the MultiUserChat instance over Packet(Listener|Interceptor)s preventing
the gc.
2014-10-13 11:10:30 +02:00
Florian Schmaus 98a3c46e9a Add XMPPConnection.createPacketcollectorAndSend(PacketFilter, Packet)
Using

createPacketCollector(filter);
sendPacket(packet);

was error prone, i.e. the PacketCollector could leak if sendPacket()
would throw an exception and the user forgot to call
PacketCollector.cancel(). For cases where
createPacketCollectorAndSend(IQ) is not sufficient (because we don't
send IQs), createPacketCollectorAndSend(PacketFilter, Packet) is now
used, which does take care that the PacketCollector does not leak if
sendPacket() throws an Exception.
2014-10-13 10:45:00 +02:00
Florian Schmaus 8ce474b0df Improve MUC Presence interceptors
Use PresenceListener as intercepting callback interface.

Remove the for-each loops in MultiUserChat by using the interception
facilities of the XMPPConnection.

Add ToFilter.
2014-10-12 19:34:14 +02:00
Florian Schmaus 55d7c57a4f Use PacketTypeFilter.PRESENCE in EntityCapsManager 2014-10-12 19:21:49 +02:00
Florian Schmaus 63d52f6eaa Replace PacketInterceptor with PacketListener
both serve the same purpose: As callback for Packets. There is no need
to have both, so remace PacketInterceptor and let PacketListener take
its place. Some classes like ChatStateManager can now use
MessageListener as interceptor callback, which is more convenient.
2014-10-12 19:19:44 +02:00
Florian Schmaus fd7b747987 Remove init() in MultiUserChat
and mark more members 'final'

Also use CopyOnWriteArraySet for presenceInterceptors.
2014-10-12 18:53:19 +02:00
Florian Schmaus e835df5641 Improve MUC message and presence listeners
instead of using a PacketListener, which means that the user has to
downcast the Packet to Message, we now use a Listener which callback
parameter is already Message/Presence.

It is necessary to introduce MessageListener and PresenceListener, which
are interfaces that have a callback for Message/Presence instead of
Packet. The 'old' MessageListener is renamed to ChatMessageListener.

Use Generics in ConnectionDetachedPacketCollector.
2014-10-12 18:11:02 +02:00
Florian Schmaus 38582eed84 Make getServiceNames() return List
instead of Collection. Return types should always be as specific as
possible. Because e.g. Collection does not allow 'get(0)', but List
does.
2014-10-12 16:54:21 +02:00
Florian Schmaus fe74fc23dc Rework smackx.address (XEP-0033: Extended Stanza Addressing)
- Make MultipleAddress.Type a enum
- Change the signature of the methods to use Collection instead of List
- Use for-each loops instead of iterators
- Switch Provider to new provider pattern (using switch-case)
- Use XmlStringBuilder (extend the API by two new methods)
2014-10-11 17:11:38 +02:00
Florian Schmaus 36da216b4a Reworked Interceptor and InterceptorWrapper
Allows interceptor to remove themselves in the interceptPacket() method.

Same change for Interceptors as was done in
15d59299a2 for (send|recv)Listeners.
2014-10-10 12:22:23 +02:00
Florian Schmaus c3528d082e Add invokePacketCollectors, remove duplicate code
Add javadoc about why we use CocurrentLinkedQueue for collectors.
2014-10-10 02:41:37 +02:00
Florian Schmaus 15d59299a2 Reworked (send|recv)Listeners, ListenerWrapper
instead of rely on ListenerWrapper checking the PacketFilter *and*
invoking the PacketListener we now use two for-each loops, where the
first filters the PacketListeners that should get invoked and use the
second for-each loop to actually invoke the PacketListener.

Before, the code was not thread safe if a PacketListener would remove
itself from the (send|recv)Listeners.

Also make packet(Listener|Filter) in ListenerWrapper final.
2014-10-10 00:44:51 +02:00
Florian Schmaus 03686fbaaf Use CopyOnWriteArraySet for connectionListener 2014-10-09 23:55:02 +02:00
Florian Schmaus 6dcba44557 Make PacketCollector fields final where possible 2014-10-09 23:51:33 +02:00
Florian Schmaus 36744ea0d1 Remove MUC DeafOccupantIntercepter
as it's a old (likely unused) Jive (Wildfire) proprietary extension.
2014-10-09 23:12:22 +02:00
Florian Schmaus 328b733f7e Don't use gradle 'configurations' in smack-core
Fixes SMACK-587
2014-10-09 19:53:53 +02:00
Florian Schmaus ade6d528e8 Eclipse formatter: Set line length to 120
Also add new settings for Java8 features (currently not used in Smack,
as it is Java7 or higher).
2014-10-08 16:01:19 +02:00
Gilles Cornu bd06e07065 Travis CI: Use Android builder 2014-10-08 16:01:19 +02:00
Florian Schmaus 452b2aca0f Add 'PacketParserUtils.addPacketextension()' 2014-10-08 16:01:19 +02:00
Florian Schmaus 6980c8e63d Rework Smack Provider design
this is the first stop towards fixing "SMACK-65: parsing should look for
depth", by providing the initial parsing depth to the provider. Some
methods (.e.g parseMessage) now use the depth as abort condition,
instead of a unclean String equals check.

parseIQ() and parseExtension() where both renamed to parse.

This also restricts the Exceptions thrown by the parse method, to just
XmlPullParserException, IOException and SmackException (not really a big
victory, but nevertheless a slight improvement).

StreamFeatureProvider is now gone, we simply use PacketExtensionProvider
for stream features.
2014-10-08 16:01:14 +02:00
Florian Schmaus d04517cd08 Add message String to all SmackExceptions
SMACK-599
2014-10-07 21:50:39 +02:00
Florian Schmaus 387be5bded Add DeliveryReceiptRequest.addTo(Message) 2014-10-07 21:50:32 +02:00
Florian Schmaus 19ee9f016b Use CopyOnWriteArraySet in DeliveryReceiptManager 2014-10-05 16:27:52 +02:00
Florian Schmaus 8bf74c6e92 Add Packet to onReceiptReceived parameters
in ReceiptReceivedListener. SMACK-582
2014-10-05 12:56:32 +02:00
Florian Schmaus 1e803ab29d Use from(Packet) instead of getFrom(Packet) in DeliveryReceiptManager 2014-10-05 12:52:19 +02:00
Florian Schmaus 5f06234149 Use CopyOnWriteArraySet in InvitationsMonitor 2014-10-05 12:46:51 +02:00