added support for using admin hostmask

This commit is contained in:
Aaron Blakely 2024-03-08 00:38:00 -06:00
parent 13bcd3d20e
commit a9ce4edbb5
6 changed files with 102 additions and 8 deletions

View File

@ -33,12 +33,16 @@ struct user
BOOL is_voice; BOOL is_voice;
BOOL is_owner; BOOL is_owner;
BOOL is_admin; BOOL is_admin;
BOOL is_botadmin;
#else #else
bool is_op; bool is_op;
bool is_halfop; bool is_halfop;
bool is_voice; bool is_voice;
bool is_owner; bool is_owner;
bool is_admin; bool is_admin;
bool is_botadmin;
#endif #endif
}; };
@ -75,6 +79,7 @@ MY_API BOOL is_voice(char *chan, char *nick);
MY_API BOOL channel_exists(char *chan); MY_API BOOL channel_exists(char *chan);
MY_API BOOL user_exists(char *chan, char *nick); MY_API BOOL user_exists(char *chan, char *nick);
MY_API BOOL is_on_channel(char *nick, char *chan); MY_API BOOL is_on_channel(char *nick, char *chan);
MY_API BOOL is_botadmin(char *nick);
#else #else
MY_API bool is_op(char *chan, char *nick); MY_API bool is_op(char *chan, char *nick);
MY_API bool is_halfop(char *chan, char *nick); MY_API bool is_halfop(char *chan, char *nick);
@ -84,6 +89,7 @@ MY_API bool is_admin(char *chan, char *nick);
MY_API bool channel_exists(char *chan); MY_API bool channel_exists(char *chan);
MY_API bool user_exists(char *chan, char *nick); MY_API bool user_exists(char *chan, char *nick);
MY_API bool is_on_channel(char *nick, char *chan); MY_API bool is_on_channel(char *nick, char *chan);
MY_API bool is_botadmin(char *nick);
#endif #endif
#endif #endif

View File

@ -14,6 +14,8 @@
#ifdef _WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
#else
#include <stdbool.h>
#endif #endif
#define OUTBUF_SIZE 60000 #define OUTBUF_SIZE 60000
@ -28,7 +30,7 @@ struct irc_conn
#endif #endif
char nick[32]; char nick[32];
char admin[64]; char admin[256];
char host[256]; char host[256];
char port[5]; char port[5];
char real_name[512]; char real_name[512];
@ -58,4 +60,11 @@ MY_API void irc_ctcp(struct irc_conn *bot, char *to, char *fmt, ...);
void irc_parse_raw(struct irc_conn *bot, char *raw); void irc_parse_raw(struct irc_conn *bot, char *raw);
#ifdef _WIN32
MY_API BOOL check_hostmask_match(char *mask, char *host);
#else
MY_API bool check_hostmask_match(char *mask, char *host);
#endif
#endif #endif

View File

@ -83,6 +83,8 @@ void add_user_to_channel(char *user, char *host, char *chan)
is_halfop = false; is_halfop = false;
is_owner = false; is_owner = false;
is_admin = false; is_admin = false;
struct irc_conn *bot = get_bot();
char buf[512];
if (!strcmp(chan, "")) if (!strcmp(chan, ""))
@ -135,6 +137,12 @@ void add_user_to_channel(char *user, char *host, char *chan)
u->is_owner = is_owner; u->is_owner = is_owner;
u->is_admin = is_admin; u->is_admin = is_admin;
sprintf(buf, "%s!%s", u->nick, u->host);
if (check_hostmask_match(bot->admin, buf) == true)
{
u->is_botadmin = true;
}
channels[i]->users[channels[i]->user_count] = *u; channels[i]->users[channels[i]->user_count] = *u;
channels[i]->user_count++; channels[i]->user_count++;
@ -143,6 +151,7 @@ void add_user_to_channel(char *user, char *host, char *chan)
strlcpy(channels[i]->users[channels[i]->user_count].nick, user, 50); strlcpy(channels[i]->users[channels[i]->user_count].nick, user, 50);
strlcpy(channels[i]->users[channels[i]->user_count].host, host, 256); strlcpy(channels[i]->users[channels[i]->user_count].host, host, 256);
sprintf(buf, "%s!%s", user, host);
channels[i]->users[channels[i]->user_count].is_op = is_op | is_owner | is_admin; channels[i]->users[channels[i]->user_count].is_op = is_op | is_owner | is_admin;
channels[i]->users[channels[i]->user_count].is_voice = is_voice | is_halfop | is_op | is_owner | is_admin; channels[i]->users[channels[i]->user_count].is_voice = is_voice | is_halfop | is_op | is_owner | is_admin;
@ -150,6 +159,11 @@ void add_user_to_channel(char *user, char *host, char *chan)
channels[i]->users[channels[i]->user_count].is_owner = is_owner; channels[i]->users[channels[i]->user_count].is_owner = is_owner;
channels[i]->users[channels[i]->user_count].is_admin = is_admin; channels[i]->users[channels[i]->user_count].is_admin = is_admin;
if (check_hostmask_match(bot->admin, buf) == true)
{
channels[i]->users[channels[i]->user_count].is_botadmin = true;
}
channels[i]->user_count++; channels[i]->user_count++;
} }
} }
@ -546,3 +560,25 @@ MY_API bool is_on_channel(char *nick, char *chan)
return 0; return 0;
} }
#ifdef _WIN32
MY_API BOOL is_botadmin(char *nick)
#else
MY_API bool is_botadmin(char *nick)
#endif
{
int i, j;
struct irc_conn *bot = get_bot();
for (i = 0; i < chan_count; i++)
{
for (j = 0; j < channels[i]->user_count; j++)
{
if (!strcmp(channels[i]->users[j].nick, nick))
{
return channels[i]->users[j].is_botadmin;
}
}
}
return 0;
}

