This commit is contained in:
ziirish 2023-03-19 15:13:01 +01:00
parent b23a107a62
commit 7f2832d1fa
81 changed files with 399 additions and 396 deletions

View file

@ -12,8 +12,7 @@ jQuery/Bootstrap
"""
import os
import sys
from argparse import ArgumentParser, REMAINDER
from argparse import REMAINDER, ArgumentParser
ROOT = os.path.dirname(os.path.realpath(__file__))
# Try to load modules from our current env first
@ -79,7 +78,7 @@ def parse_args(mode=True, name=None):
unknown = []
if options.version:
from burpui.desc import __title__, __version__, __release__
from burpui.desc import __release__, __title__, __version__
ver = "{}: v{}".format(mname or __title__, __version__)
if options.log:
@ -153,6 +152,7 @@ def server(options=None, unknown=None):
def agent(options=None):
import trio
from burpui.engines.agent import BUIAgent as Agent
from burpui.utils import lookup_file
@ -172,6 +172,7 @@ def agent(options=None):
def monitor(options=None):
import trio
from burpui.engines.monitor import MonitorPool
from burpui.utils import lookup_file

View file

@ -8,8 +8,7 @@
"""
import pickle # noqa
from urllib.parse import unquote, quote, urlparse, urljoin # noqa
from urllib.parse import quote, unquote, urljoin, urlparse # noqa
text_type = str
string_types = (str,)

View file

