#!@PERL@

use strict;
use warnings;
use CGI qw(:standard -utf8);

use lib '@CGIBINDIR@';
use civs_common;
use mail;

my $civs_supervisor = '@SUPERVISOR@';

my $address = param("address");

print CGI::header(-charset => 'utf-8');

if (!CheckAddr($address)) {
    print start_html(), p("Illegal mail address <$address>"), end_html();
    exit 0;
}

&AcquireGlobalLock;

my $code = param('code');
my $optouts = &GetOptouts();
my $opted_out = &HasOptOuts($optouts, $address);
my $filter_pattern = param('filter_pattern');

if (!defined($filter_pattern)) { $filter_pattern = '' }

if (defined(param("check")) && param("check") eq "true") {
   if ($opted_out) { print 1 }
   else { print 0 }
   exit 0
}

sub DeactivationCode {
    my ($address) = @_;
    $address = &CanonicalizeAddr($address);
    if (!defined($private_host_id)) {
        &GetPrivateHostID;
    }
    return civs_hash('deactivation', $address, $private_host_id);
}

if (!defined($code)) {
# This is a request to send a code

    &ReleaseGlobalLock;

    print start_html(), h2("Deactivation request");

    if ($opted_out) {
        print p($tx->cant_send_email);
        exit 0;
    }

    my $code = &DeactivationCode($address);

    if ("@LOCALDEBUG@") {
        print pre("Would email deactivation code $code to $address at this point.")
    } else {
        OpenMail;

        if (MailFrom('@AUTH_SENDER@') && MailTo($address) && StartMailData()) {
            my $uniqueid = &SecureNonce;
            my $message_id = "CIVS-deactivation.$uniqueid\@$thishost";

            SendHeader('From', $tx->From_CIVS($civs_supervisor));
            SendHeader('Sender', $civs_supervisor);
            SendHeader('Reply-To', $civs_supervisor);
            SendHeader('Message-ID', "<$message_id>");
            SendHeader('To', "<$address>");
            SendHeader('Subject', $tx->deactivation_code_subject);
            SendHeader('Content-Transfer-Encoding', '8bit');
            SendHeader('Return-Path', $civs_supervisor);
            SendHeader('X-Mailer', 'CIVS');
            Send('');
            Send($tx->someone_has_requested($code));
            EndMailData;
        }
        CloseMail;
    }

    print "OK";
} else {
# This is a request to use a code.
    my $expected_code = &DeactivationCode($address);
    if ($code eq $expected_code) {
        if (HasOptOuts($optouts, $address) && $filter_pattern eq '') {
            my $pats = SetOptOutPatterns($optouts, $address, '+');
            SaveOptOuts($optouts);
            print 'activated '.$tx->reactivation_successful;
        } else {
            my $pats = SetOptOutPatterns($optouts, $address, $filter_pattern);
            SaveOptOuts($optouts);
            print "deactivated ".$tx->deactivation_successful($pats);
        }
    } else {
        print start_html(), p($tx->codes_dont_match);
        if ("@LOCALDEBUG@") {
            print pre("expected code $expected_code");
        }
        print end_html();
    }
    &ReleaseGlobalLock;
}

1;
