Completed
Pull Request — master (#112)
by
unknown
06: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.4285
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 1
	public function __construct($appName, IRequest $request, $userId,
26
								CacheManager $cacheManager,
27
								DeviceMapper	$deviceMapper) {
28 1
		parent::__construct($appName, $request);
29 1
		$this -> userId = $userId;
30 1
		$this -> cacheManager = $cacheManager;
31 1
		$this -> deviceMapper = $deviceMapper;
32 1
	}
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 1
	public function index() {
45
46 1
		$params = array('user' => $this -> userId,'devices'=>$this->deviceMapper->findAll($this->userId));
47 1
		$response = new TemplateResponse('maps', 'main', $params);
48 1
		if (class_exists('OCP\AppFramework\Http\ContentSecurityPolicy')) {
49 1
			$csp = new \OCP\AppFramework\Http\ContentSecurityPolicy();
50
			// map tiles
51 1
			$csp->addAllowedImageDomain('http://*.mqcdn.com');
52
			// marker icons
53 1
			$csp->addAllowedImageDomain('https://api.tiles.mapbox.com');
54
			// inline images
55 1
			$csp->addAllowedScriptDomain('data:');
56 1
			$csp->addAllowedImageDomain('data:');
57 1
			$response->setContentSecurityPolicy($csp);
58 1
		}
59 1
		return $response;
60
		// templates/main.php
61
	}
62
63
	/**
64
	 * Get an layer
65
	 * @NoAdminRequired
66
	 * @NoCSRFRequired
67
	 */
68
	public function getlayer() {
69
		$layer = ($this -> params('layer')) ? $this -> params('layer') : null;
70
		if ($layer === "contacts") {
71
			if (\OCP\App::isEnabled('contacts')) {
72
73
			} else {
74
				OCP\Util::writeLog('maps', "App contacts missing for Maps", \OCP\Util::WARN);
75
			}
76
		}
77
	}
78
79
	/**
80
	 * Simply method that posts back the payload of the request
81
	 * @NoAdminRequired
82
	 * @NoCSRFRequired
83
	 */
84
	public function doProxy($echo) {
85
		$url = ($this -> params('url')) ? $this -> params('url') : '';
86
		$allowedHosts = array('overpass.osm.rambler.ru', 'overpass-api.de', 'dev.virtualearth.net', 'router.project-osrm.org', 'nominatim.openstreetmap.org', 'maps.googleapis.com');
87
		$parseUrl = parse_url($url);
88
89
		if (in_array($parseUrl['host'], $allowedHosts)) {
90
			header('Content-Type: application/javascript');
91
			$split = explode('url=', $_SERVER['REQUEST_URI']);
92
			echo $this -> getURL($split[1]);
93
		}
94
		die();
95
	}
96
97
	/**
98
	 * Simply method that posts back the payload of the request
99
	 * @NoAdminRequired
100
	 * @NoCSRFRequired
101
	 */
102
	public function search() {
103
		$cm = \OC::$server -> getContactsManager();
104
		$kw = $this -> params('search');
105
		$bbox = $this -> params('bbox');
106
		$response = array('contacts'=>array(),'nodes'=>array(),'addresses'=>array());
107
		
108
		$contacts = $cm -> search($kw, array('FN', 'ADR'));
109
		foreach ($contacts as $r) {
110
			$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...
111
			$contact = $r;
112
			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...
113
				$lookupAdr = implode(',', array_filter($r['ADR'][$i]));
114
				$lookup = $this -> doAdresslookup($lookupAdr);
115
				$contact ['location'][] = $lookup[0];
116
			}
117
			array_push($response['contacts'],$contact);
118
		}
119
		$response['nodes'] = $this->bboxSearch($kw, $bbox);
120
		$addresses = $this->doAdresslookup(urlencode($kw));
121
		foreach($addresses as $address){
122
			array_push($response['addresses'],$address);
123
			if($address->osm_type === "node"){
124
			}
125
		}
126
		//$response['addresses'] = (array)($this->doAdresslookup($kw));
127
		
128
		return $response;
129
	}
