X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/333b6dd44b1b57eaf1edda2810eb32403f6d05fa..80e32fcd996025093c28b304d91d376b72c1496e:/nick/nick.c diff --git a/nick/nick.c b/nick/nick.c index f7393847..1b7dcadf 100644 --- a/nick/nick.c +++ b/nick/nick.c @@ -12,6 +12,7 @@ #include "../server/server.h" #include "../parser/parser.h" #include "../lib/version.h" +#include "../lib/ccassert.h" #include "../core/nsmalloc.h" #include @@ -20,6 +21,8 @@ MODULE_VERSION(""); +CCASSERT(sizeof(host) == sizeof(realname)); + const flag umodeflags[] = { { 'i', UMODE_INV }, { 'w', UMODE_WALLOPS }, @@ -35,6 +38,17 @@ const flag umodeflags[] = { { 'R', UMODE_REGPRIV }, { 'I', UMODE_HIDEIDLE }, { 'P', UMODE_PARANOID }, + { 'q', UMODE_COMCHANS }, + { 'Q', UMODE_COMCHANSRESTR }, + { 'C', UMODE_CLOAKED }, + { '\0', 0 } }; + +const flag accountflags[] = { + { 'q', AFLAG_STAFF }, + { 'h', AFLAG_SUPPORT }, + { 'o', AFLAG_OPER }, + { 'a', AFLAG_ADMIN }, + { 'd', AFLAG_DEVELOPER }, { '\0', 0 } }; #define nickhash(x) ((crc32i(x))%NICKHASHSIZE) @@ -43,16 +57,30 @@ nick *nicktable[NICKHASHSIZE]; nick **servernicks[MAXSERVERS]; sstring *nickextnames[MAXNICKEXTS]; -sstring *nodeextnames[PATRICIA_MAXSLOTS]; -patricia_tree_t *iptree; void nickstats(int hooknum, void *arg); +char *NULLAUTHNAME = ""; + void _init() { - initnickalloc(); + unsigned int i; + authname *anp; + + /* Clear up the nicks in authext */ + for (i=0;inext) + anp->nicks=NULL; + initnickhelpers(); memset(nicktable,0,sizeof(nicktable)); memset(servernicks,0,sizeof(servernicks)); + + /* If we're connected to IRC, force a disconnect. This needs to be done + * before we register all our hooks which would otherwise get called + * during the disconnect. */ + if (connected) { + irc_send("%s SQ %s 0 :Resync [adding nick support]",mynumeric->content,myserver->content); irc_disconnected(); + } /* Register our hooks */ registerhook(HOOK_SERVER_NEWSERVER,&handleserverchange); @@ -64,19 +92,34 @@ void _init() { registerserverhandler("D",&handlekillmsg,2); registerserverhandler("Q",&handlequitmsg,1); registerserverhandler("M",&handleusermodemsg,3); - registerserverhandler("W",&handlewhoismsg,2); registerserverhandler("AC",&handleaccountmsg,4); - registerserverhandler("R",&handlestatsmsg,2); + registerserverhandler("P",&handleprivmsg,2); + registerserverhandler("A",&handleawaymsg,1); + registerserverhandler("CA",&handleaddcloak,1); + registerserverhandler("CU",&handleclearcloak,0); /* Fake the addition of our own server */ handleserverchange(HOOK_SERVER_NEWSERVER,(void *)numerictolong(mynumeric->content,2)); - - iptree = patricia_new_tree(PATRICIA_MAXBITS); } void _fini() { + nick *np; + int i; + + fininickhelpers(); + + for (i=0;inext) { + freesstring(np->shident); + freesstring(np->sethost); + freesstring(np->opername); + if(!np->auth && np->authname && (np->authname != NULLAUTHNAME)) + free(np->authname); + } + } + nsfreeall(POOL_NICK); - + /* Free the hooks */ deregisterhook(HOOK_SERVER_NEWSERVER,&handleserverchange); deregisterhook(HOOK_SERVER_LOSTSERVER,&handleserverchange); @@ -87,9 +130,11 @@ void _fini() { deregisterserverhandler("D",&handlekillmsg); deregisterserverhandler("Q",&handlequitmsg); deregisterserverhandler("M",&handleusermodemsg); - deregisterserverhandler("W",&handlewhoismsg); - deregisterserverhandler("AC",&handleaccountmsg); - deregisterserverhandler("R",&handlestatsmsg); + deregisterserverhandler("AC",&handleaccountmsg); + deregisterserverhandler("P",&handleprivmsg); + deregisterserverhandler("A",&handleawaymsg); + deregisterserverhandler("CA",&handleaddcloak); + deregisterserverhandler("CU",&handleclearcloak); } /* @@ -152,28 +197,38 @@ void deletenick(nick *np) { releaserealname(np->realname); releasehost(np->host); - if(IsAccount(np) && np->auth) - { - np->auth->usercount--; + if(IsAccount(np)) { + if(!np->auth) { + if(np->authname && (np->authname != NULLAUTHNAME)) + free(np->authname); + } else { + np->auth->usercount--; - for (nh=&(np->auth->nicks);*nh;nh=&((*nh)->nextbyauthname)) { - if (*nh==np) { - *nh=np->nextbyauthname; - break; + for (nh=&(np->auth->nicks);*nh;nh=&((*nh)->nextbyauthname)) { + if (*nh==np) { + *nh=np->nextbyauthname; + break; + } } - } - releaseauthname(np->auth); + releaseauthname(np->auth); + } } freesstring(np->shident); /* freesstring(NULL) is OK */ freesstring(np->sethost); + freesstring(np->opername); + freesstring(np->message); - np->ipnode->usercount--; + node_decrement_usercount(np->ipnode); derefnode(iptree, np->ipnode); /* TODO: figure out how to cleanly remove nodes without affecting other modules */ + /* Remove cloak entries for the user */ + removecloaktarget(np); + clearcloaktargets(np); + /* Delete the nick from the servernick table */ *(gethandlebynumericunsafe(np->numeric))=NULL; @@ -293,6 +348,19 @@ void releasenickext(int index) { */ char *visiblehostmask(nick *np, char *buf) { + char uhbuf[USERLEN+HOSTLEN+2]; + + visibleuserhost(np, uhbuf); + sprintf(buf,"%s!%s",np->nick,uhbuf); + + return buf; +} + +/* visibleuserhost + * As above without nick + */ + +char *visibleuserhost(nick *np, char *buf) { char hostbuf[HOSTLEN+1]; char *ident, *host; @@ -311,7 +379,7 @@ char *visiblehostmask(nick *np, char *buf) { host=hostbuf; } - sprintf(buf,"%s!%s@%s",np->nick,ident,host); + sprintf(buf,"%s@%s",ident,host); return buf; } @@ -369,49 +437,45 @@ nick *getnickbynumericstr(char *numericstr) { return getnickbynumeric(numerictolong(numericstr,5)); } -#endif -int registernodeext(const char *name) { - int i; +#endif - if (findnodeext(name)!=-1) { - Error("nick",ERR_WARNING,"Tried to register duplicate node extension %s",name); - return -1; - } +int canseeuser(nick *np, nick *cloaked) +{ + return (np == cloaked || + !IsCloaked(cloaked) || + np->cloak_extra == cloaked); +} - for (i=0;icloak_extra = cloaked; + cloaked->cloak_count++; } -int findnodeext(const char *name) { - int i; - - for (i=0;icontent)) { - return i; - } +void removecloaktarget(nick *target) +{ + if (target->cloak_extra) { + target->cloak_extra->cloak_count--; + target->cloak_extra = NULL; } - - return -1; } -void releasenodeext(int index) { - patricia_node_t *head, *node; +void clearcloaktargets(nick *cloaked) +{ + nick *tnp; + int j; - freesstring(nodeextnames[index]); - nodeextnames[index]=NULL; + if (cloaked->cloak_count == 0) + return; - head = iptree->head; + for(j=0;jnext) + if (tnp->cloak_extra == cloaked) + tnp->cloak_extra = NULL; - PATRICIA_WALK_ALL(head, node) - { - node->slots[index]=NULL; - } PATRICIA_WALK_END; + cloaked->cloak_count = 0; } +