{-# LANGUAGE DuplicateRecordFields #-}

-- | Stability: experimental
-- Type definitions directly corresponding to the
-- [FIDO Metadata Service](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html)
-- specification.
module Crypto.WebAuthn.Metadata.Service.WebIDL
  ( MetadataBLOBPayloadEntry (..),
    BiometricStatusReport (..),
    StatusReport (..),
    AuthenticatorStatus (..),
    MetadataBLOBPayload (..),
  )
where

-- Note from https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#notation :
-- Unless otherwise specified, if a WebIDL dictionary member is DOMString, it MUST NOT be empty.
-- Unless otherwise specified, if a WebIDL dictionary member is a List, it MUST NOT be an empty list.

import Crypto.WebAuthn.Internal.Utils (jsonEncodingOptions)
import Crypto.WebAuthn.Metadata.Statement.WebIDL (AAGUID, MetadataStatement)
import qualified Crypto.WebAuthn.Metadata.UAF as UAF
import qualified Crypto.WebAuthn.Metadata.WebIDL as IDL
import qualified Data.Aeson as Aeson
import Data.List.NonEmpty (NonEmpty)
import GHC.Generics (Generic)

-- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#metadata-blob-payload-entry-dictionary)
data MetadataBLOBPayloadEntry = MetadataBLOBPayloadEntry
  { -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-aaid)
    MetadataBLOBPayloadEntry -> Maybe AAID
aaid :: Maybe UAF.AAID,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-aaguid)
    MetadataBLOBPayloadEntry -> Maybe AAGUID
aaguid :: Maybe AAGUID,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-attestationcertificatekeyidentifiers)
    MetadataBLOBPayloadEntry -> Maybe (NonEmpty DOMString)
attestationCertificateKeyIdentifiers :: Maybe (NonEmpty IDL.DOMString),
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-metadatastatement)
    MetadataBLOBPayloadEntry -> Maybe MetadataStatement
metadataStatement :: Maybe MetadataStatement,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-biometricstatusreports)
    MetadataBLOBPayloadEntry -> Maybe (NonEmpty BiometricStatusReport)
biometricStatusReports :: Maybe (NonEmpty BiometricStatusReport),
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-statusreports)
    MetadataBLOBPayloadEntry -> NonEmpty StatusReport
statusReports :: NonEmpty StatusReport,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayloadentry-timeoflaststatuschange)
    MetadataBLOBPayloadEntry -> DOMString
timeOfLastStatusChange :: IDL.DOMString
    -- Unused in the current blob, also annoying to implement
    -- entryRogueListURL :: IDL.DOMString,
    -- entryRogueListHash :: IDL.DOMString
  }
  deriving (Int -> MetadataBLOBPayloadEntry -> ShowS
[MetadataBLOBPayloadEntry] -> ShowS
MetadataBLOBPayloadEntry -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetadataBLOBPayloadEntry] -> ShowS
$cshowList :: [MetadataBLOBPayloadEntry] -> ShowS
show :: MetadataBLOBPayloadEntry -> String
$cshow :: MetadataBLOBPayloadEntry -> String
showsPrec :: Int -> MetadataBLOBPayloadEntry -> ShowS
$cshowsPrec :: Int -> MetadataBLOBPayloadEntry -> ShowS
Show, MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool
$c/= :: MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool
== :: MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool
$c== :: MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool
Eq, forall x.
Rep MetadataBLOBPayloadEntry x -> MetadataBLOBPayloadEntry
forall x.
MetadataBLOBPayloadEntry -> Rep MetadataBLOBPayloadEntry x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep MetadataBLOBPayloadEntry x -> MetadataBLOBPayloadEntry
$cfrom :: forall x.
MetadataBLOBPayloadEntry -> Rep MetadataBLOBPayloadEntry x
Generic)

instance Aeson.FromJSON MetadataBLOBPayloadEntry where
  parseJSON :: Value -> Parser MetadataBLOBPayloadEntry
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
jsonEncodingOptions

instance Aeson.ToJSON MetadataBLOBPayloadEntry where
  toJSON :: MetadataBLOBPayloadEntry -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonEncodingOptions

-- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#biometricstatusreport-dictionary)
data BiometricStatusReport = BiometricStatusReport
  { -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-certlevel)
    BiometricStatusReport -> UnsignedShort
certLevel :: IDL.UnsignedShort,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-modality)
    BiometricStatusReport -> DOMString
