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
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
34b4bbcb46
Коммит
3f6f44f34c
@@ -509,6 +509,7 @@ func (a *App) trackConfig() {
|
|||||||
"isdefault_scoping_idp_provider_id": isDefault(*cfg.SamlSettings.ScopingIDPProviderId, ""),
|
"isdefault_scoping_idp_provider_id": isDefault(*cfg.SamlSettings.ScopingIDPProviderId, ""),
|
||||||
"isdefault_scoping_idp_name": isDefault(*cfg.SamlSettings.ScopingIDPName, ""),
|
"isdefault_scoping_idp_name": isDefault(*cfg.SamlSettings.ScopingIDPName, ""),
|
||||||
"isdefault_id_attribute": isDefault(*cfg.SamlSettings.IdAttribute, model.SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE),
|
"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_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_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),
|
"isdefault_email_attribute": isDefault(*cfg.SamlSettings.EmailAttribute, model.SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE),
|
||||||
|
|||||||
@@ -4722,6 +4722,10 @@
|
|||||||
"id": "model.config.is_valid.saml_email_attribute.app_error",
|
"id": "model.config.is_valid.saml_email_attribute.app_error",
|
||||||
"translation": "Invalid Email attribute. Must be set."
|
"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",
|
"id": "model.config.is_valid.saml_idp_cert.app_error",
|
||||||
"translation": "Identity Provider Public Certificate missing. Did you forget to upload it?"
|
"translation": "Identity Provider Public Certificate missing. Did you forget to upload it?"
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ const (
|
|||||||
LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE = ""
|
LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE = ""
|
||||||
|
|
||||||
SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE = ""
|
SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE = ""
|
||||||
|
SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE = ""
|
||||||
SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = ""
|
SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = ""
|
||||||
SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE = ""
|
SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE = ""
|
||||||
SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE = ""
|
SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE = ""
|
||||||
@@ -1907,6 +1908,7 @@ type SamlSettings struct {
|
|||||||
|
|
||||||
// User Mapping
|
// User Mapping
|
||||||
IdAttribute *string
|
IdAttribute *string
|
||||||
|
GuestAttribute *string
|
||||||
FirstNameAttribute *string
|
FirstNameAttribute *string
|
||||||
LastNameAttribute *string
|
LastNameAttribute *string
|
||||||
EmailAttribute *string
|
EmailAttribute *string
|
||||||
@@ -1999,6 +2001,9 @@ func (s *SamlSettings) SetDefaults() {
|
|||||||
s.IdAttribute = NewString(SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE)
|
s.IdAttribute = NewString(SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.GuestAttribute == nil {
|
||||||
|
s.GuestAttribute = NewString(SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE)
|
||||||
|
}
|
||||||
if s.FirstNameAttribute == nil {
|
if s.FirstNameAttribute == nil {
|
||||||
s.FirstNameAttribute = NewString(SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE)
|
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) {
|
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)
|
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
|
return nil
|
||||||
|
|||||||
@@ -195,6 +195,21 @@ func TestConfigIsValidFakeAlgorithm(t *testing.T) {
|
|||||||
require.Equal(t, "model.config.is_valid.saml_signature_algorithm.app_error", err.Message)
|
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) {
|
func TestConfigDefaultServiceSettingsExperimentalGroupUnreadChannels(t *testing.T) {
|
||||||
c1 := Config{}
|
c1 := Config{}
|
||||||
c1.SetDefaults()
|
c1.SetDefaults()
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user