Skip to content

Commit

Permalink
fix: processing symlinks in directories (#453)
Browse files Browse the repository at this point in the history
* fix: proceed symlinks in contents as is

* Remove dead code

* fix: make OS independent test
  • Loading branch information
Felixoid committed Feb 12, 2022
1 parent 53a3fc2 commit c049e1c
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 97 deletions.
48 changes: 0 additions & 48 deletions deb/deb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"path/filepath"
"strconv"
Expand Down Expand Up @@ -647,41 +646,6 @@ func TestDebNoTriggersInControlIfNoneProvided(t *testing.T) {
require.False(t, tarContains(t, inflate(t, "gz", controlTarGz), "triggers"))
}

func TestSymlinkInFiles(t *testing.T) {
var (
symlinkTarget = "../testdata/whatever.conf"
packagedTarget = "/etc/fake/whatever.conf"
)

info := &nfpm.Info{
Name: "symlink-in-files",
Arch: "amd64",
Description: "This package's config references a file via symlink.",
Version: "1.0.0",
Overridables: nfpm.Overridables{
Contents: []*files.Content{
{
Source: symlinkTo(t, symlinkTarget),
Destination: packagedTarget,
},
},
},
}
err := info.Validate()
require.NoError(t, err)

realSymlinkTarget, err := ioutil.ReadFile(symlinkTarget)
require.NoError(t, err)

dataTarball, _, _, dataTarballName, err := createDataTarball(info)
require.NoError(t, err)

packagedSymlinkTarget := extractFileFromTar(t,
inflate(t, dataTarballName, dataTarball), packagedTarget)

require.Equal(t, string(realSymlinkTarget), string(packagedSymlinkTarget))
}

func TestSymlink(t *testing.T) {
var (
configFilePath = "/usr/share/doc/fake/fake.txt"
Expand Down Expand Up @@ -1224,18 +1188,6 @@ func readAndFormatAsDebChangelog(tb testing.TB, changelogFileName, packageName s
return strings.TrimSpace(debChangelog) + "\n"
}

func symlinkTo(tb testing.TB, fileName string) string {
tb.Helper()
target, err := filepath.Abs(fileName)
require.NoError(tb, err)

symlinkName := filepath.Join(tb.TempDir(), "symlink")
err = os.Symlink(target, symlinkName)
require.NoError(tb, err)

return files.ToNixPath(symlinkName)
}

func findDataTarball(tb testing.TB, arFile []byte) string {
tb.Helper()

Expand Down
8 changes: 6 additions & 2 deletions files/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,15 +177,19 @@ func ExpandContentGlobs(contents Contents, disableGlobbing bool) (files Contents

func appendGlobbedFiles(all Contents, globbed map[string]string, origFile *Content) (Contents, error) {
for src, dst := range globbed {
newFile := &Content{
newFile := (&Content{
Destination: ToNixPath(dst),
Source: ToNixPath(src),
Type: origFile.Type,
FileInfo: origFile.FileInfo,
Packager: origFile.Packager,
}).WithFileInfoDefaults()
if dst, err := os.Readlink(src); err == nil {
newFile.Source = dst
newFile.Type = "symlink"
}

all = append(all, newFile.WithFileInfoDefaults())
all = append(all, newFile)
}

return all, nil
Expand Down
62 changes: 62 additions & 0 deletions files/files_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,68 @@ contents:
require.Equal(t, f.FileInfo.MTime, ct)
}

func TestSymlinksInDirectory(t *testing.T) {
var config testStruct
dec := yaml.NewDecoder(strings.NewReader(`---
contents:
- src: testdata/symlinks/subdir
dst: /bla
- src: testdata/symlinks/link-1
dst: /
- src: testdata/symlinks/link-2
dst: /
- src: existent
dst: /bla/link-3
type: symlink
`))
dec.KnownFields(true)
err := dec.Decode(&config)
require.NoError(t, err)

config.Contents, err = files.ExpandContentGlobs(config.Contents, true)
require.NoError(t, err)
require.Len(t, config.Contents, 6)

// Nulling FileInfo to check equality between expected and result
for _, c := range config.Contents {
c.FileInfo = nil
}

expected := files.Contents{
{
Source: "testdata/symlinks/subdir/existent",
Destination: "/bla/existent",
Type: "",
},
{
Source: "non-existent",
Destination: "/bla/link-1",
Type: "symlink",
},
{
Source: "existent",
Destination: "/bla/link-2",
Type: "symlink",
},
{
Source: "existent",
Destination: "/bla/link-3",
Type: "symlink",
},
{
Source: "broken",
Destination: "/link-1",
Type: "symlink",
},
{
Source: "bla",
Destination: "/link-2",
Type: "symlink",
},
}
require.Equal(t, expected, config.Contents)
}

func TestRace(t *testing.T) {
var config testStruct
dec := yaml.NewDecoder(strings.NewReader(`---
Expand Down
1 change: 1 addition & 0 deletions files/testdata/symlinks/link-1
1 change: 1 addition & 0 deletions files/testdata/symlinks/link-2
Empty file.
1 change: 1 addition & 0 deletions files/testdata/symlinks/subdir/link-1
1 change: 1 addition & 0 deletions files/testdata/symlinks/subdir/link-2
47 changes: 0 additions & 47 deletions rpm/rpm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"io"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"testing"
Expand Down Expand Up @@ -604,40 +603,6 @@ func TestRPMNoChangelogTagsWithoutChangelogConfigured(t *testing.T) {
require.Error(t, err)
}

func TestSymlinkInFiles(t *testing.T) {
var (
symlinkTarget = "../testdata/whatever.conf"
packagedTarget = "/etc/fake/whatever.conf"
)

info := &nfpm.Info{
Name: "symlink-in-files",
Arch: "amd64",
Description: "This package's config references a file via symlink.",
Version: "1.0.0",
Overridables: nfpm.Overridables{
Contents: []*files.Content{
{
Source: symlinkTo(t, symlinkTarget),
Destination: packagedTarget,
},
},
},
}

realSymlinkTarget, err := ioutil.ReadFile(symlinkTarget)
require.NoError(t, err)

var rpmFileBuffer bytes.Buffer
err = Default.Package(info, &rpmFileBuffer)
require.NoError(t, err)

packagedSymlinkTarget, err := extractFileFromRpm(rpmFileBuffer.Bytes(), packagedTarget)
require.NoError(t, err)

require.Equal(t, string(realSymlinkTarget), string(packagedSymlinkTarget))
}

func TestSymlink(t *testing.T) {
var (
configFilePath = "/usr/share/doc/fake/fake.txt"
Expand Down Expand Up @@ -933,15 +898,3 @@ func extractFileHeaderFromRpm(rpm []byte, filename string) (*cpio.Cpio_newc_head

return nil, os.ErrNotExist
}

func symlinkTo(tb testing.TB, fileName string) string {
tb.Helper()
target, err := filepath.Abs(fileName)
require.NoError(tb, err)

symlinkName := path.Join(tb.TempDir(), "symlink")
err = os.Symlink(target, symlinkName)
require.NoError(tb, err)

return files.ToNixPath(symlinkName)
}

0 comments on commit c049e1c

Please sign in to comment.