modality :: IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-effectivedate)
    BiometricStatusReport -> Maybe DOMString
effectiveDate :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-certificationdescriptor)
    BiometricStatusReport -> Maybe DOMString
certificationDescriptor :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-certificatenumber)
    BiometricStatusReport -> Maybe DOMString
certificateNumber :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-certificationpolicyversion)
    BiometricStatusReport -> Maybe DOMString
certificationPolicyVersion :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-biometricstatusreport-certificationrequirementsversion)
    BiometricStatusReport -> Maybe DOMString
certificationRequirementsVersion :: Maybe IDL.DOMString
  }
  deriving (Int -> BiometricStatusReport -> ShowS
[BiometricStatusReport] -> ShowS
BiometricStatusReport -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BiometricStatusReport] -> ShowS
$cshowList :: [BiometricStatusReport] -> ShowS
show :: BiometricStatusReport -> String
$cshow :: BiometricStatusReport -> String
showsPrec :: Int -> BiometricStatusReport -> ShowS
$cshowsPrec :: Int -> BiometricStatusReport -> ShowS
Show, BiometricStatusReport -> BiometricStatusReport -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BiometricStatusReport -> BiometricStatusReport -> Bool
$c/= :: BiometricStatusReport -> BiometricStatusReport -> Bool
== :: BiometricStatusReport -> BiometricStatusReport -> Bool
$c== :: BiometricStatusReport -> BiometricStatusReport -> Bool
Eq, forall x. Rep BiometricStatusReport x -> BiometricStatusReport
forall x. BiometricStatusReport -> Rep BiometricStatusReport x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep BiometricStatusReport x -> BiometricStatusReport
$cfrom :: forall x. BiometricStatusReport -> Rep BiometricStatusReport x
Generic)

instance Aeson.FromJSON BiometricStatusReport where
  parseJSON :: Value -> Parser BiometricStatusReport
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
jsonEncodingOptions

instance Aeson.ToJSON BiometricStatusReport where
  toJSON :: BiometricStatusReport -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonEncodingOptions

-- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#statusreport-dictionary)
data StatusReport = StatusReport
  { -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-status)
    StatusReport -> AuthenticatorStatus
status :: AuthenticatorStatus,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-effectivedate)
    StatusReport -> Maybe DOMString
effectiveDate :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-authenticatorversion)
    StatusReport -> Maybe UnsignedLong
authenticatorVersion :: Maybe IDL.UnsignedLong,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-certificate)
    StatusReport -> Maybe DOMString
certificate :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-url)
    StatusReport -> Maybe DOMString
url :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-certificationdescriptor)
    StatusReport -> Maybe DOMString
certificationDescriptor :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-certificatenumber)
    StatusReport -> Maybe DOMString
certificateNumber :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-certificationpolicyversion)
    StatusReport -> Maybe DOMString
certificationPolicyVersion :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-statusreport-certificationrequirementsversion)
    StatusReport -> Maybe DOMString
certificationRequirementsVersion :: Maybe IDL.DOMString
  }
  deriving (Int -> StatusReport -> ShowS
[StatusReport] -> ShowS
StatusReport -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StatusReport] -> ShowS
$cshowList :: [StatusReport] -> ShowS
show :: StatusReport -> String
$cshow :: StatusReport -> String
showsPrec :: Int -> StatusReport -> ShowS
$cshowsPrec :: Int -> StatusReport -> ShowS
Show, StatusReport -> StatusReport -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StatusReport -> StatusReport -> Bool
$c/= :: StatusReport -> StatusReport -> Bool
== :: StatusReport -> StatusReport -> Bool
$c== :: StatusReport -> StatusReport -> Bool
Eq, forall x. Rep StatusReport x -> StatusReport
forall x. StatusReport -> Rep StatusReport x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep StatusReport x -> StatusReport
$cfrom :: forall x. StatusReport -> Rep StatusReport x
Generic)

instance Aeson.FromJSON StatusReport where
  parseJSON :: Value -> Parser StatusReport
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
jsonEncodingOptions

instance Aeson.ToJSON StatusReport where
  toJSON :: StatusReport -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonEncodingOptions

-- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#authenticatorstatus-enum)
data AuthenticatorStatus
  = NOT_FIDO_CERTIFIED
  | FIDO_CERTIFIED
  | USER_VERIFICATION_BYPASS
  | ATTESTATION_KEY_COMPROMISE
  | USER_KEY_REMOTE_COMPROMISE
  | USER_KEY_PHYSICAL_COMPROMISE
  | UPDATE_AVAILABLE
  | REVOKED
  | SELF_ASSERTION_SUBMITTED
  | FIDO_CERTIFIED_L1
  | FIDO_CERTIFIED_L1plus
  | FIDO_CERTIFIED_L2
  | FIDO_CERTIFIED_L2plus
  | FIDO_CERTIFIED_L3
  | FIDO_CERTIFIED_L3plus
  deriving (Int -> AuthenticatorStatus -> ShowS
[AuthenticatorStatus] -> ShowS
AuthenticatorStatus -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AuthenticatorStatus] -> ShowS
$cshowList :: [AuthenticatorStatus] -> ShowS
show :: AuthenticatorStatus -> String
$cshow :: AuthenticatorStatus -> String
showsPrec :: Int -> AuthenticatorStatus -> ShowS
$cshowsPrec :: Int -> AuthenticatorStatus -> ShowS
Show, AuthenticatorStatus -> AuthenticatorStatus -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AuthenticatorStatus -> AuthenticatorStatus -> Bool
$c/= :: AuthenticatorStatus -> AuthenticatorStatus -> Bool
== :: AuthenticatorStatus -> AuthenticatorStatus -> Bool
$c== :: AuthenticatorStatus -> AuthenticatorStatus -> Bool
Eq, forall x. Rep AuthenticatorStatus x -> AuthenticatorStatus
forall x. AuthenticatorStatus -> Rep AuthenticatorStatus x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AuthenticatorStatus x -> AuthenticatorStatus
$cfrom :: forall x. AuthenticatorStatus -> Rep AuthenticatorStatus x
Generic)

instance Aeson.FromJSON AuthenticatorStatus where
  parseJSON :: Value -> Parser AuthenticatorStatus
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
jsonEncodingOptions

instance Aeson.ToJSON AuthenticatorStatus where
  toJSON :: AuthenticatorStatus -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonEncodingOptions

-- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#metadata-blob-payload-dictionary)
data MetadataBLOBPayload = MetadataBLOBPayload
  { -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayload-legalheader)
    MetadataBLOBPayload -> Maybe DOMString
legalHeader :: Maybe IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayload-no)
    MetadataBLOBPayload -> Int
no :: Int,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayload-nextupdate)
    MetadataBLOBPayload -> DOMString
nextUpdate :: IDL.DOMString,
    -- | [(spec)](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html#dom-metadatablobpayload-entries)
    MetadataBLOBPayload -> [MetadataBLOBPayloadEntry]
entries :: [MetadataBLOBPayloadEntry]
  }
  deriving (Int -> MetadataBLOBPayload -> ShowS
[MetadataBLOBPayload] -> ShowS
MetadataBLOBPayload -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetadataBLOBPayload] -> ShowS
$cshowList :: [MetadataBLOBPayload] -> ShowS
show :: MetadataBLOBPayload -> String
$cshow :: MetadataBLOBPayload -> String
showsPrec :: Int -> MetadataBLOBPayload -> ShowS
$cshowsPrec :: Int -> MetadataBLOBPayload -> ShowS
Show, MetadataBLOBPayload -> MetadataBLOBPayload -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetadataBLOBPayload -> MetadataBLOBPayload -> Bool
$c/= :: MetadataBLOBPayload -> MetadataBLOBPayload -> Bool
== :: MetadataBLOBPayload -> MetadataBLOBPayload -> Bool
$c== :: MetadataBLOBPayload -> MetadataBLOBPayload -> Bool
Eq, forall x. Rep MetadataBLOBPayload x -> MetadataBLOBPayload
forall x. MetadataBLOBPayload -> Rep MetadataBLOBPayload x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MetadataBLOBPayload x -> MetadataBLOBPayload
$cfrom :: forall x. MetadataBLOBPayload -> Rep MetadataBLOBPayload x
Generic)

instance Aeson.FromJSON MetadataBLOBPayload where
  parseJSON :: Value -> Parser MetadataBLOBPayload
parseJSON = forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
Aeson.genericParseJSON Options
jsonEncodingOptions

instance Aeson.ToJSON MetadataBLOBPayload where
  toJSON :: MetadataBLOBPayload -> Value
toJSON = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonEncodingOptions