Author: frm
Date: Fri Sep 9 15:54:40 2016
New Revision: 1760048
URL: http://svn.apache.org/viewvc?rev=1760048&view=rev
Log:
OAK-4784 - Move the client white list filter in a separate handler
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilter.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandler.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilter.java
- copied, changed from r1760010,
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandlerTest.java
(with props)
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilterTest.java
- copied, changed from r1760010,
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilterTest.java
Removed:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilterTest.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerHandler.java
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilter.java?rev=1760048&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilter.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilter.java
Fri Sep 9 15:54:40 2016
@@ -0,0 +1,26 @@
+/*
+ * 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.jackrabbit.oak.segment.standby.server;
+
+import java.net.SocketAddress;
+
+interface ClientFilter {
+
+ boolean isAllowed(SocketAddress address);
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilter.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandler.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandler.java?rev=1760048&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandler.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandler.java
Fri Sep 9 15:54:40 2016
@@ -0,0 +1,61 @@
+/*
+ * 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.jackrabbit.oak.segment.standby.server;
+
+import java.net.SocketAddress;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A handler that filters out incoming connections based on the address of the
+ * client. This handler immediately closes the incoming connection if an
+ * unwanted client is detected.
+ */
+class ClientFilterHandler extends ChannelInboundHandlerAdapter {
+
+ private static final Logger log =
LoggerFactory.getLogger(ClientFilterHandler.class);
+
+ private final ClientFilter filter;
+
+ /**
+ * Create a new handler based on the provided filtering strategy.
+ *
+ * @param filter an instance of {@link ClientFilter} representing the
+ * filtering strategy for this handler.
+ */
+ ClientFilterHandler(ClientFilter filter) {
+ this.filter = filter;
+ }
+
+ @Override
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {
+ SocketAddress address = ctx.channel().remoteAddress();
+
+ if (filter.isAllowed(address)) {
+ log.debug("Client {} is allowed", address);
+ ctx.fireChannelActive();
+ } else {
+ log.debug("Client {} is rejected", address);
+ ctx.close();
+ }
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilter.java
(from r1760010,
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilter.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilter.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java&r1=1760010&r2=1760048&rev=1760048&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilter.java
Fri Sep 9 15:54:40 2016
@@ -18,6 +18,8 @@
package org.apache.jackrabbit.oak.segment.standby.server;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
@@ -31,9 +33,9 @@ import org.slf4j.LoggerFactory;
* Known issue: if a host name is provided as a filter and that host name
* contains a dash ("-"), it will be interpreted as an IP range.
*/
-class IpAddressFilter {
+class ClientIpFilter implements ClientFilter {
- private static final Logger log =
LoggerFactory.getLogger(IpAddressFilter.class);
+ private static final Logger log =
LoggerFactory.getLogger(ClientIpFilter.class);
private static boolean areAddressesEqual(InetAddress a, InetAddress b) {
return Arrays.equals(a.getAddress(), b.getAddress());
@@ -118,18 +120,16 @@ class IpAddressFilter {
*
* @param filters A list of filters.
*/
- IpAddressFilter(String[] filters) {
+ ClientIpFilter(String[] filters) {
this.allowedIpRanges = filters;
}
- /**
- * Check if the provided IP address is allowed by this white list.
- *
- * @param address the address to verify.
- * @return {@code true} if the address is valid according to this white
- * list, {@code false} otherwise.
- */
- boolean isAllowed(InetAddress address) {
+ @Override
+ public boolean isAllowed(SocketAddress address) {
+ return isAllowed(((InetSocketAddress) address).getAddress());
+ }
+
+ private boolean isAllowed(InetAddress address) {
if (allowedIpRanges == null) {
return true;
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java?rev=1760048&r1=1760047&r2=1760048&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
Fri Sep 9 15:54:40 2016
@@ -82,7 +82,7 @@ public class StandbyServer implements St
this(port, store, allowedClientIPRanges, false);
}
- public StandbyServer(int port, final FileStore store, String[]
allowedClientIPRanges, boolean secure) throws CertificateException,
SSLException {
+ public StandbyServer(int port, final FileStore store, final String[]
allowedClientIPRanges, boolean secure) throws CertificateException,
SSLException {
this.port = port;
if (secure) {
@@ -91,7 +91,7 @@ public class StandbyServer implements St
}
observer = new CommunicationObserver("primary");
- handler = new StandbyServerHandler(store, observer,
allowedClientIPRanges);
+ handler = new StandbyServerHandler(store, observer);
bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup();
@@ -117,9 +117,13 @@ public class StandbyServer implements St
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
+
+ p.addLast(new ClientFilterHandler(new
ClientIpFilter(allowedClientIPRanges)));
+
if (sslContext != null) {
p.addLast(sslContext.newHandler(ch.alloc()));
}
+
p.addLast(new LineBasedFrameDecoder(8192));
p.addLast(new StringDecoder(CharsetUtil.UTF_8));
p.addLast(new SnappyFramedEncoder());
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerHandler.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerHandler.java?rev=1760048&r1=1760047&r2=1760048&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerHandler.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerHandler.java
Fri Sep 9 15:54:40 2016
@@ -48,14 +48,11 @@ public class StandbyServerHandler extend
private final CommunicationObserver observer;
- private final IpAddressFilter allowedIPRanges;
-
public String state;
- public StandbyServerHandler(FileStore store, CommunicationObserver
observer, String[] allowedIPRanges) {
+ public StandbyServerHandler(FileStore store, CommunicationObserver
observer) {
this.store = store;
this.observer = observer;
- this.allowedIPRanges = new IpAddressFilter(allowedIPRanges);
}
private RecordId headId() {
@@ -65,10 +62,6 @@ public class StandbyServerHandler extend
return null;
}
- private boolean clientAllowed(InetSocketAddress client) {
- return allowedIPRanges.isAllowed(client.getAddress());
- }
-
@Override
public void channelRegistered(io.netty.channel.ChannelHandlerContext ctx)
throws java.lang.Exception {
state = "channel registered";
@@ -94,61 +87,57 @@ public class StandbyServerHandler extend
}
@Override
- public void channelRead0(ChannelHandlerContext ctx, String payload)
- throws Exception {
+ public void channelRead0(ChannelHandlerContext ctx, String payload) throws
Exception {
state = "got message";
String request = Messages.extractMessageFrom(payload);
- InetSocketAddress client =
(InetSocketAddress)ctx.channel().remoteAddress();
+ InetSocketAddress client = (InetSocketAddress)
ctx.channel().remoteAddress();
- if (!clientAllowed(client)) {
- log.warn("Got request from client " + client + " which is not in
the allowed ip ranges! Request will be ignored.");
- }
- else {
- String clientID = Messages.extractClientFrom(payload);
- observer.gotMessageFrom(clientID, request, client);
- if (Messages.GET_HEAD.equalsIgnoreCase(request)) {
- RecordId r = headId();
- if (r != null) {
- ctx.writeAndFlush(r);
- return;
- }
- } else if (request.startsWith(Messages.GET_SEGMENT)) {
- String sid = request.substring(Messages.GET_SEGMENT.length());
- log.debug("request segment id {}", sid);
- UUID uuid = UUID.fromString(sid);
-
- Segment s = null;
-
- for (int i = 0; i < 10; i++) {
- try {
- s =
store.readSegment(store.newSegmentId(uuid.getMostSignificantBits(),
uuid.getLeastSignificantBits()));
- } catch (IllegalRepositoryStateException e) {
- // segment not found
- log.debug("waiting for segment. Got exception: " +
e.getMessage());
- TimeUnit.MILLISECONDS.sleep(2000);
- }
- if (s != null) break;
+ String clientID = Messages.extractClientFrom(payload);
+ observer.gotMessageFrom(clientID, request, client);
+ if (Messages.GET_HEAD.equalsIgnoreCase(request)) {
+ RecordId r = headId();
+ if (r != null) {
+ ctx.writeAndFlush(r);
+ return;
+ }
+ } else if (request.startsWith(Messages.GET_SEGMENT)) {
+ String sid = request.substring(Messages.GET_SEGMENT.length());
+ log.debug("request segment id {}", sid);
+ UUID uuid = UUID.fromString(sid);
+
+ Segment s = null;
+
+ for (int i = 0; i < 10; i++) {
+ try {
+ s =
store.readSegment(store.newSegmentId(uuid.getMostSignificantBits(),
uuid.getLeastSignificantBits()));
+ } catch (IllegalRepositoryStateException e) {
+ // segment not found
+ log.debug("waiting for segment. Got exception: " +
e.getMessage());
+ TimeUnit.MILLISECONDS.sleep(2000);
}
-
if (s != null) {
- log.debug("sending segment " + sid + " to " + client);
- ctx.writeAndFlush(s);
- observer.didSendSegmentBytes(clientID, s.size());
- return;
+ break;
}
- } else if (request.startsWith(Messages.GET_BLOB)) {
- String bid = request.substring(Messages.GET_BLOB.length());
- log.debug("request blob id {}", bid);
- Blob b = readBlob(bid);
- log.debug("sending blob " + bid + " to " + client);
- ctx.writeAndFlush(b);
- observer.didSendBinariesBytes(clientID,
- Math.max(0, (int) b.length()));
+ }
+
+ if (s != null) {
+ log.debug("sending segment " + sid + " to " + client);
+ ctx.writeAndFlush(s);
+ observer.didSendSegmentBytes(clientID, s.size());
return;
- } else {
- log.warn("Unknown request {}, ignoring.", request);
}
+ } else if (request.startsWith(Messages.GET_BLOB)) {
+ String bid = request.substring(Messages.GET_BLOB.length());
+ log.debug("request blob id {}", bid);
+ Blob b = readBlob(bid);
+ log.debug("sending blob " + bid + " to " + client);
+ ctx.writeAndFlush(b);
+ observer.didSendBinariesBytes(clientID,
+ Math.max(0, (int) b.length()));
+ return;
+ } else {
+ log.warn("Unknown request {}, ignoring.", request);
}
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER);
}
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandlerTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandlerTest.java?rev=1760048&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandlerTest.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandlerTest.java
Fri Sep 9 15:54:40 2016
@@ -0,0 +1,61 @@
+/*
+ * 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.jackrabbit.oak.segment.standby.server;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+import io.netty.channel.embedded.EmbeddedChannel;
+import org.junit.Test;
+
+public class ClientFilterHandlerTest {
+
+ @Test
+ public void allowedClientsShouldBeServed() {
+ EmbeddedChannel channel = new EmbeddedChannel(new
ClientFilterHandler(new ClientFilter() {
+
+ @Override
+ public boolean isAllowed(SocketAddress address) {
+ return true;
+ }
+
+ }));
+
+ channel.connect(new InetSocketAddress("127.0.0.1", 8080));
+ assertTrue(channel.isOpen());
+ }
+
+ @Test
+ public void disallowedClientsShouldNotBeServed() {
+ EmbeddedChannel channel = new EmbeddedChannel(new
ClientFilterHandler(new ClientFilter() {
+
+ @Override
+ public boolean isAllowed(SocketAddress address) {
+ return false;
+ }
+
+ }));
+
+ channel.connect(new InetSocketAddress("127.0.0.2", 8080));
+ assertFalse(channel.isOpen());
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientFilterHandlerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilterTest.java
(from r1760010,
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilterTest.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilterTest.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilterTest.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilterTest.java&r1=1760010&r2=1760048&rev=1760048&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilterTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/ClientIpFilterTest.java
Fri Sep 9 15:54:40 2016
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.segmen
import static org.junit.Assert.assertEquals;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -27,7 +28,7 @@ import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class IpAddressFilterTest {
+public class ClientIpFilterTest {
@Parameters(name = "filters={0}, address={1}, matches={2}")
public static Object[] parameters() {
@@ -58,7 +59,7 @@ public class IpAddressFilterTest {
private final boolean match;
- public IpAddressFilterTest(String addresses, String client, boolean match)
{
+ public ClientIpFilterTest(String addresses, String client, boolean match) {
this.addresses = addresses;
this.client = client;
this.match = match;
@@ -66,7 +67,7 @@ public class IpAddressFilterTest {
@Test
public void test() throws Exception {
- assertEquals(match, new
IpAddressFilter(parseFilters()).isAllowed(InetAddress.getByName(client)));
+ assertEquals(match, new
ClientIpFilter(parseFilters()).isAllowed(createAddress()));
}
private String[] parseFilters() {
@@ -77,4 +78,8 @@ public class IpAddressFilterTest {
return addresses.split(",");
}
+ private InetSocketAddress createAddress() throws Exception {
+ return new InetSocketAddress(InetAddress.getByName(client), 8080);
+ }
+
}