Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15421833
D18164.id43697.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Referenced Files
None
Subscribers
None
D18164.id43697.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -3010,6 +3010,7 @@
'PhabricatorIteratedMD5PasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorIteratedMD5PasswordHasherTestCase.php',
'PhabricatorIteratorFileUploadSource' => 'applications/files/uploadsource/PhabricatorIteratorFileUploadSource.php',
'PhabricatorJIRAAuthProvider' => 'applications/auth/provider/PhabricatorJIRAAuthProvider.php',
+ 'PhabricatorJSONConfigType' => 'applications/config/type/PhabricatorJSONConfigType.php',
'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/PhabricatorJavelinLinter.php',
'PhabricatorJiraIssueHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorJiraIssueHasObjectEdgeType.php',
'PhabricatorJumpNavHandler' => 'applications/search/engine/PhabricatorJumpNavHandler.php',
@@ -4263,6 +4264,7 @@
'PhabricatorWebContentSource' => 'infrastructure/contentsource/PhabricatorWebContentSource.php',
'PhabricatorWebServerSetupCheck' => 'applications/config/check/PhabricatorWebServerSetupCheck.php',
'PhabricatorWeekStartDaySetting' => 'applications/settings/setting/PhabricatorWeekStartDaySetting.php',
+ 'PhabricatorWildConfigType' => 'applications/config/type/PhabricatorWildConfigType.php',
'PhabricatorWordPressAuthProvider' => 'applications/auth/provider/PhabricatorWordPressAuthProvider.php',
'PhabricatorWorker' => 'infrastructure/daemon/workers/PhabricatorWorker.php',
'PhabricatorWorkerActiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerActiveTask.php',
@@ -8348,6 +8350,7 @@
'PhabricatorIteratedMD5PasswordHasherTestCase' => 'PhabricatorTestCase',
'PhabricatorIteratorFileUploadSource' => 'PhabricatorFileUploadSource',
'PhabricatorJIRAAuthProvider' => 'PhabricatorOAuth1AuthProvider',
+ 'PhabricatorJSONConfigType' => 'PhabricatorTextConfigType',
'PhabricatorJavelinLinter' => 'ArcanistLinter',
'PhabricatorJiraIssueHasObjectEdgeType' => 'PhabricatorEdgeType',
'PhabricatorJumpNavHandler' => 'Phobject',
@@ -9839,6 +9842,7 @@
'PhabricatorWebContentSource' => 'PhabricatorContentSource',
'PhabricatorWebServerSetupCheck' => 'PhabricatorSetupCheck',
'PhabricatorWeekStartDaySetting' => 'PhabricatorSelectSetting',
+ 'PhabricatorWildConfigType' => 'PhabricatorJSONConfigType',
'PhabricatorWordPressAuthProvider' => 'PhabricatorOAuth2AuthProvider',
'PhabricatorWorker' => 'Phobject',
'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask',
diff --git a/src/applications/config/controller/PhabricatorConfigEditController.php b/src/applications/config/controller/PhabricatorConfigEditController.php
--- a/src/applications/config/controller/PhabricatorConfigEditController.php
+++ b/src/applications/config/controller/PhabricatorConfigEditController.php
@@ -325,40 +325,14 @@
$e_value = null;
$errors = array();
-
if ($option->isCustomType()) {
$info = $option->getCustomObject()->readRequest($option, $request);
list($e_value, $errors, $set_value, $value) = $info;
} else {
- $value = $request->getStr('value');
- if (!strlen($value)) {
- $value = null;
-
- $xaction->setNewValue(
- array(
- 'deleted' => true,
- 'value' => null,
- ));
-
- return array($e_value, $errors, $value, $xaction);
- }
-
- $type = $option->getType();
- $set_value = null;
-
- switch ($type) {
- default:
- $json = json_decode($value, true);
- if ($json === null && strtolower($value) != 'null') {
- $e_value = pht('Invalid');
- $errors[] = pht(
- 'The given value must be valid JSON. This means, among '.
- 'other things, that you must wrap strings in double-quotes.');
- } else {
- $set_value = $json;
- }
- break;
- }
+ throw new Exception(
+ pht(
+ 'Unknown configuration option type "%s".',
+ $option->getType()));
}
if (!$errors) {
@@ -389,13 +363,12 @@
$option,
$entry,
$value);
- } else {
- $type = $option->getType();
- switch ($type) {
- default:
- return PhabricatorConfigJSON::prettyPrintJSON($value);
- }
}
+
+ throw new Exception(
+ pht(
+ 'Unknown configuration option type "%s".',
+ $option->getType()));
}
private function renderControls(
@@ -417,23 +390,10 @@
$display_value,
$e_value);
} else {
- $type = $option->getType();
- switch ($type) {
- default:
- $control = id(new AphrontFormTextAreaControl())
- ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_TALL)
- ->setCustomClass('PhabricatorMonospaced')
- ->setCaption(pht('Enter value in JSON.'));
- break;
- }
-
- $control
- ->setLabel(pht('Database Value'))
- ->setError($e_value)
- ->setValue($display_value)
- ->setName('value');
-
- $controls = array($control);
+ throw new Exception(
+ pht(
+ 'Unknown configuration option type "%s".',
+ $option->getType()));
}
return $controls;
diff --git a/src/applications/config/management/PhabricatorConfigManagementSetWorkflow.php b/src/applications/config/management/PhabricatorConfigManagementSetWorkflow.php
--- a/src/applications/config/management/PhabricatorConfigManagementSetWorkflow.php
+++ b/src/applications/config/management/PhabricatorConfigManagementSetWorkflow.php
@@ -70,6 +70,7 @@
throw new PhutilArgumentUsageException($ex->getMessage());
}
} else {
+ // NOTE: For now, this handles both "wild" values and custom types.
$type = $option->getType();
switch ($type) {
default:
diff --git a/src/applications/config/option/PhabricatorApplicationConfigOptions.php b/src/applications/config/option/PhabricatorApplicationConfigOptions.php
--- a/src/applications/config/option/PhabricatorApplicationConfigOptions.php
+++ b/src/applications/config/option/PhabricatorApplicationConfigOptions.php
@@ -24,6 +24,7 @@
if ($type) {
try {
$type->validateStoredValue($option, $value);
+ $this->didValidateOption($option, $value);
} catch (PhabricatorConfigValidationException $ex) {
throw $ex;
} catch (Exception $ex) {
@@ -32,6 +33,8 @@
// configuration and raise an error.
throw new PhabricatorConfigValidationException($ex->getMessage());
}
+
+ return;
}
if ($option->isCustomType()) {
@@ -40,12 +43,11 @@
} catch (Exception $ex) {
throw new PhabricatorConfigValidationException($ex->getMessage());
}
- }
-
- switch ($option->getType()) {
- case 'wild':
- default:
- break;
+ } else {
+ throw new Exception(
+ pht(
+ 'Unknown configuration option type "%s".',
+ $option->getType()));
}
$this->didValidateOption($option, $value);
diff --git a/src/applications/config/type/PhabricatorJSONConfigType.php b/src/applications/config/type/PhabricatorJSONConfigType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/config/type/PhabricatorJSONConfigType.php
@@ -0,0 +1,38 @@
+<?php
+
+abstract class PhabricatorJSONConfigType
+ extends PhabricatorTextConfigType {
+
+ protected function newCanonicalValue(
+ PhabricatorConfigOption $option,
+ $value) {
+
+ try {
+ $value = phutil_json_decode($value);
+ } catch (Exception $ex) {
+ throw $this->newException(
+ pht(
+ 'Value for option "%s" (of type "%s") must be specified in JSON, '.
+ 'but input could not be decoded: %s',
+ $option->getKey(),
+ $this->getTypeKey(),
+ $ex->getMessage()));
+ }
+
+ return $value;
+ }
+
+ protected function newControl(PhabricatorConfigOption $option) {
+ return id(new AphrontFormTextAreaControl())
+ ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_TALL)
+ ->setCustomClass('PhabricatorMonospaced')
+ ->setCaption(pht('Enter value in JSON.'));
+ }
+
+ public function newDisplayValue(
+ PhabricatorConfigOption $option,
+ $value) {
+ return PhabricatorConfigJSON::prettyPrintJSON($value);
+ }
+
+}
diff --git a/src/applications/config/type/PhabricatorWildConfigType.php b/src/applications/config/type/PhabricatorWildConfigType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/config/type/PhabricatorWildConfigType.php
@@ -0,0 +1,39 @@
+<?php
+
+final class PhabricatorWildConfigType
+ extends PhabricatorJSONConfigType {
+
+ const TYPEKEY = 'wild';
+
+ protected function newCanonicalValue(
+ PhabricatorConfigOption $option,
+ $value) {
+
+ $raw_value = $value;
+
+ // NOTE: We're significantly more liberal about canonicalizing "wild"
+ // values than "JSON" values because they're used to deal with some
+ // unusual edge cases, including situations where old config has been left
+ // in the database and we aren't sure what type it's supposed to be.
+ // Accept anything we can decode.
+
+ $value = json_decode($raw_value, true);
+ if ($value === null && $raw_value != 'null') {
+ throw $this->newException(
+ pht(
+ 'Value for option "%s" (of type "%s") must be specified in JSON, '.
+ 'but input could not be decoded. (Did you forget to quote a string?)',
+ $option->getKey(),
+ $this->getTypeKey()));
+ }
+
+ return $value;
+ }
+
+ public function validateStoredValue(
+ PhabricatorConfigOption $option,
+ $value) {
+ return;
+ }
+
+}
diff --git a/src/applications/people/config/PhabricatorUserConfigOptions.php b/src/applications/people/config/PhabricatorUserConfigOptions.php
--- a/src/applications/people/config/PhabricatorUserConfigOptions.php
+++ b/src/applications/people/config/PhabricatorUserConfigOptions.php
@@ -43,7 +43,7 @@
$this->newOption('user.fields', $custom_field_type, $default)
->setCustomData(id(new PhabricatorUser())->getCustomFieldBaseClass())
->setDescription(pht('Select and reorder user profile fields.')),
- $this->newOption('user.custom-field-definitions', 'map', array())
+ $this->newOption('user.custom-field-definitions', 'wild', array())
->setDescription(pht('Add new simple fields to user profiles.')),
$this->newOption('user.require-real-name', 'bool', true)
->setDescription(pht('Always require real name for user profiles.'))
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 23, 2:29 AM (1 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7712856
Default Alt Text
D18164.id43697.diff (10 KB)
Attached To
Mode
D18164: Move "wild" config types to new code
Attached
Detach File
Event Timeline
Log In to Comment