mirror of
https://github.com/TecharoHQ/anubis.git
synced 2026-04-29 11:32:42 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cea98f7742 | |||
| 5c618b61ac | |||
| 7ebc322479 |
@@ -10,7 +10,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal"
|
"github.com/TecharoHQ/anubis/internal"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1"
|
iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal/thoth"
|
"github.com/TecharoHQ/anubis/internal/thoth"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1"
|
iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1"
|
iptoasnv1 "github.com/TecharoHQ/thoth-proto/gen/techaro/thoth/iptoasn/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal/thoth"
|
"github.com/TecharoHQ/anubis/internal/thoth"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ checker.Impl = &thoth.GeoIPChecker{}
|
var _ checker.Impl = &thoth.GeoIPChecker{}
|
||||||
|
|||||||
+1
-4
@@ -26,17 +26,14 @@ import (
|
|||||||
"github.com/TecharoHQ/anubis/internal/dnsbl"
|
"github.com/TecharoHQ/anubis/internal/dnsbl"
|
||||||
"github.com/TecharoHQ/anubis/internal/ogtags"
|
"github.com/TecharoHQ/anubis/internal/ogtags"
|
||||||
"github.com/TecharoHQ/anubis/lib/challenge"
|
"github.com/TecharoHQ/anubis/lib/challenge"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/localization"
|
"github.com/TecharoHQ/anubis/lib/localization"
|
||||||
"github.com/TecharoHQ/anubis/lib/policy"
|
"github.com/TecharoHQ/anubis/lib/policy"
|
||||||
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
"github.com/TecharoHQ/anubis/lib/policy/config"
|
"github.com/TecharoHQ/anubis/lib/policy/config"
|
||||||
|
|
||||||
// challenge implementations
|
// challenge implementations
|
||||||
_ "github.com/TecharoHQ/anubis/lib/challenge/metarefresh"
|
_ "github.com/TecharoHQ/anubis/lib/challenge/metarefresh"
|
||||||
_ "github.com/TecharoHQ/anubis/lib/challenge/proofofwork"
|
_ "github.com/TecharoHQ/anubis/lib/challenge/proofofwork"
|
||||||
|
|
||||||
// checker implementations
|
|
||||||
_ "github.com/TecharoHQ/anubis/lib/checker/remoteaddress"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
package checker
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"sort"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Factory interface {
|
|
||||||
ValidateConfig(json.RawMessage) error
|
|
||||||
Create(json.RawMessage) (Impl, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
registry map[string]Factory = map[string]Factory{}
|
|
||||||
regLock sync.RWMutex
|
|
||||||
)
|
|
||||||
|
|
||||||
func Register(name string, factory Factory) {
|
|
||||||
regLock.Lock()
|
|
||||||
defer regLock.Unlock()
|
|
||||||
|
|
||||||
registry[name] = factory
|
|
||||||
}
|
|
||||||
|
|
||||||
func Get(name string) (Factory, bool) {
|
|
||||||
regLock.RLock()
|
|
||||||
defer regLock.RUnlock()
|
|
||||||
result, ok := registry[name]
|
|
||||||
return result, ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func Methods() []string {
|
|
||||||
regLock.RLock()
|
|
||||||
defer regLock.RUnlock()
|
|
||||||
var result []string
|
|
||||||
for method := range registry {
|
|
||||||
result = append(result, method)
|
|
||||||
}
|
|
||||||
sort.Strings(result)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
package remoteaddress
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"net/netip"
|
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/policy"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/policy/config"
|
|
||||||
"github.com/gaissmai/bart"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrNoRemoteAddresses = errors.New("remoteaddress: no remote addresses defined")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
checker.Register("remote_address", Factory{})
|
|
||||||
}
|
|
||||||
|
|
||||||
type Factory struct{}
|
|
||||||
|
|
||||||
func (Factory) ValidateConfig(inp json.RawMessage) error {
|
|
||||||
var fc fileConfig
|
|
||||||
if err := json.Unmarshal([]byte(inp), &fc); err != nil {
|
|
||||||
return fmt.Errorf("%w: %w", config.ErrUnparseableConfig, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := fc.Valid(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (Factory) Create(inp json.RawMessage) (checker.Impl, error) {
|
|
||||||
c := struct {
|
|
||||||
RemoteAddr []netip.Prefix `json:"remote_addresses,omitempty" yaml:"remote_addresses,omitempty"`
|
|
||||||
}{}
|
|
||||||
|
|
||||||
if err := json.Unmarshal([]byte(inp), &c); err != nil {
|
|
||||||
return nil, fmt.Errorf("%w: %w", config.ErrUnparseableConfig, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
table := new(bart.Lite)
|
|
||||||
|
|
||||||
for _, cidr := range c.RemoteAddr {
|
|
||||||
table.Insert(cidr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Impl{
|
|
||||||
prefixTable: table,
|
|
||||||
hash: internal.FastHash(string(inp)),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type fileConfig struct {
|
|
||||||
RemoteAddr []string `json:"remote_addresses,omitempty" yaml:"remote_addresses,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fc fileConfig) Valid() error {
|
|
||||||
var errs []error
|
|
||||||
|
|
||||||
if len(fc.RemoteAddr) == 0 {
|
|
||||||
errs = append(errs, ErrNoRemoteAddresses)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, cidr := range fc.RemoteAddr {
|
|
||||||
if _, err := netip.ParsePrefix(cidr); err != nil {
|
|
||||||
errs = append(errs, fmt.Errorf("%w: cidr %q is invalid: %w", config.ErrInvalidCIDR, cidr, err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(errs) != 0 {
|
|
||||||
return fmt.Errorf("%w: %w", policy.ErrMisconfiguration, errors.Join(errs...))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Impl struct {
|
|
||||||
prefixTable *bart.Lite
|
|
||||||
hash string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rac *Impl) Check(r *http.Request) (bool, error) {
|
|
||||||
host := r.Header.Get("X-Real-Ip")
|
|
||||||
if host == "" {
|
|
||||||
return false, fmt.Errorf("%w: header X-Real-Ip is not set", policy.ErrMisconfiguration)
|
|
||||||
}
|
|
||||||
|
|
||||||
addr, err := netip.ParseAddr(host)
|
|
||||||
if err != nil {
|
|
||||||
return false, fmt.Errorf("%w: %s is not an IP address: %w", policy.ErrMisconfiguration, host, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return rac.prefixTable.Contains(addr), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rac *Impl) Hash() string {
|
|
||||||
return rac.hash
|
|
||||||
}
|
|
||||||
@@ -1,238 +0,0 @@
|
|||||||
package remoteaddress
|
|
||||||
|
|
||||||
import (
|
|
||||||
_ "embed"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"net/http"
|
|
||||||
"net/netip"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/policy"
|
|
||||||
"github.com/TecharoHQ/anubis/lib/policy/config"
|
|
||||||
"github.com/gaissmai/bart"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestFactoryIsCheckerFactory(t *testing.T) {
|
|
||||||
if _, ok := (any(Factory{})).(checker.Factory); !ok {
|
|
||||||
t.Fatal("Factory is not an instance of checker.Factory")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFactoryValidateConfig(t *testing.T) {
|
|
||||||
f := Factory{}
|
|
||||||
|
|
||||||
for _, tt := range []struct {
|
|
||||||
name string
|
|
||||||
data []byte
|
|
||||||
err error
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "basic valid",
|
|
||||||
data: []byte(`{
|
|
||||||
"remote_addresses": [
|
|
||||||
"1.1.1.1/32"
|
|
||||||
]
|
|
||||||
}`),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "not json",
|
|
||||||
data: []byte(`]`),
|
|
||||||
err: config.ErrUnparseableConfig,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "no cidr",
|
|
||||||
data: []byte(`{
|
|
||||||
"remote_addresses": []
|
|
||||||
}`),
|
|
||||||
err: ErrNoRemoteAddresses,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "bad cidr",
|
|
||||||
data: []byte(`{
|
|
||||||
"remote_addresses": [
|
|
||||||
"according to all laws of aviation"
|
|
||||||
]
|
|
||||||
}`),
|
|
||||||
err: config.ErrInvalidCIDR,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
data := json.RawMessage(tt.data)
|
|
||||||
|
|
||||||
if err := f.ValidateConfig(data); !errors.Is(err, tt.err) {
|
|
||||||
t.Logf("want: %v", tt.err)
|
|
||||||
t.Logf("got: %v", err)
|
|
||||||
t.Fatal("validation didn't do what was expected")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFactoryCreate(t *testing.T) {
|
|
||||||
f := Factory{}
|
|
||||||
|
|
||||||
for _, tt := range []struct {
|
|
||||||
name string
|
|
||||||
data []byte
|
|
||||||
err error
|
|
||||||
ip string
|
|
||||||
match bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "basic valid",
|
|
||||||
data: []byte(`{
|
|
||||||
"remote_addresses": [
|
|
||||||
"1.1.1.1/32"
|
|
||||||
]
|
|
||||||
}`),
|
|
||||||
ip: "1.1.1.1",
|
|
||||||
match: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "bad cidr",
|
|
||||||
data: []byte(`{
|
|
||||||
"remote_addresses": [
|
|
||||||
"according to all laws of aviation"
|
|
||||||
]
|
|
||||||
}`),
|
|
||||||
err: config.ErrUnparseableConfig,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
data := json.RawMessage(tt.data)
|
|
||||||
|
|
||||||
impl, err := f.Create(data)
|
|
||||||
if !errors.Is(err, tt.err) {
|
|
||||||
t.Logf("want: %v", tt.err)
|
|
||||||
t.Logf("got: %v", err)
|
|
||||||
t.Fatal("creation didn't do what was expected")
|
|
||||||
}
|
|
||||||
|
|
||||||
if tt.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
r, err := http.NewRequest(http.MethodGet, "/", nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("can't make request: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if tt.ip != "" {
|
|
||||||
r.Header.Add("X-Real-Ip", tt.ip)
|
|
||||||
}
|
|
||||||
|
|
||||||
match, err := impl.Check(r)
|
|
||||||
|
|
||||||
if tt.match != match {
|
|
||||||
t.Errorf("match: %v, wanted: %v", match, tt.match)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil && tt.err != nil && !errors.Is(err, tt.err) {
|
|
||||||
t.Errorf("err: %v, wanted: %v", err, tt.err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if impl.Hash() == "" {
|
|
||||||
t.Error("hash method returns empty string")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func racFromCidrs(t *testing.T, inp []string) *Impl {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
var result Impl
|
|
||||||
result.prefixTable = new(bart.Lite)
|
|
||||||
result.hash = internal.FastHash(strings.Join(inp, ","))
|
|
||||||
|
|
||||||
for _, cidr := range inp {
|
|
||||||
pfx, err := netip.ParsePrefix(cidr)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("prefix %q is invalid: %v", cidr, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
result.prefixTable.Insert(pfx)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &result
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRemoteAddrChecker(t *testing.T) {
|
|
||||||
for _, tt := range []struct {
|
|
||||||
err error
|
|
||||||
name string
|
|
||||||
ip string
|
|
||||||
cidrs []string
|
|
||||||
ok bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "match_ipv4",
|
|
||||||
cidrs: []string{"0.0.0.0/0"},
|
|
||||||
ip: "1.1.1.1",
|
|
||||||
ok: true,
|
|
||||||
err: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "match_ipv6",
|
|
||||||
cidrs: []string{"::/0"},
|
|
||||||
ip: "cafe:babe::",
|
|
||||||
ok: true,
|
|
||||||
err: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "not_match_ipv4",
|
|
||||||
cidrs: []string{"1.1.1.1/32"},
|
|
||||||
ip: "1.1.1.2",
|
|
||||||
ok: false,
|
|
||||||
err: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "not_match_ipv6",
|
|
||||||
cidrs: []string{"cafe:babe::/128"},
|
|
||||||
ip: "cafe:babe:4::/128",
|
|
||||||
ok: false,
|
|
||||||
err: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "no_ip_set",
|
|
||||||
cidrs: []string{"::/0"},
|
|
||||||
ok: false,
|
|
||||||
err: policy.ErrMisconfiguration,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "invalid_ip",
|
|
||||||
cidrs: []string{"::/0"},
|
|
||||||
ip: "According to all natural laws of aviation",
|
|
||||||
ok: false,
|
|
||||||
err: policy.ErrMisconfiguration,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
rac := racFromCidrs(t, tt.cidrs)
|
|
||||||
|
|
||||||
r, err := http.NewRequest(http.MethodGet, "/", nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("can't make request: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if tt.ip != "" {
|
|
||||||
r.Header.Add("X-Real-Ip", tt.ip)
|
|
||||||
}
|
|
||||||
|
|
||||||
ok, err := rac.Check(r)
|
|
||||||
|
|
||||||
if tt.ok != ok {
|
|
||||||
t.Errorf("ok: %v, wanted: %v", ok, tt.ok)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil && tt.err != nil && !errors.Is(err, tt.err) {
|
|
||||||
t.Errorf("err: %v, wanted: %v", err, tt.err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -27,10 +27,10 @@
|
|||||||
"static_check_endpoint": "Este é apenas um ponto de verificação para seu proxy reverso usar.",
|
"static_check_endpoint": "Este é apenas um ponto de verificação para seu proxy reverso usar.",
|
||||||
"authorization_required": "Autorização necessária",
|
"authorization_required": "Autorização necessária",
|
||||||
"cookies_disabled": "Seu navegador está configurado para desabilitar cookies. O Anubis requer cookies para o interesse legítimo de garantir que você seja um cliente válido. Habilite os cookies para este domínio.",
|
"cookies_disabled": "Seu navegador está configurado para desabilitar cookies. O Anubis requer cookies para o interesse legítimo de garantir que você seja um cliente válido. Habilite os cookies para este domínio.",
|
||||||
"access_denied": "Acesso negado: código de erro",
|
"access_denied": "Acesso negado: código de errado",
|
||||||
"dronebl_entry": "DroneBL relatou uma entrada",
|
"dronebl_entry": "DroneBL relatou uma entrada",
|
||||||
"see_dronebl_lookup": "consulte",
|
"see_dronebl_lookup": "consulte",
|
||||||
"internal_server_error": "Erro interno do servidor: o administrador configurou incorretamente o Anubis. Entre em contato com o administrador e peça para analisar os logs relacionados.",
|
"internal_server_error": "Erro interno do servidor: o administrador configurou incorretamente o Anubis. Entre em contato com o administrador e peça para ele procurar os logs em torno dele.",
|
||||||
"invalid_redirect": "Redirecionamento inválido",
|
"invalid_redirect": "Redirecionamento inválido",
|
||||||
"redirect_not_parseable": "URL de redirecionamento não analisável",
|
"redirect_not_parseable": "URL de redirecionamento não analisável",
|
||||||
"redirect_domain_not_allowed": "Domínio de redirecionamento não permitido",
|
"redirect_domain_not_allowed": "Domínio de redirecionamento não permitido",
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal"
|
"github.com/TecharoHQ/anubis/internal"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
"github.com/TecharoHQ/anubis/lib/policy/config"
|
"github.com/TecharoHQ/anubis/lib/policy/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal"
|
"github.com/TecharoHQ/anubis/internal"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
"github.com/gaissmai/bart"
|
"github.com/gaissmai/bart"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Impl interface {
|
type Impl interface {
|
||||||
Check(*http.Request) (matches bool, err error)
|
Check(*http.Request) (bool, error)
|
||||||
Hash() string
|
Hash() string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,7 +31,6 @@ var (
|
|||||||
ErrCantSetBotAndImportValuesAtOnce = errors.New("config.BotOrImport: can't set bot rules and import values at the same time")
|
ErrCantSetBotAndImportValuesAtOnce = errors.New("config.BotOrImport: can't set bot rules and import values at the same time")
|
||||||
ErrMustSetBotOrImportRules = errors.New("config.BotOrImport: rule definition is invalid, you must set either bot rules or an import statement, not both")
|
ErrMustSetBotOrImportRules = errors.New("config.BotOrImport: rule definition is invalid, you must set either bot rules or an import statement, not both")
|
||||||
ErrStatusCodeNotValid = errors.New("config.StatusCode: status code not valid, must be between 100 and 599")
|
ErrStatusCodeNotValid = errors.New("config.StatusCode: status code not valid, must be between 100 and 599")
|
||||||
ErrUnparseableConfig = errors.New("config: can't parse configuration file")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Rule string
|
type Rule string
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/TecharoHQ/anubis/internal/thoth"
|
"github.com/TecharoHQ/anubis/internal/thoth"
|
||||||
"github.com/TecharoHQ/anubis/lib/checker"
|
"github.com/TecharoHQ/anubis/lib/policy/checker"
|
||||||
"github.com/TecharoHQ/anubis/lib/policy/config"
|
"github.com/TecharoHQ/anubis/lib/policy/config"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||||
|
|||||||
Reference in New Issue
Block a user