Skip to content

Commit 1ec9773

Browse files
authored
fix(crypt cmd): correctly process encrypted folder names and file nam… (#462)
fix(crypt cmd): correctly process encrypted folder names and file name suffix
1 parent ded67b7 commit 1ec9773

File tree

1 file changed

+82
-12
lines changed

1 file changed

+82
-12
lines changed

cmd/crypt.go

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
// encryption and decryption command format for Crypt driver
2020

2121
type options struct {
22-
Op string //decrypt or encrypt
22+
op string //decrypt or encrypt
2323
src string //source dir or file
2424
dst string //out destination
2525

@@ -57,7 +57,7 @@ func init() {
5757
// is called directly, e.g.:
5858
CryptCmd.Flags().StringVarP(&opt.src, "src", "s", "", "src file or dir to encrypt/decrypt")
5959
CryptCmd.Flags().StringVarP(&opt.dst, "dst", "d", "", "dst dir to output,if not set,output to src dir")
60-
CryptCmd.Flags().StringVar(&opt.Op, "op", "", "de or en which stands for decrypt or encrypt")
60+
CryptCmd.Flags().StringVar(&opt.op, "op", "", "de or en which stands for decrypt or encrypt")
6161

6262
CryptCmd.Flags().StringVar(&opt.pwd, "pwd", "", "password used to encrypt/decrypt,if not contain ___Obfuscated___ prefix,will be obfuscated before used")
6363
CryptCmd.Flags().StringVar(&opt.salt, "salt", "", "salt used to encrypt/decrypt,if not contain ___Obfuscated___ prefix,will be obfuscated before used")
@@ -71,7 +71,7 @@ func (o *options) validate() {
7171
if o.src == "" {
7272
log.Fatal("src can not be empty")
7373
}
74-
if o.Op != "encrypt" && o.Op != "decrypt" && o.Op != "en" && o.Op != "de" {
74+
if o.op != "encrypt" && o.op != "decrypt" && o.op != "en" && o.op != "de" {
7575
log.Fatal("op must be encrypt or decrypt")
7676
}
7777
if o.filenameEncryption != "off" && o.filenameEncryption != "standard" && o.filenameEncryption != "obfuscate" {
@@ -130,24 +130,89 @@ func (o *options) cryptFileDir() {
130130
// src is dir
131131
if dst == "" {
132132
//if src is dir and not set dst dir ,create ${src}_crypt dir as dst dir
133-
dst = path.Join("./", fileInfo.Name()+"_crypt")
133+
dst = path.Join(filepath.Dir(src), fileInfo.Name()+"_crypt")
134134
}
135135
log.Infof("dst : %v", dst)
136+
137+
dirnameMap := make(map[string]string)
138+
pathSeparator := string(os.PathSeparator)
139+
136140
filepath.Walk(src, func(p string, info os.FileInfo, err error) error {
137141
if err != nil {
138142
log.Errorf("get file %v info failed, err:%v", p, err)
139143
return err
140144
}
145+
if p == src {
146+
return nil
147+
}
148+
log.Infof("current path %v", p)
149+
150+
// relative path
151+
rp := strings.ReplaceAll(p, src, "")
152+
log.Infof("relative path %v", rp)
153+
154+
rpds := strings.Split(rp, pathSeparator)
155+
141156
if info.IsDir() {
142-
//create output dir
143-
d := strings.Replace(p, src, dst, 1)
144-
log.Infof("create output dir %v", d)
145-
checkCreateDir(d)
157+
// absolute dst dir for current path
158+
dd := ""
159+
160+
if o.dirnameEncryption == "true" {
161+
if o.op == "encrypt" || o.op == "en" {
162+
for i := range rpds {
163+
oname := rpds[i]
164+
if _, ok := dirnameMap[rpds[i]]; ok {
165+
rpds[i] = dirnameMap[rpds[i]]
166+
} else {
167+
rpds[i] = cipher.EncryptDirName(rpds[i])
168+
dirnameMap[oname] = rpds[i]
169+
}
170+
}
171+
dd = path.Join(dst, strings.Join(rpds, pathSeparator))
172+
} else {
173+
for i := range rpds {
174+
oname := rpds[i]
175+
if _, ok := dirnameMap[rpds[i]]; ok {
176+
rpds[i] = dirnameMap[rpds[i]]
177+
} else {
178+
dnn, err := cipher.DecryptDirName(rpds[i])
179+
if err != nil {
180+
log.Fatalf("decrypt dir name %v failed,err:%v", rpds[i], err)
181+
}
182+
rpds[i] = dnn
183+
dirnameMap[oname] = dnn
184+
}
185+
186+
}
187+
dd = path.Join(dst, strings.Join(rpds, pathSeparator))
188+
}
189+
190+
} else {
191+
dd = path.Join(dst, rp)
192+
}
146193

194+
log.Infof("create output dir %v", dd)
195+
checkCreateDir(dd)
147196
return nil
148197
}
149-
d := strings.Replace(filepath.Dir(p), src, dst, 1)
150-
o.cryptFile(cipher, p, d)
198+
199+
// file dst dir
200+
fdd := dst
201+
202+
if o.dirnameEncryption == "true" {
203+
for i := range rpds {
204+
if i == len(rpds)-1 {
205+
break
206+
}
207+
fdd = path.Join(fdd, dirnameMap[rpds[i]])
208+
}
209+
210+
} else {
211+
fdd = path.Join(fdd, strings.Join(rpds[:len(rpds)-1], pathSeparator))
212+
}
213+
214+
log.Infof("file output dir %v", fdd)
215+
o.cryptFile(cipher, p, fdd)
151216
return nil
152217
})
153218

@@ -168,11 +233,13 @@ func (o *options) cryptFile(cipher *rcCrypt.Cipher, src string, dst string) {
168233

169234
var cryptSrcReader io.Reader
170235
var outFile string
171-
if o.Op == "encrypt" || o.Op == "en" {
236+
if o.op == "encrypt" || o.op == "en" {
172237
filename := fileInfo.Name()
173238
if o.filenameEncryption != "off" {
174239
filename = cipher.EncryptFileName(fileInfo.Name())
175240
log.Infof("encrypt file name %v to %v", fileInfo.Name(), filename)
241+
} else {
242+
filename = fileInfo.Name() + o.suffix
176243
}
177244
cryptSrcReader, err = cipher.EncryptData(fd)
178245
if err != nil {
@@ -188,6 +255,8 @@ func (o *options) cryptFile(cipher *rcCrypt.Cipher, src string, dst string) {
188255
log.Fatalf("decrypt file name %v failed,err:%v", src, err)
189256
}
190257
log.Infof("decrypt file name %v to %v, ", fileInfo.Name(), filename)
258+
} else {
259+
filename = strings.TrimSuffix(filename, o.suffix)
191260
}
192261

193262
cryptSrcReader, err = cipher.DecryptData(fd)
@@ -222,9 +291,10 @@ func checkCreateDir(dir string) {
222291
log.Fatalf("create dir %v failed,err:%v", dir, err)
223292
}
224293
return
294+
} else if err != nil {
295+
log.Fatalf("read dir %v err: %v", dir, err)
225296
}
226297

227-
log.Fatalf("read dir %v err: %v", dir, err)
228298
}
229299

230300
func updateObfusParm(str string) string {

0 commit comments

Comments
 (0)