From 3f6f44f34ca840537558452d449af4797992d6ed Mon Sep 17 00:00:00 2001 From: Scott Bishel Date: Thu, 10 Oct 2019 11:37:57 -0600 Subject: [PATCH] MM-16860 Support Guest Authentication via SAML (#12622) * add GuestAttribute setting * Add Constant * add isdefault_guest_attribute to diagnostics.go * revert changes to go.mod * revert changes to LdapInterface.go * revert changes to LdapInterface.go * revert changes to LdapInterface.go --- app/diagnostics.go | 1 + i18n/en.json | 4 ++++ model/config.go | 14 ++++++++++++++ model/config_test.go | 15 +++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/app/diagnostics.go b/app/diagnostics.go index bb7fd0fac5..d75b63e073 100644 --- a/app/diagnostics.go +++ b/app/diagnostics.go @@ -509,6 +509,7 @@ func (a *App) trackConfig() { "isdefault_scoping_idp_provider_id": isDefault(*cfg.SamlSettings.ScopingIDPProviderId, ""), "isdefault_scoping_idp_name": isDefault(*cfg.SamlSettings.ScopingIDPName, ""), "isdefault_id_attribute": isDefault(*cfg.SamlSettings.IdAttribute, model.SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE), + "isdefault_guest_attribute": isDefault(*cfg.SamlSettings.GuestAttribute, model.SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE), "isdefault_first_name_attribute": isDefault(*cfg.SamlSettings.FirstNameAttribute, model.SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE), "isdefault_last_name_attribute": isDefault(*cfg.SamlSettings.LastNameAttribute, model.SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE), "isdefault_email_attribute": isDefault(*cfg.SamlSettings.EmailAttribute, model.SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE), diff --git a/i18n/en.json b/i18n/en.json index 209e7c67d3..f8841befc4 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -4722,6 +4722,10 @@ "id": "model.config.is_valid.saml_email_attribute.app_error", "translation": "Invalid Email attribute. Must be set." }, + { + "id": "model.config.is_valid.saml_guest_attribute.app_error", + "translation": "Invalid Guest attribute. Must be in the form 'field=value'" + }, { "id": "model.config.is_valid.saml_idp_cert.app_error", "translation": "Identity Provider Public Certificate missing. Did you forget to upload it?" diff --git a/model/config.go b/model/config.go index 81e594f03d..016477a3ab 100644 --- a/model/config.go +++ b/model/config.go @@ -130,6 +130,7 @@ const ( LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE = "" SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE = "" + SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE = "" SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = "" SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE = "" SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE = "" @@ -1907,6 +1908,7 @@ type SamlSettings struct { // User Mapping IdAttribute *string + GuestAttribute *string FirstNameAttribute *string LastNameAttribute *string EmailAttribute *string @@ -1999,6 +2001,9 @@ func (s *SamlSettings) SetDefaults() { s.IdAttribute = NewString(SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE) } + if s.GuestAttribute == nil { + s.GuestAttribute = NewString(SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE) + } if s.FirstNameAttribute == nil { s.FirstNameAttribute = NewString(SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE) } @@ -2835,6 +2840,15 @@ func (ss *SamlSettings) isValid() *AppError { if !(*ss.CanonicalAlgorithm == SAML_SETTINGS_CANONICAL_ALGORITHM_C14N || *ss.CanonicalAlgorithm == SAML_SETTINGS_CANONICAL_ALGORITHM_C14N11) { return NewAppError("Config.IsValid", "model.config.is_valid.saml_canonical_algorithm.app_error", nil, "", http.StatusBadRequest) } + + if len(*ss.GuestAttribute) > 0 { + if !(strings.Contains(*ss.GuestAttribute, "=")) { + return NewAppError("Config.IsValid", "model.config.is_valid.saml_guest_attribute.app_error", nil, "", http.StatusBadRequest) + } + if len(strings.Split(*ss.GuestAttribute, "=")) != 2 { + return NewAppError("Config.IsValid", "model.config.is_valid.saml_guest_attribute.app_error", nil, "", http.StatusBadRequest) + } + } } return nil diff --git a/model/config_test.go b/model/config_test.go index a3ed8bc7ff..743b6a58ba 100644 --- a/model/config_test.go +++ b/model/config_test.go @@ -195,6 +195,21 @@ func TestConfigIsValidFakeAlgorithm(t *testing.T) { require.Equal(t, "model.config.is_valid.saml_signature_algorithm.app_error", err.Message) } +func TestConfigOverwriteGuestSettings(t *testing.T) { + const attribute = "FakeAttributeName" + c1 := Config{ + SamlSettings: SamlSettings{ + GuestAttribute: NewString(attribute), + }, + } + + c1.SetDefaults() + + if *c1.SamlSettings.GuestAttribute != attribute { + t.Fatal("SamlSettings.GuestAttribute should be overwritten") + } +} + func TestConfigDefaultServiceSettingsExperimentalGroupUnreadChannels(t *testing.T) { c1 := Config{} c1.SetDefaults()