From 572b2872fe0d0de83ca06fcd2f0b7c07c8bc1abd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 15:28:26 +0000 Subject: [PATCH 1/2] Initial plan From bee7706c8a6d0a82a1c3153bf62e7ff189a95c0c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 15:34:55 +0000 Subject: [PATCH 2/2] Teams connector: Add tenantId support for Single Tenant Azure Bot Agent-Logs-Url: https://github.com/theopenconversationkit/tock/sessions/80792963-2820-416b-989d-5d6a99a7f22d Co-authored-by: zigzago <603014+zigzago@users.noreply.github.com> --- bot/connector-teams/src/main/kotlin/TeamsConnector.kt | 3 ++- .../src/main/kotlin/TeamsConnectorProvider.kt | 7 +++++++ .../src/main/kotlin/token/RetrofitsInterface.kt | 4 +++- bot/connector-teams/src/main/kotlin/token/TokenHandler.kt | 7 ++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/bot/connector-teams/src/main/kotlin/TeamsConnector.kt b/bot/connector-teams/src/main/kotlin/TeamsConnector.kt index c62693fdfd..0b78e9b78d 100644 --- a/bot/connector-teams/src/main/kotlin/TeamsConnector.kt +++ b/bot/connector-teams/src/main/kotlin/TeamsConnector.kt @@ -69,12 +69,13 @@ internal class TeamsConnector( private val path: String, val appId: String, val appPassword: String, + val tenantId: String = "botframework.com", ) : ConnectorBase(teamsConnectorType, setOf(CAROUSEL)) { companion object { private val logger = KotlinLogging.logger {} } - private var tokenHandler = TokenHandler(appId, appPassword) + private var tokenHandler = TokenHandler(appId, appPassword, tenantId) private val client = TeamsClient(tokenHandler) private val jwkHandler = JWKHandler() private val executor: Executor by injector.instance() diff --git a/bot/connector-teams/src/main/kotlin/TeamsConnectorProvider.kt b/bot/connector-teams/src/main/kotlin/TeamsConnectorProvider.kt index 910e553678..13cca3ca0f 100644 --- a/bot/connector-teams/src/main/kotlin/TeamsConnectorProvider.kt +++ b/bot/connector-teams/src/main/kotlin/TeamsConnectorProvider.kt @@ -36,6 +36,7 @@ import kotlin.reflect.KClass internal object TeamsConnectorProvider : ConnectorProvider { private const val APP_ID = "appId" private const val PASSWORD = "password" + private const val TENANT_ID = "tenantId" override val connectorType: ConnectorType get() = teamsConnectorType @@ -46,6 +47,7 @@ internal object TeamsConnectorProvider : ConnectorProvider { path = path, appId = parameters.getValue(APP_ID), appPassword = parameters.getValue(PASSWORD), + tenantId = parameters[TENANT_ID]?.takeIf { it.isNotBlank() } ?: "botframework.com", ) } } @@ -64,6 +66,11 @@ internal object TeamsConnectorProvider : ConnectorProvider { PASSWORD, true, ), + ConnectorTypeConfigurationField( + "Tenant ID (optional, for Single Tenant bots)", + TENANT_ID, + false, + ), ), resourceAsString("/teams.svg"), ) diff --git a/bot/connector-teams/src/main/kotlin/token/RetrofitsInterface.kt b/bot/connector-teams/src/main/kotlin/token/RetrofitsInterface.kt index 795ea4097c..28e4fedc96 100644 --- a/bot/connector-teams/src/main/kotlin/token/RetrofitsInterface.kt +++ b/bot/connector-teams/src/main/kotlin/token/RetrofitsInterface.kt @@ -21,12 +21,14 @@ import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.Headers import retrofit2.http.POST +import retrofit2.http.Path interface LoginMicrosoftOnline { @Headers("Host:login.microsoftonline.com", "Content-Type:application/x-www-form-urlencoded") - @POST("/botframework.com/oauth2/v2.0/token") + @POST("{tenantId}/oauth2/v2.0/token") @FormUrlEncoded fun login( + @Path("tenantId") tenantId: String, @Field("grant_type") grantType: String = "client_credentials", @Field("client_id") clientId: String, @Field("client_secret") clientSecret: String, diff --git a/bot/connector-teams/src/main/kotlin/token/TokenHandler.kt b/bot/connector-teams/src/main/kotlin/token/TokenHandler.kt index 2b0e4965ed..c659e6e87b 100644 --- a/bot/connector-teams/src/main/kotlin/token/TokenHandler.kt +++ b/bot/connector-teams/src/main/kotlin/token/TokenHandler.kt @@ -35,7 +35,11 @@ import kotlin.concurrent.fixedRateTimer * Handle the generation and the refresh of the token header * This token is mandatory in request from bot to teams via microsoft-api */ -class TokenHandler(private val appId: String, private val password: String) { +class TokenHandler( + private val appId: String, + private val password: String, + private val tenantId: String = "botframework.com", +) { private val logger = KotlinLogging.logger {} @Volatile @@ -90,6 +94,7 @@ class TokenHandler(private val appId: String, private val password: String) { private fun fetchToken() { val response = loginApi.login( + tenantId = tenantId, clientId = appId, clientSecret = password, ).execute()