You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2015/04/10 15:51:48 UTC

[1/6] wicket git commit: License header added to the filter collections

Repository: wicket
Updated Branches:
  refs/heads/master 2f3b35770 -> 4f7c7b351


License header added to the filter collections

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/d611c226
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d611c226
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d611c226

Branch: refs/heads/master
Commit: d611c2263a05f1d54f6f690430b6e394c2d007b5
Parents: 5311b16
Author: admin <ge...@mail.rakuten.com>
Authored: Wed Apr 8 00:00:19 2015 +0900
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Apr 10 16:51:07 2015 +0300

----------------------------------------------------------------------
 .../wicket/protocol/ws/api/FilterCollection.java    | 16 ++++++++++++++++
 .../ws/api/WebSocketConnectionFilterCollection.java | 16 ++++++++++++++++
 2 files changed, 32 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/d611c226/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
index 2bbde0e..8b08d89 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
@@ -1,3 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
 
 import java.io.Serializable;

http://git-wip-us.apache.org/repos/asf/wicket/blob/d611c226/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
index 66622b1..63a9bc6 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
@@ -1,3 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
 
 import javax.servlet.http.HttpServletRequest;


[2/6] wicket git commit: Cross-Site WebSocket Hijacking protection added. WebsocketSettings extended with allowedDomains. Hijacking protection flag added to websocket settings. WebSocketBehavior and WebSocketResource got new methods called onAbort(). New

Posted by mg...@apache.org.
Cross-Site WebSocket Hijacking protection added. WebsocketSettings
extended with allowedDomains. Hijacking protection flag added to
websocket settings. WebSocketBehavior and WebSocketResource got new
methods called onAbort(). New broadcast message type: AbortedMessage
introduced. New payload type: WebSocketAbortedPayload introduced.
AbstractWebSocketProcessor closes connection when protection check
fails. WebSocketTesterProcessorTest fixed and cleaned up

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/5c5c3640
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/5c5c3640
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/5c5c3640

Branch: refs/heads/master
Commit: 5c5c36406a60c96dea9e9c7cf41e46f3733ba257
Parents: 2f3b357
Author: admin <ge...@mail.rakuten.com>
Authored: Fri Mar 20 17:18:56 2015 +0900
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Apr 10 16:51:07 2015 +0300

----------------------------------------------------------------------
 .../wicket/protocol/ws/WebSocketSettings.java   |  64 +++++++++
 .../ws/api/AbstractWebSocketProcessor.java      |  60 ++++++--
 .../ws/api/ConnectionRejectedException.java     |  21 +++
 .../ws/api/IWebSocketConnectionFilter.java      |  38 +++++
 .../protocol/ws/api/WebSocketBehavior.java      |  17 +++
 .../ws/api/WebSocketConnectionOriginFilter.java |  64 +++++++++
 .../protocol/ws/api/WebSocketResource.java      |  18 +++
 .../ws/api/event/WebSocketAbortedPayload.java   |  42 ++++++
 .../protocol/ws/api/message/AbortedMessage.java |  56 ++++++++
 .../ws/util/tester/TestWebSocketProcessor.java  |  14 ++
 .../ws/util/tester/TestWebSocketResource.java   |   8 ++
 .../tester/WebSocketTesterProcessorTest.java    | 144 +++++++++++++++++++
 12 files changed, 531 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
index 3b2d5c9a..92a4a5c 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.protocol.ws;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.Callable;
 
 import org.apache.wicket.Application;
@@ -87,6 +90,16 @@ public class WebSocketSettings
 	private IWebSocketConnectionRegistry connectionRegistry = new SimpleWebSocketConnectionRegistry();
 
 	/**
+	 * The whitelist of allowed domains where the client can connect to the application from
+	 */
+    private final List<String> allowedDomains = new ArrayList<String>();
+
+    /**
+     * Flag which indicates whether connection filtering should be active or not
+     */
+    private boolean protectionNeeded = false;
+
+	/**
 	 * Set the executor for processing websocket push messages broadcasted to all sessions.
 	 * Default executor does all the processing in the caller thread. Using a proper thread pool is adviced
 	 * for applications that send push events from ajax calls to avoid page level deadlocks.
@@ -155,6 +168,57 @@ public class WebSocketSettings
 		return sendPayloadExecutor;
 	}
 
+    /**
+     * Flag that controls whether hijacking protection should be turned on or not
+     *
+     * @param protectionNeeded
+     *            True if protection needed
+     */
+    public void setHijackingProtectionEnabled(boolean protectionNeeded) {
+        this.protectionNeeded = protectionNeeded;
+    }
+
+    /**
+     * Flag that shows whether hijacking protection is turned on or not
+     *
+     * @param protectionNeeded
+     *            True if protection turned on
+     */
+    public boolean isHijackingProtectionEnabled() {
+        return this.protectionNeeded;
+    }
+
+    /**
+     * The list of whitelisted domains which are allowed to initiate a websocket connection. This
+     * list will be eventually used by the
+     * {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter} to abort potentially
+     * unsafe connections. Example domain names might be:
+     *
+     * <pre>
+     *      http://www.example.com
+     *      http://ww2.example.com
+     * </pre>
+     *
+     * @param domains
+     *            The collection of domains
+     */
+    public void setAllowedDomains(Collection<String> domains) {
+        this.allowedDomains.addAll(domains);
+    }
+
+    /**
+     * The list of whitelisted domains which are allowed to initiate a websocket connection. This
+     * list will be eventually used by the
+     * {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter} to abort potentially
+     * unsafe connections
+     *
+     * @param domains
+     *            The collection of domains if or an empty list when no domains were added
+     */
+    public List<String> getAllowedDomains() {
+        return this.allowedDomains;
+    }
+
 	/**
 	 * A factory method for the {@link org.apache.wicket.request.http.WebResponse}
 	 * that should be used to write the response back to the client/browser

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index 8ae53c9..1dac814 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -29,12 +29,14 @@ import org.apache.wicket.page.IPageManager;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.WicketFilter;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.protocol.ws.api.event.WebSocketAbortedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
 import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -76,6 +78,20 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 	 */
 	static final int NO_PAGE_ID = -1;
 
+    /**
+     * 1008 indicates that an endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code
+     * that can be returned when there is no other more suitable status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the
+     * policy.
+     * <p>
+     * See <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1">RFC 6455, Section 7.4.1 Defined Status Codes</a>.
+     */
+    static final int POLICY_VIOLATION = 1008;
+
+    /**
+     * Explanatory text for the client to explain why the connection is getting aborted
+     */
+    static final String ORIGIN_MISMATCH = "Origin mismatch";
+
 	private final WebRequest webRequest;
 	private final int pageId;
 	private final String resourceName;
@@ -84,6 +100,8 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 	private final String sessionId;
 	private final WebSocketSettings webSocketSettings;
 	private final IWebSocketConnectionRegistry connectionRegistry;
+    private final IWebSocketConnectionFilter connectionFilter;
+    private final HttpServletRequest servletRequest;
 
 	/**
 	 * Constructor.
@@ -117,13 +135,17 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 		this.baseUrl = Url.parse(baseUrl);
 
 		WicketFilter wicketFilter = application.getWicketFilter();
-		this.webRequest = new WebSocketRequest(new ServletRequestCopy(request), wicketFilter.getFilterPath());
+		this.servletRequest = new ServletRequestCopy(request);
+
+		this.webRequest = new WebSocketRequest(servletRequest, wicketFilter.getFilterPath());
 
 		this.application = Args.notNull(application, "application");
 
 		this.webSocketSettings = WebSocketSettings.Holder.get(application);
 
 		this.connectionRegistry = webSocketSettings.getConnectionRegistry();
+
+        this.connectionFilter = new WebSocketConnectionOriginFilter(webSocketSettings);
 	}
 
 	@Override
@@ -139,20 +161,25 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 		broadcastMessage(binaryMessage);
 	}
 
-	/**
-	 * A helper that registers the opened connection in the application-level
-	 * registry.
-	 *
-	 * @param connection
-	 *      the web socket connection to use to communicate with the client
-	 * @see #onOpen(Object)
-	 */
-	protected final void onConnect(final IWebSocketConnection connection)
-	{
-		IKey key = getRegistryKey();
-		connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
-		broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
-	}
+    /**
+     * A helper that registers the opened connection in the application-level registry.
+     *
+     * @param connection
+     *            the web socket connection to use to communicate with the client
+     * @see #onOpen(Object)
+     */
+    protected final void onConnect(final IWebSocketConnection connection) {
+        IKey key = getRegistryKey();
+        try {
+            connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
+            connectionFilter.doFilter(servletRequest);
+            broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
+        } catch (ConnectionRejectedException e) {
+            broadcastMessage(new AbortedMessage(getApplication(), getSessionId(), key));
+            connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
+            connection.close(POLICY_VIOLATION, ORIGIN_MISMATCH);
+        }
+    }
 
 	@Override
 	public void onClose(int closeCode, String message)
