@@ -572,6 +572,9 @@ func applyDefaultsToConfig(config *codersdk.ExternalAuthConfig) {
572
572
case codersdk .EnhancedExternalAuthProviderGitea :
573
573
copyDefaultSettings (config , giteaDefaults (config ))
574
574
return
575
+ case codersdk .EnhancedExternalAuthProviderAzureDevopsEntra :
576
+ copyDefaultSettings (config , azureDevopsEntraDefaults (config ))
577
+ return
575
578
default :
576
579
// No defaults for this type. We still want to run this apply with
577
580
// an empty set of defaults.
@@ -733,6 +736,41 @@ func giteaDefaults(config *codersdk.ExternalAuthConfig) codersdk.ExternalAuthCon
733
736
return defaults
734
737
}
735
738
739
+ func azureDevopsEntraDefaults (config * codersdk.ExternalAuthConfig ) codersdk.ExternalAuthConfig {
740
+ defaults := codersdk.ExternalAuthConfig {
741
+ DisplayName : "Azure DevOps (Entra)" ,
742
+ DisplayIcon : "/icon/azure-devops.svg" ,
743
+ Regex : `^(https?://)?dev\.azure\.com(/.*)?$` ,
744
+ }
745
+ // The tenant ID is required for urls and is in the auth url.
746
+ if config .AuthURL == "" {
747
+ // No auth url, means we cannot guess the urls.
748
+ return defaults
749
+ }
750
+
751
+ auth , err := url .Parse (config .AuthURL )
752
+ if err != nil {
753
+ // We need a valid URL to continue with.
754
+ return defaults
755
+ }
756
+
757
+ // Only extract the tenant ID if the path is what we expect.
758
+ // The path should be /{tenantId}/oauth2/authorize.
759
+ parts := strings .Split (auth .Path , "/" )
760
+ if len (parts ) < 4 && parts [2 ] != "oauth2" || parts [3 ] != "authorize" {
761
+ // Not sure what this path is, abort.
762
+ return defaults
763
+ }
764
+ tenantID := parts [1 ]
765
+
766
+ tokenURL := auth .ResolveReference (& url.URL {Path : fmt .Sprintf ("/%s/oauth2/token" , tenantID )})
767
+ defaults .TokenURL = tokenURL .String ()
768
+
769
+ // TODO: Discover a validate url for Azure DevOps.
770
+
771
+ return defaults
772
+ }
773
+
736
774
var staticDefaults = map [codersdk.EnhancedExternalAuthProvider ]codersdk.ExternalAuthConfig {
737
775
codersdk .EnhancedExternalAuthProviderAzureDevops : {
738
776
AuthURL : "https://app.vssps.visualstudio.com/oauth2/authorize" ,
@@ -742,11 +780,6 @@ var staticDefaults = map[codersdk.EnhancedExternalAuthProvider]codersdk.External
742
780
Regex : `^(https?://)?dev\.azure\.com(/.*)?$` ,
743
781
Scopes : []string {"vso.code_write" },
744
782
},
745
- codersdk .EnhancedExternalAuthProviderAzureDevopsEntra : {
746
- DisplayName : "Azure DevOps (Entra)" ,
747
- DisplayIcon : "/icon/azure-devops.svg" ,
748
- Regex : `^(https?://)?dev\.azure\.com(/.*)?$` ,
749
- },
750
783
codersdk .EnhancedExternalAuthProviderBitBucketCloud : {
751
784
AuthURL : "https://bitbucket.org/site/oauth2/authorize" ,
752
785
TokenURL : "https://bitbucket.org/site/oauth2/access_token" ,
0 commit comments