Esempio n. 1
0
char *db_getchannel_byid(int chanid)
{
    char *res = NULL;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    MYSQL_ROW row;
#endif

    if (!denora->do_sql) {
        return NULL;
    }
    SET_SEGV_LOCATION();

    rdb_query(QUERY_HIGH, "SELECT channel FROM %s WHERE chanid=%d",
              ChanTable, chanid);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (!mysql_num_rows(mysql_res)) {
            alog(LOG_NONEXISTANT, "channel not found ! %d", chanid);
        } else {
            row = mysql_fetch_row(mysql_res);
            res = rdb_escape(row[0]);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
    return res;
}
Esempio n. 2
0
void db_removenick(char *nick, char *reason)
{
    char *sqlreason;
    int nickid = db_getnick(nick);

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    if (nickid == 0) {
        alog(LOG_DEBUG, "nickid 0");
        return;
    }
    SET_SEGV_LOCATION();

    db_removefromchans(nickid);
    if (UserCacheTime) {
        sqlreason = rdb_escape(reason);
        rdb_query(QUERY_LOW,
                  "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d",
                  UserTable, sqlreason, nickid);
        if (sqlreason) {
            free(sqlreason);
        }
    } else {
        rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d",
                  UserTable, nickid);
    }


    SET_SEGV_LOCATION();
}
Esempio n. 3
0
/**
 * Handle AWAY messages
 *
 * @param source is the nick of the person whom is now away
 * @param msg is the text of the away message
 *
 * @return always returns MOD_CONT
 */
int m_away(char *source, char *msg)
{
    User *u;

    if (!source) {
        return MOD_CONT;
    }
    u = user_find(source);
    if (!u) {
        return MOD_CONT;
    }

    SET_SEGV_LOCATION();

    if (msg) {
        stats->away++;
        u->isaway = 1;
        u->awaymsg = sstrdup(msg);
    } else {
        stats->away--;
        u->isaway = 0;
        u->awaymsg = NULL;
    }
    if (denora->do_sql) {
        rdb_query
            (QUERY_LOW,
             "UPDATE %s SET away=\'%s\', awaymsg=\'%s\' WHERE nickid=%d",
             UserTable, (u->isaway ? (char *) "Y" : (char *) "N"),
             rdb_escape(u->awaymsg), db_getnick(u->sqlnick));
    }
    return MOD_CONT;
}
Esempio n. 4
0
/* chan is created if not exists */
int db_getchancreate(char *chan)
{
    int res = -1;
    Channel *c;
    char *channel;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
#endif

    SET_SEGV_LOCATION();
    strtolwr(chan);

    c = findchan(chan);

    if (c) {
        if (c->sqlid) {
            return c->sqlid;
        } else {
            channel = sstrdup(c->sqlchan);
        }
    } else {
        channel = rdb_escape(chan);
    }


    if (!denora->do_sql) {
        return -1;
    }
    strtolwr(channel);
    rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE channel=\'%s\'",
              ChanTable, channel);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_res) {
        if (mysql_num_rows(mysql_res))
            res = atoi(*mysql_fetch_row(mysql_res));
        mysql_free_result(mysql_res);
    }
#endif
    SET_SEGV_LOCATION();
    if (res == -1) {
        rdb_query(QUERY_HIGH, "INSERT INTO %s (channel) VALUES (\'%s\')",
                  ChanTable, channel);
        res = rdb_insertid();
    }
    SET_SEGV_LOCATION();
    if (c && res) {
        c->sqlid = res;
    }
    free(channel);
    return res;
}
Esempio n. 5
0
void db_removefromchans(int nickid)
{
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    char **res;
    int chanid;
#endif

    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    rdb_query
        (QUERY_HIGH,
         "SELECT %s.chanid, channel FROM %s, %s WHERE nickid=%d AND %s.chanid = %s.chanid",
         IsOnTable, IsOnTable, ChanTable, nickid, ChanTable, IsOnTable);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
#endif
    rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d", IsOnTable,
              nickid);
    SET_SEGV_LOCATION();
#ifdef USE_MYSQL
    if (mysql_res) {
        while ((res = mysql_fetch_row(mysql_res))) {
            char *chan = rdb_escape(res[1]);
            chanid = db_getchannel(chan);
            rdb_query(QUERY_LOW,
                      "UPDATE %s SET currentusers=currentusers-1 WHERE chanid=%d",
                      ChanTable, chanid);
            if (!ChanHasMode(chan, ircd->persist_char))
                db_checkemptychan(atoi(res[0]));
            free(chan);
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
    }
#endif
}
Esempio n. 6
0
/**
 * Handle KILL messages
 *
 * @param source is the server or nick that send the message
 * @param nick is the user name that was killed
 * @param msg is the text of the kill message
 *
 * @return void - no returend value
 */
