From be3714465b0cebbd15f2436d81c58929bc4045b1 Mon Sep 17 00:00:00 2001 From: Hoan Luu Huu <110280845+xquanluu@users.noreply.github.com> Date: Thu, 2 May 2024 19:28:01 +0700 Subject: [PATCH] support aws sessionToken (#58) * support aws sessionToken Signed-off-by: Hoan HL * wip Signed-off-by: Hoan HL * fix code style --------- Signed-off-by: Hoan HL --- mod_aws_lex/aws_lex_glue.cpp | 14 +++++++++----- mod_aws_lex/mod_aws_lex.h | 1 + mod_aws_transcribe/aws_transcribe_glue.cpp | 20 +++++++++++--------- mod_aws_transcribe/mod_aws_transcribe.h | 1 + 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/mod_aws_lex/aws_lex_glue.cpp b/mod_aws_lex/aws_lex_glue.cpp index 2f650b0..590e9f3 100644 --- a/mod_aws_lex/aws_lex_glue.cpp +++ b/mod_aws_lex/aws_lex_glue.cpp @@ -173,13 +173,12 @@ public: char *metadata, const char* awsAccessKeyId, const char* awsSecretAccessKey, + const char* awsSessionToken, responseHandler_t responseHandler, errorHandler_t errorHandler) : m_bot(bot), m_alias(alias), m_region(region), m_sessionId(sessionId), m_finished(false), m_finishing(false), m_packets(0), m_pStream(nullptr), m_bPlayDone(false), m_bDiscardAudio(false) { - Aws::String key(awsAccessKeyId); - Aws::String secret(awsSecretAccessKey); Aws::String awsLocale(locale); Aws::Client::ClientConfiguration config; config.region = region; @@ -190,8 +189,11 @@ public: for (int i = 4; i < 20; i++) keySnippet[i] = 'x'; keySnippet[19] = '\0'; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "GStreamer %p ACCESS_KEY_ID %s\n", this, keySnippet); - if (*awsAccessKeyId && *awsSecretAccessKey) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "GStreamer %p ACCESS_KEY_ID %s\n", this, keySnippet); + if (*awsAccessKeyId && *awsSecretAccessKey && *awsSessionToken) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "using AWS creds %s %s %s\n", awsAccessKeyId, awsSecretAccessKey, awsSessionToken); + m_client = Aws::MakeUnique(ALLOC_TAG, AWSCredentials(awsAccessKeyId, awsSecretAccessKey, awsSessionToken), config); + } else if (*awsAccessKeyId && *awsSecretAccessKey) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "using AWS creds %s %s\n", awsAccessKeyId, awsSecretAccessKey); m_client = Aws::MakeUnique(ALLOC_TAG, AWSCredentials(awsAccessKeyId, awsSecretAccessKey), config); } @@ -540,7 +542,7 @@ static void *SWITCH_THREAD_FUNC lex_thread(switch_thread_t *thread, void *obj) { bool ok = true; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "lex_thread: starting cb %p\n", (void *) cb); GStreamer* pStreamer = new GStreamer(cb->sessionId, cb->bot, cb->alias, cb->region, cb->locale, - cb->intent, cb->metadata, cb->awsAccessKeyId, cb->awsSecretAccessKey, + cb->intent, cb->metadata, cb->awsAccessKeyId, cb->awsSecretAccessKey, cb->awsSessionToken, cb->responseHandler, cb->errorHandler); if (!pStreamer) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "lex_thread: Error allocating streamer\n"); @@ -641,6 +643,7 @@ extern "C" { memset(cb, sizeof(cb), 0); const char* awsAccessKeyId = switch_channel_get_variable(channel, "AWS_ACCESS_KEY_ID"); const char* awsSecretAccessKey = switch_channel_get_variable(channel, "AWS_SECRET_ACCESS_KEY"); + const char* awsSessionToken = switch_channel_get_variable(channel, "AWS_SESSION_TOKEN"); if (!hasDefaultCredentials && (!awsAccessKeyId || !awsSecretAccessKey)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, @@ -654,6 +657,7 @@ extern "C" { if (awsAccessKeyId && awsSecretAccessKey) { strncpy(cb->awsAccessKeyId, awsAccessKeyId, 128); strncpy(cb->awsSecretAccessKey, awsSecretAccessKey, 128); + if (awsSessionToken) strncpy(cb->awsSessionToken, awsSessionToken, 1024); } else { strncpy(cb->awsAccessKeyId, std::getenv("AWS_ACCESS_KEY_ID"), 128); diff --git a/mod_aws_lex/mod_aws_lex.h b/mod_aws_lex/mod_aws_lex.h index c65bdb5..9164bab 100644 --- a/mod_aws_lex/mod_aws_lex.h +++ b/mod_aws_lex/mod_aws_lex.h @@ -30,6 +30,7 @@ struct cap_cb { char sessionId[256]; char awsAccessKeyId[128]; char awsSecretAccessKey[128]; + char awsSessionToken[1024]; SpeexResamplerState *resampler; void* streamer; responseHandler_t responseHandler; diff --git a/mod_aws_transcribe/aws_transcribe_glue.cpp b/mod_aws_transcribe/aws_transcribe_glue.cpp index 9deaaba..0e1d8f2 100644 --- a/mod_aws_transcribe/aws_transcribe_glue.cpp +++ b/mod_aws_transcribe/aws_transcribe_glue.cpp @@ -49,12 +49,11 @@ public: const char* region, const char* awsAccessKeyId, const char* awsSecretAccessKey, + const char* awsSessionToken, responseHandler_t responseHandler ) : m_sessionId(sessionId), m_bugname(bugname), m_finished(false), m_interim(interim), m_finishing(false), m_connected(false), m_connecting(false), m_packets(0), m_responseHandler(responseHandler), m_pStream(nullptr), m_audioBuffer(320 * (samples_per_second == 8000 ? 1 : 2), 15) { - Aws::String key(awsAccessKeyId); - Aws::String secret(awsSecretAccessKey); Aws::Client::ClientConfiguration config; if (region != nullptr && strlen(region) > 0) config.region = region; char keySnippet[20]; @@ -63,8 +62,10 @@ public: for (int i = 4; i < 20; i++) keySnippet[i] = 'x'; keySnippet[19] = '\0'; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "GStreamer %p ACCESS_KEY_ID %s, region %s\n", this, keySnippet, region); - if (*awsAccessKeyId && *awsSecretAccessKey) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "GStreamer %p ACCESS_KEY_ID %s, region %s\n", this, keySnippet, region); + if (*awsAccessKeyId && *awsSecretAccessKey && *awsSessionToken) { + m_client = Aws::MakeUnique(ALLOC_TAG, AWSCredentials(awsAccessKeyId, awsSecretAccessKey, awsSessionToken), config); + } else if (*awsAccessKeyId && *awsSecretAccessKey) { m_client = Aws::MakeUnique(ALLOC_TAG, AWSCredentials(awsAccessKeyId, awsSecretAccessKey), config); } else { @@ -320,8 +321,8 @@ static void *SWITCH_THREAD_FUNC aws_transcribe_thread(switch_thread_t *thread, v struct cap_cb *cb = (struct cap_cb *) obj; bool ok = true; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "transcribe_thread: starting cb %p\n", (void *) cb); - GStreamer* pStreamer = new GStreamer(cb->sessionId, cb->bugname, cb->channels, cb->lang, cb->interim, cb->samples_per_second, cb->region, cb->awsAccessKeyId, cb->awsSecretAccessKey, - cb->responseHandler); + GStreamer* pStreamer = new GStreamer(cb->sessionId, cb->bugname, cb->channels, cb->lang, cb->interim, cb->samples_per_second, + cb->region, cb->awsAccessKeyId, cb->awsSecretAccessKey, cb->awsSessionToken, cb->responseHandler); if (!pStreamer) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "transcribe_thread: Error allocating streamer\n"); return nullptr; @@ -408,6 +409,7 @@ extern "C" { memset(cb, sizeof(cb), 0); const char* awsAccessKeyId = switch_channel_get_variable(channel, "AWS_ACCESS_KEY_ID"); const char* awsSecretAccessKey = switch_channel_get_variable(channel, "AWS_SECRET_ACCESS_KEY"); + const char* awsSessionToken = switch_channel_get_variable(channel, "AWS_SESSION_TOKEN"); const char* awsRegion = switch_channel_get_variable(channel, "AWS_REGION"); cb->channels = channels; LanguageCode code = LanguageCodeMapper::GetLanguageCodeForName(lang); @@ -419,12 +421,12 @@ extern "C" { strncpy(cb->sessionId, switch_core_session_get_uuid(session), MAX_SESSION_ID); strncpy(cb->bugname, bugname, MAX_BUG_LEN); - if (awsAccessKeyId && awsSecretAccessKey && awsRegion) { + if (awsRegion) strncpy(cb->region, awsRegion, MAX_REGION); + if (awsAccessKeyId && awsSecretAccessKey) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Using channel vars for aws authentication\n"); strncpy(cb->awsAccessKeyId, awsAccessKeyId, 128); strncpy(cb->awsSecretAccessKey, awsSecretAccessKey, 128); - strncpy(cb->region, awsRegion, MAX_REGION); - + if (awsSessionToken) strncpy(cb->awsSessionToken, awsSessionToken, 1024); } else if (std::getenv("AWS_ACCESS_KEY_ID") && std::getenv("AWS_SECRET_ACCESS_KEY") && diff --git a/mod_aws_transcribe/mod_aws_transcribe.h b/mod_aws_transcribe/mod_aws_transcribe.h index 90784bb..0132d2a 100644 --- a/mod_aws_transcribe/mod_aws_transcribe.h +++ b/mod_aws_transcribe/mod_aws_transcribe.h @@ -28,6 +28,7 @@ struct cap_cb { char sessionId[MAX_SESSION_ID+1]; char awsAccessKeyId[128]; char awsSecretAccessKey[128]; + char awsSessionToken[1024]; uint32_t channels; SpeexResamplerState *resampler; void* streamer;