Skip to content

Commit f64a311

Browse files
committed
fix: improve umask tests and documentation
Signed-off-by: Carlos Alexandro Becker <[email protected]>
1 parent 858b78b commit f64a311

File tree

5 files changed

+73
-46
lines changed

5 files changed

+73
-46
lines changed

files/files.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ func (c *Content) WithFileInfoDefaults(umask fs.FileMode) *Content {
144144
cc.FileInfo.MTime = info.ModTime()
145145
}
146146
if cc.FileInfo.Mode == 0 {
147-
fmt.Println("files.go:147", info.Mode().String(), (info.Mode() & ^umask).String())
148147
cc.FileInfo.Mode = info.Mode() &^ umask
149148
}
150149
cc.FileInfo.Size = info.Size()
@@ -463,7 +462,6 @@ func addTree(all map[string]*Content, tree *Content, umask os.FileMode) error {
463462

464463
c.Type = TypeDir
465464
c.Destination = NormalizeAbsoluteDirPath(destination)
466-
fmt.Println("files.go:446", info.Mode().String(), (info.Mode() &^ umask).String())
467465
c.FileInfo = &ContentFileInfo{
468466
Owner: "root",
469467
Group: "root",
@@ -483,7 +481,6 @@ func addTree(all map[string]*Content, tree *Content, umask os.FileMode) error {
483481
c.Source = path
484482
c.Destination = NormalizeAbsoluteFilePath(destination)
485483
c.Type = TypeFile
486-
fmt.Println("files.go:486", d.Type().String(), (d.Type() &^ umask).String())
487484
c.FileInfo = &ContentFileInfo{
488485
Mode: d.Type() &^ umask,
489486
}

files/files_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package files_test
22

33
import (
44
"os"
5+
"path/filepath"
56
"strconv"
67
"strings"
78
"sync"
@@ -44,6 +45,10 @@ contents:
4445
}
4546

4647
func TestDeepPathsWithGlobAndUmask(t *testing.T) {
48+
path := filepath.Join(t.TempDir(), "foo", "bar", "zaz", "file.txt")
49+
// create a bunch of files with bad permissions
50+
require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o777))
51+
require.NoError(t, os.WriteFile(path, nil, 0o777))
4752
var config testStruct
4853
dec := yaml.NewDecoder(strings.NewReader(`---
4954
contents:
@@ -53,12 +58,14 @@ contents:
5358
mode: 0644
5459
mtime: 2008-01-02T15:04:05Z
5560
- src: testdata/deep-paths/
56-
dst: /bla
61+
dst: /bar
62+
- src: ` + path + `
63+
dst: /foo/file.txt
5764
`))
5865
dec.KnownFields(true)
5966
err := dec.Decode(&config)
6067
require.NoError(t, err)
61-
require.Len(t, config.Contents, 2)
68+
require.Len(t, config.Contents, 3)
6269
parsedContents, err := files.PrepareForPackager(config.Contents, 0o113, "", false)
6370
require.NoError(t, err)
6471
for _, c := range parsedContents {
@@ -70,7 +77,10 @@ contents:
7077
require.Equal(t, "/bla/multi-nested/subdir/c.txt", c.Destination)
7178
require.Equal(t, "-rw-r--r--", c.Mode().String())
7279
case "testdata/deep-paths/nested1/nested2/a.txt":
73-
require.Equal(t, "/bla/nested1/nested2/a.txt", c.Destination)
80+
require.Equal(t, "/bar/nested1/nested2/a.txt", c.Destination)
81+
require.Equal(t, "-rw-rw-r--", c.Mode().String())
82+
case path:
83+
require.Equal(t, "/foo/file.txt", c.Destination)
7484
require.Equal(t, "-rw-rw-r--", c.Mode().String())
7585
}
7686
}

nfpm.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,7 @@ func ParseWithEnvMapping(in io.Reader, mapping func(string) string) (config Conf
7575
}
7676

7777
config.expandEnvVars()
78-
79-
WithDefaults(&config.Info)
80-
78+
config.Info = WithDefaults(config.Info)
8179
return config, nil
8280
}
8381

@@ -471,7 +469,7 @@ func Validate(info *Info) (err error) {
471469
}
472470