void m_kill(char *source, char *nick, char *msg)
{
    User *u;
    ServStats *s;
    int id;

    if ((u = user_find(source))) {
        if ((s = findserverstats(u->server->name))) {
            s->ircopskills++;
        }
        send_event(EVENT_GLOBAL_KILL, 3, source, nick, msg);
    } else if ((s = findserverstats(source))) {
        s->serverkills++;
        send_event(EVENT_SERVER_KILL, 3, source, nick, msg);
    }
    do_kill(nick, msg);
    if (denora->do_sql) {
        nick = rdb_escape(nick);
        db_removenick(nick, msg);
        if (UserCacheTime) {
            db_cleanuser();
        }
        free(nick);
    }
    if (s && denora->do_sql) {
        id = db_getserver(s->name);
        if (id) {
            rdb_query
                (QUERY_LOW,
                 "UPDATE %s SET ircopskills=%d, serverkills=%ld WHERE servid=%d",
                 ServerTable, s->ircopskills, s->serverkills, id);
        }
    }
    if (nickIsServices(nick)) {
        introduce_user(nick);
    }
}
Esempio n. 7
0
/**
 * Seen
 **/
char *do_seen(User * u, char *target)
{
    char *split1 = NULL;
    char *seenhost = NULL;
    char *seennick = NULL;
    char *seenuname = NULL;
    struct tm tm;
    char buf[255];
    int i;
    MYSQL_RES *mysql_res;
    char *sqltarget;
    char usrchans[1024] = "\0";
    time_t tsnow = time(NULL);
    MYSQL_RES *mysql_res2;
    MYSQL_ROW mysql_row2;
    char cmodep[32] = "\0";
    char cmodes[32] = "\0";
    char cmodeA[32] = "\0";
    char cmodeO[32] = "\0";
    char umodep[32] = "\0";
	char umodeQ[32] = "\0";
	char umodeI[32] = "\0";
    double ctsdiff;
    time_t time0 = time(NULL);
    time_t time1 = time(NULL);
	time_t tt = time(NULL);
    char *message;
	char *uname = NULL;
    message = malloc(1024);

    sqltarget = rdb_escape(rdb_escape(target));
    for (i = 0; sqltarget[i]; i++)
        if (sqltarget[i] == '*')
            sqltarget[i] = '%';
    seenhost = myStrGetToken(sqltarget, '@', 1);
    split1 = myStrGetToken(sqltarget, '@', 0);
    seennick = myStrGetToken(split1, '!', 0);
    seenuname = myStrGetToken(split1, '!', 1);
    if (seenhost == NULL)
        seenhost = (char *) "%";
    if (seennick == NULL)
        seennick = (char *) "%";
    if (seenuname == NULL)
        seenuname = (char *) "%";
    free(sqltarget);
	
	if (!strcmp(seennick, "%")) {
		uname = sstrdup("%");
	} else {	
		rdb_query(QUERY_LOW, "SELECT uname FROM %s WHERE nick LIKE \'%s\' ",
					  AliasesTable, seennick);
		mysql_res = mysql_store_result(mysql);
		if (mysql_res && mysql_num_rows(mysql_res)) {
			mysql_row = mysql_fetch_row(mysql_res);
			uname = rdb_escape(mysql_row[0]);
		}
	}
	
	if (uname) {
		rdb_query(QUERY_LOW,
              "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s,%s WHERE %s.uname LIKE \"%s\" AND %s.nick = %s.nick AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;",
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, ServerTable, AliasesTable,
              AliasesTable, uname, UserTable,
              AliasesTable, UserTable, seenuname, UserTable, seenhost,
              UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable);
		mysql_res = mysql_store_result(mysql);
	} else {
		rdb_query(QUERY_LOW,
              "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s WHERE %s.nick LIKE \"%s\" AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;",
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, ServerTable, UserTable, seennick,
              UserTable, seenuname, UserTable, seenhost,
              UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable);
		mysql_res = mysql_store_result(mysql);
	}

    if (mysql_num_rows(mysql_res) > 0) {
        SET_SEGV_LOCATION();
        while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
            double tsdiff;
            if (mysql_row[5] != NULL) { 
                time0 = atoi(mysql_row[5]); /* connect time */
            }
            if (mysql_row[9] != NULL) {   
                time1 = atoi(mysql_row[9]); /* quit time */
            }
            if (strlen(mysql_row[3]) <= 1)
                mysql_row[3] = mysql_row[2];    /* no vhost, so using real host */
            if (stricmp(mysql_row[8], "Y") == 0) {
                if (mysql_row[5] != NULL) {
					tt = atoi(mysql_row[5]);
					tm = *localtime(&tt);
                    strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm);
                    mysql_row[5] = buf;
                }

                /* Display channels the user is in */
                /* check for ircd compatibility: chanmodes +AOsp and usermode +p */
                if (denora_cmode(CMODE_p) == 1)
                    sprintf(cmodep, "AND %s.mode_lp = 'N' ", ChanTable);
                if (denora_cmode(CMODE_s) == 1)
                    sprintf(cmodes, "AND %s.mode_ls = 'N' ", ChanTable);
                if (denora_cmode(CMODE_A) == 1)
                    sprintf(cmodeA, "AND %s.mode_ua = 'N' ", ChanTable);
                if (denora_cmode(CMODE_O) == 1)
                    sprintf(cmodeO, "AND %s.mode_uo = 'N' ", ChanTable);
                if (denora_umode(UMODE_p) == 1)
                    sprintf(umodep, "AND %s.mode_lp = 'N' ", UserTable);
				if (denora_get_ircd() == IRC_INSPIRCD11 || denora_get_ircd() == IRC_INSPIRCD12) {
					if (denora_umode(UMODE_Q) == 1)
						sprintf(umodeQ, "AND %s.mode_uq = 'N' ", UserTable);
					if (denora_umode(UMODE_I) == 1)
						sprintf(umodeI, "AND %s.mode_ui = 'N' ", UserTable);
				}
                rdb_query(QUERY_LOW,
                          "SELECT %s.channel FROM %s,%s,%s WHERE %s.nickid =%s AND %s.chanid = %s.chanid AND %s.nickid = %s.nickid %s%s%s%s%s%s%s ORDER BY %s.channel ASC",
                          ChanTable, ChanTable, UserTable, IsOnTable,
                          IsOnTable, mysql_row[0], ChanTable, IsOnTable,
                          UserTable, IsOnTable, cmodep, cmodes, cmodeA,
                          cmodeO, umodep, umodeQ, umodeI, ChanTable);
                mysql_res2 = mysql_store_result(mysql);
                while ((mysql_row2 = mysql_fetch_row(mysql_res2)) != NULL) {
                    strlcat(usrchans, mysql_row2[0], sizeof(usrchans));
                    strlcat(usrchans, " ", sizeof(usrchans));
                }
                mysql_free_result(mysql_res2);

                ctsdiff = difftime(tsnow, time0);       /* total online time */

                /* Prepare the reply for the user */
                if (stricmp(mysql_row[6], "N") == 0) {
                    if (strlen(usrchans) < 3) {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_ONLINE),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5]);
                    } else {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_ONLINEC),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                usrchans);
                    }
                } else {
                    if (strlen(usrchans) < 3) {
                        sprintf(message, moduleGetLangString(u, SEEN_AWAY),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                mysql_row[7]);
                    } else {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_AWAYC),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                mysql_row[7], usrchans);
                    }
                }
            } else {
                double dtsdiff;
                if (mysql_row[9] != NULL && mysql_row[5] != NULL) {
					tt = atoi(mysql_row[9]);
					tm = *localtime(&tt);
                    strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm);
                    mysql_row[9] = buf;
                    dtsdiff = difftime(tsnow, time1);   /* total offline time */
                    tsdiff = difftime(time1, time0);    /* total online time */
                    sprintf(message, moduleGetLangString(u, SEEN_OFFLINE),
                            mysql_row[1], mysql_row[4], mysql_row[3],
                            get_timestring(u, dtsdiff), mysql_row[9],
                            get_timestring(u, tsdiff), mysql_row[10]);
                } else {
                    sprintf(message, moduleGetLangString(u, SEEN_UNKNOWN),
                            mysql_row[1], mysql_row[4], mysql_row[3]);
                }
            }
        }
    } else {
        sprintf(message, moduleGetLangString(u, SEEN_EMPTY), target);
    }
    SET_SEGV_LOCATION();
    mysql_free_result(mysql_res);

    return message;
}
Esempio n. 8
0
/**
 * Handle seen fantasy command.
 * @param argc Argument count
 * @param argv Argument list
 * @return MOD_CONT or MOD_STOP
 **/
