Skip to content

Commit 45b5e8e

Browse files
committed
Update proto, add file extension check
1 parent 1ba7c15 commit 45b5e8e

13 files changed

Lines changed: 48 additions & 31 deletions

File tree

flytecopilot/cmd/download_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ func TestDownloadOptions_Download(t *testing.T) {
162162
"csv_blob": {
163163
Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "csv", FileExtension: "csv"}}},
164164
},
165+
"invalid_extension_blob": {
166+
Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "/../../../invalid"}}},
167+
},
165168
},
166169
}
167170
d, err := proto.Marshal(iface)
@@ -207,10 +210,26 @@ func TestDownloadOptions_Download(t *testing.T) {
207210
},
208211
},
209212
}},
213+
"invalid_extension_blob": {Value: &core.Literal_Scalar{
214+
Scalar: &core.Scalar{
215+
Value: &core.Scalar_Blob{
216+
Blob: &core.Blob{
217+
Uri: blobLoc.String(),
218+
Metadata: &core.BlobMetadata{
219+
Type: &core.BlobType{
220+
Dimensionality: core.BlobType_SINGLE,
221+
Format: "xyz",
222+
FileExtension: "/../../../invalid",
223+
},
224+
},
225+
},
226+
},
227+
},
228+
}},
210229
},
211230
}))
212231
assert.NoError(t, dopts.Download(ctx), "Download Operation failed")
213-
assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "csv_blob.csv"}, collectFile(tmpDir))
232+
assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "csv_blob.csv", "invalid_extension_blob"}, collectFile(tmpDir))
214233
})
215234

216235
t.Run("primitiveAndMissingBlobInputs", func(t *testing.T) {

flytecopilot/data/download.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"path"
1010
"path/filepath"
1111
"reflect"
12+
"regexp"
1213
"strconv"
1314
"strings"
1415
"sync"
@@ -26,6 +27,8 @@ import (
2627
"github.com/flyteorg/flyte/flytestdlib/storage"
2728
)
2829

30+
var validFileExtensionRe = regexp.MustCompile(`^[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*$`)
31+
2932
type Downloader struct {
3033
format core.DataLoadingConfig_LiteralMapFormat
3134
store *storage.DataStore
@@ -42,16 +45,20 @@ type Downloader struct {
4245
// However, an input blob
4346
// `data: Annotated[FlyteFile["csv"], FileDownloadConfig(file_extension="csv")]`
4447
// should be written to "inputs/data.csv" (when FileExtension="csv" - new behavior).
45-
func resolveVarFilenames(vars *core.VariableMap) map[string]string {
48+
func resolveVarFilenames(ctx context.Context, vars *core.VariableMap) map[string]string {
4649
varFilenames := make(map[string]string, len(vars.GetVariables()))
4750
for varName, variable := range vars.GetVariables() {
4851
varType := variable.GetType()
4952
switch varType.GetType().(type) {
5053
case *core.LiteralType_Blob:
51-
if varType.GetBlob().GetFileExtension() == "" {
54+
ext := varType.GetBlob().GetFileExtension()
55+
if ext == "" {
56+
varFilenames[varName] = varName
57+
} else if !validFileExtensionRe.MatchString(ext) {
58+
logger.Warnf(ctx, "invalid file extension for variable %q [%q], ignoring...", varName, ext)
5259
varFilenames[varName] = varName
5360
} else {
54-
varFilenames[varName] = varName + "." + varType.GetBlob().GetFileExtension()
61+
varFilenames[varName] = varName + "." + ext
5562
}
5663
default:
5764
varFilenames[varName] = varName
@@ -565,7 +572,7 @@ func (d Downloader) DownloadInputs(ctx context.Context, vars *core.VariableMap,
565572
return errors.Wrapf(err, "failed to download input metadata message from remote store")
566573
}
567574

568-
varFilenames := resolveVarFilenames(vars)
575+
varFilenames := resolveVarFilenames(ctx, vars)
569576
varMap, lMap, err := d.RecursiveDownload(ctx, inputs, outputDir, varFilenames, true)
570577
if err != nil {
571578
return errors.Wrapf(err, "failed to download input variable from remote store")

flyteidl/clients/go/assets/admin.swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-es/flyteidl/core/types_pb.ts

Lines changed: 3 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-go/flyteidl/core/types.pb.go

Lines changed: 3 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)