From a9519d39f7dbe5d26808868533fae1617978d2a2 Mon Sep 17 00:00:00 2001
From: mark_story <mark@mark-story.com>
Date: Sun, 8 Mar 2015 13:51:46 -0400
Subject: [PATCH] Fix whitelist being empty during afterSave.

whitelist should only be reset after afterSave event.

Refs #6028
---
 lib/Cake/Model/Model.php                    |  4 +--
 lib/Cake/Test/Case/Model/ModelWriteTest.php | 32 +++++++++++++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php
index 72d4361b7..0bdbf2cab 100644
--- a/lib/Cake/Model/Model.php
+++ b/lib/Cake/Model/Model.php
@@ -1941,9 +1941,8 @@ class Model extends Object implements CakeEventListener {
 			$this->_saveMulti($joined, $this->id, $db);
 		}
 
-		$this->whitelist = $_whitelist;
-
 		if (!$success) {
+			$this->whitelist = $_whitelist;
 			return $success;
 		}
 
@@ -1964,6 +1963,7 @@ class Model extends Object implements CakeEventListener {
 
 		$this->_clearCache();
 		$this->validationErrors = array();
+		$this->whitelist = $_whitelist;
 		$this->data = false;
 
 		return $success;
diff --git a/lib/Cake/Test/Case/Model/ModelWriteTest.php b/lib/Cake/Test/Case/Model/ModelWriteTest.php
index 529d62902..c0349ed48 100644
--- a/lib/Cake/Test/Case/Model/ModelWriteTest.php
+++ b/lib/Cake/Test/Case/Model/ModelWriteTest.php
@@ -387,6 +387,38 @@ class ModelWriteTest extends BaseModelTest {
 		$this->assertEquals($whitelist, $model->whitelist);
 	}
 
+/**
+ * Test save() resets the whitelist after afterSave
+ *
+ * @return void
+ */
+	public function testSaveResetWhitelistOnSuccess() {
+		$this->loadFixtures('Post');
+
+		$callback = array($this, 'callbackForWhitelistReset');
+		$model = ClassRegistry::init('Post');
+		$model->whitelist = array('author_id', 'title', 'body');
+		$model->getEventManager()->attach($callback, 'Model.afterSave');
+		$data = array(
+			'title' => 'New post',
+			'body' => 'Post body',
+			'author_id' => 1
+		);
+		$result = $model->save($data);
+		$this->assertNotEmpty($result);
+	}
+
+/**
+ * Callback for testing whitelist in afterSave
+ *
+ * @param Model $model The model having save called.
+ * @return void
+ */
+	public function callbackForWhitelistReset($event) {
+		$expected = array('author_id', 'title', 'body', 'updated', 'created');
+		$this->assertEquals($expected, $event->subject()->whitelist);
+	}
+
 /**
  * testSaveWithCounterCache method
  *