1
/* preset-passphrase.c - A tool to preset a passphrase.
2
* Copyright (C) 2004 Free Software Foundation, Inc.
4
* This file is part of GnuPG.
6
* GnuPG is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* GnuPG is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
35
#ifdef HAVE_LANGINFO_CODESET
38
#ifdef HAVE_DOSISH_SYSTEM
39
#include <fcntl.h> /* for setmode() */
41
#ifdef HAVE_W32_SYSTEM
42
#include <windows.h> /* To initialize the sockets. fixme */
45
#define JNLIB_NEED_LOG_LOGV
48
#include "simple-pwquery.h"
53
enum cmd_and_opt_values
68
static const char *opt_homedir;
69
static const char *opt_passphrase;
71
static ARGPARSE_OPTS opts[] = {
73
{ 301, NULL, 0, N_("@Options:\n ") },
75
{ oVerbose, "verbose", 0, "verbose" },
76
{ oPassphrase, "passphrase", 2, "|STRING|use passphrase STRING" },
77
{ oPreset, "preset", 256, "preset passphrase"},
78
{ oForget, "forget", 256, "forget passphrase"},
80
{ oHomedir, "homedir", 2, "@" },
86
my_strusage (int level)
91
case 11: p = "gpg-preset-passphrase (GnuPG)";
93
case 13: p = VERSION; break;
94
case 17: p = PRINTABLE_OS_NAME; break;
95
case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n");
99
p = _("Usage: gpg-preset-passphrase [options] KEYGRIP (-h for help)\n");
102
p = _("Syntax: gpg-preset-passphrase [options] KEYGRIP\n"
103
"Password cache maintenance\n");
116
#ifdef USE_SIMPLE_GETTEXT
117
set_gettext_file( PACKAGE_GT );
120
setlocale (LC_ALL, "");
121
bindtextdomain (PACKAGE_GT, LOCALEDIR);
122
textdomain (PACKAGE_GT);
129
map_spwq_error (int err)
135
case SPWQ_OUT_OF_CORE:
136
return gpg_error_from_errno (ENOMEM);
138
return gpg_error_from_errno (EIO);
139
case SPWQ_PROTOCOL_ERROR:
140
return gpg_error (GPG_ERR_PROTOCOL_VIOLATION);
141
case SPWQ_ERR_RESPONSE:
142
return gpg_error (GPG_ERR_INV_RESPONSE);
144
return gpg_error (GPG_ERR_NO_AGENT);
146
return gpg_error_from_errno (errno);
147
case SPWQ_GENERAL_ERROR:
149
return gpg_error (GPG_ERR_GENERAL);
155
preset_passphrase (const char *keygrip)
159
/* FIXME: Use secure memory. */
160
char passphrase[500];
164
rc = read (0, passphrase, sizeof (passphrase) - 1);
167
log_error ("reading passphrase failed: %s\n",
168
gpg_strerror (gpg_error_from_errno (errno)));
171
passphrase[rc] = '\0';
172
line = strchr (passphrase, '\n');
176
if (line > passphrase && line[-1] == '\r')
181
/* FIXME: How to handle empty passwords? */
184
rc = asprintf (&line, "PRESET_PASSPHRASE %s -1 %s\n", keygrip,
185
opt_passphrase? opt_passphrase : passphrase);
188
log_error ("caching passphrase failed: %s\n",
189
gpg_strerror (gpg_error_from_errno (errno)));
193
wipememory (passphrase, sizeof (passphrase));
195
rc = map_spwq_error (simple_query (line));
198
log_error ("caching passphrase failed: %s\n", gpg_strerror (rc));
202
wipememory (line, strlen (line));
208
forget_passphrase (const char *keygrip)
213
rc = asprintf (&line, "CLEAR_PASSPHRASE %s\n", keygrip);
216
log_error ("clearing passphrase failed: %s\n",
217
gpg_strerror (gpg_error_from_errno (errno)));
225
main (int argc, char **argv)
229
const char *keygrip = NULL;
231
set_strusage (my_strusage);
232
log_set_prefix ("gpg-preset-passphrase", 1);
234
/* Try to auto set the character set. */
235
set_native_charset (NULL);
237
#ifdef HAVE_W32_SYSTEM
238
/* Fixme: Need to initialize the Windows sockets: This should be
239
moved to another place and we should make sure that it won't get
240
doen twice, like when Pth is used too. */
243
WSAStartup (0x202, &wsadat);
249
opt_homedir = default_homedir ();
253
pargs.flags= 1; /* (do not remove the args) */
254
while (arg_parse (&pargs, opts) )
258
case oVerbose: opt.verbose++; break;
259
case oHomedir: opt_homedir = pargs.r.ret_str; break;
261
case oPreset: cmd = oPreset; break;
262
case oForget: cmd = oForget; break;
263
case oPassphrase: opt_passphrase = pargs.r.ret_str; break;
265
default : pargs.err = 2; break;
268
if (log_get_errorcount(0))
277
preset_passphrase (keygrip);
278
else if (cmd == oForget)
279
forget_passphrase (keygrip);
281
log_error ("one of the options --preset or --forget must be given\n");
284
return 8; /*NOTREACHED*/
291
rc = rc? rc : log_get_errorcount(0)? 2 : 0;