Skip to content

Commit

Permalink
Enable hashing symlinks
Browse files Browse the repository at this point in the history
Example output:
```
INFO[0000] Hashing directory.                            hashesFile=x/bundleinfo.json pathToHash=x/ uniqueBundleName=x
INFO[0000] Hash "x/".
WARN[0000] File "x/foo"->"x/x2" is a symlink, will be treated as a regular file/dir.
INFO[0000] Finished hasher.
``

Symlinks with targets not within the hash directory are not allowed and cause a panic.
  • Loading branch information
dragetd committed Apr 14, 2021
1 parent fe5d815 commit 146ecad
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 19 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* `hasher` will no longer create a directory if a non-existing one is passed as an argument.
* trivrost will no longer attempt to repeat range requests to a host after it has failed to conformly respond while displaying the confusing message `Taking longer than usual: HTTP Status 200` and will now fail immediately in such cases instead.
* trivrost will no longer fail to comply with HTTP 2 strictly using lower-case HTTP Header names. This had been caused by methods of `http.Header` still being oriented around HTTP 1 canonical header names due to Go's backwards compatibility promise.
* hasher now supports symlinks within hashed directories.

## 1.4.6 (2021-01-25)
### Fixes
Expand Down
37 changes: 18 additions & 19 deletions pkg/launcher/hashing/scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
"strings"

"github.com/setlog/trivrost/pkg/launcher/config"
log "github.com/sirupsen/logrus"
Expand Down Expand Up @@ -61,23 +62,29 @@ func mustHashRelatively(ctx context.Context, readDir readDirFunc, readFile readF
}

func mustHashDir(ctx context.Context, readDir readDirFunc, readFile readFileFunc, stat statFunc, hashFilePath string) config.FileInfoMap {
fm := make(config.FileInfoMap)
for _, info := range mustReadDir(readDir, hashFilePath) {
if info.IsDir() {
fm.Join(mustHashDir(ctx, readDir, readFile, stat, filepath.Join(hashFilePath, info.Name())))
} else {
filePath := filepath.Join(hashFilePath, info.Name())
if isDir(filePath) {
fm.Join(mustHashDir(readDir, readFile, stat, filePath))
fileMap := make(config.FileInfoMap)
for _, curPathInfo := range mustReadDir(readDir, hashFilePath) {
curPath := filepath.Join(hashFilePath, curPathInfo.Name())
resolvedPath := evaluateSoftLink(curPath)
if curPath != resolvedPath {
log.Warnf("File \"%s\"->\"%s\" is a symlink, will be treated as a regular file/dir.", curPath, resolvedPath)
curPath = resolvedPath
}
if !strings.HasPrefix(curPath, hashFilePath) {
panic(fmt.Errorf("hashing '%s' outside hash directory is not allowed", curPath))
}
curPathInfo, _ = stat(curPath)
if curPathInfo.IsDir() {
fileMap.Join(mustHashDir(ctx, readDir, readFile, stat, curPath))
} else {
sha, size, err := calculateSha256(ctx, filePath, readFile)
sha, size, err := calculateSha256(ctx, curPath, readFile)
if err != nil {
panic(fmt.Errorf("failed hashing file \"%s\": %w", hashFilePath, err))
}
fm[filePath] = &config.FileInfo{SHA256: sha, Size: size}
fileMap[curPath] = &config.FileInfo{SHA256: sha, Size: size}
}
}
return fm
return fileMap
}

func evaluateSoftLink(filePath string) string {
Expand All @@ -88,14 +95,6 @@ func evaluateSoftLink(filePath string) string {
return evaluatedName
}

func isDir(filePath string) bool {
fi, err := os.Stat(filePath)
if err != nil {
panic(err)
}
return fi.IsDir()
}

func mustReadDir(readDir readDirFunc, directoryPath string) []os.FileInfo {
infos, err := readDir(evaluateSoftLink(directoryPath))
if err != nil {
Expand Down

0 comments on commit 146ecad

Please # to comment.