diff --git a/.htaccess b/.htaccess index 92825ea92d..1812482675 100644 --- a/.htaccess +++ b/.htaccess @@ -1,5 +1,7 @@ ErrorDocument 404 //owncloud/core/templates/404.php -php_value upload_max_filesize 512M -php_value post_max_size 512M -SetEnv htaccessWorking true + + php_value upload_max_filesize 512M + php_value post_max_size 512M + SetEnv htaccessWorking true + Options -Indexes diff --git a/apps/bookmarks/addBm.php b/apps/bookmarks/addBm.php new file mode 100644 index 0000000000..2dab33afb2 --- /dev/null +++ b/apps/bookmarks/addBm.php @@ -0,0 +1,48 @@ +. +* +*/ + +require_once('../../lib/base.php'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + header( 'Location: '.OC_Helper::linkTo( '', 'index.php' )); + exit(); +} + +require_once('bookmarksHelper.php'); + +OC_App::setActiveNavigationEntry( 'bookmarks_index' ); + +OC_Util::addScript('bookmarks','addBm'); +OC_Util::addStyle('bookmarks', 'bookmarks'); + +$tmpl = new OC_Template( 'bookmarks', 'addBm', 'user' ); + +$url = isset($_GET['url']) ? urldecode($_GET['url']) : ''; +$metadata = getURLMetadata($url); + +$tmpl->assign('URL', htmlentities($metadata['url'])); +$tmpl->assign('TITLE', htmlentities($metadata['title'])); +$tmpl->assign('DESCRIPTION', htmlentities($metadata['description'])); + +$tmpl->printPage(); \ No newline at end of file diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php index d3d23aad26..78913f7a13 100644 --- a/apps/bookmarks/ajax/addBookmark.php +++ b/apps/bookmarks/ajax/addBookmark.php @@ -51,15 +51,14 @@ $query = OC_DB::prepare(" $params=array( - urldecode($_GET["url"]), - urldecode($_GET["title"]), - urldecode($_GET["description"]), + htmlspecialchars_decode($_GET["url"]), + htmlspecialchars_decode($_GET["title"]), + htmlspecialchars_decode($_GET["description"]), OC_User::getUser() ); $query->execute($params); $b_id = OC_DB::insertid(); - if($b_id !== false) { $query = OC_DB::prepare(" INSERT INTO *PREFIX*bookmarks_tags diff --git a/apps/bookmarks/ajax/delBookmark.php b/apps/bookmarks/ajax/delBookmark.php index a47bd2b9ea..bf1611fe5c 100644 --- a/apps/bookmarks/ajax/delBookmark.php +++ b/apps/bookmarks/ajax/delBookmark.php @@ -35,18 +35,33 @@ if( !OC_User::isLoggedIn()){ exit(); } +$params=array( + htmlspecialchars_decode($_GET["url"]), + OC_User::getUser() + ); + $query = OC_DB::prepare(" - DELETE FROM *PREFIX*bookmarks + SELECT id FROM *PREFIX*bookmarks WHERE url LIKE ? AND user_id = ? "); - -$params=array( - urldecode($_GET["url"]), - OC_User::getUser() - ); -$result = $query->execute($params); +$id = $query->execute($params)->fetchOne(); + +$query = OC_DB::prepare(" + DELETE FROM *PREFIX*bookmarks + WHERE id = $id + "); + +$result = $query->execute(); + + +$query = OC_DB::prepare(" + DELETE FROM *PREFIX*bookmarks_tags + WHERE bookmark_id = $id + "); + +$result = $query->execute(); // var_dump($params); echo json_encode( array( "status" => "success", "data" => array())); diff --git a/apps/bookmarks/ajax/getMeta.php b/apps/bookmarks/ajax/getMeta.php new file mode 100644 index 0000000000..e9fe0d684d --- /dev/null +++ b/apps/bookmarks/ajax/getMeta.php @@ -0,0 +1,44 @@ +. +* +*/ + +//no apps or filesystem +$RUNTIME_NOSETUPFS=true; + +require_once('../../../lib/base.php'); + +// We send json data +header( 'Content-Type: application/jsonrequest' ); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'Authentication error' ))); + exit(); +} + +// $metadata = array(); + +require '../bookmarksHelper.php'; +$metadata = getURLMetadata(htmlspecialchars_decode($_GET["url"])); + + +echo json_encode( array( 'status' => 'success', 'data' => $metadata)); diff --git a/apps/bookmarks/ajax/recordClick.php b/apps/bookmarks/ajax/recordClick.php index 4dcb0b4a0d..116daea8bb 100644 --- a/apps/bookmarks/ajax/recordClick.php +++ b/apps/bookmarks/ajax/recordClick.php @@ -40,7 +40,7 @@ $query = OC_DB::prepare(" AND url LIKE ? "); -$params=array(OC_User::getUser(), urldecode($_GET["url"])); +$params=array(OC_User::getUser(), htmlspecialchars_decode($_GET["url"])); $bookmarks = $query->execute($params); header( "HTTP/1.1 204 No Content" ); diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php index 1217a64c6e..ceecc5b7ef 100644 --- a/apps/bookmarks/ajax/updateList.php +++ b/apps/bookmarks/ajax/updateList.php @@ -27,47 +27,61 @@ $RUNTIME_NOSETUPFS=true; require_once('../../../lib/base.php'); // We send json data -header( "Content-Type: application/jsonrequest" ); +header( 'Content-Type: application/jsonrequest' ); // Check if we are a user if( !OC_User::isLoggedIn()){ - echo json_encode( array( "status" => "error", "data" => array( "message" => "Authentication error" ))); + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'Authentication error' ))); exit(); } $params=array(OC_User::getUser()); +$CONFIG_DBTYPE = OC_Config::getValue( 'dbtype', 'sqlite' ); //Filter for tag? -$filterTag = isset($_GET["tag"]) ? urldecode($_GET["tag"]) : false; +$filterTag = isset($_GET['tag']) ? '%' . htmlspecialchars_decode($_GET['tag']) . '%' : false; if($filterTag){ - $sqlFilterTag = "HAVING INSTR (tags, ?) > 0"; + $sqlFilterTag = 'HAVING tags LIKE ?'; $params[] = $filterTag; } else { $sqlFilterTag = ''; } -$offset = isset($_GET["page"]) ? intval($_GET["page"]) * 10 : 0; +$offset = isset($_GET['page']) ? intval($_GET['page']) * 10 : 0; $params[] = $offset; -$CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); -if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_gc_separator = ", ' '"; +$sort = isset($_GET['sort']) ? ($_GET['sort']) : 'bookmarks_sorting_recent'; +if($sort == 'bookmarks_sorting_clicks') { + $sqlSort = 'clickcount DESC'; } else { - $_gc_separator = "SEPARATOR ' '"; + $sqlSort = 'id DESC'; } -//FIXME: bookmarks without tags are not being retrieved -$query = OC_DB::prepare(" - SELECT url, title, description, GROUP_CONCAT( tag $_gc_separator ) AS tags +if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ + $_gc_separator = ', \' \''; +} else { + $_gc_separator = 'SEPARATOR \' \''; +} + +$query = OC_DB::prepare(' + SELECT url, title, description, + CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) + ELSE \' \' + END + AS tags FROM *PREFIX*bookmarks, *PREFIX*bookmarks_tags - WHERE *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + OR *PREFIX*bookmarks.id NOT IN ( + SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags + ) + ) AND *PREFIX*bookmarks.user_id = ? GROUP BY url - $sqlFilterTag - ORDER BY *PREFIX*bookmarks.id DESC - LIMIT ?, 10"); + '.$sqlFilterTag.' + ORDER BY *PREFIX*bookmarks.'.$sqlSort.' + LIMIT ?, 10'); - $bookmarks = $query->execute($params)->fetchAll(); -echo json_encode( array( "status" => "success", "data" => $bookmarks)); +echo json_encode( array( 'status' => 'success', 'data' => $bookmarks)); diff --git a/apps/bookmarks/appinfo/database.xml b/apps/bookmarks/appinfo/database.xml index 8848974d26..c30db8bd0c 100644 --- a/apps/bookmarks/appinfo/database.xml +++ b/apps/bookmarks/appinfo/database.xml @@ -33,7 +33,7 @@ description text - true + false 255 diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php new file mode 100644 index 0000000000..aee941a27b --- /dev/null +++ b/apps/bookmarks/bookmarksHelper.php @@ -0,0 +1,23 @@ +(.*)<\/title>/si", $page, $match ); + $metadata['title'] = htmlspecialchars_decode(@$match[1]); + + $meta = get_meta_tags($url); + + if(array_key_exists('description', $meta)) { + $metadata['description'] = $meta['description']; + } + + return $metadata; +} \ No newline at end of file diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css index aa28424c0b..9655917244 100644 --- a/apps/bookmarks/css/bookmarks.css +++ b/apps/bookmarks/css/bookmarks.css @@ -23,10 +23,29 @@ text-decoration: underline; } +.bookmarks_sorting { + float: left; + margin-left: 2em; +} + +.bookmarks_sorting li { + padding: 1ex 1em; + border: 1px solid gray; + -moz-border-radius:1em; -webkit-border-radius:1em; border-radius:1em; +} + +.bookmarks_sorting_active { + font-weight: bold; +} + .bookmarks_add { display: none; } +.bookmarks_addBml { + text-decoration: underline; +} + .bookmarks_label { width: 7em; display: inline-block; @@ -60,4 +79,8 @@ .bookmark_tags { color: #ff3333; -} \ No newline at end of file +} + +.clear { + clear:both; +} diff --git a/apps/bookmarks/js/addBm.js b/apps/bookmarks/js/addBm.js new file mode 100644 index 0000000000..7c914f2338 --- /dev/null +++ b/apps/bookmarks/js/addBm.js @@ -0,0 +1,17 @@ +$(document).ready(function() { + $('#bookmark_add_submit').click(addBookmark); +}); + +function addBookmark(event) { + var url = $('#bookmark_add_url').val(); + var title = $('#bookmark_add_title').val(); + var description = $('#bookmark_add_description').val(); + var tags = $('#bookmark_add_tags').val(); + $.ajax({ + url: 'ajax/addBookmark.php', + data: 'url=' + encodeURI(url) + '&title=' + encodeURI(title) + '&description=' + encodeURI(description) + '&tags=' + encodeURI(tags), + success: function(data){ + location.href='index.php'; + } + }); +} \ No newline at end of file diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js index 04db8b42a7..ac87d967be 100644 --- a/apps/bookmarks/js/bookmarks.js +++ b/apps/bookmarks/js/bookmarks.js @@ -1,6 +1,8 @@ var bookmarks_page = 0; var bookmarks_loading = false; +var bookmarks_sorting = 'bookmarks_sorting_recent'; + $(document).ready(function() { $('.bookmarks_addBtn').click(function(event){ $('.bookmarks_add').slideToggle(); @@ -9,6 +11,11 @@ $(document).ready(function() { $('#bookmark_add_submit').click(addBookmark); $(window).scroll(updateOnBottom); + $('#bookmark_add_url').focusout(getMetadata); + $('.' + bookmarks_sorting).addClass('bookmarks_sorting_active'); + + $('.bookmarks_sorting li').click(function(event){changeSorting(this)}); + $('.bookmarks_list').empty(); getBookmarks(); }); @@ -18,9 +25,10 @@ function getBookmarks() { //have patience :) return; } + $.ajax({ url: 'ajax/updateList.php', - data: 'tag=' + encodeURI($('#bookmarkFilterTag').val()) + '&page=' + bookmarks_page, + data: 'tag=' + encodeURI($('#bookmarkFilterTag').val()) + '&page=' + bookmarks_page + '&sort=' + bookmarks_sorting, success: function(bookmarks){ bookmarks_page += 1; $('.bookmark_link').unbind('click', recordClick); @@ -36,6 +44,30 @@ function getBookmarks() { }); } +function getMetadata() { + var url = encodeEntities($('#bookmark_add_url').val()) + $.ajax({ + url: 'ajax/getMeta.php', + data: 'url=' + encodeURIComponent(url), + success: function(pageinfo){ + $('#bookmark_add_url').val(pageinfo.data.url); + $('#bookmark_add_description').val(pageinfo.data.description); + $('#bookmark_add_title').val(pageinfo.data.title); + } + }); +} + +function changeSorting(sortEl) { + $('.' + bookmarks_sorting).removeClass('bookmarks_sorting_active'); + bookmarks_sorting = sortEl.className; + $('.' + bookmarks_sorting).addClass('bookmarks_sorting_active'); + + $('.bookmarks_list').empty(); + bookmarks_page = 0; + bookmarks_loading = false; + getBookmarks(); +} + function addBookmark(event) { var url = encodeEntities($('#bookmark_add_url').val()) var title = encodeEntities($('#bookmark_add_title').val()) @@ -80,6 +112,9 @@ function updateBookmarksList(bookmark) { for ( var i=0, len=tags.length; i' + tags[i] + ' '; } + if(!hasProtocol(bookmark.url)) { + bookmark.url = 'http://' + bookmark.url; + } $('.bookmarks_list').append( '
' + '

