failed NO_PATCH NO_PATCH UNSUBMITTED empty_patch(budget) · 6 tool calls · 302 s · fastapi/fastapi
🐛 Fix hierarchical security scope propagation see defect #5623
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "grep -rn \"security_scopes\" . | head -20"
} | {"status": "ok", "stdout": "./fastapi/dependencies/models.py:40: security_scopes_param_name: Optional[str] = None\n./fastapi/dependencies/models.py:41: securityfull{"status": "ok", "stdout": "./fastapi/dependencies/models.py:40: security_scopes_param_name: Optional[str] = None\n./fastapi/dependencies/models.py:41: security_scopes: Optional[List[str]] = None\n./fastapi/dependencies/models.py:50: tuple(sorted(set(self.security_scopes or []))),\n./fastapi/dependencies/utils.py:129: use_security_scopes: List[str] = []\n./fastapi/dependencies/utils.py:131: use_security_scopes.extend(depends.scopes)\n./fastapi/dependencies/utils.py:136: security_scopes=use_security_scopes,\n./fastapi/dependencies/utils.py:235: security_scopes: Optional[List[str]] = None,\n./fastapi/dependencies/utils.py:243: security_scopes=security_scopes,\n./fastapi/dependencies/utils.py:253: use_scopes = security_scopes or use_scopes\n./fastapi/dependencies/utils.py:278: use_security_scopes = security_scopes or []\n./fastapi/dependencies/utils.py:281: use_security_scopes.extend(param_details.depends.scopes)\n./fastapi/dependencies/utils.py:286: security_scopes=use_security_scopes,\n./fastapi/dependencies/utils.py:330: dependant.security_scopes_param_name = param_name\n./fastapi/dependencies/utils.py:612: security_scopes=sub_dependant.security_scopes,\n./fastapi/dependencies/utils.py:692: if dependant.security_scopes_param_name:\n./fastapi/dependencies/utils.py:693: values[dependant.security_scopes_param_name] = SecurityScopes(\n./fastapi/dependencies/utils.py:694: scopes=dependant.security_scopes\n./tests/test_dependency_paramless.py:18: security_scopes: SecurityScopes,\n./tests/test_dependency_paramless.py:24: if \"a\" not in security_scopes.scopes or \"b\" not in security_scopes.scopes:\n./tests/test_dependency_paramless.py:26: return {\"token\": credentials, \"scopes\": security_scopes.scopes}\n", "exit_code": 0} |
| 2 | read_file | {
"end_line": 300,
"filepath": "fastapi/dependencies/utils.py",
"start_line": 120
} | {"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " except ImportError:\n logger.error(multipart_not_installed_error)\n raise RuntimeErrofull{"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " except ImportError:\n logger.error(multipart_not_installed_error)\n raise RuntimeError(multipart_not_installed_error) from None\n\n\ndef get_parameterless_sub_dependant(*, depends: params.Depends, path: str) -> Dependant:\n assert callable(depends.dependency), (\n \"A parameter-less dependency must have a callable dependency\"\n )\n use_security_scopes: List[str] = []\n if isinstance(depends, params.Security) and depends.scopes:\n use_security_scopes.extend(depends.scopes)\n return get_dependant(\n path=path,\n call=depends.dependency,\n scope=depends.scope,\n security_scopes=use_security_scopes,\n )\n\n\ndef get_flat_dependant(\n dependant: Dependant,\n *,\n skip_repeats: bool = False,\n visited: Optional[List[DependencyCacheKey]] = None,\n) -> Dependant:\n if visited is None:\n visited = []\n visited.append(dependant.cache_key)\n\n flat_dependant = Dependant(\n path_params=dependant.path_params.copy(),\n query_params=dependant.query_params.copy(),\n header_params=dependant.header_params.copy(),\n cookie_params=dependant.cookie_params.copy(),\n body_params=dependant.body_params.copy(),\n security_requirements=dependant.security_requirements.copy(),\n use_cache=dependant.use_cache,\n path=dependant.path,\n )\n for sub_dependant in dependant.dependencies:\n if skip_repeats and sub_dependant.cache_key in visited:\n continue\n flat_sub = get_flat_dependant(\n sub_dependant, skip_repeats=skip_repeats, visited=visited\n )\n flat_dependant.path_params.extend(flat_sub.path_params)\n flat_dependant.query_params.extend(flat_sub.query_params)\n flat_dependant.header_params.extend(flat_sub.header_params)\n flat_dependant.cookie_params.extend(flat_sub.cookie_ |
| 3 | read_file | {
"end_line": 330,
"filepath": "fastapi/dependencies/utils.py",
"start_line": 270
} | {"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " and dependant.computed_scope == \"request\"\n and param_details.depends.scope == \"fufull{"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " and dependant.computed_scope == \"request\"\n and param_details.depends.scope == \"function\"\n ):\n assert dependant.call\n raise DependencyScopeError(\n f'The dependency \"{dependant.call.__name__}\" has a scope of '\n '\"request\", it cannot depend on dependencies with scope \"function\".'\n )\n use_security_scopes = security_scopes or []\n if isinstance(param_details.depends, params.Security):\n if param_details.depends.scopes:\n use_security_scopes.extend(param_details.depends.scopes)\n sub_dependant = get_dependant(\n path=path,\n call=param_details.depends.dependency,\n name=param_name,\n security_scopes=use_security_scopes,\n use_cache=param_details.depends.use_cache,\n scope=param_details.depends.scope,\n )\n dependant.dependencies.append(sub_dependant)\n continue\n if add_non_field_param_to_dependency(\n param_name=param_name,\n type_annotation=param_details.type_annotation,\n dependant=dependant,\n ):\n assert param_details.field is None, (\n f\"Cannot specify multiple FastAPI annotations for {param_name!r}\"\n )\n continue\n assert param_details.field is not None\n if isinstance(\n param_details.field.field_info, (params.Body, temp_pydantic_v1_params.Body)\n ):\n dependant.body_params.append(param_details.field)\n else:\n add_param_to_fields(field=param_details.field, dependant=dependant)\n return dependant\n\n\ndef add_non_field_param_to_dependency(\n *, param_name: str, type_annotation: Any, dependant: Dependant |
| 4 | read_file | {
"end_line": 620,
"filepath": "fastapi/dependencies/utils.py",
"start_line": 580
} | {"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " assert isinstance(request_astack, AsyncExitStack), (\n \"fastapi_inner_astack not foufull{"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " assert isinstance(request_astack, AsyncExitStack), (\n \"fastapi_inner_astack not found in request scope\"\n )\n function_astack = request.scope.get(\"fastapi_function_astack\")\n assert isinstance(function_astack, AsyncExitStack), (\n \"fastapi_function_astack not found in request scope\"\n )\n values: Dict[str, Any] = {}\n errors: List[Any] = []\n if response is None:\n response = Response()\n del response.headers[\"content-length\"]\n response.status_code = None # type: ignore\n if dependency_cache is None:\n dependency_cache = {}\n for sub_dependant in dependant.dependencies:\n sub_dependant.call = cast(Callable[..., Any], sub_dependant.call)\n call = sub_dependant.call\n use_sub_dependant = sub_dependant\n if (\n dependency_overrides_provider\n and dependency_overrides_provider.dependency_overrides\n ):\n original_call = sub_dependant.call\n call = getattr(\n dependency_overrides_provider, \"dependency_overrides\", {}\n ).get(original_call, original_call)\n use_path: str = sub_dependant.path # type: ignore\n use_sub_dependant = get_dependant(\n path=use_path,\n call=call,\n name=sub_dependant.name,\n security_scopes=sub_dependant.security_scopes,\n scope=sub_dependant.scope,\n )\n\n solved_result = await solve_dependencies(\n request=request,\n dependant=use_sub_dependant,\n body=body,\n background_tasks=background_tasks,\n", "start_line": 580, "end_line": 620, "total_lines": 1024, "is_truncated": false} |
| 5 | read_file | {
"end_line": 700,
"filepath": "fastapi/dependencies/utils.py",
"start_line": 640
} | {"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " dependant=use_sub_dependant,\n stack=use_astack,\n sub_values=solved_result.values,\nfull{"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " dependant=use_sub_dependant,\n stack=use_astack,\n sub_values=solved_result.values,\n )\n elif use_sub_dependant.is_coroutine_callable:\n solved = await call(**solved_result.values)\n else:\n solved = await run_in_threadpool(call, **solved_result.values)\n if sub_dependant.name is not None:\n values[sub_dependant.name] = solved\n if sub_dependant.cache_key not in dependency_cache:\n dependency_cache[sub_dependant.cache_key] = solved\n path_values, path_errors = request_params_to_args(\n dependant.path_params, request.path_params\n )\n query_values, query_errors = request_params_to_args(\n dependant.query_params, request.query_params\n )\n header_values, header_errors = request_params_to_args(\n dependant.header_params, request.headers\n )\n cookie_values, cookie_errors = request_params_to_args(\n dependant.cookie_params, request.cookies\n )\n values.update(path_values)\n values.update(query_values)\n values.update(header_values)\n values.update(cookie_values)\n errors += path_errors + query_errors + header_errors + cookie_errors\n if dependant.body_params:\n (\n body_values,\n body_errors,\n ) = await request_body_to_args( # body_params checked above\n body_fields=dependant.body_params,\n received_body=body,\n embed_body_fields=embed_body_fields,\n )\n values.update(body_values)\n errors.extend(body_errors)\n if dependant.http_connection_param_name:\n values[dependant.http_connection_param_name] = request\n if dependant.request_param_name and isinstance(request, Request):\n values[dependant.request_param_name] = request\n elif dependant.websocket_param_name and isinstance(request, WebSo |
| 6 | read_file | {
"filepath": "fastapi/dependencies/utils.py",
"start_line": 270,
"end_line": 290
} | {"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " and dependant.computed_scope == \"request\"\n and param_details.depends.scope == \"fufull{"status": "ok", "filepath": "fastapi/dependencies/utils.py", "content": " and dependant.computed_scope == \"request\"\n and param_details.depends.scope == \"function\"\n ):\n assert dependant.call\n raise DependencyScopeError(\n f'The dependency \"{dependant.call.__name__}\" has a scope of '\n '\"request\", it cannot depend on dependencies with scope \"function\".'\n )\n use_security_scopes = security_scopes or []\n if isinstance(param_details.depends, params.Security):\n if param_details.depends.scopes:\n use_security_scopes.extend(param_details.depends.scopes)\n sub_dependant = get_dependant(\n path=path,\n call=param_details.depends.dependency,\n name=param_name,\n security_scopes=use_security_scopes,\n use_cache=param_details.depends.use_cache,\n scope=param_details.depends.scope,\n )\n dependant.dependencies.append(sub_dependant)\n", "start_line": 270, "end_line": 290, "total_lines": 1024, "is_truncated": false} |