Cdm: Add ability to unset certificate via set_service_certificate()

To unset, just provide `None` as the certificate param.
This commit is contained in:
rlaphoenix 2022-08-04 05:22:51 +01:00
parent e8785fcd84
commit ddf755f82f
1 changed files with 10 additions and 2 deletions

View File

@ -149,7 +149,7 @@ class Cdm:
raise InvalidSession(f"Session identifier {session_id!r} is invalid.")
del self._sessions[session_id]
def set_service_certificate(self, session_id: bytes, certificate: Union[bytes, str]) -> str:
def set_service_certificate(self, session_id: bytes, certificate: Optional[Union[bytes, str]]) -> str:
"""
Set a Service Privacy Certificate for Privacy Mode. (optional but recommended)
@ -165,7 +165,8 @@ class Cdm:
session_id: Session identifier.
certificate: SignedDrmCertificate (or SignedMessage containing one) in Base64
or Bytes form obtained from the Service. Some services have their own,
but most use the common privacy cert, (common_privacy_cert).
but most use the common privacy cert, (common_privacy_cert). If None, it
will remove the current certificate.
Raises:
InvalidSession: If the Session identifier is invalid.
@ -175,11 +176,18 @@ class Cdm:
match the underlying DrmCertificate.
Returns the Service Provider ID of the verified DrmCertificate if successful.
If certificate is None, it will return the now unset certificate's Provider ID.
"""
session = self._sessions.get(session_id)
if not session:
raise InvalidSession(f"Session identifier {session_id!r} is invalid.")
if certificate is None:
drm_certificate = DrmCertificate()
drm_certificate.ParseFromString(session.service_certificate.drm_certificate)
session.service_certificate = None
return drm_certificate.provider_id
if isinstance(certificate, str):
try:
certificate = base64.b64decode(certificate) # assuming base64