github.com/infraboard/keyauth@v0.8.1/apps/provider/impl/ldap.go (about) 1 package impl 2 3 import ( 4 "context" 5 6 "github.com/infraboard/mcube/exception" 7 "go.mongodb.org/mongo-driver/mongo" 8 9 "github.com/infraboard/keyauth/apps/provider" 10 "github.com/infraboard/keyauth/apps/provider/auth/ldap" 11 ) 12 13 func (s *service) SaveConfig(req *provider.SaveLDAPConfigRequest) ( 14 *provider.LDAPConfig, error) { 15 ins, err := provider.NewLDAPConfig(req) 16 if err != nil { 17 return nil, exception.NewBadRequest("validate error, %s", err) 18 } 19 20 p := ldap.NewProvider(ins.Config) 21 if err := p.CheckConnect(); err != nil { 22 return nil, exception.NewBadRequest("try connect ldap error, %s", err) 23 } 24 25 descLDAP := provider.NewDescribeLDAPConfigWithDomain(ins.Domain) 26 old, err := s.DescribeConfig(descLDAP) 27 if err != nil && !exception.IsNotFoundError(err) { 28 return nil, err 29 } 30 31 // 如果是DryRun直接返回 32 if req.IsDryRun() { 33 return ins, nil 34 } 35 36 // 保存入库 37 if old == nil { 38 err = s.save(ins) 39 } else { 40 err = s.update(ins) 41 } 42 if err != nil { 43 return nil, err 44 } 45 46 return ins, nil 47 } 48 49 func (s *service) QueryConfig(req *provider.QueryLDAPConfigRequest) (*provider.LDAPSet, error) { 50 r := newQueryLDAPRequest(req) 51 resp, err := s.col.Find(context.TODO(), r.FindFilter(), r.FindOptions()) 52 53 if err != nil { 54 return nil, exception.NewInternalServerError("find ldap error, error is %s", err) 55 } 56 57 set := provider.NewLDAPSet(req.PageRequest) 58 // 循环 59 for resp.Next(context.TODO()) { 60 ins := provider.NewDefaultLDAPConfig() 61 if err := resp.Decode(ins); err != nil { 62 return nil, exception.NewInternalServerError("decode ldap error, error is %s", err) 63 } 64 65 set.Add(ins) 66 } 67 68 // count 69 count, err := s.col.CountDocuments(context.TODO(), r.FindFilter()) 70 if err != nil { 71 return nil, exception.NewInternalServerError("get ldap count error, error is %s", err) 72 } 73 set.Total = count 74 return set, nil 75 } 76 77 func (s *service) DescribeConfig(req *provider.DescribeLDAPConfig) (*provider.LDAPConfig, error) { 78 r, err := newDescribeLDAPRequest(req) 79 if err != nil { 80 return nil, err 81 } 82 83 ins := provider.NewDefaultLDAPConfig() 84 if err := s.col.FindOne(context.TODO(), r.FindFilter()).Decode(ins); err != nil { 85 if err == mongo.ErrNoDocuments { 86 return nil, exception.NewNotFound("ldap %s not found", req) 87 } 88 89 return nil, exception.NewInternalServerError("find ldap %s error, %s", req.Domain, err) 90 } 91 92 return ins, nil 93 } 94 95 func (s *service) DeleteConfig(req *provider.DeleteLDAPConfig) error { 96 return nil 97 } 98 99 func (s *service) CheckConnect(req *provider.DescribeLDAPConfig) error { 100 cfg, err := s.DescribeConfig(req) 101 if err != nil { 102 return err 103 } 104 105 p := ldap.NewProvider(cfg.Config) 106 return p.CheckConnect() 107 }