public async Task <IEnumerable <ProcessedTenant> > GetTenantsAsync(TeamsTokenInfo tokenInfo) { logger.Debug("Start: Retrieving tenants for user {UserId}...", tokenInfo.UserId.Truncate(Constants.UserIdLogLength, true)); try { var client = Utils.CreateHttpClient(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Add("authority", "teams.microsoft.com"); client.DefaultRequestHeaders.Add("scheme", "https"); client.DefaultRequestHeaders.Add("pragma", "no-cache"); client.DefaultRequestHeaders.Add("cache-control", "no-cache"); client.DefaultRequestHeaders.Add("x-ms-client-type", "web"); client.DefaultRequestHeaders.Add("Authorization", tokenInfo.AuthHeader); client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57"); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("Referer", "https://teams.microsoft.com/"); client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate")); client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("br")); client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("de")); var result = await client.GetAsync("https://teams.microsoft.com/api/mt/emea/beta/users/tenants"); if (result.IsSuccessStatusCode) { var buffer = await result.Content.ReadAsByteArrayAsync(); var data = Encoding.UTF8.GetString(buffer, 0, buffer.Length); var tenants = JsonUtils.DeserializeObject <List <Tenant> >(logger, data); logger.Debug("Got tenant list for user {UserId}: {TenantCount}", tokenInfo.UserId.Truncate(Constants.UserIdLogLength, true), tenants.Count); return(UpdateTenantList(tenants)); } else { logger.Debug("No success status code while retrieving tenants for user {UserId}: {StatusCode}", tokenInfo.UserId.Truncate(Constants.UserIdLogLength, true), result.StatusCode); return(new List <ProcessedTenant>()); } } finally { logger.Debug("Done: Retrieving tenants for user {UserId}", tokenInfo.UserId.Truncate(Constants.UserIdLogLength, true)); } }
private async Task UpdateTenantsForTokenAsync(TeamsTokenInfo tokenInfo) { Debug.Assert(tokenInfo.TokenType == TeamsTokenType.MyTenantsAuthHeader); var contexts = dataContexts.Where(ctx => ctx.Tenant?.UserId == tokenInfo.UserId); if (!contexts.Any()) { var tenants = await teamsGlobalApiAccessor.GetTenantsAsync(tokenInfo); if (tenants == null) { return; } var mainTenant = tenants.Where(t => t.UserType == "member"); if (!mainTenant.Any()) { logger.Warning("Cannot find main tenant for user {UserId}", tokenInfo.UserId); return; } if (mainTenant.Count() > 1) { logger.Warning("Found multiple main tenants for user {UserId}; this needs to be handled in code", tokenInfo.UserId); return; } var mainUserId = mainTenant.Single().UserId; foreach (var tenant in tenants) { var dataContext = new TeamsDataContext(mainUserId, tenant); dataContexts.Add(dataContext); TenantSource.OnNext(dataContext); } } }
public DataContextWithToken(TeamsTokenInfo tokenInfo, TeamsDataContext dataContext) { DataContext = dataContext; TokenInfo = tokenInfo; }