mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
support numeric debug levels.
This commit is contained in:
parent
edd95da365
commit
cb5491bfaf
6
NEWS
6
NEWS
@ -1,5 +1,5 @@
|
||||
Noteworthy changes in version 2.1 (under development)
|
||||
-------------------------------------------------
|
||||
Noteworthy changes in version 2.1.x (under development)
|
||||
-------------------------------------------------------
|
||||
|
||||
* Encrypted OpenPGP messages with trailing data (e.g. other OpenPGP
|
||||
packets) are now correctly parsed.
|
||||
@ -8,6 +8,8 @@ Noteworthy changes in version 2.1 (under development)
|
||||
|
||||
* The G13 tool for disk encryption key management has been added.
|
||||
|
||||
* Numerical values may now be used as an alternative to the
|
||||
debug-level keywords.
|
||||
|
||||
|
||||
Noteworthy changes in version 2.0.13 (2009-09-04)
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-12-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* gpg-agent.c (set_debug): Allow for numerical debug leveles. Print
|
||||
active debug flags.
|
||||
|
||||
2009-12-02 Werner Koch <wk@g10code.com>
|
||||
|
||||
* trustlist.c (read_trustfiles): Store the pointer returned from
|
||||
|
@ -361,19 +361,30 @@ my_strusage (int level)
|
||||
static void
|
||||
set_debug (void)
|
||||
{
|
||||
int numok = (debug_level && digitp (debug_level));
|
||||
int numlvl = numok? atoi (debug_level) : 0;
|
||||
|
||||
if (!debug_level)
|
||||
;
|
||||
else if (!strcmp (debug_level, "none"))
|
||||
else if (!strcmp (debug_level, "none") || (numok && numlvl < 1))
|
||||
opt.debug = 0;
|
||||
else if (!strcmp (debug_level, "basic"))
|
||||
else if (!strcmp (debug_level, "basic") || (numok && numlvl <= 2))
|
||||
opt.debug = DBG_ASSUAN_VALUE;
|
||||
else if (!strcmp (debug_level, "advanced"))
|
||||
else if (!strcmp (debug_level, "advanced") || (numok && numlvl <= 5))
|
||||
opt.debug = DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE;
|
||||
else if (!strcmp (debug_level, "expert"))
|
||||
else if (!strcmp (debug_level, "expert") || (numok && numlvl <= 8))
|
||||
opt.debug = (DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE
|
||||
|DBG_CACHE_VALUE);
|
||||
else if (!strcmp (debug_level, "guru"))
|
||||
opt.debug = ~0;
|
||||
else if (!strcmp (debug_level, "guru") || numok)
|
||||
{
|
||||
opt.debug = ~0;
|
||||
/* Unless the "guru" string has been used we don't want to allow
|
||||
hashing debugging. The rationale is that people tend to
|
||||
select the highest debug value and would then clutter their
|
||||
disk with debug files which may reveal confidential data. */
|
||||
if (numok)
|
||||
opt.debug &= ~(DBG_HASHING_VALUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_error (_("invalid debug-level `%s' given\n"), debug_level);
|
||||
@ -391,6 +402,17 @@ set_debug (void)
|
||||
if (opt.debug & DBG_CRYPTO_VALUE )
|
||||
gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
|
||||
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
||||
|
||||
if (opt.debug)
|
||||
log_info ("enabled debug flags:%s%s%s%s%s%s%s%s\n",
|
||||
(opt.debug & DBG_COMMAND_VALUE)? " command":"",
|
||||
(opt.debug & DBG_MPI_VALUE )? " mpi":"",
|
||||
(opt.debug & DBG_CRYPTO_VALUE )? " crypto":"",
|
||||
(opt.debug & DBG_MEMORY_VALUE )? " memory":"",
|
||||
(opt.debug & DBG_CACHE_VALUE )? " cache":"",
|
||||
(opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
|
||||
(opt.debug & DBG_HASHING_VALUE)? " hashing":"",
|
||||
(opt.debug & DBG_ASSUAN_VALUE )? " assuan":"");
|
||||
}
|
||||
|
||||
|
||||
|
@ -213,20 +213,26 @@ forth to @var{epoch} which is the number of seconds elapsed since the year
|
||||
@item --debug-level @var{level}
|
||||
@opindex debug-level
|
||||
Select the debug level for investigating problems. @var{level} may be
|
||||
one of:
|
||||
a numeric value or a keyword:
|
||||
|
||||
@table @code
|
||||
@item none
|
||||
no debugging at all.
|
||||
@item basic
|
||||
some basic debug messages
|
||||
@item advanced
|
||||
more verbose debug messages
|
||||
@item expert
|
||||
even more detailed messages
|
||||
@item guru
|
||||
all of the debug messages you can get
|
||||
@end table
|
||||
@table @code
|
||||
@item none
|
||||
No debugging at all. A value of less than 1 may be used instead of
|
||||
the keyword.
|
||||
@item basic
|
||||
Some basic debug messages. A value between 1 and 2 may be used
|
||||
instead of the keyword.
|
||||
@item advanced
|
||||
More verbose debug messages. A value between 3 and 5 may be used
|
||||
instead of the keyword.
|
||||
@item expert
|
||||
Even more detailed messages. A value between 6 and 8 may be used
|
||||
instead of the keyword.
|
||||
@item guru
|
||||
All of the debug messages you can get. A value greater than 8 may be
|
||||
used instead of the keyword. The creation of hash tracing files is
|
||||
only enabled if the keyword is used.
|
||||
@end table
|
||||
|
||||
How these messages are mapped to the actual debugging flags is not
|
||||
specified and may change with newer releases of this program. They are
|
||||
|
28
doc/gpg.texi
28
doc/gpg.texi
@ -2146,6 +2146,34 @@ therefore enables a fast listing of the encryption keys.
|
||||
@opindex interactive
|
||||
Prompt before overwriting any files.
|
||||
|
||||
@item --debug-level @var{level}
|
||||
@opindex debug-level
|
||||
Select the debug level for investigating problems. @var{level} may be
|
||||
a numeric value or by a keyword:
|
||||
|
||||
@table @code
|
||||
@item none
|
||||
No debugging at all. A value of less than 1 may be used instead of
|
||||
the keyword.
|
||||
@item basic
|
||||
Some basic debug messages. A value between 1 and 2 may be used
|
||||
instead of the keyword.
|
||||
@item advanced
|
||||
More verbose debug messages. A value between 3 and 5 may be used
|
||||
instead of the keyword.
|
||||
@item expert
|
||||
Even more detailed messages. A value between 6 and 8 may be used
|
||||
instead of the keyword.
|
||||
@item guru
|
||||
All of the debug messages you can get. A value greater than 8 may be
|
||||
used instead of the keyword. The creation of hash tracing files is
|
||||
only enabled if the keyword is used.
|
||||
@end table
|
||||
|
||||
How these messages are mapped to the actual debugging flags is not
|
||||
specified and may change with newer releases of this program. They are
|
||||
however carefully selected to best aid in debugging.
|
||||
|
||||
@item --debug @var{flags}
|
||||
@opindex debug
|
||||
Set debugging flags. All flags are or-ed and @var{flags} may
|
||||
|
@ -617,19 +617,25 @@ is given as fingerprint or keygrip.
|
||||
@item --debug-level @var{level}
|
||||
@opindex debug-level
|
||||
Select the debug level for investigating problems. @var{level} may be
|
||||
one of:
|
||||
a numeric value or by a keyword:
|
||||
|
||||
@table @code
|
||||
@item none
|
||||
no debugging at all.
|
||||
No debugging at all. A value of less than 1 may be used instead of
|
||||
the keyword.
|
||||
@item basic
|
||||
some basic debug messages
|
||||
Some basic debug messages. A value between 1 and 2 may be used
|
||||
instead of the keyword.
|
||||
@item advanced
|
||||
more verbose debug messages
|
||||
More verbose debug messages. A value between 3 and 5 may be used
|
||||
instead of the keyword.
|
||||
@item expert
|
||||
even more detailed messages
|
||||
Even more detailed messages. A value between 6 and 8 may be used
|
||||
instead of the keyword.
|
||||
@item guru
|
||||
all of the debug messages you can get
|
||||
All of the debug messages you can get. A value greater than 8 may be
|
||||
used instead of the keyword. The creation of hash tracing files is
|
||||
only enabled if the keyword is used.
|
||||
@end table
|
||||
|
||||
How these messages are mapped to the actual debugging flags is not
|
||||
|
@ -123,20 +123,26 @@ verbose commands to @command{gpgsm}, such as @samp{-vv}.
|
||||
|
||||
@item --debug-level @var{level}
|
||||
@opindex debug-level
|
||||
Select the debug level for investigating problems. @var{level} may be
|
||||
one of:
|
||||
Select the debug level for investigating problems. @var{level} may be
|
||||
a numeric value or a keyword:
|
||||
|
||||
@table @code
|
||||
@item none
|
||||
no debugging at all.
|
||||
No debugging at all. A value of less than 1 may be used instead of
|
||||
the keyword.
|
||||
@item basic
|
||||
some basic debug messages
|
||||
Some basic debug messages. A value between 1 and 2 may be used
|
||||
instead of the keyword.
|
||||
@item advanced
|
||||
more verbose debug messages
|
||||
More verbose debug messages. A value between 3 and 5 may be used
|
||||
instead of the keyword.
|
||||
@item expert
|
||||
even more detailed messages
|
||||
Even more detailed messages. A value between 6 and 8 may be used
|
||||
instead of the keyword.
|
||||
@item guru
|
||||
all of the debug messages you can get
|
||||
All of the debug messages you can get. A value greater than 8 may be
|
||||
used instead of the keyword. The creation of hash tracing files is
|
||||
only enabled if the keyword is used.
|
||||
@end table
|
||||
|
||||
How these messages are mapped to the actual debugging flags is not
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-12-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* gpg.c (set_debug): Allow for numerical debug leveles. Print
|
||||
active debug flags.
|
||||
|
||||
2009-11-27 Werner Koch <wk@g10code.com>
|
||||
|
||||
* keyedit.c (cmds, keyedit_menu): New command "checkbkupkey".
|
||||
|
39
g10/gpg.c
39
g10/gpg.c
@ -976,19 +976,30 @@ set_opt_session_env (const char *name, const char *value)
|
||||
static void
|
||||
set_debug (const char *level)
|
||||
{
|
||||
int numok = (level && digitp (level));
|
||||
int numlvl = numok? atoi (level) : 0;
|
||||
|
||||
if (!level)
|
||||
;
|
||||
else if (!strcmp (level, "none"))
|
||||
else if (!strcmp (level, "none") || (numok && numlvl < 1))
|
||||
opt.debug = 0;
|
||||
else if (!strcmp (level, "basic"))
|
||||
else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
|
||||
opt.debug = DBG_MEMSTAT_VALUE;
|
||||
else if (!strcmp (level, "advanced"))
|
||||
else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
|
||||
opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
|
||||
else if (!strcmp (level, "expert"))
|
||||
else if (!strcmp (level, "expert") || (numok && numlvl <= 8))
|
||||
opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
|
||||
|DBG_CACHE_VALUE|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
|
||||
else if (!strcmp (level, "guru"))
|
||||
opt.debug = ~0;
|
||||
else if (!strcmp (level, "guru") || numok)
|
||||
{
|
||||
opt.debug = ~0;
|
||||
/* Unless the "guru" string has been used we don't want to allow
|
||||
hashing debugging. The rationale is that people tend to
|
||||
select the highest debug value and would then clutter their
|
||||
disk with debug files which may reveal confidential data. */
|
||||
if (numok)
|
||||
opt.debug &= ~(DBG_HASHING_VALUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_error (_("invalid debug-level `%s' given\n"), level);
|
||||
@ -1006,6 +1017,22 @@ set_debug (const char *level)
|
||||
if (opt.debug & DBG_IOBUF_VALUE )
|
||||
iobuf_debug_mode = 1;
|
||||
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
||||
|
||||
if (opt.debug)
|
||||
log_info ("enabled debug flags:%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
||||
(opt.debug & DBG_PACKET_VALUE )? " packet":"",
|
||||
(opt.debug & DBG_MPI_VALUE )? " mpi":"",
|
||||
(opt.debug & DBG_CIPHER_VALUE )? " cipher":"",
|
||||
(opt.debug & DBG_FILTER_VALUE )? " filter":"",
|
||||
(opt.debug & DBG_IOBUF_VALUE )? " iobuf":"",
|
||||
(opt.debug & DBG_MEMORY_VALUE )? " memory":"",
|
||||
(opt.debug & DBG_CACHE_VALUE )? " cache":"",
|
||||
(opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
|
||||
(opt.debug & DBG_TRUST_VALUE )? " trust":"",
|
||||
(opt.debug & DBG_HASHING_VALUE)? " hashing":"",
|
||||
(opt.debug & DBG_EXTPROG_VALUE)? " extprog":"",
|
||||
(opt.debug & DBG_CARD_IO_VALUE)? " cardio":"",
|
||||
(opt.debug & DBG_ASSUAN_VALUE )? " assuan":"");
|
||||
}
|
||||
|
||||
|
||||
|
27
g13/g13.c
27
g13/g13.c
@ -258,18 +258,25 @@ wrong_args (const char *text)
|
||||
static void
|
||||
set_debug (void)
|
||||
{
|
||||
int numok = (debug_level && digitp (debug_level));
|
||||
int numlvl = numok? atoi (debug_level) : 0;
|
||||
|
||||
if (!debug_level)
|
||||
;
|
||||
else if (!strcmp (debug_level, "none"))
|
||||
else if (!strcmp (debug_level, "none") || (numok && numlvl < 1))
|
||||
opt.debug = 0;
|
||||
else if (!strcmp (debug_level, "basic"))
|
||||
else if (!strcmp (debug_level, "basic") || (numok && numlvl <= 2))
|
||||
opt.debug = DBG_ASSUAN_VALUE|DBG_MOUNT_VALUE;
|
||||
else if (!strcmp (debug_level, "advanced"))
|
||||
else if (!strcmp (debug_level, "advanced") || (numok && numlvl <= 5))
|
||||
opt.debug = DBG_ASSUAN_VALUE|DBG_MOUNT_VALUE;
|
||||
else if (!strcmp (debug_level, "expert"))
|
||||
else if (!strcmp (debug_level, "expert") || (numok && numlvl <= 8))
|
||||
opt.debug = (DBG_ASSUAN_VALUE|DBG_MOUNT_VALUE|DBG_CRYPTO_VALUE);
|
||||
else if (!strcmp (debug_level, "guru"))
|
||||
opt.debug = ~0;
|
||||
else if (!strcmp (debug_level, "guru") || numok)
|
||||
{
|
||||
opt.debug = ~0;
|
||||
/* if (numok) */
|
||||
/* opt.debug &= ~(DBG_HASHING_VALUE); */
|
||||
}
|
||||
else
|
||||
{
|
||||
log_error (_("invalid debug-level `%s' given\n"), debug_level);
|
||||
@ -286,6 +293,14 @@ set_debug (void)
|
||||
if (opt.debug & DBG_CRYPTO_VALUE )
|
||||
gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
|
||||
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
||||
|
||||
if (opt.debug)
|
||||
log_info ("enabled debug flags:%s%s%s%s%s\n",
|
||||
(opt.debug & DBG_MOUNT_VALUE )? " mount":"",
|
||||
(opt.debug & DBG_CRYPTO_VALUE )? " crypto":"",
|
||||
(opt.debug & DBG_MEMORY_VALUE )? " memory":"",
|
||||
(opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
|
||||
(opt.debug & DBG_ASSUAN_VALUE )? " assuan":"");
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-12-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* scdaemon.c (set_debug): Allow for numerical debug leveles. Print
|
||||
active debug flags.
|
||||
|
||||
2009-11-25 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* command.c (scd_command_handler): Use assuan_fd_t and
|
||||
|
@ -289,19 +289,30 @@ tid_log_callback (void)
|
||||
static void
|
||||
set_debug (const char *level)
|
||||
{
|
||||
int numok = (level && digitp (level));
|
||||
int numlvl = numok? atoi (level) : 0;
|
||||
|
||||
if (!level)
|
||||
;
|
||||
else if (!strcmp (level, "none"))
|
||||
else if (!strcmp (level, "none") || (numok && numlvl < 1))
|
||||
opt.debug = 0;
|
||||
else if (!strcmp (level, "basic"))
|
||||
else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
|
||||
opt.debug = DBG_ASSUAN_VALUE;
|
||||
else if (!strcmp (level, "advanced"))
|
||||
else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
|
||||
opt.debug = DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE;
|
||||
else if (!strcmp (level, "expert"))
|
||||
else if (!strcmp (level, "expert") || (numok && numlvl <= 8))
|
||||
opt.debug = (DBG_ASSUAN_VALUE|DBG_COMMAND_VALUE
|
||||
|DBG_CACHE_VALUE|DBG_CARD_IO_VALUE);
|
||||
else if (!strcmp (level, "guru"))
|
||||
opt.debug = ~0;
|
||||
else if (!strcmp (level, "guru") || numok)
|
||||
{
|
||||
opt.debug = ~0;
|
||||
/* Unless the "guru" string has been used we don't want to allow
|
||||
hashing debugging. The rationale is that people tend to
|
||||
select the highest debug value and would then clutter their
|
||||
disk with debug files which may reveal confidential data. */
|
||||
if (numok)
|
||||
opt.debug &= ~(DBG_HASHING_VALUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_error (_("invalid debug-level `%s' given\n"), level);
|
||||
@ -319,6 +330,18 @@ set_debug (const char *level)
|
||||
if (opt.debug & DBG_CRYPTO_VALUE )
|
||||
gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
|
||||
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
||||
|
||||
if (opt.debug)
|
||||
log_info ("enabled debug flags:%s%s%s%s%s%s%s%s%s\n",
|
||||
(opt.debug & DBG_COMMAND_VALUE)? " command":"",
|
||||
(opt.debug & DBG_MPI_VALUE )? " mpi":"",
|
||||
(opt.debug & DBG_CRYPTO_VALUE )? " crypto":"",
|
||||
(opt.debug & DBG_MEMORY_VALUE )? " memory":"",
|
||||
(opt.debug & DBG_CACHE_VALUE )? " cache":"",
|
||||
(opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
|
||||
(opt.debug & DBG_HASHING_VALUE)? " hashing":"",
|
||||
(opt.debug & DBG_ASSUAN_VALUE )? " assuan":"",
|
||||
(opt.debug & DBG_CARD_IO_VALUE)? " cardio":"");
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-12-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* gpgsm.c (set_debug): Allow for numerical debug leveles. Print
|
||||
active debug flags.
|
||||
|
||||
2009-12-02 Werner Koch <wk@g10code.com>
|
||||
|
||||
* verify.c (gpgsm_verify): Add audit info on hash algorithms.
|
||||
|
36
sm/gpgsm.c
36
sm/gpgsm.c
@ -648,23 +648,34 @@ set_opt_session_env (const char *name, const char *value)
|
||||
static void
|
||||
set_debug (void)
|
||||
{
|
||||
int numok = (debug_level && digitp (debug_level));
|
||||
int numlvl = numok? atoi (debug_level) : 0;
|
||||
|
||||
if (!debug_level)
|
||||
;
|
||||
else if (!strcmp (debug_level, "none"))
|
||||
else if (!strcmp (debug_level, "none") || (numok && numlvl < 1))
|
||||
opt.debug = 0;
|
||||
else if (!strcmp (debug_level, "basic"))
|
||||
else if (!strcmp (debug_level, "basic") || (numok && numlvl <= 2))
|
||||
opt.debug = DBG_ASSUAN_VALUE;
|
||||
else if (!strcmp (debug_level, "advanced"))
|
||||
else if (!strcmp (debug_level, "advanced") || (numok && numlvl <= 5))
|
||||
opt.debug = DBG_ASSUAN_VALUE|DBG_X509_VALUE;
|
||||
else if (!strcmp (debug_level, "expert"))
|
||||
else if (!strcmp (debug_level, "expert") || (numok && numlvl <= 8))
|
||||
opt.debug = (DBG_ASSUAN_VALUE|DBG_X509_VALUE
|
||||
|DBG_CACHE_VALUE|DBG_CRYPTO_VALUE);
|
||||
else if (!strcmp (debug_level, "guru"))
|
||||
opt.debug = ~0;
|
||||
else if (!strcmp (debug_level, "guru") || numok)
|
||||
{
|
||||
opt.debug = ~0;
|
||||
/* Unless the "guru" string has been used we don't want to allow
|
||||
hashing debugging. The rationale is that people tend to
|
||||
select the highest debug value and would then clutter their
|
||||
disk with debug files which may reveal confidential data. */
|
||||
if (numok)
|
||||
opt.debug &= ~(DBG_HASHING_VALUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_error (_("invalid debug-level `%s' given\n"), debug_level);
|
||||
gpgsm_exit(2);
|
||||
gpgsm_exit (2);
|
||||
}
|
||||
|
||||
opt.debug |= debug_value;
|
||||
@ -679,6 +690,17 @@ set_debug (void)
|
||||
if (opt.debug & DBG_CRYPTO_VALUE )
|
||||
gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
|
||||
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
||||
|
||||
if (opt.debug)
|
||||
log_info ("enabled debug flags:%s%s%s%s%s%s%s%s\n",
|
||||
(opt.debug & DBG_X509_VALUE )? " x509":"",
|
||||
(opt.debug & DBG_MPI_VALUE )? " mpi":"",
|
||||
(opt.debug & DBG_CRYPTO_VALUE )? " crypto":"",
|
||||
(opt.debug & DBG_MEMORY_VALUE )? " memory":"",
|
||||
(opt.debug & DBG_CACHE_VALUE )? " cache":"",
|
||||
(opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
|
||||
(opt.debug & DBG_HASHING_VALUE)? " hashing":"",
|
||||
(opt.debug & DBG_ASSUAN_VALUE )? " assuan":"" );
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user