in S3_HLS_S3_Put_Client.c [362:523]
int32_t S3_HLS_Client_Set_Credential(S3_HLS_CLIENT_CTX* ctx, char* ak, char* sk, char* token) {
PUT_DEBUG("Setting Credential!\n");
if(NULL == ctx || NULL == ak || NULL == sk)
return S3_HLS_INVALID_PARAMETER;
int32_t ret = S3_HLS_OK;
uint32_t secret_access_key_length = snprintf(NULL, 0, S3_HLS_SECRET_ACCESS_KEY_FORMAT, sk);
if(0 >= secret_access_key_length) {
PUT_DEBUG("Setting Access Key Failed\n");
return S3_HLS_UNKNOWN_INTERNAL_ERROR;
}
uint32_t token_header_length = 0;
if(NULL != token) {
token_header_length = snprintf(NULL, 0, S3_HLS_TOKEN_HEADER_FORMAT, token);
if(0 >= token_header_length) {
PUT_DEBUG("Setting Token Failed\n");
return S3_HLS_UNKNOWN_INTERNAL_ERROR;
}
}
// lock credential lock
if(0 != pthread_mutex_lock(&ctx->credential_lock))
return S3_HLS_LOCK_FAILED;
uint32_t auth_header_length = snprintf(
NULL,
0,
S3_HLS_AUTHENTICATION_HEADER_FORMAT,
ak,
S3_HLS_DUMMY_DATE,
ctx->region,
S3_HLS_TOKEN_HEADER_IN_CANONICAL_REQUEST,
S3_HLS_TAG_HEADER_IN_CANONICAL_REQUEST,
S3_HLS_EMPTY_STRING
);
if(0 >= auth_header_length) {
PUT_DEBUG("Setting Authorization Header Failed\n");
return S3_HLS_UNKNOWN_INTERNAL_ERROR;
}
// add additional length for hash
auth_header_length += S3_HLS_HEX_HASH_STIRNG_LENGTH;
secret_access_key_length++;
auth_header_length++;
if(token_header_length > 0)
token_header_length++;
PUT_DEBUG("Buffer Length: Token Header: %d, SK: %d, Auth Header %d!\n", token_header_length, secret_access_key_length, auth_header_length);
// start allocate memory if necessary
char* temp_secret_access_key = NULL;
char* temp_token_header = NULL;
char* temp_auth_header = NULL;
if(secret_access_key_length > ctx->secret_access_key_length) {
temp_secret_access_key = (char*)malloc(secret_access_key_length);
if(NULL == temp_secret_access_key) {
ret = S3_HLS_OUT_OF_MEMORY;
goto l_unlock;
}
}
if(NULL != token) {
if(token_header_length > ctx->token_header_length) {
temp_token_header = (char*)malloc(token_header_length);
if(NULL == temp_token_header) {
ret = S3_HLS_OUT_OF_MEMORY;
if(NULL != temp_secret_access_key)
free(temp_secret_access_key);
goto l_unlock;
}
}
}
if(auth_header_length > ctx->auth_header_length) {
temp_auth_header = (char*)malloc(auth_header_length);
if(NULL == temp_auth_header) {
ret = S3_HLS_OUT_OF_MEMORY;
if(NULL != temp_secret_access_key)
free(temp_secret_access_key);
if(NULL != temp_token_header)
free(temp_token_header);
goto l_unlock;
}
}
// update pointer and length marks
if(NULL != temp_secret_access_key) {
if(NULL != ctx->secret_access_key) {
free(ctx->secret_access_key);
}
ctx->secret_access_key = temp_secret_access_key;
ctx->secret_access_key_length = secret_access_key_length;
}
if(NULL != temp_token_header) {
if(NULL != ctx->token_header) {
free(ctx->token_header);
}
ctx->token_header = temp_token_header;
ctx->token_header_length = token_header_length;
}
if(NULL != temp_auth_header) {
if(NULL != ctx->auth_header) {
free(ctx->auth_header);
}
ctx->auth_header = temp_auth_header;
ctx->auth_header_length = auth_header_length;
}
// Start writing to variables
uint32_t length = sprintf(ctx->secret_access_key, S3_HLS_SECRET_ACCESS_KEY_FORMAT, sk);
if(0 >= length) {
PUT_DEBUG("Print SK Failed\n");
ret = S3_HLS_UNKNOWN_INTERNAL_ERROR;
goto l_unlock;
}
if(NULL != token) {
length = sprintf(ctx->token_header, S3_HLS_TOKEN_HEADER_FORMAT, token);
if(0 >= length) {
PUT_DEBUG("Print Token Header Failed\n");
ret = S3_HLS_UNKNOWN_INTERNAL_ERROR;
goto l_unlock;
}
} else if(NULL != ctx->token_header) { // in case of last token is not null and new one is null
free(ctx->token_header);
ctx->token_header = NULL;
ctx->token_header_length = 0;
}
// auth header only need to allocate space
ctx->access_key = ak;
PUT_DEBUG("AK: %s\n", ctx->access_key);
PUT_DEBUG("SK: %s\n", ctx->secret_access_key);
if(NULL != ctx->token_header) {
PUT_DEBUG("Token: %s\n", ctx->token_header);
}
l_unlock:
pthread_mutex_unlock(&ctx->credential_lock);
return ret;
}