{-# 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
(Int -> MetadataBLOBPayloadEntry -> ShowS)
-> (MetadataBLOBPayloadEntry -> String)
-> ([MetadataBLOBPayloadEntry] -> ShowS)
-> Show MetadataBLOBPayloadEntry
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
(MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool)
-> (MetadataBLOBPayloadEntry -> MetadataBLOBPayloadEntry -> Bool)
-> Eq MetadataBLOBPayloadEntry
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.
 MetadataBLOBPayloadEntry -> Rep MetadataBLOBPayloadEntry x)
-> (forall x.
    Rep MetadataBLOBPayloadEntry x -> MetadataBLOBPayloadEntry)
-> Generic MetadataBLOBPayloadEntry
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 = Options -> Value -> Parser MetadataBLOBPayloadEntry
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 = Options -> MetadataBLOBPayloadEntry -> Value
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
(Int -> BiometricStatusReport -> ShowS)
-> (BiometricStatusReport -> String)
-> ([BiometricStatusReport] -> ShowS)
-> Show BiometricStatusReport
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
(BiometricStatusReport -> BiometricStatusReport -> Bool)
-> (BiometricStatusReport -> BiometricStatusReport -> Bool)
-> Eq BiometricStatusReport
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. BiometricStatusReport -> Rep BiometricStatusReport x)
-> (forall x. Rep BiometricStatusReport x -> BiometricStatusReport)
-> Generic BiometricStatusReport
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 = Options -> Value -> Parser BiometricStatusReport
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 = Options -> BiometricStatusReport -> Value
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
(Int -> StatusReport -> ShowS)
-> (StatusReport -> String)
-> ([StatusReport] -> ShowS)
-> Show StatusReport
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
(StatusReport -> StatusReport -> Bool)
-> (StatusReport -> StatusReport -> Bool) -> Eq StatusReport
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. StatusReport -> Rep StatusReport x)
-> (forall x. Rep StatusReport x -> StatusReport)
-> Generic StatusReport
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 = Options -> Value -> Parser StatusReport
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 = Options -> StatusReport -> Value
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
(Int -> AuthenticatorStatus -> ShowS)
-> (AuthenticatorStatus -> String)
-> ([AuthenticatorStatus] -> ShowS)
-> Show AuthenticatorStatus
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
(AuthenticatorStatus -> AuthenticatorStatus -> Bool)
-> (AuthenticatorStatus -> AuthenticatorStatus -> Bool)
-> Eq AuthenticatorStatus
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. AuthenticatorStatus -> Rep AuthenticatorStatus x)
-> (forall x. Rep AuthenticatorStatus x -> AuthenticatorStatus)
-> Generic AuthenticatorStatus
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 = Options -> Value -> Parser AuthenticatorStatus
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 = Options -> AuthenticatorStatus -> Value
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
(Int -> MetadataBLOBPayload -> ShowS)
-> (MetadataBLOBPayload -> String)
-> ([MetadataBLOBPayload] -> ShowS)
-> Show MetadataBLOBPayload
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
(MetadataBLOBPayload -> MetadataBLOBPayload -> Bool)
-> (MetadataBLOBPayload -> MetadataBLOBPayload -> Bool)
-> Eq MetadataBLOBPayload
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. MetadataBLOBPayload -> Rep MetadataBLOBPayload x)
-> (forall x. Rep MetadataBLOBPayload x -> MetadataBLOBPayload)
-> Generic MetadataBLOBPayload
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 = Options -> Value -> Parser MetadataBLOBPayload
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 = Options -> MetadataBLOBPayload -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
jsonEncodingOptions