From 72a78e64cc763532303a77ec81f0a5736a59281b Mon Sep 17 00:00:00 2001 From: "Panagiotis \"Ivory\" Vasilopoulos" Date: Wed, 26 Mar 2025 20:33:30 +0100 Subject: [PATCH] refactor(cli): improve dump's temporary file handling - Create temporary directory inside of a temporary directory (useful for a work-in-progress Landlock implementation, as we will not want to "whitelist" the entirety of the /tmp directory in our case, i.e. /tmp/forgejo-dump-133552095). - The database is always removed after dump is complete. - The temporary directory is removed if no temporary directory has been explicitly set (as in, created by Forgejo in /tmp or equivalent). --- cmd/dump.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cmd/dump.go b/cmd/dump.go index 14f9a00b58..f6924270cf 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -122,7 +122,6 @@ It can be used for backup and capture Forgejo server image to send to maintainer &cli.StringFlag{ Name: "tempdir", Aliases: []string{"t"}, - Value: os.TempDir(), Usage: "Temporary dir path", }, &cli.StringFlag{ @@ -288,18 +287,31 @@ func runDump(ctx *cli.Context) error { } tmpDir := ctx.String("tempdir") + if tmpDir == "" { + tmpDir, err = os.MkdirTemp("", "forgejo-dump-*") + if err != nil { + fatal("Failed to create temporary directory: %v", err) + } + + defer func() { + if err := util.Remove(tmpDir); err != nil { + log.Warn("Failed to remove temporary directory: %s: Error: %v", tmpDir, err) + } + }() + } + if _, err := os.Stat(tmpDir); os.IsNotExist(err) { fatal("Path does not exist: %s", tmpDir) } dbDump, err := os.CreateTemp(tmpDir, "forgejo-db.sql") if err != nil { - fatal("Failed to create tmp file: %v", err) + fatal("Failed to create temporary file: %v", err) } defer func() { _ = dbDump.Close() if err := util.Remove(dbDump.Name()); err != nil { - log.Warn("Failed to remove temporary file: %s: Error: %v", dbDump.Name(), err) + log.Warn("Failed to remove temporary database file: %s: Error: %v", dbDump.Name(), err) } }()