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. # # 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. =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 script's C command. It is suitable for use in L'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;