Private/class-OceanStorCertificate.ps1

class OceanStorCertificate {
    [string]$CertificateType
    [int]$TypeId
    [string]$Status
    [string]$Subject
    [string]$Issuer
    [nullable[datetime]]$ValidTo
    [string]$Fingerprint
    [string]$SerialNumber
    [string]$SignatureAlgorithm
    [string]$KeyAlgorithm
    [int]$KeyLength
    [int]$ExpireWarningDays
    [string]$Usage
    [string]$SubjectCommonName
    [string]$SubjectAlternativeName
    [bool]$AutoUpdateSupported
    [bool]$AutoUpdateEnabled
    [string]$CAStatus
    [string]$CASubject
    [string]$CAIssuer
    [nullable[datetime]]$CAValidTo
    [string]$CAFingerprint
    [string]$CASerialNumber
    [string]$CAKeyAlgorithm
    [int]$CAKeyLength
    [string]$CASignatureAlgorithm
    [string]$VstoreId
    hidden [pscustomobject]$Raw

    OceanStorCertificate ([object]$certificateReceived) {
        $this.Raw = $certificateReceived
        $this.TypeId = [OceanStorCertificate]::ToInt($certificateReceived.CERTIFICATE_TYPE)
        $this.CertificateType = [OceanStorCertificate]::TypeName($certificateReceived.CERTIFICATE_TYPE)
        $this.Status = [OceanStorCertificate]::StatusName($certificateReceived.CERTIFICATE_STATUS)
        $this.Subject = [OceanStorCertificate]::CleanText($certificateReceived.CERTIFICATE_SUBJECT)
        $this.Issuer = [OceanStorCertificate]::CleanText($certificateReceived.CERTIFICATE_ISSUER)
        $this.ValidTo = [OceanStorCertificate]::ParseDate($certificateReceived.CERTIFICATE_EXPIRE_TIME)
        $this.Fingerprint = [OceanStorCertificate]::CleanText($certificateReceived.CERTIFICATE_FINGERPRINT)
        $this.SerialNumber = [OceanStorCertificate]::CleanText($certificateReceived.certificateSerialNumber)
        $this.SignatureAlgorithm = [OceanStorCertificate]::CleanText($certificateReceived.CERTIFICATE_SIGNATURE_ALGORITHM)
        $this.KeyAlgorithm = [OceanStorCertificate]::KeyAlgorithmName($certificateReceived.KEY_ALGORITHM)
        $this.KeyLength = [OceanStorCertificate]::ToInt($certificateReceived.KEY_LENGTH)
        $this.ExpireWarningDays = [OceanStorCertificate]::ToInt($certificateReceived.CERTIFICATE_EXPIRE_PREWARNING_TIME)
        $this.Usage = [OceanStorCertificate]::CleanText($certificateReceived.USE_OF_CERTIFICATE)
        $this.SubjectCommonName = [OceanStorCertificate]::CleanText($certificateReceived.SUBJECT_COMMON_NAME)
        $this.SubjectAlternativeName = [OceanStorCertificate]::CleanText($certificateReceived.SUBJECT_ALTERNATIVE_NAME)
        $this.AutoUpdateSupported = [OceanStorCertificate]::ToBool($certificateReceived.isSupportAutoUpdate)
        $this.AutoUpdateEnabled = [OceanStorCertificate]::ToBool($certificateReceived.enabledAutoUpdate)
        $this.CAStatus = [OceanStorCertificate]::StatusName($certificateReceived.CA_CERTIFICATE_STATUS)
        $this.CASubject = [OceanStorCertificate]::CleanText($certificateReceived.CA_CERTIFICATE_SUBJECT)
        $this.CAIssuer = [OceanStorCertificate]::CleanText($certificateReceived.CA_CERTIFICATE_ISSUER)
        $this.CAValidTo = [OceanStorCertificate]::ParseDate($certificateReceived.CA_CERTIFICATE_EXPIRE_TIME)
        # Doc 4.3.5.3.1: camelCase certificateFingerPrint is the CA-side fingerprint.
        $this.CAFingerprint = [OceanStorCertificate]::CleanText($certificateReceived.certificateFingerPrint)
        $this.CASerialNumber = [OceanStorCertificate]::CleanText($certificateReceived.caCertificateSerialNumber)
        $this.CAKeyAlgorithm = [OceanStorCertificate]::KeyAlgorithmName($certificateReceived.CA_KEY_ALGORITHM)
        $this.CAKeyLength = [OceanStorCertificate]::ToInt($certificateReceived.CA_KEY_LENGTH)
        $this.CASignatureAlgorithm = [OceanStorCertificate]::CleanText($certificateReceived.CA_CERTIFICATE_SIGNATURE_ALGORITHM)
        $this.VstoreId = [string]$certificateReceived.vstoreId
    }

    hidden static [string] TypeName([object]$value) {
        switch ([string]$value) {
            '0'  { return 'KMC' }
            '2'  { return 'Domain Authentication' }
            '3'  { return 'HyperMetro' }
            '4'  { return 'HTTPS' }
            '5'  { return 'FTPS' }
            '6'  { return 'Syslog' }
            '7'  { return 'NTP' }
            '8'  { return 'Call Home' }
            '14' { return 'DeviceManager' }
            '18' { return 'SSO' }
            '19' { return 'Email' }
            '26' { return 'Disk Authentication' }
            '30' { return 'Email OTP' }
            '38' { return 'File Service Domain Authentication' }
            '63' { return 'CA Server' }
            '65' { return 'SmartContainer' }
            '68' { return 'In-band Management' }
            '70' { return 'S3 Authentication' }
        }
        return [string]$value
    }

    hidden static [string] StatusName([object]$value) {
        switch ([string]$value) {
            '0' { return 'Absent' }    # doc value: "inexistent" / "NOT EXIST"
            '1' { return 'Valid' }
            '2' { return 'Invalid' }
        }
        return [string]$value
    }

    hidden static [string] KeyAlgorithmName([object]$value) {
        switch ([string]$value) {
            '0' { return 'RSA' }
            '1' { return 'ECC' }
            '2' { return 'DSA' }
        }
        return [string]$value
    }

    # The array reports absent values as "--" (and sometimes ""); map to $null/empty.
    hidden static [string] CleanText([object]$value) {
        $text = [string]$value
        if ($text -eq '--') { return '' }
        return $text
    }

    hidden static [nullable[datetime]] ParseDate([object]$value) {
        $text = [string]$value
        if ([string]::IsNullOrWhiteSpace($text) -or $text -eq '--') { return $null }
        $parsed = [datetime]::MinValue
        if ([datetime]::TryParseExact($text, 'yyyy-MM-dd', [cultureinfo]::InvariantCulture,
                [System.Globalization.DateTimeStyles]::None, [ref]$parsed)) {
            return $parsed
        }
        if ([datetime]::TryParse($text, [cultureinfo]::InvariantCulture,
                [System.Globalization.DateTimeStyles]::None, [ref]$parsed)) {
            return $parsed
        }
        return $null
    }

    hidden static [bool] ToBool([object]$value) {
        $text = [string]$value
        return ($text -eq 'true' -or $text -eq '1')
    }

    hidden static [int] ToInt([object]$value) {
        $parsed = 0
        if ([int]::TryParse([string]$value, [ref]$parsed)) { return $parsed }
        return 0
    }
}