diff --git a/daemon/rule/operator.go b/daemon/rule/operator.go index d4cbc14d..193271d3 100644 --- a/daemon/rule/operator.go +++ b/daemon/rule/operator.go @@ -46,7 +46,7 @@ type Operator struct { re *regexp.Regexp } -func NewOperator(t Type, o Operand, data string, list []Operator) *Operator { +func NewOperator(t Type, o Operand, data string, list []Operator) (*Operator, error) { op := Operator{ Type: t, Operand: o, @@ -54,9 +54,10 @@ func NewOperator(t Type, o Operand, data string, list []Operator) *Operator { List: list, } if err := op.Compile(); err != nil { - return nil + log.Error("NewOperator() failed to compile:", err) + return nil, err } - return &op + return &op, nil } func (o *Operator) Compile() error { @@ -64,11 +65,11 @@ func (o *Operator) Compile() error { o.cb = o.simpleCmp } else if o.Type == Regexp { o.cb = o.reCmp - if re, err := regexp.Compile(o.Data); err == nil { - o.re = re - } else { + re, err := regexp.Compile(o.Data) + if err != nil { return err } + o.re = re } else if o.Type == List { o.Operand = OpList } diff --git a/daemon/rule/rule.go b/daemon/rule/rule.go index ccb6c68a..df257592 100644 --- a/daemon/rule/rule.go +++ b/daemon/rule/rule.go @@ -5,6 +5,7 @@ import ( "time" "github.com/gustavo-iniguez-goya/opensnitch/daemon/conman" + "github.com/gustavo-iniguez-goya/opensnitch/daemon/log" "github.com/gustavo-iniguez-goya/opensnitch/daemon/ui/protocol" ) @@ -59,18 +60,20 @@ func (r *Rule) Match(con *conman.Connection) bool { return r.Operator.Match(con) } -func Deserialize(reply *protocol.Rule) *Rule { +func Deserialize(reply *protocol.Rule) (*Rule, error) { if reply.Operator == nil { - return nil + log.Warning("Deserialize rule, Operator nil") + return nil, fmt.Errorf("invalid operator") } - operator := NewOperator( + operator, err := NewOperator( Type(reply.Operator.Type), Operand(reply.Operator.Operand), reply.Operator.Data, make([]Operator, 0), ) - if operator == nil { - return nil + if err != nil { + log.Warning("Deserialize rule, NewOperator() error:", err) + return nil, err } return Create( @@ -79,7 +82,7 @@ func Deserialize(reply *protocol.Rule) *Rule { Action(reply.Action), Duration(reply.Duration), operator, - ) + ), nil } func (r *Rule) Serialize() *protocol.Rule { diff --git a/daemon/ui/client.go b/daemon/ui/client.go index dd15ba54..0b66a686 100644 --- a/daemon/ui/client.go +++ b/daemon/ui/client.go @@ -21,8 +21,9 @@ import ( var ( configFile = "/etc/opensnitchd/default-config.json" - clientDisconnectedRule = rule.Create("ui.client.disconnected", true, rule.Allow, rule.Once, rule.NewOperator(rule.Simple, rule.OpTrue, "", make([]rule.Operator, 0))) - clientErrorRule = rule.Create("ui.client.error", true, rule.Allow, rule.Once, rule.NewOperator(rule.Simple, rule.OpTrue, "", make([]rule.Operator, 0))) + dummyOperator, _ = rule.NewOperator(rule.Simple, rule.OpTrue, "", make([]rule.Operator, 0)) + clientDisconnectedRule = rule.Create("ui.client.disconnected", true, rule.Allow, rule.Once, dummyOperator) + clientErrorRule = rule.Create("ui.client.error", true, rule.Allow, rule.Once, dummyOperator) config Config ) @@ -234,7 +235,11 @@ func (c *Client) Ask(con *conman.Connection) (*rule.Rule, bool) { return nil, false } - return rule.Deserialize(reply), true + r, err := rule.Deserialize(reply) + if err != nil { + return nil, false + } + return r, true } func (c *Client) monitorConfigWorker() { diff --git a/daemon/ui/notifications.go b/daemon/ui/notifications.go index 83b872ea..9bdbeea2 100644 --- a/daemon/ui/notifications.go +++ b/daemon/ui/notifications.go @@ -77,7 +77,7 @@ func (c *Client) handleNotification(stream protocol.UI_NotificationsClient, noti for _, rul := range notification.Rules { log.Info("[notification] enable rule: ", rul.Name) // protocol.Rule(protobuf) != rule.Rule(json) - r := rule.Deserialize(rul) + r, _ := rule.Deserialize(rul) r.Enabled = true // save to disk only if the duration is rule.Always if err := c.rules.Replace(r, r.Duration == rule.Always); err != nil { @@ -90,7 +90,7 @@ func (c *Client) handleNotification(stream protocol.UI_NotificationsClient, noti var rErr error for _, rul := range notification.Rules { log.Info("[notification] disable: ", rul) - r := rule.Deserialize(rul) + r, _ := rule.Deserialize(rul) r.Enabled = false if err := c.rules.Replace(r, r.Duration == rule.Always); err != nil { rErr = err @@ -113,9 +113,10 @@ func (c *Client) handleNotification(stream protocol.UI_NotificationsClient, noti case notification.Type == protocol.Action_CHANGE_RULE: var rErr error for _, rul := range notification.Rules { - r := rule.Deserialize(rul) + log.Info("CHANGE_RULE: ", rul) + r, err := rule.Deserialize(rul) if r == nil { - rErr = fmt.Errorf("Invalid rule") + rErr = fmt.Errorf("Invalid rule, %s", err) continue } log.Info("[notification] change rule: ", r, notification.Id)