From 6e03b7f33499b7a0a03f3fef9bbdcbf1d6b458e8 Mon Sep 17 00:00:00 2001 From: Ryan Pratt Date: Thu, 15 Jan 2026 16:51:30 -0700 Subject: [PATCH 1/3] Fix secret unpacking --- openc3/python/openc3/utilities/secrets.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openc3/python/openc3/utilities/secrets.py b/openc3/python/openc3/utilities/secrets.py index 8c7f18dd90..b14e7835e0 100644 --- a/openc3/python/openc3/utilities/secrets.py +++ b/openc3/python/openc3/utilities/secrets.py @@ -1,4 +1,4 @@ -# Copyright 2023 OpenC3, Inc. +# Copyright 2026 OpenC3, Inc. # All Rights Reserved. # # This program is free software; you can modify and/or redistribute it @@ -50,7 +50,8 @@ def delete(self, key, secret_store=None, scope=None): raise RuntimeError(f"{self.__class__.__name__} has not implemented method 'delete'") def setup(self, secrets): - for type, key, data, secret_store in secrets: + for type, key, data, *extra in secrets: + secret_store = extra[0] if extra else None match type: case "ENV": self.local_secrets[key] = os.environ.get(data) From c62470312795e27d5d83df3700c7a192b084f927 Mon Sep 17 00:00:00 2001 From: Ryan Pratt Date: Fri, 16 Jan 2026 15:53:15 -0700 Subject: [PATCH 2/3] Better error for invalid secret in microservice config --- openc3/lib/openc3/utilities/secrets.rb | 6 +++++- openc3/python/openc3/utilities/secrets.py | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/openc3/lib/openc3/utilities/secrets.rb b/openc3/lib/openc3/utilities/secrets.rb index b018df8059..20abc31d03 100644 --- a/openc3/lib/openc3/utilities/secrets.rb +++ b/openc3/lib/openc3/utilities/secrets.rb @@ -48,7 +48,11 @@ def delete(key, secret_store: nil, scope:) end def setup(secrets) - secrets.each do |type, key, data, secret_store| + secrets.each do |secret| + if secret.length < 3 + raise ArgumentError, "Secret must have at least 3 items (type, key, data), got #{secret.length}" + end + type, key, data, secret_store = secret case type when 'ENV' @local_secrets[key] = ENV[data] diff --git a/openc3/python/openc3/utilities/secrets.py b/openc3/python/openc3/utilities/secrets.py index b14e7835e0..adb7512daa 100644 --- a/openc3/python/openc3/utilities/secrets.py +++ b/openc3/python/openc3/utilities/secrets.py @@ -50,7 +50,10 @@ def delete(self, key, secret_store=None, scope=None): raise RuntimeError(f"{self.__class__.__name__} has not implemented method 'delete'") def setup(self, secrets): - for type, key, data, *extra in secrets: + for secret in secrets: + if len(secret) < 3: + raise ValueError(f"Secret must have at least 3 items (type, key, data), got {len(secret)}") + type, key, data, *extra = secret secret_store = extra[0] if extra else None match type: case "ENV": From 3a6cf8a90db9c2c06e2b52c2054b108d90d3e6cf Mon Sep 17 00:00:00 2001 From: Ryan Pratt Date: Fri, 16 Jan 2026 15:55:49 -0700 Subject: [PATCH 3/3] fix python lint error --- openc3/python/openc3/utilities/secrets.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openc3/python/openc3/utilities/secrets.py b/openc3/python/openc3/utilities/secrets.py index adb7512daa..30203507e2 100644 --- a/openc3/python/openc3/utilities/secrets.py +++ b/openc3/python/openc3/utilities/secrets.py @@ -53,8 +53,7 @@ def setup(self, secrets): for secret in secrets: if len(secret) < 3: raise ValueError(f"Secret must have at least 3 items (type, key, data), got {len(secret)}") - type, key, data, *extra = secret - secret_store = extra[0] if extra else None + type, key, data, *extra = secret # *extra would be secret_store, but we don't need that here match type: case "ENV": self.local_secrets[key] = os.environ.get(data)