diff options
Diffstat (limited to 'lib/connector/sabre/principal.php')
-rw-r--r-- | lib/connector/sabre/principal.php | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/lib/connector/sabre/principal.php b/lib/connector/sabre/principal.php new file mode 100644 index 00000000000..b3070087fd7 --- /dev/null +++ b/lib/connector/sabre/principal.php @@ -0,0 +1,181 @@ +<?php + +class OC_Connector_Sabre_Principal implements Sabre_DAVACL_IPrincipalBackend { + /** + * TODO: write doc + */ + public static function addPrincipal($params){ + // Add the user + $uri = 'principals/'.$params['uid']; + $displayname = $params['uid']; + $query = OC_DB::prepare('INSERT INTO *PREFIX*principals (uri,displayname) VALUES(?,?)'); + $query->execute(array($uri,$displayname)); + + // Add calendar and addressbook read and write support (sharing calendars) + $uri = 'principals/'.$params['uid'].'/calendar-proxy-read'; + $displayname = null; + $query->execute(array($uri,$displayname)); + $uri = 'principals/'.$params['uid'].'/calendar-proxy-write'; + $query->execute(array($uri,$displayname)); + $uri = 'principals/'.$params['uid'].'/addressbook-proxy-read'; + $query->execute(array($uri,$displayname)); + $uri = 'principals/'.$params['uid'].'/addressbook-proxy-write'; + $query->execute(array($uri,$displayname)); + + return true; + } + + /** + * TODO: write doc + */ + public static function deletePrincipal($params){ + $query = OC_DB::prepare('SELECT * FROM *PREFIX*principals'); + $result = $query->execute(); + + $deleteprincipal = OC_DB::prepare('DELETE FROM *PREFIX*principals WHERE id = ?'); + $deletegroup = OC_DB::prepare('DELETE FROM *PREFIX*principalgroups WHERE principal_id = ? OR member_id = ?'); + // We have to delete the principals and relations! Principals include + while($row = $result->fetchRow()){ + // Checking if the principal is in the prefix + list($rowPrefix,$rowUser) = Sabre_DAV_URLUtil::splitPath($row['uri']); + if ($rowUser !== $params['uid']) continue; + $deleteprincipal->execute(array($row['id'])); + $deletegroup->execute(array($row['id'],$row['id'])); + } + return true; + } + /** + * Returns a list of principals based on a prefix. + * + * This prefix will often contain something like 'principals'. You are only + * expected to return principals that are in this base path. + * + * You are expected to return at least a 'uri' for every user, you can + * return any additional properties if you wish so. Common properties are: + * {DAV:}displayname + * + * @param string $prefixPath + * @return array + */ + public function getPrincipalsByPrefix( $prefixPath ){ + $query = OC_DB::prepare('SELECT * FROM *PREFIX*principals'); + $result = $query->execute(); + + $principals = array(); + + while($row = $result->fetchRow()){ + // Checking if the principal is in the prefix + list($rowPrefix) = Sabre_DAV_URLUtil::splitPath($row['uri']); + if ($rowPrefix !== $prefixPath) continue; + + $principals[] = array( + 'uri' => $row['uri'], + '{DAV:}displayname' => $row['displayname']?$row['displayname']:basename($row['uri']) + ); + + } + + return $principals; + } + + /** + * Returns a specific principal, specified by it's path. + * The returned structure should be the exact same as from + * getPrincipalsByPrefix. + * + * @param string $path + * @return array + */ + public function getPrincipalByPath($path) { + $query = OC_DB::prepare('SELECT * FROM *PREFIX*principals WHERE uri=?'); + $result = $query->execute(array($path)); + + $users = array(); + + $row = $result->fetchRow(); + if (!$row) return; + + return array( + 'id' => $row['id'], + 'uri' => $row['uri'], + '{DAV:}displayname' => $row['displayname']?$row['displayname']:basename($row['uri']) + ); + + } + + /** + * Returns the list of members for a group-principal + * + * @param string $principal + * @return array + */ + public function getGroupMemberSet($principal) { + $principal = $this->getPrincipalByPath($principal); + if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); + + $query = OC_DB::prepare('SELECT principals.uri as uri FROM *PREFIX*principalgroups AS groupmembers LEFT JOIN *PREFIX*principals AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); + $result = $query->execute(array($principal['id'])); + + $return = array(); + while ($row = $result->fetchRow()){ + $return[] = $row['uri']; + } + return $return; + } + + /** + * Returns the list of groups a principal is a member of + * + * @param string $principal + * @return array + */ + public function getGroupMembership($principal) { + $principal = $this->getPrincipalByPath($principal); + if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); + + $query = OC_DB::prepare('SELECT principals.uri as uri FROM *PREFIX*principalgroups AS groupmembers LEFT JOIN *PREFIX*principals AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.member_id = ?'); + $result = $query->execute(array($principal['id'])); + + $return = array(); + while ($row = $result->fetchRow()){ + $return[] = $row['uri']; + } + return $return; + } + + /** + * Updates the list of group members for a group principal. + * + * The principals should be passed as a list of uri's. + * + * @param string $principal + * @param array $members + * @return void + */ + public function setGroupMemberSet($principal, array $members) { + $query = OC_DB::prepare('SELECT id, uri FROM *PREFIX*principals WHERE uri IN (? '.str_repeat(', ?', count($members)).')'); + $result = $query->execute(array_merge(array($principal), $members)); + + $memberIds = array(); + $principalId = null; + + while($row = $$result->fetchRow()) { + if ($row['uri'] == $principal) { + $principalId = $row['id']; + } + else{ + $memberIds[] = $row['id']; + } + } + if (!$principalId) throw new Sabre_DAV_Exception('Principal not found'); + + // Wiping out old members + $query = OC_DB::prepare('DELETE FROM *PREFIX*principalgroups WHERE principal_id = ?'); + $query->execute(array($principalID)); + + $query = OC_DB::prepare('INSERT INTO *PREFIX*principalgroups (principal_id, member_id) VALUES (?, ?);'); + foreach($memberIds as $memberId) { + $query->execute(array($principalId, $memberId)); + } + } +} |