Changeset View
Changeset View
Standalone View
Standalone View
src/applications/macro/xaction/PhabricatorMacroNameTransaction.php
| Show First 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | foreach ($xactions as $xaction) { | ||||
| $new_length = strlen($new_value); | $new_length = strlen($new_value); | ||||
| if ($new_length > $max_length) { | if ($new_length > $max_length) { | ||||
| $errors[] = $this->newInvalidError( | $errors[] = $this->newInvalidError( | ||||
| pht('The name can be no longer than %s characters.', | pht('The name can be no longer than %s characters.', | ||||
| new PhutilNumber($max_length))); | new PhutilNumber($max_length))); | ||||
| } | } | ||||
| if (!preg_match('/^[a-z0-9:_-]{3,}\z/', $new_value)) { | if (!self::isValidMacroName($new_value)) { | ||||
| // This says "emoji", but the actual rule we implement is "all other | |||||
| // unicode characters are also fine". | |||||
| $errors[] = $this->newInvalidError( | $errors[] = $this->newInvalidError( | ||||
| pht('Macro name "%s" be at least three characters long and contain '. | pht( | ||||
| 'only lowercase letters, digits, hyphens, colons and '. | 'Macro name "%s" be: at least three characters long; and contain '. | ||||
| 'underscores.', | 'only lowercase letters, digits, hyphens, colons, underscores, '. | ||||
| $new_value)); | 'and emoji; and not be composed entirely of latin symbols.', | ||||
| $new_value), | |||||
| $xaction); | |||||
| } | } | ||||
| // Check name is unique when updating / creating | // Check name is unique when updating / creating | ||||
| if ($old_value != $new_value) { | if ($old_value != $new_value) { | ||||
| $macro = id(new PhabricatorMacroQuery()) | $macro = id(new PhabricatorMacroQuery()) | ||||
| ->setViewer($viewer) | ->setViewer($viewer) | ||||
| ->withNames(array($new_value)) | ->withNames(array($new_value)) | ||||
| ->executeOne(); | ->executeOne(); | ||||
| if ($macro) { | if ($macro) { | ||||
| $errors[] = $this->newInvalidError( | $errors[] = $this->newInvalidError( | ||||
| pht('Macro "%s" already exists.', $new_value)); | pht('Macro "%s" already exists.', $new_value)); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return $errors; | return $errors; | ||||
| } | } | ||||
| public static function isValidMacroName($name) { | |||||
| if (preg_match('/^[:_-]+\z/', $name)) { | |||||
| return false; | |||||
| } | |||||
| // Accept trivial macro names. | |||||
| if (preg_match('/^[a-z0-9:_-]{3,}\z/', $name)) { | |||||
| return true; | |||||
| } | |||||
| // Reject names with fewer than 3 glyphs. | |||||
| $length = phutil_utf8v_combined($name); | |||||
| if (count($length) < 3) { | |||||
| return false; | |||||
| } | |||||
| // Check character-by-character for any symbols that we don't want. | |||||
| $characters = phutil_utf8v($name); | |||||
| foreach ($characters as $character) { | |||||
| if (ord($character[0]) > 0x7F) { | |||||
| continue; | |||||
| } | |||||
| if (preg_match('/^[^a-z0-9:_-]/', $character)) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| } | } | ||||