mirror of
https://github.com/AlistGo/alist.git
synced 2025-12-19 19:10:07 +08:00
Some checks failed
beta release / Beta Release Changelog (1.21, ubuntu-latest) (push) Has been cancelled
build / Build (ubuntu-latest, android-arm64) (push) Has been cancelled
build / Build (ubuntu-latest, darwin-amd64) (push) Has been cancelled
build / Build (ubuntu-latest, darwin-arm64) (push) Has been cancelled
build / Build (ubuntu-latest, linux-amd64-musl) (push) Has been cancelled
build / Build (ubuntu-latest, linux-arm64-musl) (push) Has been cancelled
build / Build (ubuntu-latest, windows-amd64) (push) Has been cancelled
build / Build (ubuntu-latest, windows-arm64) (push) Has been cancelled
release_docker / Build Binaries for Docker Release (push) Has been cancelled
beta release / Beta Release (md5, !(*musl*|*windows-arm64*|*android*|*freebsd*)) (push) Has been cancelled
beta release / Beta Release (md5-android, android-*) (push) Has been cancelled
beta release / Beta Release (md5-freebsd, freebsd-*) (push) Has been cancelled
beta release / Beta Release (md5-linux-musl, linux-!(arm*)-musl*) (push) Has been cancelled
beta release / Beta Release (md5-linux-musl-arm, linux-arm*-musl*) (push) Has been cancelled
beta release / Beta Release (md5-windows-arm64, windows-arm64) (push) Has been cancelled
beta release / Beta Release Desktop (push) Has been cancelled
release_docker / Release Docker image (, latest, ) (push) Has been cancelled
release_docker / Release Docker image (INSTALL_ARIA2=true, aria2, suffix=-aria2,onlatest=true) (push) Has been cancelled
release_docker / Release Docker image (INSTALL_FFMPEG=true
INSTALL_ARIA2=true
, aio, suffix=-aio,onlatest=true) (push) Has been cancelled
release_docker / Release Docker image (INSTALL_FFMPEG=true, ffmpeg, suffix=-ffmpeg,onlatest=true) (push) Has been cancelled
Close inactive / close-inactive (push) Has been cancelled
- Add `GetUsersByRole` function for fetching users by role. - Introduce `GetAllBasePathsFromRoles` to aggregate paths from roles. - Refine path handling in `pkg/utils/path.go` for normalization. - Comment out base path prefix updates to simplify role operations.
104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"net/url"
|
|
stdpath "path"
|
|
"strings"
|
|
|
|
"github.com/alist-org/alist/v3/internal/errs"
|
|
)
|
|
|
|
// FixAndCleanPath
|
|
// The upper layer of the root directory is still the root directory.
|
|
// So ".." And "." will be cleared
|
|
// for example
|
|
// 1. ".." or "." => "/"
|
|
// 2. "../..." or "./..." => "/..."
|
|
// 3. "../.x." or "./.x." => "/.x."
|
|
// 4. "x//\\y" = > "/z/x"
|
|
func FixAndCleanPath(path string) string {
|
|
path = strings.ReplaceAll(path, "\\", "/")
|
|
if !strings.HasPrefix(path, "/") {
|
|
path = "/" + path
|
|
}
|
|
return stdpath.Clean(path)
|
|
}
|
|
|
|
// PathAddSeparatorSuffix Add path '/' suffix
|
|
// for example /root => /root/
|
|
func PathAddSeparatorSuffix(path string) string {
|
|
if !strings.HasSuffix(path, "/") {
|
|
path = path + "/"
|
|
}
|
|
return path
|
|
}
|
|
|
|
// PathEqual judge path is equal
|
|
func PathEqual(path1, path2 string) bool {
|
|
return FixAndCleanPath(path1) == FixAndCleanPath(path2)
|
|
}
|
|
|
|
func IsSubPath(path string, subPath string) bool {
|
|
path, subPath = FixAndCleanPath(path), FixAndCleanPath(subPath)
|
|
return path == subPath || strings.HasPrefix(subPath, PathAddSeparatorSuffix(path))
|
|
}
|
|
|
|
func Ext(path string) string {
|
|
ext := stdpath.Ext(path)
|
|
if len(ext) > 0 && ext[0] == '.' {
|
|
ext = ext[1:]
|
|
}
|
|
return strings.ToLower(ext)
|
|
}
|
|
|
|
func EncodePath(path string, all ...bool) string {
|
|
seg := strings.Split(path, "/")
|
|
toReplace := []struct {
|
|
Src string
|
|
Dst string
|
|
}{
|
|
{Src: "%", Dst: "%25"},
|
|
{"%", "%25"},
|
|
{"?", "%3F"},
|
|
{"#", "%23"},
|
|
}
|
|
for i := range seg {
|
|
if len(all) > 0 && all[0] {
|
|
seg[i] = url.PathEscape(seg[i])
|
|
} else {
|
|
for j := range toReplace {
|
|
seg[i] = strings.ReplaceAll(seg[i], toReplace[j].Src, toReplace[j].Dst)
|
|
}
|
|
}
|
|
}
|
|
return strings.Join(seg, "/")
|
|
}
|
|
|
|
func JoinBasePath(basePath, reqPath string) (string, error) {
|
|
/** relative path:
|
|
* 1. ..
|
|
* 2. ../
|
|
* 3. /..
|
|
* 4. /../
|
|
* 5. /a/b/..
|
|
*/
|
|
if reqPath == ".." ||
|
|
strings.HasSuffix(reqPath, "/..") ||
|
|
strings.HasPrefix(reqPath, "../") ||
|
|
strings.Contains(reqPath, "/../") {
|
|
return "", errs.RelativePath
|
|
}
|
|
|
|
reqPath = FixAndCleanPath(reqPath)
|
|
|
|
if strings.HasPrefix(reqPath, "/") {
|
|
return reqPath, nil
|
|
}
|
|
|
|
return stdpath.Join(FixAndCleanPath(basePath), FixAndCleanPath(reqPath)), nil
|
|
}
|
|
|
|
func GetFullPath(mountPath, path string) string {
|
|
return stdpath.Join(GetActualMountPath(mountPath), path)
|
|
}
|