mirror of https://github.com/redis/redis.git
				
				
				
			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…
	
		Reference in New Issue