Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion alpha/apps/kaltura/lib/kPlaybackContextDataHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,6 @@ private static function getDrmData(entry $dbEntry, $flavorAssets, $deliveryProfi
$playbackContextDataParams->setDeliveryProfile($deliveryProfile);
$playbackContextDataParams->setFlavors(array_values($flavorAssets));
$playbackContextDataParams->setType('drm');

$result = new kPlaybackContextDataResult();
$pluginInstances = KalturaPluginManager::getPluginInstances('IKalturaPlaybackContextDataContributor');
foreach ($pluginInstances as $pluginInstance)
Expand Down
3 changes: 1 addition & 2 deletions alpha/apps/kaltura/lib/kPlaybackContextDataParams.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,5 +65,4 @@ public function setDeliveryProfile($deliveryProfile)
{
$this->deliveryProfile = $deliveryProfile;
}

}
}
12 changes: 12 additions & 0 deletions alpha/lib/model/Partner.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ class Partner extends BasePartner

const EXTERNAL_IDENTIFIER = 'externalIdentifier';

const CUSTOM_DATA_DRM_KEY_MANAGEMENT_POLICY = 'drmKeyManagementPolicy';
const ALLOWED_REDIRECT_DOMAINS = 'allowedRedirectDomains';

public function save(PropelPDO $con = null)
Expand Down Expand Up @@ -2485,6 +2486,17 @@ public function setExternalIdentifier($v)
return $this->putInCustomData(self::EXTERNAL_IDENTIFIER, $v);
}

public function getDrmKeyManagementPolicy()
{
$policy = $this->getFromCustomData(self::CUSTOM_DATA_DRM_KEY_MANAGEMENT_POLICY);
return $policy !== null ? $policy : DrmKeyManagementPolicy::UNKNOWN;
}

public function setDrmKeyManagementPolicy($v)
{
return $this->putInCustomData(self::CUSTOM_DATA_DRM_KEY_MANAGEMENT_POLICY, $v);
}

public function getAllowedRedirectDomains()
{
return $this->getFromCustomData(self::ALLOWED_REDIRECT_DOMAINS);
Expand Down
12 changes: 12 additions & 0 deletions alpha/lib/model/entry.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ class entry extends Baseentry implements ISyncableFile, IIndexable, IOwnable, IR
const LIVE_THUMB_PATH = "content/templates/entry/thumbnail/live_thumb.jpg";
const CUSTOM_DATA_INTERACTIVITY_VERSION = 'interactivity_version';
const CUSTOM_DATA_VOLATILE_INTERACTIVITY_VERSION = 'volatile_interactivity_version';

const CUSTOM_DATA_DRM_KEY_MANAGEMENT_POLICY = 'drmKeyManagementPolicy';
const CUSTOM_DATA_IS_SCHEDULED = 'isScheduled';

const NAME = 'name';
Expand Down Expand Up @@ -4651,6 +4653,16 @@ public function getVolatileInteractivityVersion()
return $this->getFromCustomData( self::CUSTOM_DATA_VOLATILE_INTERACTIVITY_VERSION ,null, null);
}

public function getDrmKeyManagementPolicy()
{
return $this->getFromCustomData(self::CUSTOM_DATA_DRM_KEY_MANAGEMENT_POLICY);
}

public function setDrmKeyManagementPolicy($v)
{
return $this->putInCustomData(self::CUSTOM_DATA_DRM_KEY_MANAGEMENT_POLICY, $v);
}

