1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
|
// Copyright (C) 2002 Graydon Hoare <graydon@pobox.com>
//
// This program is made available under the GNU GPL version 2.0 or
// greater. See the accompanying file COPYING for details.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the
// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE.
#include "base.hh"
#include <iostream>
#include <sstream>
#include "cmd.hh"
#include "app_state.hh"
#include "database.hh"
#include "key_store.hh"
#include "packet.hh"
#include "project.hh"
#include "vocab_cast.hh"
using std::cin;
using std::cout;
using std::istringstream;
using std::vector;
CMD(pubkey, "pubkey", "", CMD_REF(packet_io), N_("ID"),
N_("Prints a public key packet"),
"",
options::opts::none)
{
if (args.size() != 1)
throw usage(execid);
database db(app);
key_store keys(app);
project_t project(db);
key_identity_info identity;
project.get_key_identity(keys, app.lua,
typecast_vocab<external_key_name>(idx(args, 0)),
identity);
bool exists(false);
rsa_pub_key key;
if (db.database_specified() && db.public_key_exists(identity.id))
{
db.get_key(identity.id, key);
exists = true;
}
if (keys.key_pair_exists(identity.id))
{
keypair kp;
keys.get_key_pair(identity.id, kp);
key = kp.pub;
exists = true;
}
E(exists, origin::user,
F("public key '%s' does not exist") % idx(args, 0)());
packet_writer pw(cout);
pw.consume_public_key(identity.given_name, key);
}
CMD(privkey, "privkey", "", CMD_REF(packet_io), N_("ID"),
N_("Prints a private key packet"),
"",
options::opts::none)
{
database db(app);
key_store keys(app);
project_t project(db);
if (args.size() != 1)
throw usage(execid);
key_name name = typecast_vocab<key_name>(idx(args, 0));
key_identity_info identity;
project.get_key_identity(app.lua,
typecast_vocab<external_key_name>(idx(args, 0)),
identity);
E(keys.key_pair_exists(identity.id), origin::user,
F("public and private key '%s' do not exist in keystore")
% idx(args, 0)());
packet_writer pw(cout);
keypair kp;
key_name given_name;
keys.get_key_pair(identity.id, given_name, kp);
pw.consume_key_pair(given_name, kp);
}
namespace
{
// this writer injects packets it receives to the database
// and/or keystore.
struct packet_db_writer : public packet_consumer
{
database & db;
key_store & keys;
public:
packet_db_writer(database & db, key_store & keys)
: db(db), keys(keys)
{}
virtual ~packet_db_writer() {}
virtual void consume_file_data(file_id const & ident,
file_data const & dat)
{
transaction_guard guard(db);
db.put_file(ident, dat);
guard.commit();
}
virtual void consume_file_delta(file_id const & old_id,
file_id const & new_id,
file_delta const & del)
{
transaction_guard guard(db);
db.put_file_version(old_id, new_id, del);
guard.commit();
}
virtual void consume_revision_data(revision_id const & ident,
revision_data const & dat)
{
transaction_guard guard(db);
db.put_revision(ident, dat);
guard.commit();
}
virtual void consume_revision_cert(cert const & t)
{
transaction_guard guard(db);
db.put_revision_cert(t);
guard.commit();
}
virtual void consume_public_key(key_name const & ident,
rsa_pub_key const & k)
{
transaction_guard guard(db);
db.put_key(ident, k);
guard.commit();
}
virtual void consume_key_pair(key_name const & ident,
keypair const & kp)
{
keys.put_key_pair(ident, kp);
}
virtual void consume_old_private_key(key_name const & ident,
old_arc4_rsa_priv_key const & k)
{
rsa_pub_key dummy;
keys.migrate_old_key_pair(ident, k, dummy);
}
};
}
// Name : read_packets
// Arguments:
// packet-data
// Added in: 9.0
// Purpose:
// Store public keys (and incidentally anything else that can be
// represented as a packet) into the database.
// Input format:
// The format of the packet-data argument is identical to the output
// of "mtn pubkey <keyname>" (or other packet output commands).
// Output format:
// No output.
// Error conditions:
// Invalid input formatting.
CMD_AUTOMATE(read_packets, N_("PACKET-DATA"),
N_("Load the given packets into the database."),
"",
options::opts::none)
{
E(args.size() == 1, origin::user,
F("wrong argument count"));
database db(app);
key_store keys(app);
packet_db_writer dbw(db, keys);
istringstream ss(idx(args,0)());
read_packets(ss, dbw);
}
CMD(read, "read", "", CMD_REF(packet_io), "[FILE1 [FILE2 [...]]]",
N_("Reads packets from files"),
N_("If no files are provided, the standard input is used."),
options::opts::none)
{
database db(app);
key_store keys(app);
packet_db_writer dbw(db, keys);
size_t count = 0;
if (args.empty())
{
count += read_packets(cin, dbw);
E(count != 0, origin::user, F("no packets found on stdin"));
}
else
{
for (args_vector::const_iterator i = args.begin();
i != args.end(); ++i)
{
data dat;
read_data(system_path(*i), dat);
istringstream ss(dat());
count += read_packets(ss, dbw);
}
E(count != 0, origin::user,
FP("no packets found in given file",
"no packets found in given files",
args.size()));
}
P(FP("read %d packet", "read %d packets", count) % count);
}
// Local Variables:
// mode: C++
// fill-column: 76
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
// vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s:
|