mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2025-03-10 13:38:20 +00:00

Didn't have the chance to migrate //all// templates just yet. We'll get there. * Implement yet another template system * Move orphans to the new system and fix a bug in it * Link orphans in the admin panel * Move the backlink handlers to the web package * Move auth routing to web * Move /user-list to the new system * Move change password and translate it * Move stuff * Move admin-related stuff to the web * Move a lot of files into internal dir Outside of it are web and stuff that needs further refactoring * Fix static not loading and de-qtpl tree * Move tree to internal * Keep the globe on the same line #230 * Revert "Keep the globe on the same line #230" This reverts commit ae78e5e459b1e980ba89bf29e61f75c0625ed2c7. * Migrate templates from hypview: delete, edit, start empty and existing WIP The delete media view was removed, I didn't even know it still existed as a GET. A rudiment. * Make views multi-file and break compilation * Megarefactoring of hypha views * Auth-related stuffs * Fix some of those weird imports * Migrate cat views * Fix cat js * Lower standards * Internalize trauma
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
// Package hyphae manages hypha storage and hypha types.
|
|
package hyphae
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
// hyphaNamePattern is a pattern which all hyphae names must match.
|
|
var hyphaNamePattern = regexp.MustCompile(`^[^?!:#@><*|"'&%{}]+$`)
|
|
|
|
// IsValidName checks for invalid characters and path traversals.
|
|
func IsValidName(hyphaName string) bool {
|
|
if !hyphaNamePattern.MatchString(hyphaName) {
|
|
return false
|
|
}
|
|
for _, segment := range strings.Split(hyphaName, "/") {
|
|
if segment == ".git" || segment == ".." {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Hypha is the hypha you know and love.
|
|
type Hypha interface {
|
|
sync.Locker
|
|
|
|
// CanonicalName returns the canonical name of the hypha.
|
|
//
|
|
// util.CanonicalName(h.CanonicalName()) == h.CanonicalName()
|
|
CanonicalName() string
|
|
}
|
|
|
|
// ByName returns a hypha by name. It returns an *EmptyHypha if there is no such hypha. This function is the only source of empty hyphae.
|
|
func ByName(hyphaName string) (h Hypha) {
|
|
byNamesMutex.Lock()
|
|
defer byNamesMutex.Unlock()
|
|
h, recorded := byNames[hyphaName]
|
|
if recorded {
|
|
return h
|
|
}
|
|
return &EmptyHypha{
|
|
canonicalName: hyphaName,
|
|
}
|
|
}
|