390 lines
12 KiB
Perl
390 lines
12 KiB
Perl
# --
|
|
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
|
# --
|
|
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
|
# the enclosed file COPYING for license information (GPL). If you
|
|
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
|
# --
|
|
|
|
package Kernel::Modules::AdminPGP;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
our $ObjectManagerDisabled = 1;
|
|
|
|
use Kernel::Language qw(Translatable);
|
|
|
|
sub new {
|
|
my ( $Type, %Param ) = @_;
|
|
|
|
# allocate new hash for object
|
|
my $Self = {%Param};
|
|
bless( $Self, $Type );
|
|
|
|
return $Self;
|
|
}
|
|
|
|
sub Run {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# get layout objects
|
|
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
|
|
|
# ------------------------------------------------------------ #
|
|
# check if feature is active
|
|
# ------------------------------------------------------------ #
|
|
if ( !$Kernel::OM->Get('Kernel::Config')->Get('PGP') ) {
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
|
|
$LayoutObject->Block( Name => 'Overview' );
|
|
$LayoutObject->Block( Name => 'Notice' );
|
|
$LayoutObject->Block( Name => 'Disabled' );
|
|
$LayoutObject->Block( Name => 'OverviewResult' );
|
|
$LayoutObject->Block(
|
|
Name => 'NoDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
|
|
$Output .= $LayoutObject->Output( TemplateFile => 'AdminPGP' );
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# get PGP object
|
|
my $PGPObject = $Kernel::OM->Get('Kernel::System::Crypt::PGP');
|
|
|
|
if ( !$PGPObject ) {
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
|
|
$Output .= $LayoutObject->Notify(
|
|
Priority => 'Error',
|
|
Info => Translatable('PGP environment is not working. Please check log for more info!'),
|
|
Link => $LayoutObject->{Baselink} . 'Action=AdminLog',
|
|
);
|
|
|
|
$LayoutObject->Block( Name => 'Overview' );
|
|
$LayoutObject->Block( Name => 'Notice' );
|
|
$LayoutObject->Block( Name => 'NotWorking' );
|
|
$LayoutObject->Block( Name => 'OverviewResult' );
|
|
$LayoutObject->Block(
|
|
Name => 'NoDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AdminPGP',
|
|
);
|
|
|
|
$Output .= $LayoutObject->Footer();
|
|
|
|
return $Output;
|
|
}
|
|
|
|
# get param object
|
|
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
|
|
|
|
$Param{Search} = $ParamObject->GetParam( Param => 'Search' );
|
|
if ( !defined( $Param{Search} ) ) {
|
|
$Param{Search} = $Self->{PGPSearch} || '';
|
|
}
|
|
if ( $Self->{Subaction} eq '' ) {
|
|
$Param{Search} = '';
|
|
}
|
|
|
|
# get session object
|
|
my $SessionObject = $Kernel::OM->Get('Kernel::System::AuthSession');
|
|
|
|
$SessionObject->UpdateSessionID(
|
|
SessionID => $Self->{SessionID},
|
|
Key => 'PGPSearch',
|
|
Value => $Param{Search},
|
|
);
|
|
|
|
# ------------------------------------------------------------ #
|
|
# delete key
|
|
# ------------------------------------------------------------ #
|
|
if ( $Self->{Subaction} eq 'Delete' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
$LayoutObject->Block( Name => 'Overview' );
|
|
$LayoutObject->Block( Name => 'ActionList' );
|
|
$LayoutObject->Block( Name => 'ActionSearch' );
|
|
$LayoutObject->Block( Name => 'ActionAdd' );
|
|
$LayoutObject->Block( Name => 'Hint' );
|
|
$LayoutObject->Block( Name => 'OverviewResult' );
|
|
|
|
my $Key = $ParamObject->GetParam( Param => 'Key' ) || '';
|
|
my $Type = $ParamObject->GetParam( Param => 'Type' ) || '';
|
|
if ( !$Key ) {
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('Need param Key to delete!'),
|
|
);
|
|
}
|
|
my $Success = '';
|
|
if ( $Type eq 'sec' ) {
|
|
$Success = $PGPObject->SecretKeyDelete( Key => $Key );
|
|
}
|
|
else {
|
|
$Success = $PGPObject->PublicKeyDelete( Key => $Key );
|
|
}
|
|
my @List = $PGPObject->KeySearch( Search => $Param{Search} );
|
|
if (@List) {
|
|
for my $Key (@List) {
|
|
$LayoutObject->Block(
|
|
Name => 'Row',
|
|
Data => { %{$Key} },
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'NoDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
}
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
my $Message = '';
|
|
if ($Success) {
|
|
$Message = $LayoutObject->{LanguageObject}->Translate( 'Key %s deleted!', $Key );
|
|
}
|
|
else {
|
|
$Message = $Kernel::OM->Get('Kernel::System::Log')->GetLogEntry(
|
|
Type => 'Error',
|
|
What => 'Message',
|
|
);
|
|
}
|
|
$Output .= $LayoutObject->Notify( Info => $Message );
|
|
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AdminPGP',
|
|
Data => \%Param
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
return $Output;
|
|
}
|
|
|
|
# ------------------------------------------------------------ #
|
|
# add key (form)
|
|
# ------------------------------------------------------------ #
|
|
elsif ( $Self->{Subaction} eq 'Add' ) {
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
|
|
$LayoutObject->Block(
|
|
Name => 'Overview',
|
|
Data => {
|
|
Subaction => 'Add',
|
|
},
|
|
);
|
|
$LayoutObject->Block( Name => 'ActionList' );
|
|
$LayoutObject->Block( Name => 'ActionOverview' );
|
|
$LayoutObject->Block( Name => 'AddKey' );
|
|
|
|
$Output .= $LayoutObject->Output( TemplateFile => 'AdminPGP' );
|
|
$Output .= $LayoutObject->Footer();
|
|
return $Output;
|
|
}
|
|
|
|
# ------------------------------------------------------------ #
|
|
# add key
|
|
# ------------------------------------------------------------ #
|
|
elsif ( $Self->{Subaction} eq 'AddKey' ) {
|
|
|
|
my %Errors;
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
$SessionObject->UpdateSessionID(
|
|
SessionID => $Self->{SessionID},
|
|
Key => 'PGPSearch',
|
|
Value => '',
|
|
);
|
|
my %UploadStuff = $ParamObject->GetUploadAll(
|
|
Param => 'FileUpload',
|
|
);
|
|
if ( !%UploadStuff ) {
|
|
$Errors{FileUploadInvalid} = 'ServerError';
|
|
}
|
|
|
|
# if no errors occurred
|
|
if ( !%Errors ) {
|
|
|
|
# add pgp key
|
|
my $KeyAdd = $PGPObject->KeyAdd( Key => $UploadStuff{Content} );
|
|
|
|
if ($KeyAdd) {
|
|
$LayoutObject->Block( Name => 'Overview' );
|
|
$LayoutObject->Block( Name => 'ActionList' );
|
|
$LayoutObject->Block( Name => 'ActionSearch' );
|
|
$LayoutObject->Block( Name => 'ActionAdd' );
|
|
$LayoutObject->Block( Name => 'OverviewResult' );
|
|
|
|
my @List = $PGPObject->KeySearch( Search => '' );
|
|
if (@List) {
|
|
for my $Key (@List) {
|
|
$LayoutObject->Block(
|
|
Name => 'Row',
|
|
Data => { %{$Key} },
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'NoDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $LayoutObject->Notify( Info => $KeyAdd );
|
|
|
|
$Output .= $LayoutObject->Output( TemplateFile => 'AdminPGP' );
|
|
$Output .= $LayoutObject->Footer();
|
|
return $Output;
|
|
}
|
|
}
|
|
|
|
# something went wrong
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
$Output .= $LayoutObject->Notify( Priority => 'Error' );
|
|
$LayoutObject->Block( Name => 'Overview' );
|
|
$LayoutObject->Block( Name => 'ActionList' );
|
|
$LayoutObject->Block( Name => 'ActionOverview' );
|
|
$LayoutObject->Block(
|
|
Name => 'AddKey',
|
|
Data => \%Errors,
|
|
);
|
|
$Output .= $LayoutObject->Output( TemplateFile => 'AdminPGP' );
|
|
$Output .= $LayoutObject->Footer();
|
|
return $Output;
|
|
}
|
|
|
|
# ------------------------------------------------------------ #
|
|
# download key
|
|
# ------------------------------------------------------------ #
|
|
elsif ( $Self->{Subaction} eq 'Download' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
my $Key = $ParamObject->GetParam( Param => 'Key' ) || '';
|
|
my $Type = $ParamObject->GetParam( Param => 'Type' ) || '';
|
|
if ( !$Key ) {
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('Need param Key to download!'),
|
|
);
|
|
}
|
|
my $KeyString = '';
|
|
if ( $Type eq 'sec' ) {
|
|
$KeyString = $PGPObject->SecretKeyGet( Key => $Key );
|
|
}
|
|
else {
|
|
$KeyString = $PGPObject->PublicKeyGet( Key => $Key );
|
|
}
|
|
return $LayoutObject->Attachment(
|
|
ContentType => 'text/plain',
|
|
Content => $KeyString,
|
|
Filename => "$Key.asc",
|
|
Type => 'attachment',
|
|
);
|
|
}
|
|
|
|
# ------------------------------------------------------------ #
|
|
# download fingerprint
|
|
# ------------------------------------------------------------ #
|
|
elsif ( $Self->{Subaction} eq 'DownloadFingerprint' ) {
|
|
|
|
# challenge token check for write action
|
|
$LayoutObject->ChallengeTokenCheck();
|
|
|
|
my $Key = $ParamObject->GetParam( Param => 'Key' ) || '';
|
|
my $Type = $ParamObject->GetParam( Param => 'Type' ) || '';
|
|
if ( !$Key ) {
|
|
return $LayoutObject->ErrorScreen(
|
|
Message => Translatable('Need param Key to download!'),
|
|
);
|
|
}
|
|
my $Download = '';
|
|
if ( $Type eq 'sec' ) {
|
|
my @Result = $PGPObject->PrivateKeySearch( Search => $Key );
|
|
if ( $Result[0] ) {
|
|
$Download = $Result[0]->{Fingerprint};
|
|
}
|
|
}
|
|
else {
|
|
my @Result = $PGPObject->PublicKeySearch( Search => $Key );
|
|
if ( $Result[0] ) {
|
|
$Download = $Result[0]->{Fingerprint};
|
|
}
|
|
}
|
|
return $LayoutObject->Attachment(
|
|
ContentType => 'text/plain',
|
|
Content => $Download,
|
|
Filename => "$Key.txt",
|
|
Type => 'attachment',
|
|
);
|
|
}
|
|
|
|
# ------------------------------------------------------------ #
|
|
# search key
|
|
# ------------------------------------------------------------ #
|
|
else {
|
|
|
|
my $Output = $LayoutObject->Header();
|
|
$Output .= $LayoutObject->NavigationBar();
|
|
|
|
$LayoutObject->Block( Name => 'Overview' );
|
|
$LayoutObject->Block( Name => 'ActionList' );
|
|
$LayoutObject->Block( Name => 'ActionSearch' );
|
|
$LayoutObject->Block( Name => 'ActionAdd' );
|
|
$LayoutObject->Block( Name => 'Hint' );
|
|
$LayoutObject->Block( Name => 'OverviewResult' );
|
|
|
|
my @List = ();
|
|
if ($PGPObject) {
|
|
@List = $PGPObject->KeySearch( Search => $Param{Search} );
|
|
}
|
|
if (@List) {
|
|
for my $Key (@List) {
|
|
$LayoutObject->Block(
|
|
Name => 'Row',
|
|
Data => { %{$Key} },
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
$LayoutObject->Block(
|
|
Name => 'NoDataFoundMsg',
|
|
Data => {},
|
|
);
|
|
}
|
|
|
|
if ( $PGPObject && $PGPObject->Check() ) {
|
|
$Output .= $LayoutObject->Notify(
|
|
Priority => 'Error',
|
|
Data => $LayoutObject->{LanguageObject}->Translate( $PGPObject->Check() ),
|
|
);
|
|
}
|
|
$Output .= $LayoutObject->Output(
|
|
TemplateFile => 'AdminPGP',
|
|
Data => \%Param
|
|
);
|
|
$Output .= $LayoutObject->Footer();
|
|
return $Output;
|
|
}
|
|
}
|
|
|
|
1;
|