Files
scripts/Perl OTRS/Kernel/Modules/AdminPGP.pm
2024-10-14 00:08:40 +02:00

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;