Completed
Pull Request — master (#3838)
by Vars
12:18
created
apps/dav/lib/Comments/EntityCollection.php 1 patch
Indentation   +140 added lines, -140 removed lines patch added patch discarded remove patch
@@ -41,156 +41,156 @@
 block discarded – undo
41 41
  * @package OCA\DAV\Comments
42 42
  */
43 43
 class EntityCollection extends RootCollection implements IProperties {
44
-	const PROPERTY_NAME_READ_MARKER  = '{http://owncloud.org/ns}readMarker';
44
+    const PROPERTY_NAME_READ_MARKER  = '{http://owncloud.org/ns}readMarker';
45 45
 
46
-	/** @var  string */
47
-	protected $id;
46
+    /** @var  string */
47
+    protected $id;
48 48
 
49
-	/** @var  ILogger */
50
-	protected $logger;
49
+    /** @var  ILogger */
50
+    protected $logger;
51 51
 
52
-	/**
53
-	 * @param string $id
54
-	 * @param string $name
55
-	 * @param ICommentsManager $commentsManager
56
-	 * @param IUserManager $userManager
57
-	 * @param IUserSession $userSession
58
-	 * @param ILogger $logger
59
-	 */
60
-	public function __construct(
61
-		$id,
62
-		$name,
63
-		ICommentsManager $commentsManager,
64
-		IUserManager $userManager,
65
-		IUserSession $userSession,
66
-		ILogger $logger
67
-	) {
68
-		foreach(['id', 'name'] as $property) {
69
-			$$property = trim($$property);
70
-			if(empty($$property) || !is_string($$property)) {
71
-				throw new \InvalidArgumentException('"' . $property . '" parameter must be non-empty string');
72
-			}
73
-		}
74
-		$this->id = $id;
75
-		$this->name = $name;
76
-		$this->commentsManager = $commentsManager;
77
-		$this->logger = $logger;
78
-		$this->userManager = $userManager;
79
-		$this->userSession = $userSession;
80
-	}
52
+    /**
53
+     * @param string $id
54
+     * @param string $name
55
+     * @param ICommentsManager $commentsManager
56
+     * @param IUserManager $userManager
57
+     * @param IUserSession $userSession
58
+     * @param ILogger $logger
59
+     */
60
+    public function __construct(
61
+        $id,
62
+        $name,
63
+        ICommentsManager $commentsManager,
64
+        IUserManager $userManager,
65
+        IUserSession $userSession,
66
+        ILogger $logger
67
+    ) {
68
+        foreach(['id', 'name'] as $property) {
69
+            $$property = trim($$property);
70
+            if(empty($$property) || !is_string($$property)) {
71
+                throw new \InvalidArgumentException('"' . $property . '" parameter must be non-empty string');
72
+            }
73
+        }
74
+        $this->id = $id;
75
+        $this->name = $name;
76
+        $this->commentsManager = $commentsManager;
77
+        $this->logger = $logger;
78
+        $this->userManager = $userManager;
79
+        $this->userSession = $userSession;
80
+    }
81 81
 
82
-	/**
83
-	 * returns the ID of this entity
84
-	 *
85
-	 * @return string
86
-	 */
87
-	public function getId() {
88
-		return $this->id;
89
-	}
82
+    /**
83
+     * returns the ID of this entity
84
+     *
85
+     * @return string
86
+     */
87
+    public function getId() {
88
+        return $this->id;
89
+    }
90 90
 
91
-	/**
92
-	 * Returns a specific child node, referenced by its name
93
-	 *
94
-	 * This method must throw Sabre\DAV\Exception\NotFound if the node does not
95
-	 * exist.
96
-	 *
97
-	 * @param string $name
98
-	 * @return \Sabre\DAV\INode
99
-	 * @throws NotFound
100
-	 */
101
-	function getChild($name) {
102
-		try {
103
-			$comment = $this->commentsManager->get($name);
104
-			return new CommentNode(
105
-				$this->commentsManager,
106
-				$comment,
107
-				$this->userManager,
108
-				$this->userSession,
109
-				$this->logger
110
-			);
111
-		} catch (NotFoundException $e) {
112
-			throw new NotFound();
113
-		}
114
-	}
91
+    /**
92
+     * Returns a specific child node, referenced by its name
93
+     *
94
+     * This method must throw Sabre\DAV\Exception\NotFound if the node does not
95
+     * exist.
96
+     *
97
+     * @param string $name
98
+     * @return \Sabre\DAV\INode
99
+     * @throws NotFound
100
+     */
101
+    function getChild($name) {
102
+        try {
103
+            $comment = $this->commentsManager->get($name);
104
+            return new CommentNode(
105
+                $this->commentsManager,
106
+                $comment,
107
+                $this->userManager,
108
+                $this->userSession,
109
+                $this->logger
110
+            );
111
+        } catch (NotFoundException $e) {
112
+            throw new NotFound();
113
+        }
114
+    }
115 115
 
116
-	/**
117
-	 * Returns an array with all the child nodes
118
-	 *
119
-	 * @return \Sabre\DAV\INode[]
120
-	 */
121
-	function getChildren() {
122
-		return $this->findChildren();
123
-	}
116
+    /**
117
+     * Returns an array with all the child nodes
118
+     *
119
+     * @return \Sabre\DAV\INode[]
120
+     */
121
+    function getChildren() {
122
+        return $this->findChildren();
123
+    }
124 124
 
125
-	/**
126
-	 * Returns an array of comment nodes. Result can be influenced by offset,
127
-	 * limit and date time parameters.
128
-	 *
129
-	 * @param int $limit
130
-	 * @param int $offset
131
-	 * @param \DateTime|null $datetime
132
-	 * @return CommentNode[]
133
-	 */
134
-	function findChildren($limit = 0, $offset = 0, \DateTime $datetime = null) {
135
-		$comments = $this->commentsManager->getForObject($this->name, $this->id, $limit, $offset, $datetime);
136
-		$result = [];
137
-		foreach($comments as $comment) {
138
-			$result[] = new CommentNode(
139
-				$this->commentsManager,
140
-				$comment,
141
-				$this->userManager,
142
-				$this->userSession,
143
-				$this->logger
144
-			);
145
-		}
146
-		return $result;
147
-	}
125
+    /**
126
+     * Returns an array of comment nodes. Result can be influenced by offset,
127
+     * limit and date time parameters.
128
+     *
129
+     * @param int $limit
130
+     * @param int $offset
131
+     * @param \DateTime|null $datetime
132
+     * @return CommentNode[]
133
+     */
134
+    function findChildren($limit = 0, $offset = 0, \DateTime $datetime = null) {
135
+        $comments = $this->commentsManager->getForObject($this->name, $this->id, $limit, $offset, $datetime);
136
+        $result = [];
137
+        foreach($comments as $comment) {
138
+            $result[] = new CommentNode(
139
+                $this->commentsManager,
140
+                $comment,
141
+                $this->userManager,
142
+                $this->userSession,
143
+                $this->logger
144
+            );
145
+        }
146
+        return $result;
147
+    }
148 148
 
149
-	/**
150
-	 * Checks if a child-node with the specified name exists
151
-	 *
152
-	 * @param string $name
153
-	 * @return bool
154
-	 */
155
-	function childExists($name) {
156
-		try {
157
-			$this->commentsManager->get($name);
158
-			return true;
159
-		} catch (NotFoundException $e) {
160
-			return false;
161
-		}
162
-	}
149
+    /**
150
+     * Checks if a child-node with the specified name exists
151
+     *
152
+     * @param string $name
153
+     * @return bool
154
+     */
155
+    function childExists($name) {
156
+        try {
157
+            $this->commentsManager->get($name);
158
+            return true;
159
+        } catch (NotFoundException $e) {
160
+            return false;
161
+        }
162
+    }
163 163
 
164
-	/**
165
-	 * Sets the read marker to the specified date for the logged in user
166
-	 *
167
-	 * @param \DateTime $value
168
-	 * @return bool
169
-	 */
170
-	public function setReadMarker($value) {
171
-		$dateTime = new \DateTime($value);
172
-		$user = $this->userSession->getUser();
173
-		$this->commentsManager->setReadMark($this->name, $this->id, $dateTime, $user);
174
-		return true;
175
-	}
164
+    /**
165
+     * Sets the read marker to the specified date for the logged in user
166
+     *
167
+     * @param \DateTime $value
168
+     * @return bool
169
+     */
170
+    public function setReadMarker($value) {
171
+        $dateTime = new \DateTime($value);
172
+        $user = $this->userSession->getUser();
173
+        $this->commentsManager->setReadMark($this->name, $this->id, $dateTime, $user);
174
+        return true;
175
+    }
176 176
 
177
-	/**
178
-	 * @inheritdoc
179
-	 */
180
-	function propPatch(PropPatch $propPatch) {
181
-		$propPatch->handle(self::PROPERTY_NAME_READ_MARKER, [$this, 'setReadMarker']);
182
-	}
177
+    /**
178
+     * @inheritdoc
179
+     */
180
+    function propPatch(PropPatch $propPatch) {
181
+        $propPatch->handle(self::PROPERTY_NAME_READ_MARKER, [$this, 'setReadMarker']);
182
+    }
183 183
 
184
-	/**
185
-	 * @inheritdoc
186
-	 */
187
-	function getProperties($properties) {
188
-		$marker = null;
189
-		$user = $this->userSession->getUser();
190
-		if(!is_null($user)) {
191
-			$marker = $this->commentsManager->getReadMark($this->name, $this->id, $user);
192
-		}
193
-		return [self::PROPERTY_NAME_READ_MARKER => $marker];
194
-	}
184
+    /**
185
+     * @inheritdoc
186
+     */
187
+    function getProperties($properties) {
188
+        $marker = null;
189
+        $user = $this->userSession->getUser();
190
+        if(!is_null($user)) {
191
+            $marker = $this->commentsManager->getReadMark($this->name, $this->id, $user);
192
+        }
193
+        return [self::PROPERTY_NAME_READ_MARKER => $marker];
194
+    }
195 195
 }
196 196
 
Please login to merge, or discard this patch.
apps/dav/lib/Connector/PublicAuth.php 1 patch
Indentation   +75 added lines, -75 removed lines patch added patch discarded remove patch
@@ -42,89 +42,89 @@
 block discarded – undo
42 42
  */
43 43
 class PublicAuth extends AbstractBasic {
44 44
 
45
-	/** @var \OCP\Share\IShare */
46
-	private $share;
45
+    /** @var \OCP\Share\IShare */
46
+    private $share;
47 47
 
48
-	/** @var IManager */
49
-	private $shareManager;
48
+    /** @var IManager */
49
+    private $shareManager;
50 50
 
51
-	/** @var ISession */
52
-	private $session;
51
+    /** @var ISession */
52
+    private $session;
53 53
 
54
-	/** @var IRequest */
55
-	private $request;
54
+    /** @var IRequest */
55
+    private $request;
56 56
 
57
-	/**
58
-	 * @param IRequest $request
59
-	 * @param IManager $shareManager
60
-	 * @param ISession $session
61
-	 */
62
-	public function __construct(IRequest $request,
63
-								IManager $shareManager,
64
-								ISession $session) {
65
-		$this->request = $request;
66
-		$this->shareManager = $shareManager;
67
-		$this->session = $session;
57
+    /**
58
+     * @param IRequest $request
59
+     * @param IManager $shareManager
60
+     * @param ISession $session
61
+     */
62
+    public function __construct(IRequest $request,
63
+                                IManager $shareManager,
64
+                                ISession $session) {
65
+        $this->request = $request;
66
+        $this->shareManager = $shareManager;
67
+        $this->session = $session;
68 68
 
69
-		// setup realm
70
-		$defaults = new \OCP\Defaults();
71
-		$this->realm = $defaults->getName();
72
-	}
69
+        // setup realm
70
+        $defaults = new \OCP\Defaults();
71
+        $this->realm = $defaults->getName();
72
+    }
73 73
 
74
-	/**
75
-	 * Validates a username and password
76
-	 *
77
-	 * This method should return true or false depending on if login
78
-	 * succeeded.
79
-	 *
80
-	 * @param string $username
81
-	 * @param string $password
82
-	 *
83
-	 * @return bool
84
-	 * @throws \Sabre\DAV\Exception\NotAuthenticated
85
-	 */
86
-	protected function validateUserPass($username, $password) {
87
-		try {
88
-			$share = $this->shareManager->getShareByToken($username);
89
-		} catch (ShareNotFound $e) {
90
-			return false;
91
-		}
74
+    /**
75
+     * Validates a username and password
76
+     *
77
+     * This method should return true or false depending on if login
78
+     * succeeded.
79
+     *
80
+     * @param string $username
81
+     * @param string $password
82
+     *
83
+     * @return bool
84
+     * @throws \Sabre\DAV\Exception\NotAuthenticated
85
+     */
86
+    protected function validateUserPass($username, $password) {
87
+        try {
88
+            $share = $this->shareManager->getShareByToken($username);
89
+        } catch (ShareNotFound $e) {
90
+            return false;
91
+        }
92 92
 
93
-		$this->share = $share;
93
+        $this->share = $share;
94 94
 
95
-		\OC_User::setIncognitoMode(true);
95
+        \OC_User::setIncognitoMode(true);
96 96
 
97
-		// check if the share is password protected
98
-		if ($share->getPassword() !== null) {
99
-			if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
100
-				if ($this->shareManager->checkPassword($share, $password)) {
101
-					return true;
102
-				} else if ($this->session->exists('public_link_authenticated')
103
-					&& $this->session->get('public_link_authenticated') === (string)$share->getId()) {
104
-					return true;
105
-				} else {
106
-					if (in_array('XMLHttpRequest', explode(',', $this->request->getHeader('X-Requested-With')))) {
107
-						// do not re-authenticate over ajax, use dummy auth name to prevent browser popup
108
-						http_response_code(401);
109
-						header('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"');
110
-						throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
111
-					}
112
-					return false;
113
-				}
114
-			} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) {
115
-				return true;
116
-			} else {
117
-				return false;
118
-			}
119
-		} else {
120
-			return true;
121
-		}
122
-	}
97
+        // check if the share is password protected
98
+        if ($share->getPassword() !== null) {
99
+            if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
100
+                if ($this->shareManager->checkPassword($share, $password)) {
101
+                    return true;
102
+                } else if ($this->session->exists('public_link_authenticated')
103
+                    && $this->session->get('public_link_authenticated') === (string)$share->getId()) {
104
+                    return true;
105
+                } else {
106
+                    if (in_array('XMLHttpRequest', explode(',', $this->request->getHeader('X-Requested-With')))) {
107
+                        // do not re-authenticate over ajax, use dummy auth name to prevent browser popup
108
+                        http_response_code(401);
109
+                        header('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"');
110
+                        throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
111
+                    }
112
+                    return false;
113
+                }
114
+            } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) {
115
+                return true;
116
+            } else {
117
+                return false;
118
+            }
119
+        } else {
120
+            return true;
121
+        }
122
+    }
123 123
 
