commit - 51a6a33056486c19da6b8d6e4809dde57be00ece
commit + eba95bb0d240aa3c8791cb6eb830ced5023db0b0
blob - b7a5cbc04a2fa1389fb39e2dfd5b806c44a5598f
blob + 0a8ae2414f17145c2c8a67bf4a3949fd68cd8a66
--- src/ngircd/class.c
+++ src/ngircd/class.c
/*
* 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_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)
{
blob - 8c06c2e2dde562b84f18703933574bd364ed471b
blob + 2a9dbba76a88db4276099e4525bab5f32fd56314
--- src/ngircd/class.h
+++ src/ngircd/class.h
/*
* 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
const time_t ValidUntil, const char *Reason));
GLOBAL void Class_DeleteMask PARAMS((const int Class, const char *Mask));
-GLOBAL bool Class_IsMember PARAMS((const int Class, CLIENT *Client));
+GLOBAL char *Class_GetMemberReason PARAMS((const int Class, CLIENT *Client));
+GLOBAL bool Class_HandleServerBans PARAMS((CLIENT *Client));
GLOBAL struct list_head *Class_GetList PARAMS((const int Class));
blob - bbb2f0d5e430c88a904514ff77bbfa3d3ed49b92
blob + 54818fe4879f05d2d05f438cb3e98d646818641f
--- src/ngircd/irc-login.c
+++ src/ngircd/irc-login.c
static bool Hello_User_PostAuth PARAMS(( CLIENT *Client ));
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
static void Introduce_Client PARAMS((CLIENT *To, CLIENT *Client, int Type));
-static void Reject_Client PARAMS((CLIENT *Client, const char *InternalReason));
static void cb_introduceClient PARAMS((CLIENT *Client, CLIENT *Prefix,
void *i));
* passwords supplied are classified as "wrong". */
if(Client_Password(Client)[0] == '\0')
return Hello_User_PostAuth(Client);
- Reject_Client(Client, "non-empty password");
+ Client_Reject(Client, "Non-empty password", false);
return DISCONNECTED;
}
/* Check global server password ... */
if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) {
/* Bad password! */
- Reject_Client(Client, "bad server password");
+ Client_Reject(Client, "Bad server password", false);
return DISCONNECTED;
}
return Hello_User_PostAuth(Client);
if (len != sizeof(result)) {
Log(LOG_CRIT, "Auth: Got malformed result!");
- Reject_Client(client, "internal error");
+ Client_Reject(client, "Internal error", false);
return;
}
Client_SetUser(client, Client_OrigUser(client), true);
(void)Hello_User_PostAuth(client);
} else
- Reject_Client(client, "bad password");
+ Client_Reject(client, "Bad password", false);
}
#endif
-
-
-/**
- * Reject a client because of wrong password.
- *
- * This function is called either when the global server password or a password
- * checked using PAM has been wrong.
- *
- * @param Client The client to reject.
- */
-static void
-Reject_Client(CLIENT *Client, const char *InternalReason)
-{
- Log(LOG_ERR,
- "User \"%s\" rejected (connection %d): %s!",
- Client_Mask(Client), Client_Conn(Client), InternalReason);
- Conn_Close(Client_Conn(Client), InternalReason,
- "Access denied! Bad password?", true);
-}
/**
static bool
Hello_User_PostAuth(CLIENT *Client)
{
- if (Class_IsMember(CLASS_GLINE, Client)) {
- Reject_Client(Client, "G-Line'd");
+ assert(Client != NULL);
+
+ if (Class_HandleServerBans(Client) != CONNECTED)
return DISCONNECTED;
- }
- if (Class_IsMember(CLASS_KLINE, Client)) {
- Reject_Client(Client, "K-Line'd");
- return DISCONNECTED;
- }
Introduce_Client(NULL, Client, CLIENT_USER);