X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=UserNode.c;h=2ced2eb5b88d3f3129173b9b867a0fbf3823d048;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=0e50b58c3b1137ea01a816ff346fbefc5bfbcd24;hpb=54f70a7e7d874c8b7ce0622b08cd62b594da5afb;p=NeonServV5.git diff --git a/UserNode.c b/UserNode.c index 0e50b58..2ced2eb 100644 --- a/UserNode.c +++ b/UserNode.c @@ -1,10 +1,25 @@ #include "UserNode.h" +#include "ChanUser.h" +#include "tools.h" static struct UserNode **userList; void init_UserNode() { - userList = calloc(VALID_NICK_CHARS_FIRST_LEN, sizeof(*userList)); - + userList = calloc(VALID_NICK_CHARS_FIRST_LEN+1, sizeof(*userList)); +} + +void free_UserNode() { + //kamikaze free all users + //chanusers will be destroyed in free_ChanNode() + int i; + struct UserNode *user, *next; + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(user = userList[i]; user; user = next) { + next = user->next; + free(user); + } + } + free(userList); } int is_valid_nick(const char *nick) { @@ -21,18 +36,18 @@ int is_valid_nick(const char *nick) { return 1; } -static int get_nicklist_entry(const char *nick) { +static int get_nicklist_entry(int nick) { int i; - char valid_chars = VALID_NICK_CHARS_FIRST; + char *valid_chars = VALID_NICK_CHARS_FIRST; for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN; i++) { - if(valid_chars[i] == *nick) + if(valid_chars[i] == nick) return i; } return -1; //ERROR! } struct UserNode* getUserByNick(const char *nick) { //case sensitive - int userListIndex = get_nicklist_entry(nick); + int userListIndex = get_nicklist_entry(*nick); if(userListIndex == -1 || userList[userListIndex] == NULL) return NULL; struct UserNode *user; @@ -43,6 +58,24 @@ struct UserNode* getUserByNick(const char *nick) { //case sensitive return NULL; } +struct UserNode* getUserByMask(const char *mask) { //case sensitive + char cmask[strlen(mask)+1]; + strcpy(cmask, mask); + int i; + struct UserNode *user = NULL; + for(i = 0; i < strlen(mask); i++) { + if(cmask[i] == '!') { + cmask[i] = 0; + user = getUserByNick(&cmask[0]); + return user; + } else if(cmask[i] == '.') { + //it's a server + return NULL; + } + } + return NULL; +} + struct UserNode* searchUserByNick(const char *nick) { //case insensitive if(!isalpha(*nick)) return getUserByNick(nick); @@ -51,7 +84,7 @@ struct UserNode* searchUserByNick(const char *nick) { //case insensitive struct UserNode *user; //search in the lower case "section" - userListIndex = get_nicklist_entry(tolower(nick)); + userListIndex = get_nicklist_entry(tolower(*nick)); if(userListIndex != -1 && userList[userListIndex] != NULL) { for(user = userList[userListIndex]; user; user = user->next) { if(!stricmp(nick, user->nick)) @@ -59,7 +92,7 @@ struct UserNode* searchUserByNick(const char *nick) { //case insensitive } } //search in the upper case "section" - userListIndex = get_nicklist_entry(toupper(nick)); + userListIndex = get_nicklist_entry(toupper(*nick)); if(userListIndex != -1 && userList[userListIndex] != NULL) { for(user = userList[userListIndex]; user; user = user->next) { if(!stricmp(nick, user->nick)) @@ -69,17 +102,70 @@ struct UserNode* searchUserByNick(const char *nick) { //case insensitive return NULL; } +int countUsersWithHost(char *host) { + int i, count = 0; + struct UserNode *user; + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(user = userList[i]; user; user = user->next) { + if(!strcmp(user->host, host)) { + count++; + } + } + } + return count; +} + +char *getAuthFakehost(char *auth) { + int i; + struct UserNode *user; + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(user = userList[i]; user; user = user->next) { + if((user->flags & USERFLAG_ISAUTHED) && !strcmp(user->auth, auth) && isFakeHost(user->host)) { + return user->host; + } + } + } + return NULL; +} + +struct UserNode* getAllUsers(struct UserNode *last) { + if(last == NULL || last->next == NULL) { + int cindex; + if(last == NULL) + cindex = 0; + else + cindex = get_nicklist_entry(last->nick[0]) + 1; + while(userList[cindex] == NULL && cindex <= VALID_NICK_CHARS_FIRST_LEN) + cindex++; + if(cindex > VALID_NICK_CHARS_FIRST_LEN) return NULL; + return userList[cindex]; + } else + return last->next; +} + +int getUserCount() { + int i, count = 0; + struct UserNode *user; + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(user = userList[i]; user; user = user->next) { + count++; + } + } + return count; +} + struct UserNode* addUser(const char *nick) { - int userListIndex = get_nicklist_entry(nick); + int userListIndex = get_nicklist_entry(*nick); if(userListIndex == -1 || !is_valid_nick(nick)) return NULL; struct UserNode *user = malloc(sizeof(*user)); if (!user) { perror("malloc() failed"); - return; + return NULL; } strcpy(user->nick, nick); + user->created = time(0); user->ident[0] = 0; user->host[0] = 0; user->realname[0] = 0; @@ -87,6 +173,102 @@ struct UserNode* addUser(const char *nick) { user->channel = NULL; user->next = userList[userListIndex]; userList[userListIndex] = user; + return user; +} + +struct UserNode* addUserMask(const char *mask) { + char cmask[strlen(mask)+1]; + strcpy(cmask, mask); + int i, ii = 0; + struct UserNode *user = NULL; + for(i = 0; i < strlen(mask)+1; i++) { + if(cmask[i] == '!') { + cmask[i] = 0; + user = addUser(cmask); + if(user == NULL) return NULL; + ii = i+1; + } else if(cmask[i] == '.' && !user) { + //it's a server + return NULL; + } else if(cmask[i] == '@') { + if(user == NULL) return NULL; + cmask[i] = 0; + strcpy(user->ident, &cmask[ii]); + ii = i+1; + } else if(cmask[i] == '\0') { + if(user == NULL) return NULL; + strcpy(user->host, &cmask[ii]); + } + } + return user; +} + +struct UserNode* createTempUser(const char *mask) { + //note: it could also be a server we have to create a temponary user for... + char cmask[strlen(mask)+1]; + strcpy(cmask, mask); + int i, ii = 0; + struct UserNode *user = NULL; + for(i = 0; i < strlen(mask)+1; i++) { + if(cmask[i] == '!') { + cmask[i] = 0; + user = malloc(sizeof(*user)); + if (!user) + { + perror("malloc() failed"); + return NULL; + } + strcpy(user->nick, cmask); + user->created = time(0); + user->ident[0] = 0; + user->host[0] = 0; + user->realname[0] = 0; + user->flags = 0; + user->channel = NULL; + ii = i+1; + } else if(cmask[i] == '.' && !user) { + //it's a server + user = malloc(sizeof(*user)); + if (!user) + { + perror("malloc() failed"); + return NULL; + } + strcpy(user->host, cmask); + user->created = time(0); + user->ident[0] = 0; + user->host[0] = 0; + user->realname[0] = 0; + user->flags = USERFLAG_ISSERVER; + user->channel = NULL; + return user; + } else if(cmask[i] == '@') { + if(user == NULL) return NULL; + cmask[i] = 0; + strcpy(user->ident, &cmask[ii]); + ii = i+1; + } else if(cmask[i] == '\0') { + if(user == NULL) { + //nick only + user = malloc(sizeof(*user)); + if (!user) + { + perror("malloc() failed"); + return NULL; + } + strcpy(user->nick, cmask); + user->created = time(0); + user->ident[0] = 0; + user->host[0] = 0; + user->realname[0] = 0; + user->flags = 0; + user->channel = NULL; + return user; + } + strcpy(user->host, &cmask[ii]); + } + } + return user; } int renameUser(struct UserNode* user, const char *new_nick) { @@ -96,7 +278,7 @@ int renameUser(struct UserNode* user, const char *new_nick) { strcpy(user->nick, new_nick); return 1; } - int userListIndex = get_nicklist_entry(new_nick); + int userListIndex = get_nicklist_entry(*new_nick); delUser(user, 0); strcpy(user->nick, new_nick); user->next = userList[userListIndex]; @@ -105,7 +287,7 @@ int renameUser(struct UserNode* user, const char *new_nick) { } void delUser(struct UserNode* user, int freeUser) { - int userListIndex = get_nicklist_entry(user->nick); + int userListIndex = get_nicklist_entry(user->nick[0]); if(userListIndex == -1) return; struct UserNode *cuser, *last_user = NULL; for(cuser = userList[userListIndex]; cuser; cuser = cuser->next) { @@ -118,8 +300,32 @@ void delUser(struct UserNode* user, int freeUser) { } else last_user = cuser; } + if(user->channel) { + struct ChanUser *chanUser, *next; + for(chanUser = user->channel; chanUser; chanUser = next) { + next = chanUser->next_chan; + removeChanUserFromLists(chanUser, 1, 0, freeUser); + } + } if(freeUser) free(user); else user->next = NULL; } + +void clearTempUsers() { + int userListIndex = TEMPUSER_LIST_INDEX; + struct UserNode *cuser, *last_user = NULL, *next; + time_t now = time(0); + for(cuser = userList[userListIndex]; cuser; cuser = next) { + next = cuser->next; + if(cuser->flags & USERFLAG_FREETMPUSER || now - cuser->created >= 300) { + if(last_user) + last_user->next = cuser->next; + else + userList[userListIndex] = cuser->next; + break; + } else + last_user = cuser; + } +}