124
-	/**
125
-	 * @return \OCP\Share\IShare
126
-	 */
127
-	public function getShare() {
128
-		return $this->share;
129
-	}
124
+    /**
125
+     * @return \OCP\Share\IShare
126
+     */
127
+    public function getShare() {
128
+        return $this->share;
129
+    }
130 130
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Auth.php 1 patch
Indentation   +192 added lines, -192 removed lines patch added patch discarded remove patch
@@ -48,212 +48,212 @@
 block discarded – undo
48 48
 class Auth extends AbstractBasic {
49 49
 
50 50
 
51
-	const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND';
51
+    const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND';
52 52
 
53
-	/** @var ISession */
54
-	private $session;
55
-	/** @var Session */
56
-	private $userSession;
57
-	/** @var IRequest */
58
-	private $request;
59
-	/** @var string */
60
-	private $currentUser;
61
-	/** @var Manager */
62
-	private $twoFactorManager;
63
-	/** @var Throttler */
64
-	private $throttler;
53
+    /** @var ISession */
54
+    private $session;
55
+    /** @var Session */
56
+    private $userSession;
57
+    /** @var IRequest */
58
+    private $request;
59
+    /** @var string */
60
+    private $currentUser;
61
+    /** @var Manager */
62
+    private $twoFactorManager;
63
+    /** @var Throttler */
64
+    private $throttler;
65 65
 
66
-	/**
67
-	 * @param ISession $session
68
-	 * @param Session $userSession
69
-	 * @param IRequest $request
70
-	 * @param Manager $twoFactorManager
71
-	 * @param Throttler $throttler
72
-	 * @param string $principalPrefix
73
-	 */
74
-	public function __construct(ISession $session,
75
-								Session $userSession,
76
-								IRequest $request,
77
-								Manager $twoFactorManager,
78
-								Throttler $throttler,
79
-								$principalPrefix = 'principals/users/') {
80
-		$this->session = $session;
81
-		$this->userSession = $userSession;
82
-		$this->twoFactorManager = $twoFactorManager;
83
-		$this->request = $request;
84
-		$this->throttler = $throttler;
85
-		$this->principalPrefix = $principalPrefix;
66
+    /**
67
+     * @param ISession $session
68
+     * @param Session $userSession
69
+     * @param IRequest $request
70
+     * @param Manager $twoFactorManager
71
+     * @param Throttler $throttler
72
+     * @param string $principalPrefix
73
+     */
74
+    public function __construct(ISession $session,
75
+                                Session $userSession,
76
+                                IRequest $request,
77
+                                Manager $twoFactorManager,
78
+                                Throttler $throttler,
79
+                                $principalPrefix = 'principals/users/') {
80
+        $this->session = $session;
81
+        $this->userSession = $userSession;
82
+        $this->twoFactorManager = $twoFactorManager;
83
+        $this->request = $request;
84
+        $this->throttler = $throttler;
85
+        $this->principalPrefix = $principalPrefix;
86 86
 
87
-		// setup realm
88
-		$defaults = new \OCP\Defaults();
89
-		$this->realm = $defaults->getName();
90
-	}
87
+        // setup realm
88
+        $defaults = new \OCP\Defaults();
89
+        $this->realm = $defaults->getName();
90
+    }
91 91
 
92
-	/**
93
-	 * Whether the user has initially authenticated via DAV
94
-	 *
95
-	 * This is required for WebDAV clients that resent the cookies even when the
96
-	 * account was changed.
97
-	 *
98
-	 * @see https://github.com/owncloud/core/issues/13245
99
-	 *
100
-	 * @param string $username
101
-	 * @return bool
102
-	 */
103
-	public function isDavAuthenticated($username) {
104
-		return !is_null($this->session->get(self::DAV_AUTHENTICATED)) &&
105
-		$this->session->get(self::DAV_AUTHENTICATED) === $username;
106
-	}
92
+    /**
93
+     * Whether the user has initially authenticated via DAV
94
+     *
95
+     * This is required for WebDAV clients that resent the cookies even when the
96
+     * account was changed.
97
+     *
98
+     * @see https://github.com/owncloud/core/issues/13245
99
+     *
100
+     * @param string $username
101
+     * @return bool
102
+     */
103
+    public function isDavAuthenticated($username) {
104
+        return !is_null($this->session->get(self::DAV_AUTHENTICATED)) &&
105
+        $this->session->get(self::DAV_AUTHENTICATED) === $username;
106
+    }
107 107
 
108
-	/**
109
-	 * Validates a username and password
110
-	 *
111
-	 * This method should return true or false depending on if login
112
-	 * succeeded.
113
-	 *
114
-	 * @param string $username
115
-	 * @param string $password
116
-	 * @return bool
117
-	 * @throws PasswordLoginForbidden
118
-	 */
119
-	protected function validateUserPass($username, $password) {
120
-		if ($this->userSession->isLoggedIn() &&
121
-			$this->isDavAuthenticated($this->userSession->getUser()->getUID())
122
-		) {
123
-			\OC_Util::setupFS($this->userSession->getUser()->getUID());
124
-			$this->session->close();
125
-			return true;
126
-		} else {
127
-			\OC_Util::setupFS(); //login hooks may need early access to the filesystem
128
-			try {
129
-				if ($this->userSession->logClientIn($username, $password, $this->request, $this->throttler)) {
130
-					\OC_Util::setupFS($this->userSession->getUser()->getUID());
131
-					$this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID());
132
-					$this->session->close();
133
-					return true;
134
-				} else {
135
-					$this->session->close();
136
-					return false;
137
-				}
138
-			} catch (PasswordLoginForbiddenException $ex) {
139
-				$this->session->close();
140
-				throw new PasswordLoginForbidden();
141
-			}
142
-		}
143
-	}
108
+    /**
109
+     * Validates a username and password
110
+     *
111
+     * This method should return true or false depending on if login
112
+     * succeeded.
113
+     *
114
+     * @param string $username
115
+     * @param string $password
116
+     * @return bool
117
+     * @throws PasswordLoginForbidden
118
+     */
119
+    protected function validateUserPass($username, $password) {
120
+        if ($this->userSession->isLoggedIn() &&
121
+            $this->isDavAuthenticated($this->userSession->getUser()->getUID())
122
+        ) {
123
+            \OC_Util::setupFS($this->userSession->getUser()->getUID());
124
+            $this->session->close();
125
+            return true;
126
+        } else {
127
+            \OC_Util::setupFS(); //login hooks may need early access to the filesystem
128
+            try {
129
+                if ($this->userSession->logClientIn($username, $password, $this->request, $this->throttler)) {
130
+                    \OC_Util::setupFS($this->userSession->getUser()->getUID());
131
+                    $this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID());
132
+                    $this->session->close();
133
+                    return true;
134
+                } else {
135
+                    $this->session->close();
136
+                    return false;
137
+                }
138
+            } catch (PasswordLoginForbiddenException $ex) {
139
+                $this->session->close();
140
+                throw new PasswordLoginForbidden();
141
+            }
142
+        }
143
+    }
144 144
 
145
-	/**
146
-	 * @param RequestInterface $request
147
-	 * @param ResponseInterface $response
148
-	 * @return array
149
-	 * @throws NotAuthenticated
150
-	 * @throws ServiceUnavailable
151
-	 */
152
-	function check(RequestInterface $request, ResponseInterface $response) {
153
-		try {
154
-			$result = $this->auth($request, $response);
155
-			return $result;
156
-		} catch (NotAuthenticated $e) {
157
-			throw $e;
158
-		} catch (Exception $e) {
159
-			$class = get_class($e);
160
-			$msg = $e->getMessage();
161
-			\OC::$server->getLogger()->logException($e);
162
-			throw new ServiceUnavailable("$class: $msg");
163
-		}
164
-	}
145
+    /**
146
+     * @param RequestInterface $request
147
+     * @param ResponseInterface $response
148
+     * @return array
149
+     * @throws NotAuthenticated
150
+     * @throws ServiceUnavailable
151
+     */
152
+    function check(RequestInterface $request, ResponseInterface $response) {
153
+        try {
154
+            $result = $this->auth($request, $response);
155
+            return $result;
156
+        } catch (NotAuthenticated $e) {
157
+            throw $e;
158
+        } catch (Exception $e) {
159
+            $class = get_class($e);
160
+            $msg = $e->getMessage();
161
+            \OC::$server->getLogger()->logException($e);
162
+            throw new ServiceUnavailable("$class: $msg");
163
+        }
164
+    }
165 165
 
166
-	/**
167
-	 * Checks whether a CSRF check is required on the request
168
-	 *
169
-	 * @return bool
170
-	 */
171
-	private function requiresCSRFCheck() {
172
-		// GET requires no check at all
173
-		if($this->request->getMethod() === 'GET') {
174
-			return false;
175
-		}
166
+    /**
167
+     * Checks whether a CSRF check is required on the request
168
+     *
169
+     * @return bool
170
+     */
171
+    private function requiresCSRFCheck() {
172
+        // GET requires no check at all
173
+        if($this->request->getMethod() === 'GET') {
174
+            return false;
175
+        }
176 176
 
177
-		// Official ownCloud clients require no checks
178
-		if($this->request->isUserAgent([
179
-			IRequest::USER_AGENT_CLIENT_DESKTOP,
180
-			IRequest::USER_AGENT_CLIENT_ANDROID,
181
-			IRequest::USER_AGENT_CLIENT_IOS,
182
-		])) {
183
-			return false;
184
-		}
177
+        // Official ownCloud clients require no checks
178
+        if($this->request->isUserAgent([
179
+            IRequest::USER_AGENT_CLIENT_DESKTOP,
180
+            IRequest::USER_AGENT_CLIENT_ANDROID,
181
+            IRequest::USER_AGENT_CLIENT_IOS,
182
+        ])) {
183
+            return false;
184
+        }
185 185
 
186
-		// If not logged-in no check is required
187
-		if(!$this->userSession->isLoggedIn()) {
188
-			return false;
189
-		}
186
+        // If not logged-in no check is required
187
+        if(!$this->userSession->isLoggedIn()) {
188
+            return false;
189
+        }
190 190
 
191
-		// POST always requires a check
192
-		if($this->request->getMethod() === 'POST') {
193
-			return true;
194
-		}
191
+        // POST always requires a check
192
+        if($this->request->getMethod() === 'POST') {
193
+            return true;
194
+        }
195 195
 
196
-		// If logged-in AND DAV authenticated no check is required
197
-		if($this->userSession->isLoggedIn() &&
198
-			$this->isDavAuthenticated($this->userSession->getUser()->getUID())) {
199
-			return false;
200
-		}
196
+        // If logged-in AND DAV authenticated no check is required
197
+        if($this->userSession->isLoggedIn() &&
198
+            $this->isDavAuthenticated($this->userSession->getUser()->getUID())) {
199
+            return false;
200
+        }
201 201
 
202
-		return true;
203
-	}
202
+        return true;
203
+    }
204 204
 
