You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by be...@apache.org on 2008/05/18 19:54:43 UTC
svn commit: r657604 - in /labs/vysper/src:
main/java/org/apache/vysper/xmpp/addressing/
main/java/org/apache/vysper/xmpp/modules/core/base/handler/
main/java/org/apache/vysper/xmpp/protocol/
main/java/org/apache/vysper/xmpp/server/response/ main/java/o...
Author: berndf
Date: Sun May 18 10:54:43 2008
New Revision: 657604
URL: http://svn.apache.org/viewvc?rev=657604&view=rev
Log:
[vysper] track proper 'from' addresses in ProtocolWorker, else return stanza error
cover new stanza errors from RFC3920bis
Modified:
labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/Entity.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerErrorResponses.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/StanzaErrorCondition.java
labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/Entity.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/Entity.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/Entity.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/Entity.java Sun May 18 10:54:43 2008
@@ -52,7 +52,7 @@
/**
* @return string like "node@domain"
*/
- String getBareJID();
+ Entity getBareJID();
String getCanonicalizedName();
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java Sun May 18 10:54:43 2008
@@ -93,8 +93,8 @@
return buffer.toString();
}
- public String getBareJID() {
- return buildEntityString(node, domain, null);
+ public Entity getBareJID() {
+ return new EntityImpl(node, domain, null);
}
public String getCanonicalizedName() {
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java Sun May 18 10:54:43 2008
@@ -223,8 +223,7 @@
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
// TODO: determine the right subscription: 'none' or 'to'
- Stanza push = buildRosterPushStanza(userResource
- .getFullQualifiedName(),
+ Stanza push = buildRosterPushStanza(userResource,
sessionContext.nextSequenceValue(), contact.getBareJID(),
"???");
@@ -244,8 +243,7 @@
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
// TODO: determine the correct subscription state: 'none' or 'from'
- Stanza push = buildRosterPushStanza(userResource
- .getFullQualifiedName(),
+ Stanza push = buildRosterPushStanza(userResource,
sessionContext.nextSequenceValue(), contact.getBareJID(),
"???");
relayStanza(userResource, push, sessionContext);
@@ -266,8 +264,7 @@
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
// TODO: determine the correct subscription state
- Stanza push = buildRosterPushStanza(userResource
- .getFullQualifiedName(),
+ Stanza push = buildRosterPushStanza(userResource,
sessionContext.nextSequenceValue(), contact.getBareJID(),
"???");
relayStanza(userResource, push, sessionContext);
@@ -287,8 +284,7 @@
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
// TODO: determine the right subscription: 'to' or 'none'
- Stanza push = buildRosterPushStanza(userResource
- .getFullQualifiedName(),
+ Stanza push = buildRosterPushStanza(userResource,
sessionContext.nextSequenceValue(), contact.getBareJID(),
"???");
@@ -309,8 +305,7 @@
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
- Stanza push = buildRosterPushStanza(userResource
- .getFullQualifiedName(),
+ Stanza push = buildRosterPushStanza(userResource,
sessionContext.nextSequenceValue(), contact.getBareJID(),
"from");
@@ -322,8 +317,7 @@
resources = registry.getAvailableResources(user);
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
- Stanza presence = buildPresenceStanza(userResource
- .getFullQualifiedName(), contact.getBareJID(), null);
+ Stanza presence = buildPresenceStanza(userResource, contact.getBareJID(), null);
relayStanza(contact, presence, sessionContext);
}
@@ -342,8 +336,8 @@
List<String> resources = registry.getInterestedResources(user);
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
- Stanza push = buildRosterPushStanza(userResource.getFullQualifiedName(), sessionContext
- .nextSequenceValue(), contact.getBareJID(), "to");
+ Stanza push = buildRosterPushStanza(userResource, sessionContext.nextSequenceValue(),
+ contact.getBareJID(), "to");
relayStanza(userResource, push, sessionContext);
}
} else {
@@ -414,8 +408,7 @@
List<String> resources = registry.getInterestedResources(user);
for (String resource : resources) {
Entity userResource = new EntityImpl(user, resource);
- Stanza push = buildRosterPushStanza(userResource
- .getFullQualifiedName(),
+ Stanza push = buildRosterPushStanza(userResource,
sessionContext.nextSequenceValue(), contact.getBareJID(),
"none");
try {
@@ -444,7 +437,7 @@
List<Entity> contacts1 = new ArrayList<Entity>();
List<Entity> contacts = contacts1;
for (Entity contact : contacts) {
- Stanza probeStanza = buildPresenceStanza(user.getFullQualifiedName(), contact.getBareJID(), null);
+ Stanza probeStanza = buildPresenceStanza(user, contact, null);
relayStanza(contact, probeStanza, sessionContext);
}
@@ -455,7 +448,7 @@
// above
contacts = new ArrayList<Entity>();
for (Entity contact : contacts) {
- Stanza presenceStanza = buildPresenceStanza(user.getFullQualifiedName(), contact.getBareJID(), null);
+ Stanza presenceStanza = buildPresenceStanza(user, contact, null);
relayStanza(contact, presenceStanza, sessionContext);
}
@@ -464,8 +457,7 @@
List<String> resources = registry.getAvailableResources(user);
for (String resource : resources) {
Entity otherResource = new EntityImpl(user, resource);
- Stanza presenceStanza = buildPresenceStanza(user.getFullQualifiedName(),
- otherResource.getFullQualifiedName(), null);
+ Stanza presenceStanza = buildPresenceStanza(user, otherResource, null);
relayStanza(otherResource, presenceStanza, sessionContext);
}
@@ -483,26 +475,26 @@
}
}
- private PresenceStanza buildPresenceStanza(String from, String to,
+ private PresenceStanza buildPresenceStanza(Entity from, Entity to,
String type) {
StanzaBuilder builder = new StanzaBuilder("presence");
- builder.addAttribute("from", from);
- builder.addAttribute("to", to);
+ builder.addAttribute("from", from.getFullQualifiedName());
+ builder.addAttribute("to", to.getFullQualifiedName());
if (type != null) {
builder.addAttribute("type", type);
}
return (PresenceStanza) XMPPCoreStanza.getWrapper(builder.getFinalStanza());
}
- private Stanza buildRosterPushStanza(String to, String id,
- String bareJidOfRosterItem, String subscription, String ask) {
+ private Stanza buildRosterPushStanza(Entity to, String id,
+ Entity bareJidOfRosterItem, String subscription, String ask) {
StanzaBuilder builder = new StanzaBuilder("iq");
- builder.addAttribute("to", to);
+ builder.addAttribute("to", to.getFullQualifiedName());
builder.addAttribute("type", "set");
builder.addAttribute("id", id);
builder.startInnerElement("query", NamespaceURIs.JABBER_IQ_ROSTER);
builder.startInnerElement("item");
- builder.addAttribute("jid", bareJidOfRosterItem);
+ builder.addAttribute("jid", bareJidOfRosterItem.getBareJID().getFullQualifiedName());
builder.addAttribute("subscription", subscription);
if (ask != null) {
builder.addAttribute("ask", ask);
@@ -513,8 +505,8 @@
return builder.getFinalStanza();
}
- private Stanza buildRosterPushStanza(String to, String id,
- String bareJidOfRosterItem, String subscription) {
+ private Stanza buildRosterPushStanza(Entity to, String id,
+ Entity bareJidOfRosterItem, String subscription) {
return buildRosterPushStanza(to, id, bareJidOfRosterItem, subscription,
null);
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Sun May 18 10:54:43 2008
@@ -31,6 +31,7 @@
import org.apache.vysper.xmpp.server.SessionState;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
+import org.apache.vysper.xmpp.addressing.Entity;
import java.util.HashMap;
import java.util.Map;
@@ -112,6 +113,22 @@
responseWriter.handleNotAuthorized(sessionContext, stanza);
return;
}
+ }
+
+ // make sure that 'from' (if present) matches the bare authorized entity
+ // else repond with a stanza error 'unknown-sender'
+ // see rfc3920_draft-saintandre-rfc3920bis-04.txt 8.5.4
+ if (sessionContext.getInitiatingEntity() != null) {
+ XMPPCoreStanza coreStanza = XMPPCoreStanza.getWrapper(stanza);
+ if (coreStanza != null && coreStanza.getFrom() != null) {
+ Entity from = coreStanza.getFrom().getBareJID();
+ Entity initiatingEntity = sessionContext.getInitiatingEntity();
+ if (!initiatingEntity.equals(from)) {
+ responseWriter.handleWrongFromJID(sessionContext, coreStanza);
+ return;
+ }
+ }
+
}
stateAwareProtocolWorker.processStanza(sessionContext, sessionStateHolder,
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java Sun May 18 10:54:43 2008
@@ -22,6 +22,9 @@
import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
import org.apache.vysper.xmpp.server.response.ServerResponses;
import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
+import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
import org.apache.vysper.xmpp.parser.ParsingException;
import org.apache.vysper.xmpp.parser.ParsingErrorCondition;
@@ -89,6 +92,15 @@
writeErrorAndClose(sessionContext, errorStanza);
}
+ public void handleWrongFromJID(SessionContext sessionContext, XMPPCoreStanza receivedStanza) {
+ Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
+ receivedStanza,
+ StanzaErrorType.MODIFY,
+ "from attribute does not match authorized entity",
+ null, null);
+ writeResponse(sessionContext, errorStanza);
+ }
+
public void handleParsingException(SessionContext sessionContext, ParsingException e) {
//TODO write the __right__ error response, not bad-format default only
if (e.getErrorCondition() != ParsingErrorCondition.BAD_FORMAT) throw new RuntimeException("cannot handle this error condition yet");
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerErrorResponses.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerErrorResponses.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerErrorResponses.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerErrorResponses.java Sun May 18 10:54:43 2008
@@ -82,7 +82,7 @@
/**
* TODO move to a more general error handling
* @param errorCondition - corresponds to one of the defined stanza error conditions
- * @param stanza
+ * @param stanza - the stanza to which the error stanza is the answer
* @param type
* @param errorText - is optional together with errorLang, both together might be NULL
* @param errorLang - must be present, if errorText is not NULL
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/StanzaErrorCondition.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/StanzaErrorCondition.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/StanzaErrorCondition.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/StanzaErrorCondition.java Sun May 18 10:54:43 2008
@@ -36,6 +36,7 @@
NOT_ACCEPTABLE ("not-acceptable"),
NOT_ALLOWED ("not-allowed"),
NOT_AUTHORIZED ("not-authorized"),
+ NOT_MODIFIED ("not-modified"),
PAYMENT_REQUIRED ("payment-required"),
RECIPIENT_UNAVAILABLE ("recipient-unavailable"),
REDIRECT ("redirect"),
@@ -46,7 +47,8 @@
SERVICE_UNAVAILABLE ("service-unavailable"),
SUBSCRIPTION_REQUIRED ("subscription-required"),
UNDEFINED_CONDITION ("undefined-condition"),
- UNEXPECTED_REQUEST ("unexpected-request");
+ UNEXPECTED_REQUEST ("unexpected-request"),
+ UNKNOWN_SENDER ("unknown-sender");
private final String value;
Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java?rev=657604&r1=657603&r2=657604&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java Sun May 18 10:54:43 2008
@@ -22,10 +22,14 @@
import org.apache.vysper.xmpp.server.TestSessionContext;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
import junit.framework.TestCase;
@@ -148,4 +152,37 @@
assertTrue("closed", sessionContext.isClosed());
}
+ public void testTrackProperFromAddress() throws XMLSemanticError {
+
+ Entity server = sessionContext.getServerRuntimeContext().getServerEnitity();
+ sessionContext.setSessionState(SessionState.AUTHENTICATED);
+ sessionContext.setInitiatingEntity(new EntityImpl("mark", server.getDomain(), null));
+
+ CallTestStanzaHandler stanzaHandler = new CallTestStanzaHandler("ProtocolWorkerProcessTestCase");
+ namespaceHandlerDictionary.register(stanzaHandler);
+
+ StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(IQStanzaType.GET, "test");
+ stanzaBuilder.addAttribute("from", new EntityImpl("ernest", server.getDomain(), null).getFullQualifiedName());
+ stanzaBuilder.startInnerElement("query").addNamespaceAttribute("jabber:iq:roster").endInnerElement();
+
+ protocolWorker.processStanza(sessionContext, stanzaBuilder.getFinalStanza(), sessionStateHolder);
+
+ try {
+ stanzaHandler.assertHandlerCalled();
+ fail("handler called");
+ } catch (Exception e) {
+ // not called, OK
+ }
+ Stanza recordedResponse = sessionContext.getRecordedResponse();
+ XMLElementVerifier verifier = recordedResponse.getVerifier();
+ assertEquals("iq stanza error", "iq", recordedResponse.getName());
+ IQStanza iqStanza = (IQStanza) XMPPCoreStanza.getWrapper(recordedResponse);
+ assertEquals("error", iqStanza.getType());
+ assertTrue("error embedded", verifier.subElementPresent("error"));
+ XMLElement errorInner = recordedResponse.getSingleInnerElementsNamed("error");
+ assertEquals("modify", errorInner.getAttribute("type").getValue());
+ XMLElementVerifier errorVerifier = errorInner.getVerifier();
+ errorVerifier.subElementPresent("unknown-sender");
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org