Ejemplo n.º 1
0
void pwdgen_main()
{
	size_t i = 0;
	int c;

	while (i < length) {
		c = rndascii();

		if (!passes_one_func(c, accept_funcs, n_accept_funcs)
		    && !is_member_of(c, accept_chars, n_accept_chars)) {
			continue;
		}

		if (passes_one_func(c, exclude_funcs, n_exclude_funcs)
		    || is_member_of(c, exclude_chars, n_exclude_chars)) {
			continue;
		}

		putchar(c);
		++i;
	}

	putchar('\n');
}
Ejemplo n.º 2
0
/* s = service the command was sent to
   u = user the command was sent from */
void bs_drop(IRC_User *s, IRC_User *u)
{
	char *bot_nick;
	u_int32_t bid;
	u_int32_t source_snid;

  CHECK_IF_IDENTIFIED_NICK

	if (!is_member_of(u, bs_group) && !is_sadmin(u->snid))
	{
		send_lang(u, s, PERMISSION_DENIED);
		return;
	}
	
	bot_nick = strtok(NULL, " ");
	
	if (!bot_nick)
		send_lang(u, s, BS_DROP_SYNTAX_INV);
	else
	/* check if bot already exists */
	if ((sql_singlequery("SELECT bid FROM botserv WHERE nick=%s", 
		sql_str(irc_lower_nick(bot_nick))) < 1) || !(bid = sql_field_i(0)))
			send_lang(u, s, BS_DROP_BOT_X_NOT_FOUND, bot_nick);
	else
	{
		log_log(bs_log, mod_info.name, "%s dopped bot %s!", u->nick, bot_nick);	
		/* check if it is online */
		if(irc_FindLocalUser(bot_nick))
		{
			IRC_User *user = irc_FindLocalUser(bot_nick);
			if(user)
				irc_QuitLocalUser(user, "Bot droped");				
		}
		sql_execute("DELETE FROM botserv WHERE bid=%d", bid);
		send_lang(u, s, BS_DROP_DROPPED_X, bot_nick);
	}
}
Ejemplo n.º 3
0
/* s = service the command was sent to
   u = user the command was sent from */
void bs_assign(IRC_User *s, IRC_User *u)
{
	char *channame, *bot_nick;
	MYSQL_RES *res;
	MYSQL_ROW row;
	ChanRecord *cr;
	IRC_User *user;
	int bid;
	
	channame = strtok(NULL, " ");
	bot_nick = strtok(NULL, "");

	if(IsNull(channame) || *channame=='\0' || IsNull(bot_nick) || *bot_nick=='\0')
	{
		send_lang(u, s, BS_ASSIGN_SYNTAX);
		return;
	}
	else
	{
		cr = OpenCR(channame);

		if (!cr)
		{
			send_lang(u, s, BS_ASSIGN_NO_SUCH_CHANNEL, channame);
			return;
		}

		bs_group = find_group(AdminRole);
		
		if ((u->snid != cr->founder) && !is_sadmin(u->snid) && !is_member_of(u, bs_group))
		{
			send_lang(u, s, BS_ASSIGN_NOT_ALLOWED, channame);
			return;
		}
		
		res = sql_query("SELECT bid FROM bs_chan WHERE scid=%d", cr->scid);
		row = sql_next_row(res);
		if (row)
		{
			send_lang(u, s, BS_ASSIGN_ALREADY_ASSIGNED, channame);
			sql_free(res);
			return;
		}
		sql_free(res);

		res = sql_query("SELECT bid FROM botserv WHERE nick=%s", sql_str(bot_nick));
		row = sql_next_row(res);
		if (!row)
		{
			send_lang(u, s, BS_ASSIGN_NO_SUCH_BOT, bot_nick);
			sql_free(res);
			return;
		}
		
		bid = atoi(row[0]);
	
		sqlb_init("bs_chan");
		sqlb_add_int("scid", cr->scid);
		sqlb_add_int("bid", bid);
		sqlb_add_int("kick", 0);
		sqlb_add_int("ttb", 0);
		sqlb_add_int("capsmin", 0);
		sqlb_add_int("capspercent", 0);
		sqlb_add_int("floodlines", 0);
		sqlb_add_int("floodsecs", 0);
		sqlb_add_int("repeattimes", 0);
		sqlb_add_int("bantype", 0);
		sqlb_add_int("banlast", 0);
		sql_execute("%s", sqlb_insert());

		res = sql_query("SELECT bid,scid FROM bs_chan WHERE scid=%d AND bid=%d", cr->scid, bid);
		if (!res)
		{
			send_lang(u, s, BS_ASSIGN_FAILED, bot_nick, bid, channame);
			return;
		}
		sql_free(res);
		
		user = irc_FindLocalUser(bot_nick);
		if (user)
		{
			IRC_Chan *chan = irc_ChanJoin(user, channame, 0);
			irc_ChanMode(bsu->u, chan, "+ao %s %s", user->nick, user->nick);
		}
												
		send_lang(u, s, BS_ASSIGN_DONE, bot_nick, channame);
		return;
	}
	return;
}
Ejemplo n.º 4
0
/* s = service the command was sent to
   u = user the command was sent from */
void bs_unassign(IRC_User *s, IRC_User *u)
{
	char *channame;
	MYSQL_RES *res;
	MYSQL_ROW row;
	ChanRecord *cr;
	IRC_User *user;
	int bid;
	
	channame = strtok(NULL, "");

	if(IsNull(channame) || *channame=='\0')
	{
		send_lang(u, s, BS_UNASSIGN_SYNTAX);
		return;
	}

	else
	{
		cr = OpenCR(channame);

		if (!cr)
		{
			send_lang(u, s, BS_UNASSIGN_NO_SUCH_CHANNEL, channame);
			return;
		}

		bs_group = find_group(AdminRole);
		
		if ((u->snid != cr->founder) && !is_sadmin(u->snid) && !is_member_of(u, bs_group))
		{
			send_lang(u, s, BS_UNASSIGN_NOT_ALLOWED, channame);
			return;
		}
		
		res = sql_query("SELECT bid FROM bs_chan WHERE scid=%d", cr->scid);
		row = sql_next_row(res);
		if (!row)
		{
			send_lang(u, s, BS_UNASSIGN_NOT_ASSIGNED, channame);
			sql_free(res);
			return;
		}
		sql_free(res);

		bid = atoi(row[0]);
		res = sql_query("SELECT nick FROM botserv WHERE bid=%d", bid);
		row = sql_next_row(res);

		user = irc_FindLocalUser(row[0]);
		if (user)
		{
			IRC_Chan *chan = irc_FindChan(channame);
			irc_ChanPart(user, chan);
		}
		
		sql_execute("DELETE FROM bs_chan WHERE bid=%d AND scid=%d", bid, cr->scid);
		
		send_lang(u, s, BS_UNASSIGN_DONE, user->nick, channame);
		return;
	}
	return;
}
Ejemplo n.º 5
0
/* s = service the command was sent to
   u = user the command was sent from */
