diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php new file mode 100644 index 0000000000..f38a45f279 --- /dev/null +++ b/apps/contacts/appinfo/app.php @@ -0,0 +1,18 @@ + 10, + 'id' => 'contacts', + 'name' => 'Contacts' )); + +OC_App::addNavigationEntry( array( + 'id' => 'contacts_index', + 'order' => 10, + 'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), + 'icon' => OC_Helper::imagePath( 'contacts', 'icon.png' ), + 'name' => 'Addressbook' )); + +?> diff --git a/apps/contacts/appinfo/database.xml b/apps/contacts/appinfo/database.xml new file mode 100644 index 0000000000..7c8268d71f --- /dev/null +++ b/apps/contacts/appinfo/database.xml @@ -0,0 +1,129 @@ + + + + *dbname* + true + false + + utf8 + + + + *dbprefix*contacts_addressbooks + + + + + id + integer + 0 + true + 1 + true + 4 + + + + userid + text + + true + 255 + + + + displayname + text + + false + 255 + + + + uri + text + + false + 100 + + + + description + clob + false + + + + ctag + integer + 1 + true + true + 4 + + + + +
+ + + + *dbprefix*contacts_cards + + + + + id + integer + 0 + true + 1 + true + 4 + + + + addressbookid + integer + + true + true + 4 + + + + fullname + text + + false + 255 + + + + carddata + clob + false + + + + uri + text + + false + 100 + + + + lastmodified + integer + + false + true + 4 + + + + +
+ +
diff --git a/apps/contacts/appinfo/info.xml b/apps/contacts/appinfo/info.xml new file mode 100644 index 0000000000..93463b9cf0 --- /dev/null +++ b/apps/contacts/appinfo/info.xml @@ -0,0 +1,9 @@ + + + contacts + Contacts + 0.1 + AGPL + Jakob Sack + 2 + diff --git a/apps/contacts/carddav.php b/apps/contacts/carddav.php new file mode 100644 index 0000000000..ae2c5b9736 --- /dev/null +++ b/apps/contacts/carddav.php @@ -0,0 +1,28 @@ +setBaseUri($WEBROOT.'/apps/contacts/carddav.php'); +// Add plugins +$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud')); +$server->addPlugin(new Sabre_CardDAV_Plugin()); +$server->addPlugin(new Sabre_DAVACL_Plugin()); + +// And off we go! +$server->exec(); diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css new file mode 100644 index 0000000000..8d1c8b69c3 --- /dev/null +++ b/apps/contacts/css/styles.css @@ -0,0 +1 @@ + diff --git a/apps/contacts/details.php b/apps/contacts/details.php new file mode 100644 index 0000000000..7ab1b64de2 --- /dev/null +++ b/apps/contacts/details.php @@ -0,0 +1,57 @@ +. + * + */ + +// Init owncloud +require_once('../../lib/base.php'); + +$id = $_GET['id']; + +$l10n = new OC_L10N('contacts'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo $l10n->t('You need to log in!'); + exit(); +} + + +$card = OC_Contacts_Addressbook::findCard( $id ); +if( $card === false ){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => $l10n->t('Can not find Contact!')))); + exit(); +} + +$addressbook = OC_Contacts_Addressbook::findAddressbook( $card['addressbookid'] ); +if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => $l10n->t('This is not your contact!')))); + exit(); +} + +$vcard = Sabre_VObject_Reader::read($card['carddata']); +$details = OC_Contacts_Addressbook::structureContact($vcard); + +$tmpl = new OC_Template('contacts','_details'); +$tmpl->assign('details',$details); +$tmpl->assign('id',$id); +$page = $tmpl->fetchPage(); + +echo json_encode( array( 'status' => 'success', 'data' => array( 'page' => $page ))); diff --git a/apps/contacts/img/icon.png b/apps/contacts/img/icon.png new file mode 100644 index 0000000000..ea2ed9e333 Binary files /dev/null and b/apps/contacts/img/icon.png differ diff --git a/apps/contacts/index.php b/apps/contacts/index.php new file mode 100644 index 0000000000..2d5bcefd87 --- /dev/null +++ b/apps/contacts/index.php @@ -0,0 +1,68 @@ +. + * + */ + +function contactsort($a,$b){ + return strcmp($a['name'],$b['name']); +} + +// Init owncloud +require_once('../../lib/base.php'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + header( 'Location: '.OC_Helper::linkTo( '', 'index.php' )); + exit(); +} + +// Load the files we need +OC_App::setActiveNavigationEntry( 'contacts_index' ); + +// Load a specific user? +$id = isset( $_GET['id'] ) ? $_GET['id'] : null; + +// Addressbooks to load +$openaddressbooks = explode(';',OC_Preferences::getValue(OC_User::getUser(),'contacts','openaddressbooks',null)); + +$contacts = array(); +foreach( $openaddressbooks as $addressbook ){ + $addressbookcontacts = OC_Contacts_Addressbook::allCards($addressbook); + foreach( $addressbookcontacts as $contact ){ + $contacts[] = array( 'name' => $contact['fullname'], 'id' => $contact['id'] ); + } +} + + +usort($contacts,'contactsort'); +$details = array(); + +if( !is_null($id) || count($contacts)){ + $contact = OC_Contacts_Addressbook::findCard(is_null($id)?$contacts[0]['id']:$id); + $vcard = Sabre_VObject_Reader::read($contact['carddata']); + $details = OC_Contacts_Addressbook::structureContact($vcard); +} + +// Process the template +$tmpl = new OC_Template( 'contacts', 'index', 'user' ); +$tmpl->assign('contacts', $contacts); +$tmpl->assign('details', $details ); +$tmpl->assign('id',$id); +$tmpl->printPage(); diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js new file mode 100644 index 0000000000..045562b496 --- /dev/null +++ b/apps/contacts/js/interface.js @@ -0,0 +1,14 @@ +$(document).ready(function(){ + $('.contacts_contacts').find('li').live('click',function(){ + var id = $(this).attr('x-id'); + $.getJSON('details.php',{'id':id},function(jsondata){ + if(jsondata.status == 'success'){ + $('.contacts_details').html(jsondata.data.page); + } + else{ + alert(jsondata.data.message); + } + }); + return false; + }); +}); diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php new file mode 100644 index 0000000000..c0f26c7df5 --- /dev/null +++ b/apps/contacts/lib/addressbook.php @@ -0,0 +1,287 @@ +. + * + */ +/* + * + * The following SQL statement is just a help for developers and will not be + * executed! + * + * CREATE TABLE contacts_addressbooks ( + * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + * userid VARCHAR(255) NOT NULL, + * displayname VARCHAR(255), + * uri VARCHAR(100), + * description TEXT, + * ctag INT(11) UNSIGNED NOT NULL DEFAULT '1' + * ); + * + * CREATE TABLE contacts_cards ( + * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + * addressbookid INT(11) UNSIGNED NOT NULL, + * fullname VARCHAR(255), + * carddata TEXT, + * uri VARCHAR(100), + * lastmodified INT(11) UNSIGNED + * ); + */ + +/** + * This class manages our addressbooks. + */ +class OC_Contacts_Addressbook{ + public static function allAddressbooks($uid){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ?' ); + $result = $stmt->execute(array($uid)); + + $addressbooks = array(); + while( $row = $result->fetchRow()){ + $addressbooks[] = $row; + } + + return $addressbooks; + } + + public static function allAddressbooksWherePrincipalURIIs($principaluri){ + $uid = self::extractUserID($principaluri); + return self::allAddressbooks($uid); + } + + public static function findAddressbook($id){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); + $result = $stmt->execute(array($id)); + + return $result->fetchRow(); + } + + public static function addAddressbook($userid,$name,$description){ + $all = self::allAddressbooks($userid); + $uris = array(); + foreach($all as $i){ + $uris[] = $i['uri']; + } + + $uri = self::createURI('name', $uris ); + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + + return OC_DB::insertid(); + } + + public static function addAddressbookFromDAVData($principaluri,$uri,$name,$description){ + $userid = self::extractUserID($principaluri); + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + + return OC_DB::insertid(); + } + + public static function editAddressbook($id,$name,$description){ + // Need these ones for checking uri + $addressbook = self::find($id); + + if(is_null($name)){ + $name = $addressbook['name']; + } + if(is_null($description)){ + $description = $addressbook['description']; + } + + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?' ); + $result = $stmt->execute(array($name,$description,$id)); + + return true; + } + + public static function touchAddressbook($id){ + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET ctag = ctag + 1 WHERE id = ?' ); + $stmt->execute(array($id)); + + return true; + } + + public static function deleteAddressbook($id){ + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); + $stmt->execute(array($id)); + + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE addressbookid = ?' ); + $stmt->execute(array($id)); + + return true; + } + + public static function allCards($id){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ?' ); + $result = $stmt->execute(array($id)); + + $addressbooks = array(); + while( $row = $result->fetchRow()){ + $addressbooks[] = $row; + } + + return $addressbooks; + } + + public static function findCard($id){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE id = ?' ); + $result = $stmt->execute(array($id)); + + return $result->fetchRow(); + } + + public static function findCardWhereDAVDataIs($aid,$uri){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); + $result = $stmt->execute(array($aid,$uri)); + + return $result->fetchRow(); + } + + public static function addCard($id,$data){ + $fn = null; + $uri = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + elseif(is_null($uri) && $property->name == 'UID' ){ + $uri = $property->value.'.vcf'; + } + } + $uri = self::createUID().'.vcf'; + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + + self::touch($id); + + return OC_DB::insertid; + } + + public static function addCardFromDAVData($id,$uri,$data){ + $fn = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + } + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + + self::touch($id); + + return OC_DB::insertid; + } + + public static function editCard($id, $data){ + $oldcard = self::findCard($id,$aid,$uri); + $fn = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + } + + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); + $result = $stmt->execute(array($fn,$data,time(),$id)); + + self::touch($oldcard['addressbookid']); + + return true; + } + + public static function editCardFromDAVData($aid,$uri,$data){ + $oldcard = self::findCardWhereDAVDataIs($aid,$uri); + + $fn = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + } + + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); + $result = $stmt->execute(array($fn,$data,time(),$oldcard['id'])); + + self::touch($oldcard['addressbookid']); + + return true; + } + + public static function deleteCard($id){ + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); + $stmt->execute(array($id)); + + return true; + } + + public static function deleteCardFromDAVData($aid,$uri){ + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE addressbookid = ? AND uri=?' ); + $stmt->execute(array($aid,$uri)); + + return true; + } + + public static function createURI($name,$existing){ + $name = strtolower($name); + $newname = $name; + $i = 1; + while(in_array($newname,$existing)){ + $newname = $name.$i; + $i = $i + 1; + } + return $newname; + } + + public static function createUID(){ + return substr(md5(rand().time()),0,10); + } + + public static function extractUserID($principaluri){ + list($prefix,$userid) = Sabre_DAV_URLUtil::splitPath($principaluri); + return $userid; + } + + public static function structureContact($object){ + $details = array(); + foreach($object->children as $property){ + $temp = array( + 'name' => $property->name, + 'value' => ($property->name == 'PHOTO' || $property->name == 'LOGO' ? null : $property->value ), + 'parameters' => array()); + foreach($property->parameters as $parameter){ + $temp['parameters'][] = array( 'name' => $parameter->name, 'value' => $parameter->value); + } + if(array_key_exists($property->name,$details)){ + $details[$property->name][] = $temp; + } + else{ + $details[$property->name] = array($temp); + } + } + return $details; + } +} diff --git a/apps/contacts/lib/connector_sabre.php b/apps/contacts/lib/connector_sabre.php new file mode 100644 index 0000000000..98e2598b3a --- /dev/null +++ b/apps/contacts/lib/connector_sabre.php @@ -0,0 +1,186 @@ + $i['id'], + 'uri' => $i['uri'], + 'principaluri' => 'principals/'.$i['userid'], + '{DAV:}displayname' => $i['displayname'], + '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => $i['description'], + '{http://calendarserver.org/ns/}getctag' => $i['ctag'], + ); + } + + return $addressbooks; + } + + + /** + * Updates an addressbook's properties + * + * See Sabre_DAV_IProperties for a description of the mutations array, as + * well as the return value. + * + * @param mixed $addressbookid + * @param array $mutations + * @see Sabre_DAV_IProperties::updateProperties + * @return bool|array + */ + public function updateAddressBook($addressbookid, array $mutations) { + $name = null; + $description = null; + + foreach($mutations as $property=>$newvalue) { + switch($property) { + case '{DAV:}displayname' : + $name = $newvalue; + break; + case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : + $description = $newvalue; + break; + default : + // If any unsupported values were being updated, we must + // let the entire request fail. + return false; + } + } + + OC_Contacts_Addressbook::editAddressbook($addressbookid,$name,$description); + + return true; + + } + + /** + * Creates a new address book + * + * @param string $principaluri + * @param string $url Just the 'basename' of the url. + * @param array $properties + * @return void + */ + public function createAddressBook($principaluri, $url, array $properties) { + + $displayname = null; + $description = null; + + foreach($properties as $property=>$newvalue) { + + switch($property) { + case '{DAV:}displayname' : + $displayname = $newvalue; + break; + case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : + $description = $newvalue; + break; + default : + throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' . $property); + } + + } + + OC_Contacts_Addressbook::addAddressbookFromDAVData($principaluri,$url,$name,$description); + } + + /** + * Deletes an entire addressbook and all its contents + * + * @param int $addressbookid + * @return void + */ + public function deleteAddressBook($addressbookid) { + OC_Contacts_Addressbook::deleteAddressbook($addressbookid); + } + + /** + * Returns all cards for a specific addressbook id. + * + * @param mixed $addressbookid + * @return array + */ + public function getCards($addressbookid) { + $data = OC_Contacts_Addressbook::allCards($addressbookid); + $cards = array(); + foreach($data as $i){ + $cards[] = array( + 'id' => $i['id'], + 'carddata' => $i['carddata'], + 'uri' => $i['uri'], + 'lastmodified' => $i['lastmodified'] ); + } + + return $cards; + } + + /** + * Returns a specfic card + * + * @param mixed $addressbookid + * @param string $carduri + * @return array + */ + public function getCard($addressbookid, $carduri) { + return OC_Contacts_Addressbook::findCardWhereDAVDataIs($addressbookid,$carduri); + + } + + /** + * Creates a new card + * + * @param mixed $addressbookid + * @param string $carduri + * @param string $carddata + * @return bool + */ + public function createCard($addressbookid, $carduri, $carddata) { + OC_Contacts_Addressbook::addCardFromDAVData($addressbookid, $carduri, $carddata); + return true; + } + + /** + * Updates a card + * + * @param mixed $addressbookid + * @param string $carduri + * @param string $carddata + * @return bool + */ + public function updateCard($addressbookid, $carduri, $carddata) { + return OC_Contacts_Addressbook::editCardFromDAVData($addressbookid, $carduri, $carddata); + } + + /** + * Deletes a card + * + * @param mixed $addressbookid + * @param string $carduri + * @return bool + */ + public function deleteCard($addressbookid, $carduri) { + return OC_Contacts_Addressbook::deleteCardFromDAVData($addressbookid, $carduri); + } +} diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php new file mode 100644 index 0000000000..62386421cd --- /dev/null +++ b/apps/contacts/photo.php @@ -0,0 +1,85 @@ +. + * + */ + +// Init owncloud +require_once('../../lib/base.php'); + +$id = $_GET['id']; + +$l10n = new OC_L10N('contacts'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo $l10n->t('You need to log in!'); + exit(); +} + + +$card = OC_Contacts_Addressbook::findCard( $id ); +if( $card === false ){ + echo $l10n->t('Can not find Contact!'); + exit(); +} + +$addressbook = OC_Contacts_Addressbook::findAddressbook( $card['addressbookid'] ); +if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ + echo $l10n->t('This is not your contact!'); + exit(); +} + +$content = Sabre_VObject_Reader::read($card['carddata']); + +// Photo :-) +foreach($content->children as $child){ + if($child->name == 'PHOTO'){ + $mime = 'image/jpeg'; + foreach($child->parameters as $parameter){ + if( $parameter->name == 'TYPE' ){ + $mime = $parameter->value; + } + } + $photo = base64_decode($child->value); + header('Content-Type: '.$mime); + header('Content-Length: ' . strlen($photo)); + echo $photo; + exit(); + } +} +// Logo :-/ +foreach($content->children as $child){ + if($child->name == 'PHOTO'){ + $mime = 'image/jpeg'; + foreach($child->parameters as $parameter){ + if($parameter->name == 'TYPE'){ + $mime = $parameter->value; + } + } + $photo = base64_decode($child->value()); + header('Content-Type: '.$mime); + header('Content-Length: ' . strlen($photo)); + echo $photo; + exit(); + } +} + +// Not found :-( +echo $l10n->t('This card does not contain photo data!'); diff --git a/apps/contacts/templates/_contacts.php b/apps/contacts/templates/_contacts.php new file mode 100644 index 0000000000..bf633b79b0 --- /dev/null +++ b/apps/contacts/templates/_contacts.php @@ -0,0 +1,3 @@ + +
  • + diff --git a/apps/contacts/templates/_details.php b/apps/contacts/templates/_details.php new file mode 100644 index 0000000000..e27b17ef2e --- /dev/null +++ b/apps/contacts/templates/_details.php @@ -0,0 +1,4 @@ +Name + + + \ No newline at end of file diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php new file mode 100644 index 0000000000..0cd214bfb1 --- /dev/null +++ b/apps/contacts/templates/index.php @@ -0,0 +1,13 @@ + + +
    + +
    +
    + inc("_details"); ?> +
    diff --git a/apps/contacts/temporaryupdate.php b/apps/contacts/temporaryupdate.php new file mode 100644 index 0000000000..bb5ff7604f --- /dev/null +++ b/apps/contacts/temporaryupdate.php @@ -0,0 +1,13 @@ +getPrincipalByPath('principals/'.$user); + if(!isset($foo)){ + OC_Connector_Sabre_Principal::addPrincipal(array('uid'=>$user)); + } +} +echo "done"; \ No newline at end of file diff --git a/core/js/js.js b/core/js/js.js index a83d6abb6a..00618cb30c 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1,3 +1,9 @@ +/** + * translate a string + * @param app the id of the app for which to translate the string + * @param text the string to translate + * @return string + */ function t(app,text){ if( !( app in t.cache )){ @@ -22,9 +28,22 @@ t.cache={}; OC={ webroot:oc_webroot, coreApps:['files','admin','log','search','settings','core'], + /** + * get an absolute url to a file in an appen + * @param app the id of the app the file belongs to + * @param file the file path relative to the app folder + * @return string + */ linkTo:function(app,file){ return OC.filePath(app,'',file); }, + /** + * get the absolute url for a file in an app + * @param app the id of the app + * @param type the type of the file to link to (e.g. css,img,ajax.template) + * @param file the filename + * @return string + */ filePath:function(app,type,file){ var isCore=OC.coreApps.indexOf(app)!=-1; app+='/'; @@ -39,12 +58,28 @@ OC={ link+=file; return link; }, + /** + * get the absolute path to an image file + * @param app the app id to which the image belongs + * @param file the name of the image file + * @return string + * + * if no extention is given for the image, it will automatically decide between .png and .svg based on what the browser supports + */ imagePath:function(app,file){ if(file.indexOf('.')==-1){//if no extention is given, use png or svg depending on browser support file+=(SVGSupport())?'.svg':'.png' } return OC.filePath(app,'img',file); }, + /** + * load a script for the server and load it + * @param app the app id to which the script belongs + * @param script the filename of the script + * @param ready event handeler to be called when the script is loaded + * + * if the script is already loaded, the event handeler will be called directly + */ addScript:function(app,script,ready){ var path=OC.filePath(app,'js',script+'.js'); if(OC.addStyle.loaded.indexOf(path)==-1){ @@ -60,6 +95,11 @@ OC={ } } }, + /** + * load a css file and load it + * @param app the app id to which the css style belongs + * @param style the filename of the css file + */ addStyle:function(app,style){ var path=OC.filePath(app,'css',style+'.css'); if(OC.addScript.loaded.indexOf(path)==-1){ @@ -68,6 +108,10 @@ OC={ $('head').append(style); } }, + /** + * do a search query and display the results + * @param query the search query + */ search:function(query){ if(query){ OC.addStyle('search','results'); @@ -85,6 +129,9 @@ OC.search.lastResults={}; OC.addStyle.loaded=[]; OC.addScript.loaded=[]; +/** + * implement Array.filter for browsers without native support + */ if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp*/) { var len = this.length >>> 0; @@ -103,6 +150,9 @@ if (!Array.prototype.filter) { return res; } } +/** + * implement Array.indexOf for browsers without native support + */ if (!Array.prototype.indexOf){ Array.prototype.indexOf = function(elt /*, from*/) { @@ -125,10 +175,25 @@ if (!Array.prototype.indexOf){ }; } +/** + * check if the browser support svg images + */ function SVGSupport() { return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0"); } +/** + * prototypal inharitence functions + * + * usage: + * MySubObject=object(MyObject) + */ +function object(o) { + function F() {} + F.prototype = o; + return new F(); +} + $(document).ready(function(){ if(!SVGSupport()){//replace all svg images with png images for browser that dont support svg $('img.svg').each(function(index,element){ diff --git a/lib/base.php b/lib/base.php index 520c12d4df..d02f63a276 100644 --- a/lib/base.php +++ b/lib/base.php @@ -35,23 +35,23 @@ class OC{ */ public static $DOCUMENTROOT = ''; /** - * TODO: What's this for? + * The installation path for owncloud on the server (e.g. /srv/http/owncloud) */ public static $SERVERROOT = ''; /** - * TODO: What's this for? + * the current request path relative to the owncloud root (e.g. files/index.php) */ public static $SUBURI = ''; /** - * TODO: What's this for? + * the owncloud root path for http requests (e.g. owncloud/) */ public static $WEBROOT = ''; /** - * TODO: What's this for? + * the folder that stores that data files for the filesystem of the user (e.g. /srv/http/owncloud/data/myusername/files) */ public static $CONFIG_DATADIRECTORY = ''; /** - * TODO: What's this for? + * the folder that stores the data for the root filesystem (e.g. /srv/http/owncloud/data) */ public static $CONFIG_DATADIRECTORY_ROOT = ''; diff --git a/lib/connector/sabre/principal.php b/lib/connector/sabre/principal.php index b3070087fd..9c386f85e1 100644 --- a/lib/connector/sabre/principal.php +++ b/lib/connector/sabre/principal.php @@ -37,8 +37,8 @@ class OC_Connector_Sabre_Principal implements Sabre_DAVACL_IPrincipalBackend { // 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; + $array = explode('/',$row['uri']); + if ($array[1] != $params['uid']) continue; $deleteprincipal->execute(array($row['id'])); $deletegroup->execute(array($row['id'],$row['id'])); }