269 lines
6.5 KiB
Perl
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;
|