lsjson: add --encrypted to show encrypted name #1765

This commit is contained in:
Jakub Tasiemski 2018-03-09 09:44:02 +01:00 committed by Nick Craig-Wood
parent 0861207ace
commit acae10cd6f

View File

@ -3,10 +3,12 @@ package lsjson
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"log"
"os" "os"
"path" "path"
"time" "time"
"github.com/ncw/rclone/backend/crypt"
"github.com/ncw/rclone/cmd" "github.com/ncw/rclone/cmd"
"github.com/ncw/rclone/cmd/ls/lshelp" "github.com/ncw/rclone/cmd/ls/lshelp"
"github.com/ncw/rclone/fs" "github.com/ncw/rclone/fs"
@ -17,9 +19,10 @@ import (
) )
var ( var (
recurse bool recurse bool
showHash bool showHash bool
noModTime bool showEncrypted bool
noModTime bool
) )
func init() { func init() {
@ -27,16 +30,18 @@ func init() {
commandDefintion.Flags().BoolVarP(&recurse, "recursive", "R", false, "Recurse into the listing.") 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(&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(&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 // lsJSON in the struct which gets marshalled for each line
type lsJSON struct { type lsJSON struct {
Path string Path string
Name string Name string
Size int64 Encrypted string `json:",omitempty"`
ModTime Timestamp //`json:",omitempty"` Size int64
IsDir bool ModTime Timestamp //`json:",omitempty"`
Hashes map[string]string `json:",omitempty"` IsDir bool
Hashes map[string]string `json:",omitempty"`
} }
// Timestamp a time in RFC3339 format with Nanosecond precision secongs // 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, "IsDir" : false,
"ModTime" : "2017-05-31T16:15:57.034468261+01:00", "ModTime" : "2017-05-31T16:15:57.034468261+01:00",
"Name" : "file.txt", "Name" : "file.txt",
"Encrypted" : "v0qpsdq8anpci8n929v3uu9338",
"Path" : "full/path/goes/here/file.txt", "Path" : "full/path/goes/here/file.txt",
"Size" : 6 "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 --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. 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" 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". 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) { Run: func(command *cobra.Command, args []string) {
cmd.CheckArgs(1, 1, command, args) cmd.CheckArgs(1, 1, command, args)
fsrc := cmd.NewFsSrc(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 { cmd.Run(false, false, command, func() error {
fmt.Println("[") fmt.Println("[")
first := true first := true
@ -106,6 +128,16 @@ can be processed line by line as each item is written one to a line.
if !noModTime { if !noModTime {
item.ModTime = Timestamp(entry.ModTime()) 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) { switch x := entry.(type) {
case fs.Directory: case fs.Directory:
item.IsDir = true item.IsDir = true