/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2012 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
#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];
+char Reject_Reason[COMMAND_LEN];
+
GLOBAL void
Class_Init(void)
{
for (i = 0; i < CLASS_COUNT; Lists_Free(&My_Classes[i++]));
}
-GLOBAL bool
-Class_IsMember(const int Class, CLIENT *Client)
+GLOBAL char *
+Class_GetMemberReason(const int Class, CLIENT *Client)
{
+ char *reason;
+
assert(Class < CLASS_COUNT);
assert(Client != NULL);
- return Lists_Check(&My_Classes[Class], Client);
+ reason = Lists_CheckReason(&My_Classes[Class], Client);
+ if (!reason)
+ return NULL;
+
+ if (!*reason)
+ reason = "listed";
+
+ switch(Class) {
+ case CLASS_GLINE:
+ snprintf(Reject_Reason, sizeof(Reject_Reason),
+ "\"%s\" (G-Line)", reason);
+ return Reject_Reason;
+ case CLASS_KLINE:
+ snprintf(Reject_Reason, sizeof(Reject_Reason),
+ "\"%s\" (K-Line)", reason);
+ return Reject_Reason;
+ }
+ return reason;
}
+/**
+ * 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_AddMask(const int Class, const char *Mask, time_t ValidUntil)
+Class_HandleServerBans(CLIENT *Client)
+{
+ char *rejectptr;
+
+ assert(Client != NULL);
+
+ rejectptr = Class_GetMemberReason(CLASS_GLINE, Client);
+ if (!rejectptr)
+ rejectptr = Class_GetMemberReason(CLASS_KLINE, Client);
+ if (rejectptr) {
+ Client_Reject(Client, rejectptr, true);
+ return DISCONNECTED;
+ }
+
+ return CONNECTED;
+}
+
+
+GLOBAL bool
+Class_AddMask(const int Class, const char *Mask, time_t ValidUntil,
+ const char *Reason)
{
assert(Class < CLASS_COUNT);
assert(Mask != NULL);
+ assert(Reason != NULL);
- return Lists_Add(&My_Classes[Class], Mask, ValidUntil);
+ return Lists_Add(&My_Classes[Class], Lists_MakeMask(Mask),
+ ValidUntil, Reason);
}
GLOBAL void
assert(Class < CLASS_COUNT);
assert(Mask != NULL);
- Lists_Del(&My_Classes[Class], Mask);
+ Lists_Del(&My_Classes[Class], Lists_MakeMask(Mask));
+}
+
+GLOBAL struct list_head *
+Class_GetList(const int Class)
+{
+ assert(Class < CLASS_COUNT);
+
+ return &My_Classes[Class];
+}
+
+GLOBAL void
+Class_Expire(void)
+{
+ Lists_Expire(&My_Classes[CLASS_GLINE], "G-Line");
+ Lists_Expire(&My_Classes[CLASS_KLINE], "K-Line");
}
/* -eof- */