mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-30 21:42:59 +00:00 
			
		
		
		
	- neu: Check_List(), Check_List(), Lists_AddInvited(), Lists_DelInvited(), Lists_ShowInvites, Lists_AddBanned(), Lists_DelBanned(), Lists_ShowBanned und Lists_MakeMask().
- einige Bug-Fixes, bessere Debug-Meldungen.
This commit is contained in:
		| @@ -9,7 +9,7 @@ | |||||||
|  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste |  * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste | ||||||
|  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. |  * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. | ||||||
|  * |  * | ||||||
|  * $Id: lists.c,v 1.6 2002/08/26 23:47:58 alex Exp $ |  * $Id: lists.c,v 1.7 2002/09/08 00:55:45 alex Exp $ | ||||||
|  * |  * | ||||||
|  * lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ... |  * lists.c: Verwaltung der "IRC-Listen": Ban, Invite, ... | ||||||
|  */ |  */ | ||||||
| @@ -25,6 +25,9 @@ | |||||||
| #include "client.h" | #include "client.h" | ||||||
| #include "channel.h" | #include "channel.h" | ||||||
| #include "log.h" | #include "log.h" | ||||||
|  | #include "match.h" | ||||||
|  | #include "messages.h" | ||||||
|  | #include "irc-write.h" | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -33,7 +36,7 @@ | |||||||
| #include "lists.h" | #include "lists.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #define MASK_LEN CLIENT_ID_LEN+CLIENT_HOST_LEN | #define MASK_LEN 2*CLIENT_HOST_LEN | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct _C2C | typedef struct _C2C | ||||||
| @@ -50,6 +53,9 @@ LOCAL C2C *My_Invites, *My_Bans; | |||||||
|  |  | ||||||
| LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )); | LOCAL C2C *New_C2C PARAMS(( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce )); | ||||||
|  |  | ||||||
|  | LOCAL BOOLEAN Check_List PARAMS(( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan )); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL VOID | GLOBAL VOID | ||||||
| Lists_Init( VOID ) | Lists_Init( VOID ) | ||||||
| @@ -90,48 +96,19 @@ Lists_Exit( VOID ) | |||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan ) | Lists_CheckInvited( CLIENT *Client, CHANNEL *Chan ) | ||||||
| { | { | ||||||
| 	C2C *c2c, *last; | 	return Check_List( &My_Invites, Client, Chan ); | ||||||
| 	 |  | ||||||
| 	assert( Client != NULL ); |  | ||||||
| 	assert( Chan != NULL ); |  | ||||||
|  |  | ||||||
| 	last = NULL; |  | ||||||
| 	c2c = My_Invites; |  | ||||||
| 	while( c2c ) |  | ||||||
| 	{ |  | ||||||
| 		if( c2c->channel == Chan ) |  | ||||||
| 		{ |  | ||||||
| 			/* Ok, richtiger Channel. Passt die Maske? */ |  | ||||||
| 			if( strcasecmp( Client_Mask( Client ), c2c->mask ) == 0 ) |  | ||||||
| 			{ |  | ||||||
| 				/* Treffer! */ |  | ||||||
| 				if( c2c->onlyonce ) |  | ||||||
| 				{ |  | ||||||
| 					/* Eintrag loeschen */ |  | ||||||
| 					if( last ) last->next = c2c->next; |  | ||||||
| 					else My_Invites = c2c->next; |  | ||||||
| 					free( c2c ); |  | ||||||
| 				} |  | ||||||
| 				return TRUE; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		last = c2c; |  | ||||||
| 		c2c = c2c->next; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	return FALSE; |  | ||||||
| } /* Lists_CheckInvited */ | } /* Lists_CheckInvited */ | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| Lists_AddInvited( CHAR *Pattern, CHANNEL *Chan, BOOLEAN OnlyOnce ) | Lists_AddInvited( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) | ||||||
| { | { | ||||||
| 	C2C *c2c; | 	C2C *c2c; | ||||||
|  |  | ||||||
| 	assert( Pattern != NULL ); | 	assert( Mask != NULL ); | ||||||
| 	assert( Chan != NULL ); | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
| 	c2c = New_C2C( Pattern, Chan, OnlyOnce ); | 	c2c = New_C2C( Mask, Chan, OnlyOnce ); | ||||||
| 	if( ! c2c ) | 	if( ! c2c ) | ||||||
| 	{ | 	{ | ||||||
| 		Log( LOG_ERR, "Can't add new invite list entry!" ); | 		Log( LOG_ERR, "Can't add new invite list entry!" ); | ||||||
| @@ -142,19 +119,138 @@ Lists_AddInvited( CHAR *Pattern, CHANNEL *Chan, BOOLEAN OnlyOnce ) | |||||||
| 	c2c->next = My_Invites; | 	c2c->next = My_Invites; | ||||||
| 	My_Invites = c2c; | 	My_Invites = c2c; | ||||||
|  |  | ||||||
| 	Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Pattern, Channel_Name( Chan )); | 	Log( LOG_DEBUG, "Added \"%s\" to invite list for \"%s\".", Mask, Channel_Name( Chan )); | ||||||
| 	return TRUE; | 	return TRUE; | ||||||
| } /* Lists_AddInvited */ | } /* Lists_AddInvited */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL VOID | ||||||
|  | Lists_DelInvited( CHAR *Mask, CHANNEL *Chan ) | ||||||
|  | { | ||||||
|  | 	C2C *c2c, *last, *next; | ||||||
|  |  | ||||||
|  | 	assert( Mask != NULL ); | ||||||
|  | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
|  | 	last = NULL; | ||||||
|  | 	c2c = My_Invites; | ||||||
|  | 	while( c2c ) | ||||||
|  | 	{ | ||||||
|  | 		next = c2c->next; | ||||||
|  | 		if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) | ||||||
|  | 		{ | ||||||
|  | 			/* dieser Eintrag muss geloescht werden */ | ||||||
|  | 			Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan )); | ||||||
|  | 			if( last ) last->next = next; | ||||||
|  | 			else My_Invites = next; | ||||||
|  | 			free( c2c ); | ||||||
|  | 		} | ||||||
|  | 		else last = c2c; | ||||||
|  | 		c2c = next; | ||||||
|  | 	} | ||||||
|  | } /* Lists_DelInvited */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | Lists_ShowInvites( CLIENT *Client, CHANNEL *Channel ) | ||||||
|  | { | ||||||
|  | 	C2C *c2c; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Channel != NULL ); | ||||||
|  |  | ||||||
|  | 	c2c = My_Invites; | ||||||
|  | 	while( c2c ) | ||||||
|  | 	{ | ||||||
|  | 		if( c2c->channel == Channel ) | ||||||
|  | 		{ | ||||||
|  | 			/* Eintrag fuer Channel gefunden; ausgeben: */ | ||||||
|  | 			if( ! IRC_WriteStrClient( Client, RPL_INVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED; | ||||||
|  | 		} | ||||||
|  | 		c2c = c2c->next; | ||||||
|  | 	} | ||||||
|  | 	return IRC_WriteStrClient( Client, RPL_ENDOFINVITELIST_MSG, Client_ID( Client ), Channel_Name( Channel )); | ||||||
|  | } /* Lists_ShowInvites */ | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan ) | Lists_CheckBanned( CLIENT *Client, CHANNEL *Chan ) | ||||||
| { | { | ||||||
| 	assert( Client != NULL ); | 	return Check_List( &My_Bans, Client, Chan ); | ||||||
|  | } /* Lists_CheckBanned */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | Lists_AddBanned( CHAR *Mask, CHANNEL *Chan ) | ||||||
|  | { | ||||||
|  | 	C2C *c2c; | ||||||
|  |  | ||||||
|  | 	assert( Mask != NULL ); | ||||||
| 	assert( Chan != NULL ); | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
| 	return FALSE; | 	c2c = New_C2C( Mask, Chan, FALSE ); | ||||||
| } /* Lists_CheckBanned */ | 	if( ! c2c ) | ||||||
|  | 	{ | ||||||
|  | 		Log( LOG_ERR, "Can't add new ban list entry!" ); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* verketten */ | ||||||
|  | 	c2c->next = My_Bans; | ||||||
|  | 	My_Bans = c2c; | ||||||
|  |  | ||||||
|  | 	Log( LOG_DEBUG, "Added \"%s\" to ban list for \"%s\".", Mask, Channel_Name( Chan )); | ||||||
|  | 	return TRUE; | ||||||
|  | } /* Lists_AddBanned */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL VOID | ||||||
|  | Lists_DelBanned( CHAR *Mask, CHANNEL *Chan ) | ||||||
|  | { | ||||||
|  | 	C2C *c2c, *last, *next; | ||||||
|  |  | ||||||
|  | 	assert( Mask != NULL ); | ||||||
|  | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
|  | 	last = NULL; | ||||||
|  | 	c2c = My_Bans; | ||||||
|  | 	while( c2c ) | ||||||
|  | 	{ | ||||||
|  | 		next = c2c->next; | ||||||
|  | 		if(( c2c->channel == Chan ) && ( strcasecmp( c2c->mask, Mask ) == 0 )) | ||||||
|  | 		{ | ||||||
|  | 			/* dieser Eintrag muss geloescht werden */ | ||||||
|  | 			Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan )); | ||||||
|  | 			if( last ) last->next = next; | ||||||
|  | 			else My_Bans = next; | ||||||
|  | 			free( c2c ); | ||||||
|  | 		} | ||||||
|  | 		else last = c2c; | ||||||
|  | 		c2c = next; | ||||||
|  | 	} | ||||||
|  | } /* Lists_DelBanned */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | Lists_ShowBans( CLIENT *Client, CHANNEL *Channel ) | ||||||
|  | { | ||||||
|  | 	C2C *c2c; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Channel != NULL ); | ||||||
|  |  | ||||||
|  | 	c2c = My_Bans; | ||||||
|  | 	while( c2c ) | ||||||
|  | 	{ | ||||||
|  | 		if( c2c->channel == Channel ) | ||||||
|  | 		{ | ||||||
|  | 			/* Eintrag fuer Channel gefunden; ausgeben: */ | ||||||
|  | 			if( ! IRC_WriteStrClient( Client, RPL_BANLIST_MSG, Client_ID( Client ), Channel_Name( Channel ), c2c->mask )) return DISCONNECTED; | ||||||
|  | 		} | ||||||
|  | 		c2c = c2c->next; | ||||||
|  | 	} | ||||||
|  | 	return IRC_WriteStrClient( Client, RPL_ENDOFBANLIST_MSG, Client_ID( Client ), Channel_Name( Channel )); | ||||||
|  | } /* Lists_ShowBans */ | ||||||
|  |  | ||||||
|  |  | ||||||
| GLOBAL VOID | GLOBAL VOID | ||||||
| @@ -173,6 +269,7 @@ Lists_DeleteChannel( CHANNEL *Chan ) | |||||||
| 		if( c2c->channel == Chan ) | 		if( c2c->channel == Chan ) | ||||||
| 		{ | 		{ | ||||||
| 			/* dieser Eintrag muss geloescht werden */ | 			/* dieser Eintrag muss geloescht werden */ | ||||||
|  | 			Log( LOG_DEBUG, "Deleted \"%s\" from invite list for \"%s\"." , c2c->mask, Channel_Name( Chan )); | ||||||
| 			if( last ) last->next = next; | 			if( last ) last->next = next; | ||||||
| 			else My_Invites = next; | 			else My_Invites = next; | ||||||
| 			free( c2c ); | 			free( c2c ); | ||||||
| @@ -190,6 +287,7 @@ Lists_DeleteChannel( CHANNEL *Chan ) | |||||||
| 		if( c2c->channel == Chan ) | 		if( c2c->channel == Chan ) | ||||||
| 		{ | 		{ | ||||||
| 			/* dieser Eintrag muss geloescht werden */ | 			/* dieser Eintrag muss geloescht werden */ | ||||||
|  | 			Log( LOG_DEBUG, "Deleted \"%s\" from ban list for \"%s\"." , c2c->mask, Channel_Name( Chan )); | ||||||
| 			if( last ) last->next = next; | 			if( last ) last->next = next; | ||||||
| 			else My_Bans = next; | 			else My_Bans = next; | ||||||
| 			free( c2c ); | 			free( c2c ); | ||||||
| @@ -200,6 +298,60 @@ Lists_DeleteChannel( CHANNEL *Chan ) | |||||||
| } /* Lists_DeleteChannel */ | } /* Lists_DeleteChannel */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL CHAR * | ||||||
|  | Lists_MakeMask( CHAR *Pattern ) | ||||||
|  | { | ||||||
|  | 	/* Hier wird aus einem "beliebigen" Pattern eine gueltige IRC-Mask erzeugt. | ||||||
|  | 	* Diese ist aber nur bis zum naechsten Aufruf von Lists_MakeMask() gueltig, | ||||||
|  | 	* da ein einziger globaler Puffer verwendet wird. ->Umkopieren!*/ | ||||||
|  |  | ||||||
|  | 	STATIC CHAR TheMask[MASK_LEN]; | ||||||
|  | 	CHAR *excl, *at; | ||||||
|  |  | ||||||
|  | 	assert( Pattern ); | ||||||
|  |  | ||||||
|  | 	excl = strchr( Pattern, '!' ); | ||||||
|  | 	at = strchr( Pattern, '@' ); | ||||||
|  |  | ||||||
|  | 	if(( at ) && ( at < excl )) excl = NULL; | ||||||
|  |  | ||||||
|  | 	if(( ! at ) && ( ! excl )) | ||||||
|  | 	{ | ||||||
|  | 		/* weder ! noch @<40>vorhanden: als Nick annehmen */ | ||||||
|  | 		strncpy( TheMask, Pattern, MASK_LEN - 5 ); | ||||||
|  | 		TheMask[MASK_LEN - 5] = '\0'; | ||||||
|  | 		strcat( TheMask, "!*@*" ); | ||||||
|  | 		return TheMask; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(( ! at ) && ( excl )) | ||||||
|  | 	{ | ||||||
|  | 		/* Domain fehlt */ | ||||||
|  | 		strncpy( TheMask, Pattern, MASK_LEN - 3 ); | ||||||
|  | 		TheMask[MASK_LEN - 3] = '\0'; | ||||||
|  | 		strcat( TheMask, "@*" ); | ||||||
|  | 		return TheMask; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(( at ) && ( ! excl )) | ||||||
|  | 	{ | ||||||
|  | 		/* User fehlt */ | ||||||
|  | 		*at = '\0'; at++; | ||||||
|  | 		strncpy( TheMask, Pattern, MASK_LEN - 4 ); | ||||||
|  | 		TheMask[MASK_LEN - 4] = '\0'; | ||||||
|  | 		strcat( TheMask, "!*@" ); | ||||||
|  | 		strncat( TheMask, at, strlen( TheMask ) - MASK_LEN - 1 ); | ||||||
|  | 		TheMask[MASK_LEN - 1] = '\0'; | ||||||
|  | 		return TheMask; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* alle Teile vorhanden */ | ||||||
|  | 	strncpy( TheMask, Pattern, MASK_LEN - 1 ); | ||||||
|  | 	TheMask[MASK_LEN - 1] = '\0'; | ||||||
|  | 	return TheMask; | ||||||
|  | } /* Lists_MakeMask */ | ||||||
|  |  | ||||||
|  |  | ||||||
| LOCAL C2C * | LOCAL C2C * | ||||||
| New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) | New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) | ||||||
| { | { | ||||||
| @@ -219,9 +371,48 @@ New_C2C( CHAR *Mask, CHANNEL *Chan, BOOLEAN OnlyOnce ) | |||||||
| 	strncpy( c2c->mask, Mask, MASK_LEN ); | 	strncpy( c2c->mask, Mask, MASK_LEN ); | ||||||
| 	c2c->channel = Chan; | 	c2c->channel = Chan; | ||||||
| 	c2c->onlyonce = OnlyOnce; | 	c2c->onlyonce = OnlyOnce; | ||||||
| 	 |  | ||||||
| 	return c2c; | 	return c2c; | ||||||
| } /* New_C2C */ | } /* New_C2C */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LOCAL BOOLEAN | ||||||
|  | Check_List( C2C **Cl2Chan, CLIENT *Client, CHANNEL *Chan ) | ||||||
|  | { | ||||||
|  | 	C2C *c2c, *last; | ||||||
|  |  | ||||||
|  | 	assert( Cl2Chan != NULL ); | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Chan != NULL ); | ||||||
|  |  | ||||||
|  | 	c2c = *Cl2Chan; | ||||||
|  | 	last = NULL; | ||||||
|  |  | ||||||
|  | 	while( c2c ) | ||||||
|  | 	{ | ||||||
|  | 		if( c2c->channel == Chan ) | ||||||
|  | 		{ | ||||||
|  | 			/* Ok, richtiger Channel. Passt die Maske? */ | ||||||
|  | 			if( Match( c2c->mask, Client_Mask( Client ))) | ||||||
|  | 			{ | ||||||
|  | 				/* Treffer! */ | ||||||
|  | 				if( c2c->onlyonce ) | ||||||
|  | 				{ | ||||||
|  | 					/* Eintrag loeschen */ | ||||||
|  | 					Log( LOG_DEBUG, "Deleted \"%s\" from %s list for \"%s\".", c2c->mask, *Cl2Chan == My_Invites ? "invite" : "ban", Channel_Name( Chan )); | ||||||
|  | 					if( last ) last->next = c2c->next; | ||||||
|  | 					else *Cl2Chan = c2c->next; | ||||||
|  | 					free( c2c ); | ||||||
|  | 				} | ||||||
|  | 				return TRUE; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		last = c2c; | ||||||
|  | 		c2c = c2c->next; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return FALSE; | ||||||
|  | } /* Check_List */ | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -eof- */ | /* -eof- */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton