func (s *sfe) encrypt(filename string) error { payload, err := shared.FileNaClEncrypt(filename, s.compress, &s.keys.Data) if err != nil { return err } outFilename := filename + ".sfe" for { _, err = os.Stat(outFilename) if err != nil { break } outFilename = "1" + outFilename } out, err := os.OpenFile(outFilename, os.O_CREATE|os.O_RDWR, 0600) defer func() { _ = out.Close() }() _, err = out.Write(payload) if err != nil { return err } return nil }
func (a *acdb) walk(path string, info os.FileInfo, errIn error) error { a.Log(acd.DebugLoud, "[TRC] walk") if errIn != nil { fmt.Printf("skipping %v error: %v\n", path, errIn) return nil } var ( payload []byte digest *[sha256.Size]byte err error ) switch { case info.Mode()&os.ModeDir == os.ModeDir: // dir err = a.me.Dir(path, info) if err != nil { break } case info.Mode()&os.ModeSymlink == os.ModeSymlink: // symlink err = a.me.Symlink(path, info) if err != nil { break } case info.Mode().IsRegular() && info.Size() == 0: // zero sized file err = a.me.File(path, info, "", nil) if err != nil { break } case info.Mode().IsRegular(): // regular file // external pointer AND digest digest, err = goutil.FileHMACSHA256(path, a.keys.Dedup[:]) if err != nil { break } payload, err = shared.FileNaClEncrypt(path, a.compress, &a.keys.Data) if err != nil { break } mime, _, err := goutil.FileCompressible(path) if err != nil { break } err = a.me.File(path, info, mime, digest) if err != nil { break } default: fmt.Printf("skipping %v: unsuported file type\n", path) return nil } if err != nil { fmt.Printf("skipping %v: %v\n", path, err) return nil } var d, ds string if digest != nil { d = hex.EncodeToString(digest[:]) } if digest != nil { asset, err := a.c.UploadJSON(a.dataID, d, payload) if err != nil { if e, ok := acd.IsCombinedError(err); ok { if e.StatusCode != http.StatusConflict { fmt.Printf("skipping %v: %v\n", path, err) return nil } ds += " deduped " } else { fmt.Printf("should not happen %T: %v\n", err, err) return nil } } else { ds += " new " } _ = asset } if a.verbose { if digest != nil { ds += "=> " + d } fmt.Printf("%v %15v %v%v\n", info.Mode(), info.Size(), path, ds) } return nil }