github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/tlfhandle/errors.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 10 "github.com/keybase/client/go/kbfs/kbfsmd" 11 "github.com/keybase/client/go/kbfs/tlf" 12 kbname "github.com/keybase/client/go/kbun" 13 ) 14 15 // NoSuchNameError indicates that the user tried to access a TLF that 16 // doesn't exist. 17 type NoSuchNameError struct { 18 Name string 19 } 20 21 // Error implements the error interface for NoSuchNameError 22 func (e NoSuchNameError) Error() string { 23 return fmt.Sprintf("%s doesn't exist", e.Name) 24 } 25 26 // HandleFinalizedError is returned when something attempts to modify 27 // a finalized TLF handle. 28 type HandleFinalizedError struct { 29 } 30 31 // Error implements the error interface for HandleFinalizedError. 32 func (e HandleFinalizedError) Error() string { 33 return "Attempt to modify finalized TLF handle" 34 } 35 36 // HandleMismatchError indicates an inconsistent or unverifiable MD object 37 // for the given top-level folder. 38 type HandleMismatchError struct { 39 Revision kbfsmd.Revision 40 Dir string 41 TlfID tlf.ID 42 Err error 43 } 44 45 // Error implements the error interface for HandleMismatchError 46 func (e HandleMismatchError) Error() string { 47 return fmt.Sprintf("Could not verify metadata (revision=%d) for directory %s (id=%s): %s", 48 e.Revision, e.Dir, e.TlfID, e.Err) 49 } 50 51 // ReadAccessError indicates that the user tried to read from a 52 // top-level folder without read permission. 53 type ReadAccessError struct { 54 User kbname.NormalizedUsername 55 Filename string 56 Tlf tlf.CanonicalName 57 Type tlf.Type 58 } 59 60 // Error implements the error interface for ReadAccessError 61 func (e ReadAccessError) Error() string { 62 return fmt.Sprintf("%s does not have read access to directory %s", 63 e.User, BuildCanonicalPathForTlfName(e.Type, e.Tlf)) 64 } 65 66 // NewReadAccessError constructs a ReadAccessError for the given 67 // directory and user. 68 func NewReadAccessError(h *Handle, username kbname.NormalizedUsername, filename string) error { 69 tlfname := h.GetCanonicalName() 70 return ReadAccessError{ 71 User: username, 72 Filename: filename, 73 Tlf: tlfname, 74 Type: h.Type(), 75 } 76 } 77 78 // WriteAccessError indicates an error when trying to write a file 79 type WriteAccessError struct { 80 User kbname.NormalizedUsername 81 Filename string 82 Tlf tlf.CanonicalName 83 Type tlf.Type 84 } 85 86 // Error implements the error interface for WriteAccessError 87 func (e WriteAccessError) Error() string { 88 if e.Tlf != "" { 89 return fmt.Sprintf("%s does not have write access to directory %s", 90 e.User, BuildCanonicalPathForTlfName(e.Type, e.Tlf)) 91 } 92 return fmt.Sprintf("%s does not have write access to %s", e.User, e.Filename) 93 } 94 95 // NewWriteAccessError is an access error trying to write a file 96 func NewWriteAccessError(h *Handle, username kbname.NormalizedUsername, filename string) error { 97 tlfName := tlf.CanonicalName("") 98 t := tlf.Private 99 if h != nil { 100 tlfName = h.GetCanonicalName() 101 t = h.Type() 102 } 103 return WriteAccessError{ 104 User: username, 105 Filename: filename, 106 Tlf: tlfName, 107 Type: t, 108 } 109 }