diff --git a/Packaging.Targets.Tests/ArchiveBuilderTests.cs b/Packaging.Targets.Tests/ArchiveBuilderTests.cs index 0556ca2..f6a1795 100644 --- a/Packaging.Targets.Tests/ArchiveBuilderTests.cs +++ b/Packaging.Targets.Tests/ArchiveBuilderTests.cs @@ -92,7 +92,7 @@ namespace Packaging.Targets.Tests Assert.Equal(string.Empty, script.LinkTo); // -rwxr-xr-x - Assert.Equal(LinuxFileMode.S_IXOTH | LinuxFileMode.S_IROTH | LinuxFileMode.S_IXGRP | LinuxFileMode.S_IRGRP | LinuxFileMode.S_IXUSR | LinuxFileMode.S_IWUSR | LinuxFileMode.S_IRUSR, script.Mode); + Assert.Equal(LinuxFileMode.S_IXOTH | LinuxFileMode.S_IROTH | LinuxFileMode.S_IXGRP | LinuxFileMode.S_IRGRP | LinuxFileMode.S_IXUSR | LinuxFileMode.S_IWUSR | LinuxFileMode.S_IRUSR | LinuxFileMode.S_IFREG, script.Mode); Assert.Equal("root", script.Owner); Assert.False(script.RemoveOnUninstall); Assert.Equal(Path.Combine("archive", "script.sh"), script.SourceFilename); diff --git a/Packaging.Targets/ArchiveBuilder.cs b/Packaging.Targets/ArchiveBuilder.cs index 9c82370..23b6a0f 100644 --- a/Packaging.Targets/ArchiveBuilder.cs +++ b/Packaging.Targets/ArchiveBuilder.cs @@ -359,10 +359,22 @@ namespace Packaging.Targets if (overridenFileMode != null) { - // We expect the user to specify the file mode in its octal representation. + // We expect the user to specify the file mode in its octal representation, + // such as 755. We don't expect users to specify the higher bits (e.g. + // S_IFREG). try { mode = (LinuxFileMode)Convert.ToUInt32(overridenFileMode, 8); + + LinuxFileMode fileType = mode & LinuxFileMode.FileTypeMask; + + if (fileType != LinuxFileMode.None && fileType != LinuxFileMode.S_IFREG) + { + this.Log.LogWarning($"An invalid file type of '{fileType}' has been set for file '{name}'. The file type will be reset to IFREG."); + } + + // Override the file type mask and hardcode it to S_IFREG. + mode = (mode & ~LinuxFileMode.FileTypeMask) | LinuxFileMode.S_IFREG; } catch (Exception) { @@ -375,7 +387,7 @@ namespace Packaging.Targets FileSize = (uint)fileStream.Length, Group = fileMetadata.GetGroup(), Owner = fileMetadata.GetOwner(), - Modified = File.GetLastAccessTimeUtc(entry), + Modified = File.GetLastWriteTimeUtc(entry), SourceFilename = entry, TargetPath = name, Sha256 = hash, diff --git a/Packaging.Targets/IO/LinuxFileMode.cs b/Packaging.Targets/IO/LinuxFileMode.cs index 1579b8b..3e3144c 100644 --- a/Packaging.Targets/IO/LinuxFileMode.cs +++ b/Packaging.Targets/IO/LinuxFileMode.cs @@ -9,6 +9,11 @@ namespace Packaging.Targets.IO [Flags] public enum LinuxFileMode : ushort { + /// + /// No file mode has been specified. + /// + None = 0, + /// /// Set user ID on execution /// diff --git a/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj b/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj index 7f45bb1..c1aca1e 100644 --- a/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj +++ b/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj @@ -20,5 +20,11 @@ + + + + /etc/dotnet-packaging/LICENSE + diff --git a/molecule/framework-dependent/molecule/default/tests/test_default.py b/molecule/framework-dependent/molecule/default/tests/test_default.py index 11a6806..390befb 100644 --- a/molecule/framework-dependent/molecule/default/tests/test_default.py +++ b/molecule/framework-dependent/molecule/default/tests/test_default.py @@ -26,3 +26,8 @@ def test_hidden_file_is_ignored(host): def test_empty_file_is_ignored(host): assert \ not host.file("/usr/share/framework-dependent-app/empty").exists + + +def test_license_is_deployed_with_permissions_and_sticky_bit(host): + assert host.file("/etc/dotnet-packaging/LICENSE").exists + assert host.file("/etc/dotnet-packaging/LICENSE").mode == 0o1755 diff --git a/molecule/self-contained/molecule/default/tests/test_default.py b/molecule/self-contained/molecule/default/tests/test_default.py index 66ef4d3..c56c698 100644 --- a/molecule/self-contained/molecule/default/tests/test_default.py +++ b/molecule/self-contained/molecule/default/tests/test_default.py @@ -26,3 +26,8 @@ def test_hidden_file_is_ignored(host): def test_empty_file_is_ignored(host): assert \ not host.file("/usr/share/self-contained-app/empty").exists + + +def test_license_is_deployed_with_permissions_and_sticky_bit(host): + assert host.file("/etc/dotnet-packaging/LICENSE").exists + assert host.file("/etc/dotnet-packaging/LICENSE").mode == 0o1755 diff --git a/molecule/self-contained/self-contained-app/self-contained-app.csproj b/molecule/self-contained/self-contained-app/self-contained-app.csproj index 970fb85..972604a 100644 --- a/molecule/self-contained/self-contained-app/self-contained-app.csproj +++ b/molecule/self-contained/self-contained-app/self-contained-app.csproj @@ -21,5 +21,12 @@ + + + + /etc/dotnet-packaging/LICENSE +