From 4fa9e46d2b92c03e81c0ffeaebfd28d400bacf0c Mon Sep 17 00:00:00 2001
From: Joas Schilling <nickvergessen@gmx.de>
Date: Wed, 9 Apr 2014 16:42:10 +0200
Subject: [PATCH] Emit a new hook, when a file is being updated only The
 write-hook also is triggered for created files

Fix #8131
---
 lib/private/files/filesystem.php | 16 ++++++++++++++++
 lib/private/files/view.php       | 32 +++++++++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php
index 434ee49587..52df1bec61 100644
--- a/lib/private/files/filesystem.php
+++ b/lib/private/files/filesystem.php
@@ -118,6 +118,22 @@ class Filesystem {
 	 */
 	const signal_post_write = 'post_write';
 
+	/**
+	 * signal emitted before file/dir update
+	 *
+	 * @param string $path
+	 * @param bool $run changing this flag to false in hook handler will cancel event
+	 */
+	const signal_update = 'update';
+
+	/**
+	 * signal emitted after file/dir update
+	 *
+	 * @param string $path
+	 * @param bool $run changing this flag to false in hook handler will cancel event
+	 */
+	const signal_post_update = 'post_update';
+
 	/**
 	 * signal emits when reading file/dir
 	 *
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 31ec8cfacf..1291ed170e 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -291,6 +291,15 @@ class View {
 								Filesystem::signal_param_run => &$run
 							)
 						);
+					} else {
+						\OC_Hook::emit(
+							Filesystem::CLASSNAME,
+							Filesystem::signal_update,
+							array(
+								Filesystem::signal_param_path => $this->getHookPath($path),
+								Filesystem::signal_param_run => &$run,
+							)
+						);
 					}
 					\OC_Hook::emit(
 						Filesystem::CLASSNAME,
@@ -319,6 +328,12 @@ class View {
 								Filesystem::signal_post_create,
 								array(Filesystem::signal_param_path => $this->getHookPath($path))
 							);
+						} else {
+							\OC_Hook::emit(
+								Filesystem::CLASSNAME,
+								Filesystem::signal_post_update,
+								array(Filesystem::signal_param_path => $this->getHookPath($path))
+							);
 						}
 						\OC_Hook::emit(
 							Filesystem::CLASSNAME,
@@ -335,7 +350,7 @@ class View {
 				return false;
 			}
 		} else {
-			$hooks = ($this->file_exists($path)) ? array('write') : array('create', 'write');
+			$hooks = ($this->file_exists($path)) ? array('update', 'write') : array('create', 'write');
 			return $this->basicOperation('file_put_contents', $path, $hooks, $data);
 		}
 	}
@@ -516,6 +531,15 @@ class View {
 							Filesystem::signal_param_run => &$run
 						)
 					);
+				} elseif ($run) {
+					\OC_Hook::emit(
+						Filesystem::CLASSNAME,
+						Filesystem::signal_update,
+						array(
+							Filesystem::signal_param_path => $this->getHookPath($path2),
+							Filesystem::signal_param_run => &$run,
+						)
+					);
 				}
 				if ($run) {
 					\OC_Hook::emit(
@@ -572,6 +596,12 @@ class View {
 							Filesystem::signal_post_create,
 							array(Filesystem::signal_param_path => $this->getHookPath($path2))
 						);
+					} else {
+						\OC_Hook::emit(
+							Filesystem::CLASSNAME,
+							Filesystem::signal_post_update,
+							array(Filesystem::signal_param_path => $this->getHookPath($path2))
+						);
 					}
 					\OC_Hook::emit(
 						Filesystem::CLASSNAME,
-- 
GitLab