1//go:build !go1.13
2// +build !go1.13
3
4// Copyright 2017 Microsoft Corporation
5//
6//  Licensed under the Apache License, Version 2.0 (the "License");
7//  you may not use this file except in compliance with the License.
8//  You may obtain a copy of the License at
9//
10//      http://www.apache.org/licenses/LICENSE-2.0
11//
12//  Unless required by applicable law or agreed to in writing, software
13//  distributed under the License is distributed on an "AS IS" BASIS,
14//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15//  See the License for the specific language governing permissions and
16//  limitations under the License.
17
18package adal
19
20import (
21	"context"
22	"net/http"
23	"time"
24)
25
26func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) {
27	tempCtx, cancel := context.WithTimeout(ctx, 500*time.Millisecond)
28	defer cancel()
29	req, _ := http.NewRequest(http.MethodGet, msiEndpoint, nil)
30	req = req.WithContext(tempCtx)
31	q := req.URL.Query()
32	q.Add("api-version", msiAPIVersion)
33	req.URL.RawQuery = q.Encode()
34	return sender.Do(req)
35}
36
37// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
38// RefreshWithin) and autoRefresh flag is on.  This method is safe for concurrent use.
39func (mt *MultiTenantServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
40	if err := mt.PrimaryToken.EnsureFreshWithContext(ctx); err != nil {
41		return err
42	}
43	for _, aux := range mt.AuxiliaryTokens {
44		if err := aux.EnsureFreshWithContext(ctx); err != nil {
45			return err
46		}
47	}
48	return nil
49}
50
51// RefreshWithContext obtains a fresh token for the Service Principal.
52func (mt *MultiTenantServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
53	if err := mt.PrimaryToken.RefreshWithContext(ctx); err != nil {
54		return err
55	}
56	for _, aux := range mt.AuxiliaryTokens {
57		if err := aux.RefreshWithContext(ctx); err != nil {
58			return err
59		}
60	}
61	return nil
62}
63
64// RefreshExchangeWithContext refreshes the token, but for a different resource.
65func (mt *MultiTenantServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
66	if err := mt.PrimaryToken.RefreshExchangeWithContext(ctx, resource); err != nil {
67		return err
68	}
69	for _, aux := range mt.AuxiliaryTokens {
70		if err := aux.RefreshExchangeWithContext(ctx, resource); err != nil {
71			return err
72		}
73	}
74	return nil
75}
76