summaryrefslogtreecommitdiffstats
path: root/apps/bookmarks
diff options
context:
space:
mode:
authorFlorian Pritz <bluewind@xinu.at>2011-10-08 19:42:09 +0200
committerFlorian Pritz <bluewind@xinu.at>2011-10-08 20:36:40 +0200
commit4a4e6eb0712bc2f7f188325d2ac87b8aa4927cd8 (patch)
tree1a04b0e0e92379e27feca1fcdbc31d4b59974da3 /apps/bookmarks
parentbbd96fdd39902ae0c2c52342627f705c592d720b (diff)
downloadnextcloud-server-4a4e6eb0712bc2f7f188325d2ac87b8aa4927cd8.tar.gz
nextcloud-server-4a4e6eb0712bc2f7f188325d2ac87b8aa4927cd8.zip
apps/bookmarks: follow redirects when fetching title
This solves a problem where hitting a redirect page would lead to a "302 Found" title. Signed-off-by: Florian Pritz <bluewind@xinu.at>
Diffstat (limited to 'apps/bookmarks')
-rw-r--r--apps/bookmarks/bookmarksHelper.php49
1 files changed, 48 insertions, 1 deletions
diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php
index f66d98a8ccb..b445154f526 100644
--- a/apps/bookmarks/bookmarksHelper.php
+++ b/apps/bookmarks/bookmarksHelper.php
@@ -1,5 +1,52 @@
<?php
+// Source: http://www.php.net/manual/de/function.curl-setopt.php#102121
+// This works around a safe_mode/open_basedir restriction
+function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
+ $mr = $maxredirect === null ? 5 : intval($maxredirect);
+ if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
+ curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
+ } else {
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
+ if ($mr > 0) {
+ $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
+
+ $rch = curl_copy_handle($ch);
+ curl_setopt($rch, CURLOPT_HEADER, true);
+ curl_setopt($rch, CURLOPT_NOBODY, true);
+ curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
+ curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
+ do {
+ curl_setopt($rch, CURLOPT_URL, $newurl);
+ $header = curl_exec($rch);
+ if (curl_errno($rch)) {
+ $code = 0;
+ } else {
+ $code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
+ if ($code == 301 || $code == 302) {
+ preg_match('/Location:(.*?)\n/', $header, $matches);
+ $newurl = trim(array_pop($matches));
+ } else {
+ $code = 0;
+ }
+ }
+ } while ($code && --$mr);
+ curl_close($rch);
+ if (!$mr) {
+ if ($maxredirect === null) {
+ trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
+ } else {
+ $maxredirect = 0;
+ }
+ return false;
+ }
+ curl_setopt($ch, CURLOPT_URL, $newurl);
+ }
+ }
+ return curl_exec($ch);
+}
+
function getURLMetadata($url) {
//allow only http(s) and (s)ftp
$protocols = '/^[hs]{0,1}[tf]{0,1}tp[s]{0,1}\:\/\//i';
@@ -12,7 +59,7 @@ function getURLMetadata($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $page = curl_exec($ch);
+ $page = curl_exec_follow($ch);
curl_close($ch);
@preg_match( "/<title>(.*)<\/title>/si", $page, $match );