2020-08-09 19:33:47 +00:00
package util
import (
2020-11-14 10:39:18 +00:00
"crypto/rand"
"encoding/hex"
2021-05-09 10:42:12 +00:00
"log"
2020-08-31 17:52:26 +00:00
"net/http"
2021-01-28 19:07:21 +00:00
"regexp"
2020-08-09 19:33:47 +00:00
"strings"
2021-03-02 16:36:57 +00:00
"unicode"
2021-05-11 08:33:00 +00:00
"github.com/bouncepaw/mycorrhiza/cfg"
2020-08-09 19:33:47 +00:00
)
2021-05-09 10:42:12 +00:00
func PrepareRq ( rq * http . Request ) {
rq . URL . Path = strings . TrimSuffix ( rq . URL . Path , "/" )
}
2021-03-02 16:36:57 +00:00
// LettersNumbersOnly keeps letters and numbers only in the given string.
func LettersNumbersOnly ( s string ) string {
var (
ret strings . Builder
usedUnderscore bool
)
for _ , r := range s {
if unicode . IsLetter ( r ) || unicode . IsNumber ( r ) {
ret . WriteRune ( r )
usedUnderscore = false
} else if ! usedUnderscore {
ret . WriteRune ( '_' )
usedUnderscore = true
}
}
return strings . Trim ( ret . String ( ) , "_" )
}
2020-08-09 19:33:47 +00:00
// ShorterPath is used by handlerList to display shorter path to the files. It simply strips WikiDir.
func ShorterPath ( path string ) string {
2021-05-09 09:36:39 +00:00
if strings . HasPrefix ( path , cfg . WikiDir ) {
tmp := strings . TrimPrefix ( path , cfg . WikiDir )
2020-08-09 19:33:47 +00:00
if tmp == "" {
return ""
}
return tmp [ 1 : ]
}
return path
}
2020-08-31 17:52:26 +00:00
2021-03-05 12:20:51 +00:00
// HTTP404Page writes a 404 error in the status, needed when no content is found on the page.
func HTTP404Page ( w http . ResponseWriter , page string ) {
w . Header ( ) . Set ( "Content-Type" , "text/html;charset=utf-8" )
w . WriteHeader ( http . StatusNotFound )
w . Write ( [ ] byte ( page ) )
}
2020-08-31 17:52:26 +00:00
// HTTP200Page wraps some frequently used things for successful 200 responses.
func HTTP200Page ( w http . ResponseWriter , page string ) {
w . Header ( ) . Set ( "Content-Type" , "text/html;charset=utf-8" )
w . WriteHeader ( http . StatusOK )
w . Write ( [ ] byte ( page ) )
}
2020-10-03 16:56:56 +00:00
2020-11-14 10:39:18 +00:00
func RandomString ( n int ) ( string , error ) {
bytes := make ( [ ] byte , n )
if _ , err := rand . Read ( bytes ) ; err != nil {
return "" , err
}
return hex . EncodeToString ( bytes ) , nil
}
2021-01-10 11:58:02 +00:00
// Strip hypha name from all ancestor names, replace _ with spaces, title case
func BeautifulName ( uglyName string ) string {
2021-01-11 16:13:41 +00:00
if uglyName == "" {
return uglyName
}
2021-01-14 11:39:54 +00:00
return strings . Title ( strings . ReplaceAll ( uglyName , "_" , " " ) )
2021-01-10 11:58:02 +00:00
}
2021-01-28 19:07:21 +00:00
// CanonicalName makes sure the `name` is canonical. A name is canonical if it is lowercase and all spaces are replaced with underscores.
func CanonicalName ( name string ) string {
2021-04-19 16:39:25 +00:00
return strings . ToLower (
strings . ReplaceAll (
strings . TrimRight (
strings . TrimLeft ( name , "_" ) ,
"_" ,
) , " " , "_" ) )
2021-01-28 19:07:21 +00:00
}
// HyphaPattern is a pattern which all hyphae must match.
2021-05-09 09:36:39 +00:00
var HyphaPattern = regexp . MustCompile ( ` [^?!:#@><*|"'&% { }]+ ` )
2021-01-28 19:07:21 +00:00
2021-05-09 09:36:39 +00:00
var UsernamePattern = regexp . MustCompile ( ` [^?!:#@><*|"'&% { }/]+ ` )
2021-04-19 16:39:25 +00:00
2021-01-28 19:07:21 +00:00
// IsCanonicalName checks if the `name` is canonical.
func IsCanonicalName ( name string ) bool {
return HyphaPattern . MatchString ( name )
}
2021-04-19 16:39:25 +00:00
func IsPossibleUsername ( username string ) bool {
2021-05-27 04:41:36 +00:00
return username != "anon" && UsernamePattern . MatchString ( strings . TrimSpace ( username ) )
2021-04-19 16:39:25 +00:00
}
2021-05-09 10:42:12 +00:00
// HyphaNameFromRq extracts hypha name from http request. You have to also pass the action which is embedded in the url or several actions. For url /hypha/hypha, the action would be "hypha".
func HyphaNameFromRq ( rq * http . Request , actions ... string ) string {
p := rq . URL . Path
for _ , action := range actions {
if strings . HasPrefix ( p , "/" + action + "/" ) {
return CanonicalName ( strings . TrimPrefix ( p , "/" + action + "/" ) )
}
}
log . Println ( "HyphaNameFromRq: this request is invalid, fallback to home hypha" )
return cfg . HomeHypha
}