@@ -316,6 +343,9 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 		{
 			payload = new WebSocketClosedPayload((ClosedMessage) message, handler);
 		}
+		else if (message instanceof AbortedMessage) {
+			payload = new WebSocketAbortedPayload((AbortedMessage) message, handler);
+		}
 		else if (message instanceof IWebSocketPushMessage)
 		{
 			payload = new WebSocketPushPayload((IWebSocketPushMessage) message, handler);

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
new file mode 100644
index 0000000..15af612
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
+
+public class ConnectionRejectedException extends RuntimeException {
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
new file mode 100644
index 0000000..a43c7c1
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Common interface for rejecting connections which are not meeting some of the security concerns.
+ * One example might be when the connection 'Origin' header does not match the origin of the
+ * application host
+ *
+ * @author Gergely Nagy
+ *
+ */
+public interface IWebSocketConnectionFilter {
+
+    /**
+     * Method for rejecting connections based on the current request
+     *
+     * @param servletRequest
+     *            The servlet request holding the request headers
+     */
+    public void doFilter(HttpServletRequest servletRequest);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
index 2f8c67c..803246d 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
@@ -18,12 +18,14 @@ package org.apache.wicket.protocol.ws.api;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.event.IEvent;
+import org.apache.wicket.protocol.ws.api.event.WebSocketAbortedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
 import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -77,6 +79,12 @@ public abstract class WebSocketBehavior extends BaseWebSocketBehavior
 				ClosedMessage message = closedPayload.getMessage();
 				onClose(message);
 			}
+            else if (wsPayload instanceof WebSocketAbortedPayload)
+            {
+                WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) wsPayload;
+                AbortedMessage message = abortedPayload.getMessage();
+                onAbort(message);
+            }
 			else if (wsPayload instanceof WebSocketPushPayload)
 			{
 				WebSocketPushPayload pushPayload = (WebSocketPushPayload) wsPayload;
@@ -121,6 +129,15 @@ public abstract class WebSocketBehavior extends BaseWebSocketBehavior
 	{
 	}
 
+    /**
+     * A callback method called when the server has aborted the connection
+     *
+     * @param message
+     *          the aborted message with the info about the server
+     */
+    protected void onAbort(AbortedMessage message) {
+    }
+
 	/**
 	 * A callback method called when there is a text message sent by the client
 	 *

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
new file mode 100644
index 0000000..655ed30
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.wicket.protocol.ws.WebSocketSettings;
+
+public class WebSocketConnectionOriginFilter implements IWebSocketConnectionFilter {
+
+    private final WebSocketSettings webSocketSettings;
+
+    public WebSocketConnectionOriginFilter(WebSocketSettings webSocketSettings) {
+        this.webSocketSettings = webSocketSettings;
+    }
+
+    @Override
+    public void doFilter(HttpServletRequest servletRequest) {
+        if (webSocketSettings.isHijackingProtectionEnabled()) {
+            String oUrl = getOriginUrl(servletRequest);
+            if (invalid(oUrl))
+                throw new ConnectionRejectedException();
+        }
+    }
+
+    private boolean invalid(String oUrl) {
+        if (originMismatch(oUrl))
+            return true;
+        if (oUrl == null || "".equals(oUrl))
+            return true;
+        return false;
+    }
+
+    private boolean originMismatch(String oUrl) {
+        List<String> allowedDomains = webSocketSettings.getAllowedDomains();
+        return !allowedDomains.contains(oUrl);
+    }
+
+    private String getOriginUrl(HttpServletRequest servletRequest) {
+        ArrayList<String> origins = Collections.list(servletRequest.getHeaders("Origin"));
+        if (origins.size() != 1)
+            return null;
+        return origins.get(0);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
index 1db09f9..95aed1d 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
@@ -16,12 +16,14 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
+import org.apache.wicket.protocol.ws.api.event.WebSocketAbortedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketBinaryPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketClosedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketConnectedPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.event.WebSocketTextPayload;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
 import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -62,6 +64,12 @@ public abstract class WebSocketResource implements IResource
 			ClosedMessage message = connectedPayload.getMessage();
 			onClose(message);
 		}
+        else if (payload instanceof WebSocketAbortedPayload)
+        {
+            WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) payload;
+            AbortedMessage message = abortedPayload.getMessage();
+            onAbort(message);
+        }
 		else if (payload instanceof WebSocketPushPayload)
 		{
 			WebSocketPushPayload pushPayload = (WebSocketPushPayload) payload;
@@ -94,6 +102,16 @@ public abstract class WebSocketResource implements IResource
 	{
 	}
 
+    /**
+     * A callback method called when the server has aborted the connection
+     *
+     * @param message
+     *          the aborted message with the info about the server
+     */
+    protected void onAbort(AbortedMessage message)
+    {
+    }
+
 	/**
 	 * A callback method called when a WebSocket client has closed the connection
 	 * to the endpoint handled by this WebSocketBehavior

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
new file mode 100644
index 0000000..5a19ad4
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api.event;
+
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
+
+/**
+ * * Payload for event broadcasting when the server aborted a WebSocket connection
+ *
+ * @since 7.0.0-M5
+ */
+public class WebSocketAbortedPayload extends WebSocketPayload<AbortedMessage> {
+
+    private final AbortedMessage message;
+
+    public WebSocketAbortedPayload(AbortedMessage message, WebSocketRequestHandler handler) {
+        super(handler);
+
+        this.message = message;
+    }
+
+    @Override
+    public AbortedMessage getMessage() {
+        return message;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
new file mode 100644
index 0000000..2040554
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api.message;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A {@link IWebSocketMessage message} sent when the web socket connection is aborted.
+ *
+ * @since 7.0.0-M5
+ */
+public class AbortedMessage implements IWebSocketMessage {
+
+    private final Application application;
+    private final String sessionId;
+    private final IKey key;
+
+    public AbortedMessage(Application application, String sessionId, IKey key) {
+        this.application = Args.notNull(application, "application");
+        this.sessionId = Args.notNull(sessionId, "sessionId");
+        this.key = Args.notNull(key, "key");
+    }
+
+    public Application getApplication() {
+        return application;
+    }
+
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    public IKey getKey() {
+        return key;
+    }
+
+    @Override
+    public final String toString() {
+        return "The server aborted the client connection";
+    }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
index 80642a8..1ae8789 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
@@ -36,6 +36,20 @@ import org.apache.wicket.util.tester.WicketTester;
  */
 abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor
 {
+    /**
+     *
+     * Constructor.
+     *
+     * @param request
+     *            the http request that was used to create the TomcatWebSocketProcessor
+     * @param application
+     *            the current Wicket Application
+     */
+    public TestWebSocketProcessor(final HttpServletRequest request, final WebApplication application)
+    {
+        super(request, application);
+    }
+
 	/**
 	 * Constructor.
 	 *

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
index 2bee3f1..942889d 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
@@ -22,6 +22,7 @@ import org.apache.wicket.util.string.Strings;
 import org.junit.Assert;
 import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.WebSocketResource;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
 import org.apache.wicket.protocol.ws.api.message.BinaryMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
@@ -37,6 +38,7 @@ public class TestWebSocketResource extends WebSocketResource
 
 	static final AtomicBoolean ON_CONNECT_CALLED = new AtomicBoolean(false);
 	static final AtomicBoolean ON_CLOSE_CALLED = new AtomicBoolean(false);
+	static final AtomicBoolean ON_ABORT_CALLED = new AtomicBoolean(false);
 
 	private final String expectedMessage;
 
@@ -76,6 +78,12 @@ public class TestWebSocketResource extends WebSocketResource
 		super.onClose(message);
 	}
 
+    @Override
+    protected void onAbort(AbortedMessage message) {
+        ON_ABORT_CALLED.set(true);
+        super.onAbort(message);
+    }
+
 	@Override
 	protected void onMessage(WebSocketRequestHandler handler, TextMessage message)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/5c5c3640/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
new file mode 100644
index 0000000..b47b8af
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.util.tester;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.wicket.mock.MockApplication;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
+import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class WebSocketTesterProcessorTest extends Assert {
+
+    final static AtomicBoolean messageReceived = new AtomicBoolean(false);
+
+    private static class TestProcessor extends TestWebSocketProcessor {
+        private TestProcessor(HttpServletRequest request, WebApplication application) {
+            super(request, application);
+        }
+
+        @Override
+        protected void onOutMessage(String message) {
+            messageReceived.set(true);
+        }
+
+        @Override
+        protected void onOutMessage(byte[] message, int offset, int length) {
+            messageReceived.set(true);
+        }
+    }
+
+    WicketTester tester;
+    WebApplication application = new MockApplication() {
+        @Override
+        protected void init() {
+            super.init();
+
+            getSharedResources().add(TestWebSocketResource.TEXT, new TestWebSocketResource("expected"));
+        }
+    };
+
+    @Before
+    public void before() {
+        tester = new WicketTester(application);
+        WebApplication webApplication = tester.getApplication();
+        webApplication.getWicketFilter().setFilterPath("");
+    }
+
+    @After
+    public void after() {
+        tester.destroy();
+        TestWebSocketResource.ON_ABORT_CALLED.set(false);
+    }
+
+    @Test
+    public void onConnectNoOrigin() throws Exception {
+        // Given header 'Origin' is missing
+        configureRequest(true, new String[] { "http://www.example.com" }, new String[] {});
+
+        // When we open a connection
+        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+        processor.onOpen(new Object());
+
+        // Then it fails
+        assertEquals(true, TestWebSocketResource.ON_ABORT_CALLED.get());
+    }
+
+    @Ignore
+    @Test
+    public void onConnectMultipleOrigins() throws Exception {
+        // Given the request contains multiple header 'Origin's
+        configureRequest(true, new String[] { "http://www.example.com" }, new String[] { "http://www.example.com", "http://ww2.example.com" });
+
+        // When we open a connection
+        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+        processor.onOpen(new Object());
+
+        // Then it fails
+        assertEquals(true, TestWebSocketResource.ON_ABORT_CALLED.get());
+    }
+
+    @Test
+    public void onConnectMatchingOrigin() throws Exception {
+        // Given header 'Origin' matches the host origin
+        configureRequest(true, new String[] { "http://www.example.com" }, new String[] { "http://www.example.com" });
+
+        // When we open a connection
+        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+        processor.onOpen(new Object());
+
+        // Then it succeeds
+        assertEquals(false, TestWebSocketResource.ON_ABORT_CALLED.get());
+    }
+
+    @Test
+    public void onConnectMismatchingOrigin() throws Exception {
+        // Given header 'Origin' does not match the host origin
+        configureRequest(true, new String[] { "http://www.example.com" }, new String[] { "http://ww2.example.com" });
+
+        // When we open a connection
+        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+        processor.onOpen(new Object());
+
+        // Then it fails
+        assertEquals(true, TestWebSocketResource.ON_ABORT_CALLED.get());
+    }
+
+    protected void configureRequest(boolean protectionNeeded, String[] allowedDomains, String[] origins) {
+        WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
+        webSocketSettings.setHijackingProtectionEnabled(protectionNeeded);
+        webSocketSettings.setAllowedDomains(Arrays.asList(allowedDomains));
+        MockHttpServletRequest request = tester.getRequest();
+        for (String origin : origins) {
+            request.addHeader("Origin", origin);
+        }
+        request.addParameter("resourceName", TestWebSocketResource.TEXT);
+        request.addParameter(WebRequest.PARAM_AJAX_BASE_URL, ".");
+    }
+
+}
\ No newline at end of file


[4/6] wicket git commit: WICKET-5875 ComponentRenderer.renderComponent() unexpectedly produces a WicketRuntimeException when called with a nested Component which contains a nested wicket:message

Posted by mg...@apache.org.
WICKET-5875 ComponentRenderer.renderComponent() unexpectedly produces a
WicketRuntimeException when called with a nested Component which
contains a nested wicket:message

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/5dec48af
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/5dec48af
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/5dec48af

Branch: refs/heads/master
Commit: 5dec48afe24841b1c844a88510bd4a8b56ae5890
Parents: d611c22
Author: Andrea Del Bene <ad...@apache.org>
Authored: Wed Apr 8 22:49:19 2015 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Apr 10 16:51:35 2015 +0300

----------------------------------------------------------------------
 .../java/org/apache/wicket/core/util/string/ComponentRenderer.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5dec48af/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java b/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
index 4e94ba9..0f134dc 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
@@ -93,7 +93,7 @@ public class ComponentRenderer
 				RenderPage page = new RenderPage(component);
 				page.internalInitialize();
 			}
-			
+
 			component.render();
 		}
 		finally


[5/6] wicket git commit: Update frontend-maven-plugin to v. 0.0.23

Posted by mg...@apache.org.
Update frontend-maven-plugin to v. 0.0.23


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/f6ddba32
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f6ddba32
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f6ddba32

Branch: refs/heads/master
Commit: f6ddba325051db30bc9a4c42d2d49618ad4b9b38
Parents: 5dec48a
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Apr 10 15:01:46 2015 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Apr 10 16:51:35 2015 +0300

----------------------------------------------------------------------
 testing/wicket-js-tests/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/f6ddba32/testing/wicket-js-tests/pom.xml
----------------------------------------------------------------------
diff --git a/testing/wicket-js-tests/pom.xml b/testing/wicket-js-tests/pom.xml
index 59fa830..326795e 100644
--- a/testing/wicket-js-tests/pom.xml
+++ b/testing/wicket-js-tests/pom.xml
@@ -58,7 +58,7 @@
 					<plugin>
 						<groupId>com.github.eirslett</groupId>
 						<artifactId>frontend-maven-plugin</artifactId>
-						<version>0.0.15</version>
+						<version>0.0.23</version>
 						<executions>
 							<execution>
 								<id>install node and npm</id>


[6/6] wicket git commit: WICKET-5860 Cross-Site Websocket Hijacking protection

Posted by mg...@apache.org.
WICKET-5860 Cross-Site Websocket Hijacking protection


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/4f7c7b35
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/4f7c7b35
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/4f7c7b35

Branch: refs/heads/master
Commit: 4f7c7b351b89fad5c49b8e71ab5489ac5f2c1a29
Parents: f6ddba3
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Apr 10 16:44:45 2015 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Apr 10 16:51:35 2015 +0300

----------------------------------------------------------------------
 .../wicket/protocol/ws/WebSocketSettings.java   | 110 +++------
 .../ws/api/AbstractWebSocketProcessor.java      |  56 +++--
 .../protocol/ws/api/ConnectionRejected.java     |  48 ++++
 .../ws/api/ConnectionRejectedException.java     |  38 ---
 .../protocol/ws/api/FilterCollection.java       |  80 -------
 .../ws/api/IWebSocketConnectionFilter.java      |   4 +-
 .../protocol/ws/api/ServletRequestCopy.java     |  34 ++-
 .../protocol/ws/api/WebSocketBehavior.java      |  14 +-
 .../WebSocketConnectionFilterCollection.java    |  24 +-
 .../ws/api/WebSocketConnectionOriginFilter.java | 138 +++++++----
 .../protocol/ws/api/WebSocketResource.java      |  12 +-
 .../ws/api/event/WebSocketAbortedPayload.java   |  23 +-
 .../protocol/ws/api/message/AbortedMessage.java |  40 +---
 .../ws/api/message/AbstractClientMessage.java   |  54 +++++
 .../protocol/ws/api/message/ClosedMessage.java  |  26 +-
 .../ws/api/message/ConnectedMessage.java        |  26 +-
 .../ws/util/tester/TestWebSocketProcessor.java  |  26 +-
 .../ws/util/tester/TestWebSocketResource.java   |  10 +-
 .../tester/WebSocketTesterBehaviorTest.java     |   2 +-
 .../tester/WebSocketTesterProcessorTest.java    | 235 ++++++++++---------
 20 files changed, 480 insertions(+), 520 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
index 5a13374..87bde1c 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
@@ -16,15 +16,14 @@
  */
 package org.apache.wicket.protocol.ws;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 import java.util.concurrent.Callable;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Page;
 import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter;
+import org.apache.wicket.protocol.ws.api.WebSocketConnectionFilterCollection;
 import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.WebSocketResponse;
 import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
@@ -45,7 +44,7 @@ public class WebSocketSettings
 	};
 
 	/**
-	 * Holds this IWebSocketSettings in the Application's metadata.
+	 * Holds this WebSocketSettings in the Application's metadata.
 	 * This way wicket-core module doesn't have reference to wicket-native-websocket.
 	 */
 	public static final class Holder
@@ -90,14 +89,9 @@ public class WebSocketSettings
 	private IWebSocketConnectionRegistry connectionRegistry = new SimpleWebSocketConnectionRegistry();
 
 	/**
-	 * The whitelist of allowed domains where the client can connect to the application from
+	 * A filter that may reject an incoming connection
 	 */
-    private final List<String> allowedDomains = new ArrayList<String>();
-
-    /**
-     * Flag which indicates whether connection filtering should be active or not
-     */
-    private boolean protectionNeeded = false;
+	private IWebSocketConnectionFilter connectionFilter;
 
 	/**
 	 * Set the executor for processing websocket push messages broadcasted to all sessions.
@@ -115,16 +109,28 @@ public class WebSocketSettings
 	}
 
 	/**
-	 * The executor for processing websocket push messages broadcasted to all sessions.
-	 *
-	 * @return
-	 *            The executor used for processing push messages.
+	 * @return the executor for processing websocket push messages broadcasted to all sessions.
+	 */
+	public Executor getWebSocketPushMessageExecutor()
+	{
+		return webSocketPushMessageExecutor;
+	}
+
+	/**
+	 * @return The registry that tracks all currently connected WebSocket clients
 	 */
 	public IWebSocketConnectionRegistry getConnectionRegistry()
 	{
 		return connectionRegistry;
 	}
 
+	/**
+	 * Sets the connection registry
+	 *
+	 * @param connectionRegistry
+	 *              The registry that tracks all currently connected WebSocket clients
+	 * @return {@code this}, for method chaining
+	 */
 	public WebSocketSettings setConnectionRegistry(IWebSocketConnectionRegistry connectionRegistry)
 	{
 		Args.notNull(connectionRegistry, "connectionRegistry");
@@ -132,11 +138,6 @@ public class WebSocketSettings
 		return this;
 	}
 
-	public Executor getWebSocketPushMessageExecutor()
-	{
-		return webSocketPushMessageExecutor;
-	}
-
 	/**
 	 * The executor that broadcasts the {@link org.apache.wicket.protocol.ws.api.event.WebSocketPayload}
 	 * via Wicket's event bus.
@@ -165,60 +166,27 @@ public class WebSocketSettings
 	 */
 	public Executor getSendPayloadExecutor()
 	{
-		return sendPayloadExecutor;
+	return sendPayloadExecutor;
 	}
 
-    /**
-     * Flag that controls whether hijacking protection should be turned on or not
-     *
-     * @param protectionNeeded
-     *            True if protection needed
-     */
-    public void setHijackingProtectionEnabled(boolean protectionNeeded) {
-        this.protectionNeeded = protectionNeeded;
-    }
-
-    /**
-     * Flag that shows whether hijacking protection is turned on or not
-     *
-     * @param protectionNeeded
-     *            True if protection turned on
-     */
-    public boolean isHijackingProtectionEnabled() {
-        return this.protectionNeeded;
-    }
-
-    /**
-     * The list of whitelisted domains which are allowed to initiate a websocket connection. This
-     * list will be eventually used by the
-     * {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter} to abort potentially
-     * unsafe connections. Example domain names might be:
-     *
-     * <pre>
-     *      http://www.example.com
-     *      http://ww2.example.com
-     * </pre>
-     *
-     * @param domains
-     *            The collection of domains
-     */
-    public void setAllowedDomains(Collection<String> domains) {
-	this.allowedDomains.clear();
-        this.allowedDomains.addAll(domains);
-    }
+	/**
+	 * Sets the filter for checking the incoming connections
+	 * @param connectionFilter
+	 *              the filter for checking the incoming connections
+	 * @see WebSocketConnectionFilterCollection
+	 */
+	public void setConnectionFilter(IWebSocketConnectionFilter connectionFilter)
+	{
+		this.connectionFilter = connectionFilter;
+	}
 
-    /**
-     * The list of whitelisted domains which are allowed to initiate a websocket connection. This
-     * list will be eventually used by the
-     * {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter} to abort potentially
-     * unsafe connections
-     *
-     * @param domains
-     *            The collection of domains if or an empty list when no domains were added
-     */
-    public List<String> getAllowedDomains() {
-        return this.allowedDomains;
-    }
+	/**
+	 * @return the filter for checking the incoming connections
+	 * @see WebSocketConnectionFilterCollection
+	 */
+	public IWebSocketConnectionFilter getConnectionFilter() {
+		return this.connectionFilter;
+	}
 
 	/**
 	 * A factory method for the {@link org.apache.wicket.request.http.WebResponse}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index 5d0e829..7126ee1 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
-import java.util.Collection;
-
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.wicket.Application;
@@ -88,8 +86,8 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 	private final String sessionId;
 	private final WebSocketSettings webSocketSettings;
 	private final IWebSocketConnectionRegistry connectionRegistry;
-    private final WebSocketConnectionFilterCollection connectionFilters;
-    private final HttpServletRequest servletRequest;
+	private final IWebSocketConnectionFilter connectionFilter;
+	private final HttpServletRequest servletRequest;
 
 	/**
 	 * Constructor.
@@ -133,8 +131,7 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 
 		this.connectionRegistry = webSocketSettings.getConnectionRegistry();
 
-        this.connectionFilters = new WebSocketConnectionFilterCollection();
-        connectionFilters.add(new WebSocketConnectionOriginFilter(webSocketSettings));
+		this.connectionFilter = webSocketSettings.getConnectionFilter();
 	}
 
 	@Override
@@ -150,25 +147,31 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 		broadcastMessage(binaryMessage);
 	}
 
-    /**
-     * A helper that registers the opened connection in the application-level registry.
-     *
-     * @param connection
-     *            the web socket connection to use to communicate with the client
-     * @see #onOpen(Object)
-     */
-    protected final void onConnect(final IWebSocketConnection connection) {
-        IKey key = getRegistryKey();
-        try {
-            connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
-            connectionFilters.doFilter(servletRequest);
-            broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
-        } catch (ConnectionRejectedException e) {
-            broadcastMessage(new AbortedMessage(getApplication(), getSessionId(), key));
-            connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
-            connection.close(e.getCode(), e.getReason());
-        }
-    }
+	/**
+	 * A helper that registers the opened connection in the application-level registry.
+	 *
+	 * @param connection
+	 *            the web socket connection to use to communicate with the client
+	 * @see #onOpen(Object)
+	 */
+	protected final void onConnect(final IWebSocketConnection connection) {
+		IKey key = getRegistryKey();
+		connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
+
+		if (connectionFilter != null)
+		{
+			ConnectionRejected connectionRejected = connectionFilter.doFilter(servletRequest);
+			if (connectionRejected != null)
+			{
+				broadcastMessage(new AbortedMessage(getApplication(), getSessionId(), key));
+				connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
+				connection.close(connectionRejected.getCode(), connectionRejected.getReason());
+				return;
+			}
+		}
+
+		broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
+	}
 
 	@Override
 	public void onClose(int closeCode, String message)
@@ -332,7 +335,8 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 		{
 			payload = new WebSocketClosedPayload((ClosedMessage) message, handler);
 		}
-		else if (message instanceof AbortedMessage) {
+		else if (message instanceof AbortedMessage)
+		{
 			payload = new WebSocketAbortedPayload((AbortedMessage) message, handler);
 		}
 		else if (message instanceof IWebSocketPushMessage)

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejected.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejected.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejected.java
new file mode 100644
index 0000000..90af93d
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejected.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
+
+/**
+ * A class used by {@link IWebSocketConnectionFilter}s when they need to reject a connection
+ */
+public class ConnectionRejected
+{
+	private final int code;
+	private final String reason;
+
+	/**
+	 * Constructor
+	 *
+	 * @param code
+	 *              The error code
+	 * @param reason
+	 *              The reason to reject the connection
+	 */
+    public ConnectionRejected(int code, String reason)
+    {
+		this.code = code;
+		this.reason = reason;
+    }
+
+	public int getCode() {
+		return code;
+	}
+
+	public String getReason() {
+		return reason;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
deleted file mode 100644
index 16834f4..0000000
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
-
-public class ConnectionRejectedException extends RuntimeException {
-
-	private static final long serialVersionUID = 4552012810343573564L;
-
-	private final int code;
-	private final String reason;
-
-    public ConnectionRejectedException(int code, String reason) {
-		this.code = code;
-		this.reason = reason;
-    }
-
-	public int getCode() {
-		return code;
-	}
-
-	public String getReason() {
-		return reason;
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
deleted file mode 100644
index 8b08d89..0000000
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents a collection of filters. Facilitates invocation of filtering on each filter.
- *
- * @author Gergely Nagy
- *
- * @param <T>
- *            type of filters
- */
-public class FilterCollection<T> implements Serializable, Iterable<T> {
-
-	private static final long serialVersionUID = -7389583130277632264L;
-
-	/** list of listeners */
-	private final List<T> filters = new CopyOnWriteArrayList<>();
-
-	/**
-	 * Adds a filter to this set of filters.
-	 *
-	 * @param filter
-	 *            The filter to add
-	 * @return {@code true} if the filter was added
-	 */
-	public boolean add(final T filter)
-	{
-		if (filter == null)
-		{
-			return false;
-		}
-		filters.add(filter);
-		return true;
-	}
-
-	/**
-	 * Removes a filter from this set.
-	 *
-	 * @param filter
-	 *            The filter to remove
-	 */
-	public void remove(final T filter)
-	{
-		filters.remove(filter);
-	}
-
-	/**
-	 * Returns an iterator that can iterate the filter.
-	 *
-	 * @return an iterator that can iterate the filters.
-	 */
-	@Override
-	public Iterator<T> iterator() {
-		return filters.iterator();
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
index a43c7c1..afd0f2e 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketConnectionFilter.java
@@ -23,8 +23,8 @@ import javax.servlet.http.HttpServletRequest;
  * One example might be when the connection 'Origin' header does not match the origin of the
  * application host
  *
+ * @see WebSocketConnectionFilterCollection
  * @author Gergely Nagy
- *
  */
 public interface IWebSocketConnectionFilter {
 
@@ -34,5 +34,5 @@ public interface IWebSocketConnectionFilter {
      * @param servletRequest
      *            The servlet request holding the request headers
      */
-    public void doFilter(HttpServletRequest servletRequest);
+    ConnectionRejected doFilter(HttpServletRequest servletRequest);
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ServletRequestCopy.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ServletRequestCopy.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ServletRequestCopy.java
index bffc301..218b1f7 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ServletRequestCopy.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ServletRequestCopy.java
@@ -58,7 +58,7 @@ public class ServletRequestCopy implements HttpServletRequest
 	private final HttpSessionCopy httpSession;
 	private final StringBuffer requestURL;
 	private final Map<String, Object> attributes = new HashMap<>();
-	private final Map<String, String> headers = new HashMap<>();
+	private final Map<String, Enumeration<String>> headers = new HashMap<>();
 	private final Map<String, String[]> parameters = new HashMap<>();
 	private final String method;
 	private final String serverName;
@@ -81,7 +81,8 @@ public class ServletRequestCopy implements HttpServletRequest
 		Enumeration<String> e = request.getHeaderNames();
 		while (e != null && e.hasMoreElements()) {
 			s = e.nextElement();
-			headers.put(s, request.getHeader(s));
+			Enumeration<String> headerValues = request.getHeaders(s);
+			this.headers.put(s, headerValues);
 		}
 
 		e = request.getAttributeNames();
@@ -154,27 +155,20 @@ public class ServletRequestCopy implements HttpServletRequest
 	}
 
 	@Override
-	public String getHeader(String name) {
-		return headers.get(name);
+	public String getHeader(String name)
+	{
+		Enumeration<String> values = headers.get(name);
+		if (values != null && values.hasMoreElements())
+		{
+			return values.nextElement();
+		}
+		return null;
 	}
 
 	@Override
-	public Enumeration<String> getHeaders(final String name) {
-		return new Enumeration<String>() {
-
-			boolean hasNext = true;
-
-			@Override
-			public boolean hasMoreElements() {
-				return hasNext && headers.get(name) != null;
-			}
-
-			@Override
-			public String nextElement() {
-				hasNext = false;
-				return headers.get(name);
-			}
-		};
+	public Enumeration<String> getHeaders(final String name)
+	{
+		return headers.get(name);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
index 803246d..50cb5f0 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketBehavior.java
@@ -79,12 +79,12 @@ public abstract class WebSocketBehavior extends BaseWebSocketBehavior
 				ClosedMessage message = closedPayload.getMessage();
 				onClose(message);
 			}
-            else if (wsPayload instanceof WebSocketAbortedPayload)
-            {
-                WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) wsPayload;
-                AbortedMessage message = abortedPayload.getMessage();
-                onAbort(message);
-            }
+			else if (wsPayload instanceof WebSocketAbortedPayload)
+			{
+				WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) wsPayload;
+				AbortedMessage message = abortedPayload.getMessage();
+				onAbort(message);
+			}
 			else if (wsPayload instanceof WebSocketPushPayload)
 			{
 				WebSocketPushPayload pushPayload = (WebSocketPushPayload) wsPayload;
@@ -133,7 +133,7 @@ public abstract class WebSocketBehavior extends BaseWebSocketBehavior
      * A callback method called when the server has aborted the connection
      *
      * @param message
-     *          the aborted message with the info about the server
+     *          the aborted message with the info about the client
      */
     protected void onAbort(AbortedMessage message) {
     }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
index 63a9bc6..4257edd 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
@@ -16,19 +16,27 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
-import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
 
-public class WebSocketConnectionFilterCollection extends
-		FilterCollection<IWebSocketConnectionFilter> implements
-		IWebSocketConnectionFilter {
+import javax.servlet.http.HttpServletRequest;
 
-	private static final long serialVersionUID = 3953951891780895469L;
+public class WebSocketConnectionFilterCollection extends ArrayList<IWebSocketConnectionFilter>
+		implements IWebSocketConnectionFilter
+{
+	private static final long serialVersionUID = 1L;
 
 	@Override
-	public void doFilter(HttpServletRequest servletRequest) {
-		for (IWebSocketConnectionFilter filter : this) {
-			filter.doFilter(servletRequest);
+	public ConnectionRejected doFilter(final HttpServletRequest servletRequest)
+	{
+		for (IWebSocketConnectionFilter filter : this)
+		{
+			ConnectionRejected connectionRejected = filter.doFilter(servletRequest);
+			if (connectionRejected != null)
+			{
+				return connectionRejected;
+			}
 		}
+		return null;
 	}
 
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
index bc08c98..fdf0ef2 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
@@ -16,13 +16,14 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
-import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
 
 /**
  * This filter will reject those requests which contain 'Origin' header that does not match the origin of the
@@ -32,57 +33,104 @@ import org.apache.wicket.protocol.ws.WebSocketSettings;
  * @see <a href="http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html">http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html</a>
  *
  * @author Gergely Nagy
- *
  */
-public class WebSocketConnectionOriginFilter implements IWebSocketConnectionFilter {
+public class WebSocketConnectionOriginFilter implements IWebSocketConnectionFilter
+{
+
+	/**
+	 * Error code 1008 indicates that an endpoint is terminating the connection because it has received a message that
+     * violates its policy. This is a generic status code that can be returned when there is no other more suitable
+     * status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the policy.
+	 * <p>
+	 * See <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1">RFC 6455, Section 7.4.1 Defined Status Codes</a>.
+	 */
+	public static final int POLICY_VIOLATION_ERROR_CODE = 1008;
+
+	/**
+	 * Explanatory text for the client to explain why the connection is getting aborted
+	 */
+	public static final String ORIGIN_MISMATCH = "Origin mismatch";
 
-    /**
-     * 1008 indicates that an endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code
-     * that can be returned when there is no other more suitable status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the
-     * policy.
-     * <p>
-     * See <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1">RFC 6455, Section 7.4.1 Defined Status Codes</a>.
-     */
-    public static final int POLICY_VIOLATION = 1008;
+	private final List<String> allowedDomains;
 
-    /**
-     * Explanatory text for the client to explain why the connection is getting aborted
-     */
-    public static final String ORIGIN_MISMATCH = "Origin mismatch";
+	public WebSocketConnectionOriginFilter(final List<String> allowedDomains)
+	{
+		this.allowedDomains = Args.notNull(allowedDomains, "allowedDomains");
+	}
 
-    private final WebSocketSettings webSocketSettings;
+	@Override
+	public ConnectionRejected doFilter(HttpServletRequest servletRequest)
+	{
+		if (allowedDomains != null && !allowedDomains.isEmpty())
+		{
+			String oUrl = getOriginUrl(servletRequest);
+			if (invalid(oUrl, allowedDomains))
+			{
+				return new ConnectionRejected(POLICY_VIOLATION_ERROR_CODE, ORIGIN_MISMATCH);
+			}
+		}
 
-    public WebSocketConnectionOriginFilter(WebSocketSettings webSocketSettings) {
-        this.webSocketSettings = webSocketSettings;
-    }
+		return null;
+	}
 
-    @Override
-    public void doFilter(HttpServletRequest servletRequest) {
-        if (webSocketSettings.isHijackingProtectionEnabled()) {
-            String oUrl = getOriginUrl(servletRequest);
-            if (invalid(oUrl))
-                throw new ConnectionRejectedException(POLICY_VIOLATION, ORIGIN_MISMATCH);
-        }
-    }
+	/**
+	 * The list of whitelisted domains which are allowed to initiate a websocket connection. This
+	 * list will be eventually used by the
+	 * {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter} to abort potentially
+	 * unsafe connections. Example domain names might be:
+	 *
+	 * <pre>
+	 *      http://www.example.com
+	 *      http://ww2.example.com
+	 * </pre>
+	 *
+	 * @param domains
+	 *            The collection of domains
+	 */
+	public void setAllowedDomains(Iterable<String> domains) {
+		this.allowedDomains.clear();
+		if (domains != null)
+		{
+			for (String domain : domains)
+			{
+				this.allowedDomains.add(domain);
+			}
+		}
+	}
 
-    private boolean invalid(String oUrl) {
-        if (originMismatch(oUrl))
-            return true;
-        if (oUrl == null || "".equals(oUrl))
-            return true;
-        return false;
-    }
+	/**
+	 * The list of whitelisted domains which are allowed to initiate a websocket connection. This
+	 * list will be eventually used by the
+	 * {@link org.apache.wicket.protocol.ws.api.IWebSocketConnectionFilter} to abort potentially
+	 * unsafe connections
+	 */
+	public List<String> getAllowedDomains()
+	{
+		return allowedDomains;
+	}
 
-    private boolean originMismatch(String oUrl) {
-        List<String> allowedDomains = webSocketSettings.getAllowedDomains();
-        return !allowedDomains.contains(oUrl);
-    }
+	private boolean invalid(String oUrl, List<String> allowedDomains)
+	{
+		return Strings.isEmpty(oUrl) || !allowedDomains.contains(oUrl);
+	}
 
-    private String getOriginUrl(HttpServletRequest servletRequest) {
-        ArrayList<String> origins = Collections.list(servletRequest.getHeaders("Origin"));
-        if (origins.size() != 1)
-            return null;
-        return origins.get(0);
-    }
+	private String getOriginUrl(final HttpServletRequest servletRequest)
+	{
+		Enumeration<String> originHeaderValues = servletRequest.getHeaders("Origin");
+		List<String> origins;
+		if (originHeaderValues != null)
+		{
+			origins = Collections.list(originHeaderValues);
+		}
+		else
+		{
+			origins = Collections.emptyList();
+		}
 
+		if (origins.size() != 1)
+		{
+			return null;
+		}
+		return origins.get(0);
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
index 95aed1d..a49fc2b 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketResource.java
@@ -64,12 +64,12 @@ public abstract class WebSocketResource implements IResource
 			ClosedMessage message = connectedPayload.getMessage();
 			onClose(message);
 		}
-        else if (payload instanceof WebSocketAbortedPayload)
-        {
-            WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) payload;
-            AbortedMessage message = abortedPayload.getMessage();
-            onAbort(message);
-        }
+		else if (payload instanceof WebSocketAbortedPayload)
+		{
+			WebSocketAbortedPayload abortedPayload = (WebSocketAbortedPayload) payload;
+			AbortedMessage message = abortedPayload.getMessage();
+			onAbort(message);
+		}
 		else if (payload instanceof WebSocketPushPayload)
 		{
 			WebSocketPushPayload pushPayload = (WebSocketPushPayload) payload;

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
index f19aa95..399b959 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
@@ -24,19 +24,18 @@ import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
  *
  * @since 7.0.0-M5
  */
-public class WebSocketAbortedPayload extends WebSocketPayload<AbortedMessage> {
+public class WebSocketAbortedPayload extends WebSocketPayload<AbortedMessage>
+{
+	private final AbortedMessage message;
 
-    private final AbortedMessage message;
+	public WebSocketAbortedPayload(AbortedMessage message, WebSocketRequestHandler handler) {
+		super(handler);
 
-    public WebSocketAbortedPayload(AbortedMessage message, WebSocketRequestHandler handler) {
-        super(handler);
-
-        this.message = message;
-    }
-
-    @Override
-    public AbortedMessage getMessage() {
-        return message;
-    }
+		this.message = message;
+	}
 
+	@Override
+	public AbortedMessage getMessage() {
+		return message;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
index 2040554..61cc13e 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbortedMessage.java
@@ -18,39 +18,21 @@ package org.apache.wicket.protocol.ws.api.message;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
-import org.apache.wicket.util.lang.Args;
 
 /**
  * A {@link IWebSocketMessage message} sent when the web socket connection is aborted.
  *
  * @since 7.0.0-M5
  */
-public class AbortedMessage implements IWebSocketMessage {
-
-    private final Application application;
-    private final String sessionId;
-    private final IKey key;
-
-    public AbortedMessage(Application application, String sessionId, IKey key) {
-        this.application = Args.notNull(application, "application");
-        this.sessionId = Args.notNull(sessionId, "sessionId");
-        this.key = Args.notNull(key, "key");
-    }
-
-    public Application getApplication() {
-        return application;
-    }
-
-    public String getSessionId() {
-        return sessionId;
-    }
-
-    public IKey getKey() {
-        return key;
-    }
-
-    @Override
-    public final String toString() {
-        return "The server aborted the client connection";
-    }
+public class AbortedMessage extends AbstractClientMessage
+{
+	public AbortedMessage(Application application, String sessionId, IKey key)
+	{
+		super(application, sessionId, key);
+	}
+
+	@Override
+	public final String toString() {
+		return "The server aborted the client connection";
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbstractClientMessage.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbstractClientMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbstractClientMessage.java
new file mode 100644
index 0000000..7e3234c
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/AbstractClientMessage.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api.message;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.api.registry.IKey;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A base message for all messages with information about the client
+ */
+public abstract class AbstractClientMessage implements IWebSocketMessage
+{
+	private final Application application;
+	private final String sessionId;
+	private final IKey key;
+
+	public AbstractClientMessage(Application application, String sessionId, IKey key)
+	{
+		this.application = Args.notNull(application, "application");
+		this.sessionId = Args.notNull(sessionId, "sessionId");
+		this.key = Args.notNull(key, "key");
+	}
+
+	public Application getApplication()
+	{
+		return application;
+	}
+
+	public String getSessionId()
+	{
+		return sessionId;
+	}
+
+	public IKey getKey()
+	{
+		return key;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
index 43046c0..9dad746 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ClosedMessage.java
@@ -18,7 +18,6 @@ package org.apache.wicket.protocol.ws.api.message;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
-import org.apache.wicket.util.lang.Args;
 
 /**
  * A {@link IWebSocketMessage message} sent when the web socket connection
@@ -26,32 +25,11 @@ import org.apache.wicket.util.lang.Args;
  *
  * @since 6.0
  */
-public class ClosedMessage implements IWebSocketMessage
+public class ClosedMessage extends AbstractClientMessage
 {
-	private final Application application;
-	private final String sessionId;
-	private final IKey key;
-
 	public ClosedMessage(Application application, String sessionId, IKey key)
 	{
-		this.application = Args.notNull(application, "application");
-		this.sessionId = Args.notNull(sessionId, "sessionId");
-		this.key = Args.notNull(key, "key");
-	}
-
-	public Application getApplication()
-	{
-		return application;
-	}
-
-	public String getSessionId()
-	{
-		return sessionId;
-	}
-
-	public IKey getKey()
-	{
-		return key;
+		super(application, sessionId, key);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
index ab085ce..8e0485f 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/ConnectedMessage.java
@@ -18,7 +18,6 @@ package org.apache.wicket.protocol.ws.api.message;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
-import org.apache.wicket.util.lang.Args;
 
 /**
  * A {@link IWebSocketMessage message} when a client creates web socket
@@ -26,32 +25,11 @@ import org.apache.wicket.util.lang.Args;
  *
  * @since 6.0
  */
-public class ConnectedMessage implements IWebSocketMessage
+public class ConnectedMessage extends AbstractClientMessage
 {
-	private final Application application;
-	private final String sessionId;
-	private final IKey key;
-
 	public ConnectedMessage(Application application, String sessionId, IKey key)
 	{
-		this.application = Args.notNull(application, "application");
-		this.sessionId = Args.notNull(sessionId, "sessionId");
-		this.key = Args.notNull(key, "key");
-	}
-
-	public Application getApplication()
-	{
-		return application;
-	}
-
-	public String getSessionId()
-	{
-		return sessionId;
-	}
-
-	public IKey getKey()
-	{
-		return key;
+		super(application, sessionId, key);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
index 1ae8789..f7b55e1 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketProcessor.java
@@ -36,19 +36,19 @@ import org.apache.wicket.util.tester.WicketTester;
  */
 abstract class TestWebSocketProcessor extends AbstractWebSocketProcessor
 {
-    /**
-     *
-     * Constructor.
-     *
-     * @param request
-     *            the http request that was used to create the TomcatWebSocketProcessor
-     * @param application
-     *            the current Wicket Application
-     */
-    public TestWebSocketProcessor(final HttpServletRequest request, final WebApplication application)
-    {
-        super(request, application);
-    }
+	/**
+	 *
+	 * Constructor.
+	 *
+	 * @param request
+	 *            the http request that was used to create the IWebSocketProcessor
+	 * @param application
+	 *            the current Wicket Application
+	 */
+	public TestWebSocketProcessor(final HttpServletRequest request, final WebApplication application)
+	{
+		super(request, application);
+	}
 
 	/**
 	 * Constructor.

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
index 942889d..276c566 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/TestWebSocketResource.java
@@ -78,11 +78,11 @@ public class TestWebSocketResource extends WebSocketResource
 		super.onClose(message);
 	}
 
-    @Override
-    protected void onAbort(AbortedMessage message) {
-        ON_ABORT_CALLED.set(true);
-        super.onAbort(message);
-    }
+	@Override
+	protected void onAbort(AbortedMessage message) {
+		ON_ABORT_CALLED.set(true);
+		super.onAbort(message);
+	}
 
 	@Override
 	protected void onMessage(WebSocketRequestHandler handler, TextMessage message)

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java
index c6516cb..241047e 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterBehaviorTest.java
@@ -137,7 +137,7 @@ public class WebSocketTesterBehaviorTest extends Assert
 		webSocketTester.broadcast(tester.getApplication(), tester.getHttpSession().getId(),
 				new PageIdKey(page.getPageId()), broadcastMessage);
 
-		assertEquals(true, messageReceived.get());
+		assertTrue(messageReceived.get());
 		webSocketTester.destroy();
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/4f7c7b35/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
index cf9fa80..5956299 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
@@ -25,119 +25,136 @@ import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.protocol.ws.api.WebSocketConnectionOriginFilter;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
-public class WebSocketTesterProcessorTest extends Assert {
-
-    final static AtomicBoolean messageReceived = new AtomicBoolean(false);
-
-    private static class TestProcessor extends TestWebSocketProcessor {
-        private TestProcessor(HttpServletRequest request, WebApplication application) {
-            super(request, application);
-        }
-
-        @Override
-        protected void onOutMessage(String message) {
-            messageReceived.set(true);
-        }
-
-        @Override
-        protected void onOutMessage(byte[] message, int offset, int length) {
-            messageReceived.set(true);
-        }
-    }
-
-    WicketTester tester;
-    WebApplication application = new MockApplication() {
-        @Override
-        protected void init() {
-            super.init();
-
-            getSharedResources().add(TestWebSocketResource.TEXT, new TestWebSocketResource("expected"));
-        }
-    };
-
-    @Before
-    public void before() {
-        tester = new WicketTester(application);
-        application.getWicketFilter().setFilterPath("");
-    }
-
-    @After
-    public void after() {
-        tester.destroy();
-        TestWebSocketResource.ON_ABORT_CALLED.set(false);
-    }
-
-    @Test
-    public void onConnectNoOrigin() throws Exception {
-        // Given header 'Origin' is missing
-        configureRequest(true, new String[] { "http://www.example.com" }, new String[] {});
-
-        // When we open a connection
-        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
-        processor.onOpen(new Object());
-
-        // Then it fails
-        assertEquals(true, TestWebSocketResource.ON_ABORT_CALLED.get());
-    }
-
-    @Ignore
-    @Test
-    public void onConnectMultipleOrigins() throws Exception {
-        // Given the request contains multiple header 'Origin's
-        configureRequest(true, new String[] { "http://www.example.com" }, new String[] { "http://www.example.com", "http://ww2.example.com" });
-
-        // When we open a connection
-        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
-        processor.onOpen(new Object());
-
-        // Then it fails
-        assertEquals(true, TestWebSocketResource.ON_ABORT_CALLED.get());
-    }
-
-    @Test
-    public void onConnectMatchingOrigin() throws Exception {
-        // Given header 'Origin' matches the host origin
-        configureRequest(true, new String[] { "http://www.example.com" }, new String[] { "http://www.example.com" });
-
-        // When we open a connection
-        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
-        processor.onOpen(new Object());
-
-        // Then it succeeds
-        assertEquals(false, TestWebSocketResource.ON_ABORT_CALLED.get());
-    }
-
-    @Test
-    public void onConnectMismatchingOrigin() throws Exception {
-        // Given header 'Origin' does not match the host origin
-        configureRequest(true, new String[] { "http://www.example.com" }, new String[] { "http://ww2.example.com" });
-
-        // When we open a connection
-        TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
-        processor.onOpen(new Object());
-
-        // Then it fails
-        assertEquals(true, TestWebSocketResource.ON_ABORT_CALLED.get());
-    }
-
-    protected void configureRequest(boolean protectionNeeded, String[] allowedDomains, String[] origins) {
-        WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
-        webSocketSettings.setHijackingProtectionEnabled(protectionNeeded);
-        webSocketSettings.setAllowedDomains(Arrays.asList(allowedDomains));
-        MockHttpServletRequest request = tester.getRequest();
-        for (String origin : origins) {
-            request.addHeader("Origin", origin);
-        }
-        request.addParameter("resourceName", TestWebSocketResource.TEXT);
-        request.addParameter(WebRequest.PARAM_AJAX_BASE_URL, ".");
-    }
-
-}
\ No newline at end of file
+/**
+ * Tests for https://issues.apache.org/jira/browse/WICKET-5860
+ */
+public class WebSocketTesterProcessorTest extends Assert
+{
+	final static AtomicBoolean messageReceived = new AtomicBoolean(false);
+
+	private static class TestProcessor extends TestWebSocketProcessor
+	{
+		private TestProcessor(HttpServletRequest request, WebApplication application)
+		{
+			super(request, application);
+		}
+
+		@Override
+		protected void onOutMessage(String message)
+		{
+			messageReceived.set(true);
+		}
+
+		@Override
+		protected void onOutMessage(byte[] message, int offset, int length)
+		{
+			messageReceived.set(true);
+		}
+	}
+
+	WicketTester tester;
+	WebApplication application = new MockApplication()
+	{
+		@Override
+		protected void init()
+		{
+			super.init();
+
+			getSharedResources().add(TestWebSocketResource.TEXT, new TestWebSocketResource("expected"));
+		}
+	};
+
+	@Before
+	public void before()
+	{
+		tester = new WicketTester(application);
+		application.getWicketFilter().setFilterPath("");
+	}
+
+	@After
+	public void after()
+	{
+		tester.destroy();
+		TestWebSocketResource.ON_ABORT_CALLED.set(false);
+	}
+
+	@Test
+	public void onConnectNoOrigin()
+	{
+		// Given header 'Origin' is missing
+		configureRequest(new String[] { "http://www.example.com" }, new String[] {});
+
+		// When we open a connection
+		TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+		processor.onOpen(new Object());
+
+		// Then it fails
+		assertTrue(TestWebSocketResource.ON_ABORT_CALLED.get());
+	}
+
+//	@Ignore
+	@Test
+	public void onConnectMultipleOrigins()
+	{
+		// Given the request contains multiple header 'Origin's
+		configureRequest(new String[] { "http://www.example.com" }, new String[] { "http://www.example.com", "http://ww2.example.com" });
+
+		// When we open a connection
+		TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+		processor.onOpen(new Object());
+
+		// Then it fails
+		assertTrue(TestWebSocketResource.ON_ABORT_CALLED.get());
+	}
+
+	@Test
+	public void onConnectMatchingOrigin()
+	{
+		// Given header 'Origin' matches the host origin
+		configureRequest(new String[] { "http://www.example.com" }, new String[] { "http://www.example.com" });
+
+		// When we open a connection
+		TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+		processor.onOpen(new Object());
+
+		// Then it succeeds
+		assertFalse(TestWebSocketResource.ON_ABORT_CALLED.get());
+	}
+
+	@Test
+	public void onConnectMismatchingOrigin()
+	{
+		// Given header 'Origin' does not match the host origin
+		configureRequest(new String[] { "http://www.example.com" }, new String[] { "http://ww2.example.com" });
+
+		// When we open a connection
+		TestWebSocketProcessor processor = new TestProcessor(tester.getRequest(), tester.getApplication());
+		processor.onOpen(new Object());
+
+		// Then it fails
+		assertTrue(TestWebSocketResource.ON_ABORT_CALLED.get());
+	}
+
+	protected void configureRequest(String[] allowedDomains, String[] origins)
+	{
+		WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application);
+		WebSocketConnectionOriginFilter connectionFilter = new WebSocketConnectionOriginFilter(Arrays.asList(allowedDomains));
+		webSocketSettings.setConnectionFilter(connectionFilter);
+		MockHttpServletRequest request = tester.getRequest();
+		for (String origin : origins)
+		{
+			request.addHeader("Origin", origin);
+		}
+		request.addParameter("resourceName", TestWebSocketResource.TEXT);
+		request.addParameter(WebRequest.PARAM_AJAX_BASE_URL, ".");
+	}
+
+}


[3/6] wicket git commit: Introduced FilterCollection to hold the AbstractProcessor filters. WebSocketSettings clears allowedDomains before adding new domains. The connection closing code and reason moved to ConnectionRejectedException. Javacode added/edi

Posted by mg...@apache.org.
Introduced FilterCollection to hold the AbstractProcessor filters.
WebSocketSettings clears allowedDomains before adding new domains.
The connection closing code and reason moved to
ConnectionRejectedException.
Javacode added/edited.

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/5311b163
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/5311b163
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/5311b163

Branch: refs/heads/master
Commit: 5311b16308dbb3d8945a18471e13611b2f40fbdb
Parents: 5c5c364
Author: admin <ge...@mail.rakuten.com>
Authored: Tue Apr 7 23:46:44 2015 +0900
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Apr 10 16:51:07 2015 +0300

----------------------------------------------------------------------
 .../wicket/protocol/ws/WebSocketSettings.java   |  1 +
 .../ws/api/AbstractWebSocketProcessor.java      | 25 +++-----
 .../ws/api/ConnectionRejectedException.java     | 17 ++++++
 .../protocol/ws/api/FilterCollection.java       | 64 ++++++++++++++++++++
 .../WebSocketConnectionFilterCollection.java    | 18 ++++++
 .../ws/api/WebSocketConnectionOriginFilter.java | 26 +++++++-
 .../ws/api/event/WebSocketAbortedPayload.java   |  2 +-
 .../tester/WebSocketTesterProcessorTest.java    |  3 +-
 8 files changed, 134 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
index 92a4a5c..5a13374 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
@@ -203,6 +203,7 @@ public class WebSocketSettings
      *            The collection of domains
      */
     public void setAllowedDomains(Collection<String> domains) {
+	this.allowedDomains.clear();
         this.allowedDomains.addAll(domains);
     }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index 1dac814..5d0e829 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
+import java.util.Collection;
+
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.wicket.Application;
@@ -78,20 +80,6 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 	 */
 	static final int NO_PAGE_ID = -1;
 
-    /**
-     * 1008 indicates that an endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code
-     * that can be returned when there is no other more suitable status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the
-     * policy.
-     * <p>
-     * See <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1">RFC 6455, Section 7.4.1 Defined Status Codes</a>.
-     */
-    static final int POLICY_VIOLATION = 1008;
-
-    /**
-     * Explanatory text for the client to explain why the connection is getting aborted
-     */
-    static final String ORIGIN_MISMATCH = "Origin mismatch";
-
 	private final WebRequest webRequest;
 	private final int pageId;
 	private final String resourceName;
@@ -100,7 +88,7 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 	private final String sessionId;
 	private final WebSocketSettings webSocketSettings;
 	private final IWebSocketConnectionRegistry connectionRegistry;
-    private final IWebSocketConnectionFilter connectionFilter;
+    private final WebSocketConnectionFilterCollection connectionFilters;
     private final HttpServletRequest servletRequest;
 
 	/**
@@ -145,7 +133,8 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
 
 		this.connectionRegistry = webSocketSettings.getConnectionRegistry();
 
-        this.connectionFilter = new WebSocketConnectionOriginFilter(webSocketSettings);
+        this.connectionFilters = new WebSocketConnectionFilterCollection();
+        connectionFilters.add(new WebSocketConnectionOriginFilter(webSocketSettings));
 	}
 
 	@Override
@@ -172,12 +161,12 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor
         IKey key = getRegistryKey();
         try {
             connectionRegistry.setConnection(getApplication(), getSessionId(), key, connection);
-            connectionFilter.doFilter(servletRequest);
+            connectionFilters.doFilter(servletRequest);
             broadcastMessage(new ConnectedMessage(getApplication(), getSessionId(), key));
         } catch (ConnectionRejectedException e) {
             broadcastMessage(new AbortedMessage(getApplication(), getSessionId(), key));
             connectionRegistry.removeConnection(getApplication(), getSessionId(), key);
-            connection.close(POLICY_VIOLATION, ORIGIN_MISMATCH);
+            connection.close(e.getCode(), e.getReason());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
index 15af612..16834f4 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/ConnectionRejectedException.java
@@ -18,4 +18,21 @@ package org.apache.wicket.protocol.ws.api;
 
 public class ConnectionRejectedException extends RuntimeException {
 
+	private static final long serialVersionUID = 4552012810343573564L;
+
+	private final int code;
+	private final String reason;
+
+    public ConnectionRejectedException(int code, String reason) {
+		this.code = code;
+		this.reason = reason;
+    }
+
+	public int getCode() {
+		return code;
+	}
+
+	public String getReason() {
+		return reason;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
new file mode 100644
index 0000000..2bbde0e
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/FilterCollection.java
@@ -0,0 +1,64 @@
+package org.apache.wicket.protocol.ws.api;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents a collection of filters. Facilitates invocation of filtering on each filter.
+ *
+ * @author Gergely Nagy
+ *
+ * @param <T>
+ *            type of filters
+ */
+public class FilterCollection<T> implements Serializable, Iterable<T> {
+
+	private static final long serialVersionUID = -7389583130277632264L;
+
+	/** list of listeners */
+	private final List<T> filters = new CopyOnWriteArrayList<>();
+
+	/**
+	 * Adds a filter to this set of filters.
+	 *
+	 * @param filter
+	 *            The filter to add
+	 * @return {@code true} if the filter was added
+	 */
+	public boolean add(final T filter)
+	{
+		if (filter == null)
+		{
+			return false;
+		}
+		filters.add(filter);
+		return true;
+	}
+
+	/**
+	 * Removes a filter from this set.
+	 *
+	 * @param filter
+	 *            The filter to remove
+	 */
+	public void remove(final T filter)
+	{
+		filters.remove(filter);
+	}
+
+	/**
+	 * Returns an iterator that can iterate the filter.
+	 *
+	 * @return an iterator that can iterate the filters.
+	 */
+	@Override
+	public Iterator<T> iterator() {
+		return filters.iterator();
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
new file mode 100644
index 0000000..66622b1
--- /dev/null
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionFilterCollection.java
@@ -0,0 +1,18 @@
+package org.apache.wicket.protocol.ws.api;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class WebSocketConnectionFilterCollection extends
+		FilterCollection<IWebSocketConnectionFilter> implements
+		IWebSocketConnectionFilter {
+
+	private static final long serialVersionUID = 3953951891780895469L;
+
+	@Override
+	public void doFilter(HttpServletRequest servletRequest) {
+		for (IWebSocketConnectionFilter filter : this) {
+			filter.doFilter(servletRequest);
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
index 655ed30..bc08c98 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketConnectionOriginFilter.java
@@ -24,8 +24,32 @@ import javax.servlet.http.HttpServletRequest;
 
 import org.apache.wicket.protocol.ws.WebSocketSettings;
 
+/**
+ * This filter will reject those requests which contain 'Origin' header that does not match the origin of the
+ * application host. This kind of extended security might be necessary if the application needs to enforce the
+ * Same Origin Policy which is not provided by the HTML5 WebSocket protocol.
+ *
+ * @see <a href="http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html">http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html</a>
+ *
+ * @author Gergely Nagy
+ *
+ */
 public class WebSocketConnectionOriginFilter implements IWebSocketConnectionFilter {
 
+    /**
+     * 1008 indicates that an endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code
+     * that can be returned when there is no other more suitable status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the
+     * policy.
+     * <p>
+     * See <a href="https://tools.ietf.org/html/rfc6455#section-7.4.1">RFC 6455, Section 7.4.1 Defined Status Codes</a>.
+     */
+    public static final int POLICY_VIOLATION = 1008;
+
+    /**
+     * Explanatory text for the client to explain why the connection is getting aborted
+     */
+    public static final String ORIGIN_MISMATCH = "Origin mismatch";
+
     private final WebSocketSettings webSocketSettings;
 
     public WebSocketConnectionOriginFilter(WebSocketSettings webSocketSettings) {
@@ -37,7 +61,7 @@ public class WebSocketConnectionOriginFilter implements IWebSocketConnectionFilt
         if (webSocketSettings.isHijackingProtectionEnabled()) {
             String oUrl = getOriginUrl(servletRequest);
             if (invalid(oUrl))
-                throw new ConnectionRejectedException();
+                throw new ConnectionRejectedException(POLICY_VIOLATION, ORIGIN_MISMATCH);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
index 5a19ad4..f19aa95 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/event/WebSocketAbortedPayload.java
@@ -20,7 +20,7 @@ import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
 
 /**
- * * Payload for event broadcasting when the server aborted a WebSocket connection
+ * Payload for event broadcasting when the server aborted a WebSocket connection
  *
  * @since 7.0.0-M5
  */

http://git-wip-us.apache.org/repos/asf/wicket/blob/5311b163/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
----------------------------------------------------------------------
diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
index b47b8af..cf9fa80 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/test/java/org/apache/wicket/protocol/ws/util/tester/WebSocketTesterProcessorTest.java
@@ -66,8 +66,7 @@ public class WebSocketTesterProcessorTest extends Assert {
     @Before
     public void before() {
         tester = new WicketTester(application);
-        WebApplication webApplication = tester.getApplication();
-        webApplication.getWicketFilter().setFilterPath("");
+        application.getWicketFilter().setFilterPath("");
     }
 
     @After