Fixes for renew on license load
[ Merge of http://go/wvgerrit/173290 ] * Renew timer offset from when license is loaded verifies that the rental duration has not expired and begins decryption. * Renew timer offset from first decrypt bugfix * Feature is enabled based on oemcrypto v18 presence * Renewal logic verifies that |can_renew| is enabled * Unit tests were added to reflect use cases from duration and renewal documentation Bug: 278751387 Test: policy unittests, CdmUseCase tests, wvts tests Change-Id: I3070b3f31b316e150c28ebe38d0440ab1eeb89b9
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include "clock.h"
|
||||
#include "log.h"
|
||||
#include "policy_timers_v16.h"
|
||||
#include "policy_timers_v18.h"
|
||||
#include "properties.h"
|
||||
#include "string_conversions.h"
|
||||
#include "wv_cdm_constants.h"
|
||||
@@ -21,7 +22,7 @@ namespace {
|
||||
const int kCdmPolicyTimerDurationSeconds = 1;
|
||||
const int kClockSkewDelta = 5; // seconds
|
||||
const int64_t kLicenseStateUpdateDelay = 20; // seconds
|
||||
|
||||
const uint32_t kMinOemCryptoApiVersionSupportsRenewalDelayBase = 18;
|
||||
} // namespace
|
||||
|
||||
namespace wvcdm {
|
||||
@@ -32,8 +33,17 @@ PolicyEngine::PolicyEngine(CdmSessionId session_id,
|
||||
: session_id_(session_id),
|
||||
event_listener_(event_listener),
|
||||
license_keys_(new LicenseKeys(crypto_session->GetSecurityLevel())),
|
||||
policy_timers_(new PolicyTimersV16()),
|
||||
clock_(new wvutil::Clock()) {
|
||||
uint32_t version = 0;
|
||||
if (crypto_session->GetApiVersion(&version)) {
|
||||
if (version >= kMinOemCryptoApiVersionSupportsRenewalDelayBase) {
|
||||
policy_timers_.reset(new PolicyTimersV18());
|
||||
}
|
||||
}
|
||||
|
||||
if (policy_timers_ == nullptr) {
|
||||
policy_timers_.reset(new PolicyTimersV16());
|
||||
}
|
||||
InitDevice(crypto_session);
|
||||
}
|
||||
|
||||
@@ -121,7 +131,8 @@ void PolicyEngine::OnTimerEvent() {
|
||||
// Test to determine if renewal should be attempted.
|
||||
switch (license_state_) {
|
||||
case kLicenseStateCanPlay: {
|
||||
if (policy_timers_->HasRenewalDelayExpired(current_time)) {
|
||||
if (policy_timers_->HasRenewalDelayExpired(current_time) &&
|
||||
policy_timers_->get_policy().can_renew()) {
|
||||
renewal_needed = true;
|
||||
}
|
||||
// HDCP may change, so force a check.
|
||||
@@ -130,12 +141,15 @@ void PolicyEngine::OnTimerEvent() {
|
||||
}
|
||||
|
||||
case kLicenseStateNeedRenewal: {
|
||||
renewal_needed = true;
|
||||
if (policy_timers_->get_policy().can_renew()) {
|
||||
renewal_needed = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kLicenseStateWaitingLicenseUpdate: {
|
||||
if (policy_timers_->HasRenewalRetryIntervalExpired(current_time)) {
|
||||
if (policy_timers_->HasRenewalRetryIntervalExpired(current_time) &&
|
||||
policy_timers_->get_policy().can_renew()) {
|
||||
renewal_needed = true;
|
||||
}
|
||||
break;
|
||||
@@ -249,7 +263,8 @@ bool PolicyEngine::BeginDecryption() {
|
||||
case kLicenseStateWaitingLicenseUpdate:
|
||||
policy_timers_->BeginDecryption(current_time);
|
||||
|
||||
if (policy_timers_->get_policy().renew_with_usage()) {
|
||||
if (policy_timers_->get_policy().renew_with_usage() &&
|
||||
policy_timers_->get_policy().can_renew()) {
|
||||
license_state_ = kLicenseStateNeedRenewal;
|
||||
}
|
||||
NotifyExpirationUpdate(current_time);
|
||||
|
||||
Reference in New Issue
Block a user