View File

@ -1,6 +1,7 @@
#include "irc.h" #include "irc.h"
#include "util.h" #include "util.h"
#include "events.h" #include "events.h"
#include "channel.h"
#include "module.h" #include "module.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -112,7 +113,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
if (!strcmp("JOIN", cmd)) if (!strcmp("JOIN", cmd))
{ {
if (!strcmp(bot->admin, usr)) if (is_botadmin(usr) == true)
{ {
irc_raw(bot, "JOIN :%s", arg); irc_raw(bot, "JOIN :%s", arg);
} }
@ -123,7 +124,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
} }
else if (!strcmp("PART", cmd)) else if (!strcmp("PART", cmd))
{ {
if (!strcmp(bot->admin, usr)) if (is_botadmin(usr) == true)
{ {
irc_raw(bot, "PART %s :Admin made me leave.", arg); irc_raw(bot, "PART %s :Admin made me leave.", arg);
} }
@ -134,7 +135,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
} }
else if (!strcmp("HANDLERS", cmd)) else if (!strcmp("HANDLERS", cmd))
{ {
if (!strcmp(bot->admin, usr)) if (is_botadmin(usr) == true)
{ {
for (i = 0; i < handlers_count; i++) for (i = 0; i < handlers_count; i++)
{ {
@ -152,7 +153,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
} }
else if (!strcmp("LOADMOD", cmd)) else if (!strcmp("LOADMOD", cmd))
{ {
if (!strcmp(bot->admin, usr)) if (is_botadmin(usr) == true)
{ {
#ifdef _WIN32 #ifdef _WIN32
irc_notice(bot, usr, "Loading module: mods/%s.dll", arg); irc_notice(bot, usr, "Loading module: mods/%s.dll", arg);
@ -170,7 +171,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
} }
else if (!strcmp("UNLOADMOD", cmd)) else if (!strcmp("UNLOADMOD", cmd))
{ {
if (!strcmp(bot->admin, usr)) if (is_botadmin(usr) == true)
{ {
#ifdef _WIN32 #ifdef _WIN32
irc_notice(bot, usr, "Unloading module: mods/%s.dll", arg); irc_notice(bot, usr, "Unloading module: mods/%s.dll", arg);
@ -188,7 +189,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
} }
else if (!strcmp("MODLIST", cmd)) else if (!strcmp("MODLIST", cmd))
{ {
if (!strcmp(bot->admin, usr)) if (is_botadmin(usr) == true)
{ {
list_modules(bot, usr); list_modules(bot, usr);
} }

View File

@ -10,6 +10,7 @@
#include "events.h" #include "events.h"
#include "channel.h" #include "channel.h"
#include <stdbool.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -406,3 +407,41 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
} }
} }
#ifdef _WIN32
BOOL check_hostmask_match(char *mask, char *host)
#else
bool check_hostmask_match(char *mask, char *host)
#endif
{
char *m = mask;
char *h = host;
while (*m && *h)
{
if (*m == '*')
{
m++;
if (!*m)
{
return 1;
}
while (*h && *h != *m)
{
h++;
}
}
else if (*m == *h)
{
m++;
h++;
}
else
{
return false;
}
}
return true;
}

View File

@ -5,8 +5,11 @@ bot:
verbose = 1; verbose = 1;
nick = "xbot"; nick = "xbot";
user = "xbot"; user = "xbot";
admin = "ab3800";
# owner of the bot (nick!user@host)
admin = "ab3800!*@owner.ephasic.org";
# database file name
db = "xbot.db"; db = "xbot.db";
}; };