int do_fantasy(int argc, char **argv)
{
    User *u;
    char *chan;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    int i = 1;
#endif
    ChannelStats *cs;

    if (argc < 3) {
        return MOD_CONT;
    }

    if (!denora->do_sql) {
        return MOD_CONT;
    }

    if (stricmp(argv[0], "top10") == 0) {
        u = finduser(argv[1]);
        chan = rdb_escape(argv[2]);
        cs = find_cs(argv[2]);
        rdb_query
            (QUERY_HIGH,
             "SELECT * FROM %s WHERE chan=\'%s\' AND type=0 ORDER BY letters DESC LIMIT 10;",
             UStatsTable, chan);
        free(chan);
#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_num_rows(mysql_res) > 0) {
            if (cs->flags & CS_NOTICE) {
                notice_lang(s_StatServ, u, STATS_TOP10_CHANNEL, argv[2]);
            } else {
                denora_cmd_privmsg(s_StatServ, argv[2],
                                   getstring(NULL,
                                             STATS_TOP10_CHANNEL),
                                   argv[2]);
            }
            SET_SEGV_LOCATION();
            while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
                if (cs->flags & CS_NOTICE) {
                    notice_lang(s_StatServ, u, STATS_MESSAGE,
                                i, mysql_row[0], mysql_row[3],
                                mysql_row[4], mysql_row[5],
                                mysql_row[7], mysql_row[6]);
                } else {
                    denora_cmd_privmsg(s_StatServ, argv[2],
                                       getstring(NULL,
                                                 STATS_MESSAGE), i,
                                       mysql_row[0], mysql_row[3],
                                       mysql_row[4], mysql_row[5],
                                       mysql_row[7], mysql_row[6]);
                }
                i++;
            }
        }
        SET_SEGV_LOCATION();
        mysql_free_result(mysql_res);
