From fe4ea7b92107f2dd27b3a1d8205de618818a4953 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Tue, 25 Jan 2022 20:24:59 +0600 Subject: [PATCH 1/2] Address ACL V2 changes --- .../redis/clients/jedis/BuilderFactory.java | 45 ++++++++----- .../jedis/resps/AccessControlUser.java | 63 ++++++++++++++++--- .../jedis/AccessControlListCommandsTest.java | 10 +-- 3 files changed, 92 insertions(+), 26 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java index c5ce38eaf3..54b785e2d7 100644 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -699,7 +699,7 @@ public AccessControlUser build(Object data) { return null; } - List> objectList = (List>) data; + List objectList = (List) data; if (objectList.isEmpty()) { return null; } @@ -707,34 +707,51 @@ public AccessControlUser build(Object data) { AccessControlUser accessControlUser = new AccessControlUser(); // flags - List flags = objectList.get(1); + List flags = (List) objectList.get(1); for (Object f : flags) { accessControlUser.addFlag(SafeEncoder.encode((byte[]) f)); } // passwords - List passwords = objectList.get(3); + List passwords = (List) objectList.get(3); for (Object p : passwords) { accessControlUser.addPassword(SafeEncoder.encode((byte[]) p)); } // commands - accessControlUser.setCommands(SafeEncoder.encode((byte[]) (Object) objectList.get(5))); + accessControlUser.setCommands(SafeEncoder.encode((byte[]) objectList.get(5))); - // keys - List keys = objectList.get(7); - for (Object k : keys) { - accessControlUser.addKey(SafeEncoder.encode((byte[]) k)); - } + // Redis 7 --> + boolean withSelectors = objectList.size() >= 12; + if (!withSelectors) { + + // keys + List keys = (List) objectList.get(7); + for (Object k : keys) { + accessControlUser.addKey(SafeEncoder.encode((byte[]) k)); + } - // before redis 6.2, no channels info - if (objectList.size() > 9) { - List channels = objectList.get(9); - for (Object channel : channels) { - accessControlUser.addChannel(SafeEncoder.encode((byte[]) channel)); + // Redis 6.2 --> + // channels + if (objectList.size() >= 10) { + List channels = (List) objectList.get(9); + for (Object channel : channels) { + accessControlUser.addChannel(SafeEncoder.encode((byte[]) channel)); + } } + + } else { + // TODO: Proper implementation of ACL V2. + + // keys + accessControlUser.setKeys(SafeEncoder.encode((byte[]) objectList.get(7))); + + // channels + accessControlUser.setChannels(SafeEncoder.encode((byte[]) objectList.get(9))); } + // selectors + // TODO: Proper implementation of ACL V2. return accessControlUser; } diff --git a/src/main/java/redis/clients/jedis/resps/AccessControlUser.java b/src/main/java/redis/clients/jedis/resps/AccessControlUser.java index 129d3104a8..73b97a5667 100644 --- a/src/main/java/redis/clients/jedis/resps/AccessControlUser.java +++ b/src/main/java/redis/clients/jedis/resps/AccessControlUser.java @@ -6,9 +6,11 @@ public class AccessControlUser { private final List flags = new ArrayList<>(); - private final List keys = new ArrayList<>(); + private final List keysList = new ArrayList<>(); + private String keysString; private final List passwords = new ArrayList<>(); - private final List channels = new ArrayList<>(); + private final List channelsList = new ArrayList<>(); + private String channelsString; private String commands; public AccessControlUser() { @@ -23,11 +25,33 @@ public List getFlags() { } public void addKey(String key) { - keys.add(key); + keysList.add(key); } + /** + * @deprecated Use {@link AccessControlUser#getKeysList()}. + */ + @Deprecated public List getKeys() { - return keys; + return keysList; + } + + /** + * For Redis version below 7. + */ + public List getKeysList() { + return keysList; + } + + /** + * For Redis version from 7. + */ + public String getKeysString() { + return keysString; + } + + public void setKeys(String keys) { + this.keysString = keys; } public void addPassword(String password) { @@ -39,11 +63,33 @@ public List getPassword() { } public void addChannel(String channel) { - channels.add(channel); + channelsList.add(channel); } + /** + * @deprecated Use {@link AccessControlUser#getChannelsList()}. + */ + @Deprecated public List getChannels() { - return channels; + return channelsList; + } + + /** + * For Redis version below 7. + */ + public List getChannelsList() { + return channelsList; + } + + /** + * For Redis version from 7. + */ + public String getChannelsString() { + return channelsString; + } + + public void setChannels(String channels) { + this.channelsString = channels; } public String getCommands() { @@ -56,7 +102,8 @@ public void setCommands(String commands) { @Override public String toString() { - return "AccessControlUser{" + "flags=" + flags + ", keys=" + keys + ", passwords=" + passwords - + ", commands='" + commands + ", channels='" + channels + '\'' + '}'; + return "AccessControlUser{" + "flags=" + flags + ", passwords=" + passwords + ", commands='" + commands + + "', keys='" + (keysString != null ? keysString : keysList) + + "', channels='" + (channelsString != null ? channelsString : channelsList) + "'}"; } } diff --git a/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java b/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java index c5d04e0143..566f917225 100644 --- a/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java +++ b/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java @@ -75,16 +75,17 @@ public void aclGetUser() { // get default user information AccessControlUser userInfo = jedis.aclGetUser("default"); - assertEquals(4, userInfo.getFlags().size()); + assertEquals(1, userInfo.getFlags().size()); assertEquals(1, userInfo.getPassword().size()); assertEquals("+@all", userInfo.getCommands()); - assertEquals("*", userInfo.getKeys().get(0)); +// assertEquals("*", userInfo.getKeys().get(0)); + assertEquals("~*", userInfo.getKeysString()); // create new user jedis.aclDelUser(USER_ZZZ); jedis.aclSetUser(USER_ZZZ); userInfo = jedis.aclGetUser(USER_ZZZ); - assertEquals(2, userInfo.getFlags().size()); + assertEquals(1, userInfo.getFlags().size()); assertEquals("off", userInfo.getFlags().get(0)); assertTrue(userInfo.getPassword().isEmpty()); assertTrue(userInfo.getKeys().isEmpty()); @@ -462,7 +463,8 @@ public void aclBinaryCommandsTest() { assertThat(userInfo.getCommands(), containsString("+@all")); assertThat(userInfo.getCommands(), containsString("-@string")); assertThat(userInfo.getCommands(), containsString("+debug|digest")); - assertEquals("testchannel:*", userInfo.getChannels().get(0)); +// assertEquals("testchannel:*", userInfo.getChannels().get(0)); + assertEquals("&testchannel:*", userInfo.getChannelsString()); jedis.aclDelUser(USER_ZZZ.getBytes()); From 11723144870c40ef586bf5093dca383b938149e3 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Tue, 25 Jan 2022 20:57:29 +0600 Subject: [PATCH 2/2] Address ACL V2 changes (approach 2) --- .../redis/clients/jedis/BuilderFactory.java | 4 +- .../jedis/resps/AccessControlUser.java | 68 +++++-------------- .../jedis/AccessControlListCommandsTest.java | 6 +- 3 files changed, 21 insertions(+), 57 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java index 54b785e2d7..afa6032a19 100644 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -744,10 +744,10 @@ public AccessControlUser build(Object data) { // TODO: Proper implementation of ACL V2. // keys - accessControlUser.setKeys(SafeEncoder.encode((byte[]) objectList.get(7))); + accessControlUser.addKeys(SafeEncoder.encode((byte[]) objectList.get(7))); // channels - accessControlUser.setChannels(SafeEncoder.encode((byte[]) objectList.get(9))); + accessControlUser.addChannels(SafeEncoder.encode((byte[]) objectList.get(9))); } // selectors diff --git a/src/main/java/redis/clients/jedis/resps/AccessControlUser.java b/src/main/java/redis/clients/jedis/resps/AccessControlUser.java index 73b97a5667..6013a8f760 100644 --- a/src/main/java/redis/clients/jedis/resps/AccessControlUser.java +++ b/src/main/java/redis/clients/jedis/resps/AccessControlUser.java @@ -1,16 +1,15 @@ package redis.clients.jedis.resps; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class AccessControlUser { private final List flags = new ArrayList<>(); - private final List keysList = new ArrayList<>(); - private String keysString; + private final List keys = new ArrayList<>(); private final List passwords = new ArrayList<>(); - private final List channelsList = new ArrayList<>(); - private String channelsString; + private final List channels = new ArrayList<>(); private String commands; public AccessControlUser() { @@ -25,33 +24,17 @@ public List getFlags() { } public void addKey(String key) { - keysList.add(key); + keys.add(key); } - /** - * @deprecated Use {@link AccessControlUser#getKeysList()}. - */ - @Deprecated public List getKeys() { - return keysList; + return keys; } - /** - * For Redis version below 7. - */ - public List getKeysList() { - return keysList; - } - - /** - * For Redis version from 7. - */ - public String getKeysString() { - return keysString; - } - - public void setKeys(String keys) { - this.keysString = keys; + public void addKeys(String keys) { + if (!keys.isEmpty()) { + this.keys.addAll(Arrays.asList(keys.split(" "))); + } } public void addPassword(String password) { @@ -63,33 +46,17 @@ public List getPassword() { } public void addChannel(String channel) { - channelsList.add(channel); + channels.add(channel); } - /** - * @deprecated Use {@link AccessControlUser#getChannelsList()}. - */ - @Deprecated public List getChannels() { - return channelsList; - } - - /** - * For Redis version below 7. - */ - public List getChannelsList() { - return channelsList; - } - - /** - * For Redis version from 7. - */ - public String getChannelsString() { - return channelsString; + return channels; } - public void setChannels(String channels) { - this.channelsString = channels; + public void addChannels(String channels) { + if (!channels.isEmpty()) { + this.channels.addAll(Arrays.asList(channels.split(" "))); + } } public String getCommands() { @@ -102,8 +69,7 @@ public void setCommands(String commands) { @Override public String toString() { - return "AccessControlUser{" + "flags=" + flags + ", passwords=" + passwords + ", commands='" + commands - + "', keys='" + (keysString != null ? keysString : keysList) - + "', channels='" + (channelsString != null ? channelsString : channelsList) + "'}"; + return "AccessControlUser{" + "flags=" + flags + ", passwords=" + passwords + + ", commands='" + commands + "', keys='" + keys + "', channels='" + channels + "'}"; } } diff --git a/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java b/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java index 566f917225..cd4dd1197e 100644 --- a/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java +++ b/src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java @@ -78,8 +78,7 @@ public void aclGetUser() { assertEquals(1, userInfo.getFlags().size()); assertEquals(1, userInfo.getPassword().size()); assertEquals("+@all", userInfo.getCommands()); -// assertEquals("*", userInfo.getKeys().get(0)); - assertEquals("~*", userInfo.getKeysString()); + assertEquals("~*", userInfo.getKeys().get(0)); // create new user jedis.aclDelUser(USER_ZZZ); @@ -463,8 +462,7 @@ public void aclBinaryCommandsTest() { assertThat(userInfo.getCommands(), containsString("+@all")); assertThat(userInfo.getCommands(), containsString("-@string")); assertThat(userInfo.getCommands(), containsString("+debug|digest")); -// assertEquals("testchannel:*", userInfo.getChannels().get(0)); - assertEquals("&testchannel:*", userInfo.getChannelsString()); + assertEquals("&testchannel:*", userInfo.getChannels().get(0)); jedis.aclDelUser(USER_ZZZ.getBytes());