Author: phunt Date: Wed Oct 6 16:18:46 2010 New Revision: 1005103 URL: http://svn.apache.org/viewvc?rev=1005103&view=rev Log: ZOOKEEPER-844. handle auth failure in java client
Modified: hadoop/zookeeper/branches/branch-3.3/CHANGES.txt hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/ClientCnxn.java hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/Watcher.java hadoop/zookeeper/branches/branch-3.3/src/java/test/org/apache/zookeeper/test/AuthTest.java Modified: hadoop/zookeeper/branches/branch-3.3/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.3/CHANGES.txt?rev=1005103&r1=1005102&r2=1005103&view=diff ============================================================================== --- hadoop/zookeeper/branches/branch-3.3/CHANGES.txt (original) +++ hadoop/zookeeper/branches/branch-3.3/CHANGES.txt Wed Oct 6 16:18:46 2010 @@ -29,6 +29,9 @@ BUGFIXES: ZOOKEEPER-804. c unit tests failing due to "assertion cptr failed" (michi mutsuzaki via mahadev) + ZOOKEEPER-844. handle auth failure in java client + (Camille Fournier via phunt) + IMPROVEMENTS: ZOOKEEPER-789. Improve FLE log messages (flavio via phunt) Modified: hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/ClientCnxn.java URL: http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/ClientCnxn.java?rev=1005103&r1=1005102&r2=1005103&view=diff ============================================================================== --- hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/ClientCnxn.java (original) +++ hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/ClientCnxn.java Wed Oct 6 16:18:46 2010 @@ -39,6 +39,9 @@ import org.apache.jute.BinaryInputArchiv import org.apache.jute.BinaryOutputArchive; import org.apache.jute.Record; import org.apache.log4j.Logger; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; import org.apache.zookeeper.AsyncCallback.ACLCallback; import org.apache.zookeeper.AsyncCallback.Children2Callback; import org.apache.zookeeper.AsyncCallback.ChildrenCallback; @@ -739,8 +742,12 @@ public class ClientCnxn { return; } if (replyHdr.getXid() == -4) { - // -2 is the xid for AuthPacket - // TODO: process AuthPacket here + // -4 is the xid for AuthPacket + if(replyHdr.getErr() == KeeperException.Code.AUTHFAILED.intValue()) { + zooKeeper.state = States.AUTH_FAILED; + eventThread.queueEvent( new WatchedEvent(Watcher.Event.EventType.None, + Watcher.Event.KeeperState.AuthFailed, null) ); + } if (LOG.isDebugEnabled()) { LOG.debug("Got auth sessionid:0x" + Long.toHexString(sessionId)); Modified: hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/Watcher.java URL: http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/Watcher.java?rev=1005103&r1=1005102&r2=1005103&view=diff ============================================================================== --- hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/Watcher.java (original) +++ hadoop/zookeeper/branches/branch-3.3/src/java/main/org/apache/zookeeper/Watcher.java Wed Oct 6 16:18:46 2010 @@ -18,6 +18,8 @@ package org.apache.zookeeper; +import org.apache.zookeeper.Watcher.Event.KeeperState; + /** * This interface specifies the public interface an event handler class must * implement. A ZooKeeper client will get various events from the ZooKeepr @@ -53,6 +55,12 @@ public interface Watcher { * in the host connection parameter during ZooKeeper client * creation). */ SyncConnected (3), + + /** + * Auth failed state + * + */ + AuthFailed(4), /** The serving cluster has expired this session. The ZooKeeper * client connection (the session) is no longer valid. You must @@ -77,6 +85,7 @@ public interface Watcher { case 0: return KeeperState.Disconnected; case 1: return KeeperState.NoSyncConnected; case 3: return KeeperState.SyncConnected; + case 4: return KeeperState.AuthFailed; case -112: return KeeperState.Expired; default: Modified: hadoop/zookeeper/branches/branch-3.3/src/java/test/org/apache/zookeeper/test/AuthTest.java URL: http://svn.apache.org/viewvc/hadoop/zookeeper/branches/branch-3.3/src/java/test/org/apache/zookeeper/test/AuthTest.java?rev=1005103&r1=1005102&r2=1005103&view=diff ============================================================================== --- hadoop/zookeeper/branches/branch-3.3/src/java/test/org/apache/zookeeper/test/AuthTest.java (original) +++ hadoop/zookeeper/branches/branch-3.3/src/java/test/org/apache/zookeeper/test/AuthTest.java Wed Oct 6 16:18:46 2010 @@ -18,11 +18,19 @@ package org.apache.zookeeper.test; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; + import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.TestableZooKeeper; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; -import org.junit.Test; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.test.ClientBase; +import org.junit.Assert; +import org.junit.Test; public class AuthTest extends ClientBase { static { @@ -30,6 +38,44 @@ public class AuthTest extends ClientBase System.setProperty("zookeeper.DigestAuthenticationProvider.superDigest", "super:D/InIHSb7yEEbrWz8b9l71RjZJU="); } + + private AtomicInteger authFailed = new AtomicInteger(0); + + @Override + protected TestableZooKeeper createClient(String hp) + throws IOException, InterruptedException + { + MyWatcher watcher = new MyWatcher(); + return createClient(watcher, hp); + } + + private class MyWatcher extends CountdownWatcher { + @Override + public synchronized void process(WatchedEvent event) { + if (event.getState() == KeeperState.AuthFailed) { + authFailed.incrementAndGet(); + } + else { + super.process(event); + } + } + } + + @Test + public void testBadAuthNotifiesWatch() throws Exception { + ZooKeeper zk = createClient(); + try { + zk.addAuthInfo("FOO", "BAR".getBytes()); + zk.getData("/path1", false, null); + Assert.fail("Should get auth state error"); + } catch(KeeperException.AuthFailedException e) { + Assert.assertEquals("Should have called my watcher", + 1, authFailed.get()); + } + finally { + zk.close(); + } + } @Test public void testSuper() throws Exception {