minio / mc

Unix like utilities for object store
https://min.io/download
GNU Affero General Public License v3.0
2.88k stars 552 forks source link

All environment variables with valid URLs get recognized as aliases #5045

Closed jwadolowski closed 2 months ago

jwadolowski commented 2 months ago

Expected behavior

Only MC_HOST_ prefixed env variables should be considered valid aliases.

Actual behavior

There's quite a few env variables with URL value configured on my machine. They're meant to be consumed by other apps, not by mc.

Here's an example - let's say I have the following variables configured:

export FOO="http://localhost:8080"
export MC_HOST_FOO="https://localhost:9090"
export BAR_URL="http://localhost:9999"
export PREFIX_BAZ_SUFFIX="https://example.com/a/path/to/a.json"

As long as variable value matches to this regex mc considers given variable as an alias.

$ docker run -e FOO="http://localhost:8080" -e MC_HOST_FOO="https://localhost:9090" -e BAR_URL="http://localhost:9999" -e PREFIX_BAZ_SUFFIX="https://example.com/a/path/to/a.json" minio/mc:RELEASE.2024-09-16T17-43-14Z alias ls
BAR_URL
  URL       : http://localhost:9999
  AccessKey :
  SecretKey :
  API       :
  Path      :
  Src       : env
FOO
  URL       : http://localhost:8080
  AccessKey :
  SecretKey :
  API       :
  Path      :
  Src       : env
FOO
  URL       : https://localhost:9090
  AccessKey :
  SecretKey :
  API       :
  Path      :
  Src       : env
gcs
  URL       : https://storage.googleapis.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v2
  Path      : dns
  Src       : /root/.mc/config.json
local
  URL       : http://localhost:9000
  AccessKey :
  SecretKey :
  API       :
  Path      : auto
  Src       : /root/.mc/config.json
play
  URL       : https://play.min.io
  AccessKey : Q3AM3UQ867SPQQA43P2F
  SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
  API       : S3v4
  Path      : auto
  Src       : /root/.mc/config.json
s3
  URL       : https://s3.amazonaws.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v4
  Path      : dns
  Src       : /root/.mc/config.json

FOO, MC_HOST_FOO and BAR_URL match to the aforementioned regex (PREFIX_BAZ_SUFFIX does not) and all 3 of them showed up in the output. What's interesting is that FOO got listed twice as both FOO and MC_HOST_FOO got misinterpreted by mc.

The problem seems to be here - strings.TrimPrefix returns original string if defined prefix does not match, therefore len will always be != 0 which leads to incorrect behaviour.

strings.HasPrefix should do the trick in this case.

Steps to reproduce the behavior

Just run the following command: docker run -e FOO="http://localhost:8080" -e MC_HOST_FOO="https://localhost:9090" -e BAR_URL="http://localhost:9999" -e PREFIX_BAZ_SUFFIX="https://example.com/a/path/to/a.json" minio/mc:RELEASE.2024-09-16T17-43-14Z alias ls

mc --version

# Inside Docker
$ docker run minio/mc:RELEASE.2024-09-16T17-43-14Z --version
mc version RELEASE.2024-09-16T17-43-14Z (commit-id=11ebe952ea30e426e564f66e78d178465ae7c432)
Runtime: go1.22.6 linux/arm64
Copyright (c) 2015-2024 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>

# Directly on my macOS
$ mc --version
mc version RELEASE.2024-09-16T17-43-14Z (commit-id=11ebe952ea30e426e564f66e78d178465ae7c432)
Runtime: go1.23.1 darwin/arm64
Copyright (c) 2015-0000 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>

System information

Docker image & macOS Sonoma 14.6.1

harshavardhana commented 2 months ago

Perhaps a bug introduced in this PR https://github.com/minio/mc/pull/5028

@dormanze ^^

dormanze commented 2 months ago

Perhaps a bug introduced in this PR #5028

@dormanze ^^

Let me fix it. Please assign the issue to me.

harshavardhana commented 2 months ago

fixed by #5048