Files
2024-10-14 00:08:40 +02:00

269 lines
6.5 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::System::Web::UploadCache::DB;
use strict;
use warnings;
use MIME::Base64;
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::DB',
'Kernel::System::Encode',
'Kernel::System::Log',
'Kernel::System::Main',
);
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {};
bless( $Self, $Type );
return $Self;
}
sub FormIDCreate {
my ( $Self, %Param ) = @_;
# return requested form id
return time() . '.' . rand(12341241);
}
sub FormIDRemove {
my ( $Self, %Param ) = @_;
for (qw(FormID)) {
if ( !$Param{$_} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $_!"
);
return;
}
}
return if !$Kernel::OM->Get('Kernel::System::DB')->Do(
SQL => '
DELETE FROM web_upload_cache
WHERE form_id = ?',
Bind => [ \$Param{FormID} ],
);
return 1;
}
sub FormIDAddFile {
my ( $Self, %Param ) = @_;
for (qw(FormID Filename ContentType)) {
if ( !$Param{$_} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $_!"
);
return;
}
}
$Param{Content} = '' if !defined( $Param{Content} );
# get file size
$Param{Filesize} = bytes::length( $Param{Content} );
# get database object
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
# encode attachment if it's a postgresql backend!!!
if ( !$DBObject->GetDatabaseFunction('DirectBlob') ) {
$Kernel::OM->Get('Kernel::System::Encode')->EncodeOutput( \$Param{Content} );
$Param{Content} = encode_base64( $Param{Content} );
}
# create content id
my $ContentID = $Param{ContentID};
my $Disposition = $Param{Disposition} || '';
if ( !$ContentID && lc $Disposition eq 'inline' ) {
my $Random = rand 999999;
my $FQDN = $Kernel::OM->Get('Kernel::Config')->Get('FQDN');
$ContentID = "$Disposition$Random.$Param{FormID}\@$FQDN";
}
# write attachment to db
my $Time = time();
return if !$DBObject->Do(
SQL => '
INSERT INTO web_upload_cache (form_id, filename, content_type, content_size, content,
create_time_unix, content_id, disposition)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
Bind => [
\$Param{FormID}, \$Param{Filename}, \$Param{ContentType}, \$Param{Filesize},
\$Param{Content}, \$Time, \$ContentID, \$Param{Disposition}
],
);
return 1;
}
sub FormIDRemoveFile {
my ( $Self, %Param ) = @_;
for (qw(FormID FileID)) {
if ( !$Param{$_} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $_!"
);
return;
}
}
my @Index = @{ $Self->FormIDGetAllFilesMeta(%Param) };
# finish if files have been already removed by other process
return if !@Index;
my $ID = $Param{FileID} - 1;
$Param{Filename} = $Index[$ID]->{Filename};
return if !$Kernel::OM->Get('Kernel::System::DB')->Do(
SQL => '
DELETE FROM web_upload_cache
WHERE form_id = ?
AND filename = ?',
Bind => [ \$Param{FormID}, \$Param{Filename} ],
);
return 1;
}
sub FormIDGetAllFilesData {
my ( $Self, %Param ) = @_;
my $Counter = 0;
my @Data;
for (qw(FormID)) {
if ( !$Param{$_} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $_!"
);
return;
}
}
# get database object
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
$DBObject->Prepare(
SQL => '
SELECT filename, content_type, content_size, content, content_id, disposition
FROM web_upload_cache
WHERE form_id = ?
ORDER BY create_time_unix',
Bind => [ \$Param{FormID} ],
Encode => [ 1, 1, 1, 0, 1, 1 ],
);
while ( my @Row = $DBObject->FetchrowArray() ) {
$Counter++;
# encode attachment if it's a postgresql backend!!!
if ( !$DBObject->GetDatabaseFunction('DirectBlob') ) {
$Row[3] = decode_base64( $Row[3] );
}
# add the info
push(
@Data,
{
Content => $Row[3],
ContentID => $Row[4],
ContentType => $Row[1],
Filename => $Row[0],
Filesize => $Row[2],
Disposition => $Row[5],
FileID => $Counter,
}
);
}
return \@Data;
}
sub FormIDGetAllFilesMeta {
my ( $Self, %Param ) = @_;
my $Counter = 0;
my @Data;
for (qw(FormID)) {
if ( !$Param{$_} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $_!"
);
return;
}
}
# get database object
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
$DBObject->Prepare(
SQL => '
SELECT filename, content_type, content_size, content_id, disposition
FROM web_upload_cache
WHERE form_id = ?
ORDER BY create_time_unix',
Bind => [ \$Param{FormID} ],
);
while ( my @Row = $DBObject->FetchrowArray() ) {
$Counter++;
# add the info
push(
@Data,
{
ContentID => $Row[3],
ContentType => $Row[1],
Filename => $Row[0],
Filesize => $Row[2],
Disposition => $Row[4],
FileID => $Counter,
}
);
}
return \@Data;
}
sub FormIDCleanUp {
my ( $Self, %Param ) = @_;
my $CurrentTile = time() - ( 60 * 60 * 24 * 1 );
return if !$Kernel::OM->Get('Kernel::System::DB')->Do(
SQL => '
DELETE FROM web_upload_cache
WHERE create_time_unix < ?',
Bind => [ \$CurrentTile ],
);
return 1;
}
1;