burp-ui/burpui/misc/audit/basic.py
2023-03-19 15:13:01 +01:00

86 lines
2.7 KiB
Python

# -*- coding: utf8 -*-
import logging
import re
from ...tools.logging import logger as parent_logger
from .interface import BUIaudit
from .interface import BUIauditLogger as BUIauditLoggerInterface
class BUIauditLoader(BUIaudit):
section = name = "BASIC:AUDIT"
logfile = None
max_bytes = None
rotate = None
def __init__(self, app):
"""
:param app: Instance of the app we are running in
:type app: :class:`burpui.engines.server.BUIServer`
"""
self.app = app
self.conf = self.app.conf
self.level = default = logging.getLevelName(self.app.logger.getEffectiveLevel())
if self.section in self.conf.options:
self.priority = self.conf.safe_get(
"priority", "integer", self.section, defaults=self.section
)
self.level = self.conf.safe_get(
"level", section=self.section, defaults=default
)
self.logfile = self.conf.safe_get("logfile", section=self.section)
self.max_bytes = self.conf.safe_get(
"max_bytes",
"force_string",
section=self.section,
defaults="30 * 1024 * 1024",
)
self.rotate = self.conf.safe_get(
"rotate", "integer", section=self.section, defaults=5
)
if self.max_bytes and re.match(r"(\d+\s*[+-/*]?\s*)+$", self.max_bytes):
self.max_bytes = eval(self.max_bytes)
else:
self.max_bytes = 0
if self.level != default:
self.level = logging.getLevelName(f"{self.level}".upper())
if not isinstance(self.level, int):
self.level = default
self._logger = BUIauditLogger(self)
class BUIauditLogger(BUIauditLoggerInterface):
_logger = parent_logger.getChild("audit") # type: logging.Logger
def __init__(self, loader):
self.loader = loader
self._level = self.loader.level
LOG_FORMAT = "[%(asctime)s] AUDIT %(levelname)s in %(from)s: %(message)s"
if self.loader.logfile and self.loader.logfile.lower() != "none":
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler(
self.loader.logfile,
maxBytes=self.loader.max_bytes,
backupCount=self.loader.rotate,
)
else:
from logging import StreamHandler
handler = StreamHandler()
handler.setLevel(self.level)
handler.setFormatter(logging.Formatter(LOG_FORMAT))
self._logger.setLevel(self.level)
self._logger.addHandler(handler)
def log(self, level, message, *args, **kwargs):
self._logger.log(level, message, *args, **kwargs)