aboutsummaryrefslogtreecommitdiff
path: root/cmd/fscrypt/commands.go
diff options
context:
space:
mode:
authorJoe Richey joerichey@google.com <joerichey@google.com>2017-06-21 12:50:11 -0700
committerJoe Richey joerichey@google.com <joerichey@google.com>2017-06-28 15:15:21 -0700
commit6211297a44c81f867ec9ac420672215675bae587 (patch)
tree56bd9040ca4aa85b8e3c0111c0f4c97abdedc86b /cmd/fscrypt/commands.go
parent8392dfe41f76538aec79231855fd9a952963bdf8 (diff)
cmd/fscrypt: commands to add/remove protectors
This commit adds in the "fscrypt metadata add-protector-to-policy" and the "fscrypt metadata remove-protector-from-policy" subcommands. These commands allow for the creating of policies protected by multiple protectors. Change-Id: Id7e6c057448d15757c838a82d487a1b9806f585d
Diffstat (limited to 'cmd/fscrypt/commands.go')
-rw-r--r--cmd/fscrypt/commands.go107
1 files changed, 106 insertions, 1 deletions
diff --git a/cmd/fscrypt/commands.go b/cmd/fscrypt/commands.go
index 51aa3ae..cbf62ed 100644
--- a/cmd/fscrypt/commands.go
+++ b/cmd/fscrypt/commands.go
@@ -432,7 +432,8 @@ var Metadata = cli.Command{
(4) Changing the protector protecting a policy using the
"add-protector-to-policy" and "remove-protector-from-policy"
subcommands.`,
- Subcommands: []cli.Command{createMetadata, destoryMetadata, changePassphrase, dumpMetadata},
+ Subcommands: []cli.Command{createMetadata, destoryMetadata, changePassphrase,
+ addProtectorToPolicy, removeProtectorFromPolicy, dumpMetadata},
}
var createMetadata = cli.Command{
@@ -680,6 +681,110 @@ func changePassphraseAction(c *cli.Context) error {
return nil
}
+var addProtectorToPolicy = cli.Command{
+ Name: "add-protector-to-policy",
+ ArgsUsage: fmt.Sprintf("%s %s", shortDisplay(protectorFlag), shortDisplay(policyFlag)),
+ Usage: "start protecting a policy with some protector",
+ Description: `This command changes the specified policy to be
+ protected with the specified protector. This means that any
+ directories using this policy will now be accessible with this
+ protector. This command will fail if the policy is already
+ protected with this protector.`,
+ Flags: []cli.Flag{protectorFlag, policyFlag, unlockWithFlag, keyFileFlag},
+ Action: addProtectorAction,
+}
+
+func addProtectorAction(c *cli.Context) error {
+ if c.NArg() != 0 {
+ return expectedArgsErr(c, 0, false)
+ }
+ if err := checkRequiredFlags(c, []*stringFlag{protectorFlag, policyFlag}); err != nil {
+ return err
+ }
+
+ protector, err := getProtectorFromFlag(protectorFlag.Value)
+ if err != nil {
+ return newExitError(c, err)
+ }
+ policy, err := getPolicyFromFlag(policyFlag.Value)
+ if err != nil {
+ return newExitError(c, err)
+ }
+ // Sanity check before unlocking everything
+ if err := policy.AddProtector(protector); errors.Cause(err) != actions.ErrLocked {
+ return newExitError(c, err)
+ }
+
+ prompt := fmt.Sprintf("Protect policy %s with protector %s?",
+ policy.Descriptor(), protector.Descriptor())
+ warning := "All files using this policy will be accessible with this protector!!"
+ if err := askConfirmation(prompt, true, warning); err != nil {
+ return newExitError(c, err)
+ }
+
+ if err := protector.Unlock(existingKeyFn); err != nil {
+ return newExitError(c, err)
+ }
+ if err := policy.Unlock(optionFn, existingKeyFn); err != nil {
+ return newExitError(c, err)
+ }
+ if err := policy.AddProtector(protector); err != nil {
+ return newExitError(c, err)
+ }
+
+ fmt.Fprintf(c.App.Writer, "Protector %s now protecting policy %s.\n",
+ protector.Descriptor(), policy.Descriptor())
+ return nil
+}
+
+var removeProtectorFromPolicy = cli.Command{
+ Name: "remove-protector-from-policy",
+ ArgsUsage: fmt.Sprintf("%s %s", shortDisplay(protectorFlag), shortDisplay(policyFlag)),
+ Usage: "stop protecting a policy with some protector",
+ Description: `This command changes the specified policy to no longer be
+ protected with the specified protector. This means that any
+ directories using this policy will cannot be accessed with this
+ protector. This command will fail if the policy not already
+ protected with this protector or if it is the policy's only
+ protector.`,
+ Flags: []cli.Flag{protectorFlag, policyFlag, forceFlag},
+ Action: removeProtectorAction,
+}
+
+func removeProtectorAction(c *cli.Context) error {
+ if c.NArg() != 0 {
+ return expectedArgsErr(c, 0, false)
+ }
+ if err := checkRequiredFlags(c, []*stringFlag{protectorFlag, policyFlag}); err != nil {
+ return err
+ }
+
+ // We do not need to unlock anything for this operation
+ protector, err := getProtectorFromFlag(protectorFlag.Value)
+ if err != nil {
+ return newExitError(c, err)
+ }
+ policy, err := getPolicyFromFlag(policyFlag.Value)
+ if err != nil {
+ return newExitError(c, err)
+ }
+
+ prompt := fmt.Sprintf("Stop protecting policy %s with protector %s?",
+ policy.Descriptor(), protector.Descriptor())
+ warning := "All files using this policy will NO LONGER be accessible with this protector!!"
+ if err := askConfirmation(prompt, false, warning); err != nil {
+ return newExitError(c, err)
+ }
+
+ if err := policy.RemoveProtector(protector); err != nil {
+ return newExitError(c, err)
+ }
+
+ fmt.Fprintf(c.App.Writer, "Protector %s no longer protecting policy %s.\n",
+ protector.Descriptor(), policy.Descriptor())
+ return nil
+}
+
var dumpMetadata = cli.Command{
Name: "dump",
ArgsUsage: fmt.Sprintf("[%s | %s]", shortDisplay(protectorFlag), shortDisplay(policyFlag)),