mirror of
https://github.com/TecharoHQ/anubis.git
synced 2025-08-03 17:59:24 -04:00

* feat(lib): implement request weight Replaces #608 This is a big one and will be what makes Anubis a generic web application firewall. This introduces the WEIGH option, allowing administrators to have facets of request metadata add or remove "weight", or the level of suspicion. This really makes Anubis weigh the soul of requests. Signed-off-by: Xe Iaso <me@xeiaso.net> * fix(lib): maintain legacy challenge behavior Signed-off-by: Xe Iaso <me@xeiaso.net> * fix(lib): make weight have dedicated checkers for the hashes Signed-off-by: Xe Iaso <me@xeiaso.net> * feat(data): convert some rules over to weight points Signed-off-by: Xe Iaso <me@xeiaso.net> * docs: document request weight Signed-off-by: Xe Iaso <me@xeiaso.net> * fix(CHANGELOG): spelling error Signed-off-by: Xe Iaso <me@xeiaso.net> * chore: spelling Signed-off-by: Xe Iaso <me@xeiaso.net> * docs: fix links to challenge information Signed-off-by: Xe Iaso <me@xeiaso.net> * docs(policies): fix formatting Signed-off-by: Xe Iaso <me@xeiaso.net> * fix(config): make default weight adjustment 5 Signed-off-by: Xe Iaso <me@xeiaso.net> --------- Signed-off-by: Xe Iaso <me@xeiaso.net>
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"slices"
|
|
)
|
|
|
|
var (
|
|
ErrExpressionOrListMustBeStringOrObject = errors.New("config: this must be a string or an object")
|
|
ErrExpressionEmpty = errors.New("config: this expression is empty")
|
|
ErrExpressionCantHaveBoth = errors.New("config: expression block can't contain multiple expression types")
|
|
)
|
|
|
|
type ExpressionOrList struct {
|
|
Expression string `json:"-"`
|
|
All []string `json:"all,omitempty"`
|
|
Any []string `json:"any,omitempty"`
|
|
}
|
|
|
|
func (eol ExpressionOrList) Equal(rhs *ExpressionOrList) bool {
|
|
if eol.Expression != rhs.Expression {
|
|
return false
|
|
}
|
|
|
|
if !slices.Equal(eol.All, rhs.All) {
|
|
return false
|
|
}
|
|
|
|
if !slices.Equal(eol.Any, rhs.Any) {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (eol *ExpressionOrList) UnmarshalJSON(data []byte) error {
|
|
switch string(data[0]) {
|
|
case `"`: // string
|
|
return json.Unmarshal(data, &eol.Expression)
|
|
case "{": // object
|
|
type RawExpressionOrList ExpressionOrList
|
|
var val RawExpressionOrList
|
|
if err := json.Unmarshal(data, &val); err != nil {
|
|
return err
|
|
}
|
|
eol.All = val.All
|
|
eol.Any = val.Any
|
|
|
|
return nil
|
|
}
|
|
|
|
return ErrExpressionOrListMustBeStringOrObject
|
|
}
|
|
|
|
func (eol *ExpressionOrList) Valid() error {
|
|
if eol.Expression == "" && len(eol.All) == 0 && len(eol.Any) == 0 {
|
|
return ErrExpressionEmpty
|
|
}
|
|
if len(eol.All) != 0 && len(eol.Any) != 0 {
|
|
return ErrExpressionCantHaveBoth
|
|
}
|
|
|
|
return nil
|
|
}
|