summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJakob Sack <kde@jakobsack.de>2011-08-06 11:36:56 +0200
committerJakob Sack <kde@jakobsack.de>2011-08-06 11:36:56 +0200
commit5f7c040ec031c151f0f3bc628506ce78b127ad2f (patch)
tree039407a143646ad70c8df59c6002c2be184b95c4 /lib
parent122c3a3cf8340b5737e0b954cc4fa6b2d03b68ab (diff)
downloadnextcloud-server-5f7c040ec031c151f0f3bc628506ce78b127ad2f.tar.gz
nextcloud-server-5f7c040ec031c151f0f3bc628506ce78b127ad2f.zip
Add principals, minor changes in base.php
Diffstat (limited to 'lib')
-rw-r--r--lib/base.php30
-rw-r--r--lib/connector/sabre/principal.php181
-rw-r--r--lib/template.php22
3 files changed, 224 insertions, 9 deletions
diff --git a/lib/base.php b/lib/base.php
index b2c5bd32314..e9451c45b61 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -22,6 +22,8 @@
/**
* Class that is a namespace for all global OC variables
+ * No, we can not put this class in its own file because it is used by
+ * OC_autoload!
*/
class OC{
/**
@@ -52,19 +54,22 @@ class OC{
* TODO: What's this for?
*/
public static $CONFIG_DATADIRECTORY_ROOT = '';
-}
-// Get rid of this stupid require_once OC_...
-function OC_autoload($className){
- if(array_key_exists($className,OC::$CLASSPATH)){
- require_once OC::$CLASSPATH[$className];
- }
- elseif(strpos($className,'OC_')===0){
- require_once strtolower(str_replace('_','/',substr($className,3)) . '.php');
+ /**
+ * SPL autoload
+ */
+ public static function autoload($className){
+ if(array_key_exists($className,OC::$CLASSPATH)){
+ require_once OC::$CLASSPATH[$className];
+ }
+ elseif(strpos($className,'OC_')===0){
+ require_once strtolower(str_replace('_','/',substr($className,3)) . '.php');
+ }
}
}
-spl_autoload_register('OC_autoload');
+// this requires all our OC_* classes
+spl_autoload_register(array('OC','autoload'));
// set some stuff
//ob_start();
@@ -94,6 +99,9 @@ if($WEBROOT!='' and $WEBROOT[0]!=='/'){
// set the right include path
set_include_path($SERVERROOT.'/lib'.PATH_SEPARATOR.$SERVERROOT.'/config'.PATH_SEPARATOR.$SERVERROOT.'/3dparty'.PATH_SEPARATOR.get_include_path().PATH_SEPARATOR.$SERVERROOT);
+//Some libs we really depend on
+require_once('Sabre/autoload.php');
+
// define runtime variables - unless this already has been done
if( !isset( $RUNTIME_NOSETUPFS )){
$RUNTIME_NOSETUPFS = false;
@@ -150,6 +158,10 @@ if(!$error and !$RUNTIME_NOSETUPFS ){
OC_Util::setupFS();
}
+// Last part: connect some hooks
+OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Connector_Sabre_Principal', 'addPrincipal');
+OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Connector_Sabre_Principal', 'deletePrincipal');
+
// FROM Connect.php
function OC_CONNECT_TEST($path,$user,$password){
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));
+ }
+ }
+}
diff --git a/lib/template.php b/lib/template.php
index fe173f609b2..045ecdaf130 100644
--- a/lib/template.php
+++ b/lib/template.php
@@ -321,6 +321,28 @@ class OC_Template{
}
/**
+ * @brief Include template
+ * @returns returns content of included template
+ *
+ * Includes another template. use <?php echo $this->inc('template'); ?> to
+ * do this.
+ */
+ public function inc( $file )
+ {
+ // $_ erstellen
+ $_ = $this->vars;
+
+ // Einbinden
+ ob_start();
+ include( $this->path.'/'.$file.'.php' );
+ $data = ob_get_contents();
+ ob_end_clean();
+
+ // Daten zurückgeben
+ return $data;
+ }
+
+ /**
* @brief Shortcut to print a simple page for users
* @param $application The application we render the template for
* @param $name Name of the template