@ -8,22 +8,22 @@
"""
import hashlib
import os
import sys
import uuid
import hashlib
from flask import Blueprint, Response, request, current_app, session, abort, g
from flask_restx import Api as ApiPlus
from flask_login import current_user
from importlib import import_module
from functools import wraps
from importlib import import_module
from flask import Blueprint, Response, abort, current_app, g, request, session
from flask_login import current_user
from flask_restx import Api as ApiPlus
from .._compat import to_bytes
from ..desc import __version__, __release__, __url__, __doc__
from ..config import config
from ..desc import __doc__, __release__, __url__, __version__
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from ..config import config
from ..tools.logging import logger
bui = current_app # type: BUIServer

View file

@ -7,20 +7,21 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from . import api
import json
from flask import current_app
from flask_babel import gettext
from flask_login import current_user
from ..engines.server import BUIServer # noqa
from ..sessions import session_manager
from ..misc.acl.meta import meta_grants
from ..sessions import session_manager
from ..utils import NOTIF_OK
from .custom import fields, Resource
from . import api
from .custom import Resource, fields
# from ..exceptions import BUIserverException
from flask import current_app
from flask_login import current_user
from flask_babel import gettext
import json
bui = current_app # type: BUIServer
ns = api.namespace("admin", "Admin methods")

View file

@ -7,14 +7,14 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from . import api
from ..engines.server import BUIServer # noqa
from .custom import Resource
from ..exceptions import BUIserverException
from flask import current_app
from flask_login import current_user
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from . import api
from .custom import Resource
bui = current_app # type: BUIServer
ns = api.namespace("backup", "Backup methods")

View file

@ -10,17 +10,17 @@
import os
import re
from . import api, cache_key, force_refresh
from ..engines.server import BUIServer # noqa
from .custom import fields, Resource
from ..decorators import browser_cache
from ..ext.cache import cache
from ..exceptions import BUIserverException
from flask_restx.marshalling import marshal
from flask_restx import inputs
from flask import current_app, request
from flask_login import current_user
from flask_restx import inputs
from flask_restx.marshalling import marshal
from ..decorators import browser_cache
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from ..ext.cache import cache
from . import api, cache_key, force_refresh
from .custom import Resource, fields
bui = current_app # type: BUIServer
ns = api.namespace("client", "Client methods")

View file

@ -7,18 +7,18 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from . import api, cache_key, force_refresh
from ..engines.server import BUIServer # noqa
from .custom import fields, Resource
from .client import ClientLabels
from ..ext.cache import cache
from ..exceptions import BUIserverException
from ..decorators import browser_cache
from ..filter import mask
from flask import current_app, g
from flask_login import current_user
from ..decorators import browser_cache
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from ..ext.cache import cache
from ..filter import mask
from . import api, cache_key, force_refresh
from .client import ClientLabels
from .custom import Resource, fields
bui = current_app # type: BUIServer
ns = api.namespace("clients", "Clients methods")
@ -229,7 +229,7 @@ class RunningBackup(Resource):
res = [x for x in res if x in allowed]
running = False
if isinstance(res, dict):
for (_, run) in res.items():
for _, run in res.items():
running = running or (len(run) > 0)
if running:
break
@ -776,7 +776,7 @@ class AllClients(Resource):
else:
for serv in bui.client.servers:
grants[serv] = "all"
for (serv, clients) in grants.items():
for serv, clients in grants.items():
if not isinstance(clients, list):
clients = clients_cache.get(serv, [])
ret += [{"name": x, "agent": serv} for x in clients]

View file

@ -9,15 +9,15 @@
"""
import flask_restx.fields
from flask_restx.fields import * # noqa # pylint: disable=locally-disabled, wildcard-import, unused-wildcard-import
from .my_fields import (
DateTime,
DateTimeHuman,
BackupNumber,
SafeString,
DateTime,
DateTimeHuman, # noqa
LocalizedString,
) # noqa
SafeString,
)
__all__ = flask_restx.fields.__all__ + (
DateTime,

View file

@ -9,15 +9,15 @@
"""
import datetime
import arrow
from flask import escape
from flask_babel import gettext as _
from flask_restx import fields
from tzlocal import get_localzone
from ...ext.i18n import get_locale
from flask_restx import fields
from flask_babel import gettext as _
from flask import escape
from tzlocal import get_localzone
TZ = str(get_localzone())

View file

@ -7,22 +7,22 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from . import api, cache_key, force_refresh
from ..engines.server import BUIServer # noqa
from .custom import fields, Resource
from .client import ClientLabels
from ..filter import mask
from ..exceptions import BUIserverException
from ..decorators import browser_cache
from ..ext.cache import cache
from ..ext.i18n import LANGUAGES
from flask import flash, get_flashed_messages, url_for, current_app, session
from flask_login import current_user
import random
import re
from flask import current_app, flash, get_flashed_messages, session, url_for
from flask_login import current_user
from ..decorators import browser_cache
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from ..ext.cache import cache
from ..ext.i18n import LANGUAGES
from ..filter import mask
from . import api, cache_key, force_refresh
from .client import ClientLabels
from .custom import Resource, fields
bui = current_app # type: BUIServer
ns = api.namespace("misc", "Misc methods")
@ -213,7 +213,7 @@ class Counters(Resource):
)
else:
found = False
for (_, cls) in running.items():
for _, cls in running.items():
if client in cls:
found = True
break
@ -346,7 +346,7 @@ class Live(Resource):
else:
running = bui.client.is_one_backup_running()
if isinstance(running, dict):
for (serv, clients) in running.items():
for serv, clients in running.items():
for client in clients:
# ACL
if mask.has_filters(current_user) and not mask.is_client_allowed(
@ -533,15 +533,15 @@ class About(Resource):
srv = bui.client.get_server_version(server)
multi = {}
if isinstance(cli, dict):
for (name, val) in cli.items():
for name, val in cli.items():
multi[name] = {"client": val}
if isinstance(srv, dict):
for (name, val) in srv.items():
for name, val in srv.items():
multi[name]["server"] = val
if not multi:
res["burp"].append({"client": cli, "server": srv})
else:
for (name, val) in multi.items():
for name, val in multi.items():
tmp = val
tmp.update({"name": name})
res["burp"].append(tmp)
@ -841,7 +841,7 @@ class History(Resource):
]
else:
grants[serv] = "all"
for (serv, clients) in grants.items():
for serv, clients in grants.items():
if not isinstance(clients, list):
if data and serv in data:
clients = data[serv].keys()

View file

@ -7,14 +7,14 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from flask import session, current_app, request
from flask import current_app, request, session
from flask_login import current_user
from werkzeug.datastructures import MultiDict
from . import api
from ..engines.server import BUIServer # noqa
from ..ext.i18n import LANGUAGES
from .custom import fields, Resource
from . import api
from .custom import Resource, fields
bui = current_app # type: BUIServer
ns = api.namespace("preferences", "Preferences methods")

View file

@ -9,20 +9,20 @@
"""
import select
import struct
from . import api
from ..engines.server import BUIServer # noqa
from .custom import fields, Resource
from ..exceptions import BUIserverException
from zlib import adler32
from time import gmtime, strftime, time
from flask import Response, send_file, make_response, after_this_request, current_app
from zlib import adler32
from flask import Response, after_this_request, current_app, make_response, send_file
from flask_login import current_user
from flask_restx import inputs
from werkzeug.datastructures import Headers
from werkzeug.exceptions import HTTPException
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from . import api
from .custom import Resource, fields
bui = current_app # type: BUIServer
ns = api.namespace("restore", "Restore methods")

View file

@ -1,17 +1,17 @@
# -*- coding: utf8 -*-
# This is a submodule we can also use "from ..api import api"
from . import api, cache_key, force_refresh
from ..engines.server import BUIServer # noqa
from .custom import fields, Resource
from ..filter import mask
from ..ext.cache import cache
from ..decorators import browser_cache
from ..exceptions import BUIserverException
from flask import current_app, g
from flask_login import current_user
from ..decorators import browser_cache
from ..engines.server import BUIServer # noqa
from ..exceptions import BUIserverException
from ..ext.cache import cache
from ..filter import mask
from . import api, cache_key, force_refresh
from .custom import Resource, fields
bui = current_app # type: BUIServer
ns = api.namespace("servers", "Servers methods")

View file

@ -9,27 +9,28 @@
"""
import json
from . import api
from ..engines.server import BUIServer # noqa
from ..ext.cache import cache
from .custom import Resource
from .._compat import unquote
from ..utils import NOTIF_INFO
from flask_babel import gettext as _, refresh
from flask import (
jsonify,
request,
url_for,
current_app,
g,
session,
jsonify,
render_template_string,
request,
session,
url_for,
)
from flask_babel import gettext as _
from flask_babel import refresh
from flask_login import current_user
from flask_restx import inputs
from jinja2 import Environment, meta
from .._compat import unquote
from ..datastructures import ImmutableMultiDict, MultiDict
from ..engines.server import BUIServer # noqa
from ..ext.cache import cache
from ..utils import NOTIF_INFO
from . import api
from .custom import Resource
TEMPLATE_EXCLUDES = ["client", "agent"]
@ -1026,7 +1027,6 @@ class ClientSettings(Resource):
},
)
class PathExpander(Resource):
parser = ns.parser()
parser.add_argument("path", required=True, help="No 'path' provided")
parser.add_argument("source", required=False, help="Which file is it included in")

View file

@ -10,36 +10,36 @@
import os
import select
import struct
from . import api, cache_key, force_refresh
from .misc import History
from .custom import Resource
from .client import node_fields
from .clients import RunningBackup, ClientsReport, RunningClients
from ..engines.server import BUIServer # noqa
from ..ext.cache import cache
from ..config import config
from ..decorators import browser_cache
from ..tasks import perform_restore, load_all_tree, delete_client, force_scheduling_now
from datetime import timedelta
from time import time
from zlib import adler32
from flask import (
url_for,
Response,
current_app,
after_this_request,
send_file,
request,
current_app,
g,
request,
send_file,
session,
url_for,
)
from flask_babel import gettext as _
from flask_restx import inputs
from flask_login import current_user
from datetime import timedelta
from flask_restx import inputs
from werkzeug.datastructures import Headers
from ..config import config
from ..decorators import browser_cache
from ..engines.server import BUIServer # noqa
from ..ext.cache import cache
from ..tasks import delete_client, force_scheduling_now, load_all_tree, perform_restore
from . import api, cache_key, force_refresh
from .client import node_fields
from .clients import ClientsReport, RunningBackup, RunningClients
from .custom import Resource
from .misc import History
try:
from .ext.ws import socketio # noqa

View file

@ -9,19 +9,19 @@ jQuery/Bootstrap
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import json
import logging
import os
import sys
import json
import time
import logging
from .desc import __version__, __release__
from .desc import __release__, __version__
from .extensions import (
create_celery,
create_db,
create_websocket,
parse_db_setting,
get_redis_server,
parse_db_setting,
)
@ -53,18 +53,19 @@ def create_app(conf=None, verbose=0, logfile=None, **kwargs):
:returns: A :class:`burpui.engines.server.BUIServer` object
"""
from flask import g, request, session
from flask_login import LoginManager
from flask_babel import gettext
from .thirdparty.flask_bower import Bower
from .utils import ReverseProxied, lookup_file, is_uuid
from .tools.logging import logger
from .security import basic_login_from_request
from flask_login import LoginManager
from .engines.server import BUIServer as BurpUI
from .sessions import session_manager
from .filter import mask
from .ext.cache import cache
from .ext.i18n import babel, get_locale
from .filter import mask
from .misc.auth.handler import BUIanon
from .security import basic_login_from_request
from .sessions import session_manager
from .thirdparty.flask_bower import Bower
from .tools.logging import logger
from .utils import ReverseProxied, is_uuid, lookup_file
gunicorn = kwargs.get("gunicorn", True)
unittest = kwargs.get("unittest", False)
@ -179,6 +180,7 @@ def create_app(conf=None, verbose=0, logfile=None, **kwargs):
"false",
]:
from redis import Redis
from .ext.session import sess
host, port, pwd = get_redis_server(app)
@ -299,7 +301,7 @@ def create_app(conf=None, verbose=0, logfile=None, **kwargs):
if not celery_worker:
from .api import api, apibp
from .routes import view, mypad
from .routes import mypad, view
app.jinja_env.globals.update(
isinstance=isinstance,

View file

@ -12,6 +12,7 @@ jQuery/Bootstrap
import os
import sys
import time
import click
if os.getenv("BUI_MODE") in ["server", "ws"] or "websocket" in sys.argv:
@ -59,10 +60,11 @@ app = create_app(
)
try:
from .extensions import create_db
from .ext.sql import db
from flask_migrate import Migrate
from .ext.sql import db
from .extensions import create_db
# This may have been reseted by create_app
if isinstance(app.database, bool):
app.config["WITH_SQL"] = app.database
@ -470,13 +472,14 @@ def setup_burp(
if msg:
_die(msg, "setup-burp")
from .misc.parser.utils import Config
from .misc.backend.utils.constant import BURP_LISTEN_OPTION, BURP_BIND_MULTIPLE
from .app import get_redis_server
from .config import BUIConfig
import difflib
import tempfile
from .app import get_redis_server
from .config import BUIConfig
from .misc.backend.utils.constant import BURP_BIND_MULTIPLE, BURP_LISTEN_OPTION
from .misc.parser.utils import Config
if monitor:
monconf = BUIConfig(monitor)
monconf_orig = []
@ -595,10 +598,11 @@ def setup_burp(
if redis:
try:
# detect missing modules
import redis as redis_client # noqa
import celery # noqa
import socket
import celery # noqa
import redis as redis_client # noqa
if (
"redis" not in app.conf.options["Production"]
or "redis" in app.conf.options["Production"]
@ -974,7 +978,6 @@ exclude_comp=gz
bconfagent = os.devnull
if not os.path.exists(bconfagent):
agenttpl = """
password = abcdefgh
"""
@ -1039,9 +1042,9 @@ def diag(client, host, tips):
if msg:
_die(msg, "diag")
from .app import get_redis_server
from .misc.backend.utils.constant import BURP_LISTEN_OPTION
from .misc.parser.utils import Config
from .app import get_redis_server
def _value_in_option(value, option, section="Production"):
if section not in app.conf.options:
@ -1057,10 +1060,11 @@ def diag(client, host, tips):
):
try:
# detect missing modules
import redis as redis_client # noqa
import celery # noqa
import socket
import celery # noqa
import redis as redis_client # noqa
rhost, rport, _ = get_redis_server(app)
ret = -1
for res in socket.getaddrinfo(
@ -1345,9 +1349,10 @@ def diag(client, host, tips):
)
def sysinfo(verbose, load):
"""Returns a couple of system informations to help debugging."""
from .desc import __release__, __version__
import platform
from .desc import __release__, __version__
msg = None
if load:
try:

View file

@ -7,9 +7,10 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import codecs
import os
import re
import codecs
import configobj
import validate
@ -114,7 +115,6 @@ class BUIConfig(dict):
found = False
for line in ori:
if re.match(r"^\s*(#|;)+\s*\[{}\]".format(section), line):
config.write("[{}]\n".format(section))
found = True
else:

View file

@ -7,9 +7,8 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import time
import datetime
import time
from functools import wraps
@ -30,13 +29,13 @@ def browser_cache(expires=None):
"""
from wsgiref.handlers import format_date_time
from flask import g
from flask_restx.utils import unpack
def cache_decorator(view):
@wraps(view)
def cache_func(*args, **kwargs):
resp, code, headers = unpack(view(*args, **kwargs))
now = datetime.datetime.now()

View file

@ -7,23 +7,22 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import os
import struct
import sys
import ssl
import json
import logging
import os
import ssl
import struct
import sys
import time
from functools import partial
import trio
from functools import partial
from ..exceptions import BUIserverException
from ..misc.backend.interface import BUIbackend
from .._compat import pickle, to_bytes, to_unicode
from ..config import config
from ..desc import __version__
from ..exceptions import BUIserverException
from ..misc.backend.interface import BUIbackend
# TODO: sendfile is not yet supported by trio
# try:
@ -269,8 +268,8 @@ class BUIAgent(BUIbackend):
if j["args"]:
if "pickled" in j and j["pickled"]:
# de-serialize arguments if needed
import hmac
import hashlib
import hmac
from base64 import b64decode
pickles = to_bytes(j["args"])

View file

@ -7,25 +7,24 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import ssl
import trio
import json
import math
import struct
import logging
import datetime
import json
import logging
import math
import ssl
import struct
from functools import partial
from itertools import count
import trio
from async_generator import asynccontextmanager
from .._compat import to_bytes, to_unicode
from ..config import config
from ..desc import __version__
from ..exceptions import BUIserverException
from ..misc.backend.utils.burp2 import Monitor
from ..config import config
from .._compat import to_bytes, to_unicode
from ..tools.logging import logger
from ..desc import __version__
CONNECTION_COUNTER = count()

View file

@ -7,22 +7,21 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import logging # noqa
import os
import re
import sys
import logging # noqa
import warnings
from ..tools.logging import logger
from ..misc.auth.handler import UserAuthHandler
from ..misc.acl.handler import ACLloader
from ..misc.audit.handler import BUIauditLoader
from ..config import config
from ..plugins import PluginManager
from datetime import timedelta
from flask import Flask
from ..config import config
from ..misc.acl.handler import ACLloader
from ..misc.audit.handler import BUIauditLoader
from ..misc.auth.handler import UserAuthHandler
from ..plugins import PluginManager
from ..tools.logging import logger
BUI_DEFAULTS = {
"Global": {

View file

@ -9,7 +9,6 @@
"""
from flask_caching import Cache
cache = Cache(
config={
"CACHE_TYPE": "simple",

View file

@ -10,8 +10,9 @@
from flask import request, session
from flask_babel import Babel
from flask_login import current_user
from ..config import config
from .._compat import to_unicode
from ..config import config
babel = Babel()

View file

@ -7,9 +7,10 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from ..config import config
from flask_socketio import SocketIO
from ..config import config
options = {}
options["async_mode"] = config.get("WS_ASYNC_MODE", "gevent")

View file

@ -57,9 +57,10 @@ def create_db(myapp, cli=False, unittest=False, create=True, celery_worker=False
"""
if myapp.config["WITH_SQL"]:
try:
from .ext.sql import db
from sqlalchemy.exc import OperationalError
from sqlalchemy_utils.functions import database_exists
from .ext.sql import db
from .models import lazy_loading
lazy_loading()

View file

@ -7,11 +7,11 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from .ext.i18n import LANGUAGES, get_locale
from flask_wtf import FlaskForm
from flask_babel import lazy_gettext as __
from wtforms import StringField, PasswordField, BooleanField, SelectField, validators
from flask_wtf import FlaskForm
from wtforms import BooleanField, PasswordField, SelectField, StringField, validators
from .ext.i18n import LANGUAGES, get_locale
class LoginForm(FlaskForm):

View file

@ -1,7 +1,7 @@
# -*- coding: utf8 -*-
from .meta import meta_grants, BUIaclGrant
from ...utils import NOTIF_ERROR, NOTIF_OK, NOTIF_WARN, __
from .interface import BUIaclLoader
from ...utils import NOTIF_OK, NOTIF_WARN, NOTIF_ERROR, __
from .meta import BUIaclGrant, meta_grants
class ACLloader(BUIaclLoader):

View file

@ -1,12 +1,11 @@
# -*- coding: utf8 -*-
import os
from collections import OrderedDict
from importlib import import_module
from .interface import BUIacl, BUIaclLoader
from .meta import meta_grants
from importlib import import_module
from collections import OrderedDict
class ACLloader(BUIaclLoader):
section = name = "ACL"

View file

@ -7,9 +7,8 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from abc import ABCMeta, abstractmethod, abstractproperty
import logging
from abc import ABCMeta, abstractmethod, abstractproperty
class BUIaclLoader(object, metaclass=ABCMeta):

View file

@ -7,14 +7,14 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from .interface import BUIacl
from ...utils import make_list
import fnmatch
import json
import re
from ...config import config
from ...ext.cache import cache
import re
import json
import fnmatch
from ...utils import make_list
from .interface import BUIacl
PARSE_EXCLUDE_KEYS = ["agents", "clients", "ro", "rw", "order", "exclude"]
PARSE_RESERVED_KEYS = ["ro", "rw", "order", "exclude"]

View file

@ -1,9 +1,10 @@
# -*- coding: utf8 -*-
import re
import logging
import re
from .interface import BUIaudit, BUIauditLogger as BUIauditLoggerInterface
from ...tools.logging import logger as parent_logger
from .interface import BUIaudit
from .interface import BUIauditLogger as BUIauditLoggerInterface
class BUIauditLoader(BUIaudit):

View file

@ -1,13 +1,14 @@
# -*- coding: utf8 -*-
import os
import inspect
from .interface import BUIaudit, BUIauditLogger as BUIauditLoggerInterface
from importlib import import_module
import os
from collections import OrderedDict
from importlib import import_module
from flask_login import current_user
from .interface import BUIaudit
from .interface import BUIauditLogger as BUIauditLoggerInterface
class BUIauditLoader(BUIaudit):
"""See :class:`burpui.misc.audit.interface.BUIaudit`"""

View file

@ -8,7 +8,6 @@
"""
import logging
from abc import ABCMeta, abstractmethod

View file

@ -2,10 +2,11 @@
import re
from flask_login import AnonymousUserMixin
from .interface import BUIhandler, BUIuser, BUIloader
from ...utils import NOTIF_ERROR, NOTIF_OK, NOTIF_WARN, __
from werkzeug.security import check_password_hash, generate_password_hash
from ...utils import NOTIF_ERROR, NOTIF_OK, NOTIF_WARN, __
from .interface import BUIhandler, BUIloader, BUIuser
class BasicLoader(BUIloader):
"""The :class:`burpui.misc.auth.basic.BasicLoader` class loads the *Basic*

View file

@ -1,15 +1,15 @@
# -*- coding: utf8 -*-
import os
from collections import OrderedDict
from importlib import import_module
from flask import session
from flask_login import AnonymousUserMixin
from ...sessions import session_manager
from ...utils import is_uuid
from .interface import BUIhandler, BUIuser
from ..acl.interface import BUIacl
from importlib import import_module
from flask import session
from collections import OrderedDict
from flask_login import AnonymousUserMixin
from .interface import BUIhandler, BUIuser
ACL_METHODS = BUIacl.__abstractmethods__

View file

@ -7,9 +7,10 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from flask_login import UserMixin, AnonymousUserMixin
from abc import ABCMeta, abstractmethod, abstractproperty
from flask_login import AnonymousUserMixin, UserMixin
from ...tools.logging import logger

View file

@ -1,21 +1,21 @@
# -*- coding: utf8 -*-
import ssl
from flask_login import AnonymousUserMixin
from .interface import BUIhandler, BUIuser, BUIloader
from ...utils import __
import ssl
from .interface import BUIhandler, BUIloader, BUIuser
try:
from ldap3 import (
Server,
Connection,
Tls,
ALL,
RESTARTABLE,
AUTO_BIND_TLS_BEFORE_BIND,
AUTO_BIND_NONE,
AUTO_BIND_TLS_BEFORE_BIND,
RESTARTABLE,
SIMPLE,
Connection,
Server,
Tls,
)
except ImportError:
raise ImportError("Unable to load 'ldap3' module")
@ -74,7 +74,7 @@ class LdapLoader(BUIloader):
)
except:
pass
for (opt, key) in mapping.items():
for opt, key in mapping.items():
setattr(self, opt, conf.safe_get(key, "force_string", section=self.section))
if self.validate and self.validate.lower() in ["none", "optional", "required"]:

View file

@ -1,10 +1,11 @@
# -*- coding: utf8 -*-
import pwd
import pam
import pam
from flask_login import AnonymousUserMixin
from .interface import BUIhandler, BUIuser, BUIloader
from ...utils import __
from .interface import BUIhandler, BUIloader, BUIuser
class LocalLoader(BUIloader):

View file

@ -7,25 +7,26 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import re
import os
import socket
import time
import datetime
import json
import os
import re
import shutil
import socket
import subprocess
import tempfile
from .interface import BUIbackend
from ..parser.burp1 import Parser
from ...utils import human_readable as _hr, BUIcompress, utc_to_local
from ...security import sanitize_string
from ...exceptions import BUIserverException
from ..._compat import unquote, to_unicode, to_bytes
import time
from shlex import quote
from ..._compat import to_bytes, to_unicode, unquote
from ...exceptions import BUIserverException
from ...security import sanitize_string
from ...utils import BUIcompress
from ...utils import human_readable as _hr
from ...utils import utc_to_local
from ..parser.burp1 import Parser
from .interface import BUIbackend
class Burp(BUIbackend):
"""The :class:`burpui.misc.backend.burp1.Burp` class provides a consistent
@ -510,7 +511,7 @@ class Burp(BUIbackend):
found = False
# this method is not optimal, but it is easy to read and to maintain
for (key, regex) in lookup_easy.items():
for key, regex in lookup_easy.items():
reg = re.search(regex, line)
if reg:
found = True
@ -526,7 +527,7 @@ class Burp(BUIbackend):
tmp = reg.group(1).split(":")
tmp.reverse()
fields = [0] * 4
for (i, val) in enumerate(tmp):
for i, val in enumerate(tmp):
fields[i] = int(val)
seconds = 0
seconds += fields[0]
@ -543,7 +544,7 @@ class Burp(BUIbackend):
if found:
continue
for (key, regex) in lookup_complex.items():
for key, regex in lookup_complex.items():
reg = re.search(regex, line)
if reg:
# self.logger.debug("match[1]: '{0}'".format(reg.group(1)))

View file

@ -7,21 +7,21 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import re
import os
import time
import json
import os
import re
import time
from collections import OrderedDict
from ..._compat import to_unicode
from ...exceptions import BUIserverException
from ...utils import human_readable as _hr
from ...utils import utc_to_local
from ..parser.burp2 import Parser
from .burp1 import Burp as Burp1
from .interface import BUIbackend
from .utils.burp2 import Monitor
from .utils.constant import BURP_REVERSE_COUNTERS, BURP_STATUS_FORMAT_V2
from ..parser.burp2 import Parser
from ...utils import human_readable as _hr, utc_to_local
from ...exceptions import BUIserverException
from ..._compat import to_unicode
# Some functions are the same as in Burp1 backend
@ -301,7 +301,7 @@ class Burp(Burp1):
result[name] = counter["count"]
else:
result[name] = {}
for (key, val) in counts.items():
for key, val in counts.items():
if val in counter:
result[name][key] = counter[val]
else:

View file

@ -9,7 +9,6 @@
"""
import os
import re
from abc import ABCMeta, abstractmethod
from ...tools.logging import logger

View file

@ -1,19 +1,18 @@
# -*- coding: utf8 -*-
import re
import socket
import errno
import json
import re
import socket
import struct
from werkzeug.datastructures import ImmutableMultiDict as _ImmutableMultiDict
from .interface import BUIbackend
from ..parser.interface import BUIparser
from ...exceptions import BUIserverException
from ..._compat import pickle, to_unicode, to_bytes
from ...decorators import implement
from ..._compat import pickle, to_bytes, to_unicode
from ...datastructures import ImmutableMultiDict
from ...decorators import implement
from ...exceptions import BUIserverException
from ..parser.interface import BUIparser
from .interface import BUIbackend
INTERFACE_METHODS = BUIbackend.__abstractmethods__
PARSER_INTERFACE_METHODS = BUIparser.__abstractmethods__
@ -556,8 +555,8 @@ class NClient(BUIbackend):
):
"""See :func:`burpui.misc.backend.interface.BUIbackend.store_conf_cli`"""
# serialize data as it is a nested dict
import hmac
import hashlib
import hmac
from base64 import b64encode
if not isinstance(data, (_ImmutableMultiDict, ImmutableMultiDict)):
@ -599,8 +598,8 @@ class NClient(BUIbackend):
def store_conf_srv(self, data, conf=None, agent=None):
"""See :func:`burpui.misc.backend.interface.BUIbackend.store_conf_srv`"""
# serialize data as it is a nested dict
import hmac
import hashlib
import hmac
from base64 import b64encode
if not isinstance(data, (_ImmutableMultiDict, ImmutableMultiDict)):

View file

@ -7,26 +7,26 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import json
import os
import re
import json
import ssl
import time
import trio
import struct
import time
from asyncio import iscoroutinefunction
from functools import partial
from .burp2 import Burp as Burp2
from .interface import BUIbackend, BUIBACKEND_INTERFACE_METHODS
from .utils.constant import BURP_STATUS_FORMAT_V2
from ..parser.burp2 import Parser
from ...exceptions import BUIserverException
import trio
from ..._compat import to_bytes, to_unicode
from ...decorators import implement, usetriorun
from ...utils import utc_to_local
from ..._compat import to_unicode, to_bytes
from ...exceptions import BUIserverException
from ...tools.logging import logger
from ...utils import utc_to_local
from ..parser.burp2 import Parser
from .burp2 import Burp as Burp2
from .interface import BUIBACKEND_INTERFACE_METHODS, BUIbackend
from .utils.constant import BURP_STATUS_FORMAT_V2
BUI_DEFAULTS = {
"Parallel": {
@ -136,7 +136,6 @@ class Connector:
return result
async def status(self, query, timeout=None, cache=True):
request = {
"query": query,
"timeout": timeout,

View file

@ -7,11 +7,10 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import datetime
import json
import re
import subprocess
import json
import datetime
from select import select
from ...._compat import to_bytes, to_unicode
@ -21,8 +20,8 @@ from ....tools.logging import logger
from .constant import (
BURP_LIST_BATCH,
BURP_MINIMAL_VERSION,
BURP_STATUS_FORMAT_V2,
BURP_STATUS_DELIMITER,
BURP_STATUS_FORMAT_V2,
)

View file

@ -5,19 +5,18 @@
:synopsis: Burp-UI configuration file parser for Burp1.
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import re
import os
import json
import codecs
import json
import os
import re
import shutil
from glob import glob
from .doc import Doc
from .utils import Config
from .openssl import OSSLConf, OSSLAuth
from ...exceptions import BUIserverException
from ...utils import NOTIF_ERROR, NOTIF_OK, NOTIF_WARN
from .doc import Doc
from .openssl import OSSLAuth, OSSLConf
from .utils import Config
class Parser(Doc):

View file

@ -5,8 +5,8 @@
:synopsis: Burp-UI configuration file parser for Burp2.
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from ..backend.utils.constant import BURP_BIND_MULTIPLE, BURP_LISTEN_OPTION
from .burp1 import Parser as Burp1
from ..backend.utils.constant import BURP_LISTEN_OPTION, BURP_BIND_MULTIPLE
def __(string):

View file

@ -5,12 +5,12 @@
:synopsis: Burp-UI configuration file parser OpenSSL configuration.
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import codecs
import os
import re
import codecs
import subprocess
from hashlib import md5
from OpenSSL import crypto
from ...tools.logging import logger

View file

@ -6,20 +6,18 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import codecs
import os
import re
import codecs
import shutil
from copy import copy
from hashlib import md5
from collections import OrderedDict
from copy import copy
from glob import glob
from hashlib import md5
from ...utils import NOTIF_ERROR, NOTIF_OK, NOTIF_WARN
from ...security import sanitize_string
from ...datastructures import MultiDict
from ...security import sanitize_string
from ...utils import NOTIF_ERROR, NOTIF_OK, NOTIF_WARN
RESET_IDENTIFIER = "_reset_bui_CUSTOM"
BEGIN_TEMPLATES = "BURP-UI TEMPLATES"
@ -1514,7 +1512,6 @@ class Config(File):
return False
def _parse(self):
orig = self.files.copy()
for root, conf in orig.items():
conf.parse()

View file

@ -9,9 +9,10 @@
"""
import datetime
from .ext.sql import db
from flask import current_app, session
from .engines.server import BUIServer # noqa
from .ext.sql import db
app = current_app # type: BUIServer

View file

@ -7,34 +7,34 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import re
import math
import re
import uuid
from flask import (
request,
render_template,
redirect,
url_for,
abort,
flash,
Blueprint,
session,
abort,
current_app,
flash,
g,
redirect,
render_template,
request,
session,
url_for,
)
from flask_login import login_user, login_required, logout_user, current_user
from flask_babel import gettext as _, refresh as refresh_babel
from flask_babel import gettext as _
from flask_babel import refresh as refresh_babel
from flask_login import current_user, login_required, login_user, logout_user
from .desc import __url__, __doc__
from .engines.server import BUIServer # noqa
from .sessions import session_manager
from ._compat import quote
from .forms import LoginForm
from .desc import __doc__, __url__
from .engines.server import BUIServer # noqa
from .exceptions import BUIserverException
from .forms import LoginForm
from .security import is_safe_url, sanitize_string
from .sessions import session_manager
from .utils import human_readable as _hr
from .security import sanitize_string, is_safe_url
bui = current_app # type: BUIServer
view = Blueprint("view", "burpui", template_folder="templates")

View file

@ -7,7 +7,7 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
from ._compat import to_unicode, urlparse, urljoin
from ._compat import to_unicode, urljoin, urlparse
def sanitize_string(string, strict=True, paranoid=False):
@ -45,7 +45,7 @@ def basic_login_from_request(request, app):
return None
auth = request.authorization
if auth:
from flask import session, g
from flask import g, session
app.logger.debug("Found Basic user: {}".format(auth.username))
refresh = True
@ -55,6 +55,7 @@ def basic_login_from_request(request, app):
user = app.uhandler.user(auth.username, refresh)
if user and user.active and user.login(auth.password):
from flask_login import login_user
from .sessions import session_manager
if "login" in session and session["login"] != auth.username:

View file

@ -7,11 +7,11 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import datetime
import re
import uuid
import datetime
from flask import session, request
from flask import request, session
# used for completion
try:

View file

@ -9,21 +9,21 @@ jQuery/Bootstrap
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import os
from datetime import datetime, timedelta
from time import gmtime, sleep, strftime
from flask import current_app
from datetime import timedelta, datetime
from celery.schedules import crontab
from celery.utils.log import get_task_logger
from time import gmtime, strftime, sleep
from flask import current_app
from burpui._compat import to_unicode # noqa
from burpui.api.client import ClientTreeAll # noqa
from burpui.config import config # noqa
from burpui.ext.tasks import celery # noqa
from burpui.ext.cache import cache # noqa
from burpui.sessions import session_manager # noqa
from burpui.engines.server import BUIServer # noqa
from burpui.exceptions import BUIserverException, TooManyRecordsException # noqa
from burpui.api.client import ClientTreeAll # noqa
from burpui.ext.cache import cache # noqa
from burpui.ext.tasks import celery # noqa
from burpui.sessions import session_manager # noqa
from burpui.utils import NOTIF_ERROR
try:

View file

@ -342,9 +342,10 @@ library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
"""
import os
from flask import abort, json, send_file, Blueprint, current_app, url_for
import sys
from flask import Blueprint, abort, current_app, json, send_file, url_for
def validate_parameter(param):
if ".." in param or param.startswith("/"):
@ -421,7 +422,6 @@ def overlay_url_for(endpoint, filename=None, **values):
default_url_for_args["filename"] = filename
if endpoint == "static" or endpoint.endswith(".static"):
if os.path.sep in filename:
filename_parts = filename.split(os.path.sep)
component = filename_parts[0]

View file

@ -7,14 +7,13 @@
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import os
import datetime
import math
import os
import string
import sys
import datetime
import zipfile
import tarfile
import zipfile
from uuid import UUID
NOTIF_OK = 0

View file

@ -1,18 +1,18 @@
# flasky extensions. flasky pygments style based on tango style
from pygments.style import Style
from pygments.token import (
Keyword,
Name,
Comment,
String,
Error,
Generic,
Keyword,
Literal,
Name,
Number,
Operator,
Generic,
Whitespace,
Punctuation,
Other,
Literal,
Punctuation,
String,
Whitespace,
)

View file

@ -12,9 +12,9 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
import sys
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the

View file

@ -1,8 +1,10 @@
from __future__ import with_statement
import logging
from logging.config import fileConfig
from alembic import context
from sqlalchemy import engine_from_config, pool
from logging.config import fileConfig
import logging
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.

View file

@ -10,8 +10,8 @@ Create Date: 2016-07-18 11:22:27.613921
revision = "225d9b2f0fb1"
down_revision = None
from alembic import op
import sqlalchemy as sa
from alembic import op
def upgrade():

View file

@ -10,8 +10,8 @@ Create Date: 2018-10-03 11:47:20.028686
revision = "4445080944ee"
down_revision = "695dcbd29d4f"
from alembic import op
import sqlalchemy as sa
from alembic import op
def upgrade():

View file

@ -10,8 +10,8 @@ Create Date: 2017-02-12 14:51:38.147422
revision = "56de018f4d88"
down_revision = "fc07e3fa0086"
from alembic import op
import sqlalchemy as sa
from alembic import op
def upgrade():

View file

@ -10,8 +10,8 @@ Create Date: 2018-10-02 13:56:57.660204
revision = "695dcbd29d4f"
down_revision = "56de018f4d88"
from alembic import op
import sqlalchemy as sa
from alembic import op
def upgrade():

View file

@ -10,8 +10,8 @@ Create Date: 2016-08-30 11:47:35.513396
revision = "7f317474332d"
down_revision = "225d9b2f0fb1"
from alembic import op
import sqlalchemy as sa
from alembic import op
def upgrade():

View file

@ -10,8 +10,8 @@ Create Date: 2017-01-30 16:09:53.367166
revision = "fc07e3fa0086"
down_revision = "7f317474332d"
from alembic import op
import sqlalchemy as sa
from alembic import op
def upgrade():

View file

@ -10,10 +10,9 @@ jQuery/Bootstrap
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import logging
import os
import sys
import logging
from argparse import ArgumentParser
ROOT = os.path.dirname(os.path.realpath(__file__))
@ -63,7 +62,7 @@ def parse_args(name=None):
if options.version:
from burpui_agent import __title__
from burpui_agent.desc import __version__, __release__
from burpui_agent.desc import __release__, __version__
ver = "{}: v{}".format(mname or __title__, __version__)
if options.log:
@ -84,9 +83,9 @@ def main():
def agent(options=None):
import trio
from burpui_agent._compat import patch_json
from burpui_agent.engines.agent import BUIAgent as Agent
from burpui_agent.utils import lookup_file
from burpui_agent._compat import patch_json
patch_json()

View file

@ -3,11 +3,11 @@
import os
import re
import sys
import shutil
import subprocess
import sys
from setuptools import setup, find_packages
from setuptools import find_packages, setup
# only used to build the package
CWD = os.path.dirname(os.path.realpath(__file__))
@ -126,9 +126,9 @@ from burpui_agent.desc import (
__author__,
__author_email__,
__description__,
__license__,
__url__,
__version__,
__license__,
)
name = __title__

View file

@ -10,10 +10,9 @@ jQuery/Bootstrap
.. moduleauthor:: Ziirish <hi+burpui@ziirish.me>
"""
import logging
import os
import sys
import logging
from argparse import ArgumentParser
ROOT = os.path.dirname(os.path.realpath(__file__))
@ -63,7 +62,7 @@ def parse_args(name=None):
if options.version:
from burpui_monitor import __title__
from burpui_monitor.desc import __version__, __release__
from burpui_monitor.desc import __release__, __version__
ver = "{}: v{}".format(mname or __title__, __version__)
if options.log:

View file

@ -3,11 +3,11 @@
import os
import re
import sys
import shutil
import subprocess
import sys
from setuptools import setup, find_packages
from setuptools import find_packages, setup
# only used to build the package
CWD = os.path.dirname(os.path.realpath(__file__))
@ -128,9 +128,9 @@ from burpui_monitor.desc import (
__author__,
__author_email__,
__description__,
__license__,
__url__,
__version__,
__license__,
)
name = __title__

View file

@ -2,10 +2,10 @@
# -*- coding: utf-8 -*-
import os
import sys
import shutil
import sys
from setuptools import setup, find_packages
from setuptools import find_packages, setup
# only used to build the package
ROOT = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', '..')
@ -18,7 +18,6 @@ Burp-UI Meta package for ##TPL## requirements
"""
from burpui_##TPL## import __author__, __author_email__, __description__, \
__url__, __title__, __version__, __license__
name = __title__
author = __author__
author_email = __author_email__

View file

@ -2,16 +2,16 @@
# -*- coding: utf-8 -*-
import os
import sys
from subprocess import check_output, call, STDOUT
from distutils import log
from distutils.core import Command
from setuptools import setup, find_packages
from setuptools.command.develop import develop
from setuptools.command.sdist import sdist
from setuptools.command.install import install
from subprocess import STDOUT, call, check_output
from setuptools import find_packages, setup
from setuptools.command.bdist_egg import bdist_egg
from setuptools.command.develop import develop
from setuptools.command.egg_info import egg_info
from setuptools.command.install import install
from setuptools.command.sdist import sdist
ROOT = os.path.join(os.path.dirname(os.path.realpath(__file__)))
DEVNULL = open(os.devnull, "wb")
@ -248,10 +248,10 @@ sys.path.insert(0, os.path.join(ROOT))
from burpui.desc import (
__author__,
__author_email__,
__description__,
__url__,
__description__, # noqa
__title__,
) # noqa
__url__,
)
name = __title__
author = __author__

View file

@ -1,9 +1,10 @@
#!/usr/bin/env python
# -*- coding: utf8 -*-
import pytest
import os
import tempfile
import shutil
import tempfile
import pytest
from burpui import create_app as BUIinit # noqa
from burpui.misc.parser.burp2 import Parser # noqa

View file

@ -1,9 +1,8 @@
import os
from urllib.request import urlopen
import pytest
from flask import url_for
from urllib.request import urlopen
from burpui import create_app
@ -26,8 +25,8 @@ def app():
def test_server_is_up_and_running(live_server):
import socket
import errno
import socket
try:
url = url_for("view.home", _external=True)

View file

@ -1,6 +1,6 @@
import os
import pytest
import pytest
from flask import url_for
from burpui.app import create_app

View file

@ -1,6 +1,6 @@
import os
import pytest
import pytest
from flask import url_for
from burpui.app import create_app

View file

@ -1,7 +1,7 @@
import os
import pytest
import tempfile
import pytest
from flask import url_for
from burpui.app import create_app

View file

@ -1,12 +1,13 @@
import os
import pytest
from tempfile import mkstemp
import configobj
import pytest
from burpui.config import BUIConfig
# import validate
from tempfile import mkstemp
from burpui.config import BUIConfig
TEST_CONFIG = b"""
[Global]

View file

@ -1,6 +1,6 @@
import os
import pytest
import pytest
from flask import url_for
from burpui.app import create_app

View file

@ -1,7 +1,7 @@
import os
import tempfile
from burpui.misc.parser.utils import OptionMulti, OptionInt
from burpui.misc.parser.utils import OptionInt, OptionMulti
def test_confsrv(parser):

View file

@ -1,7 +1,7 @@
import os
import pytest
import mockredis
import mockredis
import pytest
from flask import url_for
from burpui.app import create_app
@ -75,10 +75,11 @@ def test_current_session(app):
# with c.session_transaction() as sess:
# sess['authenticated'] = True
from burpui.sessions import session_manager
from datetime import datetime
from burpui.ext.sql import db
from burpui.models import Session
from datetime import datetime
from burpui.sessions import session_manager
session_manager.store_session("toto")
assert session_manager.session_expired() is False

View file

@ -1,6 +1,6 @@
import os
import pytest
import pytest
from flask import url_for
from burpui.app import create_app