' + encodeEntities(bookmark.title) + '

' + @@ -113,3 +148,8 @@ function encodeEntities(s){ return ""; } } + +function hasProtocol(url) { + var regexp = /(ftp|http|https|sftp)/; + return regexp.test(url); +} diff --git a/apps/bookmarks/templates/addBm.php b/apps/bookmarks/templates/addBm.php new file mode 100644 index 0000000000..cbc4910e1a --- /dev/null +++ b/apps/bookmarks/templates/addBm.php @@ -0,0 +1,8 @@ +
+

+

+

+

+

+

+
\ No newline at end of file diff --git a/apps/bookmarks/templates/list.php b/apps/bookmarks/templates/list.php index 769ad81524..4f101d44f9 100644 --- a/apps/bookmarks/templates/list.php +++ b/apps/bookmarks/templates/list.php @@ -1,7 +1,8 @@ - +

@@ -11,6 +12,13 @@

+
+
    +
  • Recent Bookmarks
  • +
  • Most clicks
  • +
+
+
- t('The path to this addressbook is %s', array(OC::$WEBROOT.'/apps/contacts/carddav.php/addressbooks/'.OC_User::getUser().'/'.$_['addressbooks'][0]['uri'])); ?> + t('The path to this addressbook is %s', array(((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].OC::$WEBROOT.'/apps/contacts/carddav.php/addressbooks/'.OC_User::getUser().'/'.$_['addressbooks'][0]['uri'])); ?> diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php index 5048349abc..81b32f2ff5 100644 --- a/apps/contacts/templates/part.details.php +++ b/apps/contacts/templates/part.details.php @@ -30,6 +30,6 @@
- - + <?php echo $l->t('Delete');?> + <?php echo $l->t('Download');?>
diff --git a/apps/contacts/temporaryupdate.php b/apps/contacts/temporaryupdate.php deleted file mode 100644 index 4b6453364e..0000000000 --- a/apps/contacts/temporaryupdate.php +++ /dev/null @@ -1,33 +0,0 @@ -. - * - */ -// Init owncloud -require_once('../../lib/base.php'); -$connector = new OC_Connector_Sabre_Principal; -$users = OC_User::getUsers(); - -foreach($users as $user){ - $foo = $connector->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/apps/files_sharing/ajax/getitem.php b/apps/files_sharing/ajax/getitem.php index cdb59b9cd1..249af6cfa3 100644 --- a/apps/files_sharing/ajax/getitem.php +++ b/apps/files_sharing/ajax/getitem.php @@ -6,17 +6,18 @@ require_once('../lib_share.php'); $userDirectory = "/".OC_User::getUser()."/files"; $source = $userDirectory.$_GET['source']; -$users = OC_Share::getMySharedItem($source); $path = $source; -for ($i = 0; $i < count($users); $i++) { - if ($users[$i]['uid_shared_with'] == OC_Share::PUBLICLINK) { - $users[$i]['token'] = OC_Share::getTokenFromSource($source); +if ($users = OC_Share::getMySharedItem($source)) { + for ($i = 0; $i < count($users); $i++) { + if ($users[$i]['uid_shared_with'] == OC_Share::PUBLICLINK) { + $users[$i]['token'] = OC_Share::getTokenFromSource($source); + } } } $source = dirname($source); while ($source != "" && $source != "/" && $source != "." && $source != $userDirectory) { - $values = array_values(OC_Share::getMySharedItem($source)); - if (count($values) > 0) { + if ($values = OC_Share::getMySharedItem($source)) { + $values = array_values($values); $parentUsers = array(); for ($i = 0; $i < count($values); $i++) { if ($values[$i]['uid_shared_with'] == OC_Share::PUBLICLINK) { diff --git a/apps/files_sharing/ajax/share.php b/apps/files_sharing/ajax/share.php index d9bf4ff7ab..e672cf0240 100644 --- a/apps/files_sharing/ajax/share.php +++ b/apps/files_sharing/ajax/share.php @@ -4,20 +4,25 @@ $RUNTIME_NOAPPS = true; require_once('../../../lib/base.php'); require_once('../lib_share.php'); +$userDirectory = "/".OC_User::getUser()."/files"; $sources = explode(";", $_POST['sources']); $uid_shared_with = $_POST['uid_shared_with']; $permissions = $_POST['permissions']; foreach ($sources as $source) { + // Make sure file exists and can be shared if ($source && OC_FILESYSTEM::file_exists($source) && OC_FILESYSTEM::is_readable($source)) { - $source = "/".OC_User::getUser()."/files".$source; - try { - $shared = new OC_Share($source, $uid_shared_with, $permissions); - if ($uid_shared_with == OC_Share::PUBLICLINK) { - echo $shared->getToken(); - } - } catch (Exception $exception) { - echo "false"; + $source = $userDirectory.$source; + // If the file doesn't exist, it may be shared with the current user + } else if (!$source = OC_Share::getSource($userDirectory.$source)) { + echo "false"; + } + try { + $shared = new OC_Share($source, $uid_shared_with, $permissions); + if ($uid_shared_with == OC_Share::PUBLICLINK) { + echo $shared->getToken(); } + } catch (Exception $exception) { + echo "false"; } } diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index 771d91b93b..c175142319 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -1,9 +1,11 @@ "string")); +OC::$CLASSPATH['OC_Share'] = "apps/files_sharing/lib_share.php"; +OC_Hook::connect("OC_Filesystem", "post_delete", "OC_Share", "deleteItem"); +OC_Hook::connect("OC_Filesystem", "post_rename", "OC_Share", "renameItem"); +OC_Filesystem::registerStorageType("shared", "OC_Filestorage_Shared", array("datadir" => "string")); OC_Util::addScript("files_sharing", "share"); OC_Util::addScript("3rdparty", "chosen/chosen.jquery.min"); OC_Util::addStyle( 'files_sharing', 'sharing' ); diff --git a/apps/files_sharing/get.php b/apps/files_sharing/get.php index e50a319ace..a1b6c316cd 100644 --- a/apps/files_sharing/get.php +++ b/apps/files_sharing/get.php @@ -67,7 +67,7 @@ if ($source !== false) { header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: public"); - header("Content-Disposition: filename='".basename($source)."'"); + header("Content-Disposition: filename=".basename($source)); header("Content-Type: " . $mimetype); header("Content-Length: " . OC_Filesystem::filesize($source)); //download the file @@ -80,4 +80,4 @@ if ($source !== false) { $tmpl->printPage(); die(); } -?> \ No newline at end of file +?> diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 1fae8cbdc9..1bd1ac1075 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -117,7 +117,7 @@ $(document).ready(function() { cache: false, data: data, success: function() { - var option = ""; + var option = ''; $(user).remove(); $(option).appendTo('#share_with'); $('#share_with').trigger('liszt:updated'); @@ -128,7 +128,7 @@ $(document).ready(function() { $('#makelink').live('change', function() { if (this.checked) { var source = $('#dropdown').data('file'); - var uid_shared_with = "public"; + var uid_shared_with = 'public'; var permissions = 0; var data = 'sources='+encodeURIComponent(source)+'&uid_shared_with='+encodeURIComponent(uid_shared_with)+'&permissions='+encodeURIComponent(permissions); $.ajax({ @@ -144,7 +144,7 @@ $(document).ready(function() { }); } else { var source = $('#dropdown').data('file'); - var uid_shared_with = "public"; + var uid_shared_with = 'public'; var data = 'source='+encodeURIComponent(source)+'&uid_shared_with='+encodeURIComponent(uid_shared_with); $.ajax({ type: 'GET', @@ -165,19 +165,19 @@ $(document).ready(function() { }); function createDropdown(filename, files) { - var html = "