#-*- perl -*-
#
# Copyright (C) 2006 Ken'ichi Fukamachi
# All rights reserved. This program is free software; you can
# redistribute it and/or modify it under the same terms as Perl itself.
#
# $FML: Body.pm,v 1.6 2006/10/22 13:52:46 fukachan Exp $
#
package FML::Body;
use strict;
use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
use Carp;
=head1 NAME
FML::Body - operations for mail body.
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 METHODS
=head2 new()
constructor.
=cut
# Descriptions: constructor
# Arguments: OBJ($self) OBJ($curproc)
# Side Effects: none
# Return Value: OBJ
sub new
{
my ($self, $curproc) = @_;
my ($type) = ref($self) || $self;
my $me = { _curproc => $curproc };
return bless $me, $type;
}
# Descriptions: checksum of mail body part.
# return 1 if the same checksum is found in the database.
# Arguments: OBJ($self) OBJ($config)
# Side Effects: update database.
# Return Value: NUM
sub check_body_checksum
{
my ($self, $config) = @_;
my $curproc = $self->{ _curproc };
my $body_file = $curproc->incoming_message_print_body_as_file();
# calculate checksum of $body_file.
use Mail::Message::Checksum;
my $cksum = new Mail::Message::Checksum;
my $md5 = $cksum->md5_file($body_file);
# compare md5 value with the checksum database.
my $retval = 0;
my $db_dir = $config->{ incoming_mail_body_checksum_cache_dir };
my $db = $self->db_open( { directory => $db_dir } );
if (defined $db) {
if ($db->{ $md5 }) {
$retval = 1;
}
else {
$db->{ $md5 } = time;
$retval = 0;
}
$self->db_close();
}
return $retval;
}
=head1 DATABASE
=head2 db_open($db_args)
open database (journalized db).
=head2 db_close($db_args)
dummy.
=cut
# Descriptions: open database.
# Arguments: OBJ($self) HASH_REF($db_args)
# Side Effects: open database.
# Return Value: HASH_ERF
sub db_open
{
my ($self, $db_args) = @_;
my $dir = $db_args->{ 'directory' } || '';
my $mode = 'temporal';
my $days = 14;
if ($dir) {
unless (-d $dir) {
# XXX-TODO: dir_mode is hard-coded ?
my $dir_mode = $self->{ _dir_mode } || 0700;
use File::Path;
mkpath( [ $dir ], 0, $dir_mode );
}
my %db = ();
use Tie::JournaledDir;
tie %db, 'Tie::JournaledDir', { dir => $dir };
$self->{ _db } = \%db;
return \%db;
}
else {
my $curproc = $self->{ _curproc };
$curproc->logerror("FML::Body: db_open: directory unspecified");
}
return undef;
}
# Descriptions: dummy.
# Arguments: OBJ($self)
# Side Effects: none
# Return Value: none
sub db_close
{
;
}
=head1 ACCESS METHODS
=head2 set_checksum_type($type)
set checksum method type.
=head2 get_checksum_type()
get checksum method type.
return 'md5' by default.
=cut
my $global_default_checksum_type = 'md5';
# Descriptions: set checksum method type.
# Arguments: OBJ($self) STR($type)
# Side Effects: update $self
# Return Value: none
sub set_checksum_type
{
my ($self, $type) = @_;
if ($type eq 'md5') {
$self->{ _type } = $type;
}
else {
my $curproc = $self->{ _curproc };
$curproc->logerror("FML::Body: unsupported checksum: $type");
}
}
# Descriptions: return checksum method type.
# Arguments: OBJ($self)
# Side Effects: none
# Return Value: STR
sub get_checksum_type
{
my ($self) = @_;
return( $self->{ _type } || $global_default_checksum_type );
}
=head1 CODING STYLE
See C on fml coding style guide.
=head1 AUTHOR
Ken'ichi Fukamachi
=head1 COPYRIGHT
Copyright (C) 2006 Ken'ichi Fukamachi
All rights reserved. This program is free software; you can
redistribute it and/or modify it under the same terms as Perl itself.
=head1 HISTORY
FML::Body appeared in fml8 mailing list driver package.
See C for more details.
=cut
1;