mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-05 15:10:20 +08:00
main-1.x
2 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
b4c09aa4b1 |
security: add log injection attack prevention with input sanitization (#667)
* security: add log injection attack prevention with input sanitization - Created src/utils/log_sanitizer.py to sanitize user-controlled input before logging - Prevents log injection attacks using newlines, tabs, carriage returns, etc. - Escapes dangerous characters: \n, \r, \t, \0, \x1b - Provides specialized functions for different input types: - sanitize_log_input: general purpose sanitization - sanitize_thread_id: for user-provided thread IDs - sanitize_user_content: for user messages (more aggressive truncation) - sanitize_agent_name: for agent identifiers - sanitize_tool_name: for tool names - sanitize_feedback: for user interrupt feedback - create_safe_log_message: template-based safe message creation - Updated src/server/app.py to sanitize all user input in logging: - Thread IDs from request parameter - Message content from user - Agent names and node information - Tool names and feedback - Updated src/agents/tool_interceptor.py to sanitize: - Tool names during execution - User feedback during interrupt handling - Tool input data - Added 29 comprehensive unit tests covering: - Classic newline injection attacks - Carriage return injection - Tab and null character injection - HTML/ANSI escape sequence injection - Combined multi-character attacks - Truncation and length limits Fixes potential log forgery vulnerability where malicious users could inject fake log entries via unsanitized input containing control characters. |
||
|
|
bcc403ecd3 |
feat: implement tool-specific interrupts for create_react_agent (#572) (#659)
* feat: implement tool-specific interrupts for create_react_agent (#572) Add selective tool interrupt capability allowing interrupts before specific tools rather than all tools. Users can now configure which tools trigger interrupts via the interrupt_before_tools parameter. Changes: - Create ToolInterceptor class to handle tool-specific interrupt logic - Add interrupt_before_tools parameter to create_agent() function - Extend Configuration with interrupt_before_tools field - Add interrupt_before_tools to ChatRequest API - Update nodes.py to pass interrupt configuration to agents - Update app.py workflow to support tool interrupt configuration - Add comprehensive unit tests for tool interceptor Features: - Selective tool interrupts: interrupt only specific tools by name - Approval keywords: recognize user approval (approved, proceed, accept, etc.) - Backward compatible: optional parameter, existing code unaffected - Flexible: works with default tools and MCP-powered tools - Works with existing resume mechanism for seamless workflow Example usage: request = ChatRequest( messages=[...], interrupt_before_tools=['db_tool', 'sensitive_api'] ) * test: add comprehensive integration tests for tool-specific interrupts (#572) Add 24 integration tests covering all aspects of the tool interceptor feature: Test Coverage: - Agent creation with tool interrupts - Configuration support (with/without interrupts) - ChatRequest API integration - Multiple tools with selective interrupts - User approval/rejection flows - Tool wrapping and functionality preservation - Error handling and edge cases - Approval keyword recognition - Complex tool inputs - Logging and monitoring All tests pass with 100% coverage of tool interceptor functionality. Tests verify: ✓ Selective tool interrupts work correctly ✓ Only specified tools trigger interrupts ✓ Non-matching tools execute normally ✓ User feedback is properly parsed ✓ Tool functionality is preserved after wrapping ✓ Error handling works as expected ✓ Configuration options are properly respected ✓ Logging provides useful debugging info * fix: mock get_llm_by_type in agent creation test Fix test_agent_creation_with_tool_interrupts which was failing because get_llm_by_type() was being called before create_react_agent was mocked. Changes: - Add mock for get_llm_by_type in test - Use context manager composition for multiple patches - Test now passes and validates tool wrapping correctly All 24 integration tests now pass successfully. * refactor: use mock assertion methods for consistent and clearer error messages Update integration tests to use mock assertion methods instead of direct attribute checking for consistency and clearer error messages: Changes: - Replace 'assert mock_interrupt.called' with 'mock_interrupt.assert_called()' - Replace 'assert not mock_interrupt.called' with 'mock_interrupt.assert_not_called()' Benefits: - Consistent with pytest-mock and unittest.mock best practices - Clearer error messages when assertions fail - Better IDE autocompletion support - More professional test code All 42 tests pass with improved assertion patterns. * refactor: use default_factory for interrupt_before_tools consistency Improve consistency between ChatRequest and Configuration implementations: Changes: - ChatRequest.interrupt_before_tools: Use Field(default_factory=list) instead of Optional[None] - Remove unnecessary 'or []' conversion in app.py line 505 - Aligns with Configuration.interrupt_before_tools implementation pattern - No functional changes - all tests still pass Benefits: - Consistent field definition across codebase - Simpler and cleaner code - Reduced chance of None/empty list bugs - Better alignment with Pydantic best practices All 42 tests passing. * refactor: improve tool input formatting in interrupt messages Enhance tool input representation for better readability in interrupt messages: Changes: - Add json import for better formatting - Create _format_tool_input() static method with JSON serialization - Use JSON formatting for dicts, lists, tuples with indent=2 - Fall back to str() for non-serializable types - Handle None input specially (returns 'No input') - Improve interrupt message formatting with better spacing Benefits: - Complex tool inputs now display as readable JSON - Nested structures are properly indented and visible - Better user experience when reviewing tool inputs before approval - Handles edge cases gracefully with fallbacks - Improved logging output for debugging Example improvements: Before: {'query': 'SELECT...', 'limit': 10, 'nested': {'key': 'value'}} After: { "query": "SELECT...", "limit": 10, "nested": { "key": "value" } } All 42 tests still passing. * test: add comprehensive unit tests for tool input formatting |