205
-	/**
206
-	 * @param RequestInterface $request
207
-	 * @param ResponseInterface $response
208
-	 * @return array
209
-	 * @throws NotAuthenticated
210
-	 */
211
-	private function auth(RequestInterface $request, ResponseInterface $response) {
212
-		$forcedLogout = false;
213
-		if(!$this->request->passesCSRFCheck() &&
214
-			$this->requiresCSRFCheck()) {
215
-			// In case of a fail with POST we need to recheck the credentials
216
-			if($this->request->getMethod() === 'POST') {
217
-				$forcedLogout = true;
218
-			} else {
219
-				$response->setStatus(401);
220
-				throw new \Sabre\DAV\Exception\NotAuthenticated('CSRF check not passed.');
221
-			}
222
-		}
205
+    /**
206
+     * @param RequestInterface $request
207
+     * @param ResponseInterface $response
208
+     * @return array
209
+     * @throws NotAuthenticated
210
+     */
211
+    private function auth(RequestInterface $request, ResponseInterface $response) {
212
+        $forcedLogout = false;
213
+        if(!$this->request->passesCSRFCheck() &&
214
+            $this->requiresCSRFCheck()) {
215
+            // In case of a fail with POST we need to recheck the credentials
216
+            if($this->request->getMethod() === 'POST') {
217
+                $forcedLogout = true;
218
+            } else {
219
+                $response->setStatus(401);
220
+                throw new \Sabre\DAV\Exception\NotAuthenticated('CSRF check not passed.');
221
+            }
222
+        }
223 223
 
224
-		if($forcedLogout) {
225
-			$this->userSession->logout();
226
-		} else {
227
-			if($this->twoFactorManager->needsSecondFactor($this->userSession->getUser())) {
228
-				throw new \Sabre\DAV\Exception\NotAuthenticated('2FA challenge not passed.');
229
-			}
230
-			if (\OC_User::handleApacheAuth() ||
231
-				//Fix for broken webdav clients
232
-				($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ||
233
-				//Well behaved clients that only send the cookie are allowed
234
-				($this->userSession->isLoggedIn() && $this->session->get(self::DAV_AUTHENTICATED) === $this->userSession->getUser()->getUID() && $request->getHeader('Authorization') === null)
235
-			) {
236
-				$user = $this->userSession->getUser()->getUID();
237
-				\OC_Util::setupFS($user);
238
-				$this->currentUser = $user;
239
-				$this->session->close();
240
-				return [true, $this->principalPrefix . $user];
241
-			}
242
-		}
224
+        if($forcedLogout) {
225
+            $this->userSession->logout();
226
+        } else {
227
+            if($this->twoFactorManager->needsSecondFactor($this->userSession->getUser())) {
228
+                throw new \Sabre\DAV\Exception\NotAuthenticated('2FA challenge not passed.');
229
+            }
230
+            if (\OC_User::handleApacheAuth() ||
231
+                //Fix for broken webdav clients
232
+                ($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ||
233
+                //Well behaved clients that only send the cookie are allowed
234
+                ($this->userSession->isLoggedIn() && $this->session->get(self::DAV_AUTHENTICATED) === $this->userSession->getUser()->getUID() && $request->getHeader('Authorization') === null)
235
+            ) {
236
+                $user = $this->userSession->getUser()->getUID();
237
+                \OC_Util::setupFS($user);
238
+                $this->currentUser = $user;
239
+                $this->session->close();
240
+                return [true, $this->principalPrefix . $user];
241
+            }
242
+        }
243 243
 
244
-		if (!$this->userSession->isLoggedIn() && in_array('XMLHttpRequest', explode(',', $request->getHeader('X-Requested-With')))) {
245
-			// do not re-authenticate over ajax, use dummy auth name to prevent browser popup
246
-			$response->addHeader('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"');
247
-			$response->setStatus(401);
248
-			throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
249
-		}
244
+        if (!$this->userSession->isLoggedIn() && in_array('XMLHttpRequest', explode(',', $request->getHeader('X-Requested-With')))) {
245
+            // do not re-authenticate over ajax, use dummy auth name to prevent browser popup
246
+            $response->addHeader('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"');
247
+            $response->setStatus(401);
248
+            throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls');
249
+        }
250 250
 
251
-		$data = parent::check($request, $response);
252
-		if($data[0] === true) {
253
-			$startPos = strrpos($data[1], '/') + 1;
254
-			$user = $this->userSession->getUser()->getUID();
255
-			$data[1] = substr_replace($data[1], $user, $startPos);
256
-		}
257
-		return $data;
258
-	}
251
+        $data = parent::check($request, $response);
252
+        if($data[0] === true) {
253
+            $startPos = strrpos($data[1], '/') + 1;
254
+            $user = $this->userSession->getUser()->getUID();
255
+            $data[1] = substr_replace($data[1], $user, $startPos);
256
+        }
257
+        return $data;
258
+    }
259 259
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/DummyGetResponsePlugin.php 1 patch
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -39,33 +39,33 @@
 block discarded – undo
39 39
  * @package OCA\DAV\Connector\Sabre
40 40
  */
41 41
 class DummyGetResponsePlugin extends \Sabre\DAV\ServerPlugin {
42
-	/** @var \Sabre\DAV\Server */
43
-	protected $server;
42
+    /** @var \Sabre\DAV\Server */
43
+    protected $server;
44 44
 
45
-	/**
46
-	 * @param \Sabre\DAV\Server $server
47
-	 * @return void
48
-	 */
49
-	function initialize(\Sabre\DAV\Server $server) {
50
-		$this->server = $server;
51
-		$this->server->on('method:GET', [$this, 'httpGet'], 200);
52
-	}
45
+    /**
46
+     * @param \Sabre\DAV\Server $server
47
+     * @return void
48
+     */
49
+    function initialize(\Sabre\DAV\Server $server) {
50
+        $this->server = $server;
51
+        $this->server->on('method:GET', [$this, 'httpGet'], 200);
52
+    }
53 53
 
54
-	/**
55
-	 * @param RequestInterface $request
56
-	 * @param ResponseInterface $response
57
-	 * @return false
58
-	 */
59
-	function httpGet(RequestInterface $request, ResponseInterface $response) {
60
-		$string = 'This is the WebDAV interface. It can only be accessed by ' .
61
-			'WebDAV clients such as the ownCloud desktop sync client.';
62
-		$stream = fopen('php://memory','r+');
63
-		fwrite($stream, $string);
64
-		rewind($stream);
54
+    /**
55
+     * @param RequestInterface $request
56
+     * @param ResponseInterface $response
57
+     * @return false
58
+     */
59
+    function httpGet(RequestInterface $request, ResponseInterface $response) {
60
+        $string = 'This is the WebDAV interface. It can only be accessed by ' .
61
+            'WebDAV clients such as the ownCloud desktop sync client.';
62
+        $stream = fopen('php://memory','r+');
63
+        fwrite($stream, $string);
64
+        rewind($stream);
65 65
 
66
-		$response->setStatus(200);
67
-		$response->setBody($stream);
66
+        $response->setStatus(200);
67
+        $response->setBody($stream);
68 68
 
69
-		return false;
70
-	}
69
+        return false;
70
+    }
71 71
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/ObjectTree.php 1 patch
Indentation   +298 added lines, -298 removed lines patch added patch discarded remove patch
@@ -41,302 +41,302 @@
 block discarded – undo
41 41
 
42 42
 class ObjectTree extends \Sabre\DAV\Tree {
43 43
 
44
-	/**
45
-	 * @var \OC\Files\View
46
-	 */
47
-	protected $fileView;
48
-
49
-	/**
50
-	 * @var  \OCP\Files\Mount\IMountManager
51
-	 */
52
-	protected $mountManager;
53
-
54
-	/**
55
-	 * Creates the object
56
-	 */
57
-	public function __construct() {
58
-	}
59
-
60
-	/**
61
-	 * @param \Sabre\DAV\INode $rootNode
62
-	 * @param \OC\Files\View $view
63
-	 * @param  \OCP\Files\Mount\IMountManager $mountManager
64
-	 */
65
-	public function init(\Sabre\DAV\INode $rootNode, \OC\Files\View $view, \OCP\Files\Mount\IMountManager $mountManager) {
66
-		$this->rootNode = $rootNode;
67
-		$this->fileView = $view;
68
-		$this->mountManager = $mountManager;
69
-	}
70
-
71
-	/**
72
-	 * If the given path is a chunked file name, converts it
73
-	 * to the real file name. Only applies if the OC-CHUNKED header
74
-	 * is present.
75
-	 *
76
-	 * @param string $path chunk file path to convert
77
-	 *
78
-	 * @return string path to real file
79
-	 */
80
-	private function resolveChunkFile($path) {
81
-		if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
82
-			// resolve to real file name to find the proper node
83
-			list($dir, $name) = \Sabre\HTTP\URLUtil::splitPath($path);
84
-			if ($dir == '/' || $dir == '.') {
85
-				$dir = '';
86
-			}
87
-
88
-			$info = \OC_FileChunking::decodeName($name);
89
-			// only replace path if it was really the chunked file
90
-			if (isset($info['transferid'])) {
91
-				// getNodePath is called for multiple nodes within a chunk
92
-				// upload call
93
-				$path = $dir . '/' . $info['name'];
94
-				$path = ltrim($path, '/');
95
-			}
96
-		}
97
-		return $path;
98
-	}
99
-
100
-	public function cacheNode(Node $node) {
101
-		$this->cache[trim($node->getPath(), '/')] = $node;
102
-	}
103
-
104
-	/**
105
-	 * Returns the INode object for the requested path
106
-	 *
107
-	 * @param string $path
108
-	 * @return \Sabre\DAV\INode
109
-	 * @throws InvalidPath
110
-	 * @throws \Sabre\DAV\Exception\Locked
111
-	 * @throws \Sabre\DAV\Exception\NotFound
112
-	 * @throws \Sabre\DAV\Exception\ServiceUnavailable
113
-	 */
114
-	public function getNodeForPath($path) {
115
-		if (!$this->fileView) {
116
-			throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup');
117
-		}
118
-
119
-		$path = trim($path, '/');
120
-
121
-		if (isset($this->cache[$path])) {
122
-			return $this->cache[$path];
123
-		}
124
-
125
-		if ($path) {
126
-			try {
127
-				$this->fileView->verifyPath($path, basename($path));
128
-			} catch (\OCP\Files\InvalidPathException $ex) {
129
-				throw new InvalidPath($ex->getMessage());
130
-			}
131
-		}
132
-
133
-		// Is it the root node?
134
-		if (!strlen($path)) {
135
-			return $this->rootNode;
136
-		}
137
-
138
-		if (pathinfo($path, PATHINFO_EXTENSION) === 'part') {
139
-			// read from storage
140
-			$absPath = $this->fileView->getAbsolutePath($path);
141
-			$mount = $this->fileView->getMount($path);
142
-			$storage = $mount->getStorage();
143
-			$internalPath = $mount->getInternalPath($absPath);
144
-			if ($storage && $storage->file_exists($internalPath)) {
145
-				/**
146
-				 * @var \OC\Files\Storage\Storage $storage
147
-				 */
148
-				// get data directly
149
-				$data = $storage->getMetaData($internalPath);
150
-				$info = new FileInfo($absPath, $storage, $internalPath, $data, $mount);
151
-			} else {
152
-				$info = null;
153
-			}
154
-		} else {
155
-			// resolve chunk file name to real name, if applicable
156
-			$path = $this->resolveChunkFile($path);
157
-
158
-			// read from cache
159
-			try {
160
-				$info = $this->fileView->getFileInfo($path);
161
-			} catch (StorageNotAvailableException $e) {
162
-				throw new \Sabre\DAV\Exception\ServiceUnavailable('Storage is temporarily not available');
163
-			} catch (StorageInvalidException $e) {
164
-				throw new \Sabre\DAV\Exception\NotFound('Storage ' . $path . ' is invalid');
165
-			} catch (LockedException $e) {
166
-				throw new \Sabre\DAV\Exception\Locked();
167
-			} catch (ForbiddenException $e) {
168
-				throw new \Sabre\DAV\Exception\Forbidden();
169
-			}
170
-		}
171
-
172
-		if (!$info) {
173
-			throw new \Sabre\DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
174
-		}
175
-
176
-		if ($info->getType() === 'dir') {
177
-			$node = new \OCA\DAV\Connector\Sabre\Directory($this->fileView, $info, $this);
178
-		} else {
179
-			$node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info);
180
-		}
181
-
182
-		$this->cache[$path] = $node;
183
-		return $node;
184
-
185
-	}
186
-
187
-	/**
188
-	 * Moves a file from one location to another
189
-	 *
190
-	 * @param string $sourcePath The path to the file which should be moved
191
-	 * @param string $destinationPath The full destination path, so not just the destination parent node
192
-	 * @throws FileLocked
193
-	 * @throws Forbidden
194
-	 * @throws InvalidPath
195
-	 * @throws \Sabre\DAV\Exception\Forbidden
196
-	 * @throws \Sabre\DAV\Exception\Locked
197
-	 * @throws \Sabre\DAV\Exception\NotFound
198
-	 * @throws \Sabre\DAV\Exception\ServiceUnavailable
199
-	 * @return int
200
-	 */
201
-	public function move($sourcePath, $destinationPath) {
202
-		if (!$this->fileView) {
203
-			throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup');
204
-		}
205
-
206
-		$infoDestination = $this->fileView->getFileInfo(dirname($destinationPath));
207
-		if (dirname($destinationPath) === dirname($sourcePath)) {
208
-			$sourcePermission = $infoDestination && $infoDestination->isUpdateable();
209
-			$destinationPermission = $sourcePermission;
210
-		} else {
211
-			$infoSource = $this->fileView->getFileInfo($sourcePath);
212
-			if ($this->fileView->file_exists($destinationPath)) {
213
-				$destinationPermission = $infoDestination && $infoDestination->isUpdateable();
214
-			} else {
215
-				$destinationPermission = $infoDestination && $infoDestination->isCreatable();
216
-			}
217
-			$sourcePermission =  $infoSource && $infoSource->isDeletable();
218
-		}
219
-
220
-		if (!$destinationPermission || !$sourcePermission) {
221
-			throw new Forbidden('No permissions to move object.');
222
-		}
223
-
224
-		$targetNodeExists = $this->nodeExists($destinationPath);
225
-		$sourceNode = $this->getNodeForPath($sourcePath);
226
-		if ($sourceNode instanceof \Sabre\DAV\ICollection && $targetNodeExists) {
227
-			throw new \Sabre\DAV\Exception\Forbidden('Could not copy directory ' . $sourceNode->getName() . ', target exists');
228
-		}
229
-		list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($sourcePath);
230
-		list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destinationPath);
231
-
232
-		$isMovableMount = false;
233
-		$sourceMount = $this->mountManager->find($this->fileView->getAbsolutePath($sourcePath));
234
-		$internalPath = $sourceMount->getInternalPath($this->fileView->getAbsolutePath($sourcePath));
235
-		if ($sourceMount instanceof MoveableMount && $internalPath === '') {
236
-			$isMovableMount = true;
237
-		}
238
-
239
-		try {
240
-			$sameFolder = ($sourceDir === $destinationDir);
241
-			// if we're overwriting or same folder
242
-			if ($targetNodeExists || $sameFolder) {
243
-				// note that renaming a share mount point is always allowed
244
-				if (!$this->fileView->isUpdatable($destinationDir) && !$isMovableMount) {
245
-					throw new \Sabre\DAV\Exception\Forbidden();
246
-				}
247
-			} else {
248
-				if (!$this->fileView->isCreatable($destinationDir)) {
249
-					throw new \Sabre\DAV\Exception\Forbidden();
250
-				}
251
-			}
252
-
253
-			if (!$sameFolder) {
254
-				// moving to a different folder, source will be gone, like a deletion
255
-				// note that moving a share mount point is always allowed
256
-				if (!$this->fileView->isDeletable($sourcePath) && !$isMovableMount) {
257
-					throw new \Sabre\DAV\Exception\Forbidden();
258
-				}
259
-			}
260
-
261
-			$fileName = basename($destinationPath);
262
-			try {
263
-				$this->fileView->verifyPath($destinationDir, $fileName);
264
-			} catch (\OCP\Files\InvalidPathException $ex) {
265
-				throw new InvalidPath($ex->getMessage());
266
-			}
267
-
268
-			$renameOkay = $this->fileView->rename($sourcePath, $destinationPath);
269
-			if (!$renameOkay) {
270
-				throw new \Sabre\DAV\Exception\Forbidden('');
271
-			}
272
-		} catch (StorageNotAvailableException $e) {
273
-			throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
274
-		} catch (ForbiddenException $ex) {
275
-			throw new Forbidden($ex->getMessage(), $ex->getRetry());
276
-		} catch (LockedException $e) {
277
-			throw new FileLocked($e->getMessage(), $e->getCode(), $e);
278
-		}
279
-
280
-		$this->markDirty($sourceDir);
281
-		$this->markDirty($destinationDir);
282
-
283
-	}
284
-
285
-	/**
286
-	 * Copies a file or directory.
287
-	 *
288
-	 * This method must work recursively and delete the destination
289
-	 * if it exists
290
-	 *
291
-	 * @param string $source
292
-	 * @param string $destination
293
-	 * @throws FileLocked
294
-	 * @throws Forbidden
295
-	 * @throws InvalidPath
296
-	 * @throws \Exception
297
-	 * @throws \Sabre\DAV\Exception\Forbidden
298
-	 * @throws \Sabre\DAV\Exception\Locked
299
-	 * @throws \Sabre\DAV\Exception\NotFound
300
-	 * @throws \Sabre\DAV\Exception\ServiceUnavailable
301
-	 * @return void
302
-	 */
303
-	public function copy($source, $destination) {
304
-		if (!$this->fileView) {
305
-			throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup');
306
-		}
307
-
308
-
309
-		$info = $this->fileView->getFileInfo(dirname($destination));
310
-		if ($this->fileView->file_exists($destination)) {
311
-			$destinationPermission = $info && $info->isUpdateable();
312
-		} else {
313
-			$destinationPermission = $info && $info->isCreatable();
314
-		}
315
-		if (!$destinationPermission) {
316
-			throw new Forbidden('No permissions to copy object.');
317
-		}
318
-
319
-		// this will trigger existence check
320
-		$this->getNodeForPath($source);
321
-
322
-		list($destinationDir, $destinationName) = \Sabre\HTTP\URLUtil::splitPath($destination);
323
-		try {
324
-			$this->fileView->verifyPath($destinationDir, $destinationName);
325
-		} catch (\OCP\Files\InvalidPathException $ex) {
326
-			throw new InvalidPath($ex->getMessage());
327
-		}
328
-
329
-		try {
330
-			$this->fileView->copy($source, $destination);
331
-		} catch (StorageNotAvailableException $e) {
332
-			throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
333
-		} catch (ForbiddenException $ex) {
334
-			throw new Forbidden($ex->getMessage(), $ex->getRetry());
335
-		} catch (LockedException $e) {
336
-			throw new FileLocked($e->getMessage(), $e->getCode(), $e);
337
-		}
338
-
339
-		list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination);
340
-		$this->markDirty($destinationDir);
341
-	}
44
+    /**
45
+     * @var \OC\Files\View
46
+     */
47
+    protected $fileView;
48
+
49
+    /**
50
+     * @var  \OCP\Files\Mount\IMountManager
51
+     */
52
+    protected $mountManager;
53
+
54
+    /**
55
+     * Creates the object
56
+     */
57
+    public function __construct() {
58
+    }
59
+
60
+    /**
61
+     * @param \Sabre\DAV\INode $rootNode
62
+     * @param \OC\Files\View $view
63
+     * @param  \OCP\Files\Mount\IMountManager $mountManager
64
+     */
65
+    public function init(\Sabre\DAV\INode $rootNode, \OC\Files\View $view, \OCP\Files\Mount\IMountManager $mountManager) {
66
+        $this->rootNode = $rootNode;
67
+        $this->fileView = $view;
68
+        $this->mountManager = $mountManager;
69
+    }
70
+
71
+    /**
72
+     * If the given path is a chunked file name, converts it
73
+     * to the real file name. Only applies if the OC-CHUNKED header
74
+     * is present.
75
+     *
76
+     * @param string $path chunk file path to convert
77
+     *
78
+     * @return string path to real file
79
+     */
80
+    private function resolveChunkFile($path) {
81
+        if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
82
+            // resolve to real file name to find the proper node
83
+            list($dir, $name) = \Sabre\HTTP\URLUtil::splitPath($path);
84
+            if ($dir == '/' || $dir == '.') {
85
+                $dir = '';
86
+            }
87
+
88
+            $info = \OC_FileChunking::decodeName($name);
89
+            // only replace path if it was really the chunked file
90
+            if (isset($info['transferid'])) {
91
+                // getNodePath is called for multiple nodes within a chunk
92
+                // upload call
93
+                $path = $dir . '/' . $info['name'];
94
+                $path = ltrim($path, '/');
95
+            }
96
+        }
97
+        return $path;
98
+    }
99
+
100
+    public function cacheNode(Node $node) {
101
+        $this->cache[trim($node->getPath(), '/')] = $node;
102
+    }
103
+
104
+    /**
105
+     * Returns the INode object for the requested path
106
+     *
107
+     * @param string $path
108
+     * @return \Sabre\DAV\INode
109
+     * @throws InvalidPath
110
+     * @throws \Sabre\DAV\Exception\Locked
111
+     * @throws \Sabre\DAV\Exception\NotFound
112
+     * @throws \Sabre\DAV\Exception\ServiceUnavailable
113
+     */
114
+    public function getNodeForPath($path) {
115
+        if (!$this->fileView) {
116
+            throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup');
117
+        }
118
+
119
+        $path = trim($path, '/');
120
+
121
+        if (isset($this->cache[$path])) {
122
+            return $this->cache[$path];
123
+        }
124
+
125
+        if ($path) {
126
+            try {
127
+                $this->fileView->verifyPath($path, basename($path));
128
+            } catch (\OCP\Files\InvalidPathException $ex) {
129
+                throw new InvalidPath($ex->getMessage());
130
+            }
131
+        }
132
+
133
+        // Is it the root node?
134
+        if (!strlen($path)) {
135
+            return $this->rootNode;
136
+        }
137
+
138
+        if (pathinfo($path, PATHINFO_EXTENSION) === 'part') {
139
+            // read from storage
140
+            $absPath = $this->fileView->getAbsolutePath($path);
141
+            $mount = $this->fileView->getMount($path);
142
+            $storage = $mount->getStorage();
143
+            $internalPath = $mount->getInternalPath($absPath);
144
+            if ($storage && $storage->file_exists($internalPath)) {
145
+                /**
146
+                 * @var \OC\Files\Storage\Storage $storage
147
+                 */
148
+                // get data directly
149
+                $data = $storage->getMetaData($internalPath);
150
+                $info = new FileInfo($absPath, $storage, $internalPath, $data, $mount);
151
+            } else {
152
+                $info = null;
153
+            }
154
+        } else {
155
+            // resolve chunk file name to real name, if applicable
156
+            $path = $this->resolveChunkFile($path);
157
+
158
+            // read from cache
159
+            try {
160
+                $info = $this->fileView->getFileInfo($path);
161
+            } catch (StorageNotAvailableException $e) {
162
+                throw new \Sabre\DAV\Exception\ServiceUnavailable('Storage is temporarily not available');
163
+            } catch (StorageInvalidException $e) {
164
+                throw new \Sabre\DAV\Exception\NotFound('Storage ' . $path . ' is invalid');
165
+            } catch (LockedException $e) {
166
+                throw new \Sabre\DAV\Exception\Locked();
167
+            } catch (ForbiddenException $e) {
168
+                throw new \Sabre\DAV\Exception\Forbidden();
169
+            }
170
+        }
171
+
172
+        if (!$info) {
173
+            throw new \Sabre\DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
174
+        }
175
+
176
+        if ($info->getType() === 'dir') {
177
+            $node = new \OCA\DAV\Connector\Sabre\Directory($this->fileView, $info, $this);
178
+        } else {
179
+            $node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info);
180
+        }
181
+
182
+        $this->cache[$path] = $node;
183
+        return $node;
184
+
185
+    }
186
+
187
+    /**
188
+     * Moves a file from one location to another
189
+     *
190
+     * @param string $sourcePath The path to the file which should be moved
191
+     * @param string $destinationPath The full destination path, so not just the destination parent node
192
+     * @throws FileLocked
193
+     * @throws Forbidden
194
+     * @throws InvalidPath
195
+     * @throws \Sabre\DAV\Exception\Forbidden
196
+     * @throws \Sabre\DAV\Exception\Locked
197
+     * @throws \Sabre\DAV\Exception\NotFound
198
+     * @throws \Sabre\DAV\Exception\ServiceUnavailable
199
+     * @return int
200
+     */
201
+    public function move($sourcePath, $destinationPath) {
202
+        if (!$this->fileView) {
203
+            throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup');
204
+        }
205
+
206
+        $infoDestination = $this->fileView->getFileInfo(dirname($destinationPath));
207
+        if (dirname($destinationPath) === dirname($sourcePath)) {
208
+            $sourcePermission = $infoDestination && $infoDestination->isUpdateable();
209
+            $destinationPermission = $sourcePermission;
210
+        } else {
211
+            $infoSource = $this->fileView->getFileInfo($sourcePath);
212
+            if ($this->fileView->file_exists($destinationPath)) {
213
+                $destinationPermission = $infoDestination && $infoDestination->isUpdateable();
214
+            } else {
215
+                $destinationPermission = $infoDestination && $infoDestination->isCreatable();
216
+            }
217
+            $sourcePermission =  $infoSource && $infoSource->isDeletable();
218
+        }
219
+
220
+        if (!$destinationPermission || !$sourcePermission) {
221
+            throw new Forbidden('No permissions to move object.');
222
+        }
223
+
224
+        $targetNodeExists = $this->nodeExists($destinationPath);
225
+        $sourceNode = $this->getNodeForPath($sourcePath);
226
+        if ($sourceNode instanceof \Sabre\DAV\ICollection && $targetNodeExists) {
227
+            throw new \Sabre\DAV\Exception\Forbidden('Could not copy directory ' . $sourceNode->getName() . ', target exists');
228
+        }
229
+        list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($sourcePath);
230
+        list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destinationPath);
231
+
232
+        $isMovableMount = false;
233
+        $sourceMount = $this->mountManager->find($this->fileView->getAbsolutePath($sourcePath));
234
+        $internalPath = $sourceMount->getInternalPath($this->fileView->getAbsolutePath($sourcePath));
235
+        if ($sourceMount instanceof MoveableMount && $internalPath === '') {
236
+            $isMovableMount = true;
237
+        }
238
+
239
+        try {
240
+            $sameFolder = ($sourceDir === $destinationDir);
241
+            // if we're overwriting or same folder
242
+            if ($targetNodeExists || $sameFolder) {
243
+                // note that renaming a share mount point is always allowed
244
+                if (!$this->fileView->isUpdatable($destinationDir) && !$isMovableMount) {
245
+                    throw new \Sabre\DAV\Exception\Forbidden();
246
+                }
247
+            } else {
248
+                if (!$this->fileView->isCreatable($destinationDir)) {
249
+                    throw new \Sabre\DAV\Exception\Forbidden();
250
+                }
251
+            }
252
+
253
+            if (!$sameFolder) {
254
+                // moving to a different folder, source will be gone, like a deletion
255
+                // note that moving a share mount point is always allowed
256
+                if (!$this->fileView->isDeletable($sourcePath) && !$isMovableMount) {
257
+                    throw new \Sabre\DAV\Exception\Forbidden();
258
+                }
259
+            }
260
+
261
+            $fileName = basename($destinationPath);
262
+            try {
263
+                $this->fileView->verifyPath($destinationDir, $fileName);
264
+            } catch (\OCP\Files\InvalidPathException $ex) {
265
+                throw new InvalidPath($ex->getMessage());
266
+            }
267
+
268
+            $renameOkay = $this->fileView->rename($sourcePath, $destinationPath);
269
+            if (!$renameOkay) {
270
+                throw new \Sabre\DAV\Exception\Forbidden('');
271
+            }
272
+        } catch (StorageNotAvailableException $e) {
273
+            throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
274
+        } catch (ForbiddenException $ex) {
275
+            throw new Forbidden($ex->getMessage(), $ex->getRetry());
276
+        } catch (LockedException $e) {
277
+            throw new FileLocked($e->getMessage(), $e->getCode(), $e);
278
+        }
279
+
280
+        $this->markDirty($sourceDir);
281
+        $this->markDirty($destinationDir);
282
+
283
+    }
284
+
285
+    /**
286
+     * Copies a file or directory.
287
+     *
288
+     * This method must work recursively and delete the destination
289
+     * if it exists
290
+     *
291
+     * @param string $source
292
+     * @param string $destination
293
+     * @throws FileLocked
294
+     * @throws Forbidden
295
+     * @throws InvalidPath
296
+     * @throws \Exception
297
+     * @throws \Sabre\DAV\Exception\Forbidden
298
+     * @throws \Sabre\DAV\Exception\Locked
299
+     * @throws \Sabre\DAV\Exception\NotFound
300
+     * @throws \Sabre\DAV\Exception\ServiceUnavailable
301
+     * @return void
302
+     */
303
+    public function copy($source, $destination) {
304
+        if (!$this->fileView) {
305
+            throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup');
306
+        }
307
+
308
+
309
+        $info = $this->fileView->getFileInfo(dirname($destination));
310
+        if ($this->fileView->file_exists($destination)) {
311
+            $destinationPermission = $info && $info->isUpdateable();
312
+        } else {
313
+            $destinationPermission = $info && $info->isCreatable();
314
+        }
315
+        if (!$destinationPermission) {
316
+            throw new Forbidden('No permissions to copy object.');
317
+        }
318
+
319
+        // this will trigger existence check
320
+        $this->getNodeForPath($source);
321
+
322
+        list($destinationDir, $destinationName) = \Sabre\HTTP\URLUtil::splitPath($destination);
323
+        try {
324
+            $this->fileView->verifyPath($destinationDir, $destinationName);
325
+        } catch (\OCP\Files\InvalidPathException $ex) {
326
+            throw new InvalidPath($ex->getMessage());
327
+        }
328
+
329
+        try {
330
+            $this->fileView->copy($source, $destination);
331
+        } catch (StorageNotAvailableException $e) {
332
+            throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
333
+        } catch (ForbiddenException $ex) {
334
+            throw new Forbidden($ex->getMessage(), $ex->getRetry());
335
+        } catch (LockedException $e) {
336
+            throw new FileLocked($e->getMessage(), $e->getCode(), $e);
337
+        }
338
+
339
+        list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination);
340
+        $this->markDirty($destinationDir);
341
+    }
342 342
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/TagsPlugin.php 1 patch
Indentation   +222 added lines, -222 removed lines patch added patch discarded remove patch
@@ -49,250 +49,250 @@
 block discarded – undo
