这个注释很清楚了:
/* Create a new user with the specified name, store it in the list
* of users (the Users global radix tree), and returns a reference to
* the structure representing the user.
*
* If the user with such name already exists NULL is returned. */
-
- user *ACLCreateUser(const char *name, size_t namelen) {
- if (raxFind(Users,(unsigned char*)name,namelen) != raxNotFound) return NULL;
- user *u = zmalloc(sizeof(*u));
- u->name = sdsnewlen(name,namelen);
- u->flags = USER_FLAG_DISABLED | server.acl_pubsub_default;
- u->allowed_subcommands = NULL;
- u->passwords = listCreate();
- u->patterns = listCreate();
- u->channels = listCreate();
- listSetMatchMethod(u->passwords,ACLListMatchSds);
- listSetFreeMethod(u->passwords,ACLListFreeSds);
- listSetDupMethod(u->passwords,ACLListDupSds);
- listSetMatchMethod(u->patterns,ACLListMatchSds);
- listSetFreeMethod(u->patterns,ACLListFreeSds);
- listSetDupMethod(u->patterns,ACLListDupSds);
- listSetMatchMethod(u->channels,ACLListMatchSds);
- listSetFreeMethod(u->channels,ACLListFreeSds);
- listSetDupMethod(u->channels,ACLListDupSds);
- memset(u->allowed_commands,0,sizeof(u->allowed_commands));
- raxInsert(Users,(unsigned char*)name,namelen,u,NULL);
- return u;
- }
-
- /* This function should be called when we need an unlinked "fake" user
- * we can use in order to validate ACL rules or for other similar reasons.
- * The user will not get linked to the Users radix tree. The returned
- * user should be released with ACLFreeUser() as usually. */
- user *ACLCreateUnlinkedUser(void) {
- char username[64];
- for (int j = 0; ; j++) {
- snprintf(username,sizeof(username),"__fakeuser:%d__",j);
- user *fakeuser = ACLCreateUser(username,strlen(username));
- if (fakeuser == NULL) continue;
- int retval = raxRemove(Users,(unsigned char*) username,
- strlen(username),NULL);
- serverAssert(retval != 0);
- return fakeuser;
- }
- }