//go:build !windows package version import ( "os" "path/filepath" "testing" "gitgud.io/mike/mpv-manager/pkg/config" "github.com/stretchr/testify/require" ) func TestJournalKeyRejectsReadAccessByOtherUsers(t *testing.T) { home := t.TempDir() t.Setenv("HOME", home) t.Setenv("XDG_CONFIG_HOME", home) _, err := updateJournalAuthenticationKey(true) require.NoError(t, err) path := filepath.Join(config.GetConfigDir(), updateJournalKeyName) require.NoError(t, os.Chmod(path, 0644)) _, err = updateJournalAuthenticationKey(false) require.ErrorContains(t, err, "private to its owner") } func TestRecoveryRejectsSharedSiblingDirectoryBeforeBackupExecution(t *testing.T) { prepared, primary, _, _, _ := prepareTransactionFixture(t, false) journal, err := loadUpdateJournal(prepared.JournalPath) require.NoError(t, err) journal.State = UpdateTransactionApplying journal.Targets[0].Applied = true journal.Targets[0].OriginalSize = 0 journal.Targets[0].OriginalHash = "" journal.Targets[0].OriginalIdentity = BinaryIdentity{} marker := filepath.Join(filepath.Dir(primary), "executed") require.NoError(t, os.WriteFile(journal.Targets[0].BackupPath, []byte("#!/bin/sh\n: > '"+marker+"'\n"), 0755)) require.NoError(t, writeUpdateJournal(prepared.JournalPath, journal)) require.NoError(t, prepared.lock.release()) parent := filepath.Dir(primary) require.NoError(t, os.Chmod(parent, 0777)) t.Cleanup(func() { _ = os.Chmod(parent, 0700) }) err = recoverTransactionsLocked(primary) require.ErrorContains(t, err, "untrusted update recovery directory") require.NoFileExists(t, marker) require.FileExists(t, primary) require.FileExists(t, journal.Targets[0].BackupPath) } func TestRecoveryRejectsWritableAndLinkedJournal(t *testing.T) { prepared, _, _, _, _ := prepareTransactionFixture(t, false) require.NoError(t, os.Chmod(prepared.JournalPath, 0666)) _, err := loadUpdateJournal(prepared.JournalPath) require.ErrorContains(t, err, "untrusted update recovery file") require.NoError(t, os.Chmod(prepared.JournalPath, 0600)) actual := prepared.JournalPath + ".original" require.NoError(t, os.Rename(prepared.JournalPath, actual)) require.NoError(t, os.Symlink(actual, prepared.JournalPath)) _, err = loadUpdateJournal(prepared.JournalPath) require.ErrorContains(t, err, "not regular") } func TestRecoveryRejectsForeignOwnedJournal(t *testing.T) { if os.Geteuid() != 0 { t.Skip("ownership fixture requires chown capability") } prepared, _, _, _, _ := prepareTransactionFixture(t, false) require.NoError(t, os.Chown(prepared.JournalPath, 65534, -1)) _, err := loadUpdateJournal(prepared.JournalPath) require.ErrorContains(t, err, "untrusted update recovery file") }