Skip to content

Commit 6e3a84d

Browse files
authored
fix bug where -n and -k was mutually exclusive (#281)
* fixed bug where -n and -k was mutually exclusive * added credential overlap warning messages
1 parent 468803d commit 6e3a84d

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

rsconnect/api.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ def __init__(
338338
) -> None:
339339
self.reset()
340340
self._d = kwargs
341+
self.logger = logger
341342
self.setup_remote_server(
342343
name=name,
343344
url=url or kwargs.get("server"),
@@ -350,7 +351,6 @@ def __init__(
350351
secret=secret,
351352
)
352353
self.setup_client(cookies, timeout)
353-
self.logger = logger
354354

355355
@classmethod
356356
def fromConnectServer(cls, connect_server, **kwargs):
@@ -404,12 +404,38 @@ def setup_remote_server(
404404
server_data = ServerStore().resolve(name, url)
405405
if server_data.from_store:
406406
url = server_data.url
407-
api_key = server_data.api_key
408-
insecure = server_data.insecure
409-
ca_data = server_data.ca_data
410-
account_name = server_data.account_name
411-
token = server_data.token
412-
secret = server_data.secret
407+
if (
408+
server_data.api_key
409+
and api_key
410+
or server_data.insecure
411+
and insecure
412+
or server_data.ca_data
413+
and ca_data
414+
or server_data.account_name
415+
and account_name
416+
or server_data.token
417+
and token
418+
or server_data.secret
419+
and secret
420+
) and self.logger:
421+
self.logger.warning(
422+
"Connect detected CLI commands and/or environment variables that overlap with stored credential.\n"
423+
)
424+
self.logger.warning(
425+
"Check your environment variables (e.g. CONNECT_API_KEY) to make sure you want them to be used.\n"
426+
)
427+
self.logger.warning(
428+
"Credential paremeters are taken with the following precedence: stored > CLI > environment.\n"
429+
)
430+
self.logger.warning(
431+
"To ignore an environment variable, override it in the CLI with an empty string (e.g. -k '').\n"
432+
)
433+
api_key = server_data.api_key or api_key
434+
insecure = server_data.insecure or insecure
435+
ca_data = server_data.ca_data or ca_data
436+
account_name = server_data.account_name or account_name
437+
token = server_data.token or token
438+
secret = server_data.secret or secret
413439
self.is_server_from_store = server_data.from_store
414440

415441
if api_key:

rsconnect/main.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,19 @@ def _test_shinyappsio_creds(server: api.ShinyappsServer):
314314
type=click.File(),
315315
help="The path to trusted TLS CA certificates.",
316316
)
317-
@shinyapps_args
318317
@click.option("--verbose", "-v", is_flag=True, help="Print detailed messages.")
319-
def add(name, server, api_key, insecure, cacert, account, token, secret, verbose):
318+
@shinyapps_args
319+
@click.pass_context
320+
def add(ctx, name, server, api_key, insecure, cacert, account, token, secret, verbose):
320321

321322
set_verbosity(verbose)
323+
if sys.version_info >= (3, 8):
324+
click.echo("Detected the following inputs:")
325+
for k, v in locals().items():
326+
if k in {"ctx", "verbose"}:
327+
continue
328+
if v is not None:
329+
click.echo(" {}: {}".format(k, ctx.get_parameter_source(k).name))
322330

323331
validation.validate_connection_options(
324332
url=server,
@@ -385,10 +393,11 @@ def list_servers(verbose):
385393
for server in servers:
386394
click.echo('Nickname: "%s"' % server["name"])
387395
click.echo(" URL: %s" % server["url"])
388-
click.echo(" API key is saved")
389-
if server["insecure"]:
396+
if server.get("api_key"):
397+
click.echo(" API key is saved")
398+
if server.get("insecure"):
390399
click.echo(" Insecure mode (TLS host/certificate validation disabled)")
391-
if server["ca_cert"]:
400+
if server.get("ca_cert"):
392401
click.echo(" Client TLS certificate data provided")
393402
click.echo()
394403

rsconnect/validation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def validate_connection_options(url, api_key, insecure, cacert, account_name, to
1414
"""
1515
connect_options = {"-k/--api-key": api_key, "-i/--insecure": insecure, "-c/--cacert": cacert}
1616
shinyapps_options = {"-T/--token": token, "-S/--secret": secret, "-A/--account": account_name}
17-
options_mutually_exclusive_with_name = {"-s/--server": url, **connect_options, **shinyapps_options}
17+
options_mutually_exclusive_with_name = {"-s/--server": url, **shinyapps_options}
1818
present_options_mutually_exclusive_with_name = _get_present_options(options_mutually_exclusive_with_name)
1919

2020
if name and present_options_mutually_exclusive_with_name:

0 commit comments

Comments
 (0)