mirror of
https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
synced 2026-10-12 02:06:59 +00:00
Runtime Exec Tampering Detection, iOS Dynamic REST APIs, Datatables Export (#2339)
* Runtime Executable Tampering Detection * Add security.py * Code QA Performance * Code QA Runtime EXEC tampering detection * Corellium API QA + Domain support * REST API Docs + Datatables export
This commit is contained in:
@@ -64,12 +64,12 @@ def ios_api_analysis(app_dir):
|
||||
'cookies': [],
|
||||
'crypto': [],
|
||||
'network': [],
|
||||
'files': set(),
|
||||
'files': [],
|
||||
'keychain': [],
|
||||
'logs': set(),
|
||||
'logs': [],
|
||||
'credentials': [],
|
||||
'userdefaults': {},
|
||||
'pasteboard': set(),
|
||||
'pasteboard': [],
|
||||
'textinputs': [],
|
||||
'datadir': [],
|
||||
'sql': [],
|
||||
@@ -90,17 +90,18 @@ def ios_api_analysis(app_dir):
|
||||
elif parsed.get('crypto'):
|
||||
dump['crypto'].append(parsed['crypto'])
|
||||
elif parsed.get('filename'):
|
||||
dump['files'].add(parsed['filename'])
|
||||
dump['files'].append(parsed['filename'])
|
||||
elif parsed.get('keychain'):
|
||||
dump['keychain'] = parsed['keychain']
|
||||
elif parsed.get('nslog'):
|
||||
dump['logs'].add(parsed['nslog'])
|
||||
dump['logs'].append(parsed['nslog'])
|
||||
elif parsed.get('credentialstorage'):
|
||||
dump['credentials'] = parsed['credentialstorage']
|
||||
elif parsed.get('nsuserdefaults'):
|
||||
dump['userdefaults'] = parsed['nsuserdefaults']
|
||||
elif parsed.get('pasteboard'):
|
||||
dump['pasteboard'].add(parsed['pasteboard'])
|
||||
elif (parsed.get('pasteboard')
|
||||
and parsed.get('pasteboard') not in dump['pasteboard']):
|
||||
dump['pasteboard'].append(parsed['pasteboard'])
|
||||
elif parsed.get('textinput'):
|
||||
dump['textinputs'].append(parsed['textinput'])
|
||||
elif parsed.get('network'):
|
||||
@@ -111,6 +112,8 @@ def ios_api_analysis(app_dir):
|
||||
dump['sql'].append(parsed['sql'])
|
||||
elif parsed.get('json'):
|
||||
dump['json'].append(parsed['json'])
|
||||
dump['files'] = list(set(dump['files']))
|
||||
dump['logs'] = list(set(dump['logs']))
|
||||
if len(dump['network']) > 0:
|
||||
dump['network'] = list(
|
||||
{v['url']: v for v in dump['network']}.values())
|
||||
|
||||
@@ -18,21 +18,35 @@ from mobsf.MobSF.utils import (
|
||||
SUCCESS_RESP = (200, 204)
|
||||
ERROR_RESP = (400, 403, 404, 409)
|
||||
OK = 'ok'
|
||||
CORELLIUM_API_DOMAIN = getattr(
|
||||
settings,
|
||||
'CORELLIUM_API_DOMAIN',
|
||||
'https://app.corellium.com')
|
||||
CORELLIUM_API_KEY = getattr(
|
||||
settings,
|
||||
'CORELLIUM_API_KEY', '')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CorelliumAPI:
|
||||
class CorelliumInit:
|
||||
|
||||
def __init__(self, project_id) -> None:
|
||||
self.api = 'https://app.corellium.com/api/v1'
|
||||
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
|
||||
def __init__(self) -> None:
|
||||
self.api = f'{CORELLIUM_API_DOMAIN}/api/v1'
|
||||
self.api_key = CORELLIUM_API_KEY
|
||||
self.headers = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
}
|
||||
self.project_id = project_id
|
||||
self.proxies, self.verify = upstream_proxy('https')
|
||||
|
||||
|
||||
class CorelliumAPI(CorelliumInit):
|
||||
|
||||
def __init__(self, project_id) -> None:
|
||||
super().__init__()
|
||||
self.project_id = project_id
|
||||
|
||||
def api_ready(self):
|
||||
"""Check API Availability."""
|
||||
try:
|
||||
@@ -160,17 +174,7 @@ class CorelliumAPI:
|
||||
return False
|
||||
|
||||
|
||||
class CorelliumModelsAPI:
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.api = 'https://app.corellium.com/api/v1'
|
||||
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
|
||||
self.headers = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
}
|
||||
self.proxies, self.verify = upstream_proxy('https')
|
||||
class CorelliumModelsAPI(CorelliumInit):
|
||||
|
||||
def get_models(self):
|
||||
r = requests.get(
|
||||
@@ -205,18 +209,11 @@ class CorelliumModelsAPI:
|
||||
return False
|
||||
|
||||
|
||||
class CorelliumInstanceAPI:
|
||||
class CorelliumInstanceAPI(CorelliumInit):
|
||||
|
||||
def __init__(self, instance_id) -> None:
|
||||
self.api = 'https://app.corellium.com/api/v1'
|
||||
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
|
||||
self.headers = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
}
|
||||
super().__init__()
|
||||
self.instance_id = instance_id
|
||||
self.proxies, self.verify = upstream_proxy('https')
|
||||
|
||||
def start_instance(self):
|
||||
"""Start instance."""
|
||||
@@ -475,18 +472,11 @@ class CorelliumInstanceAPI:
|
||||
return r.json()['error']
|
||||
|
||||
|
||||
class CorelliumAgentAPI:
|
||||
class CorelliumAgentAPI(CorelliumInit):
|
||||
|
||||
def __init__(self, instance_id) -> None:
|
||||
self.api = 'https://app.corellium.com/api/v1'
|
||||
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
|
||||
self.headers = {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
}
|
||||
super().__init__()
|
||||
self.instance_id = instance_id
|
||||
self.proxies, self.verify = upstream_proxy('https')
|
||||
|
||||
def agent_ready(self):
|
||||
"""Agent ready."""
|
||||
|
||||
@@ -213,10 +213,13 @@ def list_apps(request, api=False):
|
||||
bundle_ids.append(f'bundleID={bundle}')
|
||||
elif r and r.get('error'):
|
||||
data['message'] = r.get('error')
|
||||
return send_response(failed, api)
|
||||
verbose = r.get('originalError')
|
||||
if verbose:
|
||||
data['message'] += f' {verbose}'
|
||||
return send_response(data, api)
|
||||
else:
|
||||
data['message'] = 'Failed to list apps'
|
||||
return send_response(failed, api)
|
||||
return send_response(data, api)
|
||||
# Get app icons
|
||||
logger.info('Getting all application icons')
|
||||
ic = ca.get_icons('&'.join(bundle_ids))
|
||||
@@ -572,14 +575,17 @@ def network_capture(request, api=False):
|
||||
# File Download
|
||||
|
||||
|
||||
@require_http_methods(['GET'])
|
||||
@require_http_methods(['GET', 'POST'])
|
||||
def live_pcap_download(request, api=False):
|
||||
"""Download Network Capture."""
|
||||
data = {
|
||||
'status': 'failed',
|
||||
'message': 'Failed to download network capture'}
|
||||
try:
|
||||
instance_id = request.GET['instance_id']
|
||||
if api:
|
||||
instance_id = request.POST['instance_id']
|
||||
else:
|
||||
instance_id = request.GET['instance_id']
|
||||
failed = common_check(instance_id)
|
||||
if failed:
|
||||
return send_response(failed, api)
|
||||
@@ -614,7 +620,7 @@ def ssh_execute(request, api=False):
|
||||
'message': 'Failed to execute command'}
|
||||
try:
|
||||
instance_id = request.POST['instance_id']
|
||||
cmd = request.POST.get('cmd')
|
||||
cmd = request.POST['cmd']
|
||||
failed = common_check(instance_id)
|
||||
if failed:
|
||||
return send_response(failed, api)
|
||||
@@ -762,7 +768,7 @@ def system_logs(request, api=False):
|
||||
return send_response(failed, api)
|
||||
ci = CorelliumInstanceAPI(instance_id)
|
||||
data = {'status': 'ok', 'message': ci.console_log()}
|
||||
return send_response(data)
|
||||
return send_response(data, api)
|
||||
logger.info('Getting system logs')
|
||||
instance_id = request.GET['instance_id']
|
||||
failed = common_check(instance_id)
|
||||
@@ -780,7 +786,7 @@ def system_logs(request, api=False):
|
||||
logger.exception(err)
|
||||
if request.method == 'POST':
|
||||
data['message'] = str(exp)
|
||||
return send_response(data)
|
||||
return send_response(data, api)
|
||||
return print_n_send_error_response(request, err, api)
|
||||
# AJAX
|
||||
|
||||
@@ -810,7 +816,7 @@ def upload_file(request, api=False):
|
||||
except Exception as exp:
|
||||
logger.exception(err_msg)
|
||||
data['message'] = str(exp)
|
||||
return send_response(data)
|
||||
return send_response(data, api)
|
||||
# File Download
|
||||
|
||||
|
||||
|
||||
@@ -90,13 +90,19 @@ def dynamic_analysis(request, api=False):
|
||||
def dynamic_analyzer(request, api=False):
|
||||
"""Dynamic Analyzer for in-device iOS apps."""
|
||||
try:
|
||||
bundleid = request.GET.get('bundleid')
|
||||
if api:
|
||||
bundleid = request.POST.get('bundle_id')
|
||||
else:
|
||||
bundleid = request.GET.get('bundleid')
|
||||
if not bundleid or not strict_package_check(bundleid):
|
||||
return print_n_send_error_response(
|
||||
request,
|
||||
'Invalid iOS Bundle id',
|
||||
api)
|
||||
instance_id = request.GET.get('instance_id')
|
||||
if api:
|
||||
instance_id = request.POST.get('instance_id')
|
||||
else:
|
||||
instance_id = request.GET.get('instance_id')
|
||||
failed = common_check(instance_id)
|
||||
if failed:
|
||||
return print_n_send_error_response(
|
||||
@@ -109,12 +115,16 @@ def dynamic_analyzer(request, api=False):
|
||||
app_dir.mkdir()
|
||||
ci = CorelliumInstanceAPI(instance_id)
|
||||
configure_proxy(request, bundleid, ci)
|
||||
if api:
|
||||
form = None
|
||||
else:
|
||||
form = UploadFileForm()
|
||||
context = {
|
||||
'hash': bundle_hash,
|
||||
'instance_id': instance_id,
|
||||
'bundle_id': bundleid,
|
||||
'version': settings.MOBSF_VER,
|
||||
'form': UploadFileForm(),
|
||||
'form': form,
|
||||
'title': 'iOS Dynamic Analyzer'}
|
||||
template = 'dynamic_analysis/ios/dynamic_analyzer.html'
|
||||
if api:
|
||||
|
||||
@@ -36,7 +36,10 @@ def ios_view_report(request, bundle_id, api=False):
|
||||
"""Dynamic Analysis Report Generation."""
|
||||
logger.info('iOS Dynamic Analysis Report Generation')
|
||||
try:
|
||||
instance_id = request.GET.get('instance_id')
|
||||
if api:
|
||||
instance_id = request.POST.get('instance_id')
|
||||
else:
|
||||
instance_id = request.GET.get('instance_id')
|
||||
if instance_id and not common_check(instance_id):
|
||||
dev = instance_id
|
||||
else:
|
||||
|
||||
@@ -107,6 +107,7 @@ def ios_instrument(request, api=False):
|
||||
args = (None, None)
|
||||
Thread(target=frida_obj.session, args=args, daemon=True).start()
|
||||
data['status'] = OK
|
||||
data['message'] = 'Frida Instrumentation successful'
|
||||
except Exception as exp:
|
||||
logger.exception('Frida Instrumentation failed')
|
||||
data['message'] = str(exp)
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ from mobsf.install.windows.setup import windows_config_local
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
VERSION = '3.9.3'
|
||||
VERSION = '3.9.4'
|
||||
BANNER = """
|
||||
__ __ _ ____ _____ _____ ___
|
||||
| \/ | ___ | |__/ ___|| ___|_ _|___ // _ \
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
"""Runtime Executable Tampering Detection."""
|
||||
import subprocess
|
||||
import functools
|
||||
import logging
|
||||
import sys
|
||||
from shutil import which
|
||||
from pathlib import Path
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
|
||||
from mobsf.MobSF.utils import (
|
||||
find_java_binary,
|
||||
gen_sha256_hash,
|
||||
get_adb,
|
||||
sha256,
|
||||
)
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
# Non executable files at host level
|
||||
_SKIP = [
|
||||
'.pyc', '.js',
|
||||
'.json', '.txt', '.md']
|
||||
EXECUTABLE_HASH_MAP = None
|
||||
|
||||
|
||||
def get_sha256(filepath):
|
||||
"""Calculate sha256 hash of a file."""
|
||||
return (filepath.as_posix(), sha256(filepath))
|
||||
|
||||
|
||||
def get_all_files(dirlocs):
|
||||
"""Get all files from a list of directories/files."""
|
||||
for dirloc in dirlocs:
|
||||
if dirloc.is_file() and dirloc.suffix not in _SKIP:
|
||||
yield dirloc
|
||||
elif dirloc.is_dir():
|
||||
# Use a generator expression for efficient filtering
|
||||
files_in_dir = (
|
||||
efile for efile in dirloc.rglob('*')
|
||||
if efile.is_file() and efile.suffix not in _SKIP
|
||||
)
|
||||
# Yield all files from the filtered generator
|
||||
yield from files_in_dir
|
||||
|
||||
|
||||
def generate_hashes(dirlocs):
|
||||
"""Generate master hash for all files."""
|
||||
exec_hashes = {}
|
||||
with ThreadPoolExecutor() as executor:
|
||||
futures = []
|
||||
for efile in get_all_files(dirlocs):
|
||||
futures.append(
|
||||
executor.submit(get_sha256, efile))
|
||||
for future in futures:
|
||||
sha = future.result()
|
||||
exec_hashes[sha[0]] = sha[1]
|
||||
return exec_hashes, gen_sha256_hash(str(exec_hashes))
|
||||
|
||||
|
||||
def get_executable_hashes():
|
||||
# Internal Binaries shipped with MobSF
|
||||
base = Path(settings.BASE_DIR)
|
||||
manage_py = base.parent / 'manage.py'
|
||||
exec_loc = [
|
||||
base / 'DynamicAnalyzer' / 'tools',
|
||||
base / 'StaticAnalyzer' / 'tools',
|
||||
manage_py,
|
||||
]
|
||||
# External binaries used directly by MobSF
|
||||
system_bins = [
|
||||
'adb',
|
||||
'which',
|
||||
'wkhtmltopdf',
|
||||
'httptools',
|
||||
'mitmdump',
|
||||
'unzip',
|
||||
'lipo',
|
||||
'ar',
|
||||
'nm',
|
||||
'objdump',
|
||||
'strings',
|
||||
'xcrun',
|
||||
'BinSkim.exe',
|
||||
'BinScope.exe',
|
||||
'nuget.exe',
|
||||
]
|
||||
for sbin in system_bins:
|
||||
bin_path = which(sbin)
|
||||
if bin_path:
|
||||
exec_loc.append(Path(bin_path))
|
||||
# User defined path/binaries
|
||||
if settings.JAVA_DIRECTORY:
|
||||
exec_loc.append(Path(settings.JAVA_DIRECTORY))
|
||||
user_defined_bins = [
|
||||
sys.executable,
|
||||
settings.JADX_BINARY,
|
||||
settings.BACKSMALI_BINARY,
|
||||
settings.VD2SVG_BINARY,
|
||||
settings.APKTOOL_BINARY,
|
||||
settings.ADB_BINARY,
|
||||
settings.JTOOL_BINARY,
|
||||
settings.CLASSDUMP_BINARY,
|
||||
settings.CLASSDUMP_SWIFT_BINARY,
|
||||
]
|
||||
for ubin in user_defined_bins:
|
||||
if ubin:
|
||||
exec_loc.append(Path(ubin))
|
||||
# Add ADB and Java binaries
|
||||
adb = get_adb()
|
||||
java = find_java_binary()
|
||||
if adb == 'adb':
|
||||
adb = which('adb')
|
||||
if java == 'java':
|
||||
java = which('java')
|
||||
if adb:
|
||||
exec_loc.append(Path(adb))
|
||||
if java:
|
||||
exec_loc.append(Path(java))
|
||||
return generate_hashes(exec_loc)
|
||||
|
||||
|
||||
def store_exec_hashes_at_first_run():
|
||||
"""Store executable hashes at first run."""
|
||||
try:
|
||||
global EXECUTABLE_HASH_MAP
|
||||
hashes, signature = get_executable_hashes()
|
||||
hashes['signature'] = signature
|
||||
EXECUTABLE_HASH_MAP = hashes
|
||||
except Exception:
|
||||
logger.warning('Cannot calculate executable hashes, '
|
||||
'disabling runtime executable '
|
||||
'tampering detection')
|
||||
|
||||
|
||||
def subprocess_hook(oldfunc, *args, **kwargs):
|
||||
global EXECUTABLE_HASH_MAP
|
||||
exec1 = args[0][0] # executable
|
||||
exec2 = None # secondary executable
|
||||
for arg in args[0]:
|
||||
if arg.endswith('.jar'):
|
||||
exec2 = Path(arg).as_posix()
|
||||
if '/' in exec1 or '\\' in exec1:
|
||||
exec1 = Path(exec1).as_posix()
|
||||
else:
|
||||
exec1 = Path(which(exec1)).as_posix()
|
||||
executable_in_hash_map = False
|
||||
if exec1 in EXECUTABLE_HASH_MAP:
|
||||
executable_in_hash_map = True
|
||||
if EXECUTABLE_HASH_MAP[exec1] != sha256(exec1):
|
||||
msg = (
|
||||
f'Executable Tampering Detected. [{exec1}]'
|
||||
' has been modified during runtime')
|
||||
logger.error(msg)
|
||||
raise Exception(msg)
|
||||
if exec2 and exec1 in EXECUTABLE_HASH_MAP:
|
||||
executable_in_hash_map = True
|
||||
if EXECUTABLE_HASH_MAP[exec2] != sha256(exec2):
|
||||
msg = (
|
||||
f'JAR Tampering Detected. [{exec2}]'
|
||||
' has been modified during runtime')
|
||||
logger.error(msg)
|
||||
raise Exception(msg)
|
||||
if not executable_in_hash_map:
|
||||
logger.warning('Executable [%s] not found in known hashes, '
|
||||
'skipping runtime executable '
|
||||
'tampering detection', exec1)
|
||||
_, signature = get_executable_hashes()
|
||||
if EXECUTABLE_HASH_MAP['signature'] != signature:
|
||||
msg = 'Executable/Library Tampering Detected'
|
||||
logger.error(msg)
|
||||
raise Exception(msg)
|
||||
return oldfunc(*args, **kwargs)
|
||||
|
||||
|
||||
def init_exec_hooks():
|
||||
subprocess.Popen = wrap_function(
|
||||
subprocess.Popen,
|
||||
subprocess_hook)
|
||||
|
||||
|
||||
def wrap_function(oldfunction, newfunction):
|
||||
@functools.wraps(oldfunction)
|
||||
def run(*args, **kwargs):
|
||||
return newfunction(oldfunction, *args, **kwargs)
|
||||
return run
|
||||
@@ -372,7 +372,6 @@ else:
|
||||
JADX_BINARY = os.getenv('MOBSF_JADX_BINARY', '')
|
||||
BACKSMALI_BINARY = os.getenv('MOBSF_BACKSMALI_BINARY', '')
|
||||
VD2SVG_BINARY = os.getenv('MOBSF_VD2SVG_BINARY', '')
|
||||
BATIK_BINARY = os.getenv('MOBSF_BATIK_BINARY', '')
|
||||
APKTOOL_BINARY = os.getenv('MOBSF_APKTOOL_BINARY', '')
|
||||
ADB_BINARY = os.getenv('MOBSF_ADB_BINARY', '')
|
||||
|
||||
@@ -383,15 +382,11 @@ else:
|
||||
|
||||
# COMMON
|
||||
JAVA_DIRECTORY = os.getenv('MOBSF_JAVA_DIRECTORY', '')
|
||||
VBOXMANAGE_BINARY = os.getenv('MOBSF_VBOXMANAGE_BINARY', '')
|
||||
PYTHON3_PATH = os.getenv('MOBSF_PYTHON3_PATH', '')
|
||||
|
||||
"""
|
||||
Examples:
|
||||
JAVA_DIRECTORY = 'C:/Program Files/Java/jdk1.7.0_17/bin/'
|
||||
JAVA_DIRECTORY = '/usr/bin/'
|
||||
VBOXMANAGE_BINARY = '/usr/bin/VBoxManage'
|
||||
PYTHON3_PATH = 'C:/Users/Ajin/AppData/Local/Programs/Python/Python35-32/'
|
||||
JADX_BINARY = 'C:/Users/Ajin/AppData/Local/Programs/jadx/bin/jadx.bat'
|
||||
JADX_BINARY = '/Users/ajin/jadx/bin/jadx'
|
||||
"""
|
||||
@@ -440,6 +435,7 @@ else:
|
||||
# if VT_UPLOAD is set to True.
|
||||
# ===============================================
|
||||
# =======IOS DYNAMIC ANALYSIS SETTINGS===========
|
||||
CORELLIUM_API_DOMAIN = os.getenv('MOBSF_CORELLIUM_API_DOMAIN', '')
|
||||
CORELLIUM_API_KEY = os.getenv('MOBSF_CORELLIUM_API_KEY', '')
|
||||
CORELLIUM_PROJECT_ID = os.getenv('MOBSF_CORELLIUM_PROJECT_ID', '')
|
||||
# CORELLIUM_PROJECT_ID is optional, MobSF will use any available project id
|
||||
|
||||
+62
-3
@@ -18,9 +18,14 @@ from mobsf.DynamicAnalyzer.views.ios import (
|
||||
tests_frida as ios_tests_frida,
|
||||
)
|
||||
from mobsf.MobSF import utils
|
||||
from mobsf.MobSF.security import (
|
||||
init_exec_hooks,
|
||||
store_exec_hashes_at_first_run,
|
||||
)
|
||||
from mobsf.MobSF.views import home
|
||||
from mobsf.MobSF.views.api import api_static_analysis as api_sz
|
||||
from mobsf.MobSF.views.api import api_dynamic_analysis as api_dz
|
||||
from mobsf.MobSF.views.api import api_android_dynamic_analysis as api_dz
|
||||
from mobsf.MobSF.views.api import api_ios_dynamic_analysis as api_idz
|
||||
from mobsf.StaticAnalyzer import tests
|
||||
from mobsf.StaticAnalyzer.views.common import (
|
||||
appsec,
|
||||
@@ -65,7 +70,6 @@ urlpatterns = [
|
||||
re_path(r'^api/v1/dynamic/start_analysis$', api_dz.api_start_analysis),
|
||||
re_path(r'^api/v1/dynamic/stop_analysis$', api_dz.api_stop_analysis),
|
||||
re_path(r'^api/v1/dynamic/report_json$', api_dz.api_dynamic_report),
|
||||
re_path(r'^api/v1/dynamic/view_source$', api_dz.api_dynamic_view_file),
|
||||
# Android Specific
|
||||
re_path(r'^api/v1/android/logcat$', api_dz.api_logcat),
|
||||
re_path(r'^api/v1/android/mobsfy$', api_dz.api_mobsfy),
|
||||
@@ -78,11 +82,64 @@ urlpatterns = [
|
||||
# Frida
|
||||
re_path(r'^api/v1/frida/instrument$', api_dz.api_instrument),
|
||||
re_path(r'^api/v1/frida/api_monitor$', api_dz.api_api_monitor),
|
||||
re_path(r'^api/v1/frida/logs$', api_dz.api_frida_logs),
|
||||
re_path(r'^api/v1/frida/get_dependencies$', api_dz.api_get_dependencies),
|
||||
# Shared
|
||||
re_path(r'^api/v1/frida/logs$', api_dz.api_frida_logs),
|
||||
re_path(r'^api/v1/frida/list_scripts$', api_dz.api_list_frida_scripts),
|
||||
re_path(r'^api/v1/frida/get_script$', api_dz.api_get_script),
|
||||
re_path(r'^api/v1/dynamic/view_source$', api_dz.api_dynamic_view_file),
|
||||
# iOS Specific
|
||||
re_path(r'^api/v1/ios/corellium_supported_models$',
|
||||
api_idz.api_corellium_get_supported_models),
|
||||
re_path(r'^api/v1/ios/corellium_ios_versions$',
|
||||
api_idz.api_corellium_get_supported_ios_versions),
|
||||
re_path(r'^api/v1/ios/corellium_create_ios_instance$',
|
||||
api_idz.api_corellium_create_ios_instance),
|
||||
re_path(r'^api/v1/ios/dynamic_analysis$',
|
||||
api_idz.api_ios_dynamic_analysis),
|
||||
re_path(r'^api/v1/ios/corellium_start_instance$',
|
||||
api_idz.api_corellium_start_instance),
|
||||
re_path(r'^api/v1/ios/corellium_stop_instance$',
|
||||
api_idz.api_corellium_stop_instance),
|
||||
re_path(r'^api/v1/ios/corellium_unpause_instance$',
|
||||
api_idz.api_corellium_unpause_instance),
|
||||
re_path(r'^api/v1/ios/corellium_reboot_instance$',
|
||||
api_idz.api_corellium_reboot_instance),
|
||||
re_path(r'^api/v1/ios/corellium_destroy_instance$',
|
||||
api_idz.api_corellium_destroy_instance),
|
||||
re_path(r'^api/v1/ios/corellium_list_apps$',
|
||||
api_idz.api_corellium_instance_list_apps),
|
||||
re_path(r'^api/v1/ios/setup_environment$',
|
||||
api_idz.api_setup_environment),
|
||||
re_path(r'^api/v1/ios/dynamic_analyzer$',
|
||||
api_idz.api_ios_dynamic_analyzer),
|
||||
re_path(r'^api/v1/ios/run_app$',
|
||||
api_idz.api_run_app),
|
||||
re_path(r'^api/v1/ios/remove_app$',
|
||||
api_idz.api_remove_app),
|
||||
re_path(r'^api/v1/ios/take_screenshot$',
|
||||
api_idz.api_take_screenshot),
|
||||
re_path(r'^api/v1/ios/get_app_container_path$',
|
||||
api_idz.api_get_app_container_path),
|
||||
re_path(r'^api/v1/ios/network_capture$',
|
||||
api_idz.api_network_capture),
|
||||
re_path(r'^api/v1/ios/live_pcap_download$',
|
||||
api_idz.api_live_pcap_download),
|
||||
re_path(r'^api/v1/ios/ssh_execute$',
|
||||
api_idz.api_ssh_execute),
|
||||
re_path(r'^api/v1/ios/download_app_data$',
|
||||
api_idz.api_download_app_data),
|
||||
re_path(r'^api/v1/ios/instance_input$',
|
||||
api_idz.api_instance_input),
|
||||
re_path(r'^api/v1/ios/system_logs$',
|
||||
api_idz.api_system_logs),
|
||||
re_path(r'^api/v1/ios/file_upload$',
|
||||
api_idz.api_device_file_upload),
|
||||
re_path(r'^api/v1/ios/file_download$',
|
||||
api_idz.api_device_file_download),
|
||||
# Frida
|
||||
re_path(r'^api/v1/frida/ios_instrument$', api_idz.api_ios_instrument),
|
||||
re_path(r'^api/v1/dynamic/ios_report_json$', api_idz.api_ios_view_report),
|
||||
]
|
||||
if settings.API_ONLY == '0':
|
||||
urlpatterns.extend([
|
||||
@@ -299,3 +356,5 @@ if settings.API_ONLY == '0':
|
||||
])
|
||||
|
||||
utils.print_version()
|
||||
init_exec_hooks()
|
||||
store_exec_hashes_at_first_run()
|
||||
|
||||
@@ -179,22 +179,6 @@ def find_java_binary():
|
||||
return 'java'
|
||||
|
||||
|
||||
def run_process(args):
|
||||
try:
|
||||
proc = subprocess.Popen(
|
||||
args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
dat = ''
|
||||
while True:
|
||||
line = proc.stdout.readline()
|
||||
if not line:
|
||||
break
|
||||
dat += str(line)
|
||||
return dat
|
||||
except Exception:
|
||||
logger.error('Finding Java path - Cannot Run Process')
|
||||
return ''
|
||||
|
||||
|
||||
def print_n_send_error_response(request,
|
||||
msg,
|
||||
api=False,
|
||||
|
||||
@@ -0,0 +1,389 @@
|
||||
# -*- coding: utf_8 -*-
|
||||
"""MobSF REST API V 1."""
|
||||
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from mobsf.MobSF.views.helpers import request_method
|
||||
from mobsf.MobSF.views.api.api_middleware import make_api_response
|
||||
from mobsf.DynamicAnalyzer.views.ios import (
|
||||
corellium_instance,
|
||||
dynamic_analyzer,
|
||||
report,
|
||||
tests_frida,
|
||||
)
|
||||
|
||||
|
||||
FAILED = 'failed'
|
||||
ERROR = 'error'
|
||||
INSTANCE_ID = 'instance_id'
|
||||
BUNDLE_ID = 'bundle_id'
|
||||
|
||||
|
||||
# Dynamic Analyzer APIs
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_ios_dynamic_analysis(request):
|
||||
"""POST - iOS Dynamic Analysis Entrypoint."""
|
||||
resp = dynamic_analyzer.dynamic_analysis(request, True)
|
||||
if ERROR in resp:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_ios_dynamic_analyzer(request):
|
||||
"""POST - iOS Dynamic Analyzer."""
|
||||
params = {INSTANCE_ID, BUNDLE_ID}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = dynamic_analyzer.dynamic_analyzer(request, True)
|
||||
if ERROR in resp:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
# Corellium Instance Operations
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_get_supported_models(request):
|
||||
"""POST - Corellium Get Supported iOS Models."""
|
||||
resp = corellium_instance.get_supported_models(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_get_supported_ios_versions(request):
|
||||
"""POST - Corellium Get Supported iOS Versions."""
|
||||
if 'model' not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.get_supported_os(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_create_ios_instance(request):
|
||||
"""POST - Corellium Create an iOS Instance."""
|
||||
params = {'project_id', 'flavor', 'version'}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.create_vm_instance(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_start_instance(request):
|
||||
"""POST - Start Corellium Instance."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.start_instance(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_stop_instance(request):
|
||||
"""POST - Stop Corellium Instance."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.stop_instance(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_unpause_instance(request):
|
||||
"""POST - Unpause Corellium Instance."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.unpause_instance(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_reboot_instance(request):
|
||||
"""POST - Reboot Corellium Instance."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.reboot_instance(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_destroy_instance(request):
|
||||
"""POST - Destroy Corellium Instance."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.destroy_instance(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_corellium_instance_list_apps(request):
|
||||
"""POST - Corellium Instance List Apps."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.list_apps(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
# Dynamic Analyzer Helpers
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_setup_environment(request):
|
||||
"""POST - Setup Dynamic Analyzer Environment."""
|
||||
params = {INSTANCE_ID, 'hash'}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.setup_environment(
|
||||
request,
|
||||
request.POST['hash'],
|
||||
True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_run_app(request):
|
||||
"""POST - Run an App."""
|
||||
params = {INSTANCE_ID, BUNDLE_ID}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.run_app(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_remove_app(request):
|
||||
"""POST - Remove an App from Device."""
|
||||
params = {INSTANCE_ID, BUNDLE_ID}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.remove_app(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_take_screenshot(request):
|
||||
"""POST - Take a Screenshot."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.take_screenshot(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_get_app_container_path(request):
|
||||
"""POST - Get App Container path."""
|
||||
if BUNDLE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.get_container_path(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_network_capture(request):
|
||||
"""POST - Enable/Disable Network Capture."""
|
||||
params = {INSTANCE_ID, 'state'}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.network_capture(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_live_pcap_download(request):
|
||||
"""POST - Download Network Capture file."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.live_pcap_download(request, True)
|
||||
if resp.get('Content-Disposition'):
|
||||
# PCAP file http response
|
||||
return resp
|
||||
elif resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_ssh_execute(request):
|
||||
"""POST - Execute commands in VM over SSH."""
|
||||
params = {INSTANCE_ID, 'cmd'}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.ssh_execute(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_download_app_data(request):
|
||||
"""POST - Download Application Data from Device."""
|
||||
params = {INSTANCE_ID, BUNDLE_ID}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.download_data(
|
||||
request,
|
||||
request.POST[BUNDLE_ID],
|
||||
True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_instance_input(request):
|
||||
"""POST - Sending Touch/Swipe/Text Events."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.touch(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_system_logs(request):
|
||||
"""POST - Get system logs."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.system_logs(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_device_file_upload(request):
|
||||
"""POST - Upload file to device."""
|
||||
if INSTANCE_ID not in request.POST:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.upload_file(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_device_file_download(request):
|
||||
"""POST - Download file from device."""
|
||||
params = {INSTANCE_ID, 'file'}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = corellium_instance.download_file(request, True)
|
||||
if resp.get('Content-Disposition'):
|
||||
# file http response
|
||||
return resp
|
||||
elif resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
# Frida APIs
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_ios_instrument(request):
|
||||
"""POST - Frida Instrument."""
|
||||
params = {
|
||||
INSTANCE_ID,
|
||||
BUNDLE_ID,
|
||||
'hash',
|
||||
'default_hooks',
|
||||
'dump_hooks',
|
||||
'auxiliary_hooks',
|
||||
'frida_code'}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = tests_frida.ios_instrument(request, True)
|
||||
if resp.get('status') == FAILED:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
|
||||
|
||||
# Report APIs
|
||||
@request_method(['POST'])
|
||||
@csrf_exempt
|
||||
def api_ios_view_report(request):
|
||||
"""POST - iOS Dynamic Analysis report."""
|
||||
params = {INSTANCE_ID, BUNDLE_ID}
|
||||
if set(request.POST) < params:
|
||||
return make_api_response(
|
||||
{'error': 'Missing Parameters'}, 422)
|
||||
resp = report.ios_view_report(
|
||||
request,
|
||||
request.POST[BUNDLE_ID],
|
||||
True)
|
||||
if 'error' in resp:
|
||||
return make_api_response(resp, 500)
|
||||
return make_api_response(resp, 200)
|
||||
@@ -302,6 +302,11 @@ class ELFChecksec:
|
||||
elf_strings = None
|
||||
if not elf_strings:
|
||||
elf_strings = strings_on_binary(self.elf_path)
|
||||
for i in elf_strings:
|
||||
if isinstance(i, bytes):
|
||||
tmp = i.decode('utf-8', errors='ignore')
|
||||
elf_strings.remove(i)
|
||||
elf_strings.append(tmp)
|
||||
return elf_strings
|
||||
|
||||
def get_symbols(self):
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,46 @@
|
||||
//Datatables
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
"dom": '<"top"<"left-col"><"center-col"Bl><"right-col"f>>rtip',
|
||||
"buttons": [
|
||||
{
|
||||
extend: 'copy',
|
||||
text: '<i class="fa fa-copy"></i>',
|
||||
title: '',
|
||||
className: 'btn-default btn-sm-menu btn-xs',
|
||||
},
|
||||
{
|
||||
extend: 'csv',
|
||||
text: '<i class="fas fa-file-csv"></i>',
|
||||
title: '',
|
||||
className: 'btn-default btn-sm-menu btn-xs',
|
||||
},
|
||||
{
|
||||
extend: 'excel',
|
||||
text: '<i class="fa fa-file-excel"></i>',
|
||||
title: '',
|
||||
className: 'btn-default btn-sm-menu btn-xs',
|
||||
},
|
||||
{
|
||||
extend: 'pdf',
|
||||
text: '<i class="fa fa-file-pdf"></i>',
|
||||
title: '',
|
||||
className: 'btn-default btn-sm-menu btn-xs',
|
||||
},
|
||||
{
|
||||
extend: 'print',
|
||||
text: '<i class="fa fa-print"></i>',
|
||||
title: '',
|
||||
className: 'btn-default btn-sm-menu btn-xs',
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
@@ -6,7 +6,7 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<link rel="stylesheet" href="{% static "others/css/spinner.css" %}">
|
||||
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
|
||||
<style>
|
||||
@@ -278,8 +278,10 @@ textarea:focus {
|
||||
{% endblock %}
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script>
|
||||
function dynamic_loader(){
|
||||
var loadingOverlay = document.querySelector('.loading');
|
||||
@@ -321,20 +323,5 @@ function dynamic_loader(){
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
//Datatables
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": false,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@media print {
|
||||
@@ -945,25 +945,15 @@
|
||||
<!--end new UI-->
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script src="{% static "amcharts/core.js" %}"></script>
|
||||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||||
<script src="{% static "amcharts/animated.js" %}"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<style type="text/css" media="print">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@media print {
|
||||
.btn, #scan_options {
|
||||
@@ -1309,26 +1309,16 @@ pre {
|
||||
<!--end new UI-->
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script src="{% static "amcharts/core.js" %}"></script>
|
||||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||||
<script src="{% static "amcharts/animated.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "enlighterjs/enlighterjs.min.js" %}"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,9 +5,8 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "others/css/spinner.css" %}">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@media print {
|
||||
@@ -2407,8 +2406,10 @@
|
||||
<!--end new UI-->
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %}"></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script src="{% static "amcharts/core.js" %}"></script>
|
||||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||||
@@ -2421,6 +2422,23 @@
|
||||
var delete_suppression_url = '{% url 'delete_suppression' %}';
|
||||
</script>
|
||||
<script src="{% static "others/js/suppression.js" %}"></script>
|
||||
<style>
|
||||
.left-col {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.center-col {
|
||||
float: left;
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.right-col {
|
||||
float: left;
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
</style>
|
||||
<script>
|
||||
|
||||
// Remove rescan parameter
|
||||
@@ -2431,18 +2449,6 @@
|
||||
const pkg = '{{ package_name }}'
|
||||
const hash = '{{md5}}'
|
||||
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
{% block extra_css %}
|
||||
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<style type="text/css" media="print">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@media print {
|
||||
.btn, #scan_options {
|
||||
@@ -1821,8 +1821,10 @@
|
||||
{% block extra_scripts %}
|
||||
<script src="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.js" %}"></script>
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script src="{% static "amcharts/core.js" %}"></script>
|
||||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||||
@@ -1844,18 +1846,6 @@
|
||||
const pkg = '{{ package_name }}'
|
||||
const hash = '{{md5}}'
|
||||
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@@ -1750,8 +1750,10 @@
|
||||
<!--end new UI-->
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script src="{% static "amcharts/core.js" %}"></script>
|
||||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||||
@@ -1775,18 +1777,7 @@
|
||||
const pkg = '{{ bundle_id }}'
|
||||
const hash = '{{ md5 }}'
|
||||
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<!-- DataTables -->
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@@ -1287,8 +1287,10 @@
|
||||
<!--end new UI-->
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script src="{% static "amcharts/core.js" %}"></script>
|
||||
<script src="{% static "amcharts/maps.js" %}"></script>
|
||||
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
|
||||
@@ -1311,18 +1313,7 @@
|
||||
const pkg = '{{ bundle_id }}'
|
||||
const hash = '{{ md5 }}'
|
||||
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{% endblock %}
|
||||
{% block extra_css %}
|
||||
<!-- DataTables -->
|
||||
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
|
||||
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
|
||||
<style type="text/css" media="print">
|
||||
@page { size: landscape; }
|
||||
@media print {
|
||||
@@ -387,25 +387,15 @@
|
||||
<!--end new UI-->
|
||||
{% block extra_scripts %}
|
||||
<!-- DataTables -->
|
||||
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
|
||||
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
|
||||
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
|
||||
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
|
||||
<script src="{% static "others/js/datatables_init.js" %}"></script>
|
||||
<script>
|
||||
|
||||
// Remove rescan parameter
|
||||
window.history.replaceState({}, '', window.location.pathname);
|
||||
|
||||
$(function () {
|
||||
// Datatable
|
||||
$('table').DataTable({
|
||||
"paging": true,
|
||||
"lengthChange": false,
|
||||
"searching": true,
|
||||
"ordering": true,
|
||||
"info": true,
|
||||
"autoWidth": true,
|
||||
"responsive": true,
|
||||
});
|
||||
});
|
||||
// Navbar Active
|
||||
$(".nav-link").on("click", function() {
|
||||
$(".nav-link").removeClass("active");
|
||||
|
||||
Generated
+126
-115
@@ -224,19 +224,22 @@ typecheck = ["mypy"]
|
||||
|
||||
[[package]]
|
||||
name = "beautifulsoup4"
|
||||
version = "4.12.2"
|
||||
version = "4.12.3"
|
||||
description = "Screen-scraping library"
|
||||
optional = false
|
||||
python-versions = ">=3.6.0"
|
||||
files = [
|
||||
{file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"},
|
||||
{file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"},
|
||||
{file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"},
|
||||
{file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
soupsieve = ">1.2"
|
||||
|
||||
[package.extras]
|
||||
cchardet = ["cchardet"]
|
||||
chardet = ["chardet"]
|
||||
charset-normalizer = ["charset-normalizer"]
|
||||
html5lib = ["html5lib"]
|
||||
lxml = ["lxml"]
|
||||
|
||||
@@ -377,12 +380,13 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "bs4"
|
||||
version = "0.0.1"
|
||||
description = "Dummy package for Beautiful Soup"
|
||||
version = "0.0.2"
|
||||
description = "Dummy package for Beautiful Soup (beautifulsoup4)"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"},
|
||||
{file = "bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"},
|
||||
{file = "bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -859,13 +863,13 @@ typing = ["typing-extensions (>=4.8)"]
|
||||
|
||||
[[package]]
|
||||
name = "flask"
|
||||
version = "3.0.0"
|
||||
version = "3.0.1"
|
||||
description = "A simple framework for building complex web applications."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "flask-3.0.0-py3-none-any.whl", hash = "sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638"},
|
||||
{file = "flask-3.0.0.tar.gz", hash = "sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58"},
|
||||
{file = "flask-3.0.1-py3-none-any.whl", hash = "sha256:ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13"},
|
||||
{file = "flask-3.0.1.tar.gz", hash = "sha256:6489f51bb3666def6f314e15f19d50a1869a19ae0e8c9a3641ffe66c77d42403"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1373,34 +1377,41 @@ semgrep = {version = "0.117.0", markers = "sys_platform != \"win32\""}
|
||||
|
||||
[[package]]
|
||||
name = "lief"
|
||||
version = "0.13.2"
|
||||
version = "0.14.0"
|
||||
description = "Library to instrument executable formats"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "lief-0.13.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:0390cfaaf0e9aed46bebf26f00f34852768f76bc7f90abf7ceb384566200e5f5"},
|
||||
{file = "lief-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5581bf0072c1e7a9ea2fb2e2252b8582016e8b298804b5461e552b402c9cd4e9"},
|
||||
{file = "lief-0.13.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:dbbf2fb3d7807e815f345c77e287da162e081100f059ec03005995befc295d7f"},
|
||||
{file = "lief-0.13.2-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:d344d37334c2b488dc02f04cb13c22cd61aa065eeb9bca7424588e0c8c23bdfb"},
|
||||
{file = "lief-0.13.2-cp310-cp310-win32.whl", hash = "sha256:bc041b28b94139843a33c014e355822a9276b35f3c5ae10d82da56bf572f8222"},
|
||||
{file = "lief-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:01d4075bbc3541e9dd3ef008045fa1eb128294a0c5b0c1f69ce60d8948d248c7"},
|
||||
{file = "lief-0.13.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6570dacebe107ad60c2ba0968d1a865d316009d43cc85af3719d3eeb0911abf3"},
|
||||
{file = "lief-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ce2e3f7c791efba327c2bb3499dbef81e682027109045a9bae696c62e2aeeb0"},
|
||||
{file = "lief-0.13.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:11ab900e0644b6735ecdef2bbd04439b4866a527650fc054470c195d6cfe2917"},
|
||||
{file = "lief-0.13.2-cp311-cp311-manylinux_2_24_x86_64.whl", hash = "sha256:042ad2105a136b11a7494b9af8178468e8cb32b8fa2a0a55cb659a5605aeb069"},
|
||||
{file = "lief-0.13.2-cp311-cp311-win32.whl", hash = "sha256:1ce289b6ab3cf4be654270007e8a2c0d2e42116180418c29d3ce83762955de63"},
|
||||
{file = "lief-0.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:eccb248ffb598e410fd2ef7c1f171a3cde57a40c9bb8c4fa15d8e7b90eb4eb2d"},
|
||||
{file = "lief-0.13.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:95731cadedd6ffc5fb48c147fcefe004624e436b75e8ee9fb2dbf2ae5f084342"},
|
||||
{file = "lief-0.13.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8da75df0ea472557fcc37a27ba583bad5a8f3a256c186600d00a6dd0a57f718a"},
|
||||
{file = "lief-0.13.2-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b99092f02c13f580c2d00b504af224b7e60e7c98a791e72ae8519f530b7687bb"},
|
||||
{file = "lief-0.13.2-cp38-cp38-win32.whl", hash = "sha256:03db0138e4dbbdfa8bba74de312b0cebb30f504e44f38a9c8918b84022da340b"},
|
||||
{file = "lief-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:36c5bea3f8460dee3ebb75d35949f445638ec85d2871f31e293c47fb4a0a5af7"},
|
||||
{file = "lief-0.13.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:eca8ecbcae1ad851ed7cf1e22ec8accd74f2267fa7375194559fb917523d8a92"},
|
||||
{file = "lief-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8703cb5308b4828563badc6885ff07a3926ec3403d1caa3aa75f24fe9cbcf84"},
|
||||
{file = "lief-0.13.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c60f2f79e7d0d1f18dec7dcdb4d4f35e6b126ac29e2f2f056d28ec50599d868a"},
|
||||
{file = "lief-0.13.2-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0f84a7443b7f1b02666fd16a9aa57f5d9027e60ba2885e0d76db8426d689707"},
|
||||
{file = "lief-0.13.2-cp39-cp39-win32.whl", hash = "sha256:3f8f251de874929d9c9e94a35891621ab8c059149f8a1c24e543fd9cf0c2a31c"},
|
||||
{file = "lief-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:2bbe294385e629aa7206b2f39f0ca34e3948605a8db50b22091603053889a759"},
|
||||
{file = "lief-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1e9af189e0dcbd6ce9ce67266135ef288c9b8f9a5efe2a47d0d0266288713cf"},
|
||||
{file = "lief-0.14.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60be24af0b913a79922a9730302df5f380954a1d7b1c0c7de91b8918e36f0756"},
|
||||
{file = "lief-0.14.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:1d949c53f95132ef0d218e88c3c982610c54426249c95f99b736e5c15bb1b75b"},
|
||||
{file = "lief-0.14.0-cp310-cp310-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:51e7adfe1cc574a035b47a280cb5902cec6deb2d78ef0b47c536bdd75dfa6956"},
|
||||
{file = "lief-0.14.0-cp310-cp310-win32.whl", hash = "sha256:b34708c002c119f43998af3c4f219d06de6b66a34aceb298fd8bba8247e57572"},
|
||||
{file = "lief-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:684c1500fddab8aaf5a4f74cd092ea190c4c837d31c5d087c68a9f175775c2db"},
|
||||
{file = "lief-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:737bd6fab74e222968936794e09b2bf399417c38a3bc13d6ad70836793e78586"},
|
||||
{file = "lief-0.14.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:ff42aa1f12d3dc8bc5641eb1991269fb92e43bae386559ad576c97ffa09639f2"},
|
||||
{file = "lief-0.14.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:69df631cd0573388fa6891277d006f8da2fa42a5bbe3acc440b66a7352f6bef3"},
|
||||
{file = "lief-0.14.0-cp311-cp311-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:b850f38b62ca8a92c7f9803ceac0e79369b732a75e627cba3c2b8f1fa729f643"},
|
||||
{file = "lief-0.14.0-cp311-cp311-win32.whl", hash = "sha256:ba29aabd72e92334d54883d58b108f80465973edaec3e27cb422abbc657bfe17"},
|
||||
{file = "lief-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:33f2afdf9f00a8a208d5f32135834fc5f02bd12e8b14f0857cf14d4475ad03bb"},
|
||||
{file = "lief-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:70b53498390e8b95d878598c95bd068f5c86cab415c3869538fbce4cee36a9cc"},
|
||||
{file = "lief-0.14.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:c49d34c9140a4b77046137ceeeb872f26262447f514ccbf0cc985a91e59e7f69"},
|
||||
{file = "lief-0.14.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:46808f2ec6903d8a4a4a4975d664e70c64ca11691bacb391a51029a8cb941e92"},
|
||||
{file = "lief-0.14.0-cp312-cp312-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:4e6ca44bc9d0d314ac73148c64e4f9182c950a2f2024ab9d3d7100635d46261a"},
|
||||
{file = "lief-0.14.0-cp312-cp312-win32.whl", hash = "sha256:17e2809fa52e377d1a5045dbbbdea8bebbaad7f672d6c133287388e7e9942b64"},
|
||||
{file = "lief-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:5713e27ba7bbe7c8c503354f3555a33e69d5236a02dd34d162156cc85a9b88b5"},
|
||||
{file = "lief-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9998bd60d332b50f72fb71d22316b227f9fdbb301c953e8aa003822a80a6ed0a"},
|
||||
{file = "lief-0.14.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:fe783a180d63aa3ae19c5f58dc76afc179f40249c4c77d9f70bc557255b4051b"},
|
||||
{file = "lief-0.14.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:28e847e8410b9101f49af0ae9d06e7cb2d0db64c47442ac4c79abf1b15b2c108"},
|
||||
{file = "lief-0.14.0-cp38-cp38-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:4a44d5bd2462c9db68227ed9193243c412ce6153fe6a8e53782ff4210e4606ab"},
|
||||
{file = "lief-0.14.0-cp38-cp38-win32.whl", hash = "sha256:0a0754079d595c9e3ceffed9e32d309ed139b1433fad9ad37aaa35e6a8e67d70"},
|
||||
{file = "lief-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:bc8647f050728c09645666765de6dcbc681df7b0b6bdcfb4cdbbb96a523d2eaa"},
|
||||
{file = "lief-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f89b8e3cc6aa01f50a8ed58d5aea89f6d767df7951fd050659e9617c1b4eb45"},
|
||||
{file = "lief-0.14.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:110705c186f2ddc13fc2fad0dc9d501742d785b934103fdf56e86a86bcbcac1d"},
|
||||
{file = "lief-0.14.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0ba07f12c00950554d29495c3aef3740c44243d1c0d80a3f8dadf64c456a32e7"},
|
||||
{file = "lief-0.14.0-cp39-cp39-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:f237042467f41bf0e64b051e780865f9aef958ddec1a358317cc259da2ec2a16"},
|
||||
{file = "lief-0.14.0-cp39-cp39-win32.whl", hash = "sha256:75c7daefe56ba91ad4fc0a5e6573ca3c79dea2e938787b285b31ac0c25c5e5c3"},
|
||||
{file = "lief-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:583d37400c85dc80299db873d380c0901995ae03606f7de50fd3d0538e7a7860"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1508,71 +1519,71 @@ altgraph = ">=0.17"
|
||||
|
||||
[[package]]
|
||||
name = "markupsafe"
|
||||
version = "2.1.3"
|
||||
version = "2.1.4"
|
||||
description = "Safely add untrusted strings to HTML/XML markup."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"},
|
||||
{file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
|
||||
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
|
||||
{file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"},
|
||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"},
|
||||
{file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"},
|
||||
{file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"},
|
||||
{file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"},
|
||||
{file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"},
|
||||
{file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"},
|
||||
{file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"},
|
||||
{file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"},
|
||||
{file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"},
|
||||
{file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"},
|
||||
{file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2112,27 +2123,27 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "psutil"
|
||||
version = "5.9.7"
|
||||
version = "5.9.8"
|
||||
description = "Cross-platform lib for process and system monitoring in Python."
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
files = [
|
||||
{file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"},
|
||||
{file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"},
|
||||
{file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"},
|
||||
{file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"},
|
||||
{file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"},
|
||||
{file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"},
|
||||
{file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"},
|
||||
{file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"},
|
||||
{file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"},
|
||||
{file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"},
|
||||
{file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"},
|
||||
{file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"},
|
||||
{file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"},
|
||||
{file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"},
|
||||
{file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"},
|
||||
{file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"},
|
||||
{file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"},
|
||||
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"},
|
||||
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"},
|
||||
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"},
|
||||
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"},
|
||||
{file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"},
|
||||
{file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"},
|
||||
{file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"},
|
||||
{file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"},
|
||||
{file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"},
|
||||
{file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"},
|
||||
{file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"},
|
||||
{file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"},
|
||||
{file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"},
|
||||
{file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"},
|
||||
{file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
@@ -2683,13 +2694,13 @@ experiments = ["jsonnet (>=0.18,<1.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "service-identity"
|
||||
version = "23.1.0"
|
||||
version = "24.1.0"
|
||||
description = "Service identity verification for pyOpenSSL & cryptography."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "service_identity-23.1.0-py3-none-any.whl", hash = "sha256:87415a691d52fcad954a500cb81f424d0273f8e7e3ee7d766128f4575080f383"},
|
||||
{file = "service_identity-23.1.0.tar.gz", hash = "sha256:ecb33cd96307755041e978ab14f8b14e13b40f1fbd525a4dc78f46d2b986431d"},
|
||||
{file = "service_identity-24.1.0-py3-none-any.whl", hash = "sha256:a28caf8130c8a5c1c7a6f5293faaf239bbfb7751e4862436920ee6f2616f568a"},
|
||||
{file = "service_identity-24.1.0.tar.gz", hash = "sha256:6829c9d62fb832c2e1c435629b0a8c476e1929881f28bee4d20bc24161009221"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2699,7 +2710,7 @@ pyasn1 = "*"
|
||||
pyasn1-modules = "*"
|
||||
|
||||
[package.extras]
|
||||
dev = ["pyopenssl", "service-identity[docs,idna,mypy,tests]"]
|
||||
dev = ["pyopenssl", "service-identity[idna,mypy,tests]"]
|
||||
docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"]
|
||||
idna = ["idna"]
|
||||
mypy = ["idna", "mypy", "types-pyopenssl"]
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "mobsf"
|
||||
version = "3.9.3"
|
||||
version = "3.9.4"
|
||||
description = "Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis."
|
||||
keywords = ["mobsf", "mobile security framework", "mobile security", "security tool", "static analysis", "dynamic analysis", "malware analysis"]
|
||||
authors = ["Ajin Abraham <[email protected]>"]
|
||||
|
||||
Reference in New Issue
Block a user