49 49
 class TagsPlugin extends \Sabre\DAV\ServerPlugin
50 50
 {
51 51
 
52
-	// namespace
53
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
54
-	const TAGS_PROPERTYNAME = '{http://owncloud.org/ns}tags';
55
-	const FAVORITE_PROPERTYNAME = '{http://owncloud.org/ns}favorite';
56
-	const TAG_FAVORITE = '_$!<Favorite>!$_';
52
+    // namespace
53
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
54
+    const TAGS_PROPERTYNAME = '{http://owncloud.org/ns}tags';
55
+    const FAVORITE_PROPERTYNAME = '{http://owncloud.org/ns}favorite';
56
+    const TAG_FAVORITE = '_$!<Favorite>!$_';
57 57
 
58
-	/**
59
-	 * Reference to main server object
60
-	 *
61
-	 * @var \Sabre\DAV\Server
62
-	 */
63
-	private $server;
58
+    /**
59
+     * Reference to main server object
60
+     *
61
+     * @var \Sabre\DAV\Server
62
+     */
63
+    private $server;
64 64
 
65
-	/**
66
-	 * @var \OCP\ITagManager
67
-	 */
68
-	private $tagManager;
65
+    /**
66
+     * @var \OCP\ITagManager
67
+     */
68
+    private $tagManager;
69 69
 
70
-	/**
71
-	 * @var \OCP\ITags
72
-	 */
73
-	private $tagger;
70
+    /**
71
+     * @var \OCP\ITags
72
+     */
73
+    private $tagger;
74 74
 
75
-	/**
76
-	 * Array of file id to tags array
77
-	 * The null value means the cache wasn't initialized.
78
-	 *
79
-	 * @var array
80
-	 */
81
-	private $cachedTags;
75
+    /**
76
+     * Array of file id to tags array
77
+     * The null value means the cache wasn't initialized.
78
+     *
79
+     * @var array
80
+     */
81
+    private $cachedTags;
82 82
 
83
-	/**
84
-	 * @var \Sabre\DAV\Tree
85
-	 */
86
-	private $tree;
83
+    /**
84
+     * @var \Sabre\DAV\Tree
85
+     */
86
+    private $tree;
87 87
 
88
-	/**
89
-	 * @param \Sabre\DAV\Tree $tree tree
90
-	 * @param \OCP\ITagManager $tagManager tag manager
91
-	 */
92
-	public function __construct(\Sabre\DAV\Tree $tree, \OCP\ITagManager $tagManager) {
93
-		$this->tree = $tree;
94
-		$this->tagManager = $tagManager;
95
-		$this->tagger = null;
96
-		$this->cachedTags = array();
97
-	}
88
+    /**
89
+     * @param \Sabre\DAV\Tree $tree tree
90
+     * @param \OCP\ITagManager $tagManager tag manager
91
+     */
92
+    public function __construct(\Sabre\DAV\Tree $tree, \OCP\ITagManager $tagManager) {
93
+        $this->tree = $tree;
94
+        $this->tagManager = $tagManager;
95
+        $this->tagger = null;
96
+        $this->cachedTags = array();
97
+    }
98 98
 
99
-	/**
100
-	 * This initializes the plugin.
101
-	 *
102
-	 * This function is called by \Sabre\DAV\Server, after
103
-	 * addPlugin is called.
104
-	 *
105
-	 * This method should set up the required event subscriptions.
106
-	 *
107
-	 * @param \Sabre\DAV\Server $server
108
-	 * @return void
109
-	 */
110
-	public function initialize(\Sabre\DAV\Server $server) {
99
+    /**
100
+     * This initializes the plugin.
101
+     *
102
+     * This function is called by \Sabre\DAV\Server, after
103
+     * addPlugin is called.
104
+     *
105
+     * This method should set up the required event subscriptions.
106
+     *
107
+     * @param \Sabre\DAV\Server $server
108
+     * @return void
109
+     */
110
+    public function initialize(\Sabre\DAV\Server $server) {
111 111
 
112
-		$server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
113
-		$server->xml->elementMap[self::TAGS_PROPERTYNAME] = 'OCA\\DAV\\Connector\\Sabre\\TagList';
112
+        $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
113
+        $server->xml->elementMap[self::TAGS_PROPERTYNAME] = 'OCA\\DAV\\Connector\\Sabre\\TagList';
114 114
 
115
-		$this->server = $server;
116
-		$this->server->on('propFind', array($this, 'handleGetProperties'));
117
-		$this->server->on('propPatch', array($this, 'handleUpdateProperties'));
118
-	}
115
+        $this->server = $server;
116
+        $this->server->on('propFind', array($this, 'handleGetProperties'));
117
+        $this->server->on('propPatch', array($this, 'handleUpdateProperties'));
118
+    }
119 119
 
120
-	/**
121
-	 * Returns the tagger
122
-	 *
123
-	 * @return \OCP\ITags tagger
124
-	 */
125
-	private function getTagger() {
126
-		if (!$this->tagger) {
127
-			$this->tagger = $this->tagManager->load('files');
128
-		}
129
-		return $this->tagger;
130
-	}
120
+    /**
121
+     * Returns the tagger
122
+     *
123
+     * @return \OCP\ITags tagger
124
+     */
125
+    private function getTagger() {
126
+        if (!$this->tagger) {
127
+            $this->tagger = $this->tagManager->load('files');
128
+        }
129
+        return $this->tagger;
130
+    }
131 131
 
132
-	/**
133
-	 * Returns tags and favorites.
134
-	 *
135
-	 * @param integer $fileId file id
136
-	 * @return array list($tags, $favorite) with $tags as tag array
137
-	 * and $favorite is a boolean whether the file was favorited
138
-	 */
139
-	private function getTagsAndFav($fileId) {
140
-		$isFav = false;
141
-		$tags = $this->getTags($fileId);
142
-		if ($tags) {
143
-			$favPos = array_search(self::TAG_FAVORITE, $tags);
144
-			if ($favPos !== false) {
145
-				$isFav = true;
146
-				unset($tags[$favPos]);
147
-			}
148
-		}
149
-		return array($tags, $isFav);
150
-	}
132
+    /**
133
+     * Returns tags and favorites.
134
+     *
135
+     * @param integer $fileId file id
136
+     * @return array list($tags, $favorite) with $tags as tag array
137
+     * and $favorite is a boolean whether the file was favorited
138
+     */
139
+    private function getTagsAndFav($fileId) {
140
+        $isFav = false;
141
+        $tags = $this->getTags($fileId);
142
+        if ($tags) {
143
+            $favPos = array_search(self::TAG_FAVORITE, $tags);
144
+            if ($favPos !== false) {
145
+                $isFav = true;
146
+                unset($tags[$favPos]);
147
+            }
148
+        }
149
+        return array($tags, $isFav);
150
+    }
151 151
 
152
-	/**
153
-	 * Returns tags for the given file id
154
-	 *
155
-	 * @param integer $fileId file id
156
-	 * @return array list of tags for that file
157
-	 */
158
-	private function getTags($fileId) {
159
-		if (isset($this->cachedTags[$fileId])) {
160
-			return $this->cachedTags[$fileId];
161
-		} else {
162
-			$tags = $this->getTagger()->getTagsForObjects(array($fileId));
163
-			if ($tags !== false) {
164
-				if (empty($tags)) {
165
-					return array();
166
-				}
167
-				return current($tags);
168
-			}
169
-		}
170
-		return null;
171
-	}
152
+    /**
153
+     * Returns tags for the given file id
154
+     *
155
+     * @param integer $fileId file id
156
+     * @return array list of tags for that file
157
+     */
158
+    private function getTags($fileId) {
159
+        if (isset($this->cachedTags[$fileId])) {
160
+            return $this->cachedTags[$fileId];
161
+        } else {
162
+            $tags = $this->getTagger()->getTagsForObjects(array($fileId));
163
+            if ($tags !== false) {
164
+                if (empty($tags)) {
165
+                    return array();
166
+                }
167
+                return current($tags);
168
+            }
169
+        }
170
+        return null;
171
+    }
172 172
 
173
-	/**
174
-	 * Updates the tags of the given file id
175
-	 *
176
-	 * @param int $fileId
177
-	 * @param array $tags array of tag strings
178
-	 */
179
-	private function updateTags($fileId, $tags) {
180
-		$tagger = $this->getTagger();
181
-		$currentTags = $this->getTags($fileId);
173
+    /**
174
+     * Updates the tags of the given file id
175
+     *
176
+     * @param int $fileId
177
+     * @param array $tags array of tag strings
178
+     */
179
+    private function updateTags($fileId, $tags) {
180
+        $tagger = $this->getTagger();
181
+        $currentTags = $this->getTags($fileId);
182 182
 
183
-		$newTags = array_diff($tags, $currentTags);
184
-		foreach ($newTags as $tag) {
185
-			if ($tag === self::TAG_FAVORITE) {
186
-				continue;
187
-			}
188
-			$tagger->tagAs($fileId, $tag);
189
-		}
190
-		$deletedTags = array_diff($currentTags, $tags);
191
-		foreach ($deletedTags as $tag) {
192
-			if ($tag === self::TAG_FAVORITE) {
193
-				continue;
194
-			}
195
-			$tagger->unTag($fileId, $tag);
196
-		}
197
-	}
183
+        $newTags = array_diff($tags, $currentTags);
184
+        foreach ($newTags as $tag) {
185
+            if ($tag === self::TAG_FAVORITE) {
186
+                continue;
187
+            }
188
+            $tagger->tagAs($fileId, $tag);
189
+        }
190
+        $deletedTags = array_diff($currentTags, $tags);
191
+        foreach ($deletedTags as $tag) {
192
+            if ($tag === self::TAG_FAVORITE) {
193
+                continue;
194
+            }
195
+            $tagger->unTag($fileId, $tag);
196
+        }
197
+    }
198 198
 
199
-	/**
200
-	 * Adds tags and favorites properties to the response,
201
-	 * if requested.
202
-	 *
203
-	 * @param PropFind $propFind
204
-	 * @param \Sabre\DAV\INode $node
205
-	 * @return void
206
-	 */
207
-	public function handleGetProperties(
208
-		PropFind $propFind,
209
-		\Sabre\DAV\INode $node
210
-	) {
211
-		if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) {
212
-			return;
213
-		}
199
+    /**
200
+     * Adds tags and favorites properties to the response,
201
+     * if requested.
202
+     *
203
+     * @param PropFind $propFind
204
+     * @param \Sabre\DAV\INode $node
205
+     * @return void
206
+     */
207
+    public function handleGetProperties(
208
+        PropFind $propFind,
209
+        \Sabre\DAV\INode $node
210
+    ) {
211
+        if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) {
212
+            return;
213
+        }
214 214
 
215
-		// need prefetch ?
216
-		if ($node instanceof \OCA\DAV\Connector\Sabre\Directory
217
-			&& $propFind->getDepth() !== 0
218
-			&& (!is_null($propFind->getStatus(self::TAGS_PROPERTYNAME))
219
-			|| !is_null($propFind->getStatus(self::FAVORITE_PROPERTYNAME))
220
-		)) {
221
-			// note: pre-fetching only supported for depth <= 1
222
-			$folderContent = $node->getChildren();
223
-			$fileIds[] = (int)$node->getId();
224
-			foreach ($folderContent as $info) {
225
-				$fileIds[] = (int)$info->getId();
226
-			}
227
-			$tags = $this->getTagger()->getTagsForObjects($fileIds);
228
-			if ($tags === false) {
229
-				// the tags API returns false on error...
230
-				$tags = array();
231
-			}
215
+        // need prefetch ?
216
+        if ($node instanceof \OCA\DAV\Connector\Sabre\Directory
217
+            && $propFind->getDepth() !== 0
218
+            && (!is_null($propFind->getStatus(self::TAGS_PROPERTYNAME))
219
+            || !is_null($propFind->getStatus(self::FAVORITE_PROPERTYNAME))
220
+        )) {
221
+            // note: pre-fetching only supported for depth <= 1
222
+            $folderContent = $node->getChildren();
223
+            $fileIds[] = (int)$node->getId();
224
+            foreach ($folderContent as $info) {
225
+                $fileIds[] = (int)$info->getId();
226
+            }
227
+            $tags = $this->getTagger()->getTagsForObjects($fileIds);
228
+            if ($tags === false) {
229
+                // the tags API returns false on error...
230
+                $tags = array();
231
+            }
232 232
 
233
-			$this->cachedTags = $this->cachedTags + $tags;
234
-			$emptyFileIds = array_diff($fileIds, array_keys($tags));
235
-			// also cache the ones that were not found
236
-			foreach ($emptyFileIds as $fileId) {
237
-				$this->cachedTags[$fileId] = [];
238
-			}
239
-		}
233
+            $this->cachedTags = $this->cachedTags + $tags;
234
+            $emptyFileIds = array_diff($fileIds, array_keys($tags));
235
+            // also cache the ones that were not found
236
+            foreach ($emptyFileIds as $fileId) {
237
+                $this->cachedTags[$fileId] = [];
238
+            }
239
+        }
240 240
 
241
-		$tags = null;
242
-		$isFav = null;
241
+        $tags = null;
242
+        $isFav = null;
243 243
 
244
-		$propFind->handle(self::TAGS_PROPERTYNAME, function() use ($tags, &$isFav, $node) {
245
-			list($tags, $isFav) = $this->getTagsAndFav($node->getId());
246
-			return new TagList($tags);
247
-		});
244
+        $propFind->handle(self::TAGS_PROPERTYNAME, function() use ($tags, &$isFav, $node) {
245
+            list($tags, $isFav) = $this->getTagsAndFav($node->getId());
246
+            return new TagList($tags);
247
+        });
248 248
 
249
-		$propFind->handle(self::FAVORITE_PROPERTYNAME, function() use ($isFav, $node) {
250
-			if (is_null($isFav)) {
251
-				list(, $isFav) = $this->getTagsAndFav($node->getId());
252
-			}
253
-			if ($isFav) {
254
-				return 1;
255
-			} else {
256
-				return 0;
257
-			}
258
-		});
259
-	}
249
+        $propFind->handle(self::FAVORITE_PROPERTYNAME, function() use ($isFav, $node) {
250
+            if (is_null($isFav)) {
251
+                list(, $isFav) = $this->getTagsAndFav($node->getId());
252
+            }
253
+            if ($isFav) {
254
+                return 1;
255
+            } else {
256
+                return 0;
257
+            }
258
+        });
259
+    }
260 260
 
