Completed
Pull Request — master (#4212)
by Individual IT
13:52
created
apps/dav/lib/CardDAV/AddressBookImpl.php 1 patch
Indentation   +251 added lines, -251 removed lines patch added patch discarded remove patch
@@ -34,255 +34,255 @@
 block discarded – undo
34 34
 
35 35
 class AddressBookImpl implements IAddressBook {
36 36
 
37
-	/** @var CardDavBackend */
38
-	private $backend;
39
-
40
-	/** @var array */
41
-	private $addressBookInfo;
42
-
43
-	/** @var AddressBook */
44
-	private $addressBook;
45
-
46
-	/** @var IURLGenerator */
47
-	private $urlGenerator;
48
-
49
-	/**
50
-	 * AddressBookImpl constructor.
51
-	 *
52
-	 * @param AddressBook $addressBook
53
-	 * @param array $addressBookInfo
54
-	 * @param CardDavBackend $backend
55
-	 * @param IUrlGenerator $urlGenerator
56
-	 */
57
-	public function __construct(
58
-			AddressBook $addressBook,
59
-			array $addressBookInfo,
60
-			CardDavBackend $backend,
61
-			IURLGenerator $urlGenerator) {
62
-
63
-		$this->addressBook = $addressBook;
64
-		$this->addressBookInfo = $addressBookInfo;
65
-		$this->backend = $backend;
66
-		$this->urlGenerator = $urlGenerator;
67
-	}
68
-
69
-	/**
70
-	 * @return string defining the technical unique key
71
-	 * @since 5.0.0
72
-	 */
73
-	public function getKey() {
74
-		return $this->addressBookInfo['id'];
75
-	}
76
-
77
-	/**
78
-	 * In comparison to getKey() this function returns a human readable (maybe translated) name
79
-	 *
80
-	 * @return mixed
81
-	 * @since 5.0.0
82
-	 */
83
-	public function getDisplayName() {
84
-		return $this->addressBookInfo['{DAV:}displayname'];
85
-	}
86
-
87
-	/**
88
-	 * @param string $pattern which should match within the $searchProperties
89
-	 * @param array $searchProperties defines the properties within the query pattern should match
90
-	 * @param array $options - for future use. One should always have options!
91
-	 * @return array an array of contacts which are arrays of key-value-pairs
92
-	 * @since 5.0.0
93
-	 */
94
-	public function search($pattern, $searchProperties, $options) {
95
-		$results = $this->backend->search($this->getKey(), $pattern, $searchProperties);
96
-
97
-		$vCards = [];
98
-		foreach ($results as $result) {
99
-			$vCards[] = $this->vCard2Array($result['uri'], $this->readCard($result['carddata']));
100
-		}
101
-
102
-		return $vCards;
103
-	}
104
-
105
-	/**
106
-	 * @param array $properties this array if key-value-pairs defines a contact
107
-	 * @return array an array representing the contact just created or updated
108
-	 * @since 5.0.0
109
-	 */
110
-	public function createOrUpdate($properties) {
111
-		$update = false;
112
-		if (!isset($properties['URI'])) { // create a new contact
113
-			$uid = $this->createUid();
114
-			$uri = $uid . '.vcf';
115
-			$vCard = $this->createEmptyVCard($uid);
116
-		} else { // update existing contact
117
-			$uri = $properties['URI'];
118
-			$vCardData = $this->backend->getCard($this->getKey(), $uri);
119
-			$vCard = $this->readCard($vCardData['carddata']);
120
-			$update = true;
121
-		}
122
-
123
-		foreach ($properties as $key => $value) {
124
-			$vCard->$key = $vCard->createProperty($key, $value);
125
-		}
126
-
127
-		if ($update) {
128
-			$this->backend->updateCard($this->getKey(), $uri, $vCard->serialize());
129
-		} else {
130
-			$this->backend->createCard($this->getKey(), $uri, $vCard->serialize());
131
-		}
132
-
133
-		return $this->vCard2Array($uri, $vCard);
134
-
135
-	}
136
-
137
-	/**
138
-	 * @return mixed
139
-	 * @since 5.0.0
140
-	 */
141
-	public function getPermissions() {
142
-		$permissions = $this->addressBook->getACL();
143
-		$result = 0;
144
-		foreach ($permissions as $permission) {
145
-			switch($permission['privilege']) {
146
-				case '{DAV:}read':
147
-					$result |= Constants::PERMISSION_READ;
148
-					break;
149
-				case '{DAV:}write':
150
-					$result |= Constants::PERMISSION_CREATE;
151
-					$result |= Constants::PERMISSION_UPDATE;
152
-					break;
153
-				case '{DAV:}all':
154
-					$result |= Constants::PERMISSION_ALL;
155
-					break;
156
-			}
157
-		}
158
-
159
-		return $result;
160
-	}
161
-
162
-	/**
163
-	 * @param object $id the unique identifier to a contact
164
-	 * @return bool successful or not
165
-	 * @since 5.0.0
166
-	 */
167
-	public function delete($id) {
168
-		$uri = $this->backend->getCardUri($id);
169
-		return $this->backend->deleteCard($this->addressBookInfo['id'], $uri);
170
-	}
171
-
172
-	/**
173
-	 * read vCard data into a vCard object
174
-	 *
175
-	 * @param string $cardData
176
-	 * @return VCard
177
-	 */
178
-	protected function readCard($cardData) {
179
-		return  Reader::read($cardData);
180
-	}
181
-
182
-	/**
183
-	 * create UID for contact
184
-	 *
185
-	 * @return string
186
-	 */
187
-	protected function createUid() {
188
-		do {
189
-			$uid = $this->getUid();
190
-			$contact = $this->backend->getContact($this->getKey(), $uid . '.vcf');
191
-		} while (!empty($contact));
192
-
193
-		return $uid;
194
-	}
195
-
196
-	/**
197
-	 * getUid is only there for testing, use createUid instead
198
-	 */
199
-	protected function getUid() {
200
-		return UUIDUtil::getUUID();
201
-	}
202
-
203
-	/**
204
-	 * create empty vcard
205
-	 *
206
-	 * @param string $uid
207
-	 * @return VCard
208
-	 */
209
-	protected function createEmptyVCard($uid) {
210
-		$vCard = new VCard();
211
-		$vCard->UID = $uid;
212
-		return $vCard;
213
-	}
214
-
215
-	/**
216
-	 * create array with all vCard properties
217
-	 *
218
-	 * @param string $uri
219
-	 * @param VCard $vCard
220
-	 * @return array
221
-	 */
222
-	protected function vCard2Array($uri, VCard $vCard) {
223
-		$result = [
224
-			'URI' => $uri,
225
-		];
226
-
227
-		foreach ($vCard->children() as $property) {
228
-			if ($property->name === 'PHOTO' && $property->getValueType() === 'BINARY') {
229
-				$url = $this->urlGenerator->getAbsoluteURL(
230
-					$this->urlGenerator->linkTo('', 'remote.php') . '/dav/');
231
-				$url .= implode('/', [
232
-					'addressbooks',
233
-					substr($this->addressBookInfo['principaluri'], 11), //cut off 'principals/'
234
-					$this->addressBookInfo['uri'],
235
-					$uri
236
-				]) . '?photo';
237
-
238
-				$result['PHOTO'] = 'VALUE=uri:' . $url;
239
-
240
-			} else if ($property->name === 'X-SOCIALPROFILE') {
241
-				$type = $this->getTypeFromProperty($property);
242
-
243
-				// Type is the social network, when it's empty we don't need this.
244
-				if ($type !== null) {
245
-					if (!isset($result[$property->name])) {
246
-						$result[$property->name] = [];
247
-					}
248
-					$result[$property->name][$type] = $property->getValue();
249
-				}
250
-
251
-			// The following properties can be set multiple times
252
-			} else if (in_array($property->name, ['CLOUD', 'EMAIL', 'IMPP', 'TEL', 'URL'])) {
253
-				if (!isset($result[$property->name])) {
254
-					$result[$property->name] = [];
255
-				}
256
-
257
-				$result[$property->name][] = $property->getValue();
258
-
259
-			} else {
260
-				$result[$property->name] = $property->getValue();
261
-			}
262
-		}
263
-
264
-		if ($this->addressBookInfo['principaluri'] === 'principals/system/system' &&
265
-			$this->addressBookInfo['uri'] === 'system') {
266
-			$result['isLocalSystemBook'] = true;
267
-		}
268
-		return $result;
269
-	}
270
-
271
-	/**
272
-	 * Get the type of the current property
273
-	 *
274
-	 * @param Property $property
275
-	 * @return null|string
276
-	 */
277
-	protected function getTypeFromProperty(Property $property) {
278
-		$parameters = $property->parameters();
279
-		// Type is the social network, when it's empty we don't need this.
280
-		if (isset($parameters['TYPE'])) {
281
-			/** @var \Sabre\VObject\Parameter $type */
282
-			$type = $parameters['TYPE'];
283
-			return $type->getValue();
284
-		}
285
-
286
-		return null;
287
-	}
37
+    /** @var CardDavBackend */
38
+    private $backend;
39
+
40
+    /** @var array */
41
+    private $addressBookInfo;
42
+
43
+    /** @var AddressBook */
44
+    private $addressBook;
45
+
46
+    /** @var IURLGenerator */
47
+    private $urlGenerator;
48
+
49
+    /**
50
+     * AddressBookImpl constructor.
51
+     *
52
+     * @param AddressBook $addressBook
53
+     * @param array $addressBookInfo
54
+     * @param CardDavBackend $backend
55
+     * @param IUrlGenerator $urlGenerator
56
+     */
57
+    public function __construct(
58
+            AddressBook $addressBook,
59
+            array $addressBookInfo,
60
+            CardDavBackend $backend,
61
+            IURLGenerator $urlGenerator) {
62
+
63
+        $this->addressBook = $addressBook;
64
+        $this->addressBookInfo = $addressBookInfo;
65
+        $this->backend = $backend;
66
+        $this->urlGenerator = $urlGenerator;
67
+    }
68
+
69
+    /**
70
+     * @return string defining the technical unique key
71
+     * @since 5.0.0
72
+     */
73
+    public function getKey() {
74
+        return $this->addressBookInfo['id'];
75
+    }
76
+
77
+    /**
78
+     * In comparison to getKey() this function returns a human readable (maybe translated) name
79
+     *
80
+     * @return mixed
81
+     * @since 5.0.0
82
+     */
83
+    public function getDisplayName() {
84
+        return $this->addressBookInfo['{DAV:}displayname'];
85
+    }
86
+
87
+    /**
88
+     * @param string $pattern which should match within the $searchProperties
89
+     * @param array $searchProperties defines the properties within the query pattern should match
90
+     * @param array $options - for future use. One should always have options!
91
+     * @return array an array of contacts which are arrays of key-value-pairs
92
+     * @since 5.0.0
93
+     */
94
+    public function search($pattern, $searchProperties, $options) {
95
+        $results = $this->backend->search($this->getKey(), $pattern, $searchProperties);
96
+
97
+        $vCards = [];
98
+        foreach ($results as $result) {
99
+            $vCards[] = $this->vCard2Array($result['uri'], $this->readCard($result['carddata']));
100
+        }
101
+
102
+        return $vCards;
103
+    }
104
+
105
+    /**
106
+     * @param array $properties this array if key-value-pairs defines a contact
107
+     * @return array an array representing the contact just created or updated
108
+     * @since 5.0.0
109
+     */
110
+    public function createOrUpdate($properties) {
111
+        $update = false;
112
+        if (!isset($properties['URI'])) { // create a new contact
113
+            $uid = $this->createUid();
114
+            $uri = $uid . '.vcf';
115
+            $vCard = $this->createEmptyVCard($uid);
116
+        } else { // update existing contact
117
+            $uri = $properties['URI'];
118
+            $vCardData = $this->backend->getCard($this->getKey(), $uri);
119
+            $vCard = $this->readCard($vCardData['carddata']);
120
+            $update = true;
121
+        }
122
+
123
+        foreach ($properties as $key => $value) {
124
+            $vCard->$key = $vCard->createProperty($key, $value);
125
+        }
126
+
127
+        if ($update) {
128
+            $this->backend->updateCard($this->getKey(), $uri, $vCard->serialize());
129
+        } else {
130
+            $this->backend->createCard($this->getKey(), $uri, $vCard->serialize());
131
+        }
132
+
133
+        return $this->vCard2Array($uri, $vCard);
134
+
135
+    }
136
+
137
+    /**
138
+     * @return mixed
139
+     * @since 5.0.0
140
+     */
141
+    public function getPermissions() {
142
+        $permissions = $this->addressBook->getACL();
143
+        $result = 0;
144
+        foreach ($permissions as $permission) {
145
+            switch($permission['privilege']) {
146
+                case '{DAV:}read':
147
+                    $result |= Constants::PERMISSION_READ;
148
+                    break;
149
+                case '{DAV:}write':
150
+                    $result |= Constants::PERMISSION_CREATE;
151
+                    $result |= Constants::PERMISSION_UPDATE;
152
+                    break;
153
+                case '{DAV:}all':
154
+                    $result |= Constants::PERMISSION_ALL;
155
+                    break;
156
+            }
157
+        }
158
+
159
+        return $result;
160
+    }
161
+
162
+    /**
163
+     * @param object $id the unique identifier to a contact
164
+     * @return bool successful or not
165
+     * @since 5.0.0
166
+     */
167
+    public function delete($id) {
168
+        $uri = $this->backend->getCardUri($id);
169
+        return $this->backend->deleteCard($this->addressBookInfo['id'], $uri);
170
+    }
171
+
172
+    /**
173
+     * read vCard data into a vCard object
174
+     *
175
+     * @param string $cardData
176
+     * @return VCard
177
+     */
178
+    protected function readCard($cardData) {
179
+        return  Reader::read($cardData);
180
+    }
181
+
182
+    /**
183
+     * create UID for contact
184
+     *
185
+     * @return string
186
+     */
187
+    protected function createUid() {
188
+        do {
189
+            $uid = $this->getUid();
190
+            $contact = $this->backend->getContact($this->getKey(), $uid . '.vcf');
191
+        } while (!empty($contact));
192
+
193
+        return $uid;
194
+    }
195
+
196
+    /**
197
+     * getUid is only there for testing, use createUid instead
198
+     */
199
+    protected function getUid() {
200
+        return UUIDUtil::getUUID();
201
+    }
202
+
203
+    /**
204
+     * create empty vcard
205
+     *
206
+     * @param string $uid
207
+     * @return VCard
208
+     */
209
+    protected function createEmptyVCard($uid) {
210
+        $vCard = new VCard();
211
+        $vCard->UID = $uid;
212
+        return $vCard;
213
+    }
214
+
215
+    /**
216
+     * create array with all vCard properties
217
+     *
218
+     * @param string $uri
219
+     * @param VCard $vCard
220
+     * @return array
221
+     */
222
+    protected function vCard2Array($uri, VCard $vCard) {
223
+        $result = [
224
+            'URI' => $uri,
225
+        ];
226
+
227
+        foreach ($vCard->children() as $property) {
228
+            if ($property->name === 'PHOTO' && $property->getValueType() === 'BINARY') {
229
+                $url = $this->urlGenerator->getAbsoluteURL(
230
+                    $this->urlGenerator->linkTo('', 'remote.php') . '/dav/');
231
+                $url .= implode('/', [
232
+                    'addressbooks',
233
+                    substr($this->addressBookInfo['principaluri'], 11), //cut off 'principals/'
234
+                    $this->addressBookInfo['uri'],
235
+                    $uri
236
+                ]) . '?photo';
237
+
238
+                $result['PHOTO'] = 'VALUE=uri:' . $url;
239
+
240
+            } else if ($property->name === 'X-SOCIALPROFILE') {
241
+                $type = $this->getTypeFromProperty($property);
242
+
243
+                // Type is the social network, when it's empty we don't need this.
244
+                if ($type !== null) {
245
+                    if (!isset($result[$property->name])) {
246
+                        $result[$property->name] = [];
247
+                    }
248
+                    $result[$property->name][$type] = $property->getValue();
249
+                }
250
+
251
+            // The following properties can be set multiple times
252
+            } else if (in_array($property->name, ['CLOUD', 'EMAIL', 'IMPP', 'TEL', 'URL'])) {
253
+                if (!isset($result[$property->name])) {
254
+                    $result[$property->name] = [];
255
+                }
256
+
257
+                $result[$property->name][] = $property->getValue();
258
+
259
+            } else {
260
+                $result[$property->name] = $property->getValue();
261
+            }
262
+        }
263
+
264
+        if ($this->addressBookInfo['principaluri'] === 'principals/system/system' &&
265
+            $this->addressBookInfo['uri'] === 'system') {
266
+            $result['isLocalSystemBook'] = true;
267
+        }
268
+        return $result;
269
+    }
270
+
271
+    /**
272
+     * Get the type of the current property
273
+     *
274
+     * @param Property $property
275
+     * @return null|string
276
+     */
277
+    protected function getTypeFromProperty(Property $property) {
278
+        $parameters = $property->parameters();
279
+        // Type is the social network, when it's empty we don't need this.
280
+        if (isset($parameters['TYPE'])) {
281
+            /** @var \Sabre\VObject\Parameter $type */
282
+            $type = $parameters['TYPE'];
283
+            return $type->getValue();
284
+        }
285
+
286
+        return null;
287
+    }
288 288
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/Xml/Groups.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -26,21 +26,21 @@
 block discarded – undo
26 26
 use Sabre\Xml\Writer;
27 27
 
28 28
 class Groups implements XmlSerializable {
29
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
29
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
30 30
 
31
-	/** @var string[] of TYPE:CHECKSUM */
32
-	private $groups;
31
+    /** @var string[] of TYPE:CHECKSUM */
32
+    private $groups;
33 33
 
34
-	/**
35
-	 * @param string $groups
36
-	 */
37
-	public function __construct($groups) {
38
-		$this->groups = $groups;
39
-	}
34
+    /**
35
+     * @param string $groups
36
+     */
37
+    public function __construct($groups) {
38
+        $this->groups = $groups;
39
+    }
40 40
 
41
-	function xmlSerialize(Writer $writer) {
42
-		foreach ($this->groups as $group) {
43
-			$writer->writeElement('{' . self::NS_OWNCLOUD . '}group', $group);
44
-		}
45
-	}
41
+    function xmlSerialize(Writer $writer) {
42
+        foreach ($this->groups as $group) {
43
+            $writer->writeElement('{' . self::NS_OWNCLOUD . '}group', $group);
44
+        }
45
+    }
46 46
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/AddressBookRoot.php 1 patch
Indentation   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -25,46 +25,46 @@
 block discarded – undo
25 25
 
26 26
 class AddressBookRoot extends \Sabre\CardDAV\AddressBookRoot {
27 27
 
28
-	/** @var IL10N */
29
-	protected $l10n;
28
+    /** @var IL10N */
29
+    protected $l10n;
30 30
 
31
-	/**
32
-	 * @param \Sabre\DAVACL\PrincipalBackend\BackendInterface $principalBackend
33
-	 * @param \Sabre\CardDAV\Backend\BackendInterface $carddavBackend
34
-	 * @param string $principalPrefix
35
-	 */
36
-	public function __construct(\Sabre\DAVACL\PrincipalBackend\BackendInterface $principalBackend, \Sabre\CardDAV\Backend\BackendInterface $carddavBackend, $principalPrefix = 'principals') {
37
-		parent::__construct($principalBackend, $carddavBackend, $principalPrefix);
38
-		$this->l10n = \OC::$server->getL10N('dav');
39
-	}
31
+    /**
32
+     * @param \Sabre\DAVACL\PrincipalBackend\BackendInterface $principalBackend
33
+     * @param \Sabre\CardDAV\Backend\BackendInterface $carddavBackend
34
+     * @param string $principalPrefix
35
+     */
36
+    public function __construct(\Sabre\DAVACL\PrincipalBackend\BackendInterface $principalBackend, \Sabre\CardDAV\Backend\BackendInterface $carddavBackend, $principalPrefix = 'principals') {
37
+        parent::__construct($principalBackend, $carddavBackend, $principalPrefix);
38
+        $this->l10n = \OC::$server->getL10N('dav');
39
+    }
40 40
 
41
-	/**
42
-	 * This method returns a node for a principal.
43
-	 *
44
-	 * The passed array contains principal information, and is guaranteed to
45
-	 * at least contain a uri item. Other properties may or may not be
46
-	 * supplied by the authentication backend.
47
-	 *
48
-	 * @param array $principal
49
-	 * @return \Sabre\DAV\INode
50
-	 */
51
-	function getChildForPrincipal(array $principal) {
41
+    /**
42
+     * This method returns a node for a principal.
43
+     *
44
+     * The passed array contains principal information, and is guaranteed to
45
+     * at least contain a uri item. Other properties may or may not be
46
+     * supplied by the authentication backend.
47
+     *
48
+     * @param array $principal
49
+     * @return \Sabre\DAV\INode
50
+     */
51
+    function getChildForPrincipal(array $principal) {
52 52
 
53
-		return new UserAddressBooks($this->carddavBackend, $principal['uri'], $this->l10n);
53
+        return new UserAddressBooks($this->carddavBackend, $principal['uri'], $this->l10n);
54 54
 
55
-	}
55
+    }
56 56
 
57
-	function getName() {
57
+    function getName() {
58 58
 
59
-		if ($this->principalPrefix === 'principals') {
60
-			return parent::getName();
61
-		}
62
-		// Grabbing all the components of the principal path.
63
-		$parts = explode('/', $this->principalPrefix);
59
+        if ($this->principalPrefix === 'principals') {
60
+            return parent::getName();
61
+        }
62
+        // Grabbing all the components of the principal path.
63
+        $parts = explode('/', $this->principalPrefix);
64 64
 
65
-		// We are only interested in the second part.
66
-		return $parts[1];
65
+        // We are only interested in the second part.
66
+        return $parts[1];
67 67
 
68
-	}
68
+    }
69 69
 
70 70
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/ContactsManager.php 1 patch
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -29,52 +29,52 @@
 block discarded – undo
29 29
 use OCP\IURLGenerator;
30 30
 
31 31
 class ContactsManager {
32
-	/** @var CardDavBackend  */
33
-	private $backend;
32
+    /** @var CardDavBackend  */
33
+    private $backend;
34 34
 
35
-	/** @var IL10N  */
36
-	private $l10n;
35
+    /** @var IL10N  */
36
+    private $l10n;
37 37
 
38
-	/**
39
-	 * ContactsManager constructor.
40
-	 *
41
-	 * @param CardDavBackend $backend
42
-	 * @param IL10N $l10n
43
-	 */
44
-	public function __construct(CardDavBackend $backend, IL10N $l10n) {
45
-		$this->backend = $backend;
46
-		$this->l10n = $l10n;
47
-	}
38
+    /**
39
+     * ContactsManager constructor.
40
+     *
41
+     * @param CardDavBackend $backend
42
+     * @param IL10N $l10n
43
+     */
44
+    public function __construct(CardDavBackend $backend, IL10N $l10n) {
45
+        $this->backend = $backend;
46
+        $this->l10n = $l10n;
47
+    }
48 48
 
49
-	/**
50
-	 * @param IManager $cm
51
-	 * @param string $userId
52
-	 * @param IURLGenerator $urlGenerator
53
-	 */
54
-	public function setupContactsProvider(IManager $cm, $userId, IURLGenerator $urlGenerator) {
55
-		$addressBooks = $this->backend->getAddressBooksForUser("principals/users/$userId");
56
-		$this->register($cm, $addressBooks, $urlGenerator);
57
-		$addressBooks = $this->backend->getAddressBooksForUser("principals/system/system");
58
-		$this->register($cm, $addressBooks, $urlGenerator);
59
-	}
49
+    /**
50
+     * @param IManager $cm
51
+     * @param string $userId
52
+     * @param IURLGenerator $urlGenerator
53
+     */
54
+    public function setupContactsProvider(IManager $cm, $userId, IURLGenerator $urlGenerator) {
55
+        $addressBooks = $this->backend->getAddressBooksForUser("principals/users/$userId");
56
+        $this->register($cm, $addressBooks, $urlGenerator);
57
+        $addressBooks = $this->backend->getAddressBooksForUser("principals/system/system");
58
+        $this->register($cm, $addressBooks, $urlGenerator);
59
+    }
60 60
 
61
-	/**
62
-	 * @param IManager $cm
63
-	 * @param $addressBooks
64
-	 * @param IURLGenerator $urlGenerator
65
-	 */
66
-	private function register(IManager $cm, $addressBooks, $urlGenerator) {
67
-		foreach ($addressBooks as $addressBookInfo) {
68
-			$addressBook = new \OCA\DAV\CardDAV\AddressBook($this->backend, $addressBookInfo, $this->l10n);
69
-			$cm->registerAddressBook(
70
-				new AddressBookImpl(
71
-					$addressBook,
72
-					$addressBookInfo,
73
-					$this->backend,
74
-					$urlGenerator
75
-				)
76
-			);
77
-		}
78
-	}
61
+    /**
62
+     * @param IManager $cm
63
+     * @param $addressBooks
64
+     * @param IURLGenerator $urlGenerator
65
+     */
66
+    private function register(IManager $cm, $addressBooks, $urlGenerator) {
67
+        foreach ($addressBooks as $addressBookInfo) {
68
+            $addressBook = new \OCA\DAV\CardDAV\AddressBook($this->backend, $addressBookInfo, $this->l10n);
69
+            $cm->registerAddressBook(
70
+                new AddressBookImpl(
71
+                    $addressBook,
72
+                    $addressBookInfo,
73
+                    $this->backend,
74
+                    $urlGenerator
75
+                )
76
+            );
77
+        }
78
+    }
79 79
 
80 80
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/Plugin.php 1 patch
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -30,51 +30,51 @@
 block discarded – undo
30 30
 
31 31
 class Plugin extends \Sabre\CardDAV\Plugin {
32 32
 
33
-	function initialize(Server $server) {
34
-		$server->on('propFind', [$this, 'propFind']);
35
-		parent::initialize($server);
36
-	}
33
+    function initialize(Server $server) {
34
+        $server->on('propFind', [$this, 'propFind']);
35
+        parent::initialize($server);
36
+    }
37 37
 
38
-	/**
39
-	 * Returns the addressbook home for a given principal
40
-	 *
41
-	 * @param string $principal
42
-	 * @return string
43
-	 */
44
-	protected function getAddressbookHomeForPrincipal($principal) {
38
+    /**
39
+     * Returns the addressbook home for a given principal
40
+     *
41
+     * @param string $principal
42
+     * @return string
43
+     */
44
+    protected function getAddressbookHomeForPrincipal($principal) {
45 45
 
46
-		if (strrpos($principal, 'principals/users', -strlen($principal)) !== false) {
47
-			list(, $principalId) = URLUtil::splitPath($principal);
48
-			return self::ADDRESSBOOK_ROOT . '/users/' . $principalId;
49
-		}
50
-		if (strrpos($principal, 'principals/groups', -strlen($principal)) !== false) {
51
-			list(, $principalId) = URLUtil::splitPath($principal);
52
-			return self::ADDRESSBOOK_ROOT . '/groups/' . $principalId;
53
-		}
54
-		if (strrpos($principal, 'principals/system', -strlen($principal)) !== false) {
55
-			list(, $principalId) = URLUtil::splitPath($principal);
56
-			return self::ADDRESSBOOK_ROOT . '/system/' . $principalId;
57
-		}
46
+        if (strrpos($principal, 'principals/users', -strlen($principal)) !== false) {
47
+            list(, $principalId) = URLUtil::splitPath($principal);
48
+            return self::ADDRESSBOOK_ROOT . '/users/' . $principalId;
49
+        }
50
+        if (strrpos($principal, 'principals/groups', -strlen($principal)) !== false) {
51
+            list(, $principalId) = URLUtil::splitPath($principal);
52
+            return self::ADDRESSBOOK_ROOT . '/groups/' . $principalId;
53
+        }
54
+        if (strrpos($principal, 'principals/system', -strlen($principal)) !== false) {
55
+            list(, $principalId) = URLUtil::splitPath($principal);
56
+            return self::ADDRESSBOOK_ROOT . '/system/' . $principalId;
57
+        }
58 58
 
59
-		throw new \LogicException('This is not supposed to happen');
60
-	}
59
+        throw new \LogicException('This is not supposed to happen');
60
+    }
61 61
 
62
-	/**
63
-	 * Adds all CardDAV-specific properties
64
-	 *
65
-	 * @param PropFind $propFind
66
-	 * @param INode $node
67
-	 * @return void
68
-	 */
69
-	function propFind(PropFind $propFind, INode $node) {
62
+    /**
63
+     * Adds all CardDAV-specific properties
64
+     *
65
+     * @param PropFind $propFind
66
+     * @param INode $node
67
+     * @return void
68
+     */
69
+    function propFind(PropFind $propFind, INode $node) {
70 70
 
71
-		$ns = '{http://owncloud.org/ns}';
71
+        $ns = '{http://owncloud.org/ns}';
72 72
 
73
-		if ($node instanceof AddressBook) {
73
+        if ($node instanceof AddressBook) {
74 74
 
75
-			$propFind->handle($ns . 'groups', function () use ($node) {
76
-				return new Groups($node->getContactsGroups());
77
-			});
78
-		}
79
-	}
75
+            $propFind->handle($ns . 'groups', function () use ($node) {
76
+                return new Groups($node->getContactsGroups());
77
+            });
78
+        }
79
+    }
80 80
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/AddressBook.php 1 patch
Indentation   +167 added lines, -167 removed lines patch added patch discarded remove patch
@@ -31,171 +31,171 @@
 block discarded – undo
31 31
 
32 32
 class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareable {
33 33
 
34
-	/**
35
-	 * AddressBook constructor.
36
-	 *
37
-	 * @param BackendInterface $carddavBackend
38
-	 * @param array $addressBookInfo
39
-	 * @param IL10N $l10n
40
-	 */
41
-	public function __construct(BackendInterface $carddavBackend, array $addressBookInfo, IL10N $l10n) {
42
-		parent::__construct($carddavBackend, $addressBookInfo);
43
-
44
-		if ($this->getName() === CardDavBackend::PERSONAL_ADDRESSBOOK_URI &&
45
-			$this->addressBookInfo['{DAV:}displayname'] === CardDavBackend::PERSONAL_ADDRESSBOOK_NAME) {
46
-			$this->addressBookInfo['{DAV:}displayname'] = $l10n->t('Contacts');
47
-		}
48
-	}
49
-
50
-	/**
51
-	 * Updates the list of shares.
52
-	 *
53
-	 * The first array is a list of people that are to be added to the
54
-	 * addressbook.
55
-	 *
56
-	 * Every element in the add array has the following properties:
57
-	 *   * href - A url. Usually a mailto: address
58
-	 *   * commonName - Usually a first and last name, or false
59
-	 *   * summary - A description of the share, can also be false
60
-	 *   * readOnly - A boolean value
61
-	 *
62
-	 * Every element in the remove array is just the address string.
63
-	 *
64
-	 * @param array $add
65
-	 * @param array $remove
66
-	 * @return void
67
-	 */
68
-	function updateShares(array $add, array $remove) {
69
-		/** @var CardDavBackend $carddavBackend */
70
-		$carddavBackend = $this->carddavBackend;
71
-		$carddavBackend->updateShares($this, $add, $remove);
72
-	}
73
-
74
-	/**
75
-	 * Returns the list of people whom this addressbook is shared with.
76
-	 *
77
-	 * Every element in this array should have the following properties:
78
-	 *   * href - Often a mailto: address
79
-	 *   * commonName - Optional, for example a first + last name
80
-	 *   * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
81
-	 *   * readOnly - boolean
82
-	 *   * summary - Optional, a description for the share
83
-	 *
84
-	 * @return array
85
-	 */
86
-	function getShares() {
87
-		/** @var CardDavBackend $carddavBackend */
88
-		$carddavBackend = $this->carddavBackend;
89
-		return $carddavBackend->getShares($this->getResourceId());
90
-	}
91
-
92
-	function getACL() {
93
-		$acl =  [
94
-			[
95
-				'privilege' => '{DAV:}read',
96
-				'principal' => $this->getOwner(),
97
-				'protected' => true,
98
-			]];
99
-		$acl[] = [
100
-				'privilege' => '{DAV:}write',
101
-				'principal' => $this->getOwner(),
102
-				'protected' => true,
103
-			];
104
-		if ($this->getOwner() !== parent::getOwner()) {
105
-			$acl[] =  [
106
-					'privilege' => '{DAV:}read',
107
-					'principal' => parent::getOwner(),
108
-					'protected' => true,
109
-				];
110
-			if ($this->canWrite()) {
111
-				$acl[] = [
112
-					'privilege' => '{DAV:}write',
113
-					'principal' => parent::getOwner(),
114
-					'protected' => true,
115
-				];
116
-			}
117
-		}
118
-		if ($this->getOwner() === 'principals/system/system') {
119
-			$acl[] = [
120
-					'privilege' => '{DAV:}read',
121
-					'principal' => '{DAV:}authenticated',
122
-					'protected' => true,
123
-			];
124
-		}
125
-
126
-		/** @var CardDavBackend $carddavBackend */
127
-		$carddavBackend = $this->carddavBackend;
128
-		return $carddavBackend->applyShareAcl($this->getResourceId(), $acl);
129
-	}
130
-
131
-	function getChildACL() {
132
-		return $this->getACL();
133
-	}
134
-
135
-	function getChild($name) {
136
-
137
-		$obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name);
138
-		if (!$obj) {
139
-			throw new NotFound('Card not found');
140
-		}
141
-		$obj['acl'] = $this->getChildACL();
142
-		return new Card($this->carddavBackend, $this->addressBookInfo, $obj);
143
-
144
-	}
145
-
146
-	/**
147
-	 * @return int
148
-	 */
149
-	public function getResourceId() {
150
-		return $this->addressBookInfo['id'];
151
-	}
152
-
153
-	function getOwner() {
154
-		if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
155
-			return $this->addressBookInfo['{http://owncloud.org/ns}owner-principal'];
156
-		}
157
-		return parent::getOwner();
158
-	}
159
-
160
-	function delete() {
161
-		if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
162
-			$principal = 'principal:' . parent::getOwner();
163
-			$shares = $this->getShares();
164
-			$shares = array_filter($shares, function($share) use ($principal){
165
-				return $share['href'] === $principal;
166
-			});
167
-			if (empty($shares)) {
168
-				throw new Forbidden();
169
-			}
170
-
171
-			/** @var CardDavBackend $cardDavBackend */
172
-			$cardDavBackend = $this->carddavBackend;
173
-			$cardDavBackend->updateShares($this, [], [
174
-				'href' => $principal
175
-			]);
176
-			return;
177
-		}
178
-		parent::delete();
179
-	}
180
-
181
-	function propPatch(PropPatch $propPatch) {
182
-		if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
183
-			throw new Forbidden();
184
-		}
185
-		parent::propPatch($propPatch);
186
-	}
187
-
188
-	public function getContactsGroups() {
189
-		/** @var CardDavBackend $cardDavBackend */
190
-		$cardDavBackend = $this->carddavBackend;
191
-
192
-		return $cardDavBackend->collectCardProperties($this->getResourceId(), 'CATEGORIES');
193
-	}
194
-
195
-	private function canWrite() {
196
-		if (isset($this->addressBookInfo['{http://owncloud.org/ns}read-only'])) {
197
-			return !$this->addressBookInfo['{http://owncloud.org/ns}read-only'];
198
-		}
199
-		return true;
200
-	}
34
+    /**
35
+     * AddressBook constructor.
36
+     *
37
+     * @param BackendInterface $carddavBackend
38
+     * @param array $addressBookInfo
39
+     * @param IL10N $l10n
40
+     */
41
+    public function __construct(BackendInterface $carddavBackend, array $addressBookInfo, IL10N $l10n) {
42
+        parent::__construct($carddavBackend, $addressBookInfo);
43
+
44
+        if ($this->getName() === CardDavBackend::PERSONAL_ADDRESSBOOK_URI &&
45
+            $this->addressBookInfo['{DAV:}displayname'] === CardDavBackend::PERSONAL_ADDRESSBOOK_NAME) {
46
+            $this->addressBookInfo['{DAV:}displayname'] = $l10n->t('Contacts');
47
+        }
48
+    }
49
+
50
+    /**
51
+     * Updates the list of shares.
52
+     *
53
+     * The first array is a list of people that are to be added to the
54
+     * addressbook.
55
+     *
56
+     * Every element in the add array has the following properties:
57
+     *   * href - A url. Usually a mailto: address
58
+     *   * commonName - Usually a first and last name, or false
59
+     *   * summary - A description of the share, can also be false
60
+     *   * readOnly - A boolean value
61
+     *
62
+     * Every element in the remove array is just the address string.
63
+     *
64
+     * @param array $add
65
+     * @param array $remove
66
+     * @return void
67
+     */
68
+    function updateShares(array $add, array $remove) {
69
+        /** @var CardDavBackend $carddavBackend */
70
+        $carddavBackend = $this->carddavBackend;
71
+        $carddavBackend->updateShares($this, $add, $remove);
72
+    }
73
+
74
+    /**
75
+     * Returns the list of people whom this addressbook is shared with.
76
+     *
77
+     * Every element in this array should have the following properties:
78
+     *   * href - Often a mailto: address
79
+     *   * commonName - Optional, for example a first + last name
80
+     *   * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
81
+     *   * readOnly - boolean
82
+     *   * summary - Optional, a description for the share
83
+     *
84
+     * @return array
85
+     */
86
+    function getShares() {
87
+        /** @var CardDavBackend $carddavBackend */
88
+        $carddavBackend = $this->carddavBackend;
89
+        return $carddavBackend->getShares($this->getResourceId());
90
+    }
91
+
92
+    function getACL() {
93
+        $acl =  [
94
+            [
95
+                'privilege' => '{DAV:}read',
96
+                'principal' => $this->getOwner(),
97
+                'protected' => true,
98
+            ]];
99
+        $acl[] = [
100
+                'privilege' => '{DAV:}write',
101
+                'principal' => $this->getOwner(),
102
+                'protected' => true,
103
+            ];
104
+        if ($this->getOwner() !== parent::getOwner()) {
105
+            $acl[] =  [
106
+                    'privilege' => '{DAV:}read',
107
+                    'principal' => parent::getOwner(),
108
+                    'protected' => true,
109
+                ];
110
+            if ($this->canWrite()) {
111
+                $acl[] = [
112
+                    'privilege' => '{DAV:}write',
113
+                    'principal' => parent::getOwner(),
114
+                    'protected' => true,
115
+                ];
116
+            }
117
+        }
118
+        if ($this->getOwner() === 'principals/system/system') {
119
+            $acl[] = [
120
+                    'privilege' => '{DAV:}read',
121
+                    'principal' => '{DAV:}authenticated',
122
+                    'protected' => true,
123
+            ];
124
+        }
125
+
126
+        /** @var CardDavBackend $carddavBackend */
127
+        $carddavBackend = $this->carddavBackend;
128
+        return $carddavBackend->applyShareAcl($this->getResourceId(), $acl);
129
+    }
130
+
131
+    function getChildACL() {
132
+        return $this->getACL();
133
+    }
134
+
135
+    function getChild($name) {
136
+
137
+        $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name);
138
+        if (!$obj) {
139
+            throw new NotFound('Card not found');
140
+        }
141
+        $obj['acl'] = $this->getChildACL();
142
+        return new Card($this->carddavBackend, $this->addressBookInfo, $obj);
143
+
144
+    }
145
+
146
+    /**
147
+     * @return int
148
+     */
149
+    public function getResourceId() {
150
+        return $this->addressBookInfo['id'];
151
+    }
152
+
153
+    function getOwner() {
154
+        if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
155
+            return $this->addressBookInfo['{http://owncloud.org/ns}owner-principal'];
156
+        }
157
+        return parent::getOwner();
158
+    }
159
+
160
+    function delete() {
161
+        if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
162
+            $principal = 'principal:' . parent::getOwner();
163
+            $shares = $this->getShares();
164
+            $shares = array_filter($shares, function($share) use ($principal){
165
+                return $share['href'] === $principal;
166
+            });
167
+            if (empty($shares)) {
168
+                throw new Forbidden();
169
+            }
170
+
171
+            /** @var CardDavBackend $cardDavBackend */
172
+            $cardDavBackend = $this->carddavBackend;
173
+            $cardDavBackend->updateShares($this, [], [
174
+                'href' => $principal
175
+            ]);
176
+            return;
177
+        }
178
+        parent::delete();
179
+    }
180
+
181
+    function propPatch(PropPatch $propPatch) {
182
+        if (isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) {
183
+            throw new Forbidden();
184
+        }
185
+        parent::propPatch($propPatch);
186
+    }
187
+
188
+    public function getContactsGroups() {
189
+        /** @var CardDavBackend $cardDavBackend */
190
+        $cardDavBackend = $this->carddavBackend;
191
+
192
+        return $cardDavBackend->collectCardProperties($this->getResourceId(), 'CATEGORIES');
193
+    }
194
+
195
+    private function canWrite() {
196
+        if (isset($this->addressBookInfo['{http://owncloud.org/ns}read-only'])) {
197
+            return !$this->addressBookInfo['{http://owncloud.org/ns}read-only'];
198
+        }
199
+        return true;
200
+    }
201 201
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/UserAddressBooks.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -25,52 +25,52 @@
 block discarded – undo
