mirror of
https://github.com/BishopFox/cloudfox.git
synced 2026-11-09 09:39:33 -10:00
130 lines
3.6 KiB
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{}
|
|
}
|