#endif
    }

    return MOD_CONT;
}
Esempio n. 9
0
int chanstats_month(const char *name)
{
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    ChannelStats *cs;
    char *chan_;
#endif
    time_t tbuf;

    if (!denora->do_sql) {
        return MOD_CONT;
    }
    if (!name) {
        return MOD_CONT;
    }
    SET_SEGV_LOCATION();
    alog(LOG_NORMAL, langstr(ALOG_RESETTING_MONTHLY));
    rdb_query
        (QUERY_LOW,
         "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
         "kicks=0, modes=0, topics=0, wasted=0, "
         "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
         "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
         "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
         "time22=0, time23=0 WHERE type=3;", UStatsTable);
    rdb_query(QUERY_LOW,
              "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, "
              "kicks=0, modes=0, topics=0, "
              "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, "
              "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, "
              "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, "
              "time22=0, time23=0 WHERE type=3;", CStatsTable);

    /* request 109 -  auto-delete channel after not used for 1 month */

    tbuf = (time(NULL) - ClearChanInActive);
    rdb_query
        (QUERY_HIGH,
         "SELECT chan FROM %s WHERE (lastspoke > 0) AND (lastspoke < %i);",
         CStatsTable, tbuf);
#ifdef USE_MYSQL
    mysql_res = mysql_store_result(mysql);
    if (mysql_num_rows(mysql_res) > 0) {
        SET_SEGV_LOCATION();
        while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
            if ((cs = find_cs(mysql_row[0]))) {
                alog(LOG_DEBUG,
                     "chanstats monthly: channel %s is expired, statserv will leave this chan, all stats are deleted");
                del_cs(cs);     /* make statserv part the chan */
                chan_ = rdb_escape(mysql_row[0]);
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          CStatsTable, chan_);
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          UStatsTable, chan_);
                free(chan_);
                if (LogChannel) {
                    if (stricmp(LogChannel, mysql_row[0])) {
                        denora_cmd_part(s_StatServ, mysql_row[0],
                                        getstring(NULL,
                                                  STATS_CHANSTATS_PART),
                                        mysql_row[0]);

                    }
                }
            }
        }
        save_cs_db();
    }
#endif
    return MOD_CONT;
}
Esempio n. 10
0
void db_removenick_nt(char *nick, char *reason)
{
    char *sqlreason;
    int nickid = db_getnick(nick);

    User *u;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    MYSQL_RES *mysql_res2;
#endif
    char *username, *host, *queryhost;
    char *newnick;
    char *olduser = (char *) "";
    char *newuser = (char *) "";

    u = user_find(nick);


    SET_SEGV_LOCATION();

    if (!denora->do_sql) {
        return;
    }

    if (nickid == 0) {
        alog(LOG_DEBUG, "nickid 0");
        return;
    }
    SET_SEGV_LOCATION();

    db_removefromchans(nickid);
    if (UserCacheTime) {
        sqlreason = rdb_escape(reason);
        if (u) {
            username = rdb_escape(u->username);
            host = rdb_escape(u->host);
            queryhost =
                (myNumToken(host, '.') >= 2) ? strchr(host, '.') : host;
            queryhost = StrReverse(queryhost);
            rdb_query(QUERY_HIGH,
                      "SELECT nick FROM %s WHERE username=\'%s\' AND REVERSE(hostname) LIKE \'%s%%\' AND online=\'Y\' AND nick != \'%s\' ORDER BY connecttime DESC",
                      UserTable, username, queryhost, u->sqlnick);
#ifdef USE_MYSQL
            mysql_res = mysql_store_result(mysql);
            if (mysql_res) {
                if (mysql_num_rows(mysql_res) > 0) {
                    /* Getting nickname of user we found */
                    mysql_row = mysql_fetch_row(mysql_res);
                    newnick = rdb_escape(mysql_row[0]);
                    mysql_free_result(mysql_res);

                    /* Deleting user as we got one with a similar mask which is still online */
                    alog(LOG_DEBUG,
                         "db_removenick_nt(%s): There is %s with similar mask online, so we will delete %s.",
                         nick, newnick, nick);
                    rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d",
                              UserTable, nickid);

                    /* Getting uname of the old and new users */
                    rdb_query(QUERY_LOW,
                              "SELECT nick, uname FROM %s WHERE nick=\'%s\' OR nick=\'%s\'",
                              AliasesTable, newnick, u->sqlnick);
                    mysql_res2 = mysql_store_result(mysql);
                    if (mysql_res2) {
                        while ((mysql_row =
                                mysql_fetch_row(mysql_res2)) != NULL) {
                            if (stricmp(mysql_row[0], newnick) == 0) {
                                newuser = rdb_escape(mysql_row[1]);
                            }
                            if (stricmp(mysql_row[0], u->sqlnick) == 0) {
                                olduser = rdb_escape(mysql_row[1]);
                            }
                        }
                        mysql_free_result(mysql_res2);
                    }
                    /* Summing old user to new user, if they differ */
                    /*if ((!BadPtr(newuser)) && (!BadPtr(olduser))
                        && (stricmp(newuser, olduser) != 0)) {
                        alog(LOG_DEBUG,
                             "db_removenick_nt(%s): summing old user %s and new user %s.",
                             nick, olduser, newuser);
                        sumuser(u, olduser, newuser);
                        if (olduser) {
                            free(olduser);
                        }
                        if (newuser) {
                            free(newuser);
                        }
                    }*/
                    if (newnick) {
                        free(newnick);
                    }

                } else {
                    mysql_free_result(mysql_res);
                    rdb_query(QUERY_LOW,
                              "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d",
                              UserTable, sqlreason, nickid);
                }
            }
            if (username) {
                free(username);
            }
            if (host) {
                free(host);
            }
            SET_SEGV_LOCATION();
#endif
        } else {
            rdb_query(QUERY_LOW,
                      "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d",
                      UserTable, sqlreason, nickid);
        }
        if (sqlreason) {
            free(sqlreason);
        }
    } else {
        rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d",
                  UserTable, nickid);
    }


    SET_SEGV_LOCATION();
}
Esempio n. 11
0
/* -1 if nick not found, nickid else */
int db_checknick_nt(char *nick)
{
    int nickid = -1;
    User *u;
#ifdef USE_MYSQL
    MYSQL_RES *mysql_res;
    MYSQL_RES *mysql_res2;
#endif
    char *username, *host, *queryhost, *olduname;

    SET_SEGV_LOCATION();

    u = user_find(nick);
    if (u && u->sqlid) {
        return u->sqlid;
    }

    if (!denora->do_sql) {
        return -1;
    }

    if (u) {
        username = rdb_escape(u->username);
        host = rdb_escape(u->host);
        queryhost =
            (myNumToken(host, '.') >= 2) ? strchr(host, '.') : host;
        queryhost = StrReverse(queryhost);
        rdb_query(QUERY_HIGH,
                  "SELECT nickid,nick FROM %s WHERE (username=\'%s\' AND REVERSE(hostname) LIKE \'%s%%\' AND online=\'N\') OR nick=\'%s\' ORDER BY connecttime DESC",
                  UserTable, username, queryhost, u->sqlnick);

#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_res) {
            if (mysql_num_rows(mysql_res)) {
                mysql_row = mysql_fetch_row(mysql_res);
                nickid = strtol(mysql_row[0], NULL, 10);
                if (stricmp(mysql_row[1], u->sqlnick) != 0) {
                    /* Removing old user to avoid duplicate on update, which will happen shortly */
                    rdb_query(QUERY_HIGH,
                              "DELETE FROM %s WHERE nick=\'%s\' ",
                              UserTable, u->sqlnick);
                    /* Getting uname from alias table with old nick */
                    rdb_query(QUERY_HIGH,
                              "SELECT uname FROM %s WHERE nick=\'%s\' ",
                              AliasesTable, u->sqlnick);
                    mysql_res2 = mysql_store_result(mysql);
                    if (mysql_res2) {
                        if (mysql_num_rows(mysql_res2)) {
                            mysql_row = mysql_fetch_row(mysql_res2);
                            olduname = rdb_escape(mysql_row[0]);
                            /* Adding alias entry with new nick and old uname to avoid creation of new uname */
                            rdb_query(QUERY_HIGH,
                                      "INSERT INTO %s (nick, uname) VALUES (\'%s\', \'%s\') ON DUPLICATE KEY UPDATE uname=\'%s\'",
                                      AliasesTable, u->sqlnick, olduname,
                                      olduname);
                            free(olduname);
                        }
                        mysql_free_result(mysql_res2);
                    }
                }
                mysql_free_result(mysql_res);
            }
            SET_SEGV_LOCATION();
        } else {
            nickid = -1;
        }
        if (username) {
            free(username);
        }
        if (host) {
            free(host);
        }
#endif
        return nickid;
    } else {
        rdb_query(QUERY_HIGH, "SELECT nickid FROM %s WHERE nick=\'%s\'",
                  UserTable, nick);
#ifdef USE_MYSQL
        mysql_res = mysql_store_result(mysql);
        if (mysql_res) {
            if (mysql_num_rows(mysql_res)) {
                mysql_row = mysql_fetch_row(mysql_res);
                nickid = strtol(mysql_row[0], NULL, 10);
            }
            SET_SEGV_LOCATION();
            mysql_free_result(mysql_res);
        } else {
            nickid = -1;
        }
#endif
        return nickid;
    }
}
Esempio n. 12
0
/**
 * Connect to SQL Database
 *
 * @return void - no returend value
 *
 */
