mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-11-03 23:43:00 +00:00 
			
		
		
		
	Compare commits
	
		
			12 Commits
		
	
	
		
			rel-0-11-0
			...
			branch-0-1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					3b69da0c52 | ||
| 
						 | 
					04933f5b8b | ||
| 
						 | 
					45df522bcb | ||
| 
						 | 
					51260c2e9f | ||
| 
						 | 
					55865d7fc6 | ||
| 
						 | 
					082a92beef | ||
| 
						 | 
					e92c889580 | ||
| 
						 | 
					de4676f066 | ||
| 
						 | 
					64a98338d5 | ||
| 
						 | 
					f4709082fe | ||
| 
						 | 
					997abc6889 | ||
| 
						 | 
					b7047f2e3b | 
							
								
								
									
										18
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -10,8 +10,17 @@
 | 
			
		||||
                               -- ChangeLog --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.11.0-pre2 (2008-01-07)
 | 
			
		||||
ngIRCd 0.11.1 (2008-02-26)
 | 
			
		||||
 | 
			
		||||
  - Fix sending of JOIN commands between servers when remote server appended
 | 
			
		||||
    mode flags. (Rolf Eike Beer) [from HEAD]
 | 
			
		||||
  - Send "G" instead of "H" flag in WHO replies. (reported by Dana Dahlstrom)
 | 
			
		||||
  - Under some circumstances ngIRCd issued channel MODE message with a
 | 
			
		||||
    trailing space. (Dana Dahlstrom) [from HEAD]
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.11.0 (2008-01-15)
 | 
			
		||||
 | 
			
		||||
  ngIRCd 0.11.0-pre2 (2008-01-07)
 | 
			
		||||
  - SECURITY: IRC_PART could reference invalid memory, causing
 | 
			
		||||
    ngircd to crash [from HEAD].
 | 
			
		||||
  
 | 
			
		||||
@@ -44,6 +53,11 @@ ngIRCd 0.11.0-pre2 (2008-01-07)
 | 
			
		||||
  - Added support for the WALLOPS command. Usage is restricted to IRC
 | 
			
		||||
    operators.
 | 
			
		||||
 | 
			
		||||
ngIRCd 0.10.4 (2008-01-07)
 | 
			
		||||
 | 
			
		||||
  - SECURITY: IRC_PART could reference invalid memory, causing
 | 
			
		||||
    ngircd to crash [from HEAD].
 | 
			
		||||
  
 | 
			
		||||
ngIRCd 0.10.3 (2007-08-01)
 | 
			
		||||
 | 
			
		||||
  - SECURITY: Fixed a severe bug in handling JOIN commands, which could
 | 
			
		||||
@@ -728,4 +742,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: ChangeLog,v 1.332.2.4 2008/01/07 21:25:35 alex Exp $
 | 
			
		||||
$Id: ChangeLog,v 1.332.2.11 2008/02/26 20:35:05 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								NEWS
									
									
									
									
									
								
							@@ -10,7 +10,7 @@
 | 
			
		||||
                                  -- NEWS --
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ngIRCd HEAD
 | 
			
		||||
ngIRCd 0.11.0 (2008-01-15)
 | 
			
		||||
 | 
			
		||||
  - Add support for /STAT u (server uptime) command.
 | 
			
		||||
  - New [Server] configuration Option "Bind" allows to specify
 | 
			
		||||
@@ -251,4 +251,4 @@ ngIRCd 0.0.1, 31.12.2001
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
$Id: NEWS,v 1.83 2008/01/02 11:31:48 alex Exp $
 | 
			
		||||
$Id: NEWS,v 1.83.2.4 2008/02/26 19:22:07 alex Exp $
 | 
			
		||||
 
 | 
			
		||||
@@ -8,13 +8,13 @@
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
# Please read the file COPYING, README and AUTHORS for more information.
 | 
			
		||||
#
 | 
			
		||||
# $Id: configure.in,v 1.125.2.2 2008/01/07 21:25:36 alex Exp $
 | 
			
		||||
# $Id: configure.in,v 1.125.2.4 2008/02/26 19:37:34 alex Exp $
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# -- Initialisation --
 | 
			
		||||
 | 
			
		||||
