Merge pull request #1020 from fluxcd/default-mode-archive-files
Apply default permission mode to all files/dirs in an artifact archive
This commit is contained in:
		
						commit
						2bd0b41da6
					
				|  | @ -49,6 +49,13 @@ import ( | |||
| 
 | ||||
| const GarbageCountLimit = 1000 | ||||
| 
 | ||||
| const ( | ||||
| 	// defaultFileMode is the permission mode applied to all files inside of an artifact archive.
 | ||||
| 	defaultFileMode int64 = 0o644 | ||||
| 	// defaultDirMode is the permission mode applied to all directories inside of an artifact archive.
 | ||||
| 	defaultDirMode int64 = 0o755 | ||||
| ) | ||||
| 
 | ||||
| // Storage manages artifacts
 | ||||
| type Storage struct { | ||||
| 	// BasePath is the local directory path where the source artifacts are stored.
 | ||||
|  | @ -409,6 +416,10 @@ func (s *Storage) Archive(artifact *sourcev1.Artifact, dir string, filter Archiv | |||
| 		header.ModTime = time.Time{} | ||||
| 		header.AccessTime = time.Time{} | ||||
| 		header.ChangeTime = time.Time{} | ||||
| 		header.Mode = defaultFileMode | ||||
| 		if fi.Mode().IsDir() { | ||||
| 			header.Mode = defaultDirMode | ||||
| 		} | ||||
| 
 | ||||
| 		if err := tw.WriteHeader(header); err != nil { | ||||
| 			return err | ||||
|  |  | |||
|  | @ -60,16 +60,16 @@ func TestStorageConstructor(t *testing.T) { | |||
| 
 | ||||
| // walks a tar.gz and looks for paths with the basename. It does not match
 | ||||
| // symlinks properly at this time because that's painful.
 | ||||
| func walkTar(tarFile string, match string, dir bool) (int64, bool, error) { | ||||
| func walkTar(tarFile string, match string, dir bool) (int64, int64, bool, error) { | ||||
| 	f, err := os.Open(tarFile) | ||||
| 	if err != nil { | ||||
| 		return 0, false, fmt.Errorf("could not open file: %w", err) | ||||
| 		return 0, 0, false, fmt.Errorf("could not open file: %w", err) | ||||
| 	} | ||||
| 	defer f.Close() | ||||
| 
 | ||||
| 	gzr, err := gzip.NewReader(f) | ||||
| 	if err != nil { | ||||
| 		return 0, false, fmt.Errorf("could not unzip file: %w", err) | ||||
| 		return 0, 0, false, fmt.Errorf("could not unzip file: %w", err) | ||||
| 	} | ||||
| 	defer gzr.Close() | ||||
| 
 | ||||
|  | @ -79,24 +79,24 @@ func walkTar(tarFile string, match string, dir bool) (int64, bool, error) { | |||
| 		if err == io.EOF { | ||||
| 			break | ||||
| 		} else if err != nil { | ||||
| 			return 0, false, fmt.Errorf("corrupt tarball reading header: %w", err) | ||||
| 			return 0, 0, false, fmt.Errorf("corrupt tarball reading header: %w", err) | ||||
| 		} | ||||
| 
 | ||||
| 		switch header.Typeflag { | ||||
| 		case tar.TypeDir: | ||||
| 			if header.Name == match && dir { | ||||
| 				return 0, true, nil | ||||
| 				return 0, header.Mode, true, nil | ||||
| 			} | ||||
| 		case tar.TypeReg: | ||||
| 			if header.Name == match { | ||||
| 				return header.Size, true, nil | ||||
| 				return header.Size, header.Mode, true, nil | ||||
| 			} | ||||
| 		default: | ||||
| 			// skip
 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return 0, false, nil | ||||
| 	return 0, 0, false, nil | ||||
| } | ||||
| 
 | ||||
| func TestStorage_Archive(t *testing.T) { | ||||
|  | @ -134,7 +134,7 @@ func TestStorage_Archive(t *testing.T) { | |||
| 			if !mustExist { | ||||
| 				name = name[1:] | ||||
| 			} | ||||
| 			s, exist, err := walkTar(storage.LocalPath(artifact), name, false) | ||||
| 			s, m, exist, err := walkTar(storage.LocalPath(artifact), name, false) | ||||
| 			if err != nil { | ||||
| 				t.Fatalf("failed reading tarball: %v", err) | ||||
| 			} | ||||
|  | @ -148,13 +148,16 @@ func TestStorage_Archive(t *testing.T) { | |||
| 					t.Errorf("tarball contained excluded file %q", name) | ||||
| 				} | ||||
| 			} | ||||
| 			if exist && m != defaultFileMode { | ||||
| 				t.Fatalf("%q mode %v != %v", name, m, defaultFileMode) | ||||
| 			} | ||||
| 		} | ||||
| 		for _, name := range dirs { | ||||
| 			mustExist := !(name[0:1] == "!") | ||||
| 			if !mustExist { | ||||
| 				name = name[1:] | ||||
| 			} | ||||
| 			_, exist, err := walkTar(storage.LocalPath(artifact), name, true) | ||||
| 			_, m, exist, err := walkTar(storage.LocalPath(artifact), name, true) | ||||
| 			if err != nil { | ||||
| 				t.Fatalf("failed reading tarball: %v", err) | ||||
| 			} | ||||
|  | @ -165,6 +168,10 @@ func TestStorage_Archive(t *testing.T) { | |||
| 					t.Errorf("tarball contained excluded file %q", name) | ||||
| 				} | ||||
| 			} | ||||
| 			if exist && m != defaultDirMode { | ||||
| 				t.Fatalf("%q mode %v != %v", name, m, defaultDirMode) | ||||
| 			} | ||||
| 
 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue