-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #19795 from nextcloud/enhancement/address-book-plu…
…gins Add address book plugins
- Loading branch information
Showing
9 changed files
with
303 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
113 changes: 113 additions & 0 deletions
113
apps/dav/lib/CardDAV/Integration/ExternalAddressBook.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace OCA\DAV\CardDAV\Integration; | ||
|
||
use Sabre\CardDAV\IAddressBook; | ||
use Sabre\DAV; | ||
|
||
/** | ||
* @since 19.0.0 | ||
*/ | ||
abstract class ExternalAddressBook implements IAddressBook, DAV\IProperties { | ||
|
||
/** @var string */ | ||
private const PREFIX = 'app-generated'; | ||
|
||
/** | ||
* @var string | ||
* | ||
* Double dash is a valid delimiter, | ||
* because it will always split the URIs correctly: | ||
* - our prefix contains only one dash and won't be split | ||
* - appIds are not allowed to contain dashes as per spec: | ||
* > must contain only lowercase ASCII characters and underscore | ||
* - explode has a limit of three, so even if the app-generated | ||
* URI has double dashes, it won't be split | ||
*/ | ||
private const DELIMITER = '--'; | ||
|
||
/** @var string */ | ||
private $appId; | ||
|
||
/** @var string */ | ||
private $uri; | ||
|
||
/** | ||
* @param string $appId | ||
* @param string $uri | ||
*/ | ||
public function __construct(string $appId, string $uri) { | ||
$this->appId = $appId; | ||
$this->uri = $uri; | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
final public function getName() { | ||
return implode(self::DELIMITER, [ | ||
self::PREFIX, | ||
$this->appId, | ||
$this->uri, | ||
]); | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
final public function setName($name) { | ||
throw new DAV\Exception\MethodNotAllowed('Renaming address books is not yet supported'); | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
final public function createDirectory($name) { | ||
throw new DAV\Exception\MethodNotAllowed('Creating collections in address book objects is not allowed'); | ||
|
||
} | ||
|
||
/** | ||
* Checks whether the address book uri is app-generated | ||
* | ||
* @param string $uri | ||
* | ||
* @return bool | ||
*/ | ||
public static function isAppGeneratedAddressBook(string $uri): bool { | ||
return strpos($uri, self::PREFIX) === 0 && substr_count($uri, self::DELIMITER) >= 2; | ||
} | ||
|
||
/** | ||
* Splits an app-generated uri into appId and uri | ||
* | ||
* @param string $uri | ||
* | ||
* @return array | ||
*/ | ||
public static function splitAppGeneratedAddressBookUri(string $uri): array { | ||
$array = array_slice(explode(self::DELIMITER, $uri, 3), 1); | ||
// Check the array has expected amount of elements | ||
// and none of them is an empty string | ||
if (\count($array) !== 2 || \in_array('', $array, true)) { | ||
throw new \InvalidArgumentException('Provided address book uri was not app-generated'); | ||
} | ||
|
||
return $array; | ||
} | ||
|
||
/** | ||
* Checks whether a address book name the user wants to create violates | ||
* the reserved name for URIs | ||
* | ||
* @param string $uri | ||
* | ||
* @return bool | ||
*/ | ||
public static function doesViolateReservedName(string $uri): bool { | ||
return strpos($uri, self::PREFIX) === 0; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace OCA\DAV\CardDAV\Integration; | ||
|
||
use Sabre\CardDAV\IAddressBook; | ||
|
||
/** | ||
* @since 19.0.0 | ||
*/ | ||
interface IAddressBookProvider { | ||
|
||
/** | ||
* Provides the appId of the plugin | ||
* | ||
* @since 19.0.0 | ||
* @return string AppId | ||
*/ | ||
public function getAppId(): string; | ||
|
||
/** | ||
* Fetches all address books for a given principal uri | ||
* | ||
* @since 19.0.0 | ||
* @param string $principalUri E.g. principals/users/user1 | ||
* @return ExternalAddressBook[] Array of all address books | ||
*/ | ||
public function fetchAllForAddressBookHome(string $principalUri): array; | ||
|
||
/** | ||
* Checks whether plugin has an address book for a given principalUri and URI | ||
* | ||
* @since 19.0.0 | ||
* @param string $principalUri E.g. principals/users/user1 | ||
* @param string $uri E.g. personal | ||
* @return bool True if address book for principalUri and URI exists, false otherwise | ||
*/ | ||
public function hasAddressBookInAddressBookHome(string $principalUri, string $uri): bool; | ||
|
||
/** | ||
* Fetches an address book for a given principalUri and URI | ||
* Returns null if address book does not exist | ||
* | ||
* @param string $principalUri E.g. principals/users/user1 | ||
* @param string $uri E.g. personal | ||
* | ||
* @return ExternalAddressBook|null address book if it exists, null otherwise | ||
*@since 19.0.0 | ||
*/ | ||
public function getAddressBookInAddressBookHome(string $principalUri, string $uri): ?ExternalAddressBook; | ||
|
||
} |
Oops, something went wrong.