ADUC_Result ADUC_RootKeyPackageUtils_DownloadPackage()

in src/utils/rootkeypackage_utils/src/rootkeypackage_download.c [29:136]


ADUC_Result ADUC_RootKeyPackageUtils_DownloadPackage(
    const char* rootKeyPkgUrl,
    const char* workflowId,
    ADUC_RootKeyPkgDownloaderInfo* downloaderInfo,
    STRING_HANDLE* outRootKeyPackageDownloadedFile)
{
    ADUC_Result result = { .ResultCode = ADUC_GeneralResult_Failure, .ExtendedResultCode = 0 };
    int err = 0;

    STRING_HANDLE targetDir = NULL;
    STRING_HANDLE targetFileName = NULL;
    STRING_HANDLE targetFilePath = NULL;
    STRING_HANDLE targetUrl = NULL;

    if (IsNullOrEmpty(rootKeyPkgUrl) || IsNullOrEmpty(workflowId) || downloaderInfo == NULL
        || IsNullOrEmpty(downloaderInfo->name) || IsNullOrEmpty(downloaderInfo->downloadBaseDir)
        || downloaderInfo->downloadFn == NULL || outRootKeyPackageDownloadedFile == NULL)
    {
        Log_Error("bad arg");
        result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_DOWNLOAD_BADARG;
        goto done;
    }

    if ((targetDir = STRING_construct_sprintf("%s/%s", downloaderInfo->downloadBaseDir, workflowId)) == NULL)
    {
        result.ExtendedResultCode = ADUC_ERC_NOMEM;
        goto done;
    }

    if (ADUC_SystemUtils_MkDirRecursiveDefault(STRING_c_str(targetDir)) != 0)
    {
        Log_Error("Failed creation of dir '%s'", targetDir);
        result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_DOWNLOAD_MKDIR_DWNLD_FOLDER;
        goto done;
    }

    if (IsNullOrEmpty(ADUC_ROOTKEY_PKG_URL_OVERRIDE))
    {
        targetUrl = STRING_construct(rootKeyPkgUrl);
    }
    else
    {
        targetUrl = STRING_construct(ADUC_ROOTKEY_PKG_URL_OVERRIDE);
    }

    Log_Debug("targetUrl: '%s'", STRING_c_str(targetUrl));

    if (targetUrl == NULL)
    {
        result.ExtendedResultCode = ADUC_ERC_NOMEM;
        goto done;
    }

    result = ADUC_UrlUtils_GetPathFileName(STRING_c_str(targetUrl), &targetFileName);
    if (IsAducResultCodeFailure(result.ResultCode) || (0 == STRING_length(targetFileName)))
    {
        Log_Error("failed get path, or null/empty targetFileName['%s'], result: 0x%08x", STRING_c_str(targetFileName), result.ExtendedResultCode);
        result.ResultCode = ADUC_GeneralResult_Failure;
        result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_DOWNLOAD_URL_BAD_PATH;
        goto done;
    }

    targetFilePath = STRING_construct_sprintf("%s/%s", STRING_c_str(targetDir), STRING_c_str(targetFileName));
    if (targetFilePath == NULL)
    {
        result.ResultCode = ADUC_GeneralResult_Failure;
        result.ExtendedResultCode = ADUC_ERC_NOMEM;
        goto done;
    }

    if (SystemUtils_IsFile(STRING_c_str(targetFilePath), &err))
    {
        Log_Warn("rootkey package '%s' in sandbox. Try deletion...", STRING_c_str(targetFileName));
        if (unlink(STRING_c_str(targetFilePath)) != 0)
        {
            Log_Warn("Fail unlink '%s': %d", STRING_c_str(targetFilePath), errno);
            // continue below and try to download anyways.
        }
    }

    // There is no hash to check so it is a forced download without lookup of
    // existing file. Also, the package has self-referential integrity with
    // signatures json array of signatures of the protected properties in the
    // same json file, so download the file without hash verification.
    Log_Debug("Attempting download of '%s' using '%s'", STRING_c_str(targetUrl), downloaderInfo->name);

    result = (*(downloaderInfo->downloadFn))(STRING_c_str(targetUrl), STRING_c_str(targetFilePath));

    if (IsAducResultCodeFailure(result.ResultCode))
    {
        Log_Error("Unable to download root key pkg.");
        goto done;
    }

    *outRootKeyPackageDownloadedFile = targetFilePath;
    targetFilePath = NULL;

    result.ResultCode = ADUC_GeneralResult_Success;
    result.ExtendedResultCode = 0;

done:
    STRING_delete(targetDir);
    STRING_delete(targetFileName);
    STRING_delete(targetFilePath);
    STRING_delete(targetUrl);

    return result;
}