25 25
 
26 26
 class UserAddressBooks extends \Sabre\CardDAV\AddressBookHome {
27 27
 
28
-	/** @var IL10N */
29
-	protected $l10n;
28
+    /** @var IL10N */
29
+    protected $l10n;
30 30
 
31
-	/**
32
-	 * Returns a list of addressbooks
33
-	 *
34
-	 * @return array
35
-	 */
36
-	function getChildren() {
37
-		if ($this->l10n === null) {
38
-			$this->l10n = \OC::$server->getL10N('dav');
39
-		}
31
+    /**
32
+     * Returns a list of addressbooks
33
+     *
34
+     * @return array
35
+     */
36
+    function getChildren() {
37
+        if ($this->l10n === null) {
38
+            $this->l10n = \OC::$server->getL10N('dav');
39
+        }
40 40
 
41
-		$addressBooks = $this->carddavBackend->getAddressBooksForUser($this->principalUri);
42
-		$objects = [];
43
-		foreach($addressBooks as $addressBook) {
44
-			$objects[] = new AddressBook($this->carddavBackend, $addressBook, $this->l10n);
45
-		}
46
-		return $objects;
41
+        $addressBooks = $this->carddavBackend->getAddressBooksForUser($this->principalUri);
42
+        $objects = [];
43
+        foreach($addressBooks as $addressBook) {
44
+            $objects[] = new AddressBook($this->carddavBackend, $addressBook, $this->l10n);
45
+        }
46
+        return $objects;
47 47
 
48
-	}
48
+    }
49 49
 
50
-	/**
51
-	 * Returns a list of ACE's for this node.
52
-	 *
53
-	 * Each ACE has the following properties:
54
-	 *   * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
55
-	 *     currently the only supported privileges
56
-	 *   * 'principal', a url to the principal who owns the node
57
-	 *   * 'protected' (optional), indicating that this ACE is not allowed to
58
-	 *      be updated.
59
-	 *
60
-	 * @return array
61
-	 */
62
-	function getACL() {
50
+    /**
51
+     * Returns a list of ACE's for this node.
52
+     *
53
+     * Each ACE has the following properties:
54
+     *   * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
55
+     *     currently the only supported privileges
56
+     *   * 'principal', a url to the principal who owns the node
57
+     *   * 'protected' (optional), indicating that this ACE is not allowed to
58
+     *      be updated.
59
+     *
60
+     * @return array
61
+     */
62
+    function getACL() {
63 63
 
64
-		$acl = parent::getACL();
65
-		if ($this->principalUri === 'principals/system/system') {
66
-			$acl[] = [
67
-					'privilege' => '{DAV:}read',
68
-					'principal' => '{DAV:}authenticated',
69
-					'protected' => true,
70
-			];
71
-		}
64
+        $acl = parent::getACL();
65
+        if ($this->principalUri === 'principals/system/system') {
66
+            $acl[] = [
67
+                    'privilege' => '{DAV:}read',
68
+                    'principal' => '{DAV:}authenticated',
69
+                    'protected' => true,
70
+            ];
71
+        }
72 72
 
73
-		return $acl;
74
-	}
73
+        return $acl;
74
+    }
75 75
 
76 76
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/ImageExportPlugin.php 1 patch
Indentation   +132 added lines, -132 removed lines patch added patch discarded remove patch
@@ -34,136 +34,136 @@
 block discarded – undo
34 34
 
35 35
 class ImageExportPlugin extends ServerPlugin {
36 36
 
37
-	/** @var Server */
38
-	protected $server;
39
-	/** @var ILogger */
40
-	private $logger;
41
-
42
-	public function __construct(ILogger $logger) {
43
-		$this->logger = $logger;
44
-	}
45
-
46
-	/**
47
-	 * Initializes the plugin and registers event handlers
48
-	 *
49
-	 * @param Server $server
50
-	 * @return void
51
-	 */
52
-	function initialize(Server $server) {
53
-
54
-		$this->server = $server;
55
-		$this->server->on('method:GET', [$this, 'httpGet'], 90);
56
-	}
57
-
58
-	/**
59
-	 * Intercepts GET requests on addressbook urls ending with ?photo.
60
-	 *
61
-	 * @param RequestInterface $request
62
-	 * @param ResponseInterface $response
63
-	 * @return bool|void
64
-	 */
65
-	function httpGet(RequestInterface $request, ResponseInterface $response) {
66
-
67
-		$queryParams = $request->getQueryParameters();
68
-		// TODO: in addition to photo we should also add logo some point in time
69
-		if (!array_key_exists('photo', $queryParams)) {
70
-			return true;
71
-		}
72
-
73
-		$path = $request->getPath();
74
-		$node = $this->server->tree->getNodeForPath($path);
75
-
76
-		if (!($node instanceof Card)) {
77
-			return true;
78
-		}
79
-
80
-		$this->server->transactionType = 'carddav-image-export';
81
-
82
-		// Checking ACL, if available.
83
-		if ($aclPlugin = $this->server->getPlugin('acl')) {
84
-			/** @var \Sabre\DAVACL\Plugin $aclPlugin */
85
-			$aclPlugin->checkPrivileges($path, '{DAV:}read');
86
-		}
87
-
88
-		if ($result = $this->getPhoto($node)) {
89
-			$response->setHeader('Content-Type', $result['Content-Type']);
90
-			$response->setHeader('Content-Disposition', 'attachment');
91
-			$response->setStatus(200);
92
-
93
-			$response->setBody($result['body']);
94
-
95
-			// Returning false to break the event chain
96
-			return false;
97
-		}
98
-		return true;
99
-	}
100
-
101
-	function getPhoto(Card $node) {
102
-		// TODO: this is kind of expensive - load carddav data from database and parse it
103
-		//       we might want to build up a cache one day
104
-		try {
105
-			$vObject = $this->readCard($node->get());
106
-			if (!$vObject->PHOTO) {
107
-				return false;
108
-			}
109
-
110
-			$photo = $vObject->PHOTO;
111
-			$type = $this->getType($photo);
112
-
113
-			$val = $photo->getValue();
114
-			if ($photo->getValueType() === 'URI') {
115
-				$parsed = \Sabre\URI\parse($val);
116
-				//only allow data://
117
-				if ($parsed['scheme'] !== 'data') {
118
-					return false;
119
-				}
120
-				if (substr_count($parsed['path'], ';') === 1) {
121
-					list($type,) = explode(';', $parsed['path']);
122
-				}
123
-				$val = file_get_contents($val);
124
-			}
125
-
126
-			$allowedContentTypes = [
127
-				'image/png',
128
-				'image/jpeg',
129
-				'image/gif',
130
-			];
131
-
132
-			if(!in_array($type, $allowedContentTypes, true)) {
133
-				$type = 'application/octet-stream';
134
-			}
135
-
136
-			return [
137
-				'Content-Type' => $type,
138
-				'body' => $val
139
-			];
140
-		} catch(\Exception $ex) {
141
-			$this->logger->logException($ex);
142
-		}
143
-		return false;
144
-	}
145
-
146
-	private function readCard($cardData) {
147
-		return Reader::read($cardData);
148
-	}
149
-
150
-	/**
151
-	 * @param Binary $photo
152
-	 * @return Parameter
153
-	 */
154
-	private function getType($photo) {
155
-		$params = $photo->parameters();
156
-		if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) {
157
-			/** @var Parameter $typeParam */
158
-			$typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE'];
159
-			$type = $typeParam->getValue();
160
-
161
-			if (strpos($type, 'image/') === 0) {
162
-				return $type;
163
-			} else {
164
-				return 'image/' . strtolower($type);
165
-			}
166
-		}
167
-		return '';
168
-	}
37
+    /** @var Server */
38
+    protected $server;
39
+    /** @var ILogger */
40
+    private $logger;
41
+
42
+    public function __construct(ILogger $logger) {
43
+        $this->logger = $logger;
44
+    }
45
+
46
+    /**
47
+     * Initializes the plugin and registers event handlers
48
+     *
49
+     * @param Server $server
50
+     * @return void
51
+     */
52
+    function initialize(Server $server) {
53
+
54
+        $this->server = $server;
55
+        $this->server->on('method:GET', [$this, 'httpGet'], 90);
56
+    }
57
+
58
+    /**
59
+     * Intercepts GET requests on addressbook urls ending with ?photo.
60
+     *
61
+     * @param RequestInterface $request
62
+     * @param ResponseInterface $response
63
+     * @return bool|void
64
+     */
65
+    function httpGet(RequestInterface $request, ResponseInterface $response) {
66
+
67
+        $queryParams = $request->getQueryParameters();
68
+        // TODO: in addition to photo we should also add logo some point in time
69
+        if (!array_key_exists('photo', $queryParams)) {
70
+            return true;
71
+        }
72
+
73
+        $path = $request->getPath();
74
+        $node = $this->server->tree->getNodeForPath($path);
75
+
76
+        if (!($node instanceof Card)) {
77
+            return true;
78
+        }
79
+
80
+        $this->server->transactionType = 'carddav-image-export';
81
+
82
+        // Checking ACL, if available.
83
+        if ($aclPlugin = $this->server->getPlugin('acl')) {
84
+            /** @var \Sabre\DAVACL\Plugin $aclPlugin */
85
+            $aclPlugin->checkPrivileges($path, '{DAV:}read');
86
+        }
87
+
88
+        if ($result = $this->getPhoto($node)) {
89
+            $response->setHeader('Content-Type', $result['Content-Type']);
90
+            $response->setHeader('Content-Disposition', 'attachment');
91
+            $response->setStatus(200);
92
+
93
+            $response->setBody($result['body']);
94
+
95
+            // Returning false to break the event chain
96
+            return false;
97
+        }
98
+        return true;
99
+    }
100
+
101
+    function getPhoto(Card $node) {
102
+        // TODO: this is kind of expensive - load carddav data from database and parse it
103
+        //       we might want to build up a cache one day
104
+        try {
105
+            $vObject = $this->readCard($node->get());
106
+            if (!$vObject->PHOTO) {
107
+                return false;
108
+            }
109
+
110
+            $photo = $vObject->PHOTO;
111
+            $type = $this->getType($photo);
112
+
113
+            $val = $photo->getValue();
114
+            if ($photo->getValueType() === 'URI') {
115
+                $parsed = \Sabre\URI\parse($val);
116
+                //only allow data://
117
+                if ($parsed['scheme'] !== 'data') {
118
+                    return false;
119
+                }
120
+                if (substr_count($parsed['path'], ';') === 1) {
121
+                    list($type,) = explode(';', $parsed['path']);
122
+                }
123
+                $val = file_get_contents($val);
124
+            }
125
+
126
+            $allowedContentTypes = [
127
+                'image/png',
128
+                'image/jpeg',
129
+                'image/gif',
130
+            ];
131
+
132
+            if(!in_array($type, $allowedContentTypes, true)) {
133
+                $type = 'application/octet-stream';
134
+            }
135
+
136
+            return [
137
+                'Content-Type' => $type,
138
+                'body' => $val
139
+            ];
140
+        } catch(\Exception $ex) {
141
+            $this->logger->logException($ex);
142
+        }
143
+        return false;
144
+    }
145
+
146
+    private function readCard($cardData) {
147
+        return Reader::read($cardData);
148
+    }
149
+
150
+    /**
151
+     * @param Binary $photo
152
+     * @return Parameter
153
+     */
154
+    private function getType($photo) {
155
+        $params = $photo->parameters();
156
+        if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) {
157
+            /** @var Parameter $typeParam */
158
+            $typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE'];
159
+            $type = $typeParam->getValue();
160
+
161
+            if (strpos($type, 'image/') === 0) {
162
+                return $type;
163
+            } else {
164
+                return 'image/' . strtolower($type);
165
+            }
166
+        }
167
+        return '';
168
+    }
169 169
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/SyncJob.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -28,15 +28,15 @@
 block discarded – undo
28 28
 
29 29
 class SyncJob extends TimedJob {
30 30
 
31
-	public function __construct() {
32
-		// Run once a day
33
-		$this->setInterval(24 * 60 * 60);
34
-	}
31
+    public function __construct() {
32
+        // Run once a day
33
+        $this->setInterval(24 * 60 * 60);
34
+    }
35 35
 
36
-	protected function run($argument) {
37
-		$app = new Application();
38
-		/** @var SyncService $ss */
39
-		$ss = $app->getSyncService();
40
-		$ss->syncInstance();
41
-	}
36
+    protected function run($argument) {
37
+        $app = new Application();
38
+        /** @var SyncService $ss */
39
+        $ss = $app->getSyncService();
40
+        $ss->syncInstance();
41
+    }
42 42
 }
Please login to merge, or discard this patch.