From 10c8ca62d2dd059c8922bb045ea2e20cd83cbd23 Mon Sep 17 00:00:00 2001 From: "Panagiotis \"Ivory\" Vasilopoulos" Date: Mon, 31 Mar 2025 16:33:47 +0000 Subject: [PATCH] refactor(cli): improve dump's temporary file handling (#7350) - 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). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7350 Reviewed-by: Gusted Co-authored-by: Panagiotis "Ivory" Vasilopoulos Co-committed-by: Panagiotis "Ivory" Vasilopoulos --- cmd/dump.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cmd/dump.go b/cmd/dump.go index ac72a2bb18..bc0b269924 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) } }()