void ns_group(IRC_User *s, IRC_User *u)
{
  u_int32_t source_snid;
  u_int32_t snid;
  char *cmd;
  char *gname;
  char *nick;
  int memberc = 0;
  u_int32_t master_sgid;
  u_int32_t sgid;

  CHECK_IF_IDENTIFIED_NICK
  
  cmd = strtok(NULL, " ");
  gname = strtok(NULL, " ");
  
  /* base syntax validation */
  if(IsNull(cmd))
    send_lang(u, s, NS_GROUP_SYNTAX);
  else if(strcasecmp(cmd,"CREATE") == 0)
    {
      char *master;
      char *gdesc;
      char *umodes = NULL;
      master = strtok(NULL, " ");
      gdesc = strtok(NULL, ""); 
      if(gname) /* first check if the name contains umodes */
      {
        char *pumodes;
        char *eumodes;
        pumodes = strchr(gname,'[');
        if(pumodes && pumodes[0])
        {
          *(pumodes++) = '\0';
          eumodes = strchr(pumodes,']');
          if(eumodes)
          {
            *eumodes = '\0';
            umodes = pumodes;
          }
        }
      }
      /* syntax validation */
      if(IsNull(gname) || IsNull(master))
        send_lang(u, s, NS_GROUP_CREATE_SYNTAX);
      /* permissions validation */
      else if(!is_sroot(source_snid))
        send_lang(u, s, NICK_NOT_ROOT);
      /* check requirements */
      else if((master_sgid = find_group(master)) == 0)
        send_lang(u, s, NS_GROUP_MASTER_NOT_FOUND, master);
      /* avoid duplicates */
      else if((sgid = find_group(gname)) != 0)
        send_lang(u, s, NS_GROUP_ALREADY_EXISTS, gname);
      /* execute operation */
      else if(group_create(gname, master_sgid, gdesc, umodes) > 0)
      /* report operation status */
        send_lang(u, s, NS_GROUP_CREATE_OK, gname);
      else 
        send_lang(u, s, UPDATE_FAIL);
    }
  else if(strcasecmp(cmd,"ADD") == 0)
    {
      u_int32_t duration = 0;
      time_t master_expire = 0;              
      u_int32_t is_master_sgid;
      char *duration_str;
      
      nick = strtok(NULL, " ");
      duration_str =  strtok(NULL, " ");
      if(duration_str)
        duration = time_str(duration_str);
        
      /* syntax validation */
      if(IsNull(gname) || IsNull(nick))
        send_lang(u, s, NS_GROUP_ADD_SYNTAX);
      /* check requirements */
      else if((snid = nick2snid(nick)) == 0)
        send_lang(u, s, NO_SUCH_NICK_X, nick);      
      else if((sgid = find_group(gname)) == 0)
        send_lang(u, s, NO_SUCH_GROUP_X, gname);
      /* privileges validation */
      else if(group_is_full(sgid))
        send_lang(u, s, NS_GROUP_IS_FULL_X);
      else if(((is_master_sgid = is_master(source_snid, sgid))== 0) 
        && !is_sroot(source_snid))
          send_lang(u, s, NOT_MASTER_OF_X, gname);
      /* avoid duplicates */
      else if(sql_singlequery("SELECT t_expire FROM ns_group_users "
        " WHERE sgid=%d AND snid=%d", is_master_sgid, source_snid)
        && (master_expire = sql_field_i(0)) && duration)
        send_lang(u, s, NS_GROUP_CANT_DEFINE_TIME_X, gname);
      else if(is_member_of(snid, sgid))
        send_lang(u, s, NICK_X_ALREADY_ON_X, nick, gname);
      /* execute operation */
      else
      {
        time_t t_expire = 0;
        if(master_expire)
          t_expire = master_expire;
        else if(duration)
          t_expire = irc_CurrentTime + duration;
        if(add_to_group(sgid, snid, t_expire) > 0)
        /* report operation status */
        {   
          char *server = strchr(gname, '@');      
          IRC_User *user = irc_FindUser(nick);   
          send_lang(u, s, NICK_ADDED_X_X, nick, gname);
          if(server) /* we have a server rule to be validated */
            ++server;
          if(user && (!server || (strcasecmp(server,u->server->sname) == 0)))
          {
            if(user->extra[ED_GROUPS] == NULL)
            {
              user->extra[ED_GROUPS] = malloc(sizeof(darray));
              array_init(user->extra[ED_GROUPS], 1, DA_INT);
            }
            array_add_int(user->extra[ED_GROUPS], sgid);
          }
        }
      	else
          send_lang(u, s, UPDATE_FAIL);        
      }
    }
  else if(strcasecmp(cmd,"DEL") == 0)
    {
      nick = strtok(NULL, " ");
      /* syntax validation */ 
      if(IsNull(gname) || IsNull(nick))
        send_lang(u, s, NS_GROUP_DEL_SYNTAX);
      /* check requirements */
      else if((sgid = find_group(gname)) == 0)
        send_lang(u, s, NO_SUCH_GROUP_X, gname);
      else if((snid = nick2snid(nick)) == 0)
        send_lang(u, s, NO_SUCH_NICK_X, nick);        
      /* privileges validation */
      else if(!is_sroot(source_snid) && !is_master(source_snid, sgid))
        send_lang(u, s, NOT_MASTER_OF_X, gname);
      else if(!is_member_of(snid, sgid))
        send_lang(u, s, NICK_X_NOT_ON_GROUP_X, nick, gname);
      /* execute operation */
      else if(del_from_group(sgid, snid) > 0)
      /* report operation status */
        {
          IRC_User *user = irc_FindUser(nick);
          send_lang(u, s, NICK_DEL_X_X, nick, gname);
          if(user)
            array_del_int(user->extra[ED_GROUPS], sgid);
        }
      else
        send_lang(u, s, UPDATE_FAIL);
    }
  else if(strcasecmp(cmd,"INFO") == 0)
    {
      /* syntax validation */
      if(IsNull(gname))
        send_lang(u, s, NS_GROUP_INFO_SYNTAX);
      /* check requirements */
      else if((sgid = find_group(gname)) == 0)
        send_lang(u, s, NO_SUCH_GROUP_X, gname);
      /*  check privileges */
      else if(!is_master(source_snid, sgid) && 
              !is_member_of(source_snid, sgid))
        send_lang(u, s, NOT_MASTER_OR_MEMBER_X, gname);      
      else if((sgid = find_group(gname))) /* we need to get the group description */
        {
          /* execute operation */  
          MYSQL_RES* res;
          master_sgid = 0;
          sql_singlequery("SELECT gdesc, master_sgid FROM ns_group WHERE sgid=%d", 
            sgid);  
          send_lang(u, s, NS_GROUP_INFO_X, gname);        
          if(sql_field(0))
            send_lang(u, s, NS_GROUP_INFO_DESC_X, sql_field(0));
          master_sgid = sql_field_i(1);
          if(master_sgid != 0)
          {
            if(sql_singlequery("SELECT name FROM ns_group WHERE sgid=%d", 
                master_sgid) > 0)
            {
              send_lang(u, s, NS_GROUP_INFO_MASTER_X, sql_field(0));              
            }
          }
          res = sql_query("SELECT n.nick, gm.t_expire FROM "
            "nickserv n, ns_group_users gm WHERE gm.sgid=%d AND n.snid=gm.snid", 
            sgid);
          if(sql_next_row(res) == NULL)
            send_lang(u, s, NS_GROUP_EMPTY);
          else
          {
            do
            {
      				char buf[64];
      				struct tm *tm;
      				time_t t_expire = sql_field_i(1);
							buf[0] = '\0';
							if(t_expire)
							{
      					tm = localtime(&t_expire);
      					strftime(buf, sizeof(buf), format_str(u, DATE_FORMAT), tm);
              	send_lang(u,s, NS_GROUP_ITEM_X_X, sql_field(0), buf);
							} else
                send_lang(u,s, NS_GROUP_ITEM_X, sql_field(0));
              ++memberc;
            } while(sql_next_row(res));
            send_lang(u, s, NS_GROUP_MEMBERS_TAIL_X, memberc);
          }
          sql_free(res);
        }  
    }
  else if(strcasecmp(cmd,"DROP") == 0)
    {
      /* syntax validation */
      if(IsNull(gname))
        send_lang(u, s, NS_GROUP_DROP_SYNTAX);
      /* privileges validation */
      else if(!is_sroot(source_snid))
        send_lang(u, s, NICK_NOT_ROOT);
      /* check requirements */
      else if((sgid = find_group(gname)) == 0)
        send_lang(u, s, NO_SUCH_GROUP_X, gname);
      /* NOTE: The following sql_field( depends on previous find_group( */
      else if(!sql_field(2) || (master_sgid = atoi(sql_field(2))) == 0)
        send_lang(u, s, CANT_DROP_ROOT);        
      /* execute operation */
      else if(drop_group(sgid)>0)      
      /* report operation status */
        send_lang(u, s, NS_GROUP_DROPPED_X, gname);
      else
        send_lang(u, s, UPDATE_FAIL);
    }
  else if(strcasecmp(cmd,"LIST") == 0) /* List groups */
    {
      MYSQL_RES* res;
      MYSQL_ROW row;
      /* privileges validation */
      if(!is_sroot(source_snid))
        send_lang(u, s, NICK_NOT_ROOT);
      else 
        {
          res = sql_query("SELECT name, master_sgid, gdesc FROM ns_group");
          send_lang(u, s, NS_GROUP_LIST_HEADER);
          while((row = sql_next_row(res)))
            {
              char* mname = "";
              if(row[1] && sql_singlequery("SELECT name FROM ns_group WHERE sgid=%d", 
                atoi(row[1])) > 0)
                mname = sql_field(0);          
              send_lang(u, s, NS_GROUP_LIST_X_X_X, row[0], mname, 
                row[2] ? row[2] : "");
            }
          send_lang(u, s, NS_GROUP_LIST_TAIL);
          sql_free(res);          
        }
    }
  else if(strcasecmp(cmd,"SHOW") == 0) /* Show groups we belong to */
    {
      /* groups count */
      int gc = array_count(u->extra[ED_GROUPS]);
      if(gc == 0)
        send_lang(u, s, NO_GROUPS);
      else
      {
        MYSQL_RES *res;
        MYSQL_ROW row;
        char buf[64];
        struct tm *tm;
        time_t t_expire;
#if 0        
        int i;        
        u_int32_t* data = array_data_int(u->extra[ED_GROUPS]);
#endif        
        send_lang(u, s, NS_GROUP_SHOW_HEADER);
#if 0        
        for(i = 0; i < gc; ++i)
        {
          if(sql_singlequery("SELECT name,gdesc FROM ns_group WHERE sgid=%d", 
            data[i]) > 0 )              
              send_lang(u, s, NS_GROUP_SHOW_X_X, sql_field(0), 
                sql_field(1) ? sql_field(1) : "");
        }
#endif
        res = sql_query("SELECT g.name, g.gdesc, gu.t_expire FROM ns_group g, ns_group_users gu"
          " WHERE gu.snid=%d AND g.sgid=gu.sgid ORDER BY g.master_sgid",
          source_snid);
        while((row = sql_next_row(res)))
        {
          t_expire = sql_field_i(2);
					buf[0] = '\0';
					if(t_expire)
					{
      		  tm = localtime(&t_expire);
            strftime(buf, sizeof(buf), format_str(u, DATE_FORMAT), tm);
            send_lang(u,s, NS_GROUP_SHOW_X_X_X, row[0], row[1] ? row[1] : "", buf);        
          }
          else
            send_lang(u, s, NS_GROUP_SHOW_X_X, row[0], row[1] ? row[1] : "");
        }
        send_lang(u, s, NS_GROUP_SHOW_TAIL);
        sql_free(res);
      }
    }
  else if(strcasecmp(cmd,"SET") == 0)
  {
    char *option;
    char *value ;
    option = strtok(NULL, " ");
    value = strtok(NULL, " ");
    /* syntax validation */
    if(IsNull(gname) || IsNull(option))
      send_lang(u, s, NS_GROUP_SET_SYNTAX);
    /* privileges validation */
    else if(!is_sroot(source_snid))
      send_lang(u, s, NICK_NOT_ROOT);
    /* check requirements */
    else if((sgid = find_group(gname)) == 0)
      send_lang(u, s, NO_SUCH_GROUP_X, gname);
    else
    {
      if(strcasecmp(option,"AUTOMODES") == 0)
        STRING_SET("autoumodes", AUTOMODES_X_UNSET, AUTOMODES_X_CHANGED_TO_X)
      else if(strcasecmp(option,"DESC") == 0)
        STRING_SET("gdesc", DESC_X_UNSET, DESC_X_CHANGED_TO_X)
      else if(strcasecmp(option, "MAXUSERS") == 0)
        INT_SET("maxusers", NS_GROUP_SET_MAXUSERS_SET_X_X)
      else
        send_lang(u, s, SET_INVALID_OPTION_X, option);
    }
  }
Ejemplo n.º 6
0
/* s = service the command was sent to
   u = user the command was sent from */
void bs_create(IRC_User *s, IRC_User *u)
{
	char *bot_owner, *bot_nick, *bot_username, *bot_hostname, *bot_info;
	char *bot_time;
	int expire_time;
	u_int32_t owner_snid;
	u_int32_t source_snid;

	CHECK_IF_IDENTIFIED_NICK

	if (!is_member_of(u, bs_group) && !is_sadmin(u->snid))
	{
		send_lang(u, s, PERMISSION_DENIED);
		return;
	}
	
	bot_owner = strtok(NULL, " ");
	bot_time = strtok(NULL, " ");
	if(bot_time)
		expire_time = ftime_str(bot_time);
	bot_nick = strtok(NULL, " ");
	bot_username = strtok(NULL, " ");
	bot_hostname = strtok(NULL, " ");
	bot_info = strtok(NULL, "");
	
	if (!bot_owner || !bot_time || !bot_nick || !bot_username || !bot_hostname
		|| !bot_info || (expire_time==-1))
			send_lang(u, s, BS_CREATE_SYNTAX_INV);
	else
	/* check if the nickname is valid */
	if(!irc_IsValidNick(bot_nick))
		send_lang(u, s, BS_CREATE_INVALID_NICK_X, bot_nick);	
	else
	/* check if the username is valid */
	if(!irc_IsValidUsername(bot_username))
		send_lang(u, s, BS_CREATE_INVALID_USER_X, bot_username);
	else 
	/* check if the hostname is valid */
	if(!irc_IsValidHostname(bot_hostname))
		send_lang(u, s, BS_CREATE_INVALID_HOST_X, bot_hostname);
	else 	
	/* check if bot already exists */
	if (sql_singlequery("SELECT bid FROM botserv WHERE nick=%s", 
		sql_str(irc_lower_nick(bot_nick))) > 0)
			send_lang(u, s, BS_CREATE_X_EXISTS, bot_nick);
	else
	/* this should never happen, bot in mem but not on the db */
	if(irc_FindLocalUser(bot_nick))
	{
		 send_lang(u, s, BS_CREATE_X_EXISTS, bot_nick);
		 log_log(bs_log, mod_info.name, 
		 	"Bot %s was found in mem but not on the db !", bot_nick);
	}
	else
	/* check if the nick is registered */
	/* need to fix this, we should not access tables from other modules	 */
	if(nick2snid(bot_nick))
	  send_lang(u, s, BS_CREATE_NICK_X_IS_REG_X, bot_nick);
	else
	/* check if the owner exists */
	if((owner_snid = nick2snid(bot_owner)) == 0)
	  send_lang(u, s, NICK_X_NOT_REGISTERED, bot_owner);
	else
	/* all conditions were checked, lets proceed */
	{
		sqlb_init("botserv");
		sqlb_add_int("owner_snid", owner_snid);
		sqlb_add_str("nick", bot_nick);
		sqlb_add_str("username", bot_username);
		sqlb_add_str("publichost", bot_hostname);
		sqlb_add_str("realname", bot_info);
		sqlb_add_int("t_create", irc_CurrentTime);
		sqlb_add_int("t_expire", 
			expire_time ? irc_CurrentTime+expire_time : 0);
		if(sql_execute("%s", sqlb_insert()) < 0)
			send_lang(u, s, UPDATE_FAIL);
		else
		{
			log_log(bs_log, mod_info.name, "%s created bot %s %s %s %s",
				u->nick, bot_nick, bot_username, bot_hostname, bot_info);
			irc_CreateLocalUser(bot_nick, bot_username, bot_hostname,
				bot_hostname, bot_info, "+r");
			send_lang(u, s, BS_CREATE_CREATED_X, bot_nick);
		}
	}
}