Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15416995
D19768.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Referenced Files
None
Subscribers
None
D19768.diff
View Options
diff --git a/resources/sql/autopatches/20181031.board.01.queryreset.php b/resources/sql/autopatches/20181031.board.01.queryreset.php
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20181031.board.01.queryreset.php
@@ -0,0 +1,50 @@
+<?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()));
+}
diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php
--- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php
+++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php
@@ -203,7 +203,7 @@
// with the column filter. If the user currently has constraints on the
// board, we want to add a new column or project constraint, not
// completely replace the constraints.
- $saved_query = clone $saved;
+ $saved_query = $saved->newCopy();
if ($query_column->getProxyPHID()) {
$project_phids = $saved_query->getParameter('projectPHIDs');
diff --git a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
--- a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
+++ b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
@@ -103,6 +103,14 @@
}
public function saveQuery(PhabricatorSavedQuery $query) {
+ if ($query->getID()) {
+ throw new Exception(
+ pht(
+ 'Query (with ID "%s") has already been saved. Queries are '.
+ 'immutable once saved.',
+ $query->getID()));
+ }
+
$query->setEngineClassName(get_class($this));
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
diff --git a/src/applications/search/storage/PhabricatorSavedQuery.php b/src/applications/search/storage/PhabricatorSavedQuery.php
--- a/src/applications/search/storage/PhabricatorSavedQuery.php
+++ b/src/applications/search/storage/PhabricatorSavedQuery.php
@@ -63,6 +63,13 @@
return $this->assertAttachedKey($this->parameterMap, $key);
}
+ public function newCopy() {
+ return id(new self())
+ ->setParameters($this->getParameters())
+ ->setQueryKey(null)
+ ->setEngineClassName($this->getEngineClassName());
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 21, 2:41 PM (1 d, 15 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7657547
Default Alt Text
D19768.diff (3 KB)
Attached To
Mode
D19768: Fix a bug where "View as Query" could replace a saved query row by ID, causing workboard 404s
Attached
Detach File
Event Timeline
Log In to Comment