mirror of
https://git.proxmox.com/git/proxmox-spamassassin
synced 2025-04-28 12:19:37 +00:00
100 lines
2.8 KiB
Perl
100 lines
2.8 KiB
Perl
package Mail::SpamAssassin::Pyzor::Digest;
|
|
|
|
# Copyright 2018 cPanel, LLC.
|
|
# All rights reserved.
|
|
# http://cpanel.net
|
|
#
|
|
# <@LICENSE>
|
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
# contributor license agreements. See the NOTICE file distributed with
|
|
# this work for additional information regarding copyright ownership.
|
|
# The ASF licenses this file to you under the Apache License, Version 2.0
|
|
# (the "License"); you may not use this file except in compliance with
|
|
# the License. You may obtain a copy of the License at:
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# </@LICENSE>
|
|
#
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
=encoding utf-8
|
|
|
|
=head1 NAME
|
|
|
|
Mail::SpamAssassin::Pyzor::Digest - Pyzor Digest module
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
my $digest = Mail::SpamAssassin::Pyzor::Digest::get( $mime_text );
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
A reimplementation of L<https://github.com/SpamExperts/pyzor/blob/master/pyzor/digest.py>.
|
|
|
|
=cut
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
use Mail::SpamAssassin::Pyzor::Digest::Pieces ();
|
|
use Digest::SHA qw(sha1_hex);
|
|
|
|
our $VERSION = '0.03';
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
=head1 FUNCTIONS
|
|
|
|
=head2 $hex = get( $MSG )
|
|
|
|
This takes an email message in raw MIME text format (i.e., as saved in the
|
|
standard mbox format) and returns the message's Pyzor digest in lower-case
|
|
hexadecimal.
|
|
|
|
The output from this function should normally be identical to that of
|
|
the C<pyzor> script's C<digest> command. It is suitable for use in
|
|
L<Mail::SpamAssassin::Pyzor::Client>'s request methods.
|
|
|
|
=cut
|
|
|
|
sub get {
|
|
my ($pms) = @_;
|
|
return Digest::SHA::sha1_hex( ${ _get_predigest( $pms ) } );
|
|
}
|
|
|
|
# NB: This is called from the test.
|
|
sub _get_predigest { ## no critic qw(RequireArgUnpacking)
|
|
my ($pms) = @_;
|
|
|
|
my $parsed = $pms->get_message();
|
|
|
|
my @lines;
|
|
|
|
my $payloads_ar = Mail::SpamAssassin::Pyzor::Digest::Pieces::digest_payloads($parsed);
|
|
for my $payload (@$payloads_ar) {
|
|
my @p_lines = Mail::SpamAssassin::Pyzor::Digest::Pieces::splitlines($payload);
|
|
for my $line (@p_lines) {
|
|
Mail::SpamAssassin::Pyzor::Digest::Pieces::normalize($line);
|
|
|
|
next if !Mail::SpamAssassin::Pyzor::Digest::Pieces::should_handle_line($line);
|
|
|
|
# Make sure we have an octet string.
|
|
utf8::encode($line) if utf8::is_utf8($line);
|
|
|
|
push @lines, $line;
|
|
}
|
|
}
|
|
|
|
my $digest_sr = Mail::SpamAssassin::Pyzor::Digest::Pieces::assemble_lines( \@lines );
|
|
return $digest_sr;
|
|
}
|
|
|
|
1;
|