Completed
Pull Request — master (#111)
by
unknown
05:40 queued 24s
created

PageController::geodecode()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

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