473471
// WithDefaults set some sane defaults into the given Info.
474-
func WithDefaults(info *Info) *Info {
472+
func WithDefaults(info Info) Info {
475473
if info.Platform == "" {
476474
info.Platform = "linux"
477475
}
@@ -484,6 +482,9 @@ func WithDefaults(info *Info) *Info {
484482
if info.Version == "" {
485483
info.Version = "v0.0.0-rc0"
486484
}
485+
if info.Umask == 0 {
486+
info.Umask = 0o02
487+
}
487488

488489
switch info.VersionSchema {
489490
case "none":

nfpm_test.go

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -37,81 +37,95 @@ func TestGet(t *testing.T) {
3737
}
3838

3939
func TestDefaultsVersion(t *testing.T) {
40-
info := &nfpm.Info{
40+
info := nfpm.WithDefaults(nfpm.Info{
4141
Version: "v1.0.0",
4242
VersionSchema: "semver",
43-
}
44-
info = nfpm.WithDefaults(info)
43+
})
4544
require.NotEmpty(t, info.Platform)
4645
require.Equal(t, "1.0.0", info.Version)
4746
require.Equal(t, "", info.Release)
4847
require.Equal(t, "", info.Prerelease)
4948

50-
info = &nfpm.Info{
49+
info = nfpm.WithDefaults(nfpm.Info{
5150
Version: "v1.0.0-rc1",
52-
}
53-
info = nfpm.WithDefaults(info)
51+
})
5452
require.Equal(t, "1.0.0", info.Version)
5553
require.Equal(t, "", info.Release)
5654
require.Equal(t, "rc1", info.Prerelease)
5755

58-
info = &nfpm.Info{
56+
info = nfpm.WithDefaults(nfpm.Info{
5957
Version: "v1.0.0-beta1",
60-
}
61-
info = nfpm.WithDefaults(info)
58+
})
6259
require.Equal(t, "1.0.0", info.Version)
6360
require.Equal(t, "", info.Release)
6461
require.Equal(t, "beta1", info.Prerelease)
6562

66-
info = &nfpm.Info{
63+
info = nfpm.WithDefaults(nfpm.Info{
6764
Version: "v1.0.0-1",
6865
Release: "2",
6966
Prerelease: "beta1",
70-
}
71-
info = nfpm.WithDefaults(info)
67+
})
7268
require.Equal(t, "1.0.0", info.Version)
7369
require.Equal(t, "2", info.Release)
7470
require.Equal(t, "beta1", info.Prerelease)
7571

76-
info = &nfpm.Info{
72+
info = nfpm.WithDefaults(nfpm.Info{
7773
Version: "v1.0.0-1+xdg2",
7874
Release: "2",
7975
Prerelease: "beta1",
80-
}
81-
info = nfpm.WithDefaults(info)
76+
})
8277
require.Equal(t, "1.0.0", info.Version)
8378
require.Equal(t, "2", info.Release)
8479
require.Equal(t, "beta1", info.Prerelease)
8580

86-
info = &nfpm.Info{
81+
info = nfpm.WithDefaults(nfpm.Info{
8782
Version: "this.is.my.version",
8883
VersionSchema: "none",
8984
Release: "2",
9085
Prerelease: "beta1",
91-
}
92-
info = nfpm.WithDefaults(info)
86+
})
9387
require.Equal(t, "this.is.my.version", info.Version)
9488
require.Equal(t, "2", info.Release)
9589
require.Equal(t, "beta1", info.Prerelease)
9690
}
9791

9892
func TestDefaults(t *testing.T) {
99-
info := &nfpm.Info{
100-
Platform: "darwin",
101-
Version: "2.4.1",
102-
Description: "no description given",
103-
}
104-
got := nfpm.WithDefaults(info)
105-
require.Equal(t, info, got)
93+
t.Run("all given", func(t *testing.T) {
94+
info := nfpm.Info{
95+
Platform: "darwin",
96+
Version: "2.4.1",
97+
Description: "no description given",
98+
Arch: "arm64",
99+
Overridables: nfpm.Overridables{
100+
Umask: 0o112,
101+
},
102+
}
103+
got := nfpm.WithDefaults(info)
104+
require.Equal(t, info, got)
105+
})
106+
t.Run("none given", func(t *testing.T) {
107+
got := nfpm.WithDefaults(nfpm.Info{})
108+
require.Equal(t, nfpm.Info{
109+
Platform: "linux",
110+
Arch: "amd64",
111+
Version: "0.0.0",
112+
Prerelease: "rc0",
113+
Description: "no description given",
114+
Overridables: nfpm.Overridables{
115+
Umask: 0o002,
116+
},
117+
}, got)
118+
})
106119
}
107120

108121
func TestPrepareForPackager(t *testing.T) {
109122
t.Run("dirs", func(t *testing.T) {
110-
info := nfpm.Info{
123+
info := nfpm.WithDefaults(nfpm.Info{
111124
Name: "as",
112125
Arch: "asd",
113126
Version: "1.2.3",
114127
Overridables: nfpm.Overridables{
128+
Umask: 0o032,
115129
Contents: []*files.Content{
116130
{
117131
Destination: "/usr/share/test",
@@ -127,7 +141,7 @@ func TestPrepareForPackager(t *testing.T) {
127141
},
128142
},
129143
},
130-
}
144+
})
131145
require.NoError(t, nfpm.PrepareForPackager(&info, ""))
132146
require.Len(t, info.Overridables.Contents, 5)
133147
asdFile := info.Overridables.Contents[0]

www/docs/configuration.md

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,15 +195,6 @@ contents:
195195
dst: /etc/bar.conf
196196
type: config|noreplace
197197

198-
# Umask to be used on files without explicit mode set.
199-
#
200-
# By default, nFPM will use the mode of the original file in the file system.
201-
# This may lead to issues if these files are checkout out in Git, for example,
202-
# as it won't keep all the permissions on fresh checkouts.
203-
#
204-
# 0o002 would remove the world-writable permission, for example.
205-
umask: 0o002
206-
207198
# These files are not actually present in the package, but the file names
208199
# are added to the package header. From the RPM directives documentation:
209200
#
@@ -261,6 +252,20 @@ umask: 0o002
261252
file_info:
262253
mode: 0700
263254

255+
# Umask to be used on files without explicit mode set.
256+
#
257+
# By default, nFPM will inherit the mode of the original file that's being
258+
# added.
259+
# This may lead to issues if these files are checkout out in Git, for example,
260+
# as it won't keep all the permissions on fresh checkouts, or if the local
261+
# system has a problematic umask setting.
262+
#
263+
# This setting allows to set the umask for all files that are added to the
264+
# package without a specific file_info.mode set.
265+
#
266+
# Default: 0o002 (will remove world-writable permissions)
267+
umask: 0o002
268+
264269
# Scripts to run at specific stages. (overridable)
265270
scripts:
266271
preinstall: ./scripts/preinstall.sh

0 commit comments

Comments
 (0)