Some basic work on getting bans working.

Basically now it can ban a user (nick + cid), it will be added to the
ban list temporarily, and will not be enabled if you restart the hub.
A banned user will automatically be kicked.

unban does not work correctly.
This commit is contained in:
Jan Vidar Krey 2009-06-23 23:16:09 +02:00
parent 2ad2b66db3
commit ddba669af0
3 changed files with 104 additions and 12 deletions

View File

@ -446,6 +446,41 @@ int acl_is_user_denied(struct acl_handle* handle, const char* data)
STR_LIST_CONTAINS(handle->users_denied, data); STR_LIST_CONTAINS(handle->users_denied, data);
} }
int acl_user_ban_nick(struct acl_handle* handle, const char* nick)
{
struct user_access_info* info = hub_malloc_zero(sizeof(struct user_access_info));
if (!info)
{
hub_log(log_error, "ACL error: Out of memory!");
return -1;
}
list_append(handle->users_banned, hub_strdup(nick));
return 0;
}
int acl_user_ban_cid(struct acl_handle* handle, const char* cid)
{
struct user_access_info* info = hub_malloc_zero(sizeof(struct user_access_info));
if (!info)
{
hub_log(log_error, "ACL error: Out of memory!");
return -1;
}
list_append(handle->cids, hub_strdup(cid));
return 0;
}
int acl_user_unban_nick(struct acl_handle* handle, const char* nick)
{
return -1;
}
int acl_user_unban_cid(struct acl_handle* handle, const char* cid)
{
return -1;
}
int acl_is_ip_banned(struct acl_handle* handle, const char* ip_address) int acl_is_ip_banned(struct acl_handle* handle, const char* ip_address)
{ {
struct ip_addr_encap raw; struct ip_addr_encap raw;

View File

@ -85,6 +85,11 @@ extern int acl_is_ip_nat_override(struct acl_handle* handle, const char* ip_addr
extern int acl_is_user_banned(struct acl_handle* handle, const char* name); extern int acl_is_user_banned(struct acl_handle* handle, const char* name);
extern int acl_is_user_denied(struct acl_handle* handle, const char* name); extern int acl_is_user_denied(struct acl_handle* handle, const char* name);
extern int acl_user_ban_nick(struct acl_handle* handle, const char* nick);
extern int acl_user_ban_cid(struct acl_handle* handle, const char* cid);
extern int acl_user_unban_nick(struct acl_handle* handle, const char* nick);
extern int acl_user_unban_cid(struct acl_handle* handle, const char* cid);
extern int acl_check_ip_range(struct ip_addr_encap* addr, struct ip_ban_record* info); extern int acl_check_ip_range(struct ip_addr_encap* addr, struct ip_ban_record* info);
extern const char* acl_password_generate_challenge(struct acl_handle* acl, struct user* user); extern const char* acl_password_generate_challenge(struct acl_handle* acl, struct user* user);

View File

@ -19,14 +19,13 @@
#include "uhub.h" #include "uhub.h"
#define CRASH_DEBUG 1
typedef int (*command_handler)(struct hub_info* hub, struct user* user, const char* message); typedef int (*command_handler)(struct hub_info* hub, struct user* user, const char* message);
struct commands_handler struct commands_handler
{ {
const char* prefix; const char* prefix;
size_t length; size_t length;
size_t args;
enum user_credentials cred; enum user_credentials cred;
command_handler handler; command_handler handler;
const char* description; const char* description;
@ -160,6 +159,57 @@ static int command_kick(struct hub_info* hub, struct user* user, const char* mes
return command_status(hub, user, "kick", nick); return command_status(hub, user, "kick", nick);
} }
static int command_ban(struct hub_info* hub, struct user* user, const char* message)
{
if (strlen(message) < 6)
{
return command_status(hub, user, "ban", "No nickname given");
}
const char* nick = &message[6];
struct user* target = uman_get_user_by_nick(hub, nick);
if (!target)
{
return command_status(hub, user, "ban", "No such user");
}
if (target == user)
{
return command_status(hub, user, "ban", "Cannot kick/ban yourself");
}
hub_disconnect_user(hub, target, quit_kicked);
acl_user_ban_nick(hub->acl, target->id.nick);
acl_user_ban_cid(hub->acl, target->id.cid);
return command_status(hub, user, "ban", nick);
}
static int command_unban(struct hub_info* hub, struct user* user, const char* message)
{
if (strlen(message) < 8)
{
return command_status(hub, user, "unban", "No nickname given");
}
const char* nick = &message[8];
struct user* target = uman_get_user_by_nick(hub, nick);
if (!target)
{
return command_status(hub, user, "unban", "No such user");
}
if (target == user)
{
return command_status(hub, user, "unban", "Cannot unban yourself");
}
return command_status(hub, user, "unban", "Not implemented");
}
static int command_reload(struct hub_info* hub, struct user* user, const char* message) static int command_reload(struct hub_info* hub, struct user* user, const char* message)
{ {
hub->status = hub_status_restart; hub->status = hub_status_restart;
@ -216,17 +266,19 @@ int command_dipatcher(struct hub_info* hub, struct user* user, const char* messa
} }
static struct commands_handler command_handlers[] = { static struct commands_handler command_handlers[] = {
{ "help", 4, cred_guest, command_help, "Show this help message." }, { "help", 4, 0, cred_guest, command_help, "Show this help message." },
{ "stats", 5, cred_super, command_stats, "Show hub statistics." }, { "stats", 5, 0, cred_super, command_stats, "Show hub statistics." },
{ "version", 7, cred_guest, command_version, "Show hub version info." }, { "version", 7, 0, cred_guest, command_version, "Show hub version info." },
{ "uptime", 6, cred_guest, command_uptime, "Display hub uptime info." }, { "uptime", 6, 0, cred_guest, command_uptime, "Display hub uptime info." },
{ "kick", 4, cred_operator, command_kick, "Kick a user" }, { "kick", 4, 1, cred_operator, command_kick, "Kick a user" },
{ "reload", 6, cred_admin, command_reload, "Reload configuration files." }, { "ban", 3, 1, cred_operator, command_ban, "Ban a user" },
{ "shutdown", 8, cred_admin, command_shutdown, "Shutdown hub." }, { "unban", 5, 1, cred_operator, command_unban, "Lift ban on a user" },
{ "myip", 4, cred_guest, command_myip, "Show your own IP." }, { "reload", 6, 0, cred_admin, command_reload, "Reload configuration files." },
{ "shutdown", 8, 0, cred_admin, command_shutdown, "Shutdown hub." },
{ "myip", 4, 0, cred_guest, command_myip, "Show your own IP." },
#ifdef CRASH_DEBUG #ifdef CRASH_DEBUG
{ "crash", 5, cred_admin, command_crash, "Crash the hub (DEBUG)." }, { "crash", 5, 0, cred_admin, command_crash, "Crash the hub (DEBUG)." },
#endif #endif
{ 0, 0, cred_none, command_help, "" } { 0, 0, 0, cred_none, command_help, "" }
}; };