Skip to content

Commit

Permalink
[feature] Allow emoji shortcode to be 1-character length (#3556)
Browse files Browse the repository at this point in the history
* [feature] Allow emoji shortcode to be 1-character length

* testerino fixeroni

* spaghet
  • Loading branch information
tsmethurst authored Nov 21, 2024
1 parent daf55ba commit c2029df
Show file tree
Hide file tree
Showing 9 changed files with 17 additions and 13 deletions.
4 changes: 2 additions & 2 deletions docs/api/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4920,7 +4920,7 @@ paths:
- description: The code to use for the emoji, which will be used by instance denizens to select it. This must be unique on the instance.
in: formData
name: shortcode
pattern: \w{2,30}
pattern: \w{1,30}
required: true
type: string
- description: A png or gif image of the emoji. Animated pngs work too! To ensure compatibility with other fedi implementations, emoji size limit is 50kb by default.
Expand Down Expand Up @@ -5066,7 +5066,7 @@ paths:
- description: The code to use for the emoji, which will be used by instance denizens to select it. This must be unique on the instance. Works for the `copy` action type only.
in: formData
name: shortcode
pattern: \w{2,30}
pattern: \w{1,30}
type: string
- description: A new png or gif image to use for the emoji. Animated pngs work too! To ensure compatibility with other fedi implementations, emoji size limit is 50kb by default. Works for LOCAL emojis only.
in: formData
Expand Down
2 changes: 1 addition & 1 deletion internal/api/client/admin/emojicreate.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ import (
// The code to use for the emoji, which will be used by instance denizens to select it.
// This must be unique on the instance.
// type: string
// pattern: \w{2,30}
// pattern: \w{1,30}
// required: true
// -
// name: image
Expand Down
2 changes: 1 addition & 1 deletion internal/api/client/admin/emojiupdate.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ import (
// The code to use for the emoji, which will be used by instance denizens to select it.
// This must be unique on the instance. Works for the `copy` action type only.
// type: string
// pattern: \w{2,30}
// pattern: \w{1,30}
// -
// name: image
// in: formData
Expand Down
2 changes: 1 addition & 1 deletion internal/api/client/admin/emojiupdate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,7 @@ func (suite *EmojiUpdateTestSuite) TestEmojiUpdateCopyEmptyShortcode() {
b, err := io.ReadAll(result.Body)
suite.NoError(err)

suite.Equal(`{"error":"Bad Request: shortcode did not pass validation, must be between 2 and 30 characters, letters, numbers, and underscores only"}`, string(b))
suite.Equal(`{"error":"Bad Request: shortcode did not pass validation, must be between 1 and 30 characters, letters, numbers, and underscores only"}`, string(b))
}

func (suite *EmojiUpdateTestSuite) TestEmojiUpdateCopyNoShortcode() {
Expand Down
2 changes: 1 addition & 1 deletion internal/regexes/regexes.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ const (
domainGrp = `(?:` + alphaNumeric + `|\.|\-|\:)` // Non-capturing group that matches against a single valid domain character.
mentionName = `^@(` + usernameGrp + `+)(?:@(` + domainGrp + `+))?$` // Extract parts of one mention, maybe including domain.
mentionFinder = `(?:^|\s)(@` + usernameGrp + `+(?:@` + domainGrp + `+)?)` // Extract all mentions from a text, each mention may include domain.
emojiShortcode = `\w{2,30}` // Pattern for emoji shortcodes. maximumEmojiShortcodeLength = 30
emojiShortcode = `\w{1,30}` // Pattern for emoji shortcodes. maximumEmojiShortcodeLength = 30
emojiFinder = `(?:\b)?:(` + emojiShortcode + `):(?:\b)?` // Extract all emoji shortcodes from a text.
emojiValidator = `^` + emojiShortcode + `$` // Validate a single emoji shortcode.
usernameStrict = `^[a-z0-9_]{1,64}$` // Pattern for usernames on THIS instance. maximumUsernameLength = 64
Expand Down
4 changes: 2 additions & 2 deletions internal/validate/formvalidation.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,11 @@ func CustomCSS(customCSS string) error {
}

// EmojiShortcode just runs the given shortcode through the regular expression
// for emoji shortcodes, to figure out whether it's a valid shortcode, ie., 2-30 characters,
// for emoji shortcodes, to figure out whether it's a valid shortcode, ie., 1-30 characters,
// a-zA-Z, numbers, and underscores.
func EmojiShortcode(shortcode string) error {
if !regexes.EmojiValidator.MatchString(shortcode) {
return fmt.Errorf("shortcode %s did not pass validation, must be between 2 and 30 characters, letters, numbers, and underscores only", shortcode)
return fmt.Errorf("shortcode %s did not pass validation, must be between 1 and 30 characters, letters, numbers, and underscores only", shortcode)
}
return nil
}
Expand Down
6 changes: 5 additions & 1 deletion internal/validate/formvalidation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ func (suite *ValidationTestSuite) TestValidateEmojiShortcode() {
},
{
shortcode: "p",
ok: false,
ok: true,
},
{
shortcode: "pp",
Expand All @@ -361,6 +361,10 @@ func (suite *ValidationTestSuite) TestValidateEmojiShortcode() {
},
{
shortcode: "_",
ok: true,
},
{
shortcode: "",
ok: false,
},
{
Expand Down
2 changes: 1 addition & 1 deletion web/source/settings/views/admin/emoji/local/new-emoji.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ export default function NewEmojiForm() {
label="Shortcode, must be unique among the instance's local emoji"
autoCapitalize="none"
spellCheck="false"
{...{pattern: "^\\w{2,30}$"}}
{...{pattern: "^\\w{1,30}$"}}
/>

<CategorySelect
Expand Down
6 changes: 3 additions & 3 deletions web/source/settings/views/admin/emoji/local/use-shortcode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { useMemo } from "react";
import { useTextInput } from "../../../../lib/form";
import { useListEmojiQuery } from "../../../../lib/query/admin/custom-emoji";

const shortcodeRegex = /^\w{2,30}$/;
const shortcodeRegex = /^\w{1,30}$/;

export default function useShortcode() {
const { data: emoji = [] } = useListEmojiQuery({
Expand All @@ -42,8 +42,8 @@ export default function useShortcode() {
return "Shortcode already in use";
}

if (code.length < 2 || code.length > 30) {
return "Shortcode must be between 2 and 30 characters";
if (code.length < 1 || code.length > 30) {
return "Shortcode must be between 1 and 30 characters";
}

if (!shortcodeRegex.test(code)) {
Expand Down

0 comments on commit c2029df

Please sign in to comment.