<?php
/**
* Handles GET requests from phone by setting up and endpoint /gpstracker/
* There are two calls to the endpoint, nonce and location. Nonce creates a wordpress nonce based
* on the session ID sent from the phone and location updates the database with location data
* from the phone. A valid nonce is required to update the database.
*
* @package Gps_Tracker
* @subpackage Classes/Endpoint
* @author Nick Fox <nickfox@websmithing.com>
* @license MIT/GPLv2 or later
* @link https://www.websmithing.com/gps-tracker
* @copyright 2014 Nick Fox
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Gps_Tracker_Endpoint Class
*
* @since 1.0.0
*/
class Gps_Tracker_Endpoint {
/**
* Set up the Gps Tracker Endpoint Class
*
* @since 1.0.0
*/
public function __construct() {
add_action( 'init', array( $this, 'add_gpstracker_endpoint' ) );
add_action( 'template_redirect', array( $this, 'process_gpstracker_query' ), -1 );
add_filter( 'query_vars', array( $this, 'gpstracker_query_vars' ) );
}
/**
* Registers a new rewrite endpoint for accessing the API
*
* @access public
* @param array $rewrite_rules WordPress Rewrite Rules
* @since 1.0.0
*/
public function add_gpstracker_endpoint( $rewrite_rules ) {
add_rewrite_endpoint( 'gpstracker', EP_ROOT );
}
/**
* Listens for the GET requests and then processes the request
*
* @access public
* @global $wp_query
* @since 1.0.0
* @return void
*/
public function process_gpstracker_query() {
global $wp_query;
if ( ! isset($wp_query->query_vars['gpstracker'] ) ) {
return;
}
switch ( $wp_query->query_vars['gpstracker'] ) {
case 'nonce':
$session_id = isset($wp_query->query_vars['sessionid']) ? $wp_query->query_vars['sessionid'] : '0';
$session_id_pattern = '/^[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}$/';
if ( preg_match($session_id_pattern, $session_id) ) {
echo wp_create_nonce($session_id);
} else {
echo '0';
}
break;
case 'location':
$session_id = isset($wp_query->query_vars['sessionid']) ? $wp_query->query_vars['sessionid'] : '0';
$wpnonce = isset($wp_query->query_vars['wpnonce']) ? $wp_query->query_vars['wpnonce'] : '1';
if ( ! wp_verify_nonce($wpnonce, $session_id) ) {
echo '0';
exit;
}
$latitude = isset($wp_query->query_vars['latitude']) ? $wp_query->query_vars['latitude'] : '0.0';
$latitude = (float)str_replace(",", ".", $latitude); // to handle European locale decimals
$longitude = isset($wp_query->query_vars['longitude']) ? $wp_query->query_vars['longitude'] : '0.0';
$longitude = (float)str_replace(",", ".", $longitude);
$user_name = isset($wp_query->query_vars['username']) ? $wp_query->query_vars['username'] : 'wordpressUser';
$phone_number = isset($wp_query->query_vars['phonenumber']) ? $wp_query->query_vars['phonenumber'] : '867-5309';
$speed = isset($wp_query->query_vars['speed']) ? $wp_query->query_vars['speed'] : '0';
$direction = isset($wp_query->query_vars['direction']) ? $wp_query->query_vars['direction'] : '0';
$distance = isset($wp_query->query_vars['distance']) ? $wp_query->query_vars['distance'] : '0';
$distance = (float)str_replace(",", ".", $distance);
$gps_time = isset($wp_query->query_vars['gpstime']) ? urldecode($wp_query->query_vars['gpstime']) : '0000-00-00 00:00:00';
$location_method = isset($wp_query->query_vars['locationmethod']) ? $wp_query->query_vars['locationmethod'] : '0';
$accuracy = isset($wp_query->query_vars['accuracy']) ? $wp_query->query_vars['accuracy'] : '0';
$extra_info = isset($wp_query->query_vars['extrainfo']) ? urldecode($wp_query->query_vars['extrainfo']) : '';
$event_type = isset($wp_query->query_vars['eventtype']) ? $wp_query->query_vars['eventtype'] : 'wordpress';
global $wpdb;
$table_name = $wpdb->prefix . 'gps_locations';
$wpdb->insert(
$table_name,
array(
'latitude' => $latitude,
'longitude' => $longitude,
'user_name' => $user_name,
'phone_number' => $phone_number,
'session_id' => $session_id,
'speed' => $speed,
'direction' => $direction,
'distance' => $distance,
'gps_time' => $gps_time,
'location_method' => $location_method,
'accuracy' => $accuracy,
'extra_info' => $extra_info,
'event_type' => $event_type
),
array(
'%f', '%f', '%s', '%s', '%s', '%d', '%d', '%f', '%s', '%s', '%d', '%s', '%s'
)
);
echo date('Y-m-d H:i:s');
break;
}
exit;
}
/**
* Registers query vars for API access
*
* @access public
* @since 1.0.0
* @param array $vars Query vars
* @return array $vars New query vars
*/
public function gpstracker_query_vars( $query_vars ) {
$query_vars[] = 'latitude';
$query_vars[] = 'longitude';
$query_vars[] = 'username';
$query_vars[] = 'phonenumber';
$query_vars[] = 'sessionid';
$query_vars[] = 'speed';
$query_vars[] = 'direction';
$query_vars[] = 'distance';
$query_vars[] = 'gpstime';
$query_vars[] = 'locationmethod';
$query_vars[] = 'accuracy';
$query_vars[] = 'extrainfo';
$query_vars[] = 'eventtype';
$query_vars[] = 'wpnonce';
return $query_vars;
}
}
?>