130
131
	/**
132
	 * Simply method that posts back the payload of the request
133
	 * @NoAdminRequired
134
	 * @NoCSRFRequired
135
	 */
136
  public function geodecode(){
137
   $lat = $this->params('lat');
138
   $lng = $this->params('lng');
139
   $zoom = $this->params('zoom');
140
   
141
   $hash = md5($lat.','.$lng.'@'.$zoom);
142
   
143
   $checkCache = $this -> checkGeoCache($hash);
144
  if(!$checkCache){
145
      $url = 'http://nominatim.openstreetmap.org/reverse/?format=json&[email protected]&lat='.$lat.'&lng='. $lng.'&zoom=67108864';
146
      $response = $this->getURL($url,false);
147
      if($response){
148
        $this -> cacheManager -> insert($hash, $response);
149
      }
150
   } else {
151
     $response = $checkCache;
152
   }
153
   echo $response;
154
   die();
155
  } 
156
	/**
157
	 * Simply method that posts back the payload of the request
158
	 * @NoAdminRequired
159
	 * @NoCSRFRequired
160
	 */
161
	public function adresslookup() {
162
		//
163
		$street = ($this -> params('street')) ? $this -> params('street') : '';
164
		$city = ($this -> params('city')) ? $this -> params('city') : '';
165
		$country = ($this -> params('country')) ? $this -> params('country') : '';
166
167
		$q = urlencode($street . ',' . $city . ',' . $country);
168
		$r = (array) $this -> doAdresslookup($q);
169
		echo json_encode($r[0]);
170
		die();
171
	}
172
173
	private function bboxSearch($q,$bbox){
174
		$apiUrl = 'http://nominatim.openstreetmap.org/search?format=json&limit=100&q=' . $q . '&viewbox='.$bbox.'&bounded=1';
175
		//echo $apiUrl;
176
		$r = $this -> getURL($apiUrl, false);
177
		$s = (array)json_decode($r);
178
		return $s;
179
	}
180
181
	/**
182
	 * @param string $q
183
	 */
184
	private function doAdresslookup($q) {
185
186
		$q = str_replace(" ", "+", $q);
187
		$geohash = md5($q);
188
		$checkCache = $this -> checkGeoCache($geohash);
189
		if (!$checkCache) {
190
			//$apiUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address='. str_replace(' ','+',$q) .'&key=AIzaSyAIHAIBv_uPKZgoxQt0ingc1gWsdAhG7So';
191
			//$apiUrl = 'http://nominatim.openstreetmap.org/search?format=json&street='. $street . '&city='.$city.'&country='.$country.'&limit=1';
192
			$apiUrl = 'http://nominatim.openstreetmap.org/search?format=json&q=' . $q;
193
			$r = $this -> getURL($apiUrl, false);
194
			$s = (array)json_decode($r);
195
196
			$r -> apiUrl = $apiUrl;
197
			$r = $s;
198
			$this -> cacheManager -> insert($geohash, $s);
199
		} else {
200
			$checkCache -> cachedResult = true;
201
			$r = $checkCache;
202
		}
203
		return $r;
204
205
	}
206
207
	/**
208
	 * @param string $hash
209
	 */
210
	private function checkGeoCache($hash) {
211
		return $this -> cacheManager -> check($hash);
212
	}
213
214
	private function getURL($url, $userAgent = true) {
215
		$ch = curl_init();
216
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
217
		curl_setopt($ch, CURLOPT_HEADER, 0);
218
    curl_setopt($ch, CURLOPT_TIMEOUT, 900); 
219
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
220
		if ($userAgent) {
221
			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');
222
		}
223
		curl_setopt($ch, CURLOPT_URL, $url);
224
		$tmp = curl_exec($ch);
225
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
226
		curl_close($ch);
227
		if ($httpCode === 404) {
228
			return false;
229
		} else {
230
			if ($tmp !== false) {
231
				return $tmp;
232
			}
233
		}
234
235
	}
236
237
}
238