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  }