123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- <?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';
- //if not (allowed) protocol is given, assume http
- if(preg_match($protocols, $url) == 0) {
- $url = 'http://' . $url;
- }
- $metadata['url'] = $url;
- if (!function_exists('curl_init')){
- return $metadata;
- }
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $page = curl_exec_follow($ch);
- curl_close($ch);
- @preg_match( "/<title>(.*)<\/title>/si", $page, $match );
- $metadata['title'] = htmlspecialchars_decode(@$match[1]);
- return $metadata;
- }
- function addBookmark($url, $title, $tags='') {
- $CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" );
- if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
- $_ut = "strftime('%s','now')";
- } elseif($CONFIG_DBTYPE == 'pgsql') {
- $_ut = 'date_part(\'epoch\',now())::integer';
- } else {
- $_ut = "UNIX_TIMESTAMP()";
- }
-
- //FIXME: Detect when user adds a known URL
- $query = OCP\DB::prepare("
- INSERT INTO *PREFIX*bookmarks
- (url, title, user_id, public, added, lastmodified)
- VALUES (?, ?, ?, 0, $_ut, $_ut)
- ");
-
- if(empty($title)) {
- $metadata = getURLMetadata($url);
- if(isset($metadata['title'])) // Check for problems fetching the title
- $title = $metadata['title'];
- }
-
- if(empty($title)) {
- $l = OC_L10N::get('bookmarks');
- $title = $l->t('unnamed');
- }
-
- $params=array(
- htmlspecialchars_decode($url),
- htmlspecialchars_decode($title),
- OCP\USER::getUser()
- );
- $query->execute($params);
-
- $b_id = OCP\DB::insertid('*PREFIX*bookmarks');
-
- if($b_id !== false) {
- $query = OCP\DB::prepare("
- INSERT INTO *PREFIX*bookmarks_tags
- (bookmark_id, tag)
- VALUES (?, ?)
- ");
-
- $tags = explode(' ', urldecode($tags));
- foreach ($tags as $tag) {
- if(empty($tag)) {
- //avoid saving blankspaces
- continue;
- }
- $params = array($b_id, trim($tag));
- $query->execute($params);
- }
-
- return $b_id;
- }
- }
|