Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3019bba627 |
BIN
.downloads/ncpfs-2.0.4.tgz
Normal file
BIN
.downloads/ncpfs-2.0.4.tgz
Normal file
Binary file not shown.
12
Changes
12
Changes
@@ -1,6 +1,18 @@
|
|||||||
I only began this file with ncpfs-0.12. If you're interested in older
|
I only began this file with ncpfs-0.12. If you're interested in older
|
||||||
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
|
versions, you can find them on ftp.gwdg.de:/pub/linux/misc/ncpfs/old.
|
||||||
|
|
||||||
|
ncpfs-2.0.3 -> ncpfs-2.0.4
|
||||||
|
- Changed name of npasswd to nwpasswd, as npasswd collides with
|
||||||
|
RedHat. Thanks to Mike Slater <mslater@nfinity.com> for pointing me
|
||||||
|
at this one.
|
||||||
|
- Put '\r\n' into nwmsg, because sometimes it did not print
|
||||||
|
correctly. Thanks to Petr Vandrovec Ing. VTEI
|
||||||
|
<VANDROVE@vcnet.vc.cvut.cz> for this one.
|
||||||
|
- Improved the ELF Makefile for ELF support. Thanks to Uwe Bonnes
|
||||||
|
<bon@elektron.ikp.physik.th-darmstadt.de>.
|
||||||
|
- Removed a very embarassing bug in nwpvalues :-(.
|
||||||
|
- Added a some routines to nwbpvalues.
|
||||||
|
|
||||||
ncpfs-2.0.2 -> ncpfs-2.0.3
|
ncpfs-2.0.2 -> ncpfs-2.0.3
|
||||||
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
|
- Removed the kernel-2.0 directory. Linus took the patch into 2.0.8.
|
||||||
So, if you want to use long file name support, upgrade to Linux
|
So, if you want to use long file name support, upgrade to Linux
|
||||||
|
|||||||
20
Makefile
20
Makefile
@@ -2,14 +2,17 @@
|
|||||||
# Makefile for the linux ncp-filesystem routines.
|
# Makefile for the linux ncp-filesystem routines.
|
||||||
#
|
#
|
||||||
|
|
||||||
VERSION = 2.0.3
|
VERSION = 2.0.4
|
||||||
|
|
||||||
# If you are using kerneld to autoload ncp support,
|
# If you are using kerneld to autoload ncp support,
|
||||||
# uncomment this (kerneld is in linux since about 1.3.57):
|
# uncomment this (kerneld is in linux since about 1.3.57):
|
||||||
#KERNELD = -DHAVE_KERNELD
|
#KERNELD = -DHAVE_KERNELD
|
||||||
|
|
||||||
# If your system is ELF, please uncomment the following line:
|
# If your system is ELF, either also do a 'make install', or append the util/
|
||||||
#HAVE_ELF=yes
|
# directory where the dynamic library resides to the environment
|
||||||
|
# variable LD_LIBRARY_PATH
|
||||||
|
HAVE_ELF=$(shell file `which gcc`|grep ELF >/dev/null && echo -n yes )
|
||||||
|
|
||||||
|
|
||||||
TOPDIR = $(shell pwd)
|
TOPDIR = $(shell pwd)
|
||||||
BINDIR = /usr/local/bin
|
BINDIR = /usr/local/bin
|
||||||
@@ -28,6 +31,17 @@ export INCLUDES BINDIR INTERM_BINDIR SBINDIR KERNELD VERSION HAVE_ELF
|
|||||||
|
|
||||||
all:
|
all:
|
||||||
for i in $(SUBDIRS); do make -C $$i all; done
|
for i in $(SUBDIRS); do make -C $$i all; done
|
||||||
|
@if [ "$(HAVE_ELF)" = yes ] ;\
|
||||||
|
then \
|
||||||
|
echo ; echo ; echo ;\
|
||||||
|
echo Please add \'`pwd`/util\' to the environment ; \
|
||||||
|
echo variable LD_LIBRARY_PATH by executing ; \
|
||||||
|
echo ;\
|
||||||
|
echo export LD_LIBRARY_PATH=\"\$$LD_LIBRARY_PATH:`pwd`/util\" ; \
|
||||||
|
echo ;\
|
||||||
|
echo or do a \'make install\'. ;\
|
||||||
|
echo ;\
|
||||||
|
fi
|
||||||
|
|
||||||
dep:
|
dep:
|
||||||
for i in $(SUBDIRS); do make -C $$i dep; done
|
for i in $(SUBDIRS); do make -C $$i dep; done
|
||||||
|
|||||||
23
README
23
README
@@ -3,11 +3,24 @@ some little utilities it also contains nprint, which enables you to
|
|||||||
print on NetWare print queues. The opposite side, pserver, is also
|
print on NetWare print queues. The opposite side, pserver, is also
|
||||||
provided.
|
provided.
|
||||||
|
|
||||||
I'm planning major changes in the structure of ncpfs for Linux 2.1.x
|
ncpfs works with NetWare versions 3.x and following. It does NOT work
|
||||||
which will break the binary compatibility. So I changed the numbering
|
with NetWare version 2.x. Some of the NetWare look-alikes, such as
|
||||||
scheme for ncpfs. ncpfs-2.0.x will be the version to be used with
|
CD-ROM servers WinNT 3.51 Server are also NOT supported. This
|
||||||
Linux 2.0.0 and older kernels, and ncpfs-2.1.x will be the version for
|
restriction comes from the fact that ncpfs relies heavily on the name
|
||||||
the development kernels.
|
space facilities NetWare supports since version 3. When you want to
|
||||||
|
mount volumes that have been exported by mars_nwe, you have to
|
||||||
|
activate the name space calls in mars_nwe's config.h file, although
|
||||||
|
probably it's more clever to use nfs between two Linux machines.
|
||||||
|
|
||||||
|
The user-space utilities such as nprint and the bindery utils should
|
||||||
|
work with all versions of NetWare.
|
||||||
|
|
||||||
|
ncpfs does NOT support access to the NDS, so if you want to mount
|
||||||
|
volumes exported by a NetWare 4.x server, you will have to install the
|
||||||
|
bindery emulation on that server. If you need access to the NDS, ask
|
||||||
|
Caldera for their CND. See http://www.caldera.com for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
|
||||||
INSTALLATION
|
INSTALLATION
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
.TH NPASSWD 1 06/22/1996 npasswd npasswd
|
.TH NWPASSWD 1 06/22/1996 nwpasswd nwpasswd
|
||||||
.SH NAME
|
.SH NAME
|
||||||
npasswd \- Change a user's password
|
nwpasswd \- Change a user's password
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B npasswd
|
.B nwpasswd
|
||||||
[
|
[
|
||||||
.B -h
|
.B -h
|
||||||
] [
|
] [
|
||||||
@@ -18,9 +18,9 @@ npasswd \- Change a user's password
|
|||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
With
|
With
|
||||||
.B npasswd,
|
.B nwpasswd,
|
||||||
you can change your password on a NetWare server.
|
you can change your password on a NetWare server.
|
||||||
.B npasswd
|
.B nwpasswd
|
||||||
asks for the old password and twice for the new password. Then it
|
asks for the old password and twice for the new password. Then it
|
||||||
changes the password on the server.
|
changes the password on the server.
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ changes the password on the server.
|
|||||||
|
|
||||||
.B -h
|
.B -h
|
||||||
.RS 3
|
.RS 3
|
||||||
With -h npasswd prints a little help text.
|
With -h nwpasswd prints a little help text.
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
.B -S
|
.B -S
|
||||||
@@ -51,5 +51,5 @@ changed.
|
|||||||
.RE
|
.RE
|
||||||
|
|
||||||
.SH CREDITS
|
.SH CREDITS
|
||||||
npasswd would not have been possible without the work of Guntram
|
nwpasswd would not have been possible without the work of Guntram
|
||||||
Blom. Look at nwcrypt.c for his work.
|
Blom. Look at nwcrypt.c for his work.
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
Begin3
|
Begin3
|
||||||
Title: ncpfs
|
Title: ncpfs
|
||||||
Version: 2.0.3
|
Version: 2.0.4
|
||||||
Entered-date: 22. July 1996
|
Entered-date: 25. July 1996
|
||||||
Description: With ncpfs you can mount volumes of your netware
|
Description: With ncpfs you can mount volumes of your netware
|
||||||
server under Linux. You can also print to netware
|
server under Linux. You can also print to netware
|
||||||
print queues and spool netware print queues to the
|
print queues and spool netware print queues to the
|
||||||
@@ -13,7 +13,7 @@ Author: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
|
|||||||
Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
|
Maintained-by: lendecke@namu01.Num.Math.Uni-Goettingen.de (Volker Lendecke)
|
||||||
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
||||||
Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs
|
Alternate-site: sunsite.unc.edu:/pub/Linux/system/Filesystems/ncpfs
|
||||||
~128k ncpfs-2.0.3.tgz
|
~130k ncpfs-2.0.4.tgz
|
||||||
~ 1k ncpfs-2.0.3.lsm
|
~ 1k ncpfs-2.0.4.lsm
|
||||||
Copying-policy: GPL
|
Copying-policy: GPL
|
||||||
End
|
End
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# Makefile for the linux ncp-filesystem routines.
|
# Makefile for the linux ncp-filesystem routines.
|
||||||
#
|
#
|
||||||
|
|
||||||
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy npasswd
|
USERUTILS = slist pqlist nwfsinfo pserver nprint nsend ncopy nwpasswd
|
||||||
USERUTILS += nwbols nwbocreate nwborm nwboprops
|
USERUTILS += nwbols nwbocreate nwborm nwboprops
|
||||||
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd
|
USERUTILS += nwbpcreate nwbprm nwbpvalues nwbpadd
|
||||||
USERUTILS += nwgrant nwrevoke nwuserlist
|
USERUTILS += nwgrant nwrevoke nwuserlist
|
||||||
@@ -60,6 +60,8 @@ $(NCP_LIB): ncplib.o ncplib_err.o $(COM_ERR_CFILES)
|
|||||||
com_err/com_err.o com_err/error_message.o com_err/et_name.o \
|
com_err/com_err.o com_err/error_message.o com_err/et_name.o \
|
||||||
com_err/init_et.o
|
com_err/init_et.o
|
||||||
ln -sf libncp.so.1.0 libncp.so.1
|
ln -sf libncp.so.1.0 libncp.so.1
|
||||||
|
ln -sf libncp.so.1 libncp.so
|
||||||
|
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
|
||||||
|
|
||||||
ncplib_err.o: ncplib_err.h ncplib_err.c
|
ncplib_err.o: ncplib_err.h ncplib_err.c
|
||||||
$(CC) $(CFLAGS) $(PIC_FLAG) -c ncplib_err.c
|
$(CC) $(CFLAGS) $(PIC_FLAG) -c ncplib_err.c
|
||||||
@@ -82,8 +84,8 @@ dep: ncplib_err.h
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
make -C com_err clean
|
make -C com_err clean
|
||||||
rm -f *.o *~ slist test ncptest ncplib_err.[ch] libncp.a
|
rm -f *.o *~ slist test ncptest ncplib_err.[ch]
|
||||||
rm -f libncp.so.*
|
rm -f libncp.*
|
||||||
|
|
||||||
mrproper: clean
|
mrproper: clean
|
||||||
make -C com_err mrproper
|
make -C com_err mrproper
|
||||||
|
|||||||
@@ -235,6 +235,12 @@ ncp_change_object_security(struct ncp_conn *conn,
|
|||||||
const char *object_name,
|
const char *object_name,
|
||||||
__u8 security);
|
__u8 security);
|
||||||
|
|
||||||
|
struct ncp_station_addr {
|
||||||
|
__u32 NetWork __attribute__ ((packed));
|
||||||
|
__u8 Node[6] __attribute__ ((packed));
|
||||||
|
__u16 Socket __attribute__ ((packed));
|
||||||
|
};
|
||||||
|
|
||||||
struct ncp_prop_login_control {
|
struct ncp_prop_login_control {
|
||||||
__u8 AccountExpireDate[3] __attribute__ ((packed));
|
__u8 AccountExpireDate[3] __attribute__ ((packed));
|
||||||
__u8 Disabled __attribute__ ((packed));
|
__u8 Disabled __attribute__ ((packed));
|
||||||
@@ -251,7 +257,7 @@ struct ncp_prop_login_control {
|
|||||||
__u32 MaxDiskUsage __attribute__ ((packed));
|
__u32 MaxDiskUsage __attribute__ ((packed));
|
||||||
__u16 BadLoginCount __attribute__ ((packed));
|
__u16 BadLoginCount __attribute__ ((packed));
|
||||||
__u32 BadLoginCountDown __attribute__ ((packed));
|
__u32 BadLoginCountDown __attribute__ ((packed));
|
||||||
__u8 LastIntruder[8] __attribute__ ((packed));
|
struct ncp_station_addr LastIntruder __attribute__ ((packed));
|
||||||
};
|
};
|
||||||
|
|
||||||
long
|
long
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
segno += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -218,6 +219,174 @@ print_string(__u8 *val)
|
|||||||
puts(val);
|
puts(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
print_station_addr(char *fmt, struct ncp_station_addr *addr, char *buff)
|
||||||
|
{
|
||||||
|
char *ret = buff;
|
||||||
|
|
||||||
|
while ( *fmt != 0 )
|
||||||
|
{
|
||||||
|
switch ( *fmt )
|
||||||
|
{
|
||||||
|
case '%':
|
||||||
|
switch ( *(++fmt) )
|
||||||
|
{
|
||||||
|
case 'N': /* node */
|
||||||
|
{
|
||||||
|
int i ;
|
||||||
|
for ( i = 0 ; i < 6 ; buff += 2 , i++ )
|
||||||
|
{
|
||||||
|
sprintf(buff, "%02X",addr->Node[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'S': /* Socket */
|
||||||
|
sprintf(buff, "%04X", htons(addr->Socket));
|
||||||
|
buff += 4 ;
|
||||||
|
break ;
|
||||||
|
case 'L': /* Lan */
|
||||||
|
sprintf(buff, "%08lX", htonl(addr->NetWork));
|
||||||
|
buff += 8 ;
|
||||||
|
break ;
|
||||||
|
case '%':
|
||||||
|
*buff++ = '%';
|
||||||
|
default:
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
if (*fmt)
|
||||||
|
{
|
||||||
|
fmt++ ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
default:
|
||||||
|
*buff++ = *fmt++ ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*buff = 0 ;
|
||||||
|
return ret ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_login_control ( __u8 *val )
|
||||||
|
{
|
||||||
|
int i , j , mask;
|
||||||
|
char buff[32];
|
||||||
|
struct ncp_prop_login_control *a =(struct ncp_prop_login_control *)val;
|
||||||
|
static char *days[]
|
||||||
|
= { "Sun" , "Mon" , "Tue" , "Wen" , "Thu" , "Fri" , "Sat" } ;
|
||||||
|
|
||||||
|
if (a->LastLogin[2] || a->LastLogin[1] || a->LastLogin[0] ||
|
||||||
|
a->LastLogin[3] || a->LastLogin[4] || a->LastLogin[5])
|
||||||
|
{
|
||||||
|
printf("Last Login: %d.%d.%02d at %2d:%02d:%02d\n",
|
||||||
|
a->LastLogin[2] , a->LastLogin[1] , a->LastLogin[0] ,
|
||||||
|
a->LastLogin[3] , a->LastLogin[4] , a->LastLogin[5]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Never logged in\n");
|
||||||
|
}
|
||||||
|
if (a->Disabled != 0)
|
||||||
|
{
|
||||||
|
printf(" --- Account disabled ---\n");
|
||||||
|
}
|
||||||
|
if (a->AccountExpireDate[2] || a->AccountExpireDate[1] ||
|
||||||
|
a->AccountExpireDate[0])
|
||||||
|
{
|
||||||
|
printf("Account expires on: %d.%d.%d\n",
|
||||||
|
a->AccountExpireDate[2],
|
||||||
|
a->AccountExpireDate[1],
|
||||||
|
a->AccountExpireDate[0]);
|
||||||
|
}
|
||||||
|
if (a->PasswordExpireDate[2] || a->PasswordExpireDate[1] ||
|
||||||
|
a->PasswordExpireDate[0])
|
||||||
|
{
|
||||||
|
printf("Password expires on: %d.%d.%d\n" ,
|
||||||
|
a->PasswordExpireDate[2],
|
||||||
|
a->PasswordExpireDate[1],
|
||||||
|
a->PasswordExpireDate[0]);
|
||||||
|
printf("GraceLogins left: %d\nof max. : %d\n",
|
||||||
|
a->GraceLogins, a->MaxGraceLogins);
|
||||||
|
printf("PasswortChangeInterval : %d days\n",
|
||||||
|
ntohs(a->PasswordExpireInterval));
|
||||||
|
}
|
||||||
|
if ((a->RestrictionMask & 2) != 0)
|
||||||
|
{
|
||||||
|
printf("New password must be different when changing\n");
|
||||||
|
}
|
||||||
|
if ((a->RestrictionMask & 1) != 0)
|
||||||
|
{
|
||||||
|
printf("User ist not allowed to change password\n");
|
||||||
|
}
|
||||||
|
printf("Minimal password length : %d\n", a->MinPasswordLength);
|
||||||
|
if (ntohs(a->MaxConnections) != 0)
|
||||||
|
{
|
||||||
|
printf("Maximum no of connections: %d\n",
|
||||||
|
ntohs(a->MaxConnections));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( a->MaxDiskUsage != 0xFFFFFF7FL )
|
||||||
|
{
|
||||||
|
printf("Maximum DiskQuota : %8ld blocks\n",
|
||||||
|
ntohl(a->MaxDiskUsage));
|
||||||
|
}
|
||||||
|
printf("Failed Logins: %5d\n", ntohs(a->BadLoginCount));
|
||||||
|
|
||||||
|
if (a->BadLoginCountDown != 0L)
|
||||||
|
{
|
||||||
|
printf("Account disabled still %8ld seconds\n",
|
||||||
|
ntohl(a->BadLoginCountDown));
|
||||||
|
}
|
||||||
|
if (a->LastIntruder.NetWork != 0L)
|
||||||
|
{
|
||||||
|
printf("Last \'intruder\' address: %s\n" ,
|
||||||
|
print_station_addr("(%L): %N[%S]" ,
|
||||||
|
&(a->LastIntruder),buff));
|
||||||
|
}
|
||||||
|
if ( a->RestrictionMask & 0xFC )
|
||||||
|
{
|
||||||
|
printf("RestrictionMask : %02X\n", a->RestrictionMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0 ; i < 42 ; i++ )
|
||||||
|
{
|
||||||
|
if ( a->ConnectionTimeMask[i] != 0xFF )
|
||||||
|
{
|
||||||
|
i = 101;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( i < 100 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
val = a->ConnectionTimeMask;
|
||||||
|
printf("Time restrictions: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 ]\n");
|
||||||
|
printf(" Day [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ]\n");
|
||||||
|
|
||||||
|
for ( i = 0 ; i < 7 ; i++ )
|
||||||
|
{
|
||||||
|
printf (" %s [" , days[i]);
|
||||||
|
for ( j = 0 ; j < 6 ; j++ )
|
||||||
|
{
|
||||||
|
for ( mask = 1 ; mask < 0x100 ; mask <<= 1 )
|
||||||
|
{
|
||||||
|
putchar ( (*val & mask) ? '*' : ' ' ) ;
|
||||||
|
}
|
||||||
|
val++ ;
|
||||||
|
}
|
||||||
|
printf ( "]\n" ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_addr( __u8 *val)
|
||||||
|
{
|
||||||
|
char buff[50];
|
||||||
|
print_station_addr("(%L): %N[%S]",
|
||||||
|
(struct ncp_station_addr *)val, buff);
|
||||||
|
printf("%s\n", buff);
|
||||||
|
}
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
char *pname ;
|
char *pname ;
|
||||||
void (*func)(__u8 *) ;
|
void (*func)(__u8 *) ;
|
||||||
@@ -228,6 +397,8 @@ static struct {
|
|||||||
{ "DESCRIPTION" , print_string } ,
|
{ "DESCRIPTION" , print_string } ,
|
||||||
{ "IDENTIFICATION" , print_string } ,
|
{ "IDENTIFICATION" , print_string } ,
|
||||||
{ "Q_DIRECTORY" , print_string } ,
|
{ "Q_DIRECTORY" , print_string } ,
|
||||||
|
{ "LOGIN_CONTROL" , print_login_control } ,
|
||||||
|
{ "NET_ADDRESS" , print_addr } ,
|
||||||
{ NULL , NULL }
|
{ NULL , NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -130,9 +130,9 @@ main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(tty_file, "\r\n\007\007\007Message from NetWare Server: %s\n",
|
fprintf(tty_file,"\r\n\007\007\007Message from NetWare Server: %s\r\n",
|
||||||
mnt->mnt_fsname);
|
mnt->mnt_fsname);
|
||||||
fprintf(tty_file, "%s\n", message);
|
fprintf(tty_file, "%s\r\n", message);
|
||||||
fclose(tty_file);
|
fclose(tty_file);
|
||||||
fclose(mtab);
|
fclose(mtab);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* npasswd.c
|
* nwpasswd.c
|
||||||
*
|
*
|
||||||
* Change a bindery object's password
|
* Change a bindery object's password
|
||||||
*
|
*
|
||||||
Reference in New Issue
Block a user