public static IContentKey MakeContentKey(CloudMediaContext context, ContentKeyType contentKeyType, string contentKeyId = null, string contentKeySecret = null) { string contentKeyName; switch (contentKeyType) { case ContentKeyType.CommonEncryption: contentKeyName = "Common Encryption ContentKey"; return(MediaServicesHelper.CreateContentKey(context, contentKeyName, ContentKeyType.CommonEncryption, contentKeyId, contentKeySecret)); case ContentKeyType.CommonEncryptionCbcs: contentKeyName = "Common Encryption CBCS ContentKey"; return(MediaServicesHelper.CreateContentKey(context, contentKeyName, ContentKeyType.CommonEncryptionCbcs, contentKeyId, contentKeySecret)); case ContentKeyType.EnvelopeEncryption: contentKeyName = "Envelope Encryption ContentKey"; return(MediaServicesHelper.CreateContentKey(context, contentKeyName, ContentKeyType.EnvelopeEncryption, contentKeyId, contentKeySecret)); } throw new NotImplementedException(contentKeyType.ToString() + " is not supported"); }
public static async Task <object> Run([HttpTrigger(WebHookType = "genericJson")] HttpRequestMessage req, TraceWriter log) { log.Info($"AMS v2 Function - Add Dynamic Encryption was triggered!"); string jsonContent = await req.Content.ReadAsStringAsync(); dynamic data = JsonConvert.DeserializeObject(jsonContent); // Validate input objects if (data.assetId == null && data.programId == null && data.channelName == null && data.programName == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass assetId or programID or channelName/programName in the input object" })); } if (data.contentKeyAuthorizationPolicyId == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass contentKeyAuthorizationPolicyId in the input object" })); } if (data.assetDeliveryPolicyId == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass assetDeliveryPolicyId in the input object" })); } if (data.contentKeyType == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass contentKeyType in the input object" })); } string assetId = data.assetId; string programId = data.programId; string channelName = data.channelName; string programName = data.programName; string contentKeyAuthorizationPolicyId = data.contentKeyAuthorizationPolicyId; string assetDeliveryPolicyId = data.assetDeliveryPolicyId; string contentKeyTypeName = data.contentKeyType; string contentKeyId = data.keyId; string contentKeySecret = data.contentKey; if (!MediaServicesHelper.AMSContentKeyType.ContainsKey(contentKeyTypeName)) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass a valid contentKeyType in the input object" })); } ContentKeyType contentKeyType = MediaServicesHelper.AMSContentKeyType[contentKeyTypeName]; if (contentKeyType != ContentKeyType.CommonEncryption && contentKeyType != ContentKeyType.CommonEncryptionCbcs && contentKeyType != ContentKeyType.EnvelopeEncryption) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass a valid contentKeyType in the input object" })); } string contentKeyName = null; if (data.contentKeyName != null) { contentKeyName = data.contentKeyName; } MediaServicesCredentials amsCredentials = new MediaServicesCredentials(); IAsset asset = null; IContentKeyAuthorizationPolicy ckaPolicy = null; IAssetDeliveryPolicy adPolicy = null; IContentKey contentKey = null; try { // Load AMS account context log.Info($"Using AMS v2 REST API Endpoint : {amsCredentials.AmsRestApiEndpoint.ToString()}"); AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(amsCredentials.AmsAadTenantDomain, new AzureAdClientSymmetricKey(amsCredentials.AmsClientId, amsCredentials.AmsClientSecret), AzureEnvironments.AzureCloudEnvironment); AzureAdTokenProvider tokenProvider = new AzureAdTokenProvider(tokenCredentials); _context = new CloudMediaContext(amsCredentials.AmsRestApiEndpoint, tokenProvider); // Let's get the asset if (assetId != null) { // Get the Asset, ContentKeyAuthorizationPolicy, AssetDeliveryPolicy asset = _context.Assets.Where(a => a.Id == assetId).FirstOrDefault(); if (asset == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Asset not found" })); } } else if (programId != null) { var program = _context.Programs.Where(p => p.Id == programId).FirstOrDefault(); if (program == null) { log.Info("Program not found"); return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Program not found" })); } asset = program.Asset; } else // with channelName and programName { // find the Channel, Program and Asset var channel = _context.Channels.Where(c => c.Name == channelName).FirstOrDefault(); if (channel == null) { log.Info("Channel not found"); return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Channel not found" })); } var program = channel.Programs.Where(p => p.Name == programName).FirstOrDefault(); if (program == null) { log.Info("Program not found"); return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Program not found" })); } asset = program.Asset; } log.Info($"Using asset Id : {asset.Id}"); ckaPolicy = _context.ContentKeyAuthorizationPolicies.Where(p => p.Id == contentKeyAuthorizationPolicyId).Single(); if (ckaPolicy == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "ContentKeyAuthorizationPolicy not found" })); } adPolicy = _context.AssetDeliveryPolicies.Where(p => p.Id == assetDeliveryPolicyId).Single(); if (adPolicy == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "AssetDeliveryPolicy not found" })); } if (contentKeyId != null) { string keyiddwitprefix = ""; if (contentKeyId.StartsWith("nb:kid:UUID:")) { keyiddwitprefix = contentKeyId; contentKeyId = contentKeyId.Substring(12); } else { keyiddwitprefix = "nb:kid:UUID:" + contentKeyId; } // let's retrieve the key if it exists already contentKey = _context.ContentKeys.Where(k => k.Id == keyiddwitprefix).FirstOrDefault(); } if (contentKey == null) // let's create it as it was not found or delivered to the function { switch (contentKeyType) { case ContentKeyType.CommonEncryption: if (contentKeyName == null) { contentKeyName = "Common Encryption ContentKey"; } contentKey = MediaServicesHelper.CreateContentKey(_context, contentKeyName, ContentKeyType.CommonEncryption, contentKeyId, contentKeySecret); break; case ContentKeyType.CommonEncryptionCbcs: if (contentKeyName == null) { contentKeyName = "Common Encryption CBCS ContentKey"; } contentKey = MediaServicesHelper.CreateContentKey(_context, contentKeyName, ContentKeyType.CommonEncryptionCbcs, contentKeyId, contentKeySecret); break; case ContentKeyType.EnvelopeEncryption: if (contentKeyName == null) { contentKeyName = "Envelope Encryption ContentKey"; } contentKey = MediaServicesHelper.CreateContentKey(_context, contentKeyName, ContentKeyType.EnvelopeEncryption, contentKeyId, contentKeySecret); break; } } asset.ContentKeys.Add(contentKey); contentKey.AuthorizationPolicyId = ckaPolicy.Id; contentKey = contentKey.UpdateAsync().Result; asset.DeliveryPolicies.Add(adPolicy); } catch (Exception ex) { string message = ex.Message + ((ex.InnerException != null) ? Environment.NewLine + MediaServicesHelper.GetErrorMessage(ex) : ""); log.Info($"ERROR: Exception {message}"); return(req.CreateResponse(HttpStatusCode.InternalServerError, new { error = message })); } return(req.CreateResponse(HttpStatusCode.OK, new { contentKeyId = contentKey.Id, assetId = asset.Id })); }