源码阅读

yangzhisheng_branch
XU 2 months ago
parent c88ebebca8
commit d59959cff9

@ -5,114 +5,114 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import sys
import sys # 导入sys模块用于处理与Python解释器相关的操作
sys.dont_write_bytecode = True
sys.dont_write_bytecode = True # 设置不生成.pyc字节码文件以减少磁盘空间占用和加载时间
__import__("lib.utils.versioncheck") # this has to be the first non-standard import
__import__("lib.utils.versioncheck") # 动态导入lib.utils.versioncheck模块通常用于检查版本兼容性
import logging
import os
import warnings
import logging # 导入logging模块用于记录日志信息
import os # 导入os模块用于与操作系统进行交互
import warnings # 导入warnings模块用于处理警告信息
warnings.filterwarnings(action="ignore", category=UserWarning)
warnings.filterwarnings(action="ignore", category=DeprecationWarning)
warnings.filterwarnings(action="ignore", category=UserWarning) # 忽略所有UserWarning类别的警告
warnings.filterwarnings(action="ignore", category=DeprecationWarning) # 忽略所有DeprecationWarning类别的警告
try:
from optparse import OptionGroup
from optparse import OptionParser as ArgumentParser
from optparse import OptionGroup # 从optparse模块导入OptionGroup类用于处理命令行选项组
from optparse import OptionParser as ArgumentParser # 从optparse模块导入OptionParser类并将其重命名为ArgumentParser
ArgumentParser.add_argument = ArgumentParser.add_option
ArgumentParser.add_argument = ArgumentParser.add_option # 将ArgumentParser的add_option方法重命名为add_argument以兼容argparse的API
def _add_argument(self, *args, **kwargs):
def _add_argument(self, *args, **kwargs): # 定义一个辅助函数_add_argument用于将add_argument方法映射到add_option方法
return self.add_option(*args, **kwargs)
OptionGroup.add_argument = _add_argument
except ImportError:
from argparse import ArgumentParser
finally:
def get_actions(instance):
for attr in ("option_list", "_group_actions", "_actions"):
if hasattr(instance, attr):
return getattr(instance, attr)
def get_groups(parser):
return getattr(parser, "option_groups", None) or getattr(parser, "_action_groups")
def get_all_options(parser):
retVal = set()
for option in get_actions(parser):
if hasattr(option, "option_strings"):
retVal.update(option.option_strings)
else:
retVal.update(option._long_opts)
retVal.update(option._short_opts)
for group in get_groups(parser):
for option in get_actions(group):
if hasattr(option, "option_strings"):
retVal.update(option.option_strings)
else:
retVal.update(option._long_opts)
retVal.update(option._short_opts)
return retVal
from lib.core.common import getUnicode
from lib.core.common import setPaths
from lib.core.data import logger
from lib.core.patch import dirtyPatches
from lib.core.patch import resolveCrossReferences
from lib.core.settings import RESTAPI_DEFAULT_ADAPTER
from lib.core.settings import RESTAPI_DEFAULT_ADDRESS
from lib.core.settings import RESTAPI_DEFAULT_PORT
from lib.core.settings import UNICODE_ENCODING
from lib.utils.api import client
from lib.utils.api import server
OptionGroup.add_argument = _add_argument # 将OptionGroup的add_argument方法映射到_add_argument函数
except ImportError: # 如果导入optparse模块失败例如在Python 3中则执行以下代码
from argparse import ArgumentParser # 从argparse模块导入ArgumentParser类用于处理命令行参数
finally: # 无论try块中的代码是否成功执行finally块中的代码都会执行
def get_actions(instance): # 定义一个函数get_actions用于获取命令行解析器实例中的选项列表
for attr in ("option_list", "_group_actions", "_actions"): # 遍历可能的属性名称
if hasattr(instance, attr): # 如果实例具有该属性
return getattr(instance, attr) # 返回该属性的值
def get_groups(parser): # 定义一个函数get_groups用于获取命令行解析器中的选项组
return getattr(parser, "option_groups", None) or getattr(parser, "_action_groups") # 返回解析器中的选项组如果不存在则返回None
def get_all_options(parser): # 定义一个函数get_all_options用于获取命令行解析器中的所有选项
retVal = set() # 创建一个空集合,用于存储所有选项
for option in get_actions(parser): # 遍历解析器中的选项
if hasattr(option, "option_strings"): # 如果选项具有option_strings属性
retVal.update(option.option_strings) # 将选项字符串添加到集合中
else: # 否则
retVal.update(option._long_opts) # 将长选项添加到集合中
retVal.update(option._short_opts) # 将短选项添加到集合中
for group in get_groups(parser): # 遍历解析器中的选项组
for option in get_actions(group): # 遍历选项组中的选项
if hasattr(option, "option_strings"): # 如果选项具有option_strings属性
retVal.update(option.option_strings) # 将选项字符串添加到集合中
else: # 否则
retVal.update(option._long_opts) # 将长选项添加到集合中
retVal.update(option._short_opts) # 将短选项添加到集合中
return retVal # 返回包含所有选项的集合
from lib.core.common import getUnicode # 从lib.core.common模块导入getUnicode函数用于将字符串转换为Unicode格式
from lib.core.common import setPaths # 从lib.core.common模块导入setPaths函数用于设置文件路径
from lib.core.data import logger # 从lib.core.data模块导入logger对象用于记录日志信息
from lib.core.patch import dirtyPatches # 从lib.core.patch模块导入dirtyPatches函数用于应用临时补丁
from lib.core.patch import resolveCrossReferences # 从lib.core.patch模块导入resolveCrossReferences函数用于解决交叉引用问题
from lib.core.settings import RESTAPI_DEFAULT_ADAPTER # 从lib.core.settings模块导入RESTAPI_DEFAULT_ADAPTER常量表示默认的服务器适配器
from lib.core.settings import RESTAPI_DEFAULT_ADDRESS # 从lib.core.settings模块导入RESTAPI_DEFAULT_ADDRESS常量表示默认的服务器地址
from lib.core.settings import RESTAPI_DEFAULT_PORT # 从lib.core.settings模块导入RESTAPI_DEFAULT_PORT常量表示默认的服务器端口
from lib.core.settings import UNICODE_ENCODING # 从lib.core.settings模块导入UNICODE_ENCODING常量表示默认的Unicode编码
from lib.utils.api import client # 从lib.utils.api模块导入client函数用于启动REST-JSON API客户端
from lib.utils.api import server # 从lib.utils.api模块导入server函数用于启动REST-JSON API服务器
try:
from sqlmap import modulePath
except ImportError:
def modulePath():
return getUnicode(os.path.dirname(os.path.realpath(__file__)), encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)
from sqlmap import modulePath # 从sqlmap模块导入modulePath函数用于获取模块路径
except ImportError: # 如果导入失败例如sqlmap模块不存在则执行以下代码
def modulePath(): # 定义一个函数modulePath用于获取当前模块的路径
return getUnicode(os.path.dirname(os.path.realpath(__file__)), encoding=sys.getfilesystemencoding() or UNICODE_ENCODING) # 返回当前文件的目录路径并将其转换为Unicode格式
def main():
def main(): # 定义main函数作为REST-JSON API的入口函数
"""
REST-JSON API main function
"""
dirtyPatches()
resolveCrossReferences()
dirtyPatches() # 应用临时补丁
resolveCrossReferences() # 解决交叉引用问题
# Set default logging level to debug
logger.setLevel(logging.DEBUG)
logger.setLevel(logging.DEBUG) # 设置日志记录级别为DEBUG以便记录详细信息
# Initialize paths
setPaths(modulePath())
setPaths(modulePath()) # 初始化文件路径使用modulePath函数获取当前模块路径
# Parse command line options
apiparser = ArgumentParser()
apiparser.add_argument("-s", "--server", help="Run as a REST-JSON API server", action="store_true")
apiparser.add_argument("-c", "--client", help="Run as a REST-JSON API client", action="store_true")
apiparser.add_argument("-H", "--host", help="Host of the REST-JSON API server (default \"%s\")" % RESTAPI_DEFAULT_ADDRESS, default=RESTAPI_DEFAULT_ADDRESS)
apiparser.add_argument("-p", "--port", help="Port of the REST-JSON API server (default %d)" % RESTAPI_DEFAULT_PORT, default=RESTAPI_DEFAULT_PORT, type=int)
apiparser.add_argument("--adapter", help="Server (bottle) adapter to use (default \"%s\")" % RESTAPI_DEFAULT_ADAPTER, default=RESTAPI_DEFAULT_ADAPTER)
apiparser.add_argument("--database", help="Set IPC database filepath (optional)")
apiparser.add_argument("--username", help="Basic authentication username (optional)")
apiparser.add_argument("--password", help="Basic authentication password (optional)")
(args, _) = apiparser.parse_known_args() if hasattr(apiparser, "parse_known_args") else apiparser.parse_args()
apiparser = ArgumentParser() # 创建一个ArgumentParser对象用于解析命令行参数
apiparser.add_argument("-s", "--server", help="Run as a REST-JSON API server", action="store_true") # 添加一个命令行选项,用于启动服务器
apiparser.add_argument("-c", "--client", help="Run as a REST-JSON API client", action="store_true") # 添加一个命令行选项,用于启动客户端
apiparser.add_argument("-H", "--host", help="Host of the REST-JSON API server (default \"%s\")" % RESTAPI_DEFAULT_ADDRESS, default=RESTAPI_DEFAULT_ADDRESS) # 添加一个命令行选项用于指定服务器主机地址默认值为RESTAPI_DEFAULT_ADDRESS
apiparser.add_argument("-p", "--port", help="Port of the REST-JSON API server (default %d)" % RESTAPI_DEFAULT_PORT, default=RESTAPI_DEFAULT_PORT, type=int) # 添加一个命令行选项用于指定服务器端口默认值为RESTAPI_DEFAULT_PORT
apiparser.add_argument("--adapter", help="Server (bottle) adapter to use (default \"%s\")" % RESTAPI_DEFAULT_ADAPTER, default=RESTAPI_DEFAULT_ADAPTER) # 添加一个命令行选项用于指定服务器适配器默认值为RESTAPI_DEFAULT_ADAPTER
apiparser.add_argument("--database", help="Set IPC database filepath (optional)") # 添加一个命令行选项用于指定IPC数据库文件路径可选
apiparser.add_argument("--username", help="Basic authentication username (optional)") # 添加一个命令行选项,用于指定基本认证的用户名(可选)
apiparser.add_argument("--password", help="Basic authentication password (optional)") # 添加一个命令行选项,用于指定基本认证的密码(可选)
(args, _) = apiparser.parse_known_args() if hasattr(apiparser, "parse_known_args") else apiparser.parse_args() # 解析命令行参数如果支持parse_known_args方法则使用它否则使用parse_args方法
# Start the client or the server
if args.server:
server(args.host, args.port, adapter=args.adapter, username=args.username, password=args.password, database=args.database)
elif args.client:
client(args.host, args.port, username=args.username, password=args.password)
else:
apiparser.print_help()
if __name__ == "__main__":
main()
if args.server: # 如果命令行参数中指定了启动服务器
server(args.host, args.port, adapter=args.adapter, username=args.username, password=args.password, database=args.database) # 调用server函数启动服务器
elif args.client: # 如果命令行参数中指定了启动客户端
client(args.host, args.port, username=args.username, password=args.password) # 调用client函数启动客户端
else: # 如果未指定启动服务器或客户端
apiparser.print_help() # 打印命令行帮助信息
if __name__ == "__main__": # 如果当前脚本作为主程序运行
main() # 调用main函数

Loading…
Cancel
Save