Files
cloudfox/azure/shared.go

130 lines
3.6 KiB
Go

package azure
import (
"context"
"fmt"
"github.com/Azure/azure-sdk-for-go/profiles/latest/resources/mgmt/subscriptions"
"github.com/BishopFox/cloudfox/internal"
"github.com/aws/smithy-go/ptr"
)
type TenantInfo struct {
ID *string
DefaultDomain *string
Subscriptions []SubsriptionInfo
}
type SubsriptionInfo struct {
Subscription subscriptions.Subscription
ID string
Name string
}
// function that takes a subscription ID and returns the DisplayName of the subscription
func GetSubscriptionNameFromID(subscriptionID string) *string {
subs := GetSubscriptions()
for _, s := range subs {
if ptr.ToString(s.SubscriptionID) == subscriptionID {
return s.DisplayName
}
}
return nil
}
func GetSubscriptionIDFromName(subscriptionName string) *string {
subs := GetSubscriptions()
for _, s := range subs {
if ptr.ToString(s.DisplayName) == subscriptionName {
return s.SubscriptionID
}
}
return nil
}
// function that takes the AzSubscription string and first checks to see if it is a valid subscription ID, and if not, checks to see if it is a valid subscription display name. It then returns the subscription ID
func GetSubscriptionID(subscription string) *string {
subs := GetSubscriptions()
for _, s := range subs {
if ptr.ToString(s.SubscriptionID) == subscription {
return s.SubscriptionID
}
if ptr.ToString(s.DisplayName) == subscription {
return s.SubscriptionID
}
}
return nil
}
func GetSubscriptionsPerTenantID(tenantID string) []subscriptions.Subscription {
subs := GetSubscriptions()
var results []subscriptions.Subscription
for _, s := range subs {
if ptr.ToString(s.TenantID) == tenantID {
results = append(results, s)
}
}
return results
}
func GetTenantIDPerSubscription(subscriptionID string) *string {
subs := GetSubscriptions()
for _, s := range subs {
if ptr.ToString(s.SubscriptionID) == subscriptionID {
return s.TenantID
}
if ptr.ToString(s.DisplayName) == subscriptionID {
return s.TenantID
}
}
return nil
}
// function that determines if AzSubsriptionType is a subscription ID or a subscription display name and returns the AzSubsriptionType struct with both populated
func PopulateSubsriptionType(subscription string) SubsriptionInfo {
subs := GetSubscriptions()
for _, s := range subs {
if ptr.ToString(s.SubscriptionID) == subscription {
return SubsriptionInfo{ID: subscription, Name: ptr.ToString(s.DisplayName)}
}
if ptr.ToString(s.DisplayName) == subscription {
return SubsriptionInfo{ID: ptr.ToString(s.SubscriptionID), Name: subscription}
}
}
return SubsriptionInfo{}
}
func GetDefaultDomainFromTenantID(tenantID string) (string, error) {
// Get the client using the function
client := internal.GetgraphRbacClient(tenantID)
// List domains
domainList, err := client.List(context.Background(), "")
if err != nil {
return "", err
}
for _, domain := range *domainList.Value {
if *domain.IsDefault {
primaryDomain := *domain.Name
return primaryDomain, nil
}
}
return "", fmt.Errorf("No default domain found")
}
func populateTenant(tenantID string) TenantInfo {
for _, t := range getTenants() {
if ptr.ToString(t.TenantID) == tenantID || ptr.ToString(t.DefaultDomain) == tenantID {
var subscriptions []SubsriptionInfo
for _, s := range GetSubscriptionsPerTenantID(ptr.ToString(t.ID)) {
subscriptions = append(subscriptions, SubsriptionInfo{Subscription: s, ID: ptr.ToString(s.SubscriptionID), Name: ptr.ToString(s.DisplayName)})
}
return TenantInfo{ID: t.TenantID, DefaultDomain: t.DefaultDomain, Subscriptions: subscriptions}
}
}
return TenantInfo{}
}