#结果合并功能函数模块
import re

def my_merge(fun_name,result):
    if fun_name == "enum4linux":
        result = enum4linux_merge(result)
    else:
        pass
    return result


#--------------------enum4linux--------------------
def enum4linux_merge(result):
    print("enum4linux")
    # 1.用户列表(用于密码爆破)
    users = extract_users(result)
    # 2. 共享目录(用于未授权访问/文件泄露)
    shares = extract_shares(result)
    # 3. 密码策略(指导爆破规则)
    policy = extract_password_policy(result)
    # 4. 操作系统信息(用于漏洞匹配)
    os_info = extract_os_info(result)
    # 整合输出
    result = f"Users:{users}\nShares:{shares}\nPolicy:{policy}\nOS Info:{os_info}\n"
    print(result)
    return result

def extract_users(data):
    """提取所有用户列表(含 RID)"""
    users = {}
    pattern = re.compile(r"user:\[(.*?)\] rid:\[(0x[a-fA-F0-9]+)\]")
    matches = pattern.findall(data)
    for user, rid in matches:
        users[user] = rid
    return users

def extract_shares(data):
    """提取共享目录并清理 ANSI 转义码"""
    shares = []
    share_block = re.search(r"Share Enumeration.*?=\n(.*?)\n\n", data, re.DOTALL)
    if share_block:
        lines = share_block.group(1).split('\n')
        for line in lines:
            # 清理 ANSI 转义码(如 \x1b[35m)
            line_clean = re.sub(r'\x1b\[[0-9;]*m', '', line)
            if 'Disk' in line_clean or 'IPC' in line_clean:
                parts = list(filter(None, line_clean.split()))
                if len(parts) >= 3:
                    share = {
                        "name": parts[0],
                        "type": parts[1],
                        "access": "Unknown"
                    }
                    # 提取清理后的访问权限
                    access_line = re.search(rf"//.*{re.escape(parts[0])}.*Mapping: (.*?) ", data)
                    if access_line:
                        access_clean = re.sub(r'\x1b\[[0-9;]*m', '', access_line.group(1))
                        share["access"] = access_clean
                    shares.append(share)
    return shares

def extract_password_policy(data):
    """提取密码策略"""
    policy = {}
    policy_block = re.search(r"Password Policy Information.*?=\n(.*?)\n\n", data, re.DOTALL)
    if not policy_block:
        return policy

    policy_text = policy_block.group(1)
    # 提取最小密码长度(处理未匹配情况)
    min_length_match = re.search(r"Minimum password length: (\d+)", policy_text)
    policy["min_length"] = min_length_match.group(1) if min_length_match else "未知"

    # 提取密码复杂性要求
    complexity_match = re.search(r"Password Complexity: (Enabled|Disabled)", policy_text)
    policy["complexity"] = complexity_match.group(1) if complexity_match else "未知"

    # 提取账户锁定阈值
    lockout_match = re.search(r"Account Lockout Threshold: (\d+|None)", policy_text)
    policy["lockout_threshold"] = lockout_match.group(1) if lockout_match else "未知"
    return policy

def extract_os_info(data):
    """提取操作系统信息"""
    os_info = {}
    match = re.search(r"server \(([^)]+)\)", data)
    if match:
        os_info["samba_version"] = match.group(1)
    return os_info
#------------------------------------------------