Skip to content

Commit 7f2d86e

Browse files
Tymolcramaro
andauthored
Open binary files in binary mode and do not encode them (#829)
* open binary files in binary mode and do not encode them * reveal base64 string if binary data, otherwise decode * fix linting, use raw data if binary for all cases * handle None MIME type as non-binary * provide --binary command line parameter Co-authored-by: Ricardo Amaro <[email protected]>
1 parent 85fe799 commit 7f2d86e

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

kapitan/cli.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,12 @@ def main():
401401
action="store_true",
402402
default=from_dot_kapitan("refs", "base64", False),
403403
)
404+
refs_parser.add_argument(
405+
"--binary",
406+
help="file content should be handled as binary data",
407+
action="store_true",
408+
default=from_dot_kapitan("refs", "binary", False),
409+
)
404410
refs_parser.add_argument(
405411
"--reveal",
406412
"-r",

kapitan/refs/base64.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ def __init__(self, data, from_base64=False, **kwargs):
4040

4141
def reveal(self):
4242
# TODO data should be bytes only
43-
return base64.b64decode(self.data).decode()
43+
decoded = base64.b64decode(self.data)
44+
try:
45+
return decoded.decode()
46+
except:
47+
return self.data
4448

4549
def compile_embedded(self):
4650
dump = self.dump()

kapitan/refs/cmd_parser.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging
55
import os
66
import sys
7+
import mimetypes
78

89
from kapitan.errors import KapitanError, RefHashMismatchError
910
from kapitan.refs.base import PlainRef, RefController, Revealer
@@ -37,6 +38,7 @@ def ref_write(args, ref_controller):
3738
"Write ref to ref_controller based on cli args"
3839
token_name = args.write
3940
file_name = args.file
41+
is_binary = args.binary
4042
data = None
4143

4244
if file_name is None:
@@ -46,8 +48,13 @@ def ref_write(args, ref_controller):
4648
for line in sys.stdin:
4749
data += line
4850
else:
49-
with open(file_name) as fp:
50-
data = fp.read()
51+
mime_type = mimetypes.guess_type(file_name)
52+
modifier = "rb" if is_binary else "r"
53+
with open(file_name, modifier) as fp:
54+
try:
55+
data = fp.read()
56+
except UnicodeDecodeError as e:
57+
raise KapitanError("Could not read file. Please add '--binary' if the file contains binary data. ({})".format(e))
5158

5259
if token_name.startswith("gpg:"):
5360
type_name, token_path = token_name.split(":")
@@ -167,7 +174,7 @@ def ref_write(args, ref_controller):
167174

168175
elif token_name.startswith("base64:"):
169176
type_name, token_path = token_name.split(":")
170-
_data = data.encode()
177+
_data = data if is_binary else data.encode()
171178
encoding = "original"
172179
if args.base64:
173180
_data = base64.b64encode(_data).decode()
@@ -179,7 +186,7 @@ def ref_write(args, ref_controller):
179186

180187
elif token_name.startswith("vaultkv:"):
181188
type_name, token_path = token_name.split(":")
182-
_data = data.encode()
189+
_data = data if is_binary else data.encode()
183190
vault_params = {}
184191
encoding = "original"
185192
if args.target_name:
@@ -213,7 +220,7 @@ def ref_write(args, ref_controller):
213220

214221
elif token_name.startswith("plain:"):
215222
type_name, token_path = token_name.split(":")
216-
_data = data.encode()
223+
_data = data if is_binary else data.encode()
217224
encoding = "original"
218225
if args.base64:
219226
_data = base64.b64encode(_data).decode()
@@ -225,7 +232,7 @@ def ref_write(args, ref_controller):
225232

226233
elif token_name.startswith("env:"):
227234
type_name, token_path = token_name.split(":")
228-
_data = data.encode()
235+
_data = data if is_binary else data.encode()
229236
encoding = "original"
230237
if args.base64:
231238
_data = base64.b64encode(_data).decode()

0 commit comments

Comments
 (0)