Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
182 lines
5.8 KiB
Python
182 lines
5.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test authentication logic for different tool types
|
|
"""
|
|
|
|
|
|
def test_tool_detection():
|
|
"""Test tool type detection logic"""
|
|
|
|
SYSTEM_TOOLS = [
|
|
"list_projects",
|
|
"get_project_info",
|
|
"check_all_projects_health",
|
|
"get_project_health",
|
|
"get_system_metrics",
|
|
"get_system_uptime",
|
|
"get_rate_limit_stats",
|
|
"export_health_metrics",
|
|
"manage_api_keys_list",
|
|
"manage_api_keys_get_info",
|
|
]
|
|
|
|
test_cases = [
|
|
# (tool_name, expected_is_unified, expected_is_system, expected_skip_check, expected_project_id)
|
|
("wordpress_list_posts", True, False, True, "*"),
|
|
("woocommerce_list_products", True, False, True, "*"),
|
|
("mcp__coolify-projects__wordpress_get_post", True, False, True, "*"),
|
|
("mcp__coolify-projects__woocommerce_create_order", True, False, True, "*"),
|
|
("mcp__coolify-projects__list_projects", False, True, False, "*"),
|
|
("mcp__coolify-projects__get_system_metrics", False, True, False, "*"),
|
|
("mcp__coolify-projects__check_all_projects_health", False, True, False, "*"),
|
|
("list_projects", False, True, False, "*"),
|
|
("get_system_uptime", False, True, False, "*"),
|
|
(
|
|
"some_unknown_tool",
|
|
False,
|
|
False,
|
|
True,
|
|
"*",
|
|
), # Unknown - allow for backward compatibility
|
|
]
|
|
|
|
print("Testing tool detection logic:\n")
|
|
print(
|
|
f"{'Tool Name':<50} {'Unified':<10} {'System':<10} {'Skip Check':<12} {'Project ID':<12} {'Result'}"
|
|
)
|
|
print("-" * 110)
|
|
|
|
all_passed = True
|
|
for tool_name, exp_unified, exp_system, exp_skip, exp_project in test_cases:
|
|
# Apply the logic
|
|
is_unified_tool = (
|
|
tool_name.startswith("wordpress_")
|
|
or tool_name.startswith("woocommerce_")
|
|
or tool_name.startswith("mcp__coolify-projects__wordpress_")
|
|
or tool_name.startswith("mcp__coolify-projects__woocommerce_")
|
|
)
|
|
is_system_tool = any(tool_name.endswith(st) for st in SYSTEM_TOOLS)
|
|
|
|
if is_unified_tool:
|
|
skip_project_check = True
|
|
project_id = "*"
|
|
elif is_system_tool:
|
|
skip_project_check = False
|
|
project_id = "*"
|
|
else:
|
|
skip_project_check = True
|
|
project_id = "*"
|
|
|
|
# Check results
|
|
passed = (
|
|
is_unified_tool == exp_unified
|
|
and is_system_tool == exp_system
|
|
and skip_project_check == exp_skip
|
|
and project_id == exp_project
|
|
)
|
|
|
|
status = "✅ PASS" if passed else "❌ FAIL"
|
|
if not passed:
|
|
all_passed = False
|
|
|
|
print(
|
|
f"{tool_name:<50} {str(is_unified_tool):<10} {str(is_system_tool):<10} "
|
|
f"{str(skip_project_check):<12} {project_id:<12} {status}"
|
|
)
|
|
|
|
print("\n" + "=" * 110)
|
|
if all_passed:
|
|
print("✅ All tests passed!")
|
|
else:
|
|
print("❌ Some tests failed!")
|
|
|
|
return all_passed
|
|
|
|
|
|
def test_auth_scenarios():
|
|
"""Test authentication scenarios"""
|
|
|
|
print("\n\nTesting authentication scenarios:\n")
|
|
print(f"{'Scenario':<60} {'Expected Result':<30} {'Status'}")
|
|
print("-" * 110)
|
|
|
|
scenarios = [
|
|
# (description, key_project_id, tool_is_unified, tool_is_system, expected_result)
|
|
(
|
|
"Per-project key + Unified WP tool",
|
|
"wordpress_site1",
|
|
True,
|
|
False,
|
|
"✅ Allow (skip_project_check=True)",
|
|
),
|
|
(
|
|
"Per-project key + System tool",
|
|
"wordpress_site1",
|
|
False,
|
|
True,
|
|
"❌ Reject (key.project_id != '*')",
|
|
),
|
|
(
|
|
"Global key (*) + Unified WP tool",
|
|
"*",
|
|
True,
|
|
False,
|
|
"✅ Allow (skip_project_check=True)",
|
|
),
|
|
("Global key (*) + System tool", "*", False, True, "✅ Allow (key.project_id == '*')"),
|
|
(
|
|
"Per-project key + Unknown tool",
|
|
"wordpress_site1",
|
|
False,
|
|
False,
|
|
"✅ Allow (backward compatibility)",
|
|
),
|
|
("Global key (*) + Unknown tool", "*", False, False, "✅ Allow"),
|
|
]
|
|
|
|
for desc, key_project_id, is_unified, is_system, expected in scenarios:
|
|
# Determine skip_project_check based on tool type
|
|
if is_unified:
|
|
skip_project_check = True
|
|
elif is_system:
|
|
skip_project_check = False
|
|
else:
|
|
skip_project_check = True
|
|
|
|
# Simulate validate_key check
|
|
project_id = "*" # Always "*" in our new logic
|
|
|
|
# Check if key would be validated
|
|
if skip_project_check:
|
|
# Skip project check - key is valid regardless
|
|
would_pass_validate = True
|
|
reason = "skip_project_check=True"
|
|
else:
|
|
# Check project access
|
|
if key_project_id == "*" or key_project_id == project_id:
|
|
would_pass_validate = True
|
|
reason = f"key.project_id={key_project_id} matches project_id={project_id}"
|
|
else:
|
|
would_pass_validate = False
|
|
reason = f"key.project_id={key_project_id} != project_id={project_id}"
|
|
|
|
# Additional check for system tools
|
|
if is_system and key_project_id != "*":
|
|
would_pass_validate = False
|
|
reason = "System tools require global key (additional check)"
|
|
|
|
result = "✅ Allow" if would_pass_validate else "❌ Reject"
|
|
status = "✅ PASS" if (result in expected) else "❌ FAIL"
|
|
|
|
print(f"{desc:<60} {result:<30} {status}")
|
|
if status == "❌ FAIL":
|
|
print(f" └─ Expected: {expected}")
|
|
print(f" └─ Reason: {reason}")
|
|
|
|
print("\n" + "=" * 110)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_tool_detection()
|
|
test_auth_scenarios()
|