Completed
Pull Request — master (#115)
by Thomas
05:40
created

PageController::bboxSearch()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2
Metric Value
dl 0
loc 7
ccs 0
cts 5
cp 0
rs 9.4286
cc 1
eloc 5
nc 1
nop 2
crap 2
1
<?php
2
/**
3
 * ownCloud - maps
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the COPYING file.
7
 *
8
 * @author Sander Brand <[email protected]>
9
 * @copyright Sander Brand 2014
10
 */
11
12
namespace OCA\Maps\Controller;
13
14
use \OCA\Maps\Db\DeviceMapper;
15
use \OCP\IRequest;
16
use \OCP\AppFramework\Http\TemplateResponse;
17
use \OCP\AppFramework\Controller;
18
use \OCA\Maps\Db\CacheManager;
19
20
class PageController extends Controller {
21
22
	private $userId;
23
	private $cacheManager;
24
	private $deviceMapper;
25
	public function __construct($appName, IRequest $request, $userId,
26
								CacheManager $cacheManager,
27
								DeviceMapper	$deviceMapper) {
28
		parent::__construct($appName, $request);
29
		$this -> userId = $userId;
30
		$this -> cacheManager = $cacheManager;
31
		$this -> deviceMapper = $deviceMapper;
32
	}
33
34
	/**
35
	 * CAUTION: the @Stuff turn off security checks, for this page no admin is
36
	 *          required and no CSRF check. If you don't know what CSRF is, read
37
	 *          it up in the docs or you might create a security hole. This is
38
	 *          basically the only required method to add this exemption, don't
39
	 *          add it to any other method if you don't exactly know what it does
40
	 *
41
	 * @NoAdminRequired
42
	 * @NoCSRFRequired
43
	 */
44
	public function index() {
45
46
		$params = array('user' => $this -> userId,'devices'=>$this->deviceMapper->findAll($this->userId));
47
		$response = new TemplateResponse('maps', 'main', $params);
48
		if (class_exists('OCP\AppFramework\Http\ContentSecurityPolicy')) {
49
			$csp = new \OCP\AppFramework\Http\ContentSecurityPolicy();
50
			// map tiles
51
			$csp->addAllowedImageDomain('http://*.mqcdn.com');
52
			// marker icons
53
			$csp->addAllowedImageDomain('https://api.tiles.mapbox.com');
54
			// inline images
55
			$csp->addAllowedScriptDomain('data:');
56
			$response->setContentSecurityPolicy($csp);
57
		}
58
		return $response;
59
		// templates/main.php
60
	}
61
62
	/**
63
	 * Get an layer
64
	 * @NoAdminRequired
65
	 * @NoCSRFRequired
66
	 */
67
	public function getlayer() {
68
		$layer = ($this -> params('layer')) ? $this -> params('layer') : null;
69
		if ($layer === "contacts") {
70
			if (\OCP\App::isEnabled('contacts')) {
71
72
			} else {
73
				OCP\Util::writeLog('maps', "App contacts missing for Maps", \OCP\Util::WARN);
74
			}
75
		}
76
	}
77
78
	/**
79
	 * Simply method that posts back the payload of the request
80
	 * @NoAdminRequired
81
	 * @NoCSRFRequired
82
	 */
83
	public function doProxy($echo) {
84
		$url = ($this -> params('url')) ? $this -> params('url') : '';
85
		$allowedHosts = array('overpass.osm.rambler.ru', 'overpass-api.de', 'dev.virtualearth.net', 'router.project-osrm.org', 'nominatim.openstreetmap.org', 'maps.googleapis.com');
86
		$parseUrl = parse_url($url);
87
88
		if (in_array($parseUrl['host'], $allowedHosts)) {
89
			header('Content-Type: application/javascript');
90
			$split = explode('url=', $_SERVER['REQUEST_URI']);
91
			echo $this -> getURL($split[1]);
92
		}
93
		die();
94
	}
95
96
	/**
97
	 * Simply method that posts back the payload of the request
98
	 * @NoAdminRequired
99
	 * @NoCSRFRequired
100
	 */
101
	public function search() {
102
		$cm = \OC::$server -> getContactsManager();
103
		$kw = $this -> params('search');
104
		$bbox = $this -> params('bbox');
105
		$response = array('contacts'=>array(),'nodes'=>array(),'addresses'=>array());
106
		
107
		$contacts = $cm -> search($kw, array('FN', 'ADR'));
108
		foreach ($contacts as $r) {
109
			$data = array();
0 ignored issues
show
Unused Code introduced by
$data is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
110
			$contact = $r;
111
			for($i=0; $i<count($r['ADR']); $i++){
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
112
				$lookupAdr = implode(',', array_filter($r['ADR'][$i]));
113
				$lookup = $this -> doAdresslookup($lookupAdr);
114
				$contact ['location'][] = $lookup[0];
115
			}
116
			array_push($response['contacts'],$contact);
117
		}
118
		$response['nodes'] = $this->bboxSearch($kw, $bbox);
119
		$addresses = $this->doAdresslookup(urlencode($kw));
120
		foreach($addresses as $address){
121
			array_push($response['addresses'],$address);
122
			if($address->osm_type === "node"){
123
			}
124
		}
125
		//$response['addresses'] = (array)($this->doAdresslookup($kw));
126
		
127
		return $response;
128
	}
129
130
	/**
131
	 * Simply method that posts back the payload of the request
132
	 * @NoAdminRequired
133
	 * @NoCSRFRequired
134
	 */
135
  public function geodecode(){
136
   $lat = $this->params('lat');
137
   $lng = $this->params('lng');
138
   $zoom = $this->params('zoom');
139
   
140
   $hash = md5($lat.','.$lng.'@'.$zoom);
141
   
142
   $checkCache = $this -> checkGeoCache($hash);
143
  if(!$checkCache){
144
      $url = 'http://nominatim.openstreetmap.org/reverse/?format=json&[email protected]&lat='.$lat.'&lng='. $lng.'&zoom=67108864';
145
      $response = $this->getURL($url,false);
146
      if($response){
147
        $this -> cacheManager -> insert($hash, $response);
148
      }
149
   } else {
150
     $response = $checkCache;
151
   }
152
   echo $response;
153
   die();
154
  } 
155
	/**
156
	 * Simply method that posts back the payload of the request
157
	 * @NoAdminRequired
158
	 * @NoCSRFRequired
159
	 */
160
	public function adresslookup() {
161
		//
162
		$street = ($this -> params('street')) ? $this -> params('street') : '';
163
		$city = ($this -> params('city')) ? $this -> params('city') : '';
164
		$country = ($this -> params('country')) ? $this -> params('country') : '';
165
166
		$q = urlencode($street . ',' . $city . ',' . $country);
167
		$r = (array) $this -> doAdresslookup($q);
168
		echo json_encode($r[0]);
169
		die();
170
	}
171
172
	private function bboxSearch($q,$bbox){
173
		$apiUrl = 'http://nominatim.openstreetmap.org/search?format=json&limit=100&q=' . $q . '&viewbox='.$bbox.'&bounded=1';
174
		//echo $apiUrl;
175
		$r = $this -> getURL($apiUrl, false);
176
		$s = (array)json_decode($r);
177
		return $s;
178
	}
179
180
	/**
181
	 * @param string $q
182
	 */
183
	private function doAdresslookup($q) {
184
185
		$q = str_replace(" ", "+", $q);
186
		$geohash = md5($q);
187
		$checkCache = $this -> checkGeoCache($geohash);
188
		if (!$checkCache) {
189
			//$apiUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address='. str_replace(' ','+',$q) .'&key=AIzaSyAIHAIBv_uPKZgoxQt0ingc1gWsdAhG7So';
190
			//$apiUrl = 'http://nominatim.openstreetmap.org/search?format=json&street='. $street . '&city='.$city.'&country='.$country.'&limit=1';
191
			$apiUrl = 'http://nominatim.openstreetmap.org/search?format=json&q=' . $q;
192
			$r = $this -> getURL($apiUrl, false);
193
			$s = (array)json_decode($r);
194
195
			$r -> apiUrl = $apiUrl;
196
			$r = $s;
197
			$this -> cacheManager -> insert($geohash, $s);
198
		} else {
199
			$checkCache -> cachedResult = true;
200
			$r = $checkCache;
201
		}
202
		return $r;
203
204
	}
205
206
	/**
207
	 * @param string $hash
208
	 */
209
	private function checkGeoCache($hash) {
210
		return $this -> cacheManager -> check($hash);
211
	}
212
213
	private function getURL($url, $userAgent = true) {
214
		$ch = curl_init();
215
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
216
		curl_setopt($ch, CURLOPT_HEADER, 0);
217
    curl_setopt($ch, CURLOPT_TIMEOUT, 900); 
218
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
219
		if ($userAgent) {
220
			curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
221
		}
222
		curl_setopt($ch, CURLOPT_URL, $url);
223
		$tmp = curl_exec($ch);
224
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
225
		curl_close($ch);
226
		if ($httpCode === 404) {
227
			return false;
228
		} else {
229
			if ($tmp !== false) {
230
				return $tmp;
231
			}
232
		}
233
234
	}
235
236
}
237