From acae10cd6fdbedcbb89bdbdd8698107f36b382fe Mon Sep 17 00:00:00 2001 From: Jakub Tasiemski Date: Fri, 9 Mar 2018 09:44:02 +0100 Subject: [PATCH] lsjson: add --encrypted to show encrypted name #1765 --- cmd/lsjson/lsjson.go | 52 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/cmd/lsjson/lsjson.go b/cmd/lsjson/lsjson.go index 02190e4b8..9ca517ec1 100644 --- a/cmd/lsjson/lsjson.go +++ b/cmd/lsjson/lsjson.go @@ -3,10 +3,12 @@ package lsjson import ( "encoding/json" "fmt" + "log" "os" "path" "time" + "github.com/ncw/rclone/backend/crypt" "github.com/ncw/rclone/cmd" "github.com/ncw/rclone/cmd/ls/lshelp" "github.com/ncw/rclone/fs" @@ -17,9 +19,10 @@ import ( ) var ( - recurse bool - showHash bool - noModTime bool + recurse bool + showHash bool + showEncrypted bool + noModTime bool ) func init() { @@ -27,16 +30,18 @@ func init() { commandDefintion.Flags().BoolVarP(&recurse, "recursive", "R", false, "Recurse into the listing.") commandDefintion.Flags().BoolVarP(&showHash, "hash", "", false, "Include hashes in the output (may take longer).") commandDefintion.Flags().BoolVarP(&noModTime, "no-modtime", "", false, "Don't read the modification time (can speed things up).") + commandDefintion.Flags().BoolVarP(&showEncrypted, "encrypted", "M", false, "Show the encrypted names.") } // lsJSON in the struct which gets marshalled for each line type lsJSON struct { - Path string - Name string - Size int64 - ModTime Timestamp //`json:",omitempty"` - IsDir bool - Hashes map[string]string `json:",omitempty"` + Path string + Name string + Encrypted string `json:",omitempty"` + Size int64 + ModTime Timestamp //`json:",omitempty"` + IsDir bool + Hashes map[string]string `json:",omitempty"` } // Timestamp a time in RFC3339 format with Nanosecond precision secongs @@ -67,14 +72,17 @@ The output is an array of Items, where each Item looks like this "IsDir" : false, "ModTime" : "2017-05-31T16:15:57.034468261+01:00", "Name" : "file.txt", + "Encrypted" : "v0qpsdq8anpci8n929v3uu9338", "Path" : "full/path/goes/here/file.txt", "Size" : 6 } -If --hash is not specified the the Hashes property won't be emitted. +If --hash is not specified the Hashes property won't be emitted. If --no-modtime is specified then ModTime will be blank. +If --encrypted is not specified the Encrypted won't be emitted. + The Path field will only show folders below the remote path being listed. If "remote:path" contains the file "subfolder/file.txt", the Path for "file.txt" will be "subfolder/file.txt", not "remote:path/subfolder/file.txt". @@ -88,6 +96,20 @@ can be processed line by line as each item is written one to a line. Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(1, 1, command, args) fsrc := cmd.NewFsSrc(args) + var cipher crypt.Cipher + if showEncrypted { + fsInfo, configName, _, err := fs.ParseRemote(args[0]) + if err != nil { + log.Fatalf(err.Error()) + } + if fsInfo.Name != "crypt" { + log.Fatalf("The remote needs to be of type \"crypt\"") + } + cipher, err = crypt.NewCipher(configName) + if err != nil { + log.Fatalf(err.Error()) + } + } cmd.Run(false, false, command, func() error { fmt.Println("[") first := true @@ -106,6 +128,16 @@ can be processed line by line as each item is written one to a line. if !noModTime { item.ModTime = Timestamp(entry.ModTime()) } + if cipher != nil { + switch entry.(type) { + case fs.Directory: + item.Encrypted = cipher.EncryptDirName(path.Base(entry.Remote())) + case fs.Object: + item.Encrypted = cipher.EncryptFileName(path.Base(entry.Remote())) + default: + fs.Errorf(nil, "Unknown type %T in listing", entry) + } + } switch x := entry.(type) { case fs.Directory: item.IsDir = true