From 117dec45426139e9adee982c8a398415047931e9 Mon Sep 17 00:00:00 2001 From: Yixiang Zhao Date: Sat, 16 Jul 2022 12:14:35 +0800 Subject: [PATCH] feat: failed to sync keycloak users in the PostgreSQL database (#886) Signed-off-by: Yixiang Zhao --- object/syncer_user.go | 2 ++ object/syncer_util.go | 20 +++++++++++++++----- util/string.go | 4 +++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/object/syncer_user.go b/object/syncer_user.go index e02fd9cf..c68cd023 100644 --- a/object/syncer_user.go +++ b/object/syncer_user.go @@ -151,6 +151,8 @@ func (syncer *Syncer) initAdapter() { var dataSourceName string if syncer.DatabaseType == "mssql" { dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, syncer.Database) + } else if syncer.DatabaseType == "postgres" { + dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=disable dbname=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, syncer.Database) } else { dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/", syncer.User, syncer.Password, syncer.Host, syncer.Port) } diff --git a/object/syncer_util.go b/object/syncer_util.go index ea4bb10a..3750440d 100644 --- a/object/syncer_util.go +++ b/object/syncer_util.go @@ -173,16 +173,21 @@ func (syncer *Syncer) getOriginalUsersFromMap(results []map[string]string) []*Or } for _, tableColumn := range syncer.TableColumns { + tableColumnName := tableColumn.Name + if syncer.Type == "Keycloak" && syncer.DatabaseType == "postgres" { + tableColumnName = strings.ToLower(tableColumnName) + } + value := "" - if strings.Contains(tableColumn.Name, "+") { - names := strings.Split(tableColumn.Name, "+") + if strings.Contains(tableColumnName, "+") { + names := strings.Split(tableColumnName, "+") var values []string for _, name := range names { values = append(values, result[strings.Trim(name, " ")]) } value = strings.Join(values, " ") } else { - value = result[tableColumn.Name] + value = result[tableColumnName] } syncer.setUserByKeyValue(originalUser, tableColumn.CasdoorName, value) } @@ -198,7 +203,7 @@ func (syncer *Syncer) getOriginalUsersFromMap(results []map[string]string) []*Or originalUser.PasswordSalt = credential.Salt } // query and set signup application from user group table - sql = fmt.Sprintf("select name from keycloak_group where id = " + + sql = fmt.Sprintf("select name from keycloak_group where id = "+ "(select group_id as gid from user_group_membership where user_id = '%s')", originalUser.Id) groupResult, _ := syncer.Adapter.Engine.QueryString(sql) if len(groupResult) > 0 { @@ -209,7 +214,12 @@ func (syncer *Syncer) getOriginalUsersFromMap(results []map[string]string) []*Or tm := time.Unix(i/int64(1000), 0) originalUser.CreatedTime = tm.Format("2006-01-02T15:04:05+08:00") // enable - originalUser.IsForbidden = !(result["ENABLED"] == "\x01") + value, ok := result["ENABLED"] + if ok { + originalUser.IsForbidden = !util.ParseBool(value) + } else { + originalUser.IsForbidden = !util.ParseBool(result["enabled"]) + } } users = append(users, originalUser) diff --git a/util/string.go b/util/string.go index 14b19c32..8f601923 100644 --- a/util/string.go +++ b/util/string.go @@ -52,8 +52,10 @@ func ParseFloat(s string) float64 { } func ParseBool(s string) bool { - if s == "\x01" { + if s == "\x01" || s == "true" { return true + } else if s == "false" { + return false } i := ParseInt(s)