Commit d3c57913 authored by qiuqunfeng's avatar qiuqunfeng
Browse files

Implement Update and Enable methods for Black/White List in WAF service

- Add UpdateBlackWhiteList method in WafController to handle updates to black/white list entries
- Introduce EnableBlackWhiteList method in WafController for enabling/disabling black/white lists
- Enhance WafService with logic to update and manage configuration maps for black/white lists
- Ensure proper error handling and response assembly for both methods
parent f20be61b
......@@ -390,14 +390,38 @@ func (c *WafController) CreateBlackWhiteList(ctx *gin.Context) {
}
func (c *WafController) UpdateBlackWhiteList(ctx *gin.Context) {
// ctx1, cancel := context.WithTimeout(context.Background(), 10*time.Second)
// defer cancel()
ctx1, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
var req service.MatcherExpr
if err := ctx.BindJSON(&req); err != nil {
utils.AssembleResponse(ctx, nil, err)
return
}
err := c.service.UpdateBlackWhiteList(ctx1, &req)
if err != nil {
utils.AssembleResponse(ctx, nil, err)
return
}
utils.AssembleResponse(ctx, nil, nil)
}
func (c *WafController) EnableBlackWhiteList(ctx *gin.Context) {
// ctx1, cancel := context.WithTimeout(context.Background(), 10*time.Second)
// defer cancel()
ctx1, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
var req service.MatcherExpr
if err := ctx.BindJSON(&req); err != nil {
utils.AssembleResponse(ctx, nil, err)
return
}
err := c.service.EnableBlackWhiteList(ctx1, &req)
if err != nil {
utils.AssembleResponse(ctx, nil, err)
return
}
utils.AssembleResponse(ctx, nil, nil)
}
func (c *WafController) DeleteBlackWhiteList(ctx *gin.Context) {
......
......@@ -1002,6 +1002,43 @@ func (s *wafService) createConfigMap(ctx context.Context, req *MatcherExpr, regi
return nil
}
func (s *wafService) updateConfigMap(ctx context.Context, req *MatcherExpr, regionCode string, wafSvc []model.WafService) error {
client := s.clusterClientManager.GetClient(regionCode)
if client == nil {
return fmt.Errorf("failed to get cluster client")
}
name := fmt.Sprintf("waf-black-white-list-%d", req.ID)
configMap, err := client.Clientset.CoreV1().ConfigMaps(wafSvc[0].Namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("failed to get config map: %v", err)
}
scope := []string{}
for _, id := range req.Scope {
scope = append(scope, strconv.FormatUint(uint64(id), 10))
}
matchExpr := v1alpha1.MatchExpression{
ID: req.ID,
Name: req.Name,
Scope: strings.Join(scope, ","),
Mode: req.Mode,
Expr: req.Expr,
Status: req.Status,
}
matchExprJson, err := json.Marshal(matchExpr)
if err != nil {
return fmt.Errorf("failed to marshal match expression: %v", err)
}
newConfigMap := configMap.DeepCopy()
newConfigMap.Data["match-expression"] = string(matchExprJson)
_, err = client.Clientset.CoreV1().ConfigMaps(wafSvc[0].Namespace).Update(ctx, newConfigMap, metav1.UpdateOptions{})
if err != nil {
return fmt.Errorf("failed to update config map: %v", err)
}
return nil
}
func (s *wafService) CreateBlackWhiteList(ctx context.Context, req *MatcherExpr) error {
tErr := s.db.Transaction(func(tx *gorm.DB) error {
matcherExpr := model.MatcherExpr{
......@@ -1035,10 +1072,85 @@ func (s *wafService) CreateBlackWhiteList(ctx context.Context, req *MatcherExpr)
}
func (s *wafService) UpdateBlackWhiteList(ctx context.Context, req *MatcherExpr) error {
tErr := s.db.Transaction(func(tx *gorm.DB) error {
matcherExpr := model.MatcherExpr{}
err := tx.WithContext(ctx).Where("id = ?", req.ID).First(&matcherExpr).Error
if err != nil {
return err
}
matcherExpr.Name = req.Name
matcherExpr.Scope = req.Scope
matcherExpr.Mode = req.Mode
matcherExpr.Expr = req.Expr
matcherExpr.Global = req.Global
err = tx.WithContext(ctx).Save(&matcherExpr).Error
if err != nil {
return err
}
svcMap, err := s.getWafServiceMap(ctx, &MatcherExpr{
ID: req.ID,
Name: matcherExpr.Name,
Scope: matcherExpr.Scope,
Mode: matcherExpr.Mode,
Expr: matcherExpr.Expr,
Global: matcherExpr.Global,
})
if err != nil {
return err
}
for regionCode, wafSvc := range svcMap {
err = s.updateConfigMap(ctx, req, regionCode, wafSvc)
if err != nil {
return err
}
}
return nil
})
return tErr
}
func (s *wafService) EnableBlackWhiteList(ctx context.Context, req *MatcherExpr) error {
matcherExpr := model.MatcherExpr{}
err := s.db.WithContext(ctx).Where("id = ?", req.ID).First(&matcherExpr).Error
if err != nil {
return err
}
svcMap, err := s.getWafServiceMap(ctx, &MatcherExpr{
ID: req.ID,
Name: matcherExpr.Name,
Scope: matcherExpr.Scope,
Mode: matcherExpr.Mode,
Expr: matcherExpr.Expr,
Global: matcherExpr.Global,
})
if err != nil {
return err
}
if req.Status == 1 {
matcherExpr.Status = 1
for regionCode, wafServices := range svcMap {
err := s.deleteConfigMap(ctx, req.ID, regionCode, wafServices)
if err != nil {
return err
}
}
} else {
for regionCode, wafServices := range svcMap {
err := s.createConfigMap(ctx, req, regionCode, wafServices)
if err != nil {
return err
}
}
}
err = s.db.WithContext(ctx).Save(&matcherExpr).Error
if err != nil {
return err
}
return nil
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment