Skip to content
Next Next commit
Provide calendars shared w/ current user's circles
This commit allows the user to view the calendars that are shared with any circle s/he belongs to.

Signed-off-by: Vinicius Cubas Brand <[email protected]>
  • Loading branch information
viniciuscb committed Oct 20, 2017
commit 9357b997f795cebda4ebcda42a074ce695068d03
4 changes: 4 additions & 0 deletions apps/dav/lib/CalDAV/CalDavBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
* @author Thomas Citharel <[email protected]>
* @author Thomas Müller <[email protected]>
* @author Georg Ehrke <[email protected]>
* @author Vinicius Cubas Brand <[email protected]>
* @author Daniel Tygel <[email protected]>
*
* @license AGPL-3.0
*
Expand Down Expand Up @@ -280,6 +282,8 @@ function getCalendarsForUser($principalUri) {

// query for shared calendars
$principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true);
$principals = array_merge($principals, $this->principalBackend->getCircleMembership($principalUriOriginal));

$principals = array_map(function($principal) {
return urldecode($principal);
}, $principals);
Expand Down
71 changes: 70 additions & 1 deletion apps/dav/lib/Connector/Sabre/Principal.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
* @author Thomas Müller <[email protected]>
* @author Thomas Tanghus <[email protected]>
* @author Vincent Petry <[email protected]>
* @author Vinicius Cubas Brand <[email protected]>
* @author Daniel Tygel <[email protected]>
*
* @license AGPL-3.0
*
Expand Down Expand Up @@ -52,6 +54,9 @@ class Principal implements BackendInterface {
/** @var bool */
private $hasGroups;

/** @var bool */
private $hasCircles;

/**
* @param IUserManager $userManager
* @param IGroupManager $groupManager
Expand All @@ -63,7 +68,7 @@ public function __construct(IUserManager $userManager,
$this->userManager = $userManager;
$this->groupManager = $groupManager;
$this->principalPrefix = trim($principalPrefix, '/');
$this->hasGroups = ($principalPrefix === 'principals/users/');
$this->hasGroups = $this->hasCircles = ($principalPrefix === 'principals/users/');
}

/**
Expand Down Expand Up @@ -108,6 +113,8 @@ public function getPrincipalByPath($path) {
if (!is_null($user)) {
return $this->userToPrincipal($user);
}
} else if ($prefix === 'principals/circles') {
return $this->circleToPrincipal($name);
}
return null;
}
Expand Down Expand Up @@ -232,4 +239,66 @@ public function getPrincipalPrefix() {
return $this->principalPrefix;
}

/**
* @param string $circleUniqueId
* @return array|null
*/
protected function circleToPrincipal($circleUniqueId) {
if (!\OC::$server->getAppManager()->isEnabledForUser('circles') || !class_exists('\OCA\Circles\ShareByCircleProvider')) {
return null;
}

$circle = \OCA\Circles\Api\v1\Circles::detailsCircle($circleUniqueId);

if (!$circle) {
return null;
}

$principal = [
'uri' => 'principals/circles/' . $circleUniqueId,
'{DAV:}displayname' => $circle->getName(),
];

return $principal;
}

/**
* Returns the list of circles a principal is a member of
*
* @param string $principal
* @param bool $needGroups
* @return array
* @throws Exception
*/
public function getCircleMembership($principal) {
if (!\OC::$server->getAppManager()->isEnabledForUser('circles') || !class_exists('\OCA\Circles\ShareByCircleProvider')) {
return [];
}

list($prefix, $name) = URLUtil::splitPath($principal);

if ($this->hasCircles && $prefix === $this->principalPrefix) {
$user = $this->userManager->get($name);
if (!$user) {
throw new Exception('Principal not found');
}

$userSession = \OC::$server->getUserSession();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we inject the current user in the constructor instead?

$currentUser = $userSession->getUser();

$userSession->setUser($user);
$circles = \OCA\Circles\Api\v1\Circles::joinedCircles();
$userSession->setUser($currentUser);

$circles = array_map(function($circle) {
/** @var \OCA\Circles\Model\Circle $group */
return 'principals/circles/' . urlencode($circle->getUniqueId());
}, $circles);

return $circles;

}
return [];
}

}
1 change: 1 addition & 0 deletions apps/dav/lib/Connector/Sabre/SharesPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ private function getShareTypes(\OCP\Files\Node $node) {
\OCP\Share::SHARE_TYPE_LINK,
\OCP\Share::SHARE_TYPE_REMOTE,
\OCP\Share::SHARE_TYPE_EMAIL,
\OCP\Share::SHARE_TYPE_CIRCLE,
];
foreach ($requestedShareTypes as $requestedShareType) {
// one of each type is enough to find out about the types
Expand Down