.history/custom/Module_20241113222010.cs

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography.X509Certificates;
using System.Text;
 
namespace Commvault.Powershell
{
    using static Commvault.Powershell.Runtime.Extensions;
 
    public partial class Module
    {
        partial void CustomInit()
        {
            // Add a step at the end of the pipeline to attach the API key
            // Add once for the regular pipeline
            this._pipeline.Append(AddAuthtoken);
 
            // Add once for the pipeline that supports a proxy
            this._pipelineWithProxy.Append(AddAuthtoken);
        }
 
        protected async System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> AddAuthtoken(System.Net.Http.HttpRequestMessage request, Runtime.IEventListener callback, Runtime.ISendAsync next)
        {
            try
            {
                // Translate the request URI
                request.RequestUri = TranslateIncomingRequestToCommvaultAPI(request);
 
                // Check if the URL contains metallic.io
                bool isMetallic = request.RequestUri.AbsoluteUri.ToLower().Contains("metallic.io");
 
                // Get the authentication token
                var token = System.Environment.GetEnvironmentVariable("CVToken");
 
                if (string.IsNullOrEmpty(token))
                {
                    throw new Exception("CVToken environment variable is empty or not set.");
                }
 
                // Add the appropriate authentication header
                if (isMetallic)
                {
                    request.Headers.Add("Authorization", "Bearer " + token);
                }
                else
                {
                    request.Headers.Add("Authtoken", token);
                }
 
                // Add other necessary headers
                request.Headers.Add("Accept", "application/json");
 
                // Create a new HttpClient with custom certificate validation
                using (var handler = new HttpClientHandler
                {
                    ServerCertificateCustomValidationCallback = (message, cert, certChain, errors) =>
                    {
                        // Check if the certificate is valid
                        if (errors == System.Net.Security.SslPolicyErrors.None)
                            return true;
 
                        // Check if the certificate is self-signed
                        if (errors == System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors)
                        {
                            var chainPolicy = new X509ChainPolicy();
                            chainPolicy.RevocationMode = X509RevocationMode.NoCheck;
                            chainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;
 
                            var certChainInstance = new X509Chain();
                            certChainInstance.ChainPolicy = chainPolicy;
                            certChainInstance.Build(cert);
 
                            // If the certificate is self-signed, trust it
                            if (certChainInstance.ChainStatus.Length == 1 && certChainInstance.ChainStatus[0].Status == X509ChainStatusFlags.UntrustedRoot)
                                return true;
                        }
 
                        // Reject any other certificate errors
                        return false;
                    }
                })
                using (var client = new HttpClient(handler))
                {
                    // Let the request continue
                    return await client.SendAsync(request, HttpCompletionOption.ResponseContentRead);
                }
            }
            catch (Exception ex)
            {
                // Log or handle the exception as needed
                throw ex;
            }
        }
 
        private static System.Uri TranslateIncomingRequestToCommvaultAPI(System.Net.Http.HttpRequestMessage request)
        {
            string removeString = "api";
            int removePos = request.RequestUri.AbsoluteUri.IndexOf(removeString) + removeString.Length;
            string URL = System.Environment.GetEnvironmentVariable("WebServerURL") + request.RequestUri.AbsoluteUri.Remove(0, removePos);
 
            var _url = new global::System.Uri(global::System.Text.RegularExpressions.Regex.Replace(
                        URL, "\\?&*$|&*$|(\\?)&+|(&)&+", "$1$2"));
 
            return _url;
        }
    }
}