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

use JSON;
use Data::Dumper;

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);


%CVEListReader::description = ();

sub
mapchars($) {
	my ($str) = @_;

#	print "before: $str\n" if -t STDERR;
	$str =~ s/’/'/g;
	$str =~ s/“/"/g;
	$str =~ s/”/"/g;
	$str =~ s/：/:/g;
	$str =~ s/│/|/g;
	$str =~ s/│/|/g;
	$str =~ s/¦/|/g;
	$str =~ s/‘/'/g;
	$str =~ s/’/'/g;
	$str =~ s/ / /g;	# bad space
	$str =~ s/┌/ /g;
	$str =~ s/└/ /g;
	$str =~ s/≈/~/g;
	$str =~ s/™/(tm)/g;

	$str =~ s/​//g;	# zero width space

#	print "after: $str\n" if -t STDERR;
	return $str;
}

sub
get_description($) {
	my ($cve) = @_;

	if (defined($CVEListReader::description{$cve})) {
		return $CVEListReader::description{$cve};
	}

	my $cveyear = "bad";
	my $dirprefix = "bad";
	if ($cve =~ /^CVE-(\d\d\d\d)-(\d*)\d\d\d$/) {
		$cveyear = $1;
		$dirprefix = $2;
	}

	if (open(CVEJSON,"<$cverepobase/cvelist/$cveyear/${dirprefix}xxx/$cve.json")) {
		my $json = join("\n",<CVEJSON>);

		my $mapref;
		eval {
			$mapref = from_json($json, utf8 => 1);
		} or do {
			die "json invalid: $json\n";
		};

		my @descs = @{$mapref->{'description'}->{'description_data'}};
		foreach my $desc (@descs) {
			if ($desc->{'lang'} eq "eng") {
				$CVEListReader::description{$cve} = mapchars($desc->{'value'});
				last;
			}
		}
		close(CVEJSON);
	} else {
		print STDERR "no entry found for $cve / $cverepobase/cvelist/$cveyear/${dirprefix}xxxx/$cve.json:$!\n";
	}
	if (open(CVEJSON,"<$cverepobase/cvelistV5/cves/$cveyear/${dirprefix}xxx/$cve.json")) {
		my $json = join("\n",<CVEJSON>);

		my $mapref;
		eval {
			$mapref = from_json($json, utf8 => 1 );
		} or do {
			die "json invalid: $json\n";
		};

		my $descref = $mapref->{'containers'}->{'cna'}->{'descriptions'};
		if (defined($descref)) {
			my @descs = @{$descref};
			foreach my $desc (@descs) {
				if ($desc->{'lang'} eq "eng") {
					$CVEListReader::description{$cve} = mapchars($desc->{'value'});
					last;
				}
			}
		}
		close(CVEJSON);
	} else {
		print STDERR "No V5 entry found for $cve / $cverepobase/cvelistV5/cves/$cveyear/${dirprefix}xxxx/$cve.json:$!\n";
	}
	if (defined($CVEListReader::description{$cve})) {
		return $CVEListReader::description{$cve};
	}
	return undef;
}

if (!defined(get_description('CVE-2022-0001'))) {
	print "could not read description of CVE-2022-0001, format changed?\n";
}
#print STDERR get_description('CVE-2003-0686');

# print STDERR get_description('CVE-2010-2525');

1;
