#!/usr/bin/perl
# cpanel12 - spamd_dbm_fix                    Copyright(c) 1997-2007 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         ();

print "spamd_db_fix version 2.0 (c) cPanel Inc.\n";

my $installed_version = $Mail::SpamAssassin::VERSION;
my $patches           = {
    '3.002003' => {
        'keyphrase' => 'more pervasive then orignally thought',
        'patch' =>
          'ZGlmZiAtcnUgTWFpbC1TcGFtQXNzYXNzaW4tMy4yLjMub3JpZy9saWIvTWFpbC9TcGFtQXNzYXNzaW4vQmF5ZXNTdG9yZS9EQk0ucG0gTWFpbC1TcGFtQXNzYXNzaW4tMy4yLjMvbGliL01haWwvU3BhbUFzc2Fzc2luL0JheWVzU3RvcmUvREJNLnBtCi0tLSBNYWlsLVNwYW1Bc3Nhc3Npbi0zLjIuMy5vcmlnL2xpYi9NYWlsL1NwYW1Bc3Nhc3Npbi9CYXllc1N0b3JlL0RCTS5wbQkyMDA3LTA4LTA4IDA4OjE5OjA5LjAwMDAwMDAwMCAtMDUwMAorKysgTWFpbC1TcGFtQXNzYXNzaW4tMy4yLjMvbGliL01haWwvU3BhbUFzc2Fzc2luL0JheWVzU3RvcmUvREJNLnBtCTIwMDctMDgtMzEgMTY6MDU6NTYuMDAwMDAwMDAwIC0wNTAwCkBAIC0yNzksNyArMjc5LDExIEBACiAgICAgbXkgJG5hbWUgPSAkcGF0aC4nXycuJGRibmFtZTsKICAgICBteSAkZGJfdmFyID0gJ2RiXycuJGRibmFtZTsKICAgICBkYmcoImJheWVzOiB0aWUtaW5nIHRvIERCIGZpbGUgUi9XICRuYW1lIik7Ci0gICAgdGllICV7JHNlbGYtPnskZGJfdmFyfX0sJHNlbGYtPkRCTV9NT0RVTEUsJG5hbWUsIE9fUkRXUnxPX0NSRUFULAorCisgICAgKCRzZWxmLT5EQk1fTU9EVUxFIGVxICdEQl9GaWxlJykgYW5kCisgICAgICAgICBNYWlsOjpTcGFtQXNzYXNzaW46OlV0aWw6OmF2b2lkX2RiX2ZpbGVfbG9ja2luZ19idWcgKCRuYW1lKTsKKworICAgIHRpZSAleyRzZWxmLT57JGRiX3Zhcn19LCRzZWxmLT5EQk1fTU9EVUxFLCAkbmFtZSwgT19SRFdSfE9fQ1JFQVQsCiAJCSAob2N0KCRtYWluLT57Y29uZn0tPntiYXllc19maWxlX21vZGV9KSAmIDA2NjYpCiAgICAgICAgb3IgZ290byBmYWlsZWRfdG9fdGllOwogICB9CmRpZmYgLXJ1IE1haWwtU3BhbUFzc2Fzc2luLTMuMi4zLm9yaWcvbGliL01haWwvU3BhbUFzc2Fzc2luL0RCQmFzZWRBZGRyTGlzdC5wbSBNYWlsLVNwYW1Bc3Nhc3Npbi0zLjIuMy9saWIvTWFpbC9TcGFtQXNzYXNzaW4vREJCYXNlZEFkZHJMaXN0LnBtCi0tLSBNYWlsLVNwYW1Bc3Nhc3Npbi0zLjIuMy5vcmlnL2xpYi9NYWlsL1NwYW1Bc3Nhc3Npbi9EQkJhc2VkQWRkckxpc3QucG0JMjAwNy0wOC0wOCAwODoxOToxNS4wMDAwMDAwMDAgLTA1MDAKKysrIE1haWwtU3BhbUFzc2Fzc2luLTMuMi4zL2xpYi9NYWlsL1NwYW1Bc3Nhc3Npbi9EQkJhc2VkQWRkckxpc3QucG0JMjAwNy0wOC0zMSAxNjowNTo1Ni4wMDAwMDAwMDAgLTA1MDAKQEAgLTgyLDE1ICs4MiwxOSBAQAogCiAgICAgZGJnKCJhdXRvLXdoaXRlbGlzdDogdGllLWluZyB0byBEQiBmaWxlIG9mIHR5cGUgJGRibV9tb2R1bGUgJG1vZDEgaW4gJHBhdGgiKTsKIAorICAgICgkc2VsZi0+e2lzX2xvY2tlZH0gJiYgJGRibV9tb2R1bGUgZXEgJ0RCX0ZpbGUnKSBhbmQgCisgICAgICAgICAgICBNYWlsOjpTcGFtQXNzYXNzaW46OlV0aWw6OmF2b2lkX2RiX2ZpbGVfbG9ja2luZ19idWcgKCRwYXRoKTsKKwogICAgIGlmICghIHRpZSAleyAkc2VsZi0+e2FjY3VtfSB9LCAkZGJtX21vZHVsZSwgJHBhdGgsICRtb2QyLAotICAgICAgb2N0KCRtYWluLT57Y29uZn0tPnthdXRvX3doaXRlbGlzdF9maWxlX21vZGV9KSApIHsKLSAgICAgICAgbXkgJGVyciA9ICQhOyAgICMgbWlnaHQgZ2V0IG92ZXJ3cml0dGVuIGxhdGVyCi0gICAgICAgIGlmICgkc2VsZi0+e2lzX2xvY2tlZH0pIHsKLSAgICAgICAgICAkc2VsZi0+e21haW59LT57bG9ja2VyfS0+c2FmZV91bmxvY2soJHNlbGYtPntsb2NrZWRfZmlsZX0pOwotICAgICAgICAgICRzZWxmLT57aXNfbG9ja2VkfSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGllICJhdXRvLXdoaXRlbGlzdDogY2Fubm90IG9wZW4gYXV0b193aGl0ZWxpc3RfcGF0aCAkcGF0aDogJGVyclxuIjsKKyAgICAgICAgICAgIG9jdCgkbWFpbi0+e2NvbmZ9LT57YXV0b193aGl0ZWxpc3RfZmlsZV9tb2RlfSkgKQorICAgIHsKKyAgICAgIG15ICRlcnIgPSAkITsgICAjIG1pZ2h0IGdldCBvdmVyd3JpdHRlbiBsYXRlcgorICAgICAgaWYgKCRzZWxmLT57aXNfbG9ja2VkfSkgeworICAgICAgICAkc2VsZi0+e21haW59LT57bG9ja2VyfS0+c2FmZV91bmxvY2soJHNlbGYtPntsb2NrZWRfZmlsZX0pOworICAgICAgICAkc2VsZi0+e2lzX2xvY2tlZH0gPSAwOwogICAgICAgfQorICAgICAgZGllICJhdXRvLXdoaXRlbGlzdDogY2Fubm90IG9wZW4gYXV0b193aGl0ZWxpc3RfcGF0aCAkcGF0aDogJGVyclxuIjsKKyAgICB9CiAgIH0KIAogICBibGVzcyAoJHNlbGYsICRjbGFzcyk7CmRpZmYgLXJ1IE1haWwtU3BhbUFzc2Fzc2luLTMuMi4zLm9yaWcvbGliL01haWwvU3BhbUFzc2Fzc2luL1V0aWwucG0gTWFpbC1TcGFtQXNzYXNzaW4tMy4yLjMvbGliL01haWwvU3BhbUFzc2Fzc2luL1V0aWwucG0KLS0tIE1haWwtU3BhbUFzc2Fzc2luLTMuMi4zLm9yaWcvbGliL01haWwvU3BhbUFzc2Fzc2luL1V0aWwucG0JMjAwNy0wOC0wOCAwODoxOToxNS4wMDAwMDAwMDAgLTA1MDAKKysrIE1haWwtU3BhbUFzc2Fzc2luLTMuMi4zL2xpYi9NYWlsL1NwYW1Bc3Nhc3Npbi9VdGlsLnBtCTIwMDctMDgtMzEgMTY6Mzk6MjQuMDAwMDAwMDAwIC0wNTAwCkBAIC01Nyw2ICs1Nyw3IEBACiAKIHVzZSBDb25maWc7CiB1c2UgRmlsZTo6U3BlYzsKK3VzZSBGaWxlOjpCYXNlbmFtZTsKIHVzZSBUaW1lOjpMb2NhbDsKIHVzZSBTeXM6Okhvc3RuYW1lICgpOyAjIGRvbid0IGltcG9ydCBob3N0bmFtZSgpIGludG8gdGhpcyBuYW1lc3BhY2UhCiB1c2UgRmNudGw7CkBAIC0xNTUxLDYgKzE1NTIsNDMgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKKyMgYnVnIDU2MTI6IHdvcmsgYXJvdW5kIGZvciBidWdzIGluIEJlcmtlbGV5IGRiIDQuMgorIworIyBvbiA0LjIgaGF2aW5nIHRoZSBfX2RiLltEQk5BTUVdIGZpbGUgd2lsbCBjYXVzZSBhbiBsb29wIHRoYXQgd2lsbCBuZXZlciBmaW5pc2gKKyMgb24gNC4zKyB0aGUgbG9vcCB3aWxsIHRpbWVvdXQgYWZ0ZXIgMzAxIG9wZW4gYXR0ZW1wdHMsIGJ1dCB3ZSB3aWxsIHN0aWxsCisjIGJlIHVuYWJsZSB0byBvcGVuIHRoZSBkYXRhYmFzZS4gIFRoaXMgd29ya2Fyb3VuZCBzb2x2ZXMgYm90aCBwcm9ibGVtcy4gCisjCitzdWIgYXZvaWRfZGJfZmlsZV9sb2NraW5nX2J1ZyB7CisgIG15ICRwYXRoID0gc2hpZnQ7CisgIAorICBteSAkZGJfdG1wX2ZpbGUgPSAnX19kYi4nLmJhc2VuYW1lKCRwYXRoKTsKKyAgbXkgJGRiX3RtcF9maWxlX21hdGNoID0gJGRiX3RtcF9maWxlIC4gJy4nOworCisgIG15ICRwYXJlbnRkaXIgPSBkaXJuYW1lKCRwYXRoKTsKKworICAjIFRoZSBkYiBidWcgaXMgYWN0dWFsbHkgbW9yZSBwZXJ2YXNpdmUgdGhlbiBvcmlnbmFsbHkgdGhvdWdodCB3ZSBjYW4gYWxzbyBoYXZlIF9fZGIuW0RCTkFNRV0uKiBhcyB3ZWxsLgorCisgIG9wZW5kaXIobXkgJHNhX2RiX2Rpcl9maCwgJHBhcmVudGRpcik7CisgIHdoaWxlKG15ICR0ZXN0X2ZpbGVuYW1lID0gcmVhZGRpcigkc2FfZGJfZGlyX2ZoKSkgeyAgCisJIyBJZiB0aGUgZmlsZSBpcyBfX2RiLltEQk5BTUVdIG9yIHRoZSBmaWxlIGlzIF9fZGIuW0RCTkFNRV0uKiAoZ2xvYikgdGhlbiB3ZSBuZWVkIHRvIHJlbW92ZSBpdAorCSMgd2UgdXNlIHN1YnN0ciBoZXJlIGFzIGl0cyBzbGlnaHRseSBmYXRlciB0aGVuIHVzaW5nIGEgcmVnZXggCisKKwlteSAkbmV3dGVzdCA9IHN1YnN0cigkdGVzdF9maWxlbmFtZSwwLGxlbmd0aCgkZGJfdG1wX2ZpbGVfbWF0Y2gpKTsKKworCWlmICggc3Vic3RyKCR0ZXN0X2ZpbGVuYW1lLDAsbGVuZ3RoKCRkYl90bXBfZmlsZV9tYXRjaCkpIGVxICRkYl90bXBfZmlsZV9tYXRjaCB8fCAkdGVzdF9maWxlbmFtZSBlcSAkZGJfdG1wX2ZpbGUgKSB7CisJCW15ICRkYl90bXBmaWxlID0gdW50YWludF9maWxlX3BhdGgoIEZpbGU6OlNwZWMtPmNhdGZpbGUoJHBhcmVudGRpciwkdGVzdF9maWxlbmFtZSkgKTsKKwkJCisJCWRiZygiQmVya2VsZXkgREIgYnVnIHdvcmstYXJvdW5kOiBjbGVhbmluZyB0bXAgZmlsZSAkZGJfdG1wZmlsZSIpOworCQlpZiAoIXVubGluaygkZGJfdG1wZmlsZSkpIHsKKwkJCWRpZSAiY2Fubm90IHJlbW92ZSBCZXJrZWxleSBEQiB0bXAgZmlsZSAkZGJfdG1wZmlsZTogJCFcbiI7CisJCX0KKwl9CisgIH0KKyAgY2xvc2VkaXIoJHNhX2RiX2Rpcl9maCk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiAxOwogCiA9YmFjawo=',
        'strip' => 4
    }
};

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 $util_src;
        open( my $util_fh, '<', 'Util.pm' );
        {
            local $/;
            $util_src = readline($util_fh);
        }
        close($util_fh);

        my $keyphrase = $patches->{$installed_version}->{'keyphrase'};

        if ( $util_src =~ /$keyphrase/ ) {
            print "Patch already applied!\n\n";
            exit 0;
        }

        system '/scripts/perlinstaller', '--force', 'Mail::SpamAssassin';

        my $collasped_installed_version = $installed_version;
        $collasped_installed_version =~ s/0//g;

        print "Installed Version: $installed_version -- $collasped_installed_version\n";

        my $version = `perl -MMail::SpamAssassin -e 'print \$Mail::SpamAssassin::VERSION;'`;
        if ( $version ne $collasped_installed_version && $version ne $installed_version ) {
            print "The version changed when we forced an update.  The patch may already be applied!\n";
            exit 1;
        }

        chdir $module_path || die "Could not chdir to $module_path";
        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 );

        if ( $ENV{'WHM50'} ) {
            print qq{
            <script> alert('Patch Complete. Restarting Exim & Spamd'); window.location.href = '/scripts/resexim?confirm=1'; </script>
        };
        }
        else {
            system( '/scripts/restartsrv', 'exim' );
        }
    }
}