public function getIsScheduled()
{
return $this->getFromCustomData(self::CUSTOM_DATA_IS_SCHEDULED, null, false);
Expand Down
2 changes: 1 addition & 1 deletion api_v3/lib/types/partner/KalturaPartner.php
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ public function fromPartner(Partner $partner)
public function doFromObject($partner, KalturaDetachedResponseProfile $responseProfile = null)
{
parent::doFromObject($partner);

$this->updatePasswordStructureFromPartner($partner);

$this->name = kString::stripUtf8InvalidChars($this->name);
Expand Down
18 changes: 18 additions & 0 deletions deployment/permissions/service.drm.keymanagementpolicy.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[action_permission_items]
permissionItem1.service = drm_keymanagementpolicy
permissionItem1.action = get
permissionItem1.partnerId = 0
permissionItem1.param3 =
permissionItem1.param4 =
permissionItem1.param5 =
permissionItem1.tags =
permissionItem1.permissions = ALWAYS_ALLOWED_FROM_INTERNAL_IP_ACTIONS

permissionItem2.service = drm_keymanagementpolicy
permissionItem2.action = update
permissionItem2.partnerId = 0
permissionItem2.param3 =
permissionItem2.param4 =
permissionItem2.param5 =
permissionItem2.tags =
permissionItem2.permissions = ALWAYS_ALLOWED_FROM_INTERNAL_IP_ACTIONS
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php
/**
* @package deployment
* @subpackage west.roles_and_permissions
*/

$script = realpath(dirname(__FILE__) . '/../../../../') . '/alpha/scripts/utils/permissions/addPermissionsAndItems.php';
$config = realpath(dirname(__FILE__)) . '/../../../permissions/service.drm.keymanagementpolicy.ini';
passthru("php $script $config");
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ private function createArgumentsForXSLT()
$tagsDoc->appendChild($tagsConfiguration);
$arguments['tagsparam'] = $tagsDoc->saveXML();

$partner = $this->entry->getPartner();
if ($partner && $partner->getPluginEnabled(DrmPlugin::PLUGIN_NAME))
{
$arguments['keyManagementPolicy'] = (string)DrmPlugin::getDrmKeyManagementPolicy($this->entry);
}
return $arguments;
}

Expand Down Expand Up @@ -288,4 +293,4 @@ private function createAppendXml($tag, $tagsDoc, $xmlNodeName, $propertyName)
return $nameNode;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@
<!--widevine mbr-->
<xsl:param name="widevineMbrPpvModule" select="''"/>
<xsl:param name="widevineMbrTypeName" select="'widevine_mbr Main'"/>
<!--keyManagementPolicy-->
<xsl:param name="keyManagementPolicy" select="''"/>
<!--main logic -->
<xsl:template match="/">
<xsl:element name="feed">
Expand Down Expand Up @@ -244,6 +246,11 @@
<xsl:value-of select="$geoBlockRule"/>
</xsl:element>
</xsl:element>
<xsl:if test="string($keyManagementPolicy)">
<xsl:element name="drm_key_management_policy">
<xsl:value-of select="$keyManagementPolicy"/>
</xsl:element>
</xsl:if>
<xsl:element name="dates">
<xsl:variable name="sunrise" select="item/distribution/sunrise"/>
<xsl:variable name="sunriseFormatted" select="php:function('date' ,string($CONST_TVM_DATE_FORMAT),string($sunrise))"/>
Expand Down
35 changes: 34 additions & 1 deletion plugins/drm/BaseDrmPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,39 @@ public static function shouldContributeToPlaybackContext(array $actions)

return false;
}
}

public static function getDrmKeyManagementPolicy($entry)
{
$drmKeyManagementPolicy = $entry->getDrmKeyManagementPolicy();
if (is_null($drmKeyManagementPolicy))
{
$partner = $entry->getPartner();
if ($partner)
{
$drmKeyManagementPolicy = $partner->getDrmKeyManagementPolicy();
}
else
{
$drmKeyManagementPolicy = DrmKeyManagementPolicy::UNKNOWN;
}
}
return $drmKeyManagementPolicy;
}

