mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
ACL: better define name, and the idea of reserved ID.
This commit is contained in:
parent
711e514ea4
commit
70e541b7bc
17
src/acl.c
17
src/acl.c
@ -122,7 +122,7 @@ user *ACLCreateUser(const char *name, size_t namelen) {
|
|||||||
* bit. The function returns C_ERR in case the specified ID overflows
|
* bit. The function returns C_ERR in case the specified ID overflows
|
||||||
* the bitmap in the user representation. */
|
* the bitmap in the user representation. */
|
||||||
int ACLGetCommandBitCoordinates(unsigned long id, uint64_t *word, uint64_t *bit) {
|
int ACLGetCommandBitCoordinates(unsigned long id, uint64_t *word, uint64_t *bit) {
|
||||||
if (id >= USER_MAX_COMMAND_BIT) return C_ERR;
|
if (id >= USER_COMMAND_BITS_COUNT) return C_ERR;
|
||||||
*word = id / sizeof(uint64_t) / 8;
|
*word = id / sizeof(uint64_t) / 8;
|
||||||
*bit = 1 << (id % (sizeof(uint64_t) * 8));
|
*bit = 1 << (id % (sizeof(uint64_t) * 8));
|
||||||
return C_OK;
|
return C_OK;
|
||||||
@ -317,7 +317,7 @@ int ACLSetUser(user *u, const char *op, ssize_t oplen) {
|
|||||||
/* If this is the first subcommand to be configured for
|
/* If this is the first subcommand to be configured for
|
||||||
* this user, we have to allocate the subcommands array. */
|
* this user, we have to allocate the subcommands array. */
|
||||||
if (u->allowed_subcommands == NULL) {
|
if (u->allowed_subcommands == NULL) {
|
||||||
u->allowed_subcommands = zcalloc(USER_MAX_COMMAND_BIT *
|
u->allowed_subcommands = zcalloc(USER_COMMAND_BITS_COUNT *
|
||||||
sizeof(sds*));
|
sizeof(sds*));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,7 +439,18 @@ unsigned long ACLGetCommandID(const char *cmdname) {
|
|||||||
raxInsert(map,(unsigned char*)lowername,strlen(lowername),
|
raxInsert(map,(unsigned char*)lowername,strlen(lowername),
|
||||||
(void*)nextid,NULL);
|
(void*)nextid,NULL);
|
||||||
sdsfree(lowername);
|
sdsfree(lowername);
|
||||||
return nextid++;
|
nextid++;
|
||||||
|
|
||||||
|
/* We never assign the last bit in the user commands bitmap structure,
|
||||||
|
* this way we can later check if this bit is set, understanding if the
|
||||||
|
* current ACL for the user was created starting with a +@all to add all
|
||||||
|
* the possible commands and just subtracting other single commands or
|
||||||
|
* categories, or if, instead, the ACL was created just adding commands
|
||||||
|
* and command categories from scratch, not allowing future commands by
|
||||||
|
* default (loaded via modules). This is useful when rewriting the ACLs
|
||||||
|
* with ACL SAVE. */
|
||||||
|
if (nextid == USER_COMMAND_BITS_COUNT-1) nextid++;
|
||||||
|
return nextid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return an username by its name, or NULL if the user does not exist. */
|
/* Return an username by its name, or NULL if the user does not exist. */
|
||||||
|
10
src/server.h
10
src/server.h
@ -712,8 +712,10 @@ typedef struct readyList {
|
|||||||
/* This structure represents a Redis user. This is useful for ACLs, the
|
/* This structure represents a Redis user. This is useful for ACLs, the
|
||||||
* user is associated to the connection after the connection is authenticated.
|
* user is associated to the connection after the connection is authenticated.
|
||||||
* If there is no associated user, the connection uses the default user. */
|
* If there is no associated user, the connection uses the default user. */
|
||||||
#define USER_MAX_COMMAND_BIT 1024 /* The first *not valid* bit that
|
#define USER_COMMAND_BITS_COUNT 1024 /* The total number of command bits
|
||||||
would overflow. So check for >= */
|
in the user structure. The last valid
|
||||||
|
command ID we can set in the user
|
||||||
|
is USER_COMMAND_BITS_COUNT-1. */
|
||||||
#define USER_FLAG_ENABLED (1<<0) /* The user is active. */
|
#define USER_FLAG_ENABLED (1<<0) /* The user is active. */
|
||||||
#define USER_FLAG_ALLKEYS (1<<1) /* The user can mention any key. */
|
#define USER_FLAG_ALLKEYS (1<<1) /* The user can mention any key. */
|
||||||
#define USER_FLAG_ALLCOMMANDS (1<<2) /* The user can run all commands. */
|
#define USER_FLAG_ALLCOMMANDS (1<<2) /* The user can run all commands. */
|
||||||
@ -734,13 +736,13 @@ typedef struct user {
|
|||||||
* If the bit for a given command is NOT set and the command has
|
* If the bit for a given command is NOT set and the command has
|
||||||
* subcommands, Redis will also check allowed_subcommands in order to
|
* subcommands, Redis will also check allowed_subcommands in order to
|
||||||
* understand if the command can be executed. */
|
* understand if the command can be executed. */
|
||||||
uint64_t allowed_commands[USER_MAX_COMMAND_BIT/64];
|
uint64_t allowed_commands[USER_COMMAND_BITS_COUNT/64];
|
||||||
|
|
||||||
/* This array points, for each command ID (corresponding to the command
|
/* This array points, for each command ID (corresponding to the command
|
||||||
* bit set in allowed_commands), to an array of SDS strings, terminated by
|
* bit set in allowed_commands), to an array of SDS strings, terminated by
|
||||||
* a NULL pointer, with all the sub commands that can be executed for
|
* a NULL pointer, with all the sub commands that can be executed for
|
||||||
* this command. When no subcommands matching is used, the field is just
|
* this command. When no subcommands matching is used, the field is just
|
||||||
* set to NULL to avoid allocating USER_MAX_COMMAND_BIT pointers. */
|
* set to NULL to avoid allocating USER_COMMAND_BITS_COUNT pointers. */
|
||||||
sds **allowed_subcommands;
|
sds **allowed_subcommands;
|
||||||
list *passwords; /* A list of SDS valid passwords for this user. */
|
list *passwords; /* A list of SDS valid passwords for this user. */
|
||||||
list *patterns; /* A list of allowed key patterns. If this field is NULL
|
list *patterns; /* A list of allowed key patterns. If this field is NULL
|
||||||
|
Loading…
x
Reference in New Issue
Block a user