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, "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, "mine": 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 } 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 }