aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
authorhaixunlu <luhaixun@gmail.com>2018-09-13 10:49:07 -0700
committer无闻 <u@gogs.io>2018-09-13 13:49:07 -0400
commit68a65798520556ff7130d7e7e53bd260d890bb7c (patch)
treec8c5222c2882298fae0761609bf51b685901b771 /models
parent798798f7ab00ae3e43b40253cf7ea388662b539d (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.go48
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,