Skip to content

[BUG] - Conda-store server internal server error when auth header is specified without a token #1083

@soapy1

Description

@soapy1

Describe the bug

Running a query against the API with an auth header should authorize a user. However, if the auth header is specified and is empty, there is an internal server error.

For example:

$ curl --header "Authorization: bearer " http://localhost:8080/conda-store/api/v1/environment/
Internal Server Error                                     

Expected behavior

When the user provides the auth header, there should be no errors on the server.

  • for a valid user - it should filter the results as per that user's permissions
  • for a non existing user - it should show just the public environments
  • for a missing token - it should show just the public environments

How to Reproduce the problem?

To reproduce this issue, startup the latest version of conda-store-server. Then run a curl request with an empty auth header.

$ docker compose up -d --build
$ curl --header "Authorization: bearer " http://localhost:8080/conda-store/api/v1/environment/
Internal Server Error          

Output

Logs from the server

conda-store-server-1  | INFO:     172.18.0.1:58362 - "GET /conda-store/api/v1/environment/ HTTP/1.1" 500 Internal Server Error
conda-store-server-1  | ERROR:    Exception in ASGI application
conda-store-server-1  |   + Exception Group Traceback (most recent call last):
conda-store-server-1  |   |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups
conda-store-server-1  |   |     yield
conda-store-server-1  |   |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 178, in __call__
conda-store-server-1  |   |     async with anyio.create_task_group() as task_group:
conda-store-server-1  |   |                ^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
conda-store-server-1  |   |     raise BaseExceptionGroup(
conda-store-server-1  |   | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
conda-store-server-1  |   +-+---------------- 1 ----------------
conda-store-server-1  |     | Traceback (most recent call last):
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/uvicorn/protocols/http/h11_impl.py", line 403, in run_asgi
conda-store-server-1  |     |     result = await app(  # type: ignore[func-returns-value]
conda-store-server-1  |     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__
conda-store-server-1  |     |     await super().__call__(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/applications.py", line 112, in __call__
conda-store-server-1  |     |     await self.middleware_stack(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__
conda-store-server-1  |     |     raise exc
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__
conda-store-server-1  |     |     await self.app(scope, receive, _send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 177, in __call__
conda-store-server-1  |     |     with recv_stream, send_stream, collapse_excgroups():
conda-store-server-1  |     |                                    ^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/contextlib.py", line 158, in __exit__
conda-store-server-1  |     |     self.gen.throw(value)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
conda-store-server-1  |     |     raise exc
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 179, in __call__
conda-store-server-1  |     |     response = await self.dispatch_func(request, call_next)
conda-store-server-1  |     |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda-store-server/conda_store_server/_internal/server/app.py", line 257, in conda_store_middleware
conda-store-server-1  |     |     response = await call_next(request)
conda-store-server-1  |     |                ^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 154, in call_next
conda-store-server-1  |     |     raise app_exc
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 141, in coro
conda-store-server-1  |     |     await self.app(scope, receive_or_disconnect, send_no_error)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/sessions.py", line 85, in __call__
conda-store-server-1  |     |     await self.app(scope, receive, send_wrapper)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/cors.py", line 85, in __call__
conda-store-server-1  |     |     await self.app(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
conda-store-server-1  |     |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
conda-store-server-1  |     |     raise exc
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
conda-store-server-1  |     |     await app(scope, receive, sender)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__
conda-store-server-1  |     |     await self.middleware_stack(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 735, in app
conda-store-server-1  |     |     await route.handle(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle
conda-store-server-1  |     |     await self.app(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 76, in app
conda-store-server-1  |     |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
conda-store-server-1  |     |     raise exc
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
conda-store-server-1  |     |     await app(scope, receive, sender)
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 73, in app
conda-store-server-1  |     |     response = await f(request)
conda-store-server-1  |     |                ^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/fastapi/routing.py", line 291, in app
conda-store-server-1  |     |     solved_result = await solve_dependencies(
conda-store-server-1  |     |                     ^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/fastapi/dependencies/utils.py", line 638, in solve_dependencies
conda-store-server-1  |     |     solved = await call(**solved_result.values)
conda-store-server-1  |     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda-store-server/conda_store_server/_internal/server/dependencies.py", line 29, in get_entity
conda-store-server-1  |     |     return auth.authenticate_request(request)
conda-store-server-1  |     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |     |   File "/opt/conda-store-server/conda_store_server/server/auth.py", line 591, in authenticate_request
conda-store-server-1  |     |     request.state.entity = self.authentication.authenticate(parts[1])
conda-store-server-1  |     |                                                             ~~~~~^^^
conda-store-server-1  |     | IndexError: list index out of range
conda-store-server-1  |     +------------------------------------
conda-store-server-1  | 
conda-store-server-1  | During handling of the above exception, another exception occurred:
conda-store-server-1  | 
conda-store-server-1  | Traceback (most recent call last):
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/uvicorn/protocols/http/h11_impl.py", line 403, in run_asgi
conda-store-server-1  |     result = await app(  # type: ignore[func-returns-value]
conda-store-server-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__
conda-store-server-1  |     await super().__call__(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/applications.py", line 112, in __call__
conda-store-server-1  |     await self.middleware_stack(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__
conda-store-server-1  |     raise exc
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__
conda-store-server-1  |     await self.app(scope, receive, _send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 177, in __call__
conda-store-server-1  |     with recv_stream, send_stream, collapse_excgroups():
conda-store-server-1  |                                    ^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/contextlib.py", line 158, in __exit__
conda-store-server-1  |     self.gen.throw(value)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
conda-store-server-1  |     raise exc
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 179, in __call__
conda-store-server-1  |     response = await self.dispatch_func(request, call_next)
conda-store-server-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda-store-server/conda_store_server/_internal/server/app.py", line 257, in conda_store_middleware
conda-store-server-1  |     response = await call_next(request)
conda-store-server-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 154, in call_next
conda-store-server-1  |     raise app_exc
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/base.py", line 141, in coro
conda-store-server-1  |     await self.app(scope, receive_or_disconnect, send_no_error)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/sessions.py", line 85, in __call__
conda-store-server-1  |     await self.app(scope, receive, send_wrapper)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/cors.py", line 85, in __call__
conda-store-server-1  |     await self.app(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
conda-store-server-1  |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
conda-store-server-1  |     raise exc
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
conda-store-server-1  |     await app(scope, receive, sender)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__
conda-store-server-1  |     await self.middleware_stack(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 735, in app
conda-store-server-1  |     await route.handle(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle
conda-store-server-1  |     await self.app(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 76, in app
conda-store-server-1  |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
conda-store-server-1  |     raise exc
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
conda-store-server-1  |     await app(scope, receive, sender)
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/starlette/routing.py", line 73, in app
conda-store-server-1  |     response = await f(request)
conda-store-server-1  |                ^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/fastapi/routing.py", line 291, in app
conda-store-server-1  |     solved_result = await solve_dependencies(
conda-store-server-1  |                     ^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda/envs/conda-store-server/lib/python3.12/site-packages/fastapi/dependencies/utils.py", line 638, in solve_dependencies
conda-store-server-1  |     solved = await call(**solved_result.values)
conda-store-server-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda-store-server/conda_store_server/_internal/server/dependencies.py", line 29, in get_entity
conda-store-server-1  |     return auth.authenticate_request(request)
conda-store-server-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
conda-store-server-1  |   File "/opt/conda-store-server/conda_store_server/server/auth.py", line 591, in authenticate_request
conda-store-server-1  |     request.state.entity = self.authentication.authenticate(parts[1])
conda-store-server-1  |                                                             ~~~~~^^^
conda-store-server-1  | IndexError: list index out of range

Versions and dependencies used.

No response

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Status

    New 🚦

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions