Skip to content

Commit 1a451e4

Browse files
authored
Address ACL V2 changes (#2841)
* Address ACL V2 changes * Address ACL V2 changes (approach 2)
1 parent c27794f commit 1a451e4

File tree

3 files changed

+51
-21
lines changed

3 files changed

+51
-21
lines changed

src/main/java/redis/clients/jedis/BuilderFactory.java

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -699,42 +699,59 @@ public AccessControlUser build(Object data) {
699699
return null;
700700
}
701701

702-
List<List<Object>> objectList = (List<List<Object>>) data;
702+
List<Object> objectList = (List<Object>) data;
703703
if (objectList.isEmpty()) {
704704
return null;
705705
}
706706

707707
AccessControlUser accessControlUser = new AccessControlUser();
708708

709709
// flags
710-
List<Object> flags = objectList.get(1);
710+
List<Object> flags = (List<Object>) objectList.get(1);
711711
for (Object f : flags) {
712712
accessControlUser.addFlag(SafeEncoder.encode((byte[]) f));
713713
}
714714

715715
// passwords
716-
List<Object> passwords = objectList.get(3);
716+
List<Object> passwords = (List<Object>) objectList.get(3);
717717
for (Object p : passwords) {
718718
accessControlUser.addPassword(SafeEncoder.encode((byte[]) p));
719719
}
720720

721721
// commands
722-
accessControlUser.setCommands(SafeEncoder.encode((byte[]) (Object) objectList.get(5)));
722+
accessControlUser.setCommands(SafeEncoder.encode((byte[]) objectList.get(5)));
723723

724-
// keys
725-
List<Object> keys = objectList.get(7);
726-
for (Object k : keys) {
727-
accessControlUser.addKey(SafeEncoder.encode((byte[]) k));
728-
}
724+
// Redis 7 -->
725+
boolean withSelectors = objectList.size() >= 12;
726+
if (!withSelectors) {
727+
728+
// keys
729+
List<Object> keys = (List<Object>) objectList.get(7);
730+
for (Object k : keys) {
731+
accessControlUser.addKey(SafeEncoder.encode((byte[]) k));
732+
}
729733

730-
// before redis 6.2, no channels info
731-
if (objectList.size() > 9) {
732-
List<Object> channels = objectList.get(9);
733-
for (Object channel : channels) {
734-
accessControlUser.addChannel(SafeEncoder.encode((byte[]) channel));
734+
// Redis 6.2 -->
735+
// channels
736+
if (objectList.size() >= 10) {
737+
List<Object> channels = (List<Object>) objectList.get(9);
738+
for (Object channel : channels) {
739+
accessControlUser.addChannel(SafeEncoder.encode((byte[]) channel));
740+
}
735741
}
742+
743+
} else {
744+
// TODO: Proper implementation of ACL V2.
745+
746+
// keys
747+
accessControlUser.addKeys(SafeEncoder.encode((byte[]) objectList.get(7)));
748+
749+
// channels
750+
accessControlUser.addChannels(SafeEncoder.encode((byte[]) objectList.get(9)));
736751
}
737752

753+
// selectors
754+
// TODO: Proper implementation of ACL V2.
738755
return accessControlUser;
739756
}
740757

src/main/java/redis/clients/jedis/resps/AccessControlUser.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package redis.clients.jedis.resps;
22

33
import java.util.ArrayList;
4+
import java.util.Arrays;
45
import java.util.List;
56

67
public class AccessControlUser {
@@ -30,6 +31,12 @@ public List<String> getKeys() {
3031
return keys;
3132
}
3233

34+
public void addKeys(String keys) {
35+
if (!keys.isEmpty()) {
36+
this.keys.addAll(Arrays.asList(keys.split(" ")));
37+
}
38+
}
39+
3340
public void addPassword(String password) {
3441
passwords.add(password);
3542
}
@@ -39,13 +46,19 @@ public List<String> getPassword() {
3946
}
4047

4148
public void addChannel(String channel) {
42-
channels.add(channel);
49+
channels.add(channel);
4350
}
4451

4552
public List<String> getChannels() {
4653
return channels;
4754
}
4855

56+
public void addChannels(String channels) {
57+
if (!channels.isEmpty()) {
58+
this.channels.addAll(Arrays.asList(channels.split(" ")));
59+
}
60+
}
61+
4962
public String getCommands() {
5063
return commands;
5164
}
@@ -56,7 +69,7 @@ public void setCommands(String commands) {
5669

5770
@Override
5871
public String toString() {
59-
return "AccessControlUser{" + "flags=" + flags + ", keys=" + keys + ", passwords=" + passwords
60-
+ ", commands='" + commands + ", channels='" + channels + '\'' + '}';
72+
return "AccessControlUser{" + "flags=" + flags + ", passwords=" + passwords
73+
+ ", commands='" + commands + "', keys='" + keys + "', channels='" + channels + "'}";
6174
}
6275
}

src/test/java/redis/clients/jedis/commands/jedis/AccessControlListCommandsTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,16 @@ public void aclGetUser() {
7575
// get default user information
7676
AccessControlUser userInfo = jedis.aclGetUser("default");
7777

78-
assertEquals(4, userInfo.getFlags().size());
78+
assertEquals(1, userInfo.getFlags().size());
7979
assertEquals(1, userInfo.getPassword().size());
8080
assertEquals("+@all", userInfo.getCommands());
81-
assertEquals("*", userInfo.getKeys().get(0));
81+
assertEquals("~*", userInfo.getKeys().get(0));
8282

8383
// create new user
8484
jedis.aclDelUser(USER_ZZZ);
8585
jedis.aclSetUser(USER_ZZZ);
8686
userInfo = jedis.aclGetUser(USER_ZZZ);
87-
assertEquals(2, userInfo.getFlags().size());
87+
assertEquals(1, userInfo.getFlags().size());
8888
assertEquals("off", userInfo.getFlags().get(0));
8989
assertTrue(userInfo.getPassword().isEmpty());
9090
assertTrue(userInfo.getKeys().isEmpty());
@@ -462,7 +462,7 @@ public void aclBinaryCommandsTest() {
462462
assertThat(userInfo.getCommands(), containsString("+@all"));
463463
assertThat(userInfo.getCommands(), containsString("-@string"));
464464
assertThat(userInfo.getCommands(), containsString("+debug|digest"));
465-
assertEquals("testchannel:*", userInfo.getChannels().get(0));
465+
assertEquals("&testchannel:*", userInfo.getChannels().get(0));
466466

467467
jedis.aclDelUser(USER_ZZZ.getBytes());
468468

0 commit comments

Comments
 (0)