Skip to content

Commit c3a7ec5

Browse files
committed
Allow certs endpoint to be run locally
1 parent 56dafbc commit c3a7ec5

File tree

3 files changed

+86
-70
lines changed

3 files changed

+86
-70
lines changed

bin/configdb.pl

+3-2
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@
5858
}
5959

6060
my ($pwdpass, $schema);
61-
if ($is_local && $type eq 'pwd')
61+
if ($is_local)
6262
{
6363
# If we are running directly on the server, get passphrase to
6464
# ecnrypt/decrypt passwords (this is kept locally in /.configdb if
6565
# accessing the database remotely)
66-
$pwdpass = _get_passphrase("Please enter the passphrase for password encyrption and decryption:");
66+
$pwdpass = _get_passphrase("Please enter the passphrase for password encyrption and decryption:")
67+
if $type eq 'pwd';
6768

6869
# Get direct connection from database - not needed for running on remote
6970
# server

lib/Brass/API.pm

+6-68
Original file line numberDiff line numberDiff line change
@@ -111,78 +111,16 @@ get 'api/cert/' => sub {
111111

112112
my $schema = schema;
113113

114-
my $action = query_parameters->get('action')
115-
or error __"Need required action";
116-
my $server = query_parameters->get('server');
117-
my $param = query_parameters->get('param');
118-
119-
my $output;
120-
if ($action eq 'summary')
121-
{
122-
$server or error __"Please specify server";
123-
$param or error __"Please specify certificate use";
124-
125-
my @certs;
126-
my @uses = $schema->resultset('ServerCert')->search({
127-
'server.name' => $server,
128-
'use.name' => $param,
129-
},{
130-
join => ['use', 'server'],
131-
})->all;
132-
133-
error __x"Certificate use {use} not found for server {name}",
134-
use => $param, name => $server
135-
if !@uses;
136-
137-
foreach my $use (@uses)
138-
{
139-
my $cert = $schema->resultset('Cert')->search({
140-
'me.id' => $use->cert_id,
141-
'cert_location_uses.use_id' => $use->get_column('use'),
142-
},{
143-
prefetch => {
144-
cert_locations => 'cert_location_uses',
145-
},
146-
});
147-
148-
error __x"More than one location configured for use \"{use}\" of certificate {id}",
149-
use => $use->use->name, id => $use->cert_id
150-
if $cert->count > 1;
151-
152-
error __x"Location information not configured for use \"{use}\" of certificate {id}",
153-
use => $use->use->name, id => $use->cert_id
154-
if !$cert->count;
155-
156-
push @certs, $cert->next->as_hash_single;
157-
}
158-
159-
$output = \@certs;
160-
}
161-
elsif ($action eq 'servers')
162-
{
163-
$param or error __"Please specify certificate ID";
164-
165-
my $cert = $schema->resultset('Cert')->find($param)
166-
or error __x"Certificate ID {id} not found", id => $param;
167-
168-
my @servers = $schema->resultset('Server')->search({
169-
'cert.id' => $param,
170-
},{
171-
prefetch => {
172-
server_certs => 'cert' ,
173-
},
174-
})->all;
175-
176-
$output = $cert->as_hash_multiple;
177-
}
178-
else {
179-
error __x"Unknown action {action}", action => $action;
180-
}
114+
my $return = $cdb->run_cert(
115+
server => query_parameters->get('server'),
116+
action => query_parameters->get('action'),
117+
param => query_parameters->get('param'),
118+
);
181119

182120
content_type 'application/json';
183121
encode_json({
184122
"is_error" => 0,
185-
"result" => encode_json($output),
123+
"result" => encode_json($return),
186124
});
187125
};
188126

lib/Brass/ConfigDB.pm

+77
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ sub _run_local
5858
{
5959
$self->run_pwd(%params);
6060
}
61+
elsif ($type eq 'cert')
62+
{
63+
$self->run_cert(%params);
64+
}
6165
}
6266

6367
sub _run_remote
@@ -257,6 +261,79 @@ sub run_pwd
257261
return $pass;
258262
}
259263

264+
sub run_cert
265+
{ my ($self, %params) = @_;
266+
267+
my $server = $params{server};
268+
my $param = $params{param};
269+
my $action = $params{action}
270+
or error __"Need required action";
271+
272+
my $return;
273+
274+
if ($action eq 'summary')
275+
{
276+
$server or error __"Please specify server";
277+
$param or error __"Please specify certificate use";
278+
279+
my @certs;
280+
my @uses = $self->schema->resultset('ServerCert')->search({
281+
'server.name' => $server,
282+
'use.name' => $param,
283+
},{
284+
join => ['use', 'server'],
285+
})->all;
286+
287+
error __x"Certificate use {use} not found for server {name}",
288+
use => $param, name => $server
289+
if !@uses;
290+
291+
foreach my $use (@uses)
292+
{
293+
my $cert = $self->schema->resultset('Cert')->search({
294+
'me.id' => $use->cert_id,
295+
'cert_location_uses.use_id' => $use->get_column('use'),
296+
},{
297+
prefetch => {
298+
cert_locations => 'cert_location_uses',
299+
},
300+
});
301+
302+
error __x"More than one location configured for use \"{use}\" of certificate {id}",
303+
use => $use->use->name, id => $use->cert_id
304+
if $cert->count > 1;
305+
306+
error __x"Location information not configured for use \"{use}\" of certificate {id}",
307+
use => $use->use->name, id => $use->cert_id
308+
if !$cert->count;
309+
310+
push @certs, $cert->next->as_hash_single;
311+
}
312+
313+
return \@certs;
314+
}
315+
elsif ($action eq 'servers')
316+
{
317+
$param or error __"Please specify certificate ID";
318+
319+
my $cert = $self->schema->resultset('Cert')->find($param)
320+
or error __x"Certificate ID {id} not found", id => $param;
321+
322+
my @servers = $self->schema->resultset('Server')->search({
323+
'cert.id' => $param,
324+
},{
325+
prefetch => {
326+
server_certs => 'cert' ,
327+
},
328+
})->all;
329+
330+
return $cert->as_hash_multiple;
331+
}
332+
else {
333+
error __x"Unknown action {action}", action => $action;
334+
}
335+
}
336+
260337
sub randompw()
261338
{ my $pwgen = CtrlO::Crypt::XkcdPassword->new;
262339
$pwgen->xkcd( words => 3, digits => 2 );

0 commit comments

Comments
 (0)