lemonldap-ng/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Request.pm
2012-09-08 10:55:55 +00:00

108 lines
3.0 KiB
Perl

##@file
# Request manager
##@class Lemonldap::NG::Manager::Request
# Request manager
package Lemonldap::NG::Manager::Request;
use strict;
use Convert::PEM;
use Crypt::OpenSSL::RSA;
use JSON;
use MIME::Base64;
use URI::Escape;
our $VERSION = '1.2.2';
##@method public string request(string request)
# Return the response corresponding to the request
# @param $request A request
# @return String
sub request {
my ( $self, $rrequest ) = splice @_;
my $request = ${$rrequest};
my $response = undef;
#
# GENERATE PRIVATE/PUBLIC KEYS
#
if ( $request =~ /generateKeys/i ) {
my $password = $self->rparam('password');
$password = $password ? ${$password} : undef;
$response = $self->generateKeys($password);
}
if ( defined $response ) {
$self->sendJSONResponse($response);
}
}
##@method public hashref generateKeys(string password)
# Return a hashref containing private and public keys
# @param $password A password to protect the private key
# @return Hashref
sub generateKeys {
my ( $self, $password ) = splice @_;
my $rsa = Crypt::OpenSSL::RSA->generate_key(2048);
my $keys = undef;
%$keys = (
'private' => $rsa->get_private_key_string(),
'public' => $rsa->get_public_key_x509_string(),
);
if ($password) {
my $pem = Convert::PEM->new(
Name => 'RSA PRIVATE KEY',
ASN => qq(
RSAPrivateKey SEQUENCE {
version INTEGER,
n INTEGER,
e INTEGER,
d INTEGER,
p INTEGER,
q INTEGER,
dp INTEGER,
dq INTEGER,
iqmp INTEGER
}
)
);
my %param = ();
$param{Content} = $keys->{private};
$param{Content} = $pem->decode(%param);
$param{Password} = $password;
$keys->{private} = $pem->encode(%param);
}
return $keys;
}
##@method public void sendJSONResponse(string content)
# Write to standard output a complete HTTP response, in JSON format
# @param $content The content to sent
# @return Void
sub sendJSONResponse {
my ( $self, $content ) = splice @_;
my $json = new JSON();
$json->canonical();
my $json_content = '';
# All systems do not have the most recent JSON version.
# We should take care of version 1 (RedHat 5) and version 2 (Debian 5).
if ( $JSON::VERSION lt 2 ) {
local $JSON::UTF8 = 1;
$json_content = $json->objToJson( [$content] );
$json_content =~ s/^\[//;
$json_content =~ s/\]$//;
}
else {
$json = $json->allow_nonref( ['1'] );
$json = $json->utf8( ['1'] );
$json_content = $json->encode($content);
}
my $http_content = '{"status":"OK", "content":' . $json_content . '}';
print $self->header(
-type => 'text/html; charset=utf-8',
-Content_Length => length $http_content
) . $http_content;
}
1;