package store import ( "errors" "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, "public": true, "history": true, "static": true, "assets": true, "favicon.ico": true, "new": true, "login": true, "logout": true, "admin": true, "settings": true, "mine": true, "saved": true, "unlock": true, "guess": true, "f": 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 } return n > 0, nil }