bool check_file_size_s3()

in api/src/gmsa_service.cpp [2565:2639]


bool check_file_size_s3( std::string s3_arn, std::string region,
                         Aws::Auth::AWSCredentials credentials, bool test = false )
{
    std::string response = "";
    Aws::SDKOptions options;
    try
    {
        Aws::InitAPI( options );
        {
            Aws::Client::ClientConfiguration clientConfig;
            clientConfig.region = region;
            auto provider = Aws::MakeShared<Aws::Auth::SimpleAWSCredentialsProvider>( "alloc-tag",
                                                                                      credentials );
            auto creds = provider->GetAWSCredentials();
            if ( creds.IsEmpty() )
            {
                std::cerr << Util::getCurrentTime() << '\t'
                          << "ERROR: Failed authentication invalid creds" << std::endl;
                return false;
            }
            std::smatch arn_match;
            std::regex pattern( "arn:([^:]+):s3:::([^/]+)/(.+)" );
            if ( !std::regex_search( s3_arn, arn_match, pattern ) )
            {
                std::cerr << Util::getCurrentTime() << '\t'
                          << "ERROR: s3 arn provided is not valid " << s3_arn << std::endl;
                return false;
            }
            std::string s3Bucket = std::string( arn_match[2] );
            std::string objectName = std::string( arn_match[3] );

            if ( test )
            {
                std::cerr << s3Bucket;
                std::cerr << objectName;
                return true;
            }

            Aws::S3::S3Client s3Client(
                credentials,
                Aws::MakeShared<Aws::S3::S3EndpointProvider>( Aws::S3::S3Client::ALLOCATION_TAG ),
                clientConfig );
            Aws::S3::Model::HeadObjectRequest request;
            request.SetBucket( s3Bucket );
            request.SetKey( objectName );
            Aws::S3::Model::HeadObjectOutcome outcome = s3Client.HeadObject( request );

            if ( !outcome.IsSuccess() )
            {
                const Aws::S3::S3Error& err = outcome.GetError();
                std::cerr << Util::getCurrentTime() << '\t'
                          << "ERROR: HeadObject: " << err.GetExceptionName() << ": "
                          << err.GetMessage() << std::endl;
                return false;
            }
            long objLen = outcome.GetResult().GetContentLength();
            // value should be less than 4000 bytes
            if ( objLen > 4000 )
            {
                return false;
            }
        }
    }
    catch ( ... )
    {
        std::cerr << Util::getCurrentTime() << '\t'
                  << "ERROR: retrieving credentialspec from s3 "
                     "failed"
                  << std::endl;
        return false;
    }
    std::cerr << Util::getCurrentTime() << '\t' << "INFO: credentialspec object size retrieved"
              << std::endl;
    return true;
}