]> git.apps.os.sepia.ceph.com Git - fscrypt.git/commitdiff
cmd/fscrypt: add FSCRYPT_ROOT_MNT environmental variable
authorEric Biggers <ebiggers@google.com>
Sat, 9 May 2020 21:04:47 +0000 (14:04 -0700)
committerEric Biggers <ebiggers@google.com>
Sat, 9 May 2020 21:04:47 +0000 (14:04 -0700)
Allow overriding the mountpoint where login protectors are stored by
setting the FSCRYPT_ROOT_MNT environmental variable.  The CLI tests need
this to avoid touching the real "/".

actions/protector.go
cmd/fscrypt/commands.go
cmd/fscrypt/fscrypt.go
cmd/fscrypt/protector.go
pam_fscrypt/run_fscrypt.go

index 4bd7c153efe7204ef1a25473ce1f71cf7909b1ea..dab9c274f087948828306ae06c1ec5076bf47dd1 100644 (file)
@@ -30,6 +30,10 @@ import (
        "github.com/google/fscrypt/util"
 )
 
+// LoginProtectorMountpoint is the mountpoint where login protectors are stored.
+// This can be overridden by the user of this package.
+var LoginProtectorMountpoint = "/"
+
 // Errors relating to Protectors
 var (
        ErrProtectorName        = errors.New("login protectors do not need a name")
index f84102e99609c29eda94dbf49d89204eb28e5cff..ec7558460b834a50dff10af1579f5b75c4584d38 100644 (file)
@@ -73,12 +73,13 @@ func setupAction(c *cli.Context) error {
                if err := createGlobalConfig(c.App.Writer, actions.ConfigFileLocation); err != nil {
                        return newExitError(c, err)
                }
-               if err := setupFilesystem(c.App.Writer, "/"); err != nil {
+               if err := setupFilesystem(c.App.Writer, actions.LoginProtectorMountpoint); err != nil {
                        if errors.Cause(err) != filesystem.ErrAlreadySetup {
                                return newExitError(c, err)
                        }
                        fmt.Fprintf(c.App.Writer,
-                               "Skipping creating /.fscrypt because it already exists.\n")
+                               "Skipping creating %s because it already exists.\n",
+                               filepath.Join(actions.LoginProtectorMountpoint, ".fscrypt"))
                }
        case 1:
                // Case (2) - filesystem setup
index 069cc969f91fe30ab4b48e078ae4b6d66c6a63ee..bbe16bb22ac07bafecff7ae319b3b31ed8d4b6dd 100644 (file)
@@ -46,6 +46,9 @@ func main() {
        if conffile := os.Getenv("FSCRYPT_CONF"); conffile != "" {
                actions.ConfigFileLocation = conffile
        }
+       if rootmnt := os.Getenv("FSCRYPT_ROOT_MNT"); rootmnt != "" {
+               actions.LoginProtectorMountpoint = rootmnt
+       }
 
        // Create our command line application
        app := cli.NewApp()
index 25f198499259f54fc8bbd0215bf373273e5d5545..6d35d9e256de4292946f044e6957b13b795b56d9 100644 (file)
@@ -51,8 +51,10 @@ func createProtectorFromContext(ctx *actions.Context) (*actions.Protector, error
 
        // We only want to create new login protectors on the root filesystem.
        // So we make a new context if necessary.
-       if ctx.Config.Source == metadata.SourceType_pam_passphrase && ctx.Mount.Path != "/" {
-               log.Printf("creating login protector on %q instead of %q", "/", ctx.Mount.Path)
+       if ctx.Config.Source == metadata.SourceType_pam_passphrase &&
+               ctx.Mount.Path != actions.LoginProtectorMountpoint {
+               log.Printf("creating login protector on %q instead of %q",
+                       actions.LoginProtectorMountpoint, ctx.Mount.Path)
                if ctx, err = modifiedContext(ctx); err != nil {
                        return nil, err
                }
@@ -84,7 +86,7 @@ func expandedProtectorOptions(ctx *actions.Context) ([]*actions.ProtectorOption,
        }
 
        // Do nothing different if we are at the root, or cannot load the root.
-       if ctx.Mount.Path == "/" {
+       if ctx.Mount.Path == actions.LoginProtectorMountpoint {
                return options, nil
        }
        if ctx, err = modifiedContext(ctx); err != nil {
@@ -117,10 +119,10 @@ func expandedProtectorOptions(ctx *actions.Context) ([]*actions.ProtectorOption,
        return options, nil
 }
 
-// modifiedContext returns a copy of ctx with the mountpoint replaced by that of
-// the root filesystem.
+// modifiedContext returns a copy of ctx with the mountpoint replaced by
+// LoginProtectorMountpoint.
 func modifiedContext(ctx *actions.Context) (*actions.Context, error) {
-       mnt, err := filesystem.GetMount("/")
+       mnt, err := filesystem.GetMount(actions.LoginProtectorMountpoint)
        if err != nil {
                return nil, err
        }
index 3d0acb13dc540304278bc7948c8f7d7ae2671e48..ef7ff92401570210f46ff126f9abeb2386c88d75 100644 (file)
@@ -132,7 +132,8 @@ func setupLogging(args map[string]bool) io.Writer {
 // one exists. This protector descriptor (if found) will be cached in the pam
 // data, under descriptorLabel.
 func loginProtector(handle *pam.Handle) (*actions.Protector, error) {
-       ctx, err := actions.NewContextFromMountpoint("/", handle.PamUser)
+       ctx, err := actions.NewContextFromMountpoint(actions.LoginProtectorMountpoint,
+               handle.PamUser)
        if err != nil {
                return nil, err
        }