check / check (push) Waiting to run
mfer ran the gpg binary to sign, export keys and verify, so signing and loading signed manifests failed wherever gpg is missing. It now uses github.com/ProtonMail/go-crypto/openpgp. --sign-key and MFER_SIGN_KEY name a file holding one OpenPGP secret key; a protected key's passphrase comes from MFER_SIGN_KEY_PASSPHRASE or a prompt on the terminal. Verification keeps the rules of the --require-signature fix: one primary key in the embedded block, counted from its packets so that keys the library skips count too, exactly one signature, made by that key or one of its subkeys, and signer equal to its fingerprint. Tests make their keys in process. Model: opus-5-5
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/urfave/cli/v3"
|
|
"sneak.berlin/go/mfer/internal/log"
|
|
"sneak.berlin/go/mfer/mfer"
|
|
)
|
|
|
|
func (mfa *CLIApp) listManifestOperation(ctx context.Context, cmd *cli.Command) error {
|
|
// Default to ErrorLevel for clean output
|
|
log.SetLevel(log.ErrorLevel)
|
|
|
|
longFormat := cmd.Bool("long")
|
|
print0 := cmd.Bool("print0")
|
|
|
|
pathOrURL, err := mfa.resolveManifestArg(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rc, err := mfa.openManifestReader(ctx, pathOrURL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer func() { _ = rc.Close() }()
|
|
|
|
manifest, err := mfer.NewManifestFromReader(rc)
|
|
if err != nil {
|
|
return fmt.Errorf("parse manifest: %w", err)
|
|
}
|
|
|
|
files := manifest.Files()
|
|
|
|
// Determine line ending
|
|
lineEnd := "\n"
|
|
if print0 {
|
|
lineEnd = "\x00"
|
|
}
|
|
|
|
for _, f := range files {
|
|
if longFormat {
|
|
// An entry may legitimately carry no mtime; render that as
|
|
// mtimeAbsent rather than as the Unix epoch.
|
|
mtimeStr := mtimeAbsent
|
|
if mtime, ok := entryMtime(f); ok {
|
|
mtimeStr = mtime.Format(time.RFC3339)
|
|
}
|
|
|
|
_, _ = fmt.Fprintf(mfa.Stdout, "%04o\t%d\t%s\t%s%s",
|
|
f.GetMode(), f.GetSize(), mtimeStr, f.GetPath(), lineEnd)
|
|
} else {
|
|
_, _ = fmt.Fprintf(mfa.Stdout, "%s%s", f.GetPath(), lineEnd)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|