mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-02 12:01:32 +01:00
Replace use stdio by estream functions.
This commit is contained in:
parent
37088de63d
commit
943aaf0cba
30
sm/ChangeLog
30
sm/ChangeLog
@ -1,3 +1,29 @@
|
||||
2010-03-08 Werner Koch <wk@g10code.com>
|
||||
|
||||
* server.c (cmd_encrypt, cmd_decrypt, cmd_verify, cmd_sign): Avoid
|
||||
dup call by using es_fdopen_nc.
|
||||
(do_listkeys): Use es_fdopen_nc instead of dup and es_fdopen.
|
||||
* export.c (popen_protect_tool): Change OUTFILE to an estream_t.
|
||||
(export_p12): Change OUTFP and arg RETFP to an estream_t.
|
||||
(gpgsm_p12_export): Change DATAFP to an estream_t.
|
||||
* import.c (import_one): Change CERTFP and arg FP to an estream_t.
|
||||
(popen_protect_tool): Ditto for OUTFILE.
|
||||
(parse_p12): Change CERTFP to an estream_t.
|
||||
* sign.c (hash_data, hash_and_copy_data): Use estream.
|
||||
(gpgsm_sign): Change arg OUT_FP to an estream_t.
|
||||
* verify.c (gpgsm_verify): Rename FP to IN_FP. Change FP and arg
|
||||
OUT_FP to an estream_t.
|
||||
(hash_data): Use estream.
|
||||
* base64.c (struct reader_cb_parm_s): Change FP to an estream_t.
|
||||
(gpgsm_create_reader): Ditto.
|
||||
(simple_reader_cb, base64_reader_cb): Adjust accordingly.
|
||||
* decrypt.c (gpgsm_decrypt): Change OUT_FP and IN_FP to an estream_t.
|
||||
* encrypt.c (gpgsm_encrypt): Change OUT_FP to an estream_t. Ditto
|
||||
for DATA_FD.
|
||||
(encrypt_cb): Use estream.
|
||||
* gpgsm.c (main) <aEncr, aVerify, aSign, aDecrypt>: Use estream
|
||||
functions.
|
||||
|
||||
2009-12-14 Werner Koch <wk@g10code.com>
|
||||
|
||||
* server.c (cmd_passwd): New.
|
||||
@ -2700,8 +2726,8 @@ h2007-11-22 Werner Koch <wk@g10code.com>
|
||||
* server.c (rc_to_assuan_status): New. Use it for all commands.
|
||||
|
||||
|
||||
Copyright 2001, 2002, 2003, 2004, 2005, 2006,
|
||||
2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||
2010 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
|
24
sm/base64.c
24
sm/base64.c
@ -1,5 +1,5 @@
|
||||
/* base64.c
|
||||
* Copyright (C) 2001, 2003 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2003, 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -39,9 +39,10 @@
|
||||
#define LF "\n"
|
||||
#endif
|
||||
|
||||
/* data used by the reader callbacks */
|
||||
struct reader_cb_parm_s {
|
||||
FILE *fp;
|
||||
/* Data used by the reader callbacks. */
|
||||
struct reader_cb_parm_s
|
||||
{
|
||||
estream_t fp;
|
||||
|
||||
unsigned char line[1024];
|
||||
int linelen;
|
||||
@ -69,7 +70,8 @@ struct reader_cb_parm_s {
|
||||
} base64;
|
||||
};
|
||||
|
||||
/* data used by the writer callbacks */
|
||||
|
||||
/* Data used by the writer callbacks. */
|
||||
struct writer_cb_parm_s {
|
||||
FILE *fp; /* FP is only used if STREAM is NULL. */
|
||||
estream_t stream; /* Alternative output if not NULL. */
|
||||
@ -179,11 +181,11 @@ base64_reader_cb (void *cb_value, char *buffer, size_t count, size_t *nread)
|
||||
parm->have_lf = 0;
|
||||
for (n=0; n < DIM(parm->line);)
|
||||
{
|
||||
c = getc (parm->fp);
|
||||
c = es_getc (parm->fp);
|
||||
if (c == EOF)
|
||||
{
|
||||
parm->eof_seen = 1;
|
||||
if (ferror (parm->fp))
|
||||
if (es_ferror (parm->fp))
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
@ -382,14 +384,14 @@ simple_reader_cb (void *cb_value, char *buffer, size_t count, size_t *nread)
|
||||
|
||||
for (n=0; n < count; n++)
|
||||
{
|
||||
c = getc (parm->fp);
|
||||
c = es_getc (parm->fp);
|
||||
if (c == EOF)
|
||||
{
|
||||
parm->eof_seen = 1;
|
||||
if ( ferror (parm->fp) )
|
||||
if (es_ferror (parm->fp))
|
||||
return -1;
|
||||
if (n)
|
||||
break; /* return what we have before an EOF */
|
||||
break; /* Return what we have before an EOF. */
|
||||
return -1;
|
||||
}
|
||||
*(byte *)buffer++ = c;
|
||||
@ -579,7 +581,7 @@ base64_finish_write (struct writer_cb_parm_s *parm)
|
||||
until no more objects were found. */
|
||||
int
|
||||
gpgsm_create_reader (Base64Context *ctx,
|
||||
ctrl_t ctrl, FILE *fp, int allow_multi_pem,
|
||||
ctrl_t ctrl, estream_t fp, int allow_multi_pem,
|
||||
ksba_reader_t *r_reader)
|
||||
{
|
||||
int rc;
|
||||
|
19
sm/decrypt.c
19
sm/decrypt.c
@ -1,5 +1,5 @@
|
||||
/* decrypt.c - Decrypt a message
|
||||
* Copyright (C) 2001, 2003 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2003, 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -33,7 +33,8 @@
|
||||
#include "keydb.h"
|
||||
#include "i18n.h"
|
||||
|
||||
struct decrypt_filter_parm_s {
|
||||
struct decrypt_filter_parm_s
|
||||
{
|
||||
int algo;
|
||||
int mode;
|
||||
int blklen;
|
||||
@ -237,7 +238,7 @@ decrypt_filter (void *arg,
|
||||
|
||||
/* Perform a decrypt operation. */
|
||||
int
|
||||
gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp)
|
||||
gpgsm_decrypt (ctrl_t ctrl, int in_fd, estream_t out_fp)
|
||||
{
|
||||
int rc;
|
||||
Base64Context b64reader = NULL;
|
||||
@ -248,7 +249,7 @@ gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp)
|
||||
ksba_stop_reason_t stopreason;
|
||||
KEYDB_HANDLE kh;
|
||||
int recp;
|
||||
FILE *in_fp = NULL;
|
||||
estream_t in_fp = NULL;
|
||||
struct decrypt_filter_parm_s dfparm;
|
||||
|
||||
memset (&dfparm, 0, sizeof dfparm);
|
||||
@ -263,11 +264,10 @@ gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp)
|
||||
goto leave;
|
||||
}
|
||||
|
||||
|
||||
in_fp = fdopen ( dup (in_fd), "rb");
|
||||
in_fp = es_fdopen_nc (in_fd, "rb");
|
||||
if (!in_fp)
|
||||
{
|
||||
rc = gpg_error (gpg_err_code_from_errno (errno));
|
||||
rc = gpg_error_from_syserror ();
|
||||
log_error ("fdopen() failed: %s\n", strerror (errno));
|
||||
goto leave;
|
||||
}
|
||||
@ -279,7 +279,7 @@ gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp)
|
||||
goto leave;
|
||||
}
|
||||
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, NULL, &writer);
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, NULL, out_fp, &writer);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't create writer: %s\n", gpg_strerror (rc));
|
||||
@ -576,8 +576,7 @@ gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp)
|
||||
gpgsm_destroy_reader (b64reader);
|
||||
gpgsm_destroy_writer (b64writer);
|
||||
keydb_release (kh);
|
||||
if (in_fp)
|
||||
fclose (in_fp);
|
||||
es_fclose (in_fp);
|
||||
if (dfparm.hd)
|
||||
gcry_cipher_close (dfparm.hd);
|
||||
return rc;
|
||||
|
28
sm/encrypt.c
28
sm/encrypt.c
@ -1,5 +1,6 @@
|
||||
/* encrypt.c - Encrypt a message
|
||||
* Copyright (C) 2001, 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2003, 2004, 2007, 2008,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -45,8 +46,11 @@ struct dek_s {
|
||||
};
|
||||
typedef struct dek_s *DEK;
|
||||
|
||||
struct encrypt_cb_parm_s {
|
||||
FILE *fp;
|
||||
|
||||
/* Callback parameters for the encryption. */
|
||||
struct encrypt_cb_parm_s
|
||||
{
|
||||
estream_t fp;
|
||||
DEK dek;
|
||||
int eof_seen;
|
||||
int ready;
|
||||
@ -239,10 +243,10 @@ encrypt_cb (void *cb_value, char *buffer, size_t count, size_t *nread)
|
||||
p = parm->buffer;
|
||||
for (n=parm->buflen; n < parm->bufsize; n++)
|
||||
{
|
||||
int c = getc (parm->fp);
|
||||
int c = es_getc (parm->fp);
|
||||
if (c == EOF)
|
||||
{
|
||||
if (ferror (parm->fp))
|
||||
if (es_ferror (parm->fp))
|
||||
{
|
||||
parm->readerror = errno;
|
||||
return -1;
|
||||
@ -289,7 +293,7 @@ encrypt_cb (void *cb_value, char *buffer, size_t count, size_t *nread)
|
||||
recipients are take from the certificate given in recplist; if this
|
||||
is NULL it will be encrypted for a default recipient */
|
||||
int
|
||||
gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, FILE *out_fp)
|
||||
gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, estream_t out_fp)
|
||||
{
|
||||
int rc = 0;
|
||||
Base64Context b64writer = NULL;
|
||||
@ -302,7 +306,7 @@ gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, FILE *out_fp)
|
||||
struct encrypt_cb_parm_s encparm;
|
||||
DEK dek = NULL;
|
||||
int recpno;
|
||||
FILE *data_fp = NULL;
|
||||
estream_t data_fp = NULL;
|
||||
certlist_t cl;
|
||||
int count;
|
||||
|
||||
@ -337,10 +341,11 @@ gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, FILE *out_fp)
|
||||
goto leave;
|
||||
}
|
||||
|
||||
data_fp = fdopen ( dup (data_fd), "rb");
|
||||
/* Fixme: We should use the unlocked version of the es functions. */
|
||||
data_fp = es_fdopen_nc (data_fd, "rb");
|
||||
if (!data_fp)
|
||||
{
|
||||
rc = gpg_error (gpg_err_code_from_errno (errno));
|
||||
rc = gpg_error_from_syserror ();
|
||||
log_error ("fdopen() failed: %s\n", strerror (errno));
|
||||
goto leave;
|
||||
}
|
||||
@ -356,7 +361,7 @@ gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, FILE *out_fp)
|
||||
encparm.fp = data_fp;
|
||||
|
||||
ctrl->pem_name = "ENCRYPTED MESSAGE";
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, NULL, &writer);
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, NULL, out_fp, &writer);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't create writer: %s\n", gpg_strerror (rc));
|
||||
@ -506,8 +511,7 @@ gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int data_fd, FILE *out_fp)
|
||||
ksba_reader_release (reader);
|
||||
keydb_release (kh);
|
||||
xfree (dek);
|
||||
if (data_fp)
|
||||
fclose (data_fp);
|
||||
es_fclose (data_fp);
|
||||
xfree (encparm.buffer);
|
||||
return rc;
|
||||
}
|
||||
|
31
sm/export.c
31
sm/export.c
@ -1,5 +1,6 @@
|
||||
/* export.c - Export certificates and private keys.
|
||||
* Copyright (C) 2002, 2003, 2004, 2007, 2009 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2002, 2003, 2004, 2007, 2009,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -60,7 +61,7 @@ static void print_short_info (ksba_cert_t cert, FILE *fp, estream_t stream);
|
||||
static gpg_error_t export_p12 (ctrl_t ctrl,
|
||||
const unsigned char *certimg, size_t certimglen,
|
||||
const char *prompt, const char *keygrip,
|
||||
FILE **retfp);
|
||||
estream_t *retfp);
|
||||
|
||||
|
||||
/* Create a table used to indetify duplicated certificates. */
|
||||
@ -341,7 +342,7 @@ gpgsm_p12_export (ctrl_t ctrl, const char *name, FILE *fp)
|
||||
char *prompt;
|
||||
char buffer[1024];
|
||||
int nread;
|
||||
FILE *datafp = NULL;
|
||||
estream_t datafp = NULL;
|
||||
|
||||
|
||||
hd = keydb_new (0);
|
||||
@ -447,16 +448,16 @@ gpgsm_p12_export (ctrl_t ctrl, const char *name, FILE *fp)
|
||||
xfree (prompt);
|
||||
if (rc)
|
||||
goto leave;
|
||||
rewind (datafp);
|
||||
while ( (nread = fread (buffer, 1, sizeof buffer, datafp)) > 0 )
|
||||
es_rewind (datafp);
|
||||
while ( (nread = es_fread (buffer, 1, sizeof buffer, datafp)) > 0 )
|
||||
if ((rc = ksba_writer_write (writer, buffer, nread)))
|
||||
{
|
||||
log_error ("write failed: %s\n", gpg_strerror (rc));
|
||||
goto leave;
|
||||
}
|
||||
if (ferror (datafp))
|
||||
if (es_ferror (datafp))
|
||||
{
|
||||
rc = gpg_error_from_errno (rc);
|
||||
rc = gpg_error_from_syserror ();
|
||||
log_error ("error reading temporary file: %s\n", gpg_strerror (rc));
|
||||
goto leave;
|
||||
}
|
||||
@ -478,8 +479,7 @@ gpgsm_p12_export (ctrl_t ctrl, const char *name, FILE *fp)
|
||||
cert = NULL;
|
||||
|
||||
leave:
|
||||
if (datafp)
|
||||
fclose (datafp);
|
||||
es_fclose (datafp);
|
||||
gpgsm_destroy_writer (b64writer);
|
||||
ksba_cert_release (cert);
|
||||
xfree (desc);
|
||||
@ -570,7 +570,7 @@ print_short_info (ksba_cert_t cert, FILE *fp, estream_t stream)
|
||||
|
||||
static gpg_error_t
|
||||
popen_protect_tool (ctrl_t ctrl, const char *pgmname,
|
||||
FILE *infile, FILE *outfile, FILE **statusfile,
|
||||
FILE *infile, estream_t outfile, FILE **statusfile,
|
||||
const char *prompt, const char *keygrip,
|
||||
pid_t *pid)
|
||||
{
|
||||
@ -614,14 +614,14 @@ popen_protect_tool (ctrl_t ctrl, const char *pgmname,
|
||||
|
||||
static gpg_error_t
|
||||
export_p12 (ctrl_t ctrl, const unsigned char *certimg, size_t certimglen,
|
||||
const char *prompt, const char *keygrip,
|
||||
FILE **retfp)
|
||||
const char *prompt, const char *keygrip, estream_t *retfp)
|
||||
{
|
||||
const char *pgmname;
|
||||
gpg_error_t err = 0, child_err = 0;
|
||||
int c, cont_line;
|
||||
unsigned int pos;
|
||||
FILE *infp = NULL, *outfp = NULL, *fp = NULL;
|
||||
FILE *infp = NULL, *fp = NULL;
|
||||
estream_t outfp = NULL;
|
||||
char buffer[1024];
|
||||
pid_t pid = -1;
|
||||
int bad_pass = 0;
|
||||
@ -647,7 +647,7 @@ export_p12 (ctrl_t ctrl, const unsigned char *certimg, size_t certimglen,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
outfp = gnupg_tmpfile ();
|
||||
outfp = es_tmpfile ();
|
||||
if (!outfp)
|
||||
{
|
||||
err = gpg_error_from_syserror ();
|
||||
@ -731,8 +731,7 @@ export_p12 (ctrl_t ctrl, const unsigned char *certimg, size_t certimglen,
|
||||
err = child_err;
|
||||
if (err)
|
||||
{
|
||||
if (outfp)
|
||||
fclose (outfp);
|
||||
es_fclose (outfp);
|
||||
}
|
||||
else
|
||||
*retfp = outfp;
|
||||
|
29
sm/gpgsm.c
29
sm/gpgsm.c
@ -1,6 +1,6 @@
|
||||
/* gpgsm.c - GnuPG for S/MIME
|
||||
* Copyright (C) 2001, 2002, 2003, 2004, 2005,
|
||||
* 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -1702,7 +1702,7 @@ main ( int argc, char **argv)
|
||||
|
||||
case aEncr: /* Encrypt the given file. */
|
||||
{
|
||||
FILE *fp = open_fwrite (opt.outfile?opt.outfile:"-");
|
||||
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
||||
|
||||
set_binary (stdin);
|
||||
|
||||
@ -1713,14 +1713,13 @@ main ( int argc, char **argv)
|
||||
else
|
||||
wrong_args ("--encrypt [datafile]");
|
||||
|
||||
if (fp != stdout)
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
}
|
||||
break;
|
||||
|
||||
case aSign: /* Sign the given file. */
|
||||
{
|
||||
FILE *fp = open_fwrite (opt.outfile?opt.outfile:"-");
|
||||
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
||||
|
||||
/* Fixme: We should also allow to concatenate multiple files for
|
||||
signing because that is what gpg does.*/
|
||||
@ -1733,8 +1732,7 @@ main ( int argc, char **argv)
|
||||
else
|
||||
wrong_args ("--sign [datafile]");
|
||||
|
||||
if (fp != stdout)
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1748,13 +1746,13 @@ main ( int argc, char **argv)
|
||||
|
||||
case aVerify:
|
||||
{
|
||||
FILE *fp = NULL;
|
||||
estream_t fp = NULL;
|
||||
|
||||
set_binary (stdin);
|
||||
if (argc == 2 && opt.outfile)
|
||||
log_info ("option --output ignored for a detached signature\n");
|
||||
else if (opt.outfile)
|
||||
fp = open_fwrite (opt.outfile);
|
||||
fp = open_es_fwrite (opt.outfile);
|
||||
|
||||
if (!argc)
|
||||
gpgsm_verify (&ctrl, 0, -1, fp); /* normal signature from stdin */
|
||||
@ -1765,14 +1763,13 @@ main ( int argc, char **argv)
|
||||
else
|
||||
wrong_args ("--verify [signature [detached_data]]");
|
||||
|
||||
if (fp && fp != stdout)
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
}
|
||||
break;
|
||||
|
||||
case aDecrypt:
|
||||
{
|
||||
FILE *fp = open_fwrite (opt.outfile?opt.outfile:"-");
|
||||
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
||||
|
||||
set_binary (stdin);
|
||||
if (!argc)
|
||||
@ -1781,8 +1778,8 @@ main ( int argc, char **argv)
|
||||
gpgsm_decrypt (&ctrl, open_read (*argv), fp); /* from file */
|
||||
else
|
||||
wrong_args ("--decrypt [filename]");
|
||||
if (fp != stdout)
|
||||
fclose (fp);
|
||||
|
||||
es_fclose (fp);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2034,7 +2031,7 @@ check_special_filename (const char *fname, int for_write)
|
||||
|
||||
|
||||
|
||||
/* Open the FILENAME for read and return the filedescriptor. Stop
|
||||
/* Open the FILENAME for read and return the file descriptor. Stop
|
||||
with an error message in case of problems. "-" denotes stdin and
|
||||
if special filenames are allowed the given fd is opened instead. */
|
||||
static int
|
||||
|
14
sm/gpgsm.h
14
sm/gpgsm.h
@ -1,5 +1,6 @@
|
||||
/* gpgsm.h - Global definitions for GpgSM
|
||||
* Copyright (C) 2001, 2003, 2004, 2007, 2009 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2003, 2004, 2007, 2009,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -255,7 +256,7 @@ char *gpgsm_get_certid (ksba_cert_t cert);
|
||||
|
||||
/*-- base64.c --*/
|
||||
int gpgsm_create_reader (Base64Context *ctx,
|
||||
ctrl_t ctrl, FILE *fp, int allow_multi_pem,
|
||||
ctrl_t ctrl, estream_t fp, int allow_multi_pem,
|
||||
ksba_reader_t *r_reader);
|
||||
int gpgsm_reader_eof_seen (Base64Context ctx);
|
||||
void gpgsm_destroy_reader (Base64Context ctx);
|
||||
@ -350,18 +351,19 @@ void gpgsm_p12_export (ctrl_t ctrl, const char *name, FILE *fp);
|
||||
int gpgsm_delete (ctrl_t ctrl, strlist_t names);
|
||||
|
||||
/*-- verify.c --*/
|
||||
int gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp);
|
||||
int gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, estream_t out_fp);
|
||||
|
||||
/*-- sign.c --*/
|
||||
int gpgsm_get_default_cert (ctrl_t ctrl, ksba_cert_t *r_cert);
|
||||
int gpgsm_sign (ctrl_t ctrl, certlist_t signerlist,
|
||||
int data_fd, int detached, FILE *out_fp);
|
||||
int data_fd, int detached, estream_t out_fp);
|
||||
|
||||
/*-- encrypt.c --*/
|
||||
int gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist, int in_fd, FILE *out_fp);
|
||||
int gpgsm_encrypt (ctrl_t ctrl, certlist_t recplist,
|
||||
int in_fd, estream_t out_fp);
|
||||
|
||||
/*-- decrypt.c --*/
|
||||
int gpgsm_decrypt (ctrl_t ctrl, int in_fd, FILE *out_fp);
|
||||
int gpgsm_decrypt (ctrl_t ctrl, int in_fd, estream_t out_fp);
|
||||
|
||||
/*-- certreqgen.c --*/
|
||||
int gpgsm_genkey (ctrl_t ctrl, estream_t in_stream, FILE *out_fp);
|
||||
|
38
sm/import.c
38
sm/import.c
@ -48,8 +48,8 @@ struct stats_s {
|
||||
};
|
||||
|
||||
|
||||
static gpg_error_t parse_p12 (ctrl_t ctrl, ksba_reader_t reader, FILE **retfp,
|
||||
struct stats_s *stats);
|
||||
static gpg_error_t parse_p12 (ctrl_t ctrl, ksba_reader_t reader,
|
||||
estream_t *retfp, struct stats_s *stats);
|
||||
|
||||
|
||||
|
||||
@ -254,14 +254,14 @@ import_one (ctrl_t ctrl, struct stats_s *stats, int in_fd)
|
||||
ksba_reader_t reader;
|
||||
ksba_cert_t cert = NULL;
|
||||
ksba_cms_t cms = NULL;
|
||||
FILE *fp = NULL;
|
||||
estream_t fp = NULL;
|
||||
ksba_content_type_t ct;
|
||||
int any = 0;
|
||||
|
||||
fp = fdopen ( dup (in_fd), "rb");
|
||||
fp = es_fdopen_nc (in_fd, "rb");
|
||||
if (!fp)
|
||||
{
|
||||
rc = gpg_error (gpg_err_code_from_errno (errno));
|
||||
rc = gpg_error_from_syserror ();
|
||||
log_error ("fdopen() failed: %s\n", strerror (errno));
|
||||
goto leave;
|
||||
}
|
||||
@ -331,7 +331,7 @@ import_one (ctrl_t ctrl, struct stats_s *stats, int in_fd)
|
||||
certificate we included in the p12 file; then we continue
|
||||
to look for other pkcs12 files (works only if they are in
|
||||
PEM format. */
|
||||
FILE *certfp;
|
||||
estream_t certfp;
|
||||
Base64Context b64p12rdr;
|
||||
ksba_reader_t p12rdr;
|
||||
|
||||
@ -340,12 +340,12 @@ import_one (ctrl_t ctrl, struct stats_s *stats, int in_fd)
|
||||
{
|
||||
any = 1;
|
||||
|
||||
rewind (certfp);
|
||||
es_rewind (certfp);
|
||||
rc = gpgsm_create_reader (&b64p12rdr, ctrl, certfp, 1, &p12rdr);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't create reader: %s\n", gpg_strerror (rc));
|
||||
fclose (certfp);
|
||||
es_fclose (certfp);
|
||||
goto leave;
|
||||
}
|
||||
|
||||
@ -366,7 +366,7 @@ import_one (ctrl_t ctrl, struct stats_s *stats, int in_fd)
|
||||
if (gpg_err_code (rc) == GPG_ERR_EOF)
|
||||
rc = 0;
|
||||
gpgsm_destroy_reader (b64p12rdr);
|
||||
fclose (certfp);
|
||||
es_fclose (certfp);
|
||||
if (rc)
|
||||
goto leave;
|
||||
}
|
||||
@ -401,8 +401,7 @@ import_one (ctrl_t ctrl, struct stats_s *stats, int in_fd)
|
||||
ksba_cms_release (cms);
|
||||
ksba_cert_release (cert);
|
||||
gpgsm_destroy_reader (b64reader);
|
||||
if (fp)
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -585,7 +584,8 @@ gpgsm_import_files (ctrl_t ctrl, int nfiles, char **files,
|
||||
success or an error code. */
|
||||
static gpg_error_t
|
||||
popen_protect_tool (ctrl_t ctrl, const char *pgmname,
|
||||
FILE *infile, FILE *outfile, FILE **statusfile, pid_t *pid)
|
||||
FILE *infile, estream_t outfile,
|
||||
FILE **statusfile, pid_t *pid)
|
||||
{
|
||||
const char *argv[22];
|
||||
int i=0;
|
||||
@ -627,17 +627,18 @@ popen_protect_tool (ctrl_t ctrl, const char *pgmname,
|
||||
certificates from that stupid format. We will also store secret
|
||||
keys. All of the pkcs#12 parsing and key storing is handled by the
|
||||
gpg-protect-tool, we merely have to take care of receiving the
|
||||
certificates. On success RETFP returns a temporary file with
|
||||
certificates. */
|
||||
certificates. On success RETFP returns a stream to a temporary
|
||||
file with certificates. */
|
||||
static gpg_error_t
|
||||
parse_p12 (ctrl_t ctrl, ksba_reader_t reader,
|
||||
FILE **retfp, struct stats_s *stats)
|
||||
estream_t *retfp, struct stats_s *stats)
|
||||
{
|
||||
const char *pgmname;
|
||||
gpg_error_t err = 0, child_err = 0;
|
||||
int c, cont_line;
|
||||
unsigned int pos;
|
||||
FILE *tmpfp, *certfp = NULL, *fp = NULL;
|
||||
FILE *tmpfp, *fp = NULL;
|
||||
estream_t certfp = NULL;
|
||||
char buffer[1024];
|
||||
size_t nread;
|
||||
pid_t pid = -1;
|
||||
@ -679,7 +680,7 @@ parse_p12 (ctrl_t ctrl, ksba_reader_t reader,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
certfp = gnupg_tmpfile ();
|
||||
certfp = es_tmpfile ();
|
||||
if (!certfp)
|
||||
{
|
||||
err = gpg_error_from_syserror ();
|
||||
@ -780,8 +781,7 @@ parse_p12 (ctrl_t ctrl, ksba_reader_t reader,
|
||||
err = child_err;
|
||||
if (err)
|
||||
{
|
||||
if (certfp)
|
||||
fclose (certfp);
|
||||
es_fclose (certfp);
|
||||
}
|
||||
else
|
||||
*retfp = certfp;
|
||||
|
43
sm/server.c
43
sm/server.c
@ -1,6 +1,6 @@
|
||||
/* server.c - Server mode and main entry point
|
||||
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006,
|
||||
* 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -451,7 +451,7 @@ cmd_encrypt (assuan_context_t ctx, char *line)
|
||||
ctrl_t ctrl = assuan_get_pointer (ctx);
|
||||
certlist_t cl;
|
||||
int inp_fd, out_fd;
|
||||
FILE *out_fp;
|
||||
estream_t out_fp;
|
||||
int rc;
|
||||
|
||||
(void)line;
|
||||
@ -463,9 +463,9 @@ cmd_encrypt (assuan_context_t ctx, char *line)
|
||||
if (out_fd == -1)
|
||||
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
|
||||
|
||||
out_fp = fdopen (dup (out_fd), "w");
|
||||
out_fp = es_fdopen_nc (out_fd, "w");
|
||||
if (!out_fp)
|
||||
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
|
||||
return set_error (gpg_err_code_from_syserror (), "fdopen() failed");
|
||||
|
||||
/* Now add all encrypt-to marked recipients from the default
|
||||
list. */
|
||||
@ -483,7 +483,7 @@ cmd_encrypt (assuan_context_t ctx, char *line)
|
||||
rc = gpgsm_encrypt (assuan_get_pointer (ctx),
|
||||
ctrl->server_local->recplist,
|
||||
inp_fd, out_fp);
|
||||
fclose (out_fp);
|
||||
es_fclose (out_fp);
|
||||
|
||||
gpgsm_release_certlist (ctrl->server_local->recplist);
|
||||
ctrl->server_local->recplist = NULL;
|
||||
@ -508,7 +508,7 @@ cmd_decrypt (assuan_context_t ctx, char *line)
|
||||
{
|
||||
ctrl_t ctrl = assuan_get_pointer (ctx);
|
||||
int inp_fd, out_fd;
|
||||
FILE *out_fp;
|
||||
estream_t out_fp;
|
||||
int rc;
|
||||
|
||||
(void)line;
|
||||
@ -520,16 +520,16 @@ cmd_decrypt (assuan_context_t ctx, char *line)
|
||||
if (out_fd == -1)
|
||||
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
|
||||
|
||||
out_fp = fdopen (dup(out_fd), "w");
|
||||
out_fp = es_fdopen_nc (out_fd, "w");
|
||||
if (!out_fp)
|
||||
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
|
||||
return set_error (gpg_err_code_from_syserror (), "fdopen() failed");
|
||||
|
||||
rc = start_audit_session (ctrl);
|
||||
if (!rc)
|
||||
rc = gpgsm_decrypt (ctrl, inp_fd, out_fp);
|
||||
fclose (out_fp);
|
||||
es_fclose (out_fp);
|
||||
|
||||
/* close and reset the fd */
|
||||
/* Close and reset the fds. */
|
||||
close_message_fd (ctrl);
|
||||
assuan_close_input_fd (ctx);
|
||||
assuan_close_output_fd (ctx);
|
||||
@ -554,7 +554,7 @@ cmd_verify (assuan_context_t ctx, char *line)
|
||||
ctrl_t ctrl = assuan_get_pointer (ctx);
|
||||
int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
|
||||
int out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
|
||||
FILE *out_fp = NULL;
|
||||
estream_t out_fp = NULL;
|
||||
|
||||
(void)line;
|
||||
|
||||
@ -563,19 +563,18 @@ cmd_verify (assuan_context_t ctx, char *line)
|
||||
|
||||
if (out_fd != -1)
|
||||
{
|
||||
out_fp = fdopen ( dup(out_fd), "w");
|
||||
out_fp = es_fdopen_nc (out_fd, "w");
|
||||
if (!out_fp)
|
||||
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
|
||||
return set_error (gpg_err_code_from_syserror (), "fdopen() failed");
|
||||
}
|
||||
|
||||
rc = start_audit_session (ctrl);
|
||||
if (!rc)
|
||||
rc = gpgsm_verify (assuan_get_pointer (ctx), fd,
|
||||
ctrl->server_local->message_fd, out_fp);
|
||||
if (out_fp)
|
||||
fclose (out_fp);
|
||||
es_fclose (out_fp);
|
||||
|
||||
/* close and reset the fd */
|
||||
/* Close and reset the fd. */
|
||||
close_message_fd (ctrl);
|
||||
assuan_close_input_fd (ctx);
|
||||
assuan_close_output_fd (ctx);
|
||||
@ -595,7 +594,7 @@ cmd_sign (assuan_context_t ctx, char *line)
|
||||
{
|
||||
ctrl_t ctrl = assuan_get_pointer (ctx);
|
||||
int inp_fd, out_fd;
|
||||
FILE *out_fp;
|
||||
estream_t out_fp;
|
||||
int detached;
|
||||
int rc;
|
||||
|
||||
@ -608,7 +607,7 @@ cmd_sign (assuan_context_t ctx, char *line)
|
||||
|
||||
detached = has_option (line, "--detached");
|
||||
|
||||
out_fp = fdopen ( dup(out_fd), "w");
|
||||
out_fp = es_fdopen_nc (out_fd, "w");
|
||||
if (!out_fp)
|
||||
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
|
||||
|
||||
@ -616,7 +615,7 @@ cmd_sign (assuan_context_t ctx, char *line)
|
||||
if (!rc)
|
||||
rc = gpgsm_sign (assuan_get_pointer (ctx), ctrl->server_local->signerlist,
|
||||
inp_fd, detached, out_fp);
|
||||
fclose (out_fp);
|
||||
es_fclose (out_fp);
|
||||
|
||||
/* close and reset the fd */
|
||||
close_message_fd (ctrl);
|
||||
@ -916,9 +915,9 @@ do_listkeys (assuan_context_t ctx, char *line, int mode)
|
||||
|
||||
if ( outfd == -1 )
|
||||
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
|
||||
fp = es_fdopen ( dup (outfd), "w");
|
||||
fp = es_fdopen_nc (outfd, "w");
|
||||
if (!fp)
|
||||
return set_error (GPG_ERR_ASS_GENERAL, "es_fdopen() failed");
|
||||
return set_error (gpg_err_code_from_syserror (), "es_fdopen() failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
36
sm/sign.c
36
sm/sign.c
@ -1,5 +1,6 @@
|
||||
/* sign.c - Sign a message
|
||||
* Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2002, 2003, 2008,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -38,12 +39,12 @@
|
||||
static int
|
||||
hash_data (int fd, gcry_md_hd_t md)
|
||||
{
|
||||
FILE *fp;
|
||||
estream_t fp;
|
||||
char buffer[4096];
|
||||
int nread;
|
||||
int rc = 0;
|
||||
|
||||
fp = fdopen ( dup (fd), "rb");
|
||||
fp = es_fdopen_nc (fd, "rb");
|
||||
if (!fp)
|
||||
{
|
||||
log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno));
|
||||
@ -52,40 +53,41 @@ hash_data (int fd, gcry_md_hd_t md)
|
||||
|
||||
do
|
||||
{
|
||||
nread = fread (buffer, 1, DIM(buffer), fp);
|
||||
nread = es_fread (buffer, 1, DIM(buffer), fp);
|
||||
gcry_md_write (md, buffer, nread);
|
||||
}
|
||||
while (nread);
|
||||
if (ferror (fp))
|
||||
if (es_ferror (fp))
|
||||
{
|
||||
log_error ("read error on fd %d: %s\n", fd, strerror (errno));
|
||||
rc = -1;
|
||||
}
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
hash_and_copy_data (int fd, gcry_md_hd_t md, ksba_writer_t writer)
|
||||
{
|
||||
gpg_error_t err;
|
||||
FILE *fp;
|
||||
estream_t fp;
|
||||
char buffer[4096];
|
||||
int nread;
|
||||
int rc = 0;
|
||||
int any = 0;
|
||||
|
||||
fp = fdopen ( dup (fd), "rb");
|
||||
fp = es_fdopen_nc (fd, "rb");
|
||||
if (!fp)
|
||||
{
|
||||
gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
|
||||
gpg_error_t tmperr = gpg_error_from_syserror ();
|
||||
log_error ("fdopen(%d) failed: %s\n", fd, strerror (errno));
|
||||
return tmperr;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
nread = fread (buffer, 1, DIM(buffer), fp);
|
||||
nread = es_fread (buffer, 1, DIM(buffer), fp);
|
||||
if (nread)
|
||||
{
|
||||
any = 1;
|
||||
@ -99,18 +101,18 @@ hash_and_copy_data (int fd, gcry_md_hd_t md, ksba_writer_t writer)
|
||||
}
|
||||
}
|
||||
while (nread && !rc);
|
||||
if (ferror (fp))
|
||||
if (es_ferror (fp))
|
||||
{
|
||||
rc = gpg_error (gpg_err_code_from_errno (errno));
|
||||
rc = gpg_error_from_syserror ();
|
||||
log_error ("read error on fd %d: %s\n", fd, strerror (errno));
|
||||
}
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
if (!any)
|
||||
{
|
||||
/* We can't allow to sign an empty message because it does not
|
||||
make much sense and more seriously, ksba-cms_build has
|
||||
make much sense and more seriously, ksba_cms_build has
|
||||
already written the tag for data and now expects an octet
|
||||
string but an octet string of zeize 0 is illegal. */
|
||||
string and an octet string of size 0 is illegal. */
|
||||
log_error ("cannot sign an empty message\n");
|
||||
rc = gpg_error (GPG_ERR_NO_DATA);
|
||||
}
|
||||
@ -310,7 +312,7 @@ add_certificate_list (ctrl_t ctrl, ksba_cms_t cms, ksba_cert_t cert)
|
||||
be used if the value of this argument is NULL. */
|
||||
int
|
||||
gpgsm_sign (ctrl_t ctrl, certlist_t signerlist,
|
||||
int data_fd, int detached, FILE *out_fp)
|
||||
int data_fd, int detached, estream_t out_fp)
|
||||
{
|
||||
int i, rc;
|
||||
gpg_error_t err;
|
||||
@ -338,7 +340,7 @@ gpgsm_sign (ctrl_t ctrl, certlist_t signerlist,
|
||||
}
|
||||
|
||||
ctrl->pem_name = "SIGNED MESSAGE";
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, NULL, &writer);
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, NULL, out_fp, &writer);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't create writer: %s\n", gpg_strerror (rc));
|
||||
|
32
sm/verify.c
32
sm/verify.c
@ -1,5 +1,6 @@
|
||||
/* verify.c - Verify a messages signature
|
||||
* Copyright (C) 2001, 2002, 2003, 2007 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2001, 2002, 2003, 2007,
|
||||
* 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
@ -52,11 +53,11 @@ static gpg_error_t
|
||||
hash_data (int fd, gcry_md_hd_t md)
|
||||
{
|
||||
gpg_error_t err = 0;
|
||||
FILE *fp;
|
||||
estream_t fp;
|
||||
char buffer[4096];
|
||||
int nread;
|
||||
|
||||
fp = fdopen ( dup (fd), "rb");
|
||||
fp = es_fdopen_nc (fd, "rb");
|
||||
if (!fp)
|
||||
{
|
||||
err = gpg_error_from_syserror ();
|
||||
@ -66,27 +67,27 @@ hash_data (int fd, gcry_md_hd_t md)
|
||||
|
||||
do
|
||||
{
|
||||
nread = fread (buffer, 1, DIM(buffer), fp);
|
||||
nread = es_fread (buffer, 1, DIM(buffer), fp);
|
||||
gcry_md_write (md, buffer, nread);
|
||||
}
|
||||
while (nread);
|
||||
if (ferror (fp))
|
||||
if (es_ferror (fp))
|
||||
{
|
||||
err = gpg_error_from_syserror ();
|
||||
log_error ("read error on fd %d: %s\n", fd, gpg_strerror (err));
|
||||
}
|
||||
fclose (fp);
|
||||
es_fclose (fp);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Perform a verify operation. To verify detached signatures, data_fd
|
||||
/* Perform a verify operation. To verify detached signatures, DATA_FD
|
||||
must be different than -1. With OUT_FP given and a non-detached
|
||||
signature, the signed material is written to that stream. */
|
||||
int
|
||||
gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
|
||||
gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, estream_t out_fp)
|
||||
{
|
||||
int i, rc;
|
||||
Base64Context b64reader = NULL;
|
||||
@ -102,7 +103,7 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
|
||||
const char *algoid;
|
||||
int algo;
|
||||
int is_detached;
|
||||
FILE *fp = NULL;
|
||||
estream_t in_fp = NULL;
|
||||
char *p;
|
||||
|
||||
audit_set_type (ctrl->audit, AUDIT_TYPE_VERIFY);
|
||||
@ -116,15 +117,15 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
|
||||
}
|
||||
|
||||
|
||||
fp = fdopen ( dup (in_fd), "rb");
|
||||
if (!fp)
|
||||
in_fp = es_fdopen_nc (in_fd, "rb");
|
||||
if (!in_fp)
|
||||
{
|
||||
rc = gpg_error (gpg_err_code_from_errno (errno));
|
||||
rc = gpg_error_from_syserror ();
|
||||
log_error ("fdopen() failed: %s\n", strerror (errno));
|
||||
goto leave;
|
||||
}
|
||||
|
||||
rc = gpgsm_create_reader (&b64reader, ctrl, fp, 0, &reader);
|
||||
rc = gpgsm_create_reader (&b64reader, ctrl, in_fp, 0, &reader);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't create reader: %s\n", gpg_strerror (rc));
|
||||
@ -133,7 +134,7 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
|
||||
|
||||
if (out_fp)
|
||||
{
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, out_fp, NULL, &writer);
|
||||
rc = gpgsm_create_writer (&b64writer, ctrl, NULL, out_fp, &writer);
|
||||
if (rc)
|
||||
{
|
||||
log_error ("can't create writer: %s\n", gpg_strerror (rc));
|
||||
@ -644,8 +645,7 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
|
||||
gpgsm_destroy_writer (b64writer);
|
||||
keydb_release (kh);
|
||||
gcry_md_close (data_md);
|
||||
if (fp)
|
||||
fclose (fp);
|
||||
es_fclose (in_fp);
|
||||
|
||||
if (rc)
|
||||
{
|
||||
|
@ -1,3 +1,7 @@
|
||||
2010-03-08 Werner Koch <wk@g10code.com>
|
||||
|
||||
* no-libgcrypt.c (gcry_create_nonce): New.
|
||||
|
||||
2010-02-26 Werner Koch <wk@g10code.com>
|
||||
|
||||
* gpg-connect-agent.c (main): New option --tcp-socket.
|
||||
|
@ -142,3 +142,13 @@ gcry_set_log_handler (gcry_handler_log_t f, void *opaque)
|
||||
(void)f;
|
||||
(void)opaque;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_create_nonce (void *buffer, size_t length)
|
||||
{
|
||||
(void)buffer;
|
||||
(void)length;
|
||||
|
||||
log_fatal ("unexpected call to gcry_create_nonce\n");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user