@@ -531,6 +531,9 @@ func applyDefaultsToConfig(config *codersdk.ExternalAuthConfig) {
531531case codersdk .EnhancedExternalAuthProviderBitBucketServer :
532532copyDefaultSettings (config ,bitbucketServerDefaults (config ))
533533return
534+ case codersdk .EnhancedExternalAuthProviderJFrog :
535+ copyDefaultSettings (config ,jfrogArtifactoryDefaults (config ))
536+ return
534537default :
535538// No defaults for this type. We still want to run this apply with
536539// an empty set of defaults.
@@ -623,6 +626,44 @@ func bitbucketServerDefaults(config *codersdk.ExternalAuthConfig) codersdk.Exter
623626return defaults
624627}
625628
629+ func jfrogArtifactoryDefaults (config * codersdk.ExternalAuthConfig ) codersdk.ExternalAuthConfig {
630+ defaults := codersdk.ExternalAuthConfig {
631+ DisplayName :"JFrog Artifactory" ,
632+ Scopes : []string {"applied-permissions/user" },
633+ DisplayIcon :"/icon/jfrog.svg" ,
634+ }
635+ // Artifactory servers will have some base url, e.g. https://jfrog.coder.com.
636+ // We will grab this from the Auth URL. This choice is not arbitrary. It is a
637+ // static string for all integrations on the same artifactory.
638+ if config .AuthURL == "" {
639+ // No auth url, means we cannot guess the urls.
640+ return defaults
641+ }
642+
643+ auth ,err := url .Parse (config .AuthURL )
644+ if err != nil {
645+ // We need a valid URL to continue with.
646+ return defaults
647+ }
648+
649+ if config .ClientID == "" {
650+ return defaults
651+ }
652+
653+ tokenURL := auth .ResolveReference (& url.URL {Path :fmt .Sprintf ("/access/api/v1/integrations/%s/token" ,config .ClientID )})
654+ defaults .TokenURL = tokenURL .String ()
655+
656+ // validate needs to return a 200 when logged in and a 401 when unauthenticated.
657+ validate := auth .ResolveReference (& url.URL {Path :"/access/api/v1/system/ping" })
658+ defaults .ValidateURL = validate .String ()
659+
660+ // Some options omitted:
661+ // - Regex: Artifactory can span pretty much all domains (git, docker, etc).
662+ // I do not think we can intelligently guess this as a default.
663+
664+ return defaults
665+ }
666+
626667var staticDefaults = map [codersdk.EnhancedExternalAuthProvider ]codersdk.ExternalAuthConfig {
627668codersdk .EnhancedExternalAuthProviderAzureDevops : {
628669AuthURL :"https://app.vssps.visualstudio.com/oauth2/authorize" ,