"""Credential artifacts."""
from typing import Mapping
from marshmallow import EXCLUDE, ValidationError, fields
from ...messaging.models.base import BaseModel, BaseModelSchema
from ...messaging.valid import (
INDY_CRED_DEF_ID_EXAMPLE,
INDY_CRED_DEF_ID_VALIDATE,
INDY_REV_REG_ID_EXAMPLE,
INDY_REV_REG_ID_VALIDATE,
INDY_SCHEMA_ID_EXAMPLE,
INDY_SCHEMA_ID_VALIDATE,
NUM_STR_ANY_EXAMPLE,
NUM_STR_ANY_VALIDATE,
)
[docs]class IndyAttrValue(BaseModel):
"""Indy attribute value."""
def __init__(self, raw: str = None, encoded: str = None, **kwargs):
"""Initialize indy (credential) attribute value."""
super().__init__(**kwargs)
self.raw = raw
self.encoded = encoded
[docs]class IndyAttrValueSchema(BaseModelSchema):
"""Indy attribute value schema."""
raw = fields.Str(required=True, metadata={"description": "Attribute raw value"})
encoded = fields.Str(
required=True,
validate=NUM_STR_ANY_VALIDATE,
metadata={
"description": "Attribute encoded value",
"example": NUM_STR_ANY_EXAMPLE,
},
)
[docs]class DictWithIndyAttrValueSchema(fields.Dict):
"""Dict with indy attribute value schema."""
def _deserialize(self, value, attr, data, **kwargs):
"""Deserialize dict with indy attribute value."""
if not isinstance(value, dict):
raise ValidationError("Value must be a dict.")
errors = {}
indy_attr_value_schema = IndyAttrValueSchema()
for k, v in value.items():
if isinstance(v, dict):
validation_errors = indy_attr_value_schema.validate(v)
if validation_errors:
errors[k] = validation_errors
if errors:
raise ValidationError(errors)
return value
[docs]class IndyCredential(BaseModel):
"""Indy credential."""
def __init__(
self,
schema_id: str = None,
cred_def_id: str = None,
rev_reg_id: str = None,
values: Mapping[str, IndyAttrValue] = None,
signature: Mapping = None,
signature_correctness_proof: Mapping = None,
rev_reg: Mapping = None,
witness: Mapping = None,
):
"""Initialize indy credential."""
self.schema_id = schema_id
self.cred_def_id = cred_def_id
self.rev_reg_id = rev_reg_id
self.values = values
self.signature = signature
self.signature_correctness_proof = signature_correctness_proof
self.rev_reg = rev_reg
self.witness = witness
[docs]class IndyCredentialSchema(BaseModelSchema):
"""Indy credential schema."""
schema_id = fields.Str(
required=True,
validate=INDY_SCHEMA_ID_VALIDATE,
metadata={
"description": "Schema identifier",
"example": INDY_SCHEMA_ID_EXAMPLE,
},
)
cred_def_id = fields.Str(
required=True,
validate=INDY_CRED_DEF_ID_VALIDATE,
metadata={
"description": "Credential definition identifier",
"example": INDY_CRED_DEF_ID_EXAMPLE,
},
)
rev_reg_id = fields.Str(
allow_none=True,
validate=INDY_REV_REG_ID_VALIDATE,
metadata={
"description": "Revocation registry identifier",
"example": INDY_REV_REG_ID_EXAMPLE,
},
)
values = DictWithIndyAttrValueSchema(
required=True,
metadata={"description": "Credential attributes"},
)
signature = fields.Dict(
required=True, metadata={"description": "Credential signature"}
)
signature_correctness_proof = fields.Dict(
required=True,
metadata={"description": "Credential signature correctness proof"},
)
rev_reg = fields.Dict(
allow_none=True, metadata={"description": "Revocation registry state"}
)
witness = fields.Dict(
allow_none=True, metadata={"description": "Witness for revocation proof"}
)