Files
uworld/uworld.c
2023-12-22 22:53:54 -05:00

494 lines
12 KiB
C
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "config.h"
char UPLINK[255];
#ifdef USE_DCC
struct aDccClient MyClient[MAXCLIENTS];
#endif
char *snoop[]={"FA-Q","leet ","haxor",""};
int SNOOP=0;
extern int DccCtr; /* from socket.c */
char *SuspendChan[MAXSUSPENDOPER];
time_t SuspendChanTime[MAXSUSPENDOPER];
char *SuspendOper[MAXSUSPENDOPER];
time_t SuspendOperTime[MAXSUSPENDOPER];
extern char *mynicks[];
char *NoGlineHost[MAXNOGLINES],*GlineHost[MAXGLINEHOST];
char *MultiUserHost[MAXMHOST],*SingleUserHost[MAXMHOST];
char sockbuf[MAXBUFSIZE],buf[MAXBUFSIZE],storebuf[MAXBUFSIZE];
char input_buffer[3][3*MAXBUFSIZE],*input_start,*input_end;
char *token[256];
int sevsck,botsck;
FILE *fludfile = NULL;
char lastkill[255]="\0";
extern char *operchan[],*invitekiller[],*invitehosts[],*killchan[];
char LastKlr[20];
long D_JOIN=0,D_NICK=0,D_PART=0,D_MODE=0,D_KICK=0,D_SERVER=0,D_QUIT=0,D_USER=0;
long N_JOIN=0,N_NICK=0,N_PART=0,N_MODE=0,N_KICK=0,N_SERVER=0,N_QUIT=0,N_USER=0;
long D_TOTAL=0,N_TOTAL=0,D_SQUIT,N_SQUIT,N_OTHER=0,D_OTHER=0;
long D_KILL=0,N_KILL=0,FLOODLOGS=0;
long D_TOPIC=0,N_TOPIC=0;
int CLONE_UP=3,CLONE_LO=3,CLONE_DIG=3,LOGHOST=0;
int DO_AUTOKICK=0,DO_CORE=1;
time_t S_TIME=0;
int MAX_SESSIONS=5,MAX_ALLOWED=8;
time_t NOWTIME,BotIdle,ServIdle;
int SITE_CLONE=3,KILL_NICKFLOOD=1,num_servs=0;
char server_list[40][100];
char controlbot[255];
int NETBURST=0,FLOODPROTECTION=1;
main(int argc, char **argv)
{ int loop,loop2;
char *envptr;
if (argc <2) goto_bg();
strcpy(UPLINK,MYSERVER);
if( (envptr=getenv("UPLINK")) != NULL) strcpy(UPLINK,envptr);
#ifdef USE_DCC
for(loop=0;loop<MAXCLIENTS;loop++)
{ MyClient[loop].fd=-1;
MyClient[loop].status=S_FREE;
}
#endif
InitOperchan();
InitKillchan();
read_operchan(OPERCHANFILE);
read_killchan(KILLCHANFILE);
InitGlines();
read_glines(GLINEFILE);
S_TIME=time(NULL);
NOWTIME=S_TIME;
#ifdef DEBUG
srandom(S_TIME);
open_debug();
#endif
fludfile=fopen(FLUDFILE,"a");
sprintf(controlbot,"%s@%s",CHANSVR,SERVERNAME);
load_myuser("user.file");
load_serv("servers.admin");
clear_clients();
startlog();
sevsck = sev_login(UPLINK);
botsck = bot_login(UPLINK);
do_bots();
read_noglines(EGLINEFILE);
read_glinehost(AGLINEFILE);
read_mhost(MHOSTFILE);
read_shost(SHOSTFILE);
read_suspend(SUSPENDFILE);
read_Csuspend(CHANSUSPENDFILE);
for(loop=0;operchan[loop];loop++)
{
sprintf(buf,":CHANSVR JOIN #%s\n",operchan[loop]);
writeln(sevsck,buf);
sprintf(buf,"MODE #%s +pnoti Chansvr\n",operchan[loop]);
writeln(sevsck,buf);
}
sprintf(buf,":%s MODE %s +kido\n",CHANSVR,CHANSVR);
writeln(sevsck,buf);
#ifdef JUPE_BUGS
for(loop=0;*mynicks[loop];loop++)
makehelp(sevsck,mynicks[loop],"!JUPE Illegal nickname on this network");
#endif
makehelp(sevsck,"ChanLock","CHANNEL LOCKING SYSTEM");
makehelp(sevsck,"ChanServ","Undernet Juping Service");
writeln(sevsck,":ChanLock MODE Chanlock +kid\n");
#ifdef WASTEDUMP
StartWastedump();
sprintf(buf,":wastetest MODE wastetest +kid\n");
writeln(sevsck,buf);
#endif
loop2=0;
for(loop=0;*invitekiller[loop];loop++)
{ if(!(*invitehosts[loop2])) loop2=0;
makedecoy(sevsck,invitekiller[loop],invitehosts[loop2++],
invitekiller[loop]);
}
strcpy(LastKlr,"none");
readin();
}
spitout(int sckfd)
{ int i,num,k,loopcnt;
int bf,helpsv=0;
char *fromhost;
char *temp;
char *end_of_line;
int length,position=0,nbc=0;
static squit_loop=0;
static time_t last_squit=0;
char tempbuf[1024];
char killbuf[255];
char *ptr;
int ctr,ilp;
if(sckfd == sevsck) bf = 0; /* sevsck */
else if(sckfd == botsck) bf = 1; /* botsck */
else bf = 2; /* DccCtr */
/* BUFFER INPUT */
strcat(input_buffer[bf],sockbuf);
input_buffer[bf][strlen(input_buffer[bf])+1]='\0';
/* CHECK FOR NEWLINE */
input_start=input_buffer[bf];
length=strlen(input_buffer[bf]);
while( (input_end=strchr(input_start,'\n')) )
{ loopcnt++;
*input_end='\0';
position+= strlen(input_start);
if(strncmp(input_start,"PI",2)==0)
{ strcpy(buf,input_start);
strncpy(buf,"PO",2);
writeln(sckfd,strcat(buf,"\n"));
input_start=input_end+1;
continue;
} /* ping - pong */
if(*(input_start+strlen(input_start)-1) == '\r')
*(input_start+strlen(input_start)-1) = '\0';
strcpy(storebuf,input_start);
if(SNOOP)
{ for(ilp=0;*snoop[ilp];ilp++)
if(strstr(storebuf,snoop[ilp]))
{ FILE *ofp;
if( (ofp=fopen("Stats.log","a"))!=NULL)
{ fprintf(ofp,"%ld %s\n",NOWTIME,storebuf);
fclose(ofp);
break;
}
}
}
if((FLOODLOGS) && (fludfile != NULL))
fprintf(fludfile,"%s\n",storebuf);
token[i=0]=strtok(input_start," ");
while(token[++i]=strtok(NULL, " ")); token[i]=NULL;
input_start=input_end+1;
if(!token[0]) continue;
if(!token[1]) continue;
if(i > 2) do_count();
k=chk_num(0);
if(temp=strchr(token[0],'!'))
{
*temp='\0'; fromhost=temp+1;
if((k>3) && (FLOODPROTECTION)) FloodProtect(token[0]+1,token[2]);
parse(fromhost);
continue;
}
nbc=0;
if((!NETBURST) && (k>3) && ((!strcmp(token[nbc++],"SERVER")) ||
(!strcmp(token[nbc++],"SERVER")) ))
{ if(!NETBURST)
{ sprintf(buf,":%s PRIVMSG #uworld.floods :PROCESSING NETBURST %d\n",
CHANSVR,nbc);
writeln(sevsck,buf);
}
NETBURST=nbc;
}
if((!NETBURST) && (FLOODPROTECTION) && (!strchr(token[0],'.')))
{
if((k>3) && ((*token[1]=='P') || (*token[1]=='I') ||
(!strncmp(token[1],"NO",2))))
FloodProtect(token[0]+1,token[2]);
}
if((!strcmp(token[0],"ERROR")) &&
(!strcmp(token[1],":Closing")))
{
if(sckfd==sevsck)
{ close(sevsck);
writelog("SQUIT");
destroy_nickhash();
squit_loop++;
if(squit_loop > 5)
{ writelog("EXITING SQUIT LOOP");
exit(1);
}
if(NOWTIME - last_squit < 120) continue;
last_squit = NOWTIME;
if(k>5)
{
*token[5]++;
if(*token[5] != '!')
{
clear_clients();
sevsck=sev_login(UPLINK);
do_bots();
continue;
}
}
}
else /* client squit */
{ close(botsck);
botsck=bot_login(UPLINK);
continue;
}
}
if(k > 3)
{
if(!strcmp(token[3],":remakeuworld"))
{
close( botsck);
botsck=bot_login(UPLINK);
}
else if(atoi(token[1])) { sevnum(atoi(token[1])); continue; }
else if(!match(token[1],"KILL")) { record_kill(); continue; }
else if(strcasecmp(token[0],":helpbot"))
{ if(strlen(token[3])>80) continue;
if(strchr(token[3],'@')) continue;/* Should stop the silence bug */
if(!match(token[2],IRCHELP)) {do_helpirc(sevsck); continue; }
else if(!strcasecmp(token[2],controlbot))
{ OperCom(token[0]+1);
continue;
}
else if( (*token[1]=='P') || (*token[1]=='I') ||
(!strncmp(token[1],"NO",2)))
{
for(ctr=0;*invitekiller[ctr];ctr++)
{ if(!strcasecmp(token[2],invitekiller[ctr]))
{ GetFromhost(token[0]+1,killbuf);
sprintf(tempbuf,"MMG[%d] <%s!%s>",ctr,token[0]+1,killbuf);
for(ctr=3;token[ctr];ctr++)
{ strcat(tempbuf," ");
strcat(tempbuf,token[ctr]);
}
strcat(tempbuf,"\n");
mmg_log(tempbuf);
if((!strcasecmp(lastkill,killbuf)) &&
(strcasecmp(LastKlr,token[2])))
{ /*We've heard from this idiot already */
char ttbuf[1024],*tpt;
tpt=killbuf;
while( (*tpt=='*') ) tpt++;
if( (!match("*telnet@*.wildstar.net",tpt)) ||
(!match("*telnet@*.wildstar.com",tpt)) )
{
dump_nicklist(token[0]+1,"TELNET.FLOODERS");
}
else
{
/*
sprintf(ttbuf,"*%s",killbuf);
do_gline(ttbuf,"MASSMESSAGE",
"Unsolicited Mass Advertisements are prohibited - [Auto]",
3600);
*/
sprintf(ttbuf,
"KILL %s Uworld!uworld.undernet.org :MASS MESSAGE KILL FROM %s\n",
token[0]+1,killbuf);
writeln(sevsck,ttbuf);
}
}
strcpy(lastkill,killbuf);
strcpy(LastKlr,token[2]);
DccGlobal(tempbuf,DCC_MMG);
sprintf(buf,":%s PRIVMSG #uworld.floods :%s",CHANSVR,tempbuf);
writeln(sevsck,buf);
break;
}
}
continue;
}
else if(!strcasecmp(token[2],"chansvr"))
{ sprintf(buf,
":Chansvr NOTICE %s :Please use %s\n",token[0]+1,controlbot);
writeln(sevsck,buf);
continue;
}
else if(!match(token[2],USHELP)) {do_ushelp(sevsck); continue; }
else if((!match(token[2],HELPBOT)) &&
(!match(token[3],":help"))) {do_helpem(sevsck); continue; }
}
}
if(!helpsv) sevstuff(sevsck,fromhost);
} /* END BUFFER INPUT */
strcpy(input_buffer[bf],input_start);
}
finishline(start)
int start; { int i; i=start; while (token[i]) printf(" %s",token[i++]); }
int chk_num(int start)
{
int j;
j=start;
while (token[j]) {
j++;
}
return j;
}
do_scmd(int sck)
{int i,j,k;
char temp[512];
if(!i) i = 4;
j=chk_num(0);
strcpy(temp,"");
if (j>4)
for(i=4;i<j;i++) {
strcat(temp,token[i]);
strcat(temp," ");
}
sprintf(buf,"%s\n",temp); writeln(sck,buf);
}
Gline(fromhost)
char *fromhost;
{
static int counter=0;
*token[0]++;
if(match(fromhost,lastkill)) {
sprintf(buf,"463 %s :Global Kill Line\n",token[0]);
writeln(sevsck,buf);
sprintf(buf,"352 %s \n",token[0]);
writeln(sevsck,buf);
}
else {
counter++;
sprintf(buf,"352 %s \n",token[0]);
writeln(sevsck,buf);
sprintf(buf,"463 %s :Global Kill Line\n",token[0]);
writeln(sevsck,buf);
}
strcpy(lastkill,fromhost);
if(counter > 8) {
sprintf(buf,"NICK %s :1\n",token[0]);
writeln(sevsck,buf);
counter = 0;
}
if(counter = 5) {
sprintf(buf,"KILL %s :GLOBAL KILL LINE \n",token[0]);
writeln(sevsck,buf);
}
}
do_count()
{ if(!strcmp(token[1],"KICK"))
{ D_KICK += strlen(storebuf);
N_KICK++;
}
else if(!strcmp(token[1],"JOIN"))
{ D_JOIN += strlen(storebuf);
N_JOIN++;
}
else if(!strcmp(token[1],"PART"))
{ D_PART += strlen(storebuf);
N_PART++;
}
else if(!strcmp(token[1],"MODE"))
{ D_MODE += strlen(storebuf);
N_MODE++;
if((NETBURST) && strchr(token[0],'.'))
{ NETBURST=0;
sprintf(buf,":%s PRIVMSG #uworld.floods :Netburst Complete\n",
CHANSVR);
writeln(sevsck,buf);
}
}
else if(!strcmp(token[1],"SQUIT"))
{ D_SQUIT += strlen(storebuf);
N_SQUIT++;
}
else if(!strcmp(token[1],"QUIT"))
{ D_QUIT += strlen(storebuf);
N_QUIT++;
}
else if(!strcmp(token[1],"SERVER"))
{ D_SERVER += strlen(storebuf);
N_SERVER++;
}
else if(!strcmp(token[1],"USER"))
{ D_USER += strlen(storebuf);
N_USER++;
}
else if(!strcmp(token[1],"NICK"))
{ D_NICK += strlen(storebuf);
N_NICK++;
}
else if(!strcmp(token[0],"NICK"))
{ D_NICK += strlen(storebuf);
N_NICK++;
}
else if(!strcmp(token[1],"KILL"))
{ D_KILL += strlen(storebuf);
N_KILL++;
}
else if(!strcmp(token[1],"TOPIC"))
{ D_TOPIC += strlen(storebuf);
N_TOPIC++;
}
else
{ N_OTHER++;
D_OTHER += strlen(storebuf);
}
}
int load_serv(char *file)
{
FILE *infile;
char line[500];
if( (infile=fopen(file,"r")) == NULL) return;
for(num_servs=0;fgets(line,99,infile);num_servs++)
{
line[strlen(line)-1]='\0';
strcpy(server_list[num_servs],line);
}
fclose(infile);
return;
}
int join_opchan(char *channel)
{ int loop;
for(loop=0;operchan[loop];loop++)
{ if(strcasecmp(operchan[loop],channel)) continue;
sprintf(buf,":CHANSVR JOIN #%s\n",operchan[loop]);
writeln(sevsck,buf);
sprintf(buf,"MODE #%s +pnotil Chansvr 1\n",operchan[loop]);
writeln(sevsck,buf);
}
}