* bump gopkg.in/yaml.v3 * test: cannot remove local items with cscli * test dangling links * test: cannot install local item with cscli * pkg/cwhub: reorg (move) functions in files * allow hub upgrade with local items * data download: honor Last-Modified header * fatal -> warning when attempting to remove a local item (allows remove --all) * cscli...inspect -o yaml|human: rename remote_path -> path * Correct count of removed items Still no separate counter for the --purge option, but should be clear enough
41 lines
871 B
Go
41 lines
871 B
Go
package cwhub
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"path/filepath"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var hubClient = &http.Client{
|
|
Timeout: 120 * time.Second,
|
|
}
|
|
|
|
// safePath returns a joined path and ensures that it does not escape the base directory.
|
|
func safePath(dir, filePath string) (string, error) {
|
|
absBaseDir, err := filepath.Abs(filepath.Clean(dir))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
absFilePath, err := filepath.Abs(filepath.Join(dir, filePath))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if !strings.HasPrefix(absFilePath, absBaseDir) {
|
|
return "", fmt.Errorf("path %s escapes base directory %s", filePath, dir)
|
|
}
|
|
|
|
return absFilePath, nil
|
|
}
|
|
|
|
// SortItemSlice sorts a slice of items by name, case insensitive.
|
|
func SortItemSlice(items []*Item) {
|
|
sort.Slice(items, func(i, j int) bool {
|
|
return strings.ToLower(items[i].Name) < strings.ToLower(items[j].Name)
|
|
})
|
|
}
|