261
-	/**
262
-	 * Updates tags and favorites properties, if applicable.
263
-	 *
264
-	 * @param string $path
265
-	 * @param PropPatch $propPatch
266
-	 *
267
-	 * @return void
268
-	 */
269
-	public function handleUpdateProperties($path, PropPatch $propPatch) {
270
-		$propPatch->handle(self::TAGS_PROPERTYNAME, function($tagList) use ($path) {
271
-			$node = $this->tree->getNodeForPath($path);
272
-			if (is_null($node)) {
273
-				return 404;
274
-			}
275
-			$this->updateTags($node->getId(), $tagList->getTags());
276
-			return true;
277
-		});
261
+    /**
262
+     * Updates tags and favorites properties, if applicable.
263
+     *
264
+     * @param string $path
265
+     * @param PropPatch $propPatch
266
+     *
267
+     * @return void
268
+     */
269
+    public function handleUpdateProperties($path, PropPatch $propPatch) {
270
+        $propPatch->handle(self::TAGS_PROPERTYNAME, function($tagList) use ($path) {
271
+            $node = $this->tree->getNodeForPath($path);
272
+            if (is_null($node)) {
273
+                return 404;
274
+            }
275
+            $this->updateTags($node->getId(), $tagList->getTags());
276
+            return true;
277
+        });
278 278
 
279
-		$propPatch->handle(self::FAVORITE_PROPERTYNAME, function($favState) use ($path) {
280
-			$node = $this->tree->getNodeForPath($path);
281
-			if (is_null($node)) {
282
-				return 404;
283
-			}
284
-			if ((int)$favState === 1 || $favState === 'true') {
285
-				$this->getTagger()->tagAs($node->getId(), self::TAG_FAVORITE);
286
-			} else {
287
-				$this->getTagger()->unTag($node->getId(), self::TAG_FAVORITE);
288
-			}
279
+        $propPatch->handle(self::FAVORITE_PROPERTYNAME, function($favState) use ($path) {
280
+            $node = $this->tree->getNodeForPath($path);
281
+            if (is_null($node)) {
282
+                return 404;
283
+            }
284
+            if ((int)$favState === 1 || $favState === 'true') {
285
+                $this->getTagger()->tagAs($node->getId(), self::TAG_FAVORITE);
286
+            } else {
287
+                $this->getTagger()->unTag($node->getId(), self::TAG_FAVORITE);
288
+            }
289 289
 
290
-			if (is_null($favState)) {
291
-				// confirm deletion
292
-				return 204;
293
-			}
290
+            if (is_null($favState)) {
291
+                // confirm deletion
292
+                return 204;
293
+            }
294 294
 
295
-			return 200;
296
-		});
297
-	}
295
+            return 200;
296
+        });
297
+    }
298 298
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/FilesReportPlugin.php 1 patch
Indentation   +358 added lines, -358 removed lines patch added patch discarded remove patch
@@ -41,362 +41,362 @@
 block discarded – undo
