Repository: curator Updated Branches: refs/heads/CURATOR-3.0 75aa991e3 -> 793ed89b1
CURATOR-228 - Modified the background callback to explicitly handle the NOAUTH case. This will now log a warning and set a flag indicating that an auth failure has occured. Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/ecf67df8 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/ecf67df8 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/ecf67df8 Branch: refs/heads/CURATOR-3.0 Commit: ecf67df891d31b43acb45a65743c97976913b3ca Parents: 870b4d5 Author: Cam McKenzie <cammcken...@apache.org> Authored: Thu Jul 23 13:38:37 2015 +1000 Committer: Cam McKenzie <cammcken...@apache.org> Committed: Thu Jul 23 13:38:37 2015 +1000 ---------------------------------------------------------------------- .../recipes/nodes/PersistentEphemeralNode.java | 14 +++++++ .../nodes/TestPersistentEphemeralNode.java | 39 ++++++++++++++++++++ 2 files changed, 53 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/ecf67df8/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java index f50dca4..35e18a5 100644 --- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java +++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java @@ -41,6 +41,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import org.apache.curator.utils.PathUtils; @@ -65,6 +66,7 @@ public class PersistentEphemeralNode implements Closeable private final Mode mode; private final AtomicReference<byte[]> data = new AtomicReference<byte[]>(); private final AtomicReference<State> state = new AtomicReference<State>(State.LATENT); + private final AtomicBoolean authFailure = new AtomicBoolean(false); private final BackgroundCallback backgroundCallback; private final Watcher watcher = new Watcher() { @@ -233,8 +235,15 @@ public class PersistentEphemeralNode implements Closeable { path = event.getName(); } + else if ( event.getResultCode() == KeeperException.Code.NOAUTH.intValue() ) + { + log.warn("Client does not have authorisation to write ephemeral node at path {}", path); + authFailure.set(true); + return; + } if ( path != null ) { + authFailure.set(false); nodePath.set(path); watchNode(); @@ -406,4 +415,9 @@ public class PersistentEphemeralNode implements Closeable { return (state.get() == State.STARTED); } + + public boolean isAuthFailure() + { + return authFailure.get(); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/curator/blob/ecf67df8/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java index 34620ff..b199872 100644 --- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java +++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java @@ -35,7 +35,9 @@ import org.apache.curator.utils.ZKPaths; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; import org.testng.Assert; import org.testng.annotations.AfterMethod; @@ -572,6 +574,43 @@ public class TestPersistentEphemeralNode extends BaseClassForTests node.close(); } } + + @Test + public void testNoWritePermission() throws Exception + { + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); + CuratorFramework client = builder + .connectString(server.getConnectString()) + .authorization("digest", "me1:pass1".getBytes()) + .retryPolicy(new RetryOneTime(1)) + .build(); + client.start(); + + ACL acl = new ACL(ZooDefs.Perms.WRITE, ZooDefs.Ids.AUTH_IDS); + List<ACL> aclList = Lists.newArrayList(acl); + client.create().withACL(aclList).forPath(DIR, new byte[0]); + client.close(); + + PersistentEphemeralNode node = null; + try { + //New client without authentication + client = newCurator(); + + node = new PersistentEphemeralNode(client, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, + new byte[0]); + node.start(); + + node.waitForInitialCreate(timing.seconds(), TimeUnit.SECONDS); + assertNodeDoesNotExist(client, PATH); + assertTrue(node.isAuthFailure()); + } finally { + if(node != null) { + node.close(); + } + + client.close(); + } + } private void assertNodeExists(CuratorFramework curator, String path) throws Exception {