Skip to content

Commit a918e12

Browse files
authored
feat: add mimetypes to ztdf on encrypt (#209)
1 parent b856607 commit a918e12

File tree

6 files changed

+56
-16
lines changed

6 files changed

+56
-16
lines changed

cmd/tdf-decrypt.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,17 @@ func dev_tdfDecryptCmd(cmd *cobra.Command, args []string) {
2626
piped := readPipedStdin()
2727

2828
// Prefer file argument over piped input over default filename
29-
var bytesToDecrypt []byte
29+
bytesToDecrypt := piped
3030
var tdfFile string
3131
if len(args) > 0 {
3232
tdfFile = args[0]
3333
bytesToDecrypt = readBytesFromFile(tdfFile)
34-
} else if len(piped) > 0 {
35-
bytesToDecrypt = piped
36-
} else {
34+
}
35+
36+
if len(bytesToDecrypt) == 0 {
3737
cli.ExitWithError("Must provide ONE of the following to decrypt: [file argument, stdin input]", errors.New("no input provided"))
3838
}
39+
3940
var decrypted *bytes.Buffer
4041
var err error
4142
if tdfType == TDF3 {

cmd/tdf-encrypt.go

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import (
44
"bytes"
55
"fmt"
66
"io"
7+
"log/slog"
78
"os"
9+
"path/filepath"
810
"strings"
911

12+
"github.com/gabriel-vasile/mimetype"
1013
"github.com/opentdf/otdfctl/pkg/cli"
1114
"github.com/opentdf/otdfctl/pkg/man"
1215
"github.com/spf13/cobra"
@@ -23,10 +26,14 @@ func dev_tdfEncryptCmd(cmd *cobra.Command, args []string) {
2326

2427
flagHelper := cli.NewFlagHelper(cmd)
2528
var filePath string
29+
var fileExt string
2630
if len(args) > 0 {
2731
filePath = args[0]
32+
fileExt = strings.ToLower(strings.TrimPrefix(filepath.Ext(filePath), "."))
2833
}
34+
2935
out := flagHelper.GetOptionalString("out")
36+
fileMimeType := flagHelper.GetOptionalString("mime-type")
3037
values := flagHelper.GetStringSlice("attr", attrValues, cli.FlagHelperStringSliceOptions{Min: 0})
3138
tdfType := flagHelper.GetOptionalString("tdf-type")
3239
if tdfType == "" {
@@ -43,25 +50,46 @@ func dev_tdfEncryptCmd(cmd *cobra.Command, args []string) {
4350
inputCount++
4451
}
4552

53+
cliExit := func(s string) {
54+
cli.ExitWithError("Must provide "+s+" of the following to encrypt: [file argument, stdin input]", nil)
55+
}
4656
if inputCount == 0 {
47-
cli.ExitWithError("Must provide ONE of the following to encrypt: [file argument, stdin input]", nil)
57+
cliExit("ONE")
4858
} else if inputCount > 1 {
49-
cli.ExitWithError("Must provide ONLY ONE of the following to encrypt: [file argument, stdin input]", nil)
59+
cliExit("ONLY ONE")
5060
}
5161

5262
// prefer filepath argument over stdin input
53-
var bytesSlice []byte
63+
bytesSlice := piped
5464
if filePath != "" {
5565
bytesSlice = readBytesFromFile(filePath)
56-
} else {
57-
bytesSlice = piped
5866
}
5967

68+
// auto-detect mime type if not provided
69+
if fileMimeType == "" {
70+
slog.Debug("Detecting mime type of file")
71+
// get the mime type of the file
72+
mimetype.SetLimit(1024 * 1024) // limit to 1MB
73+
m := mimetype.Detect(bytesSlice)
74+
// default to application/octet-stream if no mime type is detected
75+
fileMimeType = m.String()
76+
77+
if fileMimeType == "application/octet-stream" {
78+
if fileExt != "" {
79+
fileMimeType = mimetype.Lookup(fileExt).String()
80+
}
81+
}
82+
}
83+
slog.Debug("Encrypting file",
84+
slog.Int("file-len", len(bytesSlice)),
85+
slog.String("mime-type", fileMimeType),
86+
)
87+
6088
// Do the encryption
6189
var encrypted *bytes.Buffer
6290
var err error
6391
if tdfType == TDF3 {
64-
encrypted, err = h.EncryptBytes(bytesSlice, values)
92+
encrypted, err = h.EncryptBytes(bytesSlice, values, fileMimeType)
6593
} else if tdfType == NANO {
6694
encrypted, err = h.EncryptNanoBytes(bytesSlice, values)
6795
} else {
@@ -111,6 +139,11 @@ func init() {
111139
[]string{},
112140
encryptCmd.GetDocFlag("attr").Description,
113141
)
142+
encryptCmd.Flags().String(
143+
encryptCmd.GetDocFlag("mime-type").Name,
144+
encryptCmd.GetDocFlag("mime-type").Default,
145+
encryptCmd.GetDocFlag("mime-type").Description,
146+
)
114147
encryptCmd.Flags().StringP(
115148
encryptCmd.GetDocFlag("tdf-type").Name,
116149
encryptCmd.GetDocFlag("tdf-type").Shorthand,

docs/man/encrypt/_index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ command:
1010
- name: attr
1111
shorthand: a
1212
description: Attribute value Fully Qualified Names (FQNs, i.e. 'https://example.com/attr/attr1/value/value1') to apply to the encrypted data.
13+
- name: mime-type
14+
description: The MIME type of the input data. If not provided, the MIME type is inferred from the input data.
1315
- name: tdf-type
1416
shorthand: t
1517
description: The type of tdf to encrypt as

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ require (
4545
github.com/dustin/go-humanize v1.0.1 // indirect
4646
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
4747
github.com/fsnotify/fsnotify v1.7.0 // indirect
48+
github.com/gabriel-vasile/mimetype v1.4.4 // indirect
4849
github.com/goccy/go-json v0.10.2 // indirect
4950
github.com/godbus/dbus/v5 v5.1.0 // indirect
5051
github.com/google/uuid v1.6.0 // indirect
@@ -91,7 +92,7 @@ require (
9192
go.uber.org/multierr v1.11.0 // indirect
9293
golang.org/x/crypto v0.23.0 // indirect
9394
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
94-
golang.org/x/net v0.24.0 // indirect
95+
golang.org/x/net v0.25.0 // indirect
9596
golang.org/x/sync v0.7.0 // indirect
9697
golang.org/x/sys v0.21.0 // indirect
9798
golang.org/x/text v0.15.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
9393
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
9494
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
9595
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
96+
github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I=
97+
github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s=
9698
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
9799
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
98100
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -299,6 +301,8 @@ golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
299301
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
300302
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
301303
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
304+
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
305+
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
302306
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
303307
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
304308
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

pkg/handlers/tdf.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@ import (
77
"github.com/opentdf/platform/sdk"
88
)
99

10-
func (h Handler) EncryptBytes(b []byte, values []string) (*bytes.Buffer, error) {
10+
func (h Handler) EncryptBytes(b []byte, values []string, mimeType string) (*bytes.Buffer, error) {
1111
var encrypted []byte
1212
enc := bytes.NewBuffer(encrypted)
1313

1414
// TODO: validate values are FQNs or return an error [https://github.com/opentdf/platform/issues/515]
1515
_, err := h.sdk.CreateTDF(enc, bytes.NewReader(b),
1616
sdk.WithDataAttributes(values...),
1717
sdk.WithKasInformation(sdk.KASInfo{
18-
URL: h.platformEndpoint,
19-
PublicKey: "",
20-
},
21-
),
18+
URL: h.platformEndpoint,
19+
}),
20+
sdk.WithMimeType(mimeType),
2221
)
2322
if err != nil {
2423
return nil, err

0 commit comments

Comments
 (0)