X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fclass.c;h=df444fec115c9e3052982df102d18d8cfdc027c4;hp=b7a5cbc04a2fa1389fb39e2dfd5b806c44a5598f;hb=259c314d142abd6f9295047c116235cfdd119563;hpb=6ef20e0f9a6c6f82fbb82b6c60f98b8e8b401b8d diff --git a/src/ngircd/class.c b/src/ngircd/class.c index b7a5cbc0..df444fec 100644 --- a/src/ngircd/class.c +++ b/src/ngircd/class.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,6 @@ * User class management. */ -#include "imp.h" #include #include @@ -26,8 +25,8 @@ #include "client.h" #include "lists.h" #include "match.h" +#include "stdio.h" -#include "exp.h" #include "class.h" struct list_head My_Classes[CLASS_COUNT]; @@ -47,32 +46,82 @@ Class_Exit(void) } GLOBAL bool -Class_IsMember(const int Class, CLIENT *Client) +Class_GetMemberReason(const int Class, CLIENT *Client, char *reason, size_t len) { + char str[COMMAND_LEN]; + assert(Class < CLASS_COUNT); assert(Client != NULL); - return Lists_Check(&My_Classes[Class], Client); + strlcpy(str, "listed", sizeof(str)); + + if (!Lists_CheckReason(&My_Classes[Class], Client, str, sizeof(str))) + return false; + + switch(Class) { + case CLASS_GLINE: + snprintf(reason, len, "\"%s\" (G-Line)", str); + break; + case CLASS_KLINE: + snprintf(reason, len, "\"%s\" (K-Line)", str); + break; + default: + snprintf(reason, len, "%s", str); + break; + } + return true; +} + +/** + * Check if a client is banned from this server: GLINE, KLINE. + * + * If a client isn't allowed to connect, it will be disconnected again. + * + * @param Client The client to check. + * @return CONNECTED if client is allowed to join, DISCONNECTED if not. + */ +GLOBAL bool +Class_HandleServerBans(CLIENT *Client) +{ + char reject[COMMAND_LEN]; + + assert(Client != NULL); + + if (Class_GetMemberReason(CLASS_GLINE, Client, reject, sizeof(reject)) || + Class_GetMemberReason(CLASS_KLINE, Client, reject, sizeof(reject))) { + Client_Reject(Client, reject, true); + return DISCONNECTED; + } + + return CONNECTED; } + GLOBAL bool -Class_AddMask(const int Class, const char *Mask, time_t ValidUntil, +Class_AddMask(const int Class, const char *Pattern, time_t ValidUntil, const char *Reason) { + char mask[MASK_LEN]; + assert(Class < CLASS_COUNT); - assert(Mask != NULL); + assert(Pattern != NULL); assert(Reason != NULL); - return Lists_Add(&My_Classes[Class], Mask, ValidUntil, Reason); + Lists_MakeMask(Pattern, mask, sizeof(mask)); + return Lists_Add(&My_Classes[Class], mask, + ValidUntil, Reason); } GLOBAL void -Class_DeleteMask(const int Class, const char *Mask) +Class_DeleteMask(const int Class, const char *Pattern) { + char mask[MASK_LEN]; + assert(Class < CLASS_COUNT); - assert(Mask != NULL); + assert(Pattern != NULL); - Lists_Del(&My_Classes[Class], Mask); + Lists_MakeMask(Pattern, mask, sizeof(mask)); + Lists_Del(&My_Classes[Class], mask); } GLOBAL struct list_head *