41 41
 
42 42
 class FilesReportPlugin extends ServerPlugin {
43 43
 
44
-	// namespace
45
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
46
-	const REPORT_NAME            = '{http://owncloud.org/ns}filter-files';
47
-	const SYSTEMTAG_PROPERTYNAME = '{http://owncloud.org/ns}systemtag';
48
-
49
-	/**
50
-	 * Reference to main server object
51
-	 *
52
-	 * @var \Sabre\DAV\Server
53
-	 */
54
-	private $server;
55
-
56
-	/**
57
-	 * @var Tree
58
-	 */
59
-	private $tree;
60
-
61
-	/**
62
-	 * @var View
63
-	 */
64
-	private $fileView;
65
-
66
-	/**
67
-	 * @var ISystemTagManager
68
-	 */
69
-	private $tagManager;
70
-
71
-	/**
72
-	 * @var ISystemTagObjectMapper
73
-	 */
74
-	private $tagMapper;
75
-
76
-	/**
77
-	 * Manager for private tags
78
-	 *
79
-	 * @var ITagManager
80
-	 */
81
-	private $fileTagger;
82
-
83
-	/**
84
-	 * @var IUserSession
85
-	 */
86
-	private $userSession;
87
-
88
-	/**
89
-	 * @var IGroupManager
90
-	 */
91
-	private $groupManager;
92
-
93
-	/**
94
-	 * @var Folder
95
-	 */
96
-	private $userFolder;
97
-
98
-	/**
99
-	 * @param Tree $tree
100
-	 * @param View $view
101
-	 * @param ISystemTagManager $tagManager
102
-	 * @param ISystemTagObjectMapper $tagMapper
103
-	 * @param ITagManager $fileTagger manager for private tags
104
-	 * @param IUserSession $userSession
105
-	 * @param IGroupManager $groupManager
106
-	 * @param Folder $userFolder
107
-	 */
108
-	public function __construct(Tree $tree,
109
-								View $view,
110
-								ISystemTagManager $tagManager,
111
-								ISystemTagObjectMapper $tagMapper,
112
-								ITagManager $fileTagger,
113
-								IUserSession $userSession,
114
-								IGroupManager $groupManager,
115
-								Folder $userFolder
116
-	) {
117
-		$this->tree = $tree;
118
-		$this->fileView = $view;
119
-		$this->tagManager = $tagManager;
120
-		$this->tagMapper = $tagMapper;
121
-		$this->fileTagger = $fileTagger;
122
-		$this->userSession = $userSession;
123
-		$this->groupManager = $groupManager;
124
-		$this->userFolder = $userFolder;
125
-	}
126
-
127
-	/**
128
-	 * This initializes the plugin.
129
-	 *
130
-	 * This function is called by \Sabre\DAV\Server, after
131
-	 * addPlugin is called.
132
-	 *
133
-	 * This method should set up the required event subscriptions.
134
-	 *
135
-	 * @param \Sabre\DAV\Server $server
136
-	 * @return void
137
-	 */
138
-	public function initialize(\Sabre\DAV\Server $server) {
139
-
140
-		$server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
141
-
142
-		$this->server = $server;
143
-		$this->server->on('report', array($this, 'onReport'));
144
-	}
145
-
146
-	/**
147
-	 * Returns a list of reports this plugin supports.
148
-	 *
149
-	 * This will be used in the {DAV:}supported-report-set property.
150
-	 *
151
-	 * @param string $uri
152
-	 * @return array
153
-	 */
154
-	public function getSupportedReportSet($uri) {
155
-		return [self::REPORT_NAME];
156
-	}
157
-
158
-	/**
159
-	 * REPORT operations to look for files
160
-	 *
161
-	 * @param string $reportName
162
-	 * @param $report
163
-	 * @param string $uri
164
-	 * @return bool
165
-	 * @throws BadRequest
166
-	 * @throws PreconditionFailed
167
-	 * @internal param $ [] $report
168
-	 */
169
-	public function onReport($reportName, $report, $uri) {
170
-		$reportTargetNode = $this->server->tree->getNodeForPath($uri);
171
-		if (!$reportTargetNode instanceof Directory || $reportName !== self::REPORT_NAME) {
172
-			return;
173
-		}
174
-
175
-		$ns = '{' . $this::NS_OWNCLOUD . '}';
176
-		$requestedProps = [];
177
-		$filterRules = [];
178
-
179
-		// parse report properties and gather filter info
180
-		foreach ($report as $reportProps) {
181
-			$name = $reportProps['name'];
182
-			if ($name === $ns . 'filter-rules') {
183
-				$filterRules = $reportProps['value'];
184
-			} else if ($name === '{DAV:}prop') {
185
-				// propfind properties
186
-				foreach ($reportProps['value'] as $propVal) {
187
-					$requestedProps[] = $propVal['name'];
188
-				}
189
-			}
190
-		}
191
-
192
-		if (empty($filterRules)) {
193
-			// an empty filter would return all existing files which would be slow
194
-			throw new BadRequest('Missing filter-rule block in request');
195
-		}
196
-
197
-		// gather all file ids matching filter
198
-		try {
199
-			$resultFileIds = $this->processFilterRules($filterRules);
200
-		} catch (TagNotFoundException $e) {
201
-			throw new PreconditionFailed('Cannot filter by non-existing tag', 0, $e);
202
-		}
203
-
204
-		// find sabre nodes by file id, restricted to the root node path
205
-		$results = $this->findNodesByFileIds($reportTargetNode, $resultFileIds);
206
-
207
-		$filesUri = $this->getFilesBaseUri($uri, $reportTargetNode->getPath());
208
-		$responses = $this->prepareResponses($filesUri, $requestedProps, $results);
209
-
210
-		$xml = $this->server->xml->write(
211
-			'{DAV:}multistatus',
212
-			new MultiStatus($responses)
213
-		);
214
-
215
-		$this->server->httpResponse->setStatus(207);
216
-		$this->server->httpResponse->setHeader('Content-Type', 'application/xml; charset=utf-8');
217
-		$this->server->httpResponse->setBody($xml);
218
-
219
-		return false;
220
-	}
221
-
222
-	/**
223
-	 * Returns the base uri of the files root by removing
224
-	 * the subpath from the URI
225
-	 *
226
-	 * @param string $uri URI from this request
227
-	 * @param string $subPath subpath to remove from the URI
228
-	 *
229
-	 * @return string files base uri
230
-	 */
231
-	private function getFilesBaseUri($uri, $subPath) {
232
-		$uri = trim($uri, '/');
233
-		$subPath = trim($subPath, '/');
234
-		if (empty($subPath)) {
235
-			$filesUri = $uri;
236
-		} else {
237
-			$filesUri = substr($uri, 0, strlen($uri) - strlen($subPath));
238
-		}
239
-		$filesUri = trim($filesUri, '/');
240
-		if (empty($filesUri)) {
241
-			return '';
242
-		}
243
-		return '/' . $filesUri;
244
-	}
245
-
246
-	/**
247
-	 * Find file ids matching the given filter rules
248
-	 *
249
-	 * @param array $filterRules
250
-	 * @return array array of unique file id results
251
-	 *
252
-	 * @throws TagNotFoundException whenever a tag was not found
253
-	 */
254
-	protected function processFilterRules($filterRules) {
255
-		$ns = '{' . $this::NS_OWNCLOUD . '}';
256
-		$resultFileIds = null;
257
-		$systemTagIds = [];
258
-		$favoriteFilter = null;
259
-		foreach ($filterRules as $filterRule) {
260
-			if ($filterRule['name'] === $ns . 'systemtag') {
261
-				$systemTagIds[] = $filterRule['value'];
262
-			}
263
-			if ($filterRule['name'] === $ns . 'favorite') {
264
-				$favoriteFilter = true;
265
-			}
266
-		}
267
-
268
-		if ($favoriteFilter !== null) {
269
-			$resultFileIds = $this->fileTagger->load('files')->getFavorites();
270
-			if (empty($resultFileIds)) {
271
-				return [];
272
-			}
273
-		}
274
-
275
-		if (!empty($systemTagIds)) {
276
-			$fileIds = $this->getSystemTagFileIds($systemTagIds);
277
-			if (empty($resultFileIds)) {
278
-				$resultFileIds = $fileIds;
279
-			} else {
280
-				$resultFileIds = array_intersect($fileIds, $resultFileIds);
281
-			}
282
-		}
283
-
284
-		return $resultFileIds;
285
-	}
286
-
287
-	private function getSystemTagFileIds($systemTagIds) {
288
-		$resultFileIds = null;
289
-
290
-		// check user permissions, if applicable
291
-		if (!$this->isAdmin()) {
292
-			// check visibility/permission
293
-			$tags = $this->tagManager->getTagsByIds($systemTagIds);
294
-			$unknownTagIds = [];
295
-			foreach ($tags as $tag) {
296
-				if (!$tag->isUserVisible()) {
297
-					$unknownTagIds[] = $tag->getId();
298
-				}
299
-			}
300
-
301
-			if (!empty($unknownTagIds)) {
302
-				throw new TagNotFoundException('Tag with ids ' . implode(', ', $unknownTagIds) . ' not found');
303
-			}
304
-		}
305
-
306
-		// fetch all file ids and intersect them
307
-		foreach ($systemTagIds as $systemTagId) {
308
-			$fileIds = $this->tagMapper->getObjectIdsForTags($systemTagId, 'files');
309
-
310
-			if (empty($fileIds)) {
311
-				// This tag has no files, nothing can ever show up
312
-				return [];
313
-			}
314
-
315
-			// first run ?
316
-			if ($resultFileIds === null) {
317
-				$resultFileIds = $fileIds;
318
-			} else {
319
-				$resultFileIds = array_intersect($resultFileIds, $fileIds);
320
-			}
321
-
322
-			if (empty($resultFileIds)) {
323
-				// Empty intersection, nothing can show up anymore
324
-				return [];
325
-			}
326
-		}
327
-		return $resultFileIds;
328
-	}
329
-
330
-	/**
331
-	 * Prepare propfind response for the given nodes
332
-	 *
333
-	 * @param string $filesUri $filesUri URI leading to root of the files URI,
334
-	 * with a leading slash but no trailing slash
335
-	 * @param string[] $requestedProps requested properties
336
-	 * @param Node[] nodes nodes for which to fetch and prepare responses
337
-	 * @return Response[]
338
-	 */
339
-	public function prepareResponses($filesUri, $requestedProps, $nodes) {
340
-		$responses = [];
341
-		foreach ($nodes as $node) {
342
-			$propFind = new PropFind($filesUri . $node->getPath(), $requestedProps);
343
-
344
-			$this->server->getPropertiesByNode($propFind, $node);
345
-			// copied from Sabre Server's getPropertiesForPath
346
-			$result = $propFind->getResultForMultiStatus();
347
-			$result['href'] = $propFind->getPath();
348
-
349
-			$resourceType = $this->server->getResourceTypeForNode($node);
350
-			if (in_array('{DAV:}collection', $resourceType) || in_array('{DAV:}principal', $resourceType)) {
351
-				$result['href'] .= '/';
352
-			}
353
-
354
-			$responses[] = new Response(
355
-				rtrim($this->server->getBaseUri(), '/') . $filesUri . $node->getPath(),
356
-				$result,
357
-				200
358
-			);
359
-		}
360
-		return $responses;
361
-	}
362
-
363
-	/**
364
-	 * Find Sabre nodes by file ids
365
-	 *
366
-	 * @param Node $rootNode root node for search
367
-	 * @param array $fileIds file ids
368
-	 * @return Node[] array of Sabre nodes
369
-	 */
370
-	public function findNodesByFileIds($rootNode, $fileIds) {
371
-		$folder = $this->userFolder;
372
-		if (trim($rootNode->getPath(), '/') !== '') {
373
-			$folder = $folder->get($rootNode->getPath());
374
-		}
375
-
376
-		$results = [];
377
-		foreach ($fileIds as $fileId) {
378
-			$entry = $folder->getById($fileId);
379
-			if ($entry) {
380
-				$entry = current($entry);
381
-				if ($entry instanceof \OCP\Files\File) {
382
-					$results[] = new File($this->fileView, $entry);
383
-				} else if ($entry instanceof \OCP\Files\Folder) {
384
-					$results[] = new Directory($this->fileView, $entry);
385
-				}
386
-			}
387
-		}
388
-
389
-		return $results;
390
-	}
391
-
392
-	/**
393
-	 * Returns whether the currently logged in user is an administrator
394
-	 */
395
-	private function isAdmin() {
396
-		$user = $this->userSession->getUser();
397
-		if ($user !== null) {
398
-			return $this->groupManager->isAdmin($user->getUID());
399
-		}
400
-		return false;
401
-	}
44
+    // namespace
45
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
46
+    const REPORT_NAME            = '{http://owncloud.org/ns}filter-files';
47
+    const SYSTEMTAG_PROPERTYNAME = '{http://owncloud.org/ns}systemtag';
48
+
49
+    /**
50
+     * Reference to main server object
51
+     *
52
+     * @var \Sabre\DAV\Server
53
+     */
54
+    private $server;
55
+
56
+    /**
57
+     * @var Tree
58
+     */
59
+    private $tree;
60
+
61
+    /**
62
+     * @var View
63
+     */
64
+    private $fileView;
65
+
66
+    /**
67
+     * @var ISystemTagManager
68
+     */
69
+    private $tagManager;
70
+
71
+    /**
72
+     * @var ISystemTagObjectMapper
73
+     */
74
+    private $tagMapper;
75
+
76
+    /**
77
+     * Manager for private tags
78
+     *
79
+     * @var ITagManager
80
+     */
81
+    private $fileTagger;
82
+
83
+    /**
84
+     * @var IUserSession
85
+     */
86
+    private $userSession;
87
+
88
+    /**
89
+     * @var IGroupManager
90
+     */
91
+    private $groupManager;
92
+
93
+    /**
94
+     * @var Folder
95
+     */
96
+    private $userFolder;
97
+
98
+    /**
99
+     * @param Tree $tree
100
+     * @param View $view
101
+     * @param ISystemTagManager $tagManager
102
+     * @param ISystemTagObjectMapper $tagMapper
103
+     * @param ITagManager $fileTagger manager for private tags
104
+     * @param IUserSession $userSession
105
+     * @param IGroupManager $groupManager
106
+     * @param Folder $userFolder
107
+     */
108
+    public function __construct(Tree $tree,
109
+                                View $view,
110
+                                ISystemTagManager $tagManager,
111
+                                ISystemTagObjectMapper $tagMapper,
112
+                                ITagManager $fileTagger,
113
+                                IUserSession $userSession,
114
+                                IGroupManager $groupManager,
115
+                                Folder $userFolder
116
+    ) {
117
+        $this->tree = $tree;
118
+        $this->fileView = $view;
119
+        $this->tagManager = $tagManager;
120
+        $this->tagMapper = $tagMapper;
121
+        $this->fileTagger = $fileTagger;
122
+        $this->userSession = $userSession;
123
+        $this->groupManager = $groupManager;
124
+        $this->userFolder = $userFolder;
125
+    }
126
+
127
+    /**
128
+     * This initializes the plugin.
129
+     *
130
+     * This function is called by \Sabre\DAV\Server, after
131
+     * addPlugin is called.
132
+     *
133
+     * This method should set up the required event subscriptions.
134
+     *
135
+     * @param \Sabre\DAV\Server $server
136
+     * @return void
137
+     */
138
+    public function initialize(\Sabre\DAV\Server $server) {
139
+
140
+        $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
141
+
142
+        $this->server = $server;
143
+        $this->server->on('report', array($this, 'onReport'));
144
+    }
145
+
146
+    /**
147
+     * Returns a list of reports this plugin supports.
148
+     *
149
+     * This will be used in the {DAV:}supported-report-set property.
150
+     *
151
+     * @param string $uri
152
+     * @return array
153
+     */
154
+    public function getSupportedReportSet($uri) {
155
+        return [self::REPORT_NAME];
156
+    }
157
+
158
+    /**
159
+     * REPORT operations to look for files
160
+     *
161
+     * @param string $reportName
162
+     * @param $report
163
+     * @param string $uri
164
+     * @return bool
165
+     * @throws BadRequest
166
+     * @throws PreconditionFailed
167
+     * @internal param $ [] $report
168
+     */
169
+    public function onReport($reportName, $report, $uri) {
170
+        $reportTargetNode = $this->server->tree->getNodeForPath($uri);
171
+        if (!$reportTargetNode instanceof Directory || $reportName !== self::REPORT_NAME) {
172
+            return;
173
+        }
174
+
175
+        $ns = '{' . $this::NS_OWNCLOUD . '}';
176
+        $requestedProps = [];
177
+        $filterRules = [];
178
+
179
+        // parse report properties and gather filter info
180
+        foreach ($report as $reportProps) {
181
+            $name = $reportProps['name'];
182
+            if ($name === $ns . 'filter-rules') {
183
+                $filterRules = $reportProps['value'];
184
+            } else if ($name === '{DAV:}prop') {
185
+                // propfind properties
186
+                foreach ($reportProps['value'] as $propVal) {
187
+                    $requestedProps[] = $propVal['name'];
188
+                }
189
+            }
190
+        }
191
+
192
+        if (empty($filterRules)) {
193
+            // an empty filter would return all existing files which would be slow
194
+            throw new BadRequest('Missing filter-rule block in request');
195
+        }
196
+
197
+        // gather all file ids matching filter
198
+        try {
199
+            $resultFileIds = $this->processFilterRules($filterRules);
200
+        } catch (TagNotFoundException $e) {
201
+            throw new PreconditionFailed('Cannot filter by non-existing tag', 0, $e);
202
+        }
203
+
204
+        // find sabre nodes by file id, restricted to the root node path
205
+        $results = $this->findNodesByFileIds($reportTargetNode, $resultFileIds);
206
+
207
+        $filesUri = $this->getFilesBaseUri($uri, $reportTargetNode->getPath());
208
+        $responses = $this->prepareResponses($filesUri, $requestedProps, $results);
209
+
210
+        $xml = $this->server->xml->write(
211
+            '{DAV:}multistatus',
212
+            new MultiStatus($responses)
213
+        );
214
+
215
+        $this->server->httpResponse->setStatus(207);
216
+        $this->server->httpResponse->setHeader('Content-Type', 'application/xml; charset=utf-8');
217
+        $this->server->httpResponse->setBody($xml);
218
+
219
+        return false;
220
+    }
221
+
222
+    /**
223
+     * Returns the base uri of the files root by removing
224
+     * the subpath from the URI
225
+     *
226
+     * @param string $uri URI from this request
227
+     * @param string $subPath subpath to remove from the URI
228
+     *
229
+     * @return string files base uri
230
+     */
231
+    private function getFilesBaseUri($uri, $subPath) {
232
+        $uri = trim($uri, '/');
233
+        $subPath = trim($subPath, '/');
234
+        if (empty($subPath)) {
235
+            $filesUri = $uri;
236
+        } else {
237
+            $filesUri = substr($uri, 0, strlen($uri) - strlen($subPath));
238
+        }
239
+        $filesUri = trim($filesUri, '/');
240
+        if (empty($filesUri)) {
241
+            return '';
242
+        }
243
+        return '/' . $filesUri;
244
+    }
245
+
246
+    /**
247
+     * Find file ids matching the given filter rules
248
+     *
249
+     * @param array $filterRules
250
+     * @return array array of unique file id results
251
+     *
252
+     * @throws TagNotFoundException whenever a tag was not found
253
+     */
254
+    protected function processFilterRules($filterRules) {
255
+        $ns = '{' . $this::NS_OWNCLOUD . '}';
256
+        $resultFileIds = null;
257
+        $systemTagIds = [];
258
+        $favoriteFilter = null;
259
+        foreach ($filterRules as $filterRule) {
260
+            if ($filterRule['name'] === $ns . 'systemtag') {
261
+                $systemTagIds[] = $filterRule['value'];
262
+            }
263
+            if ($filterRule['name'] === $ns . 'favorite') {
264
+                $favoriteFilter = true;
265
+            }
266
+        }
267
+
268
+        if ($favoriteFilter !== null) {
269
+            $resultFileIds = $this->fileTagger->load('files')->getFavorites();
270
+            if (empty($resultFileIds)) {
271
+                return [];
272
+            }
273
+        }
274
+
275
+        if (!empty($systemTagIds)) {
276
+            $fileIds = $this->getSystemTagFileIds($systemTagIds);
277
+            if (empty($resultFileIds)) {
278
+                $resultFileIds = $fileIds;
279
+            } else {
280
+                $resultFileIds = array_intersect($fileIds, $resultFileIds);
281
+            }
282
+        }
283
+
284
+        return $resultFileIds;
285
+    }
286
+
287
+    private function getSystemTagFileIds($systemTagIds) {
288
+        $resultFileIds = null;
289
+
290
+        // check user permissions, if applicable
291
+        if (!$this->isAdmin()) {
292
+            // check visibility/permission
293
+            $tags = $this->tagManager->getTagsByIds($systemTagIds);
294
+            $unknownTagIds = [];
295
+            foreach ($tags as $tag) {
296
+                if (!$tag->isUserVisible()) {
297
+                    $unknownTagIds[] = $tag->getId();
298
+                }
299
+            }
300
+
301
+            if (!empty($unknownTagIds)) {
302
+                throw new TagNotFoundException('Tag with ids ' . implode(', ', $unknownTagIds) . ' not found');
303
+            }
304
+        }
305
+
306
+        // fetch all file ids and intersect them
307
+        foreach ($systemTagIds as $systemTagId) {
308
+            $fileIds = $this->tagMapper->getObjectIdsForTags($systemTagId, 'files');
309
+
310
+            if (empty($fileIds)) {
311
+                // This tag has no files, nothing can ever show up
312
+                return [];
313
+            }
314
+
315
+            // first run ?
316
+            if ($resultFileIds === null) {
317
+                $resultFileIds = $fileIds;
318
+            } else {
319
+                $resultFileIds = array_intersect($resultFileIds, $fileIds);
320
+            }
321
+
322
+            if (empty($resultFileIds)) {
323
+                // Empty intersection, nothing can show up anymore
324
+                return [];
325
+            }
326
+        }
327
+        return $resultFileIds;
328
+    }
329
+
330
+    /**
331
+     * Prepare propfind response for the given nodes
332
+     *
333
+     * @param string $filesUri $filesUri URI leading to root of the files URI,
334
+     * with a leading slash but no trailing slash
335
+     * @param string[] $requestedProps requested properties
336
+     * @param Node[] nodes nodes for which to fetch and prepare responses
337
+     * @return Response[]
338
+     */
339
+    public function prepareResponses($filesUri, $requestedProps, $nodes) {
340
+        $responses = [];
341
+        foreach ($nodes as $node) {
342
+            $propFind = new PropFind($filesUri . $node->getPath(), $requestedProps);
343
+
344
+            $this->server->getPropertiesByNode($propFind, $node);
345
+            // copied from Sabre Server's getPropertiesForPath
346
+            $result = $propFind->getResultForMultiStatus();
347
+            $result['href'] = $propFind->getPath();
348
+
349
+            $resourceType = $this->server->getResourceTypeForNode($node);
350
+            if (in_array('{DAV:}collection', $resourceType) || in_array('{DAV:}principal', $resourceType)) {
351
+                $result['href'] .= '/';
352
+            }
353
+
354
+            $responses[] = new Response(
355
+                rtrim($this->server->getBaseUri(), '/') . $filesUri . $node->getPath(),
356
+                $result,
357
+                200
358
+            );
359
+        }
360
+        return $responses;
361
+    }
362
+
363
+    /**
364
+     * Find Sabre nodes by file ids
365
+     *
366
+     * @param Node $rootNode root node for search
367
+     * @param array $fileIds file ids
368
+     * @return Node[] array of Sabre nodes
369
+     */
370
+    public function findNodesByFileIds($rootNode, $fileIds) {
371
+        $folder = $this->userFolder;
372
+        if (trim($rootNode->getPath(), '/') !== '') {
373
+            $folder = $folder->get($rootNode->getPath());
374
+        }
375
+
376
+        $results = [];
377
+        foreach ($fileIds as $fileId) {
378
+            $entry = $folder->getById($fileId);
379
+            if ($entry) {
380
+                $entry = current($entry);
381
+                if ($entry instanceof \OCP\Files\File) {
382
+                    $results[] = new File($this->fileView, $entry);
383
+                } else if ($entry instanceof \OCP\Files\Folder) {
384
+                    $results[] = new Directory($this->fileView, $entry);
385
+                }
386
+            }
387
+        }
388
+
389
+        return $results;
390
+    }
391
+
392
+    /**
393
+     * Returns whether the currently logged in user is an administrator
394
+     */
395
+    private function isAdmin() {
396
+        $user = $this->userSession->getUser();
397
+        if ($user !== null) {
398
+            return $this->groupManager->isAdmin($user->getUID());
399
+        }
400
+        return false;
401
+    }
402 402
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/CopyEtagHeaderPlugin.php 1 patch
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -33,50 +33,50 @@
 block discarded – undo
33 33
  */
34 34
 class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin {
35 35
 
36
-	/** @var \Sabre\DAV\Server */
37
-	private $server;
38
-	/**
39
-	 * This initializes the plugin.
40
-	 *
41
-	 * @param \Sabre\DAV\Server $server Sabre server
42
-	 *
43
-	 * @return void
44
-	 */
45
-	public function initialize(\Sabre\DAV\Server $server) {
46
-		$this->server = $server;
36
+    /** @var \Sabre\DAV\Server */
37
+    private $server;
38
+    /**
39
+     * This initializes the plugin.
40
+     *
41
+     * @param \Sabre\DAV\Server $server Sabre server
42
+     *
43
+     * @return void
44
+     */
45
+    public function initialize(\Sabre\DAV\Server $server) {
46
+        $this->server = $server;
47 47
 
48
-		$server->on('afterMethod', [$this, 'afterMethod']);
49
-		$server->on('afterMove', [$this, 'afterMove']);
50
-	}
48
+        $server->on('afterMethod', [$this, 'afterMethod']);
49
+        $server->on('afterMove', [$this, 'afterMove']);
50
+    }
51 51
 
52
-	/**
53
-	 * After method, copy the "Etag" header to "OC-Etag" header.
54
-	 *
55
-	 * @param RequestInterface $request request
56
-	 * @param ResponseInterface $response response
57
-	 */
58
-	public function afterMethod(RequestInterface $request, ResponseInterface $response) {
59
-		$eTag = $response->getHeader('Etag');
60
-		if (!empty($eTag)) {
61
-			$response->setHeader('OC-ETag', $eTag);
62
-		}
63
-	}
52
+    /**
53
+     * After method, copy the "Etag" header to "OC-Etag" header.
54
+     *
55
+     * @param RequestInterface $request request
56
+     * @param ResponseInterface $response response
57
+     */
58
+    public function afterMethod(RequestInterface $request, ResponseInterface $response) {
59
+        $eTag = $response->getHeader('Etag');
60
+        if (!empty($eTag)) {
61
+            $response->setHeader('OC-ETag', $eTag);
62
+        }
63
+    }
64 64
 
65
-	/**
66
-	 * Called after a node is moved.
67
-	 *
68
-	 * This allows the backend to move all the associated properties.
69
-	 *
70
-	 * @param string $source
71
-	 * @param string $destination
72
-	 * @return void
73
-	 */
74
-	function afterMove($source, $destination) {
75
-		$node = $this->server->tree->getNodeForPath($destination);
76
-		if ($node instanceof File) {
77
-			$eTag = $node->getETag();
78
-			$this->server->httpResponse->setHeader('OC-ETag', $eTag);
79
-			$this->server->httpResponse->setHeader('ETag', $eTag);
80
-		}
81
-	}
65
+    /**
66
+     * Called after a node is moved.
67
+     *
68
+     * This allows the backend to move all the associated properties.
69
+     *
70
+     * @param string $source
71
+     * @param string $destination
72
+     * @return void
73
+     */
74
+    function afterMove($source, $destination) {
75
+        $node = $this->server->tree->getNodeForPath($destination);
76
+        if ($node instanceof File) {
77
+            $eTag = $node->getETag();
78
+            $this->server->httpResponse->setHeader('OC-ETag', $eTag);
79
+            $this->server->httpResponse->setHeader('ETag', $eTag);
80
+        }
81
+    }
82 82
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/ChecksumList.php 1 patch
Indentation   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -32,41 +32,41 @@
 block discarded – undo
32 32
  * checksum name.
33 33
  */
34 34
 class ChecksumList implements XmlSerializable {
35
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
35
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
36 36
 
37
-	/** @var string[] of TYPE:CHECKSUM */
38
-	private $checksums;
37
+    /** @var string[] of TYPE:CHECKSUM */
38
+    private $checksums;
39 39
 
40
-	/**
41
-	 * @param string $checksum
42
-	 */
43
-	public function __construct($checksum) {
44
-		$this->checksums = explode(',', $checksum);
45
-	}
40
+    /**
41
+     * @param string $checksum
42
+     */
43
+    public function __construct($checksum) {
44
+        $this->checksums = explode(',', $checksum);
45
+    }
46 46
 
47
-	/**
48
-	 * The xmlSerialize metod is called during xml writing.
49
-	 *
50
-	 * Use the $writer argument to write its own xml serialization.
51
-	 *
52
-	 * An important note: do _not_ create a parent element. Any element
53
-	 * implementing XmlSerializble should only ever write what's considered
54
-	 * its 'inner xml'.
55
-	 *
56
-	 * The parent of the current element is responsible for writing a
57
-	 * containing element.
58
-	 *
59
-	 * This allows serializers to be re-used for different element names.
60
-	 *
61
-	 * If you are opening new elements, you must also close them again.
62
-	 *
63
-	 * @param Writer $writer
64
-	 * @return void
65
-	 */
66
-	function xmlSerialize(Writer $writer) {
47
+    /**
48
+     * The xmlSerialize metod is called during xml writing.
49
+     *
50
+     * Use the $writer argument to write its own xml serialization.
51
+     *
52
+     * An important note: do _not_ create a parent element. Any element
53
+     * implementing XmlSerializble should only ever write what's considered
54
+     * its 'inner xml'.
55
+     *
56
+     * The parent of the current element is responsible for writing a
57
+     * containing element.
58
+     *
59
+     * This allows serializers to be re-used for different element names.
60
+     *
61
+     * If you are opening new elements, you must also close them again.
62
+     *
63
+     * @param Writer $writer
64
+     * @return void
65
+     */
66
+    function xmlSerialize(Writer $writer) {
67 67
 
68
-		foreach ($this->checksums as $checksum) {
69
-			$writer->writeElement('{' . self::NS_OWNCLOUD . '}checksum', $checksum);
70
-		}
71
-	}
68
+        foreach ($this->checksums as $checksum) {
69
+            $writer->writeElement('{' . self::NS_OWNCLOUD . '}checksum', $checksum);
70
+        }
71
+    }
72 72
 }
Please login to merge, or discard this patch.