diff options
Diffstat (limited to 'actions/context.go')
| -rw-r--r-- | actions/context.go | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/actions/context.go b/actions/context.go new file mode 100644 index 0000000..f4a3985 --- /dev/null +++ b/actions/context.go @@ -0,0 +1,97 @@ +/* + * context.go - top-level interface to fscrypt packages + * + * Copyright 2017 Google Inc. + * Author: Joe Richey (joerichey@google.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +// Package actions is the high-level interface to the fscrypt packages. The +// functions here roughly correspond with commands for the tool in cmd/fscrypt. +// All of the actions include a significant amount of logging, so that good +// output can be provided for cmd/fscrypt's verbose mode. +// The top-level actions currently include: +// - Creating a new config file +// - Creating a context on which to perform actions +// - Creating, unlocking, and modifying Protectors +// - Creating, unlocking, and modifying Policies +package actions + +import ( + "errors" + "fmt" + "log" + + "fscrypt/filesystem" + "fscrypt/metadata" + "fscrypt/util" +) + +// Errors relating to Config files or Config structures. +var ( + ErrNoConfigFile = fmt.Errorf("config file %q does not exist", ConfigFileLocation) + ErrBadConfigFile = fmt.Errorf("config file %q has invalid data", ConfigFileLocation) + ErrConfigFileExists = fmt.Errorf("config file %q already exists", ConfigFileLocation) + ErrBadConfig = errors.New("invalid Config structure provided") +) + +// Context contains the necessary global state to perform most of fscrypt's +// actions. It contains a config struct, which is loaded from the global config +// file, but can be edited manually. A context is specific to a filesystem, and +// all actions to add, edit, remove, and apply Protectors and Policies are done +// relative to that filesystem. +type Context struct { + Config *metadata.Config + Mount *filesystem.Mount +} + +// NewContextFromPath makes a context for the filesystem containing the +// specified path and whose Config is loaded from the global config file. On +// success, the Context contains a valid Config and Mount. +func NewContextFromPath(path string) (ctx *Context, err error) { + ctx = new(Context) + + if ctx.Mount, err = filesystem.FindMount(path); err != nil { + err = util.UnderlyingError(err) + return + } + + if ctx.Config, err = getConfig(); err != nil { + return + } + + log.Printf("%s is on %s filesystem %q (%s)", path, + ctx.Mount.Filesystem, ctx.Mount.Path, ctx.Mount.Device) + return +} + +// NewContextFromMountpoint makes a context for the filesystem at the specified +// mountpoint and whose Config is loaded from the global config file. On +// success, the Context contains a valid Config and Mount. +func NewContextFromMountpoint(mountpoint string) (ctx *Context, err error) { + ctx = new(Context) + + if ctx.Mount, err = filesystem.GetMount(mountpoint); err != nil { + err = util.UnderlyingError(err) + return + } + + if ctx.Config, err = getConfig(); err != nil { + return + } + + log.Printf("found %s filesystem %q (%s)", ctx.Mount.Filesystem, + ctx.Mount.Path, ctx.Mount.Device) + return +} |