diff options
author | haixunlu <luhaixun@gmail.com> | 2018-09-13 10:49:07 -0700 |
---|---|---|
committer | 无闻 <u@gogs.io> | 2018-09-13 13:49:07 -0400 |
commit | 68a65798520556ff7130d7e7e53bd260d890bb7c (patch) | |
tree | c8c5222c2882298fae0761609bf51b685901b771 /models | |
parent | 798798f7ab00ae3e43b40253cf7ea388662b539d (diff) |
login_source: add default authentication switch (#5338)
* Add default Authentication Switch.
* adjust the code accroding to reviews
* #1. Remove redudant logic.
#2, Fix a bug in "Edit" panel.
* Remove unused logic
* Fix local authentication files are not flushed.
* refactor according to review.
Diffstat (limited to 'models')
-rw-r--r-- | models/login_source.go | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/models/login_source.go b/models/login_source.go index 88ad42dc..546be132 100644 --- a/models/login_source.go +++ b/models/login_source.go @@ -133,6 +133,7 @@ type LoginSource struct { Type LoginType Name string `xorm:"UNIQUE"` IsActived bool `xorm:"NOT NULL DEFAULT false"` + IsDefault bool `xorm:"DEFAULT false"` Cfg core.Conversion `xorm:"TEXT"` Created time.Time `xorm:"-" json:"-"` @@ -257,7 +258,12 @@ func CreateLoginSource(source *LoginSource) error { } _, err = x.Insert(source) - return err + if err != nil { + return err + } else if source.IsDefault { + return ResetNonDefaultLoginSources(source) + } + return nil } // LoginSources returns all login sources defined. @@ -291,23 +297,48 @@ func GetLoginSourceByID(id int64) (*LoginSource, error) { return source, nil } +// ResetNonDefaultLoginSources clean other default source flag +func ResetNonDefaultLoginSources(source *LoginSource) error { + // update changes to DB + if _, err := x.NotIn("id", []int64{source.ID}).Cols("is_default").Update(&LoginSource{IsDefault: false}); err != nil { + return err + } + // write changes to local authentications + for i := range localLoginSources.sources { + if localLoginSources.sources[i].LocalFile != nil && localLoginSources.sources[i].ID != source.ID { + localLoginSources.sources[i].LocalFile.SetGeneral("is_default", "false") + if err := localLoginSources.sources[i].LocalFile.SetConfig(source.Cfg); err != nil { + return fmt.Errorf("LocalFile.SetConfig: %v", err) + } else if err = localLoginSources.sources[i].LocalFile.Save(); err != nil { + return fmt.Errorf("LocalFile.Save: %v", err) + } + } + } + // flush memory so that web page can show the same behaviors + localLoginSources.UpdateLoginSource(source) + return nil +} + // UpdateLoginSource updates information of login source to database or local file. func UpdateLoginSource(source *LoginSource) error { if source.LocalFile == nil { - _, err := x.Id(source.ID).AllCols().Update(source) - return err + if _, err := x.Id(source.ID).AllCols().Update(source); err != nil { + return err + } else { + return ResetNonDefaultLoginSources(source) + } + } source.LocalFile.SetGeneral("name", source.Name) source.LocalFile.SetGeneral("is_activated", com.ToStr(source.IsActived)) + source.LocalFile.SetGeneral("is_default", com.ToStr(source.IsDefault)) if err := source.LocalFile.SetConfig(source.Cfg); err != nil { return fmt.Errorf("LocalFile.SetConfig: %v", err) } else if err = source.LocalFile.Save(); err != nil { return fmt.Errorf("LocalFile.Save: %v", err) } - - localLoginSources.UpdateLoginSource(source) - return nil + return ResetNonDefaultLoginSources(source) } func DeleteSource(source *LoginSource) error { @@ -361,7 +392,6 @@ func (s *LocalLoginSources) ActivatedList() []*LoginSource { if !s.sources[i].IsActived { continue } - source := &LoginSource{} *source = *s.sources[i] list = append(list, source) @@ -394,7 +424,8 @@ func (s *LocalLoginSources) UpdateLoginSource(source *LoginSource) { for i := range s.sources { if s.sources[i].ID == source.ID { *s.sources[i] = *source - break + } else if source.IsDefault { + s.sources[i].IsDefault = false } } } @@ -429,6 +460,7 @@ func LoadAuthSources() { ID: s.Key("id").MustInt64(), Name: s.Key("name").String(), IsActived: s.Key("is_activated").MustBool(), + IsDefault: s.Key("is_default").MustBool(), LocalFile: &AuthSourceFile{ abspath: fpath, file: authSource, |