1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 16:22:43 +01:00
phorge-phorge/resources/sql/autopatches/20181031.board.01.queryreset.php
epriestley 5d4970d6b2 Fix a bug where "View as Query" could replace a saved query row by ID, causing workboard 404s
Summary:
Fixes T13208. See that task for details.

The `clone $query` line is safe if `$query` is a builtin query (like "open").

However, if it's a saved query we clone not only the query parameters but the ID, too. Then when we `save()` the query later, we overwrite the original query.

So this would happen in the database. First, you run a query and save it as the workboard default (query key "abc123"):

| 123 | abc123 | {"...xxx..."} |

Then we `clone` it and change the parameters, and `save()` it. But that causes an `UPDATE ... WHERE id = 123` and the table now looks like this:

| 123 | def456 | {"...yyy..."} |

What we want is to create a new query instead, with an `INSERT ...`:

| 123 | abc123 | {"...xxx..."} |
| 124 | def456 | {"...yyy..."} |

Test Plan:
  - Followed reproduction steps from above.
    - With just the new `save()` guard, hit the guard error.
    - With the `newCopy()`, got a new copy of the query and "View as Query" remained functional without overwriting the original query row.
  - Ran migration, saw an affected board get fixed.

Reviewers: amckinley, joshuaspence

Reviewed By: joshuaspence

Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam

Maniphest Tasks: T13208

Differential Revision: https://secure.phabricator.com/D19768
2018-11-01 05:44:49 -07:00

50 lines
1.3 KiB
PHP

<?php
// See T13208. It was previously possible to replace a saved query with another
// saved query, causing loss of the first query. Find projects which have their
// default query set to an invalid query and throw the setting away.
$viewer = PhabricatorUser::getOmnipotentUser();
$table = new PhabricatorProject();
$conn = $table->establishConnection('w');
$iterator = new LiskMigrationIterator($table);
$search_engine = id(new ManiphestTaskSearchEngine())
->setViewer($viewer);
foreach ($iterator as $project) {
$default_filter = $project->getDefaultWorkboardFilter();
if (!strlen($default_filter)) {
continue;
}
if ($search_engine->isBuiltinQuery($default_filter)) {
continue;
}
$saved = id(new PhabricatorSavedQueryQuery())
->setViewer($viewer)
->withQueryKeys(array($default_filter))
->executeOne();
if ($saved) {
continue;
}
$properties = $project->getProperties();
unset($properties['workboard.filter.default']);
queryfx(
$conn,
'UPDATE %T SET properties = %s WHERE id = %d',
$table->getTableName(),
phutil_json_encode($properties),
$project->getID());
echo tsprintf(
"%s\n",
pht(
'Project ("%s") had an invalid query saved as a default workboard '.
'query. The query has been reset. See T13208.',
$project->getDisplayName()));
}