X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FUserNode.c;h=21b618d1118b51a16fac594e638f44976378ba6b;hb=727b8a503f88131d92025bc43e3803d4a7c2aa00;hp=11d45942a8a349f40671b92e749ab512912c2df6;hpb=44436a96352a38631237978c9fd431cef3d85cfb;p=NeonServV5.git diff --git a/src/UserNode.c b/src/UserNode.c index 11d4594..21b618d 100644 --- a/src/UserNode.c +++ b/src/UserNode.c @@ -1,5 +1,5 @@ /* UserNode.c - NeonServ v5.3 - * Copyright (C) 2011 Philipp Kreil (pk910) + * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,7 @@ #include "ChanUser.h" #include "tools.h" #include "IRCEvents.h" +#include "IPNode.h" static struct UserNode **userList; @@ -122,7 +123,7 @@ struct UserNode* searchUserByNick(const char *nick) { //case insensitive int countUsersWithHost(char *host) { int i, count = 0; struct UserNode *user; - for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN; i++) { for(user = userList[i]; user; user = user->next) { if(!strcmp(user->host, host)) { count++; @@ -135,7 +136,7 @@ int countUsersWithHost(char *host) { char *getAuthFakehost(char *auth) { int i; struct UserNode *user; - for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN; i++) { for(user = userList[i]; user; user = user->next) { if((user->flags & USERFLAG_ISAUTHED) && !strcmp(user->auth, auth) && isFakeHost(user->host)) { return user->host; @@ -152,7 +153,7 @@ struct UserNode* getAllUsers(struct UserNode *last) { cindex = 0; else cindex = get_nicklist_entry(last->nick[0]) + 1; - while(userList[cindex] == NULL && cindex <= VALID_NICK_CHARS_FIRST_LEN) + while(userList[cindex] == NULL && cindex < VALID_NICK_CHARS_FIRST_LEN) cindex++; if(cindex > VALID_NICK_CHARS_FIRST_LEN) return NULL; return userList[cindex]; @@ -177,7 +178,7 @@ struct UserNode* getUsersWithAuth(const char *auth, struct UserNode *last) { int getUserCount() { int i, count = 0; struct UserNode *user; - for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN; i++) { for(user = userList[i]; user; user = user->next) { count++; } @@ -199,6 +200,7 @@ struct UserNode* addUser(const char *nick) { user->created = time(0); user->ident[0] = 0; user->host[0] = 0; + user->ip = NULL; user->realname[0] = 0; user->flags = 0; user->channel = NULL; @@ -235,29 +237,82 @@ struct UserNode* addUserMask(const char *mask) { return user; } -struct UserNode* createTempUser(const char *mask) { +struct UserNode* createTempUser(const char *nick) { + int already_on_list = 0; + struct UserNode *user = NULL; + if(!is_valid_nick(nick)) { + return NULL; + } + for(user = userList[TEMPUSER_LIST_INDEX]; user; user = user->next) { + if(!stricmp(user->nick, nick)) { + already_on_list = 1; + break; + } + } + if(!user) { + user = malloc(sizeof(*user)); + if (!user) { + perror("malloc() failed"); + return NULL; + } + user->ident[0] = 0; + user->host[0] = 0; + user->ip = NULL; + user->realname[0] = 0; + user->flags = 0; + user->channel = NULL; + user->last_who = 0; + } else + user->flags &= ~USERFLAG_FREETMPUSER; + user->created = time(0); + if(user->created - user->last_who > REWHO_TIMEOUT) + user->flags &= ~USERFLAG_ISAUTHED; //remove authed flag (security reasons) + strcpy(user->nick, nick); + if(!already_on_list) { + user->next = userList[TEMPUSER_LIST_INDEX]; + userList[TEMPUSER_LIST_INDEX] = user; + } + return user; +} + +struct UserNode* createTempUserMask(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; + int already_on_list = 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"); + if(!is_valid_nick(cmask)) { return NULL; } - strcpy(user->nick, cmask); + for(user = userList[TEMPUSER_LIST_INDEX]; user; user = user->next) { + if(!stricmp(user->nick, cmask)) { + already_on_list = 1; + break; + } + } + if(!user) { + user = malloc(sizeof(*user)); + if (!user) { + perror("malloc() failed"); + return NULL; + } + user->ident[0] = 0; + user->host[0] = 0; + user->ip = NULL; + user->realname[0] = 0; + user->flags = 0; + user->channel = NULL; + user->last_who = 0; + } else + user->flags &= ~USERFLAG_FREETMPUSER; user->created = time(0); - user->ident[0] = 0; - user->host[0] = 0; - user->realname[0] = 0; - user->flags = 0; - user->channel = NULL; - user->last_who = 0; + if(user->created - user->last_who > REWHO_TIMEOUT) + user->flags &= ~USERFLAG_ISAUTHED; //remove authed flag (security reasons) + strcpy(user->nick, cmask); ii = i+1; } else if(cmask[i] == '.' && !user) { //it's a server @@ -271,6 +326,7 @@ struct UserNode* createTempUser(const char *mask) { user->created = time(0); user->ident[0] = 0; user->host[0] = 0; + user->ip = NULL; user->realname[0] = 0; user->flags = USERFLAG_ISSERVER; user->channel = NULL; @@ -294,15 +350,20 @@ struct UserNode* createTempUser(const char *mask) { user->created = time(0); user->ident[0] = 0; user->host[0] = 0; + user->ip = NULL; user->realname[0] = 0; user->flags = 0; user->channel = NULL; user->last_who = 0; - return user; + break; } strcpy(user->host, &cmask[ii]); } } + if(!already_on_list) { + user->next = userList[TEMPUSER_LIST_INDEX]; + userList[TEMPUSER_LIST_INDEX] = user; + } return user; } @@ -337,7 +398,7 @@ int renameUser(struct UserNode* user, const char *new_nick) { } void delUser(struct UserNode* user, int freeUser) { - int userListIndex = get_nicklist_entry(user->nick[0]); + int userListIndex = ((user->flags & USERFLAG_ISTMPUSER) ? TEMPUSER_LIST_INDEX : get_nicklist_entry(user->nick[0])); if(userListIndex == -1) return; event_freeuser(user); struct UserNode *cuser, *last_user = NULL; @@ -351,6 +412,10 @@ void delUser(struct UserNode* user, int freeUser) { } else last_user = cuser; } + if(freeUser && (user->flags & USERFLAG_IS_ON_WHO_QUEUE)) { + user->flags |= USERFLAG_FREE_AFTER_WHO; + freeUser = 0; + } if(user->channel) { struct ChanUser *chanUser, *next; for(chanUser = user->channel; chanUser; chanUser = next) { @@ -358,25 +423,22 @@ void delUser(struct UserNode* user, int freeUser) { removeChanUserFromLists(chanUser, 1, 0, freeUser); } } - if(freeUser) + if(freeUser) { + if(user->ip) + freeIPNode(user->ip); free(user); - else + } else user->next = NULL; } void clearTempUsers() { int userListIndex = TEMPUSER_LIST_INDEX; - struct UserNode *cuser, *last_user = NULL, *next; + struct UserNode *cuser, *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; + delUser(cuser, 1); + } } }