#!/usr/bin/perl -w
use strict;
use utf8;

my $dn = `dirname $0`;chomp($dn);
my $pwd = `pwd`;chomp($pwd);
if ($dn !~ /^\//) { $dn = $pwd . "/" . $dn; }
push @INC,$dn;
my $cverepobase=`dirname $dn`;
chomp($cverepobase);

require UpdateInfoReader;
UpdateInfoReader->import_product_updates();
require SMASHData;

my $announcerlog = "$cverepobase/data/announcements";

my %announced = ();

die "$announcerlog:$!" unless (open(ANNOUNCED,"<$announcerlog"));
while (<ANNOUNCED>) {
	chomp;
	$announced{$_} = 1;
}
close(ANNOUNCED);

open(ANNOUNCED,">$announcerlog")||die "$announcerlog.new: $!";
foreach my $id (sort keys %announced) {
	print ANNOUNCED "$id\n";
}

foreach my $product (keys %UpdateInfoReader::patches) {
	next unless ($product =~ /Liberty Linux/);

	my %patches = %{$UpdateInfoReader::patches{$product}};

	foreach my $patch (sort keys %patches) {
		next if ($announced{$patch});

		my @lines = ();

		push @lines, "# $UpdateInfoReader::patchtitle{$patch}\n";
		push @lines, "\n";

		push @lines, "Announcement ID: $patch\n";
		push @lines, "Rating: $UpdateInfoReader::patchseverity{$patch}\n";

		my $referencetext = "";
		my $bugcount = 0;
		foreach my $reference (sort keys %{$UpdateInfoReader::patchreferences{$patch}}) {
			next unless ($reference =~ /^\d/);
			$referencetext .= "  * bsc#$reference\n";
			$bugcount++;
		}
		if ($referencetext ne "") {
			push @lines, "References:\n\n$referencetext\n\n";
		}
		push @lines, "\n";
		my $cvecount = 0;
		my $crossreferencetext = "";
		foreach my $reference (sort keys %{$UpdateInfoReader::patchreferences{$patch}}) {
			next unless ($reference =~ /^CVE/);
			$crossreferencetext .= "  * $reference\n";
			$cvecount++;
		}
		if ($crossreferencetext ne "") {
			push @lines, "Cross-References:\n\n$crossreferencetext\n\n";
		}
		push @lines, "\n";

		my $cvsstext = "";
		foreach my $reference (sort keys %{$UpdateInfoReader::patchreferences{$patch}}) {
			next unless ($reference =~ /^CVE/);

			&SMASHData::read_smash_issue($reference);
			if (defined($SMASHData::cvssv3{$reference})) {
				my %cvss = %{$SMASHData::cvssv3{$reference}};

				if (defined($cvss{'SUSE'})) {
					$cvsstext .= "  * $reference ( SUSE ): " . $cvss{'SUSE'}->{'base_score'} . " " . $cvss{'SUSE'}->{'base_vector'} . "\n";
				}
			}
			if (defined($SMASHData::cvssv4{$reference})) {
				my %cvss = %{$SMASHData::cvssv4{$reference}};

				if (defined($cvss{'SUSE'})) {
					$cvsstext .= "  * $reference ( SUSE ): " . $cvss{'SUSE'}->{'base_score'} . " " . $cvss{'SUSE'}->{'base_vector'} . "\n";
				}
			}
		}
		if ($cvsstext ne "") {
			push @lines, "CVSS scores:\n\n$cvsstext\n";
		}

		push @lines, "Affected Products:\n";
		push @lines, "\n";
		push @lines, "  * $product\n";
		push @lines, "\n";
		push @lines, "\n";

		my $cvetext = "";
		if ($cvecount == 1) { $cvetext = "one vulnerability"; }
		if ($cvecount > 1) { $cvetext = "$cvecount vulnerabilities"; }
		my $bugtext = "";
		if ($bugcount == 1) { $bugtext = "one bug fix"; }
		if ($bugcount > 1) { $bugtext = "$bugcount bug fixes"; }

		my $mixedtext = "";

		if (!$cvecount && !$bugcount) {
			$mixedtext = "An update that solves various issues can now be installed.\n";
		}
		if ($cvecount && !$bugcount) {
			$mixedtext = "An update that solves $cvetext can now be installed.\n";
		}
		if (!$cvecount && $bugcount) {
			$mixedtext = "An update that has $bugtext can now be installed.\n";
		}
		if ($cvecount && $bugcount) {
			$mixedtext = "An update that solves $cvetext and has $bugtext can now be installed.\n";
		}
		push @lines, $mixedtext;
		push @lines, "\n";
		push @lines, "## Description:\n";
		push @lines, "\n";
		push @lines, $UpdateInfoReader::patchdescription{$patch} . "\n";

		push @lines, "\n";


		push @lines, "## Package List:\n";
		push @lines, "\n";
		push @lines, "  * $product:\n";
		my %packages = %{$UpdateInfoReader::patchpackages{$patch}};
		foreach my $pkg (sort keys %packages) {
			push @lines, "    * $pkg $packages{$pkg}\n";
		}
		push @lines, "\n";

		my $reftext = "";

		foreach my $reference (sort keys %{$UpdateInfoReader::patchreferences{$patch}}) {
			next unless ($reference =~ /^CVE/);
			$reftext .= "  * https://www.suse.com/security/cve/$reference.html\n";
		}
		if ($reftext ne "") {
			push @lines, "## References:\n\n$reftext";
		}
		print "END\n";

		open(SENDMAIL,"|/usr/sbin/sendmail -r suse-liberty-linux-updates\@lists.suse.com -oi -t");
		print SENDMAIL "From: suse-liberty-linux-updates\@lists.suse.com\n";
		print SENDMAIL "To: suse-liberty-linux-updates\@lists.suse.com\n";
		print SENDMAIL "Approved: EeKa5cig,Asho7ahd\n";
		print SENDMAIL "Subject: $patch: $UpdateInfoReader::patchseverity{$patch}: SUSE Liberty Linux $UpdateInfoReader::patchtitle{$patch}\n";
		print SENDMAIL "\n";
		print SENDMAIL join("",@lines);
		close(SENDMAIL);


		print ANNOUNCED "$patch\n";
	}
}
close(ANNOUNCED);

1;
