mirror of
https://github.com/osmarks/ngircd.git
synced 2025-05-25 18:44:09 +00:00
Remove limit on max number of configured irc operators.
This commit is contained in:
parent
c414d0bd3a
commit
28ca31e576
@ -55,6 +55,7 @@ static bool Use_Log = true;
|
|||||||
static CONF_SERVER New_Server;
|
static CONF_SERVER New_Server;
|
||||||
static int New_Server_Idx;
|
static int New_Server_Idx;
|
||||||
|
|
||||||
|
static size_t Conf_Oper_Count;
|
||||||
static size_t Conf_Channel_Count;
|
static size_t Conf_Channel_Count;
|
||||||
static void Set_Defaults PARAMS(( bool InitServers ));
|
static void Set_Defaults PARAMS(( bool InitServers ));
|
||||||
static bool Read_Config PARAMS(( bool ngircd_starting ));
|
static bool Read_Config PARAMS(( bool ngircd_starting ));
|
||||||
@ -226,6 +227,41 @@ yesno_to_str(int boolean_value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
opers_free(void)
|
||||||
|
{
|
||||||
|
struct Conf_Oper *op;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
|
op = array_start(&Conf_Opers);
|
||||||
|
while (len--) {
|
||||||
|
free(op->mask);
|
||||||
|
op++;
|
||||||
|
}
|
||||||
|
array_free(&Conf_Opers);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
opers_puts(void)
|
||||||
|
{
|
||||||
|
struct Conf_Oper *op;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
|
op = array_start(&Conf_Opers);
|
||||||
|
while (len--) {
|
||||||
|
assert(op->name[0]);
|
||||||
|
|
||||||
|
puts("[OPERATOR]");
|
||||||
|
printf(" Name = %s\n", op->name);
|
||||||
|
printf(" Password = %s\n", op->pwd);
|
||||||
|
printf(" Mask = %s\n\n", op->mask ? op->mask : "");
|
||||||
|
op++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL int
|
GLOBAL int
|
||||||
Conf_Test( void )
|
Conf_Test( void )
|
||||||
{
|
{
|
||||||
@ -304,16 +340,7 @@ Conf_Test( void )
|
|||||||
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
|
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
|
||||||
printf(" MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
|
printf(" MaxNickLength = %u\n\n", Conf_MaxNickLength - 1);
|
||||||
|
|
||||||
for( i = 0; i < Conf_Oper_Count; i++ ) {
|
opers_puts();
|
||||||
if( ! Conf_Oper[i].name[0] ) continue;
|
|
||||||
|
|
||||||
/* Valid "Operator" section */
|
|
||||||
puts( "[OPERATOR]" );
|
|
||||||
printf( " Name = %s\n", Conf_Oper[i].name );
|
|
||||||
printf( " Password = %s\n", Conf_Oper[i].pwd );
|
|
||||||
if ( Conf_Oper[i].mask ) printf( " Mask = %s\n", Conf_Oper[i].mask );
|
|
||||||
puts( "" );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i = 0; i < MAX_SERVERS; i++ ) {
|
for( i = 0; i < MAX_SERVERS; i++ ) {
|
||||||
if( ! Conf_Server[i].name[0] ) continue;
|
if( ! Conf_Server[i].name[0] ) continue;
|
||||||
@ -609,6 +636,7 @@ Read_Config( bool ngircd_starting )
|
|||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opers_free();
|
||||||
Set_Defaults( ngircd_starting );
|
Set_Defaults( ngircd_starting );
|
||||||
|
|
||||||
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
|
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
|
||||||
@ -667,21 +695,6 @@ Read_Config( bool ngircd_starting )
|
|||||||
if( strcasecmp( section, "[GLOBAL]" ) == 0 )
|
if( strcasecmp( section, "[GLOBAL]" ) == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( strcasecmp( section, "[OPERATOR]" ) == 0 ) {
|
|
||||||
if( Conf_Oper_Count + 1 > MAX_OPERATORS )
|
|
||||||
Config_Error( LOG_ERR, "Too many operators configured.");
|
|
||||||
else {
|
|
||||||
/* Initialize new operator structure */
|
|
||||||
Conf_Oper[Conf_Oper_Count].name[0] = '\0';
|
|
||||||
Conf_Oper[Conf_Oper_Count].pwd[0] = '\0';
|
|
||||||
if (Conf_Oper[Conf_Oper_Count].mask) {
|
|
||||||
free(Conf_Oper[Conf_Oper_Count].mask );
|
|
||||||
Conf_Oper[Conf_Oper_Count].mask = NULL;
|
|
||||||
}
|
|
||||||
Conf_Oper_Count++;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
||||||
/* Check if there is already a server to add */
|
/* Check if there is already a server to add */
|
||||||
if( New_Server.name[0] ) {
|
if( New_Server.name[0] ) {
|
||||||
@ -710,6 +723,10 @@ Read_Config( bool ngircd_starting )
|
|||||||
Conf_Channel_Count++;
|
Conf_Channel_Count++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (strcasecmp(section, "[OPERATOR]") == 0) {
|
||||||
|
Conf_Oper_Count++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
|
Config_Error( LOG_ERR, "%s, line %d: Unknown section \"%s\"!", NGIRCd_ConfFile, line, section );
|
||||||
section[0] = 0x1;
|
section[0] = 0x1;
|
||||||
@ -1081,36 +1098,38 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
static void
|
static void
|
||||||
Handle_OPERATOR( int Line, char *Var, char *Arg )
|
Handle_OPERATOR( int Line, char *Var, char *Arg )
|
||||||
{
|
{
|
||||||
unsigned int opercount;
|
|
||||||
size_t len;
|
size_t len;
|
||||||
|
struct Conf_Oper *op;
|
||||||
|
|
||||||
assert( Line > 0 );
|
assert( Line > 0 );
|
||||||
assert( Var != NULL );
|
assert( Var != NULL );
|
||||||
assert( Arg != NULL );
|
assert( Arg != NULL );
|
||||||
assert( Conf_Oper_Count > 0 );
|
assert( Conf_Oper_Count > 0 );
|
||||||
|
|
||||||
if ( Conf_Oper_Count == 0 )
|
op = array_alloc(&Conf_Opers, sizeof(*op), Conf_Oper_Count - 1);
|
||||||
|
if (!op) {
|
||||||
|
Config_Error(LOG_ERR, "Could not allocate memory for operator (%d:%s = %s)", Line, Var, Arg);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
opercount = Conf_Oper_Count - 1;
|
if (strcasecmp(Var, "Name") == 0) {
|
||||||
|
|
||||||
if( strcasecmp( Var, "Name" ) == 0 ) {
|
|
||||||
/* Name of IRC operator */
|
/* Name of IRC operator */
|
||||||
len = strlcpy( Conf_Oper[opercount].name, Arg, sizeof( Conf_Oper[opercount].name ));
|
len = strlcpy(op->name, Arg, sizeof(op->name));
|
||||||
if (len >= sizeof( Conf_Oper[opercount].name ))
|
if (len >= sizeof(op->name))
|
||||||
Config_Error_TooLong( Line, Var );
|
Config_Error_TooLong(Line, Var);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( strcasecmp( Var, "Password" ) == 0 ) {
|
if (strcasecmp(Var, "Password") == 0) {
|
||||||
/* Password of IRC operator */
|
/* Password of IRC operator */
|
||||||
len = strlcpy( Conf_Oper[opercount].pwd, Arg, sizeof( Conf_Oper[opercount].pwd ));
|
len = strlcpy(op->pwd, Arg, sizeof(op->pwd));
|
||||||
if (len >= sizeof( Conf_Oper[opercount].pwd ))
|
if (len >= sizeof(op->pwd))
|
||||||
Config_Error_TooLong( Line, Var );
|
Config_Error_TooLong(Line, Var);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( strcasecmp( Var, "Mask" ) == 0 ) {
|
if (strcasecmp(Var, "Mask") == 0) {
|
||||||
if (Conf_Oper[opercount].mask) return; /* Hostname already configured */
|
if (op->mask)
|
||||||
|
return; /* Hostname already configured */
|
||||||
Conf_Oper[opercount].mask = strdup_warn( Arg );
|
op->mask = strdup_warn( Arg );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!",
|
Config_Error( LOG_ERR, "%s, line %d (section \"Operator\"): Unknown variable \"%s\"!",
|
||||||
|
@ -26,12 +26,11 @@
|
|||||||
#include "conf-ssl.h"
|
#include "conf-ssl.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct _Conf_Oper
|
struct Conf_Oper {
|
||||||
{
|
|
||||||
char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
|
char name[CLIENT_PASS_LEN]; /* Name (ID) of IRC operator */
|
||||||
char pwd[CLIENT_PASS_LEN]; /* Password */
|
char pwd[CLIENT_PASS_LEN]; /* Password */
|
||||||
char *mask;
|
char *mask; /* allowed host mask */
|
||||||
} CONF_OPER;
|
};
|
||||||
|
|
||||||
typedef struct _Conf_Server
|
typedef struct _Conf_Server
|
||||||
{
|
{
|
||||||
@ -125,8 +124,7 @@ GLOBAL int Conf_PongTimeout;
|
|||||||
GLOBAL int Conf_ConnectRetry;
|
GLOBAL int Conf_ConnectRetry;
|
||||||
|
|
||||||
/* Operators */
|
/* Operators */
|
||||||
GLOBAL CONF_OPER Conf_Oper[MAX_OPERATORS];
|
GLOBAL array Conf_Opers;
|
||||||
GLOBAL unsigned int Conf_Oper_Count;
|
|
||||||
|
|
||||||
/* Servers */
|
/* Servers */
|
||||||
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
|
||||||
|
@ -30,8 +30,6 @@
|
|||||||
#define HOST_LEN 256 /* Max. lenght of fully qualified host
|
#define HOST_LEN 256 /* Max. lenght of fully qualified host
|
||||||
names (e. g. "abc.domain.tld") */
|
names (e. g. "abc.domain.tld") */
|
||||||
|
|
||||||
#define MAX_OPERATORS 16 /* Max. count of configurable IRC Ops */
|
|
||||||
|
|
||||||
#define MAX_SERVERS 16 /* Max. count of configurable servers */
|
#define MAX_SERVERS 16 /* Max. count of configurable servers */
|
||||||
|
|
||||||
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
|
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
|
||||||
|
@ -55,25 +55,26 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
|
|||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
unsigned int i;
|
struct Conf_Oper *op;
|
||||||
|
size_t len, i;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||||
|
|
||||||
for( i = 0; i < Conf_Oper_Count; i++)
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
{
|
op = array_start(&Conf_Opers);
|
||||||
if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
|
for (i = 0; i < len && strcmp(op[i].name, Req->argv[0]); i++)
|
||||||
}
|
;
|
||||||
if( i >= Conf_Oper_Count )
|
if (i >= len)
|
||||||
return Bad_OperPass(Client, Req->argv[0], "not configured");
|
return Bad_OperPass(Client, Req->argv[0], "not configured");
|
||||||
|
|
||||||
if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
|
if (strcmp(op[i].pwd, Req->argv[1]) != 0)
|
||||||
return Bad_OperPass(Client, Conf_Oper[i].name, "bad password");
|
return Bad_OperPass(Client, op[i].name, "bad password");
|
||||||
|
|
||||||
if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
|
if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client))))
|
||||||
return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
|
return Bad_OperPass(Client, op[i].mask, "hostmask check failed");
|
||||||
|
|
||||||
if( ! Client_HasMode( Client, 'o' ))
|
if( ! Client_HasMode( Client, 'o' ))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user