package main import ( "errors" "fmt" "regexp" "strings" ) var slugRE = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9-_]{0,63}$`) // reserved words that would collide with routes var reservedSlugs = map[string]bool{ "api": true, "raw": true, "can": true, "cans": true, "public": true, "history": true, "static": true, "assets": true, "favicon.ico": true, "new": true, "login": true, "logout": true, "admin": true, "settings": true, } var errInvalidSlug = errors.New("custom slug must be 1-64 chars: letters, digits, dash, underscore; must start with letter or digit") var errReservedSlug = errors.New("that slug is reserved") var errSlugTaken = errors.New("that slug is already taken") func ValidateCustomSlug(slug string) error { if !slugRE.MatchString(slug) { return errInvalidSlug } if reservedSlugs[strings.ToLower(slug)] { return errReservedSlug } return nil } func (s *Store) SlugTaken(slug string) (bool, error) { var n int err := s.db.QueryRow(`SELECT COUNT(*) FROM pastes WHERE custom_slug = ? OR id = ?`, slug, slug).Scan(&n) if err != nil { return false, err } if n > 0 { return true, nil } err = s.db.QueryRow(`SELECT COUNT(*) FROM paste_cans WHERE id = ?`, slug).Scan(&n) if err != nil { return false, err } return n > 0, nil } var _ = fmt.Sprintf // keep fmt if unused later