Skip to content

Setting credentials through env. variable are not working #1807

@nierob

Description

@nierob
  • [ x ] I am on the latest Poetry version.
  • [ x ] I have searched the issues of this repo and believe that this is not a duplicate.
  • [ x ] If an exception occurs when executing a command, I executed it again in debug mode (-vvv option).
  • OS version and name: *nix
  • Poetry version: Poetry version 1.0.0

Issue

I'm failing to use env. variables to set custom pypi credentials.

My pyproject.toml contains private pypi's like this:

[[tool.poetry.source]]
url = "https://XXXXX/nexus/repository/pypi-central/simple"
name = "nexus"

I'm running this script:

export POETRY_HTTP_BASIC_NEXUS_USERNAME=****
export POETRY_HTTP_BASIC_NEXUS_PASSWORD=****
poetry install

and it fails with:

[EnvCommandError]
Command ['/opt/.cache/pypoetry/virtualenvs/YYYY-4zvP7SOo-py3.8/bin/pip', 'install', '--no-deps', '--index-url', 'https://XXXXX/nexus/repository/pypi-central/simple', '--extra-index-url', 'https://pypi.org/', 'six==1.12.0'] errored with the following return code 2, and output: 
Looking in indexes: https://RESOLVED-XXXXX/nexus/repository/pypi-central/simple, https://****:****@XXXXX/nexus/repository/epd-pypi/simple, https://pypi.org/
Collecting six==1.12.0

....

File "/opt/.cache/pypoetry/virtualenvs/YYYY-4zvP7SOo-py3.8/lib/python3.8/site-packages/pip/_internal/download.py", line 386, in handle_401
    username, password, save = self._prompt_for_password(parsed.netloc)
  File "/opt/.cache/pypoetry/virtualenvs/YYYY-4zvP7SOo-py3.8/lib/python3.8/site-packages/pip/_internal/download.py", line 358, in _prompt_for_password
    username = ask_input("User for %s: " % netloc)
  File "/opt/.cache/pypoetry/virtualenvs/YYYY-4zvP7SOo-py3.8/lib/python3.8/site-packages/pip/_internal/utils/misc.py", line 281, in ask_input
    return input(message)
EOFError: EOF when reading a line
User for XXXXX: 

I investigated the code and it seems that credentials are never acquired separately from config, but always as a pair. That means that code never ask for http-basic.nexus.password and http-basic.nexus.username, but for http-basic.nexus then the value is used as a dict (search for password_manager.get_http_auth usage). I could not find single test case, so I wrote one, fill free to use it:

diff --git a/tests/config/test_config.py b/tests/config/test_config.py
index 07373ad..72ad236 100644
--- a/tests/config/test_config.py
+++ b/tests/config/test_config.py
@@ -14,3 +14,13 @@ def test_config_get_from_environment_variable(config, environ):

     os.environ["POETRY_VIRTUALENVS_CREATE"] = "false"
     assert not config.get("virtualenvs.create")
+
+def test_basic_http_credentials_through_env(config, environ):
+    assert config.get("http-basic.test_repo") is None
+
+    os.environ["POETRY_HTTP_BASIC_TEST_REPO_USERNAME"] = "foo"
+    os.environ["POETRY_HTTP_BASIC_TEST_REPO_PASSWORD"] = "bar"
+    credentials = config.get("http-basic.test-repo")
+    assert credentials is not None
+    assert credentials["username"] == "foo"
+    assert credentials["password"] == "bar"

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugSomething isn't working as expected

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions