From: pk910 Date: Sat, 20 Aug 2011 07:19:28 +0000 (+0200) Subject: added cmd_a X-Git-Tag: v5.3~512 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=7bf2af2f52b206d3682ea2bd032828a9d5d9aba9 added cmd_a --- diff --git a/DBHelper.c b/DBHelper.c index 1c7a667..7d22a81 100644 --- a/DBHelper.c +++ b/DBHelper.c @@ -68,6 +68,7 @@ char *getChanDefault(char *channel_setting) { int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_override, int allow_501) { loadChannelSettings(chan); if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return 0; + if((user->flags & USERFLAG_ISIRCOP)) return 1; MYSQL_RES *res; MYSQL_ROW row; printf_mysql_query("SELECT `%s` FROM `channels` WHERE `channel_id` = '%d'", channel_setting, chan->channel_id); diff --git a/bot_NeonServ.c b/bot_NeonServ.c index a89be71..33b02a5 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -19,6 +19,7 @@ static const struct default_language_entry msgtab[] = { {"NS_USER_UNKNOWN", "User with nick \002%s\002 does not exist."}, {"NS_AUTH_UNKNOWN", "Account \002%s\002 has not been registered."}, {"NS_USER_NEED_AUTH", "%s must first authenticate with \002AuthServ\002."}, + {"NS_YOU_NEED_AUTH", "You must first authenticate with \002AuthServ\002."}, {"NS_INVALID_ACCESS", "\002%d\002 is an invalid access level."}, {"NS_ADDUSER_ALREADY_ADDED", "%s is already on the \002%s\002 user list (with access %d)."}, {"NS_ADDUSER_DONE", "Added %s to the %s user list with access %d."}, @@ -28,6 +29,14 @@ static const struct default_language_entry msgtab[] = { {"NS_USER_OUTRANKED", "\002%s\002 outranks you (command has no effect)."}, {"NS_ACCESS_DENIED", "Access denied."}, {"NS_CLVL_DONE", "%s now has access \002%d\002 in %s."}, + {"NS_A_LACKS_ACCESS_BUT_GOD_NICK", "%s lacks access to %s but has \002security override\002 enabled."}, + {"NS_A_LACKS_ACCESS_BUT_GOD_AUTH", "%s (%s) lacks access to %s but has \002security override\002 enabled."}, + {"NS_A_ACCESS_NICK", "%s has access \002%d\002 in %s."}, + {"NS_A_ACCESS_AUTH", "%s (%s) has access \002%d\002 in %s."}, + {"NS_A_ACCESS_NICK_GOD", "%s has access \002%d\002 in %s and has \0020security override\002 enabled."}, + {"NS_A_ACCESS_AUTH_GOD", "%s (%s) has access \002%d\002 in %s and has \0020security override\002 enabled."}, + {"NS_A_SUSPENDED", "\002%s\002's access to %s has been suspended."}, + {"NS_A_IS_IRCOP", "%s is an \002IRC operator\002." }, {NULL, NULL} }; @@ -105,6 +114,8 @@ void init_NeonServ() { register_command(BOTID, "adduser", neonserv_cmd_adduser, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); register_command(BOTID, "deluser", neonserv_cmd_deluser, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "clvl", neonserv_cmd_clvl, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "a", neonserv_cmd_a, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); start_bots(); bind_bot_ready(neonserv_bot_ready); diff --git a/cmd_neonserv_a.c b/cmd_neonserv_a.c new file mode 100644 index 0000000..6c1387a --- /dev/null +++ b/cmd_neonserv_a.c @@ -0,0 +1,113 @@ + +/* +* argv[0] - nick / *auth +*/ +static USERAUTH_CALLBACK(neonserv_cmd_a_nick_lookup); +static void neonserv_cmd_a_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, struct UserNode *target); + +struct neonserv_cmd_a_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + char *nick; +}; + +static CMD_BIND(neonserv_cmd_a) { + if(argc == 0) { + if(!(user->flags & USERFLAG_ISAUTHED)) { + struct neonserv_cmd_a_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->nick = strdup(argv[0]); + get_userauth(cuser, neonserv_cmd_a_nick_lookup, cache); + } else + neonserv_cmd_a_async1(client, getTextBot(), user, chan, user->nick, user->auth, user); + } + else if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + neonserv_cmd_a_async1(client, getTextBot(), user, chan, NULL, argv[0], NULL); + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_a_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, cuser); + } else { + struct neonserv_cmd_a_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->nick = strdup(argv[0]); + get_userauth(cuser, neonserv_cmd_a_nick_lookup, cache); + } + } +} + +static USERAUTH_CALLBACK(neonserv_cmd_a_nick_lookup) { + struct neonserv_cmd_a_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + if(!strcmp(cache->nick, cache->user->nick)) + reply(cache->textclient, cache->user, "NS_YOU_NEED_AUTH"); + else + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + neonserv_cmd_a_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, user); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_a_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, struct UserNode *target) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW user_row, chanuser_row; + int userid; + printf_mysql_query("SELECT `user_id`, `user_access`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((user_row = mysql_fetch_row(res)) != NULL) { + userid = atoi(user_row[0]); + //check if the user is already added + printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags`, `chanuser_infoline` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); + res = mysql_use(); + if ((chanuser_row = mysql_fetch_row(res)) != NULL) { + //access output + if(nick) + reply(textclient, user, (strcmp(user_row[2], "1") ? "NS_A_ACCESS_AUTH" : "NS_A_ACCESS_AUTH_GOD"), nick, auth, atoi(chanuser_row[0]), chan->name); + else + reply(textclient, user, (strcmp(user_row[2], "1") ? "NS_A_ACCESS_NICK" : "NS_A_ACCESS_NICK_GOD"), auth, atoi(chanuser_row[0]), chan->name); + int cflags = atoi(chanuser_row[1]); + if(cflags & DB_CHANUSER_SUSPENDED) + reply(textclient, user, "NS_A_SUSPENDED", (nick ? nick : auth), chan->name); + if(chanuser_row[2] && strcmp(chanuser_row[2], "")) + reply(textclient, user, "[%s] %s", (nick ? nick : auth), chanuser_row[2]); + } else if(!strcmp(user_row[2], "1")) { + if(nick) + reply(textclient, user, "NS_A_LACKS_ACCESS_BUT_GOD_AUTH", nick, auth, chan->name); + else + reply(textclient, user, "NS_A_LACKS_ACCESS_BUT_GOD_NICK", auth, chan->name); + } else + reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name); + } else + reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name); + if(target && (target->flags & USERFLAG_ISIRCOP)) + reply(textclient, user, "NS_A_IS_IRCOP", nick); +}