summaryrefslogtreecommitdiffstats
path: root/apps/dav
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-12-23 12:12:38 +0100
committerRoeland Jago Douma <roeland@famdouma.nl>2017-03-29 00:04:29 +0200
commit23aab05bdaaaff8310cad64ff028bc7a53656f5a (patch)
tree740ea5687fab84d77fe622ef236fcac2c9054483 /apps/dav
parent4821c00ea81797fcb5a99c31105ad42be598f113 (diff)
downloadnextcloud-server-23aab05bdaaaff8310cad64ff028bc7a53656f5a.tar.gz
nextcloud-server-23aab05bdaaaff8310cad64ff028bc7a53656f5a.zip
Adding dav resource for avatars
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Diffstat (limited to 'apps/dav')
-rw-r--r--apps/dav/lib/Avatars/AvatarHome.php107
-rw-r--r--apps/dav/lib/Avatars/AvatarNode.php93
-rw-r--r--apps/dav/lib/Avatars/RootCollection.php28
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php2
-rw-r--r--apps/dav/lib/RootCollection.php4
5 files changed, 233 insertions, 1 deletions
diff --git a/apps/dav/lib/Avatars/AvatarHome.php b/apps/dav/lib/Avatars/AvatarHome.php
new file mode 100644
index 00000000000..d3fb2b95f34
--- /dev/null
+++ b/apps/dav/lib/Avatars/AvatarHome.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud GmbH
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\DAV\Avatars;
+
+
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\MethodNotAllowed;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\ICollection;
+use Sabre\HTTP\URLUtil;
+
+class AvatarHome implements ICollection {
+ private $principalInfo;
+
+ /**
+ * AvatarHome constructor.
+ *
+ * @param array $principalInfo
+ */
+ public function __construct($principalInfo) {
+ $this->principalInfo = $principalInfo;
+ }
+
+ function createFile($name, $data = null) {
+ throw new Forbidden('Permission denied to create a file');
+ }
+
+ function createDirectory($name) {
+ throw new Forbidden('Permission denied to create a folder');
+ }
+
+ function getChild($name) {
+ $elements = pathinfo($name);
+ $ext = isset($elements['extension']) ? $elements['extension'] : '';
+ $size = intval(isset($elements['filename']) ? $elements['filename'] : '64');
+ if (!in_array($ext, ['jpeg', 'png'])) {
+ throw new MethodNotAllowed('File format not allowed');
+ }
+ if ($size <= 0 || $size > 1024) {
+ throw new MethodNotAllowed('Invalid image size');
+ }
+ $avatar = \OC::$server->getAvatarManager()->getAvatar($this->getName());
+ if (!$avatar->exists()) {
+ throw new NotFound();
+ }
+ return new AvatarNode($size, $ext, $avatar);
+ }
+
+ function getChildren() {
+ try {
+ return [
+ $this->getChild('96.jpeg')
+ ];
+ } catch(NotFound $exception) {
+ return [];
+ }
+ }
+
+ function childExists($name) {
+ $ret = $this->getChild($name);
+ return !is_null($ret);
+ }
+
+ function delete() {
+ throw new Forbidden('Permission denied to delete this folder');
+ }
+
+ function getName() {
+ list(,$name) = URLUtil::splitPath($this->principalInfo['uri']);
+ return $name;
+ }
+
+ function setName($name) {
+ throw new Forbidden('Permission denied to rename this folder');
+ }
+
+ /**
+ * Returns the last modification time, as a unix timestamp
+ *
+ * @return int
+ */
+ function getLastModified() {
+ return null;
+ }
+
+
+}
diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php
new file mode 100644
index 00000000000..0f2bfe1da43
--- /dev/null
+++ b/apps/dav/lib/Avatars/AvatarNode.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud GmbH
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\DAV\Avatars;
+
+
+use OCA\DAV\IPublicNode;
+use OCP\IAvatar;
+use Sabre\DAV\File;
+
+class AvatarNode extends File {
+ private $ext;
+ private $size;
+ private $avatar;
+
+ /**
+ * AvatarNode constructor.
+ *
+ * @param integer $size
+ * @param string $ext
+ * @param IAvatar $avatar
+ */
+ public function __construct($size, $ext, $avatar) {
+ $this->size = $size;
+ $this->ext = $ext;
+ $this->avatar = $avatar;
+ }
+
+ /**
+ * Returns the name of the node.
+ *
+ * This is used to generate the url.
+ *
+ * @return string
+ */
+ function getName() {
+ return "$this->size.$this->ext";
+ }
+
+ function get() {
+ $image = $this->avatar->get($this->size);
+ $res = $image->resource();
+
+ ob_start();
+ if ($this->ext === 'png') {
+ imagepng($res);
+ }
+ imagejpeg($res);
+
+ return ob_get_clean();
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ function getContentType() {
+ if ($this->ext === 'png') {
+ return 'image/png';
+ }
+ return 'image/jpeg';
+ }
+
+// function getSize() {
+// return $this->avatar->getFile($this->size)->getSize();
+// }
+
+ function getETag() {
+ return $this->avatar->getFile($this->size)->getEtag();
+ }
+}
diff --git a/apps/dav/lib/Avatars/RootCollection.php b/apps/dav/lib/Avatars/RootCollection.php
new file mode 100644
index 00000000000..8cad3d3721a
--- /dev/null
+++ b/apps/dav/lib/Avatars/RootCollection.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace OCA\DAV\Avatars;
+
+use Sabre\DAVACL\AbstractPrincipalCollection;
+use Sabre\DAVACL\IPrincipal;
+
+class RootCollection extends AbstractPrincipalCollection {
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principalInfo
+ * @return IPrincipal
+ */
+ function getChildForPrincipal(array $principalInfo) {
+ return new AvatarHome($principalInfo);
+ }
+
+ function getName() {
+ return 'avatars';
+ }
+
+}
diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php
index 9da416312d0..8713f61767b 100644
--- a/apps/dav/lib/Connector/Sabre/Principal.php
+++ b/apps/dav/lib/Connector/Sabre/Principal.php
@@ -223,8 +223,8 @@ class Principal implements BackendInterface {
$email = $user->getEMailAddress();
if (!empty($email)) {
$principal['{http://sabredav.org/ns}email-address'] = $email;
- return $principal;
}
+
return $principal;
}
diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php
index 478f0929c20..a243ec6d00a 100644
--- a/apps/dav/lib/RootCollection.php
+++ b/apps/dav/lib/RootCollection.php
@@ -99,6 +99,9 @@ class RootCollection extends SimpleCollection {
$uploadCollection = new Upload\RootCollection($userPrincipalBackend, 'principals/users');
$uploadCollection->disableListing = $disableListing;
+ $avatarCollection = new Avatars\RootCollection($userPrincipalBackend, 'principals/users');
+ $avatarCollection->disableListing = $disableListing;
+
$children = [
new SimpleCollection('principals', [
$userPrincipals,
@@ -114,6 +117,7 @@ class RootCollection extends SimpleCollection {
$systemTagRelationsCollection,
$commentsCollection,
$uploadCollection,
+ $avatarCollection
];
parent::__construct('root', $children);