#!/usr/bin/perl
# cpanel12 - spamd_dbm_fix                    Copyright(c) 1997-2011 cPanel, Inc.
#                                                           All Rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
#
# Licensed 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 Mail::SpamAssassin ();
use MIME::Base64       ();
use IPC::Open3         ();

my $installed_version = $Mail::SpamAssassin::VERSION;
my $patches           = {
    '3.002003' => {
        'patch' =>
          'LS0tIGxpYi9NYWlsL1NwYW1Bc3Nhc3Npbi9EQkJhc2VkQWRkckxpc3QucG0ub3JpZwkyMDA3LTA4LTE5IDEzOjM0OjA3LjAwMDAwMDAwMCAtMDUwMAorKysgbGliL01haWwvU3BhbUFzc2Fzc2luL0RCQmFzZWRBZGRyTGlzdC5wbQkyMDA3LTA4LTE5IDE0OjA1OjM3LjAwMDAwMDAwMCAtMDUwMApAQCAtMjEsNiArMjEsOCBAQAogdXNlIHdhcm5pbmdzOwogdXNlIGJ5dGVzOwogdXNlIEZjbnRsOwordXNlIEZpbGU6OlNwZWM7Cit1c2UgRmlsZTo6QmFzZW5hbWU7CiAKIHVzZSBNYWlsOjpTcGFtQXNzYXNzaW46OlBlcnNpc3RlbnRBZGRyTGlzdDsKIHVzZSBNYWlsOjpTcGFtQXNzYXNzaW46OlV0aWw7CkBAIC03NCw2ICs3NiwyNCBAQAogICAgICAgJHNlbGYtPntsb2NrZWRfZmlsZX0gPSAkcGF0aDsKICAgICAgICRzZWxmLT57aXNfbG9ja2VkfSAgID0gMTsKICAgICAgICgkbW9kMSwgJG1vZDIpID0gKCdSL1cnLCBPX1JEV1IgfCBPX0NSRUFUKTsKKwkKKyAgICAgICMgVGhpcyBpcyBhIHdvcmsgYXJvdW5kIGZvciBidWdzIGluIGJlcmtsZXkgZGIgNC4yCisgICAgICAjIG9uIDQuMiBoYXZpbmcgdGhlIF9fZGIuW0RCTkFNRV0gZmlsZSB3aWxsIGNhdXNlIGFuIGxvb3AgdGhhdCB3aWxsIG5ldmVyIGZpbmlzaAorICAgICAgIyBvbiA0LjMrIHRoZSBsb29wIHdpbGwgdGltZW91dCBhZnRlciAzMDEgb3BlbiBhdHRlbXB0cywgYnV0IHdlIHdpbGwgc3RpbGwgYmUgdW5hYmxlIHRvIG9wZW4gCisgICAgICAjIHRoZSBkYXRhYmFzZS4gIFRoaXMgd29yayBhcm91bmQgc29sdmVzIGJvdGggcHJvYmxlbXMuIAorICAgICAgaWYgKCRkYm1fbW9kdWxlIGVxICdEQl9GaWxlJykgeworCSAgICAgIG15ICRwYXJlbnRkaXIgPSBGaWxlOjpCYXNlbmFtZTo6ZGlybmFtZSgkcGF0aCk7CisKKwkgICAgICBteSAkZGJfdG1wZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHBhcmVudGRpciwnX19kYi4nIC4gRmlsZTo6QmFzZW5hbWU6OmJhc2VuYW1lKCRwYXRoKSk7CisJICAgICAgZGJnKCJhdXRvLXdoaXRlbGlzdDogQmVya2xleSBEQiBidWcgd29yay1hcm91bmQ6IGNsZWFuaW5nIHRtcCBmaWxlICRkYl90bXBmaWxlIik7CisKKwkgICAgICBpZiAoIC1lICRkYl90bXBmaWxlICkgeworCQkgICAgICBpZiAoICEgdW5saW5rKCRkYl90bXBmaWxlKSApIHsKKwkJCSAgICAgIGRpZSAnYXV0by13aGl0ZWxpc3Q6IGNhbm5vdCByZW1vdmUgJyAuICRkYl90bXBmaWxlIC4gJzogJyAuICQhIC4gIlxuIjsKKwkJICAgICAgfQorCSAgICAgIH0KKyAgICAgIH0KKwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICRzZWxmLT57aXNfbG9ja2VkfSA9IDA7Ci0tLSBsaWIvTWFpbC9TcGFtQXNzYXNzaW4vQmF5ZXNTdG9yZS9EQk0ucG0ub3JpZwkyMDA3LTA4LTE5IDEzOjM4OjM2LjAwMDAwMDAwMCAtMDUwMAorKysgbGliL01haWwvU3BhbUFzc2Fzc2luL0JheWVzU3RvcmUvREJNLnBtCTIwMDctMDgtMTkgMTQ6MTE6MDUuMDAwMDAwMDAwIC0wNTAwCkBAIC0yNzYsNiArMjc4LDIyIEBACiAKICAgbXkgJHVtYXNrID0gdW1hc2sgMDsKICAgZm9yZWFjaCBteSAkZGJuYW1lIChAREJOQU1FUykgeworCisgICAgIyBUaGlzIGlzIGEgd29yayBhcm91bmQgZm9yIGJ1Z3MgaW4gYmVya2xleSBkYiA0LjIKKyAgICAjIG9uIDQuMiBoYXZpbmcgdGhlIF9fZGIuW0RCTkFNRV0gZmlsZSB3aWxsIGNhdXNlIGFuIGxvb3AgdGhhdCB3aWxsIG5ldmVyIGZpbmlzaAorICAgICMgb24gNC4zKyB0aGUgbG9vcCB3aWxsIHRpbWVvdXQgYWZ0ZXIgMzAxIG9wZW4gYXR0ZW1wdHMsIGJ1dCB3ZSB3aWxsIHN0aWxsIGJlIHVuYWJsZSB0byBvcGVuIAorICAgICMgdGhlIGRhdGFiYXNlLiAgVGhpcyB3b3JrIGFyb3VuZCBzb2x2ZXMgYm90aCBwcm9ibGVtcy4gCisgICAgaWYgKCAkc2VsZi0+REJNX01PRFVMRSBlcSAnREJfRmlsZScgKSB7CisgICAgCSAgICBteSAkZGJfdG1wZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHBhcmVudGRpciwnX19kYi4nIC4gRmlsZTo6QmFzZW5hbWU6OmJhc2VuYW1lKCRwYXRoKSAuICdfJyAuICRkYm5hbWUpOworCSAgICBkYmcoImJheWVzOiBCZXJrbGV5IERCIGJ1ZyB3b3JrLWFyb3VuZDogY2xlYW5pbmcgdG1wIGZpbGUgJGRiX3RtcGZpbGUiKTsKKwkgICAgaWYgKCAtZSAkZGJfdG1wZmlsZSkgeworCQkgICAgaWYgKCAhIHVubGluaygkZGJfdG1wZmlsZSkgKSB7CisJCQkgICAgd2FybiAnYmF5ZXM6IGNhbm5vdCByZW1vdmUgJyAuICRkYl90bXBmaWxlIC4gJzogJyAuICQhIC4gIlxuIjsKKwkJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkgICAgfQorICAgIH0KKwogICAgIG15ICRuYW1lID0gJHBhdGguJ18nLiRkYm5hbWU7CiAgICAgbXkgJGRiX3ZhciA9ICdkYl8nLiRkYm5hbWU7CiAgICAgZGJnKCJiYXllczogdGllLWluZyB0byBEQiBmaWxlIFIvVyAkbmFtZSIpOwo=',
        'strip' => 3
    }
};

if ( $patches->{$installed_version} ) {
    my $patch_data  = MIME::Base64::decode_base64( $patches->{$installed_version}->{'patch'} );
    my $patch_strip = $patches->{$installed_version}->{'strip'};

    my $module_path = $INC{'Mail/SpamAssassin.pm'};
    $module_path =~ s/\.pm$//g;

    if ( $module_path && $module_path ne '' && -d $module_path ) {
        chdir $module_path || die "Could not chdir to $module_path";
        print "Patching SpamAssassin in $module_path\n";
        my $pid = IPC::Open3::open3(
            my $wtr_fh, ">&STDOUT", ">&STDERR", 'patch', '-N',
            '-t',       '-p' . $patch_strip
        );
        print {$wtr_fh} $patch_data;
        close($wtr_fh);
        waitpid( $pid, 0 );

        print qq{
            <script> alert('Patch Complete. Restarting Exim & Spamd'); window.location.href = '/scripts/resexim?confirm=1'; </script>
        };
    }
}
