mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-22 14:52:41 +01:00
5d4970d6b2
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
50 lines
1.3 KiB
PHP
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()));
|
|
}
|