summaryrefslogtreecommitdiffstats
path: root/apps/bookmarks/bookmarksHelper.php
blob: 92baac2f5114ba3d3d32e8d239b9e48dd74031af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?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;
	}
}