types/model: export IsValidNamePart (#3788)
This commit is contained in:
parent
e6f9bfc0e8
commit
56f8aa6912
2 changed files with 15 additions and 6 deletions
|
@ -156,7 +156,7 @@ func ParseName(s, fill string) Name {
|
|||
r = Name{}
|
||||
return false
|
||||
}
|
||||
if kind == PartExtraneous || !isValidPart(kind, part) {
|
||||
if kind == PartExtraneous || !IsValidNamePart(kind, part) {
|
||||
r = Name{}
|
||||
return false
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ func parseMask(s string) Name {
|
|||
// mask part; treat as empty but valid
|
||||
return true
|
||||
}
|
||||
if !isValidPart(kind, part) {
|
||||
if !IsValidNamePart(kind, part) {
|
||||
panic(fmt.Errorf("invalid mask part %s: %q", kind, part))
|
||||
}
|
||||
r.parts[kind] = part
|
||||
|
@ -608,7 +608,7 @@ func ParseNameFromFilepath(s, fill string) Name {
|
|||
var r Name
|
||||
for i := range PartBuild + 1 {
|
||||
part, rest, _ := strings.Cut(s, string(filepath.Separator))
|
||||
if !isValidPart(i, part) {
|
||||
if !IsValidNamePart(i, part) {
|
||||
return Name{}
|
||||
}
|
||||
r.parts[i] = part
|
||||
|
@ -654,9 +654,12 @@ func (r Name) FilepathNoBuild() string {
|
|||
return filepath.Join(r.parts[:PartBuild]...)
|
||||
}
|
||||
|
||||
// isValidPart reports if s contains all valid characters for the given
|
||||
// part kind.
|
||||
func isValidPart(kind PartKind, s string) bool {
|
||||
// IsValidNamePart reports if s contains all valid characters for the given
|
||||
// part kind and is under MaxNamePartLen bytes.
|
||||
func IsValidNamePart(kind PartKind, s string) bool {
|
||||
if len(s) > MaxNamePartLen {
|
||||
return false
|
||||
}
|
||||
if s == "" {
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -105,6 +105,12 @@ var testNames = map[string]fields{
|
|||
strings.Repeat("a", MaxNamePartLen+1): {},
|
||||
}
|
||||
|
||||
func TestIsValidNameLen(t *testing.T) {
|
||||
if IsValidNamePart(PartNamespace, strings.Repeat("a", MaxNamePartLen+1)) {
|
||||
t.Errorf("unexpectedly valid long name")
|
||||
}
|
||||
}
|
||||
|
||||
// TestConsecutiveDots tests that consecutive dots are not allowed in any
|
||||
// part, to avoid path traversal. There also are some tests in testNames, but
|
||||
// this test is more exhaustive and exists to emphasize the importance of
|
||||
|
|
Loading…
Reference in a new issue