Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions plugins/out_azure_logs_ingestion/azure_logs_ingestion.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,11 @@ static struct flb_config_map config_map[] = {
0, FLB_TRUE, offsetof(struct flb_az_li, client_secret),
"Set the client secret of the AAD application"
},
{
FLB_CONFIG_MAP_STR, "auth_url", (char *)NULL,
0, FLB_TRUE, offsetof(struct flb_az_li, auth_url_override),
"[Optional] Override the OAuth2 token endpoint."
},
{
FLB_CONFIG_MAP_STR, "dce_url", (char *)NULL,
0, FLB_TRUE, offsetof(struct flb_az_li, dce_url),
Expand Down
1 change: 1 addition & 0 deletions plugins/out_azure_logs_ingestion/azure_logs_ingestion.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ struct flb_az_li {
int compress_enabled;

/* mangement auth */
flb_sds_t auth_url_override;
flb_sds_t auth_url;
struct flb_oauth2 *u_auth;
/* mutex for acquiring tokens */
Expand Down
30 changes: 20 additions & 10 deletions plugins/out_azure_logs_ingestion/azure_logs_ingestion_conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ struct flb_az_li* flb_az_li_ctx_create(struct flb_output_instance *ins,
return NULL;
}
/* config: 'tenant_id' */
if (!ctx->tenant_id) {
if (!ctx->tenant_id && !ctx->auth_url_override) {
flb_plg_error(ins, "property 'tenant_id' is not defined");
flb_az_li_ctx_destroy(ctx);
return NULL;
Expand Down Expand Up @@ -91,16 +91,26 @@ struct flb_az_li* flb_az_li_ctx_create(struct flb_output_instance *ins,
return NULL;
}

/* Allocate and set auth url */
ctx->auth_url = flb_sds_create_size(sizeof(FLB_AZ_LI_AUTH_URL_TMPLT) - 1 +
flb_sds_len(ctx->tenant_id));
if (!ctx->auth_url) {
flb_errno();
flb_az_li_ctx_destroy(ctx);
return NULL;
if (ctx->auth_url_override) {
ctx->auth_url = flb_sds_create(ctx->auth_url_override);
if (!ctx->auth_url) {
flb_errno();
flb_az_li_ctx_destroy(ctx);
return NULL;
}
}
else {
/* Allocate and set auth url */
ctx->auth_url = flb_sds_create_size(sizeof(FLB_AZ_LI_AUTH_URL_TMPLT) - 1 +
flb_sds_len(ctx->tenant_id));
if (!ctx->auth_url) {
flb_errno();
flb_az_li_ctx_destroy(ctx);
return NULL;
}
flb_sds_snprintf(&ctx->auth_url, flb_sds_alloc(ctx->auth_url),
FLB_AZ_LI_AUTH_URL_TMPLT, ctx->tenant_id);
}
flb_sds_snprintf(&ctx->auth_url, flb_sds_alloc(ctx->auth_url),
FLB_AZ_LI_AUTH_URL_TMPLT, ctx->tenant_id);

/* Allocate and set dce full url */
ctx->dce_u_url = flb_sds_create_size(sizeof(FLB_AZ_LI_DCE_URL_TMPLT) - 1 +
Expand Down
1 change: 1 addition & 0 deletions src/flb_oauth2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1201,6 +1201,7 @@ struct flb_oauth2 *flb_oauth2_create(struct flb_config *config,
(void) expire_sec;

oauth2_apply_defaults(&cfg);
cfg.enabled = FLB_TRUE;
cfg.token_url = flb_sds_create(auth_url);
cfg.refresh_skew = FLB_OAUTH2_DEFAULT_SKEW_SECS;

Expand Down
72 changes: 72 additions & 0 deletions tests/internal/oauth2.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,26 @@ static struct flb_oauth2 *create_oauth_ctx(struct flb_config *config,
return ctx;
}

static struct flb_oauth2 *create_legacy_oauth_ctx(struct flb_config *config,
struct oauth2_mock_server *server)
{
flb_sds_t token_url;
struct flb_oauth2 *ctx;

token_url = flb_sds_create_size(64);
TEST_CHECK(token_url != NULL);
if (!token_url) {
return NULL;
}

flb_sds_printf(&token_url, "http://127.0.0.1:%d/token", server->port);

ctx = flb_oauth2_create(config, token_url, 300);
flb_sds_destroy(token_url);

return ctx;
}

static int write_text_file(const char *path, const char *content)
{
FILE *fp;
Expand Down Expand Up @@ -948,6 +968,57 @@ void test_caching_and_refresh(void)
flb_config_exit(config);
}

void test_legacy_create_manual_payload_flow(void)
{
int ret;
char *token;
struct flb_config *config;
struct flb_oauth2 *ctx;
struct oauth2_mock_server server;

config = flb_config_init();
TEST_CHECK(config != NULL);

ret = oauth2_mock_server_start(&server, 3600, 0);
TEST_CHECK(ret == 0);

ctx = create_legacy_oauth_ctx(config, &server);
TEST_CHECK(ctx != NULL);

#ifdef FLB_SYSTEM_MACOS
ret = oauth2_mock_server_wait_ready(&server);
TEST_CHECK(ret == 0);
#endif

flb_oauth2_payload_clear(ctx);

ret = flb_oauth2_payload_append(ctx, "grant_type", -1,
"client_credentials", -1);
TEST_CHECK(ret == 0);

ret = flb_oauth2_payload_append(ctx, "client_id", -1, "legacy-id", -1);
TEST_CHECK(ret == 0);

ret = flb_oauth2_payload_append(ctx, "client_secret", -1,
"legacy-secret", -1);
TEST_CHECK(ret == 0);

token = flb_oauth2_token_get(ctx);
TEST_CHECK(token != NULL);
TEST_CHECK(server.token_requests == 1);
TEST_CHECK(strcmp(token, "mock-token-1") == 0);
TEST_CHECK(strstr(server.latest_token_request,
"grant_type=client_credentials") != NULL);
TEST_CHECK(strstr(server.latest_token_request,
"client_id=legacy-id") != NULL);
TEST_CHECK(strstr(server.latest_token_request,
"client_secret=legacy-secret") != NULL);

flb_oauth2_destroy(ctx);
oauth2_mock_server_stop(&server);
flb_config_exit(config);
}

void test_private_key_jwt_body(void)
{
int ret;
Expand Down Expand Up @@ -1078,6 +1149,7 @@ TEST_LIST = {
test_parse_rejects_missing_required_fields},
{"parse_rejects_invalid_expires_in", test_parse_rejects_invalid_expires_in},
{"caching_and_refresh", test_caching_and_refresh},
{"legacy_create_manual_payload_flow", test_legacy_create_manual_payload_flow},
{"private_key_jwt_body", test_private_key_jwt_body},
{"private_key_jwt_x5t_header", test_private_key_jwt_x5t_header},
{0}
Expand Down
Loading