#!/usr/bin/env python

"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import os
import re

from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGH

def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):
    """
    这个函数用于篡改（tamper）输入的payload，将MySQL中的'MID(A, B, C)'语句替换为其等效的'MID(A FROM B FOR C)'形式。

    参数：
        payload：要篡改的原始payload。
        **kwargs：其他可选参数（在本函数中未使用）。

    要求：
        * 仅适用于MySQL数据库。

    测试情况：
        * MySQL 5.0 和 5.5

    注意：
        * 使用这个tamper脚本时，你可能需要考虑使用'--no-cast'选项，以避免类型转换问题。

    示例：
        >>> tamper('MID(VERSION(), 1, 1)')
        'MID(VERSION() FROM 1 FOR 1)'
    """

    retVal = payload  # 初始化返回值为输入的payload

    # 构建警告信息，提示用户可能需要使用'--no-cast'选项
    warnMsg = "you should consider usage of switch '--no-cast' along with "
    warnMsg += "tamper script '%s'" % os.path.basename(__file__).split(".")[0]
    singleTimeWarnMessage(warnMsg)

    # 使用正则表达式查找'MID(A, B, C)'形式的语句
    match = re.search(r"(?i)MID\((.+?)\s*,\s*(\d+)\s*\,\s*(\d+)\s*\)", payload or "")
    if match:  # 如果找到匹配项
        # 替换为'MID(A FROM B FOR C)'形式
        retVal = retVal.replace(match.group(0), "MID(%s FROM %s FOR %s)" % (match.group(1), match.group(2), match.group(3)))

    return retVal  # 返回篡改后的payload