protected function getLicenseExpirationAndDuration($policyId, $entry)
{
$licenseExpiration = null;
$licenseDuration = null;

if ($policyId)
{
$drmPolicy = DrmPolicyPeer::retrieveByPK($policyId);
if ($drmPolicy)
{
$licenseExpiration = DrmLicenseUtils::calculateExpirationDate($drmPolicy, $entry);
$licenseDuration = $drmPolicy->getDuration();
}
}
return [$licenseExpiration, $licenseDuration];
}
}
181 changes: 181 additions & 0 deletions plugins/drm/DrmBulkUploadXmlPlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
<?php
/**
* Enable DRM key management policy ingestion from XML bulk upload
* @package plugins.drm
*/
class DrmBulkUploadXmlPlugin extends KalturaPlugin implements IKalturaPending, IKalturaSchemaContributor, IKalturaBulkUploadXmlHandler
{
const PLUGIN_NAME = 'drmBulkUploadXml';
const BULK_UPLOAD_XML_PLUGIN_NAME = 'bulkUploadXml';

/* (non-PHPdoc)
* @see IKalturaPlugin::getPluginName()
*/
public static function getPluginName()
{
return self::PLUGIN_NAME;
}

/* (non-PHPdoc)
* @see IKalturaPending::dependsOn()
*/
public static function dependsOn()
{
$bulkUploadXmlDependency = new KalturaDependency(self::BULK_UPLOAD_XML_PLUGIN_NAME);
$drmDependency = new KalturaDependency(DrmPlugin::getPluginName());

return array($bulkUploadXmlDependency, $drmDependency);
}

/* (non-PHPdoc)
* @see IKalturaSchemaContributor::contributeToSchema()
*/
public static function contributeToSchema($type)
{
$coreType = kPluginableEnumsManager::apiToCore('SchemaType', $type);
if(
$coreType != BulkUploadXmlPlugin::getSchemaTypeCoreValue(XmlSchemaType::BULK_UPLOAD_XML)
&&
$coreType != BulkUploadXmlPlugin::getSchemaTypeCoreValue(XmlSchemaType::BULK_UPLOAD_RESULT_XML)
)
return null;

$xsd = '

<!-- ' . self::getPluginName() . ' -->

<xs:complexType name="T_drmConfiguration">
<xs:sequence>
<xs:element name="keyManagementPolicy" minOccurs="0" maxOccurs="1" type="xs:int">
<xs:annotation>
<xs:documentation>
The DRM key management policy to apply to this entry.<br/>
Values correspond to the DrmKeyManagementPolicy enum:<br/>
0 = UNKNOWN<br/>
1 = CLEAR<br/>
2 = SHARED_KEY<br/>
3 = ALL_VIDEO<br/>
4 = SD_HD<br/>
5 = SD_HD_UHD<br/>
6 = SD_HD_UHD1_UHD2<br/>
7 = SD_HD1_HD2_UHD1_UHD2<br/>
8 = SD_HD1_HD2_UHD<br/>
9 = SDHD1_HD2_UHD<br/>
10 = SDHD1_HD2_UHD1_UHD2<br/>
If omitted, the entry inherits the partner-level DRM key management policy.<br/>
If no partner-level policy is set either, the policy defaults to UNKNOWN (0).<br/>
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:element name="drmConfiguration" type="T_drmConfiguration" substitutionGroup="item-extension">
<xs:annotation>
<xs:documentation>DRM key management policy configuration for this entry</xs:documentation>
<xs:appinfo>
<example>
<drmConfiguration>
<keyManagementPolicy>3</keyManagementPolicy>
</drmConfiguration>
</example>
</xs:appinfo>
</xs:annotation>
</xs:element>
';

return $xsd;
}

/* (non-PHPdoc)
* @see IKalturaBulkUploadXmlHandler::configureBulkUploadXmlHandler()
*/
public function configureBulkUploadXmlHandler(BulkUploadEngineXml $xmlBulkUploadEngine)
{

}

/* (non-PHPdoc)
* @see IKalturaBulkUploadXmlHandler::handleItemAdded()
*/
public function handleItemAdded(KalturaObjectBase $object, SimpleXMLElement $item)
{
if(!($object instanceof KalturaBaseEntry))
return;

if(!isset($item->drmConfiguration))
return;

$this->handleDrmConfiguration($object->id, $item);
}

/* (non-PHPdoc)
* @see IKalturaBulkUploadXmlHandler::handleItemUpdated()
*/
public function handleItemUpdated(KalturaObjectBase $object, SimpleXMLElement $item)
{
if(!($object instanceof KalturaBaseEntry))
return;

if(!isset($item->drmConfiguration))
return;

$this->handleDrmConfiguration($object->id, $item);
}

/* (non-PHPdoc)
* @see IKalturaBulkUploadXmlHandler::handleItemDeleted()
*/
public function handleItemDeleted(KalturaObjectBase $object, SimpleXMLElement $item)
{
// No handling required
}

/* (non-PHPdoc)
* @see IKalturaBulkUploadXmlHandler::getContainerName()
*/
public function getContainerName()
{
return 'drmConfiguration';
}

/**
* Set the DRM key management policy on the entry via the keyManagementPolicy service.
*
* @param string $entryId
* @param SimpleXMLElement $item
*/
private function handleDrmConfiguration($entryId, SimpleXMLElement $item)
{
KalturaLog::debug("Handling DRM key management policy for entry: " . $entryId);

$policy = new KalturaKeyManagementPolicy();
if (isset($item->drmConfiguration->keyManagementPolicy))
{
$policy->keyManagementPolicy = (int)$item->drmConfiguration->keyManagementPolicy;
}
else
{
KalturaLog::warning('No keyManagementPolicy specified for entry [' . $entryId . '], will use partner/default fallback.');
$policy->keyManagementPolicy = null;
}
try
{
KBatchBase::$kClient->keyManagementPolicy->update(
KalturaKeyManagementPolicyObjectType::ENTRY,
$entryId,
$policy
);
}
catch (Exception $e)
{
if ($e->getCode() == 'ENTRY_DRM_KEY_MANAGEMENT_POLICY_ALREADY_SET')
{
KalturaLog::info('DRM key management policy already set for entry [' . $entryId . '], skipping.');
return;
}
KalturaLog::err('drmConfiguration handling failed for entry [' . $entryId . ']: ' . $e->getMessage());
throw $e;
}
}
}
Loading