#!/bin/bash
############################################################################################
# Creates 2 Certificate Chains for the ACA:
# 1 RSA 3K SHA 384
# 2 ECC 512 SHA 384
# 
############################################################################################

param (
    [string]$LOG_FILE = $null,
	[string]$PKI_PASS = $null,
	[switch]$UNATTENDED = $false
)

$APP_HOME=(Split-Path -parent $PSCommandPath)
$ACA_COMMON_SCRIPT=(Join-Path "$APP_HOME" .. aca aca_common.ps1)

# Load other scripts
. $ACA_COMMON_SCRIPT

# Read aca.properties
read_aca_properties $global:HIRS_DATA_ACA_PROPERTIES_FILE

# Read spring application.properties
read_spring_properties $global:HIRS_DATA_SPRING_PROP_FILE

# Parameter check
if ($LOG_FILE) {
	touch $LOG_FILE
	$global:LOG_FILE=$LOG_FILE
} else {
	set_up_log
}

if (!$PKI_PASS) {
	if ($Env:HIRS_PKI_PWD) {
		$PKI_PASS=$Env:HIRS_PKI_PWD
	} else {
		$PKI_PASS=(create_random)
		echo "Using randomly generated password for the PKI key password" | WriteAndLog
	}
}

mkdir -p $global:HIRS_CONF_DIR 2>&1 > $null
echo "APP_HOME is $APP_HOME" | WriteAndLog

# Check for sudo or root user 
if(!(New-Object Security.Principal.WindowsPrincipal(
		[Security.Principal.WindowsIdentity]::GetCurrent())
	).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
	echo "This script requires root.  Please run as root" | WriteAndLog
	exit 1
}

# Create Cert Chains
if (![System.IO.Directory]::Exists($global:HIRS_DATA_CERTIFICATES_DIR)) {
    if ([System.IO.Directory]::Exists($global:HIRS_REL_WIN_PKI_HOME)) {
		$PKI_SETUP_DIR=$global:HIRS_REL_WIN_PKI_HOME
	} else {
        $PKI_SETUP_DIR=$APP_HOME
	}
	echo "PKI_SETUP_DIR is $PKI_SETUP_DIR" | WriteAndLog

    mkdir -F -p $global:HIRS_DATA_CERTIFICATES_DIR 2>&1 > $null

    cp $PKI_SETUP_DIR/ca.conf $global:HIRS_DATA_CERTIFICATES_DIR
	pwsh -ExecutionPolicy Bypass $PKI_SETUP_DIR/pki_chain_gen.ps1 "HIRS" "rsa" "3072" "sha384" "$PKI_PASS" "$global:LOG_FILE"
    pwsh -ExecutionPolicy Bypass $PKI_SETUP_DIR/pki_chain_gen.ps1 "HIRS" "ecc" "512" "sha384" "$PKI_PASS" "$global:LOG_FILE"

    # Save the password to the ACA properties file.
	add_new_aca_property -file:"$global:HIRS_DATA_ACA_PROPERTIES_FILE" -newKeyAndValue:"hirs_pki_password=$PKI_PASS"
    
    # Save connector information to the application properties file.
    add_new_spring_property -file:"$global:HIRS_DATA_SPRING_PROP_FILE" -newKeyAndValue:"server.ssl.key-store-password=$PKI_PASS"
    add_new_spring_property -file:"$global:HIRS_DATA_SPRING_PROP_FILE" -newKeyAndValue:"server.ssl.trust-store-password=$PKI_PASS"
} else {
    echo "$global:HIRS_DATA_CERTIFICATES_DIR exists, skipping" | WriteAndLog
}
