diff --git a/internal/panels/preview/preview.go b/internal/panels/preview/preview.go index 9ef8dd3c..502f1624 100644 --- a/internal/panels/preview/preview.go +++ b/internal/panels/preview/preview.go @@ -6,6 +6,7 @@ package preview import ( "bytes" "context" + "crypto/sha256" "fmt" "os" "path/filepath" @@ -770,7 +771,7 @@ func (p *Preview) loadFileCmd(path string) tea.Cmd { mime := mimetype.Detect(header) if !isTextMIME(mime.String()) { result.isBinary = true - result.lines = append(buildMetadataLines(path, info), "", "Type: "+mime.String()) + result.lines = buildBinaryMetadataLines(path, info, mime.String(), nil) return result } // Read file content @@ -783,7 +784,7 @@ func (p *Preview) loadFileCmd(path string) tea.Cmd { // check but contain null bytes (polyglot / binary-after-header). if bytes.ContainsRune(data, 0) { result.isBinary = true - result.lines = append(buildMetadataLines(path, info), "", "Type: binary (null bytes detected)") + result.lines = buildBinaryMetadataLines(path, info, "binary (null bytes detected)", data) return result } // Normalize line endings so \r doesn't corrupt rendering @@ -1098,6 +1099,20 @@ func buildMetadataLines(path string, info os.FileInfo) []string { } } +func buildBinaryMetadataLines(path string, info os.FileInfo, mimeType string, data []byte) []string { + lines := buildMetadataLines(path, info) + if len(data) == 0 { + var err error + data, err = os.ReadFile(path) + if err != nil { + return append(lines, "", "Type: "+mimeType) + } + } + sum := sha256.Sum256(data) + lines = append(lines, "SHA-256: "+fmt.Sprintf("%x", sum)) + return append(lines, "", "Type: "+mimeType) +} + // --- Scrolling --- func (p *Preview) scrollDown(n int) { p.scrollY += n diff --git a/internal/panels/preview/preview_test.go b/internal/panels/preview/preview_test.go index e2b40402..ca366642 100644 --- a/internal/panels/preview/preview_test.go +++ b/internal/panels/preview/preview_test.go @@ -2,6 +2,8 @@ package preview import ( "context" + "crypto/sha256" + "fmt" "os" "path/filepath" "strings" @@ -324,6 +326,10 @@ func TestBinaryFileDetection(t *testing.T) { view := p.View(60, 20) assert.Contains(t, view, "Binary file") assert.Contains(t, view, "image.png") + assert.Contains(t, view, "Type: image/png") + data, err := os.ReadFile(path) + require.NoError(t, err) + assert.Contains(t, strings.Join(p.lines, "\n"), "SHA-256: "+fmt.Sprintf("%x", sha256.Sum256(data))) } func TestLargeFileRejection(t *testing.T) { @@ -362,6 +368,7 @@ func TestLargeFileShowsMetadata(t *testing.T) { assert.Contains(t, view, "200 B") assert.Contains(t, view, "Mode:") assert.Contains(t, view, "Modified:") + assert.NotContains(t, view, "SHA-256:") } func TestMaxFileSizeZeroDisablesCheck(t *testing.T) {