예제 #1
0
void _init() {
  vspatterns=NULL;
  vsauths=NULL;
  vsstats=NULL;
  versionscan_mode=VS_IDLE;
  
  versionscan_commands=newcommandtree();
  
  addcommandtotree(versionscan_commands, "showcommands", VS_AUTHED | VS_STAFF, 0, versionscan_showcommands);
  addcommandtotree(versionscan_commands, "help", VS_AUTHED | VS_STAFF, 1, versionscan_help);
  addcommandtotree(versionscan_commands, "hello", VS_AUTHED | VS_OPER, 0, versionscan_hello);
  addcommandtotree(versionscan_commands, "scan", VS_AUTHED | VS_STAFF, 1, versionscan_scan);
  addcommandtotree(versionscan_commands, "changelev", VS_AUTHED | VS_OPER | VS_ADMIN, 2, versionscan_changelev);
  addcommandtotree(versionscan_commands, "listpatterns", VS_AUTHED | VS_STAFF | VS_OPER, 0, versionscan_listpatterns);
  addcommandtotree(versionscan_commands, "addpattern", VS_AUTHED | VS_STAFF | VS_OPER, 3, versionscan_addpatterncmd);
  addcommandtotree(versionscan_commands, "delpattern", VS_AUTHED | VS_OPER | VS_ADMIN, 1, versionscan_delpatterncmd);
  addcommandtotree(versionscan_commands, "status", VS_AUTHED | VS_OPER | VS_ADMIN, 0, versionscan_status);
  addcommandtotree(versionscan_commands, "mode", VS_AUTHED | VS_OPER | VS_ADMIN, 1, versionscan_modecmd);
  addcommandtotree(versionscan_commands, "statistics", VS_AUTHED | VS_OPER | VS_STAFF, 1, versionscan_statistics);
  addcommandtotree(versionscan_commands, "statsdump", VS_AUTHED | VS_OPER | VS_STAFF, 1, versionscan_statsdump);
  addcommandtotree(versionscan_commands, "broadcast", VS_AUTHED | VS_OPER | VS_ADMIN, 1, versionscan_broadcast);
  addcommandtotree(versionscan_commands, "whois", VS_AUTHED | VS_STAFF, 1, versionscan_whois);
  
  registerhook(HOOK_NICK_NEWNICK, &versionscan_newnick);
  
  vsconnect=scheduleoneshot(time(NULL)+1, &versionscan_createfakeuser, NULL);
}
예제 #2
0
void masterhandler(nick *np, int message, void **args) {
  char *msg;

  switch(message) {
    case LU_KILLED:
      cmnick=NULL;
      scheduleoneshot(time(NULL)+1, makenick, NULL);
      break;
    
    case LU_CHANMSG:
      msg=args[2];
      
      if (!ircd_strncmp(msg, "!spawn ",7)) {
        spawnclones(strtoul(msg+7,NULL,10));
      }
      
      if (!ircd_strncmp(msg,"!join ",6)) {
        join(msg+6);
      }
      
      if (!ircd_strncmp(msg,"!spam ", 6)) {
        spam(strtoul(msg+6, NULL, 10));
      }
      break; 
      
  }
}
예제 #3
0
static void fakeuser_handler(nick *user, int command, void **params) {
  if (command == LU_KILLED) {
    fakeuser *fake;
    time_t timenow = time(NULL);

    fake = findfakeuserbynick(user->nick);

    if (!fake) {
      controlwall(NO_OPER, NL_FAKEUSERS, "Error: A fakeuser was killed, but wasn't found in the list");
      Error("fakeuser", ERR_ERROR, "A fakeuser was killed, but wasn't found in the list");
      return;
    }

    fake->user = NULL;

    if (timenow - fake->lastkill < KILL_TIME) {
      controlwall(NO_OPER, NL_FAKEUSERS, "Fake user %s!%s@%s (%s) KILL'ed twice under in %d seconds. Removing.",
                  fake->nick, fake->ident, fake->host, fake->realname, KILL_TIME);
      fake_remove(fake);
      return;
    }

    fake->lastkill = timenow;

    scheduleoneshot(time(NULL) + KILL_WAIT, &reconnectfakeuser, fake);
  }
}
예제 #4
0
void lua_startbot(void *arg) {
  channel *cp;

  myureconnect = NULL;

  if(!luabotnick)
    luabotnick = getcopyconfigitem("lua", "botnick", "U", NICKLEN);

  lua_nick = registerlocaluser(luabotnick->content, "lua", "quakenet.department.of.corrections", LUA_FULLVERSION, "U", UMODE_ACCOUNT | UMODE_DEAF | UMODE_OPER | UMODE_SERVICE, &lua_bothandler);
  if(!lua_nick) {
    myureconnect = scheduleoneshot(time(NULL) + 1, &lua_startbot, NULL);
    return;
  }

  cp = findchannel(LUA_OPERCHAN);
  if(cp && localjoinchannel(lua_nick, cp)) {
    localgetops(lua_nick, cp);
  } else {
    localcreatechannel(lua_nick, LUA_OPERCHAN);
  }

  cp = findchannel(LUA_PUKECHAN);
  if(cp && localjoinchannel(lua_nick, cp)) {
    localgetops(lua_nick, cp);
  } else {
    localcreatechannel(lua_nick, LUA_PUKECHAN);
  }

  myublip = schedulerecurring(time(NULL) + 1, 0, 60, &lua_blip, NULL);
  myutick = schedulerecurring(time(NULL) + 1, 0, 1, &lua_tick, NULL);

  lua_registerevents();
}
예제 #5
0
파일: lua.c 프로젝트: quakenet/newserv
void _init() {
  lua_setupdebugsocket();
  lua_initnickpusher();
  lua_initchanpusher();

  dummy.name = getsstring("???", 10);
  if(!dummy.name) {
    Error("lua", ERR_ERROR, "Cannot set dummy name.");
    return;
  }

  cpath = getcopyconfigitem("lua", "scriptdir", "", 500);

  if(!cpath || !cpath->content || !cpath->content[0]) {
    Error("lua", ERR_ERROR, "Error loading path.");
    return;
  }

  suffix = getcopyconfigitem("lua", "scriptsuffix", ".lua", 10);
  if(!suffix) {
    Error("lua", ERR_ERROR, "Error loading suffix.");
    return;
  }

  lua_setpath();

  loaded = 1;

  startsched = scheduleoneshot(time(NULL) + 1, &lua_startup, NULL);
}
예제 #6
0
파일: patrol.c 프로젝트: quakenet/newserv
void patrol_sched_repool(void *arg) {
  int delta;

  if (patrol_repool())
    delta = PATROL_POOL_REGENERATION;
  else
    delta = 10;

  scheduleoneshot(time(NULL) + delta, &patrol_sched_repool, NULL);
}
예제 #7
0
파일: modules.c 프로젝트: quakenet/newserv
void safereload(char *themodule) {
  if (safereload_str)
    freesstring(safereload_str);
  
  safereload_str=getsstring(themodule, 100);
  
  if (safereload_sched)
    deleteschedule(safereload_sched, safereloadcallback, NULL);
  
  scheduleoneshot(1, safereloadcallback, NULL);
}
예제 #8
0
파일: patrol.c 프로젝트: quakenet/newserv
void _init(void) {
  char buf[32];
  sstring *m;

  snprintf(buf, sizeof(buf), "%d", PATROL_MINIMUM_HOSTS_BEFORE_POOL);
  m = getcopyconfigitem("patrol", "minpoolhosts", buf, 32);
  patrol_min_hosts = atoi(m->content);
  freesstring(m);

  scheduleoneshot(time(NULL) + 5, &patrol_sched_repool, NULL);
}
예제 #9
0
void lua_bothandler(nick *target, int type, void **args) {
  nick *np;
  char *p;
  int le;

  switch(type) {
    case LU_PRIVMSG:
      np = (nick *)args[0];
      p = (char *)args[1];

      if(!np || !p)
        return;

      lua_avpcall("irc_onmsg", "ls", np->numeric, p);

      break;
    case LU_PRIVNOTICE:
      np = (nick *)args[0];
      p = (char *)args[1];

      if(!np || !p)
        return;

      le = strlen(p);
      if((le > 1) && (p[0] == '\001')) {
        if(p[le - 1] == '\001')
          p[le - 1] = '\000';

        lua_avpcall("irc_onctcp", "ls", np->numeric, p + 1);
      } else {
        lua_avpcall("irc_onnotice", "ls", np->numeric, p);
      }

      break;

    case LU_KILLED:
      if(myublip) {
        myublip = NULL;
        deleteschedule(myublip, &lua_blip, NULL);
      }

      if(myutick) {
        myutick = NULL;
        deleteschedule(myutick, &lua_tick, NULL);
      }

      lua_nick = NULL;
      myureconnect = scheduleoneshot(time(NULL) + 1, &lua_startbot, NULL);

      break;
  }
}
예제 #10
0
void hchannel_activate_join_flood(hchannel *hchan)
{
    hchannel_user **hchanuser = &hchan->channel_users;
    helpmod_simple_modes(hchan, CHANMODE_REGONLY, 0, 1);

    /* clean the channel of the already joined clients */
    while (*hchanuser)
        if (((*hchanuser)->time_joined > (time(NULL) - 5)) && huser_get_level((*hchanuser)->husr) < H_STAFF)
            helpmod_kick(hchan, (*hchanuser)->husr, "Join flood");
        else
            hchanuser = &(*hchanuser)->next;

    hchan->flags |= H_JOIN_FLOOD;

    scheduleoneshot(time(NULL) + 60, &hchannel_deactivate_join_flood, NULL);
}
예제 #11
0
static int fakeadd(void *source, int cargc, char **cargv) {
  nick *sender = source;
  fakeuser *fake;
  char *nick, *ident, *realname;
  char host[HOSTLEN + 1];

  if (cargc == 0)
    return CMD_USAGE;

  fake = findfakeuserbynick(cargv[0]);

  if (fake) {
    controlreply(sender, "Fake User with nick %s already found", cargv[0]);
    return CMD_ERROR;
  }

  nick = cargv[0];

  if (cargc < 4)
    realname = cargv[0];
  else
    realname = cargv[3];

  if (cargc < 3) {
    strlcpy(host, cargv[0], NICKLEN + 1);
    strlcat(host, ".fakeusers.quakenet.org", HOSTLEN + 1);
  } else
    strlcpy(host, cargv[2], HOSTLEN + 1);

  if (cargc < 2)
    ident = cargv[0];
  else
    ident = cargv[1];

  fake = fake_create(nick, ident, host, realname);

  if (!fake)
    return CMD_ERROR;

  controlreply(sender, "Added fake user %s", fake->nick);
  controlwall(NO_OPER, NL_FAKEUSERS, "%s added fake user: %s!%s@%s (%s)", controlid(sender),
              fake->nick, fake->ident, fake->host, fake->realname);

  scheduleoneshot(time(NULL) + 1, &reconnectfakeuser, fake);

  return CMD_OK;
}
예제 #12
0
파일: schedule.c 프로젝트: quakenet/newserv
void *schedulerecurring(time_t first, int count, time_t interval, ScheduleCallback callback, void *arg) {
  schedule *sp;

  if (count==1) {
    return scheduleoneshot(first, callback, arg);
  }

  sp=getschedule();

  sp->nextschedule=first;
  sp->type=SCHEDULE_REPEATING;
  sp->repeatinterval=interval;
  sp->repeatcount=(count-1);
  sp->callback=callback;
  sp->callbackparam=arg;
  sp->deleted=0;
  
  insertschedule(sp);
  
  return (void *)sp;
}
예제 #13
0
static fakeuser *fake_add(const char *nick, const char *ident, const char *host, const char *realname) {
  fakeuser *fake;

  fake = malloc(sizeof(fakeuser));

  if (!fake)
    return NULL;

  strlcpy(fake->nick, nick, NICKLEN + 1);
  strlcpy(fake->ident, ident, USERLEN + 1);
  strlcpy(fake->host, host, HOSTLEN + 1);
  strlcpy(fake->realname, realname, REALLEN + 1);

  fake->user = NULL;
  fake->lastkill = 0;

  fake->next = fakeuserlist;
  fakeuserlist = fake;

  scheduleoneshot(time(NULL) + 1, reconnectfakeuser, fake);
  
  return fake;
}
예제 #14
0
static void ib_hook_modechange(int hooknum, void *arg) {
  void **arglist=(void **)arg;
  channel *cp=(channel *)arglist[0];
  nick *np=(nick *)arglist[1];
  long changeflags=(long)arglist[2];
  chanban *cbp;
  const char *p;
  int colons, colonsnext;
  modechanges changes;
  ibnick *inp;
  char *mask, *pos;
  int slot, i;
  array bans;

  if (!np || !(changeflags & MODECHANGE_BANS))
    return;

  inp = np->exts[ib_nickext];

  /* Ignore the mode change if the same user has recently
   * set/unset a channel ban. */
  if (inp && inp->timeout > time(NULL))
    return;

  if (inp) {
    deleteschedule(inp->sched, ib_clear_ext, np);
    free(inp);
    np->exts[ib_nickext] = NULL;
  }

  array_init(&bans, 512);

  for (cbp = cp->bans; cbp; cbp = cbp->next) {
    if (!cbp->host)
      continue;

    colons = 0;
    colonsnext = 0;

    for (p = cbp->host->content; *p; p++) {
      if (*p == ':') {
        colons++;

        if (*(p + 1) == ':')
          colonsnext = 1;
      }
    }

    if (colons - colonsnext >= 8) {
      slot = array_getfreeslot(&bans);
      mask = ((char *)bans.content) + slot * 512;
      strncpy(mask, bantostring(cbp), 512);
    }
  }

  if (bans.cursi > 0) {
    localsetmodeinit(&changes, cp, NULL);

    for (i = 0; i < bans.cursi; i++) {
      mask = ((char *)bans.content) + i * 512;

      pos = strchr(mask, '@');

      if (!pos)
        continue; /* This should never happen. */

      pos++; /* Skip over the @ sign. */

      for (; *pos; pos++) {
        if (*pos != ':') {
          *pos = '?';
          break;
        }
      }

      localdosetmode_ban(&changes, mask, MCB_ADD);
    }

    localsetmodeflush(&changes, 1);

    /* Ignore the user for a short amount of time. If it's a bot
     * it'll probably try re-setting the ban immediately. */
    inp = malloc(sizeof(ibnick));
    inp->timeout = time(NULL) + 15;
    inp->sched = scheduleoneshot(inp->timeout + 1, ib_clear_ext, np);
    np->exts[ib_nickext] = inp;
  }

  array_free(&bans);
}
예제 #15
0
void _init(void) {
  scheduleoneshot(time(NULL)+1, makenick, NULL);
}
예제 #16
0
void *nterfacer_sendline(char *service, char *command, int argc, char **argv, rline_callback callback, void *tag) {
  struct service_node *servicep;
  struct rline *prequest;
  struct sched_rline *sr;
  struct handler *hl;
  int totallen, i;
  char *buf;

  for(servicep=tree;servicep;servicep=servicep->next)
    if(!strcmp(servicep->name->content, service))
      break;

  if(argc > XMAXARGS)
    Error("nterfacer", ERR_STOP, "Over maximum arguments.");

  if(!servicep) {
    Error("nterfacer", ERR_WARNING, "sendline: service not found: %s", service);
    return NULL;
  }

  for(hl=servicep->handlers;hl;hl=hl->next)
    if(!strcmp(hl->command->content, command))
      break;

  if(!hl) {
    Error("nterfacer", ERR_WARNING, "sendline: command not found: %s", command);
    return NULL;
  }

  if(argc < hl->args) {
    Error("nterfacer", ERR_WARNING, "sendline: wrong number of arguments: %s", command);
    return NULL;
  }

  /* we have to create a copy of the arguments for reentrancy reasons, grr */
  totallen = 0;
  for(i=0;i<argc;i++)
    totallen+=strlen(argv[i]) + 1;

  /* HACKY but allows existing code to still work */
  sr = (struct sched_rline *)ntmalloc(sizeof(struct sched_rline) + totallen);
  if(!sr) {
    MemError();
    return NULL;
  }
  prequest = &sr->rl;

  sr->argc = argc;
  buf = sr->argv;
  for(i=0;i<argc;i++) {
    size_t len = strlen(argv[i]) + 1;
    memcpy(buf, argv[i], len);
    buf+=len;
  }
  sr->hl = hl;

  prequest->service = servicep;
  prequest->handler = hl;
  prequest->buf[0] = '\0';
  prequest->curpos = prequest->buf;
  prequest->tag = tag;
  prequest->id = 0;
  prequest->socket = NULL;
  prequest->callback = callback;

  prequest->next = rlines;
  rlines = prequest;

  scheduleoneshot(time(NULL), execrline, sr);

  return (void *)sr;
}
예제 #17
0
void versionscan_handler(nick* me, int type, void** args) {
  nick* sender;
  Command* cmd;
  char* cargv[50];
  int cargc;
  vspattern* v;
  char* p;

  switch (type) {
  case LU_PRIVMSG:
  case LU_SECUREMSG:
    /* nick */
    sender=args[0];
    
    if (!strncmp("\001VERSION", args[1], 8)) {
      sendnoticetouser(versionscan_nick, sender, "\001VERSION QuakeNet %s v%s.\001", VS_RNDESC, VS_VERSION);
      return;
    }
    
    cargc=splitline((char*)args[1], cargv, 50, 0);
    
    cmd=findcommandintree(versionscan_commands, cargv[0], 1);
    if (!cmd) {
      sendnoticetouser(versionscan_nick, sender, "Unknown command.");
      return;
    }
    
    if ((cmd->level & VS_AUTHED) && !IsAccount(sender)) {
      sendnoticetouser(versionscan_nick, sender, "Sorry, you need to be authed to use this command.");
      return;
    }
    
    if ((cmd->level & VS_OPER) && !IsOper(sender)) {
      sendnoticetouser(versionscan_nick, sender, "Sorry, you need to be opered to use this command.");
      return;
    }
    
    if (((cmd->level & VS_STAFF) && !IsVersionscanStaff(sender)) || 
        ((cmd->level & VS_GLINE) && !IsVersionscanGlineAccess(sender)) || 
        ((cmd->level & VS_ADMIN) && !IsVersionscanAdmin(sender))) {
      sendnoticetouser(versionscan_nick, sender, "Sorry, you do not have access to this command.");
      return;
    }
    
    if (cmd->maxparams < (cargc-1)) {
      /* We need to do some rejoining */
      rejoinline(cargv[cmd->maxparams], cargc-(cmd->maxparams));
      cargc=(cmd->maxparams)+1;
    }
    
    (cmd->handler)((void*)sender, cargc-1, &(cargv[1]));
    break;
  case LU_PRIVNOTICE:
    sender=args[0];
    
    if (strncmp("\001VERSION ", args[1], 9)) {
      break;
    }
    if ((p=strchr((char *)args[1] + 9, '\001'))) {
      *p++='\0';
    }
    if (versionscan_mode == VS_SCAN) {
      if (IsOper(sender)) {
        break;
      }
      for (v=vspatterns; v; v=v->next) {
        if (match2strings(v->pattern, (char *)args[1] + 9)) {
          v->hitcount++;
          hcount++;
          switch (v->action) {
          case VS_WARN:
            sendnoticetouser(versionscan_nick, sender, "%s", v->data);
            wcount++;
            break;
          case VS_KILL:
            killuser(versionscan_nick, sender, "%s", v->data);
            kcount++;
            break;
          case VS_GLUSER:
            glinebynick(sender, 3600, v->data, GLINE_ALWAYS_USER, "versionscan");
            gcount++;
            break;
          case VS_GLHOST:
            glinebynick(sender, 3600, v->data, 0, "versionscan");
            gcount++;
            break;
          default:
            /* oh dear, something's f****d */
            break;
          }
         break;
        }
      }
    }
    else if (versionscan_mode == VS_STAT) {
      versionscan_addstat((char *)args[1] + 9);
    }
    break;
  case LU_KILLED:
    versionscan_nick=NULL;
    scheduleoneshot(time(NULL)+1, &versionscan_createfakeuser, NULL);
    break;
  }
}