Esempio n. 1
0
        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));
            }
        }
Esempio n. 2
0
        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;
 }