github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/tlfhandle/path.go (about) 1 // Copyright 2019 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package tlfhandle 6 7 import ( 8 "fmt" 9 "strings" 10 11 "github.com/keybase/client/go/kbfs/tlf" 12 "github.com/keybase/client/go/protocol/keybase1" 13 ) 14 15 // PathType describes the types for different paths 16 type PathType string 17 18 const ( 19 // KeybasePathType is the keybase root (like /keybase) 20 KeybasePathType PathType = "keybase" 21 // PublicPathType is the keybase public folder list (like /keybase/public) 22 PublicPathType PathType = "public" 23 // PrivatePathType is the keybase private folder list (like 24 // /keybase/private) 25 PrivatePathType PathType = "private" 26 // SingleTeamPathType is the keybase team folder list (like /keybase/teams) 27 SingleTeamPathType PathType = "team" 28 ) 29 30 // BuildCanonicalPath returns a canonical path for a path components. 31 // This a canonical path and may need to be converted to a platform 32 // specific path, for example, on Windows, this might correspond to 33 // k:\private\username. Note that "canonical" here indicates it's in the form 34 // of /keybase/<tlfType>/blah... . It does not try to canonicalize TLF names. 35 func BuildCanonicalPath(pathType PathType, paths ...string) string { 36 var prefix string 37 switch pathType { 38 case KeybasePathType: 39 prefix = "/" + string(KeybasePathType) 40 default: 41 prefix = "/" + string(KeybasePathType) + "/" + string(pathType) 42 } 43 pathElements := []string{prefix} 44 for _, p := range paths { 45 if p != "" { 46 pathElements = append(pathElements, p) 47 } 48 } 49 return strings.Join(pathElements, "/") 50 } 51 52 // BuildCanonicalPathForTlfType is like BuildCanonicalPath, but accepts a 53 // tlf.Type instead of PathType. 54 func BuildCanonicalPathForTlfType(t tlf.Type, paths ...string) string { 55 var pathType PathType 56 switch t { 57 case tlf.Private: 58 pathType = PrivatePathType 59 case tlf.Public: 60 pathType = PublicPathType 61 case tlf.SingleTeam: 62 pathType = SingleTeamPathType 63 default: 64 panic(fmt.Sprintf("Unknown tlf path type: %d", t)) 65 } 66 67 return BuildCanonicalPath(pathType, paths...) 68 } 69 70 // BuildCanonicalPathForTlfName returns a canonical path for a tlf. 71 func BuildCanonicalPathForTlfName(t tlf.Type, tlfName tlf.CanonicalName) string { 72 return BuildCanonicalPathForTlfType(t, string(tlfName)) 73 } 74 75 // BuildCanonicalPathForTlf returns a canonical path for a tlf. Although tlf 76 // identifies a TLF, paths should still include the TLF name. This function 77 // does not try to canonicalize TLF names. 78 func BuildCanonicalPathForTlf(tlf tlf.ID, paths ...string) string { 79 return BuildCanonicalPathForTlfType(tlf.Type(), paths...) 80 } 81 82 // BuildProtocolPathForTlfName builds a `keybase1.Path` for the given 83 // TLF type and name. 84 func BuildProtocolPathForTlfName( 85 t tlf.Type, tlfName tlf.CanonicalName) keybase1.Path { 86 var pathType PathType 87 switch t { 88 case tlf.Private: 89 pathType = PrivatePathType 90 case tlf.Public: 91 pathType = PublicPathType 92 case tlf.SingleTeam: 93 pathType = SingleTeamPathType 94 default: 95 panic(fmt.Sprintf("Unknown tlf path type: %d", t)) 96 } 97 98 return keybase1.NewPathWithKbfs( 99 keybase1.KBFSPath{Path: "/" + string(pathType) + "/" + string(tlfName)}) 100 }