diff options
| author | fukachan <fukachan> | 2006-05-13 11:45:40 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2006-05-13 11:45:40 +0000 |
| commit | e910a4f5d2e95a96b3fdac9b089fe32c3ebb0a16 (patch) | |
| tree | b9f853edb485c521d6cbc23058fd15e263c68549 /fml/lib/FML/Body.pm | |
| parent | 4480917b1d0080b6d32dc6bd502945e596db0ba5 (diff) | |
| download | fml8-e910a4f5d2e95a96b3fdac9b089fe32c3ebb0a16.tar.gz fml8-e910a4f5d2e95a96b3fdac9b089fe32c3ebb0a16.tar.bz2 fml8-e910a4f5d2e95a96b3fdac9b089fe32c3ebb0a16.zip | |
enable body based loop check
Diffstat (limited to 'fml/lib/FML/Body.pm')
| -rw-r--r-- | fml/lib/FML/Body.pm | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/fml/lib/FML/Body.pm b/fml/lib/FML/Body.pm new file mode 100644 index 00000000..97b05e3a --- /dev/null +++ b/fml/lib/FML/Body.pm @@ -0,0 +1,200 @@ +#-*- 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: @template.pm,v 1.10 2006/01/07 13:16:41 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; + } + + return undef; +} + + +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) = @_; + my $curproc = $self->{ _curproc }; + + if ($type eq 'md5') { + $self->{ _type } = $type; + } + else { + $curproc->logerror("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<http://www.fml.org/software/FNF/> 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<http://www.fml.org/> for more details. + +=cut + + +1; |
