| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package principal |
| |
| import ( |
| "io" |
| "os" |
| "runtime/ppapi" |
| |
| "v.io/x/ref/lib/security" |
| ) |
| |
| // fileSerializer implements vsecurity.SerializerReaderWriter that persists state to |
| // files with the pepper API. |
| type fileSerializer struct { |
| system ppapi.FileSystem |
| data *ppapi.FileIO |
| signature *ppapi.FileIO |
| |
| dataFile string |
| signatureFile string |
| } |
| |
| var _ security.SerializerReaderWriter = (*fileSerializer)(nil) |
| |
| func (fs *fileSerializer) Readers() (data io.ReadCloser, sig io.ReadCloser, err error) { |
| if fs.data == nil || fs.signature == nil { |
| return nil, nil, nil |
| } |
| return fs.data, fs.signature, nil |
| } |
| |
| func (fs *fileSerializer) Writers() (data io.WriteCloser, sig io.WriteCloser, err error) { |
| // Remove previous version of the files |
| fs.system.Remove(fs.dataFile) |
| fs.system.Remove(fs.signatureFile) |
| if fs.data, err = fs.system.Create(fs.dataFile); err != nil { |
| return nil, nil, err |
| } |
| if fs.signature, err = fs.system.Create(fs.signatureFile); err != nil { |
| return nil, nil, err |
| } |
| return fs.data, fs.signature, nil |
| } |
| |
| func fileNotExist(err error) bool { |
| pe, ok := err.(*os.PathError) |
| return ok && pe.Err.Error() == "file not found" |
| } |
| |
| func NewFileSerializer(dataFile, signatureFile string, system ppapi.FileSystem) (*fileSerializer, error) { |
| data, err := system.Open(dataFile) |
| if err != nil && !fileNotExist(err) { |
| return nil, err |
| } |
| signature, err := system.Open(signatureFile) |
| if err != nil && !fileNotExist(err) { |
| return nil, err |
| } |
| return &fileSerializer{ |
| system: system, |
| data: data, |
| signature: signature, |
| dataFile: dataFile, |
| signatureFile: signatureFile, |
| }, nil |
| } |