@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Throw an exception if `local.json` can't be read

Summary: Our `local.json` configuration file contains various secrets, including database usernames and passwords. As such, we recently changed the permissions on this file from `0644` to `0640`. After doing so, however, I constantly forget to run commands with `sudo`. This is made worse by the fact that `PhabricatorConfigLocalSource` seems to simply ignore `local.json` is it isn't readable, whereas throwing an `Exception` would have saved me a lot of debugging.

Test Plan:
```name=Before
> /usr/local/src/phabricator/bin/config get mysql.pass
{
"config": [
{
"key": "mysql.pass",
"source": "local",
"value": null,
"status": "unset",
"errorInfo": null
},
{
"key": "mysql.pass",
"source": "database",
"value": null,
"status": "error",
"errorInfo": "Database source is not configured properly"
}
]
}
```

```name=After
> /usr/local/src/phabricator/bin/config get mysql.pass
[2017-05-16 21:49:26] EXCEPTION: (FilesystemException) Path '/usr/local/src/phabricator/conf/local/local.json' is not readable. at [<phutil>/src/filesystem/Filesystem.php:1124]
arcanist(head=stable, ref.master=3c4735795a29, ref.stable=20ad47f27331), phabricator(head=stable, ref.master=3dae9701298f, ref.stable=fcebaa5097f3), phutil(head=stable, ref.master=a900d7b63e95, ref.stable=d02cc05931b0)
#0 Filesystem::assertReadable(string) called at [<phutil>/src/filesystem/Filesystem.php:39]
#1 Filesystem::readFile(string) called at [<phabricator>/src/infrastructure/env/PhabricatorConfigLocalSource.php:25]
#2 PhabricatorConfigLocalSource::loadConfig() called at [<phabricator>/src/infrastructure/env/PhabricatorConfigLocalSource.php:6]
#3 PhabricatorConfigLocalSource::__construct() called at [<phabricator>/src/infrastructure/env/PhabricatorEnv.php:195]
#4 PhabricatorEnv::buildConfigurationSourceStack(boolean) called at [<phabricator>/src/infrastructure/env/PhabricatorEnv.php:95]
#5 PhabricatorEnv::initializeCommonEnvironment(boolean) called at [<phabricator>/src/infrastructure/env/PhabricatorEnv.php:75]
#6 PhabricatorEnv::initializeScriptEnvironment(boolean) called at [<phabricator>/scripts/init/lib.php:22]
#7 init_phabricator_script(array) called at [<phabricator>/scripts/init/init-setup.php:11]
#8 require_once(string) called at [<phabricator>/scripts/setup/manage_config.php:5]
```

Reviewers: #blessed_reviewers, joshuaspence

Reviewed By: joshuaspence

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D17917

authored by

Joshua Spence and committed by
epriestley
0ed496de 772afc5e

+27 -9
+27 -9
src/infrastructure/env/PhabricatorConfigLocalSource.php
··· 21 21 22 22 private function loadConfig() { 23 23 $path = $this->getConfigPath(); 24 - if (@file_exists($path)) { 25 - $data = @file_get_contents($path); 26 - if ($data) { 27 - $data = json_decode($data, true); 28 - if (is_array($data)) { 29 - return $data; 30 - } 31 - } 24 + 25 + if (!Filesystem::pathExists($path)) { 26 + return array(); 32 27 } 33 28 34 - return array(); 29 + try { 30 + $data = Filesystem::readFile($path); 31 + } catch (FilesystemException $ex) { 32 + throw new PhutilProxyException( 33 + pht( 34 + 'Configuration file "%s" exists, but could not be read.', 35 + $path), 36 + $ex); 37 + } 38 + 39 + try { 40 + $result = phutil_json_decode($data); 41 + } catch (PhutilJSONParserException $ex) { 42 + throw new PhutilProxyException( 43 + pht( 44 + 'Configuration file "%s" exists and is readable, but the content '. 45 + 'is not valid JSON. You may have edited this file manually and '. 46 + 'introduced a syntax error by mistake. Correct the file syntax '. 47 + 'to continue.', 48 + $path), 49 + $ex); 50 + } 51 + 52 + return $result; 35 53 } 36 54 37 55 private function saveConfig() {