AC_PREREQ(2.50)
 | 
			
		||||
AC_INIT(ngircd, 0.11.0-pre2)
 | 
			
		||||
AC_INIT(ngircd, 0.11.1)
 | 
			
		||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
 | 
			
		||||
AC_CANONICAL_TARGET
 | 
			
		||||
AM_INIT_AUTOMAKE(1.6)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,15 @@
 | 
			
		||||
ngircd (0.11.1-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release 0.11.1.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 26 Feb 2008 20:24:55 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.11.0-0ab1) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * New "upstream" release 0.11.0.
 | 
			
		||||
 | 
			
		||||
 -- Alexander Barton <alex@barton.de>  Tue, 15 Jan 2008 21:43:46 +0100
 | 
			
		||||
 | 
			
		||||
ngircd (0.11.0-0ab0-pre2) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * Second prerelease of upcoming new "upstream release".
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
%define name    ngircd
 | 
			
		||||
%define version 0.11.0-pre2
 | 
			
		||||
%define version 0.11.1
 | 
			
		||||
%define release 1
 | 
			
		||||
%define prefix  %{_prefix}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
# $Id: sample-ngircd.conf,v 1.43 2007/11/23 16:26:03 fw Exp $
 | 
			
		||||
# $Id: sample-ngircd.conf,v 1.43.2.1 2008/01/07 23:10:28 alex Exp $
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# This is a sample configuration file for the ngIRCd, which must be adepted
 | 
			
		||||
@@ -100,6 +100,9 @@
 | 
			
		||||
	# Allow Pre-Defined Channels only (see Section [Channels])
 | 
			
		||||
	;PredefChannelsOnly = no
 | 
			
		||||
 | 
			
		||||
	# Don't do any DNS lookups when a client connects to the server.
 | 
			
		||||
	;NoDNS = no
 | 
			
		||||
 | 
			
		||||
	# Maximum number of simultaneous connection the server is allowed
 | 
			
		||||
	# to accept (0: unlimited):
 | 
			
		||||
	;MaxConnections = 0
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: io.c,v 1.28 2008/01/02 10:29:51 fw Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: io.c,v 1.28.2.1 2008/04/03 14:16:35 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
@@ -308,7 +308,7 @@ io_event_create(int fd, short what, void (*cbfunc) (int, short))
 | 
			
		||||
 | 
			
		||||
	assert(fd >= 0);
 | 
			
		||||
#if defined(IO_USE_SELECT) && defined(FD_SETSIZE)
 | 
			
		||||
	if (fd >= FD_SETSIZE) {
 | 
			
		||||
	if (io_masterfd < 0 && fd >= FD_SETSIZE) {
 | 
			
		||||
		Log(LOG_ERR,
 | 
			
		||||
		    "fd %d exceeds FD_SETSIZE (%u) (select can't handle more file descriptors)",
 | 
			
		||||
		    fd, FD_SETSIZE);
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.1 2008/01/07 11:42:14 fw Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-channel.c,v 1.40.2.2 2008/02/26 12:07:41 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -79,6 +79,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
	{
 | 
			
		||||
		chan = NULL; flags = NULL;
 | 
			
		||||
 | 
			
		||||
		if (Client_Type(Client) == CLIENT_SERVER) {
 | 
			
		||||
			flags = strchr( channame, 0x7 );
 | 
			
		||||
			if( flags ) {
 | 
			
		||||
				*flags = '\0';
 | 
			
		||||
				flags++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* wird der Channel neu angelegt? */
 | 
			
		||||
		if( Channel_Search( channame )) {
 | 
			
		||||
			is_new_chan = false;
 | 
			
		||||
@@ -92,18 +100,6 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			is_new_chan = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Hat ein Server Channel-User-Modes uebergeben? */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		{
 | 
			
		||||
			/* Channel-Flags extrahieren */
 | 
			
		||||
			flags = strchr( channame, 0x7 );
 | 
			
		||||
			if( flags )
 | 
			
		||||
			{
 | 
			
		||||
				*flags = '\0';
 | 
			
		||||
				flags++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Local client? */
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_USER )
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.41 2007/12/11 11:29:44 fw Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-info.c,v 1.41.2.1 2008/02/26 12:06:57 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -648,7 +648,11 @@ IRC_WHO( CLIENT *Client, REQUEST *Req )
 | 
			
		||||
			if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' ))))
 | 
			
		||||
			{
 | 
			
		||||
				/* Get flags */
 | 
			
		||||
				strcpy( flags, "H" );
 | 
			
		||||
				if (strchr(Client_Modes( c ), 'a'))
 | 
			
		||||
					strcpy(flags, "G"); /* away */
 | 
			
		||||
				else
 | 
			
		||||
					strcpy(flags, "H");
 | 
			
		||||
 | 
			
		||||
				if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
			
		||||
 | 
			
		||||
				/* Search suitable channel */
 | 
			
		||||
@@ -1082,10 +1086,12 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
 | 
			
		||||
		if( strchr( Client_Modes( c ), 'i' )) is_visible = false;
 | 
			
		||||
		else is_visible = true;
 | 
			
		||||
 | 
			
		||||
		if( is_member || is_visible )
 | 
			
		||||
		{
 | 
			
		||||
			/* Flags zusammenbasteln */
 | 
			
		||||
			strcpy( flags, "H" );
 | 
			
		||||
		if( is_member || is_visible ) {
 | 
			
		||||
			if (strchr(Client_Modes( c ), 'a'))
 | 
			
		||||
				strcpy(flags, "G"); /* away */
 | 
			
		||||
			else
 | 
			
		||||
				strcpy(flags, "H");
 | 
			
		||||
 | 
			
		||||
			if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags ));
 | 
			
		||||
			if( strchr( Channel_UserModes( Chan, c ), 'o' )) strlcat( flags, "@", sizeof( flags ));
 | 
			
		||||
			else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strlcat( flags, "+", sizeof( flags ));
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.54 2007/11/21 12:16:36 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-login.c,v 1.54.2.1 2008/02/05 11:48:37 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -601,8 +601,8 @@ Hello_User( CLIENT *Client )
 | 
			
		||||
	/* Version and system type */
 | 
			
		||||
#ifdef CVSDATE
 | 
			
		||||
	strlcpy( ver, CVSDATE, sizeof( ver ));
 | 
			
		||||
	strncpy( ver + 4, ver + 5, 2 );
 | 
			
		||||
	strncpy( ver + 6, ver + 8, 3 );
 | 
			
		||||
	memmove( ver + 4, ver + 5, 2 );
 | 
			
		||||
	memmove( ver + 6, ver + 8, 3 );
 | 
			
		||||
	snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver );
 | 
			
		||||
	if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), vertxt, TARGET_CPU, TARGET_VENDOR, TARGET_OS )) return false;
 | 
			
		||||
#else
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.50 2007/10/14 12:08:57 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: irc-mode.c,v 1.50.2.1 2008/02/16 11:26:12 fw Exp $";
 | 
			
		||||
 | 
			
		||||
#include "imp.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
@@ -317,7 +317,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
	/* Prepare reply string */
 | 
			
		||||
	if( set ) strcpy( the_modes, "+" );
 | 
			
		||||
	else strcpy( the_modes, "-" );
 | 
			
		||||
	strcpy( the_args, " " );
 | 
			
		||||
	the_args[0] = '\0';
 | 
			
		||||
 | 
			
		||||
	x[1] = '\0';
 | 
			
		||||
	ok = CONNECTED;
 | 
			
		||||
@@ -528,8 +528,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
				/* Channel-User-Mode */
 | 
			
		||||
				if( Channel_UserModeAdd( Channel, client, x[0] ))
 | 
			
		||||
				{
 | 
			
		||||
					strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
			
		||||
					strlcat( the_args, " ", sizeof( the_args ));
 | 
			
		||||
					strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
			
		||||
					strlcat( the_modes, x, sizeof( the_modes ));
 | 
			
		||||
					Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
 | 
			
		||||
				}
 | 
			
		||||
@@ -552,8 +552,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
				/* Channel-User-Mode */
 | 
			
		||||
				if( Channel_UserModeDel( Channel, client, x[0] ))
 | 
			
		||||
				{
 | 
			
		||||
					strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
			
		||||
					strlcat( the_args, " ", sizeof( the_args ));
 | 
			
		||||
					strlcat( the_args, Client_ID( client ), sizeof( the_args ));
 | 
			
		||||
					strlcat( the_modes, x, sizeof( the_modes ));
 | 
			
		||||
					Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
 | 
			
		||||
				}
 | 
			
		||||
@@ -572,8 +572,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
 | 
			
		||||
		/* Are there additional arguments to add? */
 | 
			
		||||
		if( argadd[0] )
 | 
			
		||||
		{
 | 
			
		||||
			len = strlen( the_args ) - 1;
 | 
			
		||||
			if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
 | 
			
		||||
			strlcat( the_args, " ", sizeof( the_args ));
 | 
			
		||||
			strlcat( the_args, argadd, sizeof( the_args ));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -586,9 +585,6 @@ chan_exit:
 | 
			
		||||
		len = strlen( the_modes ) - 1;
 | 
			
		||||
		if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
 | 
			
		||||
 | 
			
		||||
		/* Clean up argument string if there are none */
 | 
			
		||||
		if( ! the_args[1] ) the_args[0] = '\0';
 | 
			
		||||
 | 
			
		||||
		if( Client_Type( Client ) == CLIENT_SERVER )
 | 
			
		||||
		{
 | 
			
		||||
			/* Forward mode changes to channel users and other servers */
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
#include "portab.h"
 | 
			
		||||
 | 
			
		||||
static char UNUSED id[] = "$Id: parse.c,v 1.69 2007/11/21 12:16:36 alex Exp $";
 | 
			
		||||
static char UNUSED id[] = "$Id: parse.c,v 1.69.2.1 2008/02/05 13:11:20 fw Exp $";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
@@ -358,7 +358,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
	bool result;
 | 
			
		||||
	COMMAND *cmd;
 | 
			
		||||
	NUMERIC *num;
 | 
			
		||||
	int i;
 | 
			
		||||
	int i, client_type;
 | 
			
		||||
 | 
			
		||||
	assert( Idx >= 0 );
 | 
			
		||||
	assert( Req != NULL );
 | 
			
		||||
@@ -436,6 +436,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cmd = My_Commands;
 | 
			
		||||
	client_type = Client_Type(client);
 | 
			
		||||
	while( cmd->name )
 | 
			
		||||
	{
 | 
			
		||||
		/* Befehl suchen */
 | 
			
		||||
@@ -444,7 +445,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
			cmd++; continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( Client_Type( client ) & cmd->type )
 | 
			
		||||
		if( client_type & cmd->type )
 | 
			
		||||
		{
 | 
			
		||||
			/* Command is allowed for this client: call it and count produced bytes */
 | 
			
		||||
			Conn_ResetWCounter( );
 | 
			
		||||
@@ -452,7 +453,7 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
 | 
			
		||||
			cmd->bytes += Conn_WCounter( );
 | 
			
		||||
 | 
			
		||||
			/* Adjust counters */
 | 
			
		||||
			if( Client_Type( client ) != CLIENT_SERVER ) cmd->lcount++;
 | 
			
		||||
			if( client_type != CLIENT_SERVER ) cmd->lcount++;
 | 
			
		||||
			else cmd->rcount++;
 | 
			
		||||
 | 
			
		||||
			return result;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
# $Id: mode-test.e,v 1.6 2004/03/10 20:40:06 alex Exp $
 | 
			
		||||
# $Id: mode-test.e,v 1.6.8.1 2008/02/16 11:26:13 fw Exp $
 | 
			
		||||
 | 
			
		||||
spawn telnet localhost 6789
 | 
			
		||||
expect {
 | 
			
		||||
@@ -72,7 +72,7 @@ expect {
 | 
			
		||||
send "mode #channel +v nick\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* MODE #channel +v nick"
 | 
			
		||||
	"@* MODE #channel +v nick\r"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "mode #channel +I nick1\r"
 | 
			
		||||
@@ -96,7 +96,7 @@ expect {
 | 
			
		||||
send "mode #channel -vo nick nick\r"
 | 
			
		||||
expect {
 | 
			
		||||
	timeout { exit 1 }
 | 
			
		||||
	"@* MODE #channel -vo nick nick"
 | 
			
		||||
	"@* MODE #channel -vo nick nick\r"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
send "quit\r"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user