|
@@ -264,14 +264,19 @@ func addZipEntry(wr *zip.Writer, conn *Connection, entryPath, baseDir string) er
|
|
conn.Log(logger.LevelDebug, "unable to add zip entry %#v, stat error: %v", entryPath, err)
|
|
conn.Log(logger.LevelDebug, "unable to add zip entry %#v, stat error: %v", entryPath, err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ entryName, err := getZipEntryName(entryPath, baseDir)
|
|
|
|
+ if err != nil {
|
|
|
|
+ conn.Log(logger.LevelError, "unable to get zip entry name: %v", err)
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
if info.IsDir() {
|
|
if info.IsDir() {
|
|
- _, err := wr.CreateHeader(&zip.FileHeader{
|
|
|
|
- Name: getZipEntryName(entryPath, baseDir) + "/",
|
|
|
|
|
|
+ _, err = wr.CreateHeader(&zip.FileHeader{
|
|
|
|
+ Name: entryName + "/",
|
|
Method: zip.Deflate,
|
|
Method: zip.Deflate,
|
|
Modified: info.ModTime(),
|
|
Modified: info.ModTime(),
|
|
})
|
|
})
|
|
if err != nil {
|
|
if err != nil {
|
|
- conn.Log(logger.LevelDebug, "unable to create zip entry %#v: %v", entryPath, err)
|
|
|
|
|
|
+ conn.Log(logger.LevelError, "unable to create zip entry %#v: %v", entryPath, err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
contents, err := conn.ReadDir(entryPath)
|
|
contents, err := conn.ReadDir(entryPath)
|
|
@@ -289,7 +294,7 @@ func addZipEntry(wr *zip.Writer, conn *Connection, entryPath, baseDir string) er
|
|
}
|
|
}
|
|
if !info.Mode().IsRegular() {
|
|
if !info.Mode().IsRegular() {
|
|
// we only allow regular files
|
|
// we only allow regular files
|
|
- conn.Log(logger.LevelDebug, "skipping zip entry for non regular file %#v", entryPath)
|
|
|
|
|
|
+ conn.Log(logger.LevelInfo, "skipping zip entry for non regular file %#v", entryPath)
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
reader, err := conn.getFileReader(entryPath, 0, http.MethodGet)
|
|
reader, err := conn.getFileReader(entryPath, 0, http.MethodGet)
|
|
@@ -300,21 +305,24 @@ func addZipEntry(wr *zip.Writer, conn *Connection, entryPath, baseDir string) er
|
|
defer reader.Close()
|
|
defer reader.Close()
|
|
|
|
|
|
f, err := wr.CreateHeader(&zip.FileHeader{
|
|
f, err := wr.CreateHeader(&zip.FileHeader{
|
|
- Name: getZipEntryName(entryPath, baseDir),
|
|
|
|
|
|
+ Name: entryName,
|
|
Method: zip.Deflate,
|
|
Method: zip.Deflate,
|
|
Modified: info.ModTime(),
|
|
Modified: info.ModTime(),
|
|
})
|
|
})
|
|
if err != nil {
|
|
if err != nil {
|
|
- conn.Log(logger.LevelDebug, "unable to create zip entry %#v: %v", entryPath, err)
|
|
|
|
|
|
+ conn.Log(logger.LevelError, "unable to create zip entry %#v: %v", entryPath, err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
_, err = io.Copy(f, reader)
|
|
_, err = io.Copy(f, reader)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
-func getZipEntryName(entryPath, baseDir string) string {
|
|
|
|
|
|
+func getZipEntryName(entryPath, baseDir string) (string, error) {
|
|
|
|
+ if !strings.HasPrefix(entryPath, baseDir) {
|
|
|
|
+ return "", fmt.Errorf("entry path %q is outside base dir %q", entryPath, baseDir)
|
|
|
|
+ }
|
|
entryPath = strings.TrimPrefix(entryPath, baseDir)
|
|
entryPath = strings.TrimPrefix(entryPath, baseDir)
|
|
- return strings.TrimPrefix(entryPath, "/")
|
|
|
|
|
|
+ return strings.TrimPrefix(entryPath, "/"), nil
|
|
}
|
|
}
|
|
|
|
|
|
func checkDownloadFileFromShare(share *dataprovider.Share, info os.FileInfo) error {
|
|
func checkDownloadFileFromShare(share *dataprovider.Share, info os.FileInfo) error {
|