// keyring unless --skip-unlock is used. On failure, an error is returned, any
// metadata creation is reverted, and the directory is unmodified.
func encryptPath(path string) (err error) {
- target, err := parseUserFlag()
+ target, err := parseUserFlag(!skipUnlockFlag.Value)
if err != nil {
return
}
return expectedArgsErr(c, 1, false)
}
- target, err := parseUserFlag()
+ target, err := parseUserFlag(true)
if err != nil {
return newExitError(c, err)
}
}
}
- target, err := parseUserFlag()
+ target, err := parseUserFlag(true)
if err != nil {
return newExitError(c, err)
}
return expectedArgsErr(c, 1, false)
}
- target, err := parseUserFlag()
+ target, err := parseUserFlag(false)
if err != nil {
return newExitError(c, err)
}
"github.com/urfave/cli"
"github.com/google/fscrypt/actions"
+ "github.com/google/fscrypt/security"
"github.com/google/fscrypt/util"
)
// parseUserFlag returns the user specified by userFlag or the current effective
// user if the flag value is missing. If the effective user is root, however, a
-// user must specified in the flag.
-func parseUserFlag() (*user.User, error) {
+// user must specified in the flag. If checkKeyring is true, we also make sure
+// there are no problems accessing the user keyring.
+func parseUserFlag(checkKeyring bool) (targetUser *user.User, err error) {
if userFlag.Value != "" {
- return user.Lookup(userFlag.Value)
+ targetUser, err = user.Lookup(userFlag.Value)
+ } else {
+ if util.IsUserRoot() {
+ return nil, ErrSpecifyUser
+ }
+ targetUser, err = util.EffectiveUser()
}
- effectiveUser, err := util.EffectiveUser()
if err != nil {
return nil, err
}
- if util.IsUserRoot() {
- return nil, ErrSpecifyUser
+
+ if checkKeyring {
+ _, err = security.UserKeyringID(targetUser)
}
- return effectiveUser, nil
+ return targetUser, err
}