/**************************************************************** NAME : DescribeClassCommand DESCRIPTION : Displays direct superclasses and subclasses and the entire precedence list for a class INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : None NOTES : Syntax : (describe-class <class-name>) ****************************************************************/ globle void DescribeClassCommand( void *theEnv) { char *cname; DEFCLASS *cls; cname = GetClassNameArgument(theEnv,"describe-class"); if (cname == NULL) return; cls = CheckClass(theEnv,"describe-class",cname); if (cls == NULL) return; EnvDescribeClass(theEnv,WDISPLAY,(void *) cls); }
/**************************************************************** NAME : DescribeClassCommand DESCRIPTION : Displays direct superclasses and subclasses and the entire precedence list for a class INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : None NOTES : Syntax : (describe-class <class-name>) ****************************************************************/ void DescribeClassCommand( Environment *theEnv, UDFContext *context, UDFValue *returnValue) { const char *className; Defclass *theDefclass; className = GetClassNameArgument(context); if (className == NULL) { return; } theDefclass = CheckClass(theEnv,"describe-class",className); if (theDefclass == NULL) { return; } DescribeClass(theDefclass,STDOUT); }
void LocalUser::FullConnect() { ServerInstance->stats.Connects++; this->idle_lastmsg = ServerInstance->Time(); /* * You may be thinking "wtf, we checked this in User::AddClient!" - and yes, we did, BUT. * At the time AddClient is called, we don't have a resolved host, by here we probably do - which * may put the user into a totally seperate class with different restrictions! so we *must* check again. * Don't remove this! -- w00t */ MyClass = NULL; SetClass(); CheckClass(); CheckLines(); if (quitting) return; this->WriteNumeric(RPL_WELCOME, ":Welcome to the %s IRC Network %s", ServerInstance->Config->Network.c_str(), GetFullRealHost().c_str()); this->WriteNumeric(RPL_YOURHOSTIS, ":Your host is %s, running version %s", ServerInstance->Config->ServerName.c_str(), INSPIRCD_BRANCH); this->WriteNumeric(RPL_SERVERCREATED, ":This server was created %s %s", __TIME__, __DATE__); const std::string& modelist = ServerInstance->Modes->GetModeListFor004Numeric(); this->WriteNumeric(RPL_SERVERVERSION, "%s %s %s", ServerInstance->Config->ServerName.c_str(), INSPIRCD_BRANCH, modelist.c_str()); ServerInstance->ISupport.SendTo(this); /* Now registered */ if (ServerInstance->Users->unregistered_count) ServerInstance->Users->unregistered_count--; /* Trigger MOTD and LUSERS output, give modules a chance too */ ModResult MOD_RESULT; std::string command("LUSERS"); std::vector<std::string> parameters; FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, parameters, this, true, command)); if (!MOD_RESULT) ServerInstance->Parser.CallHandler(command, parameters, this); MOD_RESULT = MOD_RES_PASSTHRU; command = "MOTD"; FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, parameters, this, true, command)); if (!MOD_RESULT) ServerInstance->Parser.CallHandler(command, parameters, this); if (ServerInstance->Config->RawLog) WriteServ("PRIVMSG %s :*** Raw I/O logging is enabled on this server. All messages, passwords, and commands are being recorded.", nick.c_str()); /* * We don't set REG_ALL until triggering OnUserConnect, so some module events don't spew out stuff * for a user that doesn't exist yet. */ FOREACH_MOD(OnUserConnect, (this)); this->registered = REG_ALL; FOREACH_MOD(OnPostConnect, (this)); ServerInstance->SNO->WriteToSnoMask('c',"Client connecting on port %d (class %s): %s (%s) [%s]", this->GetServerPort(), this->MyClass->name.c_str(), GetFullRealHost().c_str(), this->GetIPString().c_str(), this->fullname.c_str()); ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCache: Adding NEGATIVE hit for " + this->GetIPString()); ServerInstance->BanCache.AddHit(this->GetIPString(), "", ""); // reset the flood penalty (which could have been raised due to things like auto +x) CommandFloodPenalty = 0; }
BOOL CUser::CheckEventLogic(EVENT_DATA *pEventData) // This part reads all the 'A' parts and checks if the { // requirements for the 'E' parts are met. if( !pEventData ) return FALSE; BOOL bExact = TRUE; list<LOGIC_ELSE*>::iterator Iter; for( Iter = pEventData->m_arLogicElse.begin(); Iter != pEventData->m_arLogicElse.end(); Iter++ ) { bExact = FALSE; LOGIC_ELSE* pLE = (*Iter); if( !pLE ) return FALSE; switch( pLE->m_LogicElse ) { case LOGIC_CHECK_UNDER_WEIGHT: if( pLE->m_LogicElseInt[0]+m_sItemWeight >= m_sMaxWeight ) bExact = TRUE; break; case LOGIC_CHECK_OVER_WEIGHT: if( pLE->m_LogicElseInt[0]+m_sItemWeight < m_sMaxWeight ) bExact = TRUE; break; case LOGIC_CHECK_SKILL_POINT: if( CheckSkillPoint(pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1], pLE->m_LogicElseInt[2]) ) bExact = TRUE; break; case LOGIC_EXIST_ITEM: if ( CheckExistItem(pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1]) ) bExact = TRUE; break; case LOGIC_CHECK_CLASS: if (CheckClass( pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1], pLE->m_LogicElseInt[2], pLE->m_LogicElseInt[3], pLE->m_LogicElseInt[4], pLE->m_LogicElseInt[5])) { bExact = TRUE; } break; case LOGIC_CHECK_WEIGHT: if (!CheckWeight( pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1])) { bExact = TRUE; } break; case LOGIC_RAND: if (CheckRandom(pLE->m_LogicElseInt[0])) { bExact = TRUE; } break; // // ????? ???? >.< case LOGIC_CHECK_LEVEL: if( m_pUserData->m_bLevel >= pLE->m_LogicElseInt[0] && m_pUserData->m_bLevel <= pLE->m_LogicElseInt[1] ) { bExact = TRUE; } break; case LOGIC_NOEXIST_COM_EVENT: if (!ExistComEvent(pLE->m_LogicElseInt[0])) { bExact = TRUE; } break; case LOGIC_EXIST_COM_EVENT: if (ExistComEvent(pLE->m_LogicElseInt[0])) { bExact = TRUE; } break; case LOGIC_HOWMUCH_ITEM: if ( CheckItemCount(pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1], pLE->m_LogicElseInt[2]) ) { bExact = TRUE; } break; case LOGIC_CHECK_NOAH: if ( m_pUserData->m_iGold >= pLE->m_LogicElseInt[0] && m_pUserData->m_iGold <= pLE->m_LogicElseInt[1] ) { bExact = TRUE; } break; // // /* case LOGIC_CHECK_NATION: if( pLE->m_LogicElseInt[0] == m_pUserData->m_bNation ) { bExact = TRUE; } break; case LOGIC_CHECK_LEVEL: if( m_pUserData->m_bLevel >= pLE->m_LogicElseInt[0] && m_pUserData->m_bLevel <= pLE->m_LogicElseInt[1] ) { bExact = TRUE; } break; case LOGIC_NOEXIST_ITEM: if (ItemCountChange(pLE->m_LogicElseInt[0], 1, 0) < 2) { bExact = TRUE; } break; case LOGIC_QUEST_END: break; case LOGIC_QUEST_LOG: break; case LOGIC_CHECK_NOAH: if(m_pUserData->m_iGold >= pLE->m_LogicElseInt[0]) { bExact = TRUE; } break; case LOGIC_CHECK_RACE: if (pLE->m_LogicElseInt[0] == m_pUserData->m_bRace) { bExact = TRUE; } break; ///////// These logics are for the test quest. case LOGIC_EXIST_ITEM: if (CheckExistItem(pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1])) { bExact = TRUE; } break; case LOGIC_CHECK_CLASS: if (CheckClass( pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1], pLE->m_LogicElseInt[2], pLE->m_LogicElseInt[3], pLE->m_LogicElseInt[4], pLE->m_LogicElseInt[5])) { bExact = TRUE; } break; case LOGIC_CHECK_WEIGHT: if (CheckWeight( pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1])) { bExact = TRUE; } break; case LOGIC_CHECK_SKILLPOINT: if (CheckSkillPoint(pLE->m_LogicElseInt[0], pLE->m_LogicElseInt[1], pLE->m_LogicElseInt[2])) { bExact = TRUE; } break; */ default: return FALSE; } if( !pLE->m_bAnd ) { // OR ????? ??? bExact?? TRUE??? ??ü?? TRUE??? if(bExact) return TRUE; } else { // AND ????? ??? bExact?? FALSE??? ??ü?? FALSE??? if(!bExact) return FALSE; } } return bExact; }
int CheckForModule(char *actiontxt,char *args) { struct stat statbuf; char line[CF_BUFSIZE],command[CF_EXPANDSIZE],name[CF_MAXVARSIZE],content[CF_BUFSIZE],ebuff[CF_EXPANDSIZE],*sp; FILE *pp; int print; if (NOMODULES) { return false; } if (*actiontxt == '/') { snprintf(OUTPUT,CF_BUFSIZE,"Absolute module path (%s) should be named relative to the authorized module directory",actiontxt); CfLog(cferror,OUTPUT,""); } if (GetMacroValue(CONTEXTID,"moduledirectory")) { ExpandVarstring("$(moduledirectory)",ebuff,NULL); } else { snprintf(ebuff,CF_BUFSIZE,"%s/modules",VLOCKDIR); } AddSlash(ebuff); strcat(ebuff,actiontxt); if (stat(ebuff,&statbuf) == -1) { snprintf(OUTPUT,CF_BUFSIZE*2,"(Plug-in %s not found)",ebuff); Banner(OUTPUT); return false; } if ((statbuf.st_uid != 0) && (statbuf.st_uid != getuid())) { snprintf(OUTPUT,CF_BUFSIZE*2,"Module %s was not owned by uid=%d executing cfagent\n",ebuff,getuid()); CfLog(cferror,OUTPUT,""); return false; } snprintf(OUTPUT,CF_BUFSIZE*2,"Plug-in `%s\'",actiontxt); Banner(OUTPUT); strcat(ebuff," "); if (BufferOverflow(ebuff,args)) { snprintf(OUTPUT,CF_BUFSIZE*2,"Culprit: class list for module (shouldn't happen)\n" ); CfLog(cferror,OUTPUT,""); return false; } strcat(ebuff,args); ExpandVarstring(ebuff,command,NULL); Verbose("Exec module [%s]\n",command); if ((pp = cfpopen(command,"r")) == NULL) { snprintf(OUTPUT,CF_BUFSIZE*2,"Couldn't open pipe from %s\n",actiontxt); CfLog(cferror,OUTPUT,"cfpopen"); return false; } while (!feof(pp)) { if (ferror(pp)) /* abortable */ { snprintf(OUTPUT,CF_BUFSIZE*2,"Shell command pipe %s\n",actiontxt); CfLog(cferror,OUTPUT,"ferror"); break; } ReadLine(line,CF_BUFSIZE,pp); if (strlen(line) > CF_BUFSIZE - 80) { snprintf(OUTPUT,CF_BUFSIZE*2,"Line from module %s is too long to be sensible\n",actiontxt); CfLog(cferror,OUTPUT,""); break; } if (ferror(pp)) /* abortable */ { snprintf(OUTPUT,CF_BUFSIZE*2,"Shell command pipe %s\n",actiontxt); CfLog(cferror,OUTPUT,"ferror"); break; } print = false; for (sp = line; *sp != '\0'; sp++) { if (! isspace((int)*sp)) { print = true; break; } } switch (*line) { case '+': Verbose("Activated classes: %s\n",line+1); CheckClass(line+1,command); AddMultipleClasses(line+1); break; case '-': Verbose("Deactivated classes: %s\n",line+1); CheckClass(line+1,command); NegateCompoundClass(line+1,&VNEGHEAP); break; case '=': content[0] = '\0'; sscanf(line+1,"%[^=]=%[^\n]",name,content); Verbose("Defined Macro: %s, Value: %s\n",name,content); AddMacroValue(CONTEXTID,name,content); break; default: if (print) { snprintf(OUTPUT,CF_BUFSIZE,"%s: %s\n",actiontxt,line); CfLog(cferror,OUTPUT,""); } } } cfpclose(pp); return true; }