Files
upaas/internal/handlers/app_name_validation.go
T
sneak 112cbfae1b
Check / check (pull_request) Skipped
Allow dots in app names (closes #260)
App names may now contain dots, such as sneak.berlin: runs of
lowercase letters and numbers joined by single dots or by hyphens,
2 to 63 characters. This is Docker's rule for an image name, and the
app's image is upaas-<name>; it also keeps a dot off either end, so
the name is safe as a directory and log file name.

The new and edit app forms use the same pattern. Their old one was not
a valid regular expression under the flag browsers compile it with, so
browsers ignored it.

A test deploys an app named sneak.berlin against the fake Docker API
and checks the image and container names with Docker's own rules.

Model: opus-5-5
2026-10-02 00:31:36 +00:00

50 lines
1.5 KiB
Go

package handlers
import (
"errors"
"regexp"
"strconv"
)
const (
// appNameMinLength is the minimum allowed length for an app name.
appNameMinLength = 2
// appNameMaxLength is the maximum allowed length for an app name.
appNameMaxLength = 63
)
// validAppNameRe matches runs of lowercase letters and digits joined by
// single dots or by hyphens, such as "my-app" or "sneak.berlin". This is
// Docker's rule for an image name, and the app's image is upaas-<name>.
// It also keeps the name from being "." or ".." or starting or ending
// with a dot, so it is safe as a directory and file name. The pattern
// attribute of the name field on the new and edit app forms is the same.
var validAppNameRe = regexp.MustCompile(`^[a-z0-9]+((\.|-+)[a-z0-9]+)*$`)
var (
errAppNameLength = errors.New(
"app name must be between " +
strconv.Itoa(appNameMinLength) + " and " +
strconv.Itoa(appNameMaxLength) + " characters",
)
errAppNamePattern = errors.New(
"app name must contain only lowercase letters, numbers, hyphens, " +
"and dots, must start and end with a letter or number, " +
"and must have a letter or number on both sides of each dot",
)
)
// validateAppName checks that the given app name is safe for use in Docker
// container names, image tags, and file system paths.
func validateAppName(name string) error {
if len(name) < appNameMinLength || len(name) > appNameMaxLength {
return errAppNameLength
}
if !validAppNameRe.MatchString(name) {
return errAppNamePattern
}
return nil
}