| 190 | } |
| 191 | |
| 192 | func (pm *PolicyManager) AddRule(pattern string, action Action) error { |
| 193 | pm.mu.Lock() |
| 194 | defer pm.mu.Unlock() |
| 195 | |
| 196 | pattern = strings.TrimSpace(pattern) |
| 197 | |
| 198 | // Reject empty or excessively long patterns |
| 199 | if pattern == "" { |
| 200 | return fmt.Errorf("empty policy pattern rejected") |
| 201 | } |
| 202 | if len(pattern) > 500 { |
| 203 | return fmt.Errorf("policy pattern too long (%d chars)", len(pattern)) |
| 204 | } |
| 205 | |
| 206 | pm.logger.Info("Updating security policy", zap.String("pattern", pattern), zap.String("action", string(action))) |
| 207 | |
| 208 | updated := false |
| 209 | for i, rule := range pm.Rules { |
| 210 | if rule.Pattern == pattern { |
| 211 | pm.Rules[i].Action = action |
| 212 | updated = true |
| 213 | break |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | if !updated { |
| 218 | pm.Rules = append(pm.Rules, Rule{Pattern: pattern, Action: action}) |
| 219 | } |
| 220 | |
| 221 | pm.lastRule = nil |
| 222 | return pm.save() |
| 223 | } |
| 224 | |
| 225 | // DeleteRule removes the rule whose Pattern matches exactly. Returns |
| 226 | // (true, nil) when a rule was removed, (false, nil) when no rule |