92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
package Judge
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/d3m0k1d/BanForge/internal/blocker"
|
|
"github.com/d3m0k1d/BanForge/internal/config"
|
|
"github.com/d3m0k1d/BanForge/internal/logger"
|
|
"github.com/d3m0k1d/BanForge/internal/storage"
|
|
)
|
|
|
|
type Judge struct {
|
|
db *storage.DB
|
|
logger *logger.Logger
|
|
Blocker blocker.BlockerEngine
|
|
rulesByService map[string][]config.Rule
|
|
}
|
|
|
|
func New(db *storage.DB) *Judge {
|
|
return &Judge{
|
|
db: db,
|
|
logger: logger.New(false),
|
|
rulesByService: make(map[string][]config.Rule),
|
|
}
|
|
}
|
|
|
|
func (j *Judge) LoadRules(rules []config.Rule) {
|
|
j.rulesByService = make(map[string][]config.Rule)
|
|
for _, rule := range rules {
|
|
j.rulesByService[rule.ServiceName] = append(
|
|
j.rulesByService[rule.ServiceName],
|
|
rule,
|
|
)
|
|
}
|
|
j.logger.Info("Rules loaded and indexed by service")
|
|
}
|
|
|
|
func (j *Judge) ProcessUnviewed() error {
|
|
rows, err := j.db.SearchUnViewed()
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to query database: %v", err))
|
|
return err
|
|
}
|
|
defer func() {
|
|
err = rows.Close()
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to close database connection: %v", err))
|
|
}
|
|
}()
|
|
|
|
for rows.Next() {
|
|
var entry storage.LogEntry
|
|
err = rows.Scan(&entry.ID, &entry.Service, &entry.IP, &entry.Path, &entry.Status, &entry.Method, &entry.IsViewed, &entry.CreatedAt)
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to scan database row: %v", err))
|
|
continue
|
|
}
|
|
|
|
rules, serviceExists := j.rulesByService[entry.Service]
|
|
if serviceExists {
|
|
for _, rule := range rules {
|
|
if (rule.Method == "" || entry.Method == rule.Method) &&
|
|
(rule.Status == "" || entry.Status == rule.Status) &&
|
|
(rule.Path == "" || entry.Path == rule.Path) {
|
|
|
|
j.logger.Info(fmt.Sprintf("Rule matched for IP: %s, Service: %s", entry.IP, entry.Service))
|
|
err = j.Blocker.Ban(entry.IP)
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to ban IP: %v", err))
|
|
}
|
|
j.logger.Info(fmt.Sprintf("IP banned: %s", entry.IP))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
err = j.db.MarkAsViewed(entry.ID)
|
|
if err != nil {
|
|
j.logger.Error(fmt.Sprintf("Failed to mark entry as viewed: %v", err))
|
|
} else {
|
|
j.logger.Info(fmt.Sprintf("Entry marked as viewed: ID=%d", entry.ID))
|
|
}
|
|
}
|
|
|
|
if err = rows.Err(); err != nil {
|
|
j.logger.Error(fmt.Sprintf("Error iterating rows: %v", err))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|