void db_connect(void)
{
    Exclude *e, *next;
    ChannelStats *cs;
    int tablecount = 0;
    char *sqlchan;

    if (!denora->do_sql) {
        alog(LOG_ERROR, langstring(ALOG_FAILED_SQL_CONNECT),
             rdb_error_msg());
        return;
    }
    SET_SEGV_LOCATION();

    /* Checking for missing tables */
    if (!rdb_check_table(ChanTable))
        tablecount++;
    if (!rdb_check_table(IsOnTable))
        tablecount++;
    if (!rdb_check_table(ServerTable))
        tablecount++;
    if (!rdb_check_table(UserTable))
        tablecount++;
    if (!rdb_check_table(GlineTable))
        tablecount++;
    if (!rdb_check_table(ChanBansTable))
        tablecount++;
    if (!rdb_check_table(CTCPTable))
        tablecount++;
    if (!rdb_check_table(SpamTable))
        tablecount++;
    if (!rdb_check_table(ChanExceptTable))
        tablecount++;
    if (!rdb_check_table(ChanInviteTable))
        tablecount++;
    if (!rdb_check_table(TLDTable))
        tablecount++;
    if (!rdb_check_table(SglineTable))
        tablecount++;
    if (!rdb_check_table(SqlineTable))
        tablecount++;
    if (!rdb_check_table(MaxValueTable))
        tablecount++;
    if (!rdb_check_table(AliasesTable))
        tablecount++;
    if (!rdb_check_table(CStatsTable))
        tablecount++;
    if (!rdb_check_table(UStatsTable))
        tablecount++;
    if (!rdb_check_table(StatsTable))
        tablecount++;
    if (!rdb_check_table(CurrentTable))
        tablecount++;
    if (!rdb_check_table(ChanStatsTable))
        tablecount++;
    if (!rdb_check_table(ServerStatsTable))
        tablecount++;
    if (!rdb_check_table(ChanQuietTable))
        tablecount++;
    if (!rdb_check_table(AdminTable))
        tablecount++;

    if (tablecount) {
        alog(LOG_ERROR,
             "Denora is missing %d required sql tables, disabling sql. Run ./mydbgen to update your sql db.",
             tablecount);
        denora->do_sql = 0;
        return;
    }

    /* Cleaning up the database */
    rdb_clear_table(ChanTable);
    rdb_clear_table(IsOnTable);
    rdb_clear_table(ServerTable);
    rdb_clear_table(UserTable);
    rdb_clear_table(GlineTable);
    rdb_clear_table(ChanBansTable);
    rdb_clear_table(CTCPTable);
    rdb_clear_table(SpamTable);
    rdb_clear_table(ChanExceptTable);
    rdb_clear_table(ChanInviteTable);
    rdb_clear_table(TLDTable);
    rdb_clear_table(SglineTable);
    rdb_clear_table(SqlineTable);

    e = first_exclude();
    while (e) {
        next = next_exclude();
        rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'",
                  UStatsTable, e->name);
        e = next;
    }
    rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'", UStatsTable,
              s_StatServ);
    if (s_StatServ_alias) {
        rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'",
                  UStatsTable, s_StatServ_alias);
    }

    if (LogChannel) {
        if (!(cs = find_cs(LogChannel))) {
            if (cs) {
                del_cs(cs);
            }
            sqlchan = rdb_escape(LogChannel);
            save_cs_db();
            rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                      CStatsTable, sqlchan);
            rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                      UStatsTable, sqlchan);
            free(sqlchan);
        }
    }
    if (!db_getcurrent_chans()) {
        rdb_query(QUERY_LOW, "INSERT INTO %s VALUES ('chans', 0, 0); ",
                  CurrentTable);
    }

    SET_SEGV_LOCATION();
}
Esempio n. 13
0
static int do_chanstats(User * u, int ac, char **av)
{
    char *cmd1 = NULL;
    char *cmd2 = NULL;
    char *cmd3 = NULL;
    char *cmd4 = NULL;
    lnode_t *tn;

    ChannelStats *cs;
    Channel *c;
    int i;
    int x = 0;
    char *sqlchan;
    Uid *ud;

    char *modes;
    char nickbuf[BUFSIZE];
    *nickbuf = '\0';

    if (ac >= 1) {
        cmd1 = av[0];
    }
    if (ac >= 2) {
        cmd2 = av[1];
    }
    if (ac >= 3) {
        cmd3 = av[2];
    }
    if (ac >= 4) {
        cmd4 = av[3];
    }

    if (cmd1) {
        /* Since ChanStats does require SQL code... */
        if (!denora->do_sql) {
            notice_lang(s_StatServ, u, SQL_DISABLED);
            return MOD_CONT;
        }

        if (!stricmp("ADD", cmd1)) {
            if (LargeNet) {
                notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_LARGENET);
                return MOD_CONT;
            }
            if (!cmd2) {
                syntax_error(s_StatServ, u, "CHANSTATS",
                             STAT_CHANSTATS_ADD_SYNTAX);
                return MOD_CONT;
            }
            if (BadChanName(cmd2)) {
                notice_lang(s_StatServ, u, STAT_CHANSTATS_NOT_VALID_CHAN);
                return MOD_CONT;
            }
            if (strlen(cmd2) > CHANMAX) {
                notice_lang(s_StatServ, u, STAT_CHANSTATS_NOT_VALID_CHAN);
                return MOD_CONT;
            }
            if (LogChannel) {
                if (!stricmp(cmd2, LogChannel)) {
                    notice_lang(s_StatServ, u, STAT_CHANSTATS_LOGCHAN);
                    return MOD_CONT;
                }
            }
            if (!(cs = find_cs(cmd2))) {
                cs = makecs(cmd2);
                save_cs_db();
                sqlchan = rdb_escape(cmd2);
                if (CSDefFlag) {
                    if (CSDefFlag == 1) {
                        cs->flags |= CS_FANTASY;
                        cs->flags &= ~CS_NOTICE;
                    } else if (CSDefFlag == 2) {
                        cs->flags |= CS_FANTASY;
                        cs->flags |= CS_NOTICE;
                    }
                }

                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          CStatsTable, sqlchan);
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          UStatsTable, sqlchan);
                cs->timeadded = time(NULL);
                for (i = 0; i < 4; i++) {
                    rdb_query
                        (QUERY_LOW,
                         "INSERT INTO %s SET chan=\'%s\', type=%i, timeadded=%ld;",
                         CStatsTable, sqlchan, i, cs->timeadded);
                }
                notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_ADDED,
                            cmd2);

                ud = find_uid(s_StatServ);
                if (PartOnEmpty) {
                    c = findchan(cmd2);
                    if (c) {
                        denora_cmd_join(s_StatServ, cs->name, time(NULL));
                        if (AutoOp && AutoMode) {
                            modes = sstrdup(AutoMode);
                            while (*modes) {
                                switch (*modes) {
                                case '+':
                                    break;
                                case '-':
                                    break;
                                default:
                                    ircsnprintf(nickbuf, BUFSIZE, "%s %s",
                                                nickbuf,
                                                ((ircd->p10
                                                  && ud) ? ud->uid :
                                                 s_StatServ));
                                }
                                (void) *modes++;
                            }
                            denora_cmd_mode(ServerName, cs->name, "%s%s",
                                            AutoMode, nickbuf);
                        }
                    }
                } else {
                    denora_cmd_join(s_StatServ, cs->name, time(NULL));
                    if (AutoOp && AutoMode) {
                        modes = sstrdup(AutoMode);
                        while (*modes) {
                            switch (*modes) {
                            case '+':
                                break;
                            case '-':
                                break;
                            default:
                                ircsnprintf(nickbuf, BUFSIZE, "%s %s",
                                            nickbuf,
                                            ((ircd->p10
                                              && ud) ? ud->uid :
                                             s_StatServ));
                            }
                            (void) *modes++;
                        }
                        denora_cmd_mode(ServerName, cs->name, "%s%s",
                                        AutoMode, nickbuf);
                    }
                }
                free(sqlchan);
            } else {
                notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_ALREADY,
                            cmd2);
            }
        } else if (!stricmp("DEL", cmd1)) {
            if (!cmd2) {
                syntax_error(s_StatServ, u, "CHANSTATS",
                             STAT_CHANSTATS_DEL_SYNTAX);
                return MOD_CONT;
            }
            sqlchan = rdb_escape(cmd2);
            if ((cs = find_cs(cmd2))) {
                del_cs(cs);
                save_cs_db();
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          CStatsTable, sqlchan);
                rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'",
                          UStatsTable, sqlchan);
                notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_DEL, cmd2);
                if (LogChannel) {
                    if (stricmp(LogChannel, cmd2)) {
                        denora_cmd_part(s_StatServ, cmd2,
                                        getstring(NULL,
                                                  STATS_CHANSTATS_PART),
                                        cmd2);
                    }
                } else {
                    denora_cmd_part(s_StatServ, cmd2,
                                    getstring(NULL, STATS_CHANSTATS_PART),
                                    cmd2);
                }
            } else {
                notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_NOTFOUND,
                            cmd2);
            }
            free(sqlchan);
        } else if (!stricmp("LIST", cmd1)) {
            tn = list_first(CStatshead);
            while (tn != NULL) {
                cs = lnode_get(tn);
                notice(s_StatServ, u->nick, "%d %s", x, cs->name);
                x++;
                tn = list_next(CStatshead, tn);
            }
            if (!x) {
                notice_lang(s_StatServ, u, STATS_CHANSTATS_NOCHANNELS);
            }
        } else if (!stricmp("SUMUSER", cmd1)) {
            if (!cmd3) {
                syntax_error(s_StatServ, u, "CHANSTATS",
                             STATS_CHANSTATS_SUMUSER_SYNTAX);
                return MOD_CONT;
            }
            sumuser(u, cmd2, cmd3);
        } else if (!stricmp("RENAME", cmd1)) {
            if (!cmd3) {
                syntax_error(s_StatServ, u, "CHANSTATS",
                             STATS_CHANSTATS_RENAMEUSER_SYNTAX);
                return MOD_CONT;
            }
            renameuser(u, cmd2, cmd3);
        } else if (!stricmp("SET", cmd1)) {
            if (!cmd3) {
                syntax_error(s_StatServ, u, "CHANSTATS",
                             STATS_CHANSTATS_SET_SYNTAX);
                return MOD_CONT;
            }
            if (!(cs = find_cs(cmd2))) {
                notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_NOTFOUND,
                            cmd2);
                return MOD_CONT;
            }
            if (!stricmp("FANTASY", cmd3)) {
                if (!cmd4) {
                    syntax_error(s_StatServ, u, "CHANSTATS",
                                 STATS_CHANSTATS_SET_SYNTAX);
                    return MOD_CONT;
                }
                if (!stricmp("ON", cmd4)) {
                    cs->flags |= CS_FANTASY;
                    cs->flags &= ~CS_NOTICE;
                    notice_lang(s_StatServ, u, STATS_CHANSTATS_FANTASY_ON,
                                cmd2);
                } else if (!stricmp("OFF", cmd4)) {
                    cs->flags &= ~CS_FANTASY;
                    cs->flags &= ~CS_NOTICE;
                    notice_lang(s_StatServ, u, STATS_CHANSTATS_FANTASY_OFF,
                                cmd2);
                } else if (!stricmp("NOTICE", cmd4)) {
                    cs->flags |= CS_FANTASY;
                    cs->flags |= CS_NOTICE;
                    notice_lang(s_StatServ, u,
                                STATS_CHANSTATS_FANTASY_NOTICE, cmd2);
                } else {
                    syntax_error(s_StatServ, u, "CHANSTATS",
                                 STATS_CHANSTATS_SET_SYNTAX);
                }
            }                   /* fantasy */
        } else {
            syntax_error(s_StatServ, u, "CHANSTATS",
                         STAT_CHANSTATS_SYNTAX);
        }
    } else {
        syntax_error(s_StatServ, u, "CHANSTATS", STAT_CHANSTATS_SYNTAX);
    }
    return MOD_CONT;
}
Esempio n. 14
0
static int do_exclude(User * u, int ac, char **av)
{
    Exclude *e;
    char *tmp = NULL;
    char *s = NULL;
    int count = 0, from = 0, to = 0;
    int nnicks = 0, i;
    int disp = 1;
    char *name;
    char *ch = NULL;
    User *u2;

    if (ac < 1) {
        notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX);
        return MOD_CONT;
    }

    if (!stricmp(av[0], "ADD")) {
        if (ac < 2) {
            notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX);
            return MOD_CONT;
        }
        if (strlen(av[1]) > NICKMAX) {
            notice(s_StatServ, u->nick, "Invalid nick length");
            return MOD_CONT;
        }
        if (isdigit(av[1][0]) || av[1][0] == '-') {
            notice(s_StatServ, u->nick, "Invalid nick");
            return MOD_CONT;
        }
        for (ch = av[1]; *ch && (ch - av[1]) < NICKMAX; ch++) {
            if (!isvalidnick(*ch)) {
                notice(s_StatServ, u->nick, "Invalid nick");
                return MOD_CONT;
            }
        }
        e = find_exclude(av[1], NULL);
        if (!e) {
            make_exclude(av[1]);
            notice_lang(s_StatServ, u, STAT_EXCLUDE_ADDED, av[1]);
            name = rdb_escape(av[1]);
            u2 = user_find(av[1]);
            rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'",
                      UStatsTable, u2 ? u2->sgroup : name);
            rdb_query(QUERY_LOW,
                      "UPDATE `%s` SET `ignore`=\'Y\' WHERE `uname`=\'%s\'",
                      AliasesTable, u2 ? u2->sgroup : name);
            free(name);
        } else {
            notice_lang(s_StatServ, u, STAT_EXCLUDE_ALREADY, av[1]);
        }
    } else if (!stricmp(av[0], "DEL")) {
        if (ac < 2) {
            notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX);
            return MOD_CONT;
        }
        e = find_exclude(av[1], NULL);
        if (e) {
            del_exclude(e);
            u->cstats = 0;
            notice_lang(s_StatServ, u, STAT_EXCLUDE_DELETED, av[1]);
            name = rdb_escape(av[1]);
            u2 = user_find(av[1]);
            rdb_query(QUERY_LOW,
                      "UPDATE `%s` SET `ignore`=\'N\' WHERE `uname`=\'%s\'",
                      AliasesTable, u2 ? u2->sgroup : name);
            for (i = 0; i < 4; i++) {
                rdb_query
                    (QUERY_LOW,
                     "INSERT IGNORE INTO %s SET uname=\'%s\', chan=\'global\', type=%i;",
                     UStatsTable, u2 ? u2->sgroup : name, i);
            }
            free(name);
        } else {
            notice_lang(s_StatServ, u, STAT_EXCLUDE_NOT_FOUND, av[1]);
        }
    } else if (!stricmp(av[0], "LIST")) {
        if (ac >= 2) {
            if (*av[1] == '#') {
                tmp = myStrGetOnlyToken((av[1] + 1), '-', 0);   /* Read FROM out */
                if (!tmp) {
                    return MOD_CONT;
                }
                for (s = tmp; *s; s++) {
                    if (!isdigit(*s)) {
                        free(tmp);
                        return MOD_CONT;
                    }
                }
                from = atoi(tmp);
                free(tmp);
                tmp = myStrGetTokenRemainder(av[1], '-', 1);    /* Read TO out */
                if (!tmp) {
                    return MOD_CONT;
                }
                for (s = tmp; *s; s++) {
                    if (!isdigit(*s)) {
                        free(tmp);
                        return MOD_CONT;
                    }
                }
                to = atoi(tmp);
                free(tmp);
            }
        }

        notice_lang(s_StatServ, u, STAT_EXCLUDE_LIST_HEADER);

        for (i = 0; i < 1024; i++) {
            for (e = exlists[i]; e; e = e->next) {
                if ((count + 1 >= from) && (count + 1 <= to)) {
                    notice(s_StatServ, u->nick, "%d %s", disp++, e->name);
                } else if (((from == 0) && (to == 0)) && (++nnicks <= 50)) {
                    notice(s_StatServ, u->nick, "%d %s", disp++, e->name);
                }
                count++;
            }
        }
    } else {
        notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX);
        return MOD_CONT;
    }

    return MOD_CONT;
}