From 6bee4ed147a410c1a6fb3ebef8dfa5e737bc415e Mon Sep 17 00:00:00 2001 From: Deluan Date: Tue, 16 May 2023 18:34:15 -0400 Subject: [PATCH] Sanitize filenames inside zip files. Fixes #1763 --- core/archiver.go | 9 ++++++--- core/archiver_test.go | 14 +++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/archiver.go b/core/archiver.go index d2216b4e..00cc882b 100644 --- a/core/archiver.go +++ b/core/archiver.go @@ -86,7 +86,7 @@ func (a *archiver) albumFilename(mf model.MediaFile, format string, isMultDisc b if isMultDisc { file = fmt.Sprintf("Disc %02d/%s", mf.DiscNumber, file) } - return fmt.Sprintf("%s/%s", mf.Album, file) + return fmt.Sprintf("%s/%s", sanitizeName(mf.Album), file) } func (a *archiver) ZipShare(ctx context.Context, id string, out io.Writer) error { @@ -130,8 +130,11 @@ func (a *archiver) playlistFilename(mf model.MediaFile, format string, idx int) if format != "" && format != "raw" { ext = format } - file := fmt.Sprintf("%02d - %s - %s.%s", idx+1, mf.Artist, mf.Title, ext) - return file + return fmt.Sprintf("%02d - %s - %s.%s", idx+1, sanitizeName(mf.Artist), sanitizeName(mf.Title), ext) +} + +func sanitizeName(target string) string { + return strings.ReplaceAll(target, "/", "_") } func (a *archiver) addFileToZip(ctx context.Context, z *zip.Writer, mf model.MediaFile, format string, bitrate int, filename string) error { diff --git a/core/archiver_test.go b/core/archiver_test.go index 4e0f91b2..6c95b7ba 100644 --- a/core/archiver_test.go +++ b/core/archiver_test.go @@ -33,8 +33,8 @@ var _ = Describe("Archiver", func() { Context("ZipAlbum", func() { It("zips an album correctly", func() { mfs := model.MediaFiles{ - {Path: "test_data/01 - track1.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album 1", DiscNumber: 1}, - {Path: "test_data/02 - track2.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album 1", DiscNumber: 1}, + {Path: "test_data/01 - track1.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album/Promo", DiscNumber: 1}, + {Path: "test_data/02 - track2.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album/Promo", DiscNumber: 1}, } mfRepo := &mockMediaFileRepository{} @@ -44,7 +44,7 @@ var _ = Describe("Archiver", func() { }}).Return(mfs, nil) ds.On("MediaFile", mock.Anything).Return(mfRepo) - ms.On("DoStream", mock.Anything, mock.Anything, "mp3", 128).Return(io.NopCloser(strings.NewReader("test")), nil).Times(2) + ms.On("DoStream", mock.Anything, mock.Anything, "mp3", 128).Return(io.NopCloser(strings.NewReader("test")), nil).Times(3) out := new(bytes.Buffer) err := arch.ZipAlbum(context.Background(), "1", "mp3", 128, out) @@ -54,8 +54,8 @@ var _ = Describe("Archiver", func() { Expect(err).To(BeNil()) Expect(len(zr.File)).To(Equal(2)) - Expect(zr.File[0].Name).To(Equal("Album 1/01 - track1.mp3")) - Expect(zr.File[1].Name).To(Equal("Album 1/02 - track2.mp3")) + Expect(zr.File[0].Name).To(Equal("Album_Promo/01 - track1.mp3")) + Expect(zr.File[1].Name).To(Equal("Album_Promo/02 - track2.mp3")) }) }) @@ -123,7 +123,7 @@ var _ = Describe("Archiver", func() { Context("ZipPlaylist", func() { It("zips a playlist correctly", func() { tracks := []model.PlaylistTrack{ - {MediaFile: model.MediaFile{Path: "test_data/01 - track1.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album 1", DiscNumber: 1, Artist: "Artist 1", Title: "track1"}}, + {MediaFile: model.MediaFile{Path: "test_data/01 - track1.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album 1", DiscNumber: 1, Artist: "AC/DC", Title: "track1"}}, {MediaFile: model.MediaFile{Path: "test_data/02 - track2.mp3", Suffix: "mp3", AlbumID: "1", Album: "Album 1", DiscNumber: 1, Artist: "Artist 2", Title: "track2"}}, } @@ -146,7 +146,7 @@ var _ = Describe("Archiver", func() { Expect(err).To(BeNil()) Expect(len(zr.File)).To(Equal(2)) - Expect(zr.File[0].Name).To(Equal("01 - Artist 1 - track1.mp3")) + Expect(zr.File[0].Name).To(Equal("01 - AC_DC - track1.mp3")) Expect(zr.File[1].Name).To(Equal("02 - Artist 2 - track2.mp3")) }) })