|
|
@@ -1,13 +1,24 @@
|
|
|
<?php
|
|
|
- // Gasteizko Margolariak API v3 //
|
|
|
+ /**
|
|
|
+ * Gasteizko Margolariak API v3 - Sync
|
|
|
+ *
|
|
|
+ * Used to sync data with apps with persistent storage (i.e. no web apps).
|
|
|
+ * This file is to be called directly from a URL request.
|
|
|
+ *
|
|
|
+ * @link https://margolariak.com/API/v3/help/
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ */
|
|
|
|
|
|
- //Database section identifiers
|
|
|
+
|
|
|
+ // Database section identifiers
|
|
|
define('SEC_ALL', 'all');
|
|
|
define('SEC_BLOG', 'blog');
|
|
|
define('SEC_ACTIVITIES', 'activities');
|
|
|
define('SEC_GALLERY', 'gallery');
|
|
|
define('SEC_LABLANCA', 'lablanca');
|
|
|
|
|
|
+ // Tables
|
|
|
define('TAB_ACTIVITY', 'activity');
|
|
|
define('TAB_ACTIVITY_COMMENT', 'activity_comment');
|
|
|
define('TAB_ACTIVITY_IMAGE', 'activity_image');
|
|
|
@@ -33,15 +44,20 @@
|
|
|
define('TAB_SETTINGS', 'settings');
|
|
|
define('TAB_SPONSOR', 'sponsor');
|
|
|
|
|
|
- //$_GET valid parameters
|
|
|
+ // $_GET key parameters
|
|
|
define('GET_CLIENT', 'client');
|
|
|
define('GET_USER', 'user');
|
|
|
define('GET_FOREGROUND', 'foreground');
|
|
|
|
|
|
- //Error messages
|
|
|
+ // Error messages
|
|
|
define('ERR_CLIENT', 'CLIENT');
|
|
|
|
|
|
- //List of all tables to sync, sorted by priority.
|
|
|
+
|
|
|
+ /**
|
|
|
+ * List of all tables that can be synced, sorted by priority / dependencies.
|
|
|
+ *
|
|
|
+ * @var string $tab_list
|
|
|
+ */
|
|
|
$tab_list = [TAB_SETTINGS, TAB_PLACE, TAB_ROUTE_POINT,
|
|
|
TAB_ROUTE, TAB_PEOPLE, TAB_FESTIVAL_EVENT_GM,
|
|
|
TAB_FESTIVAL, TAB_FESTIVAL_DAY, TAB_FESTIVAL_OFFER,
|
|
|
@@ -51,14 +67,16 @@
|
|
|
TAB_POST_IMAGE, TAB_PHOTO_COMMENT, TAB_POST_COMMENT,
|
|
|
TAB_ACTIVITY_COMMENT, TAB_ACTIVITY_TAG, TAB_POST_TAG];
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * This function is called from almost everywhere at *
|
|
|
- * the beggining of the page. It initializes the *
|
|
|
- * session variables and connects to the db. *
|
|
|
- * *
|
|
|
- * @return: (MySQL server connection): The *
|
|
|
- * connection handler. *
|
|
|
- ****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Initializes the MySQL database connection.
|
|
|
+ *
|
|
|
+ * Called at the beggining of the script. It connects to the database using the
|
|
|
+ * parameters in the .htpasswd file. It also sets database and page encodings.
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ * @return object Database connection.
|
|
|
+ */
|
|
|
function startdb(){
|
|
|
//Include the db configuration file. It's somehow like this
|
|
|
/*
|
|
|
@@ -84,20 +102,20 @@
|
|
|
//Return the db connection
|
|
|
return $con;
|
|
|
}
|
|
|
- /*****************************************************
|
|
|
- * Selects the value of a parameter from the list of *
|
|
|
- * GET arguments. It also sanitizes it to prevent *
|
|
|
- * SQL injections. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) Db connector. *
|
|
|
- * get: (string array) Contains the GET *
|
|
|
- * parameters. *
|
|
|
- * param: (string) Name of the parameter. *
|
|
|
- * @return: (string): Value of the parameter or an *
|
|
|
- * empty string if it was not passed. *
|
|
|
- *****************************************************/
|
|
|
- function extract_param($con, $get, $param){
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Extracts a request parameter.
|
|
|
+ *
|
|
|
+ * Extracts the value of a parameter from the list of GET parameters,
|
|
|
+ * sanitizing it to prevent SQL injections.
|
|
|
+ *
|
|
|
+ * @since 3.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param string $param Key of the parameter to retrieve.
|
|
|
+ * @return string Value of the parameter or an empty string if it was not found.
|
|
|
+ */
|
|
|
+ function extract_param($con, $param){
|
|
|
if(isset($_GET[$param])){
|
|
|
return mysqli_real_escape_string($con, $_GET[$param]);
|
|
|
}
|
|
|
@@ -106,33 +124,39 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Gets information about the API call and the *
|
|
|
- * assocciated client. If some mandatory parameter *
|
|
|
- * is not provided, a error log entry is registered *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) Db connector. *
|
|
|
- * get: (string array) Contains the GET *
|
|
|
- * parameters. *
|
|
|
- * @return: (string array): Array with the keys *
|
|
|
- * 'client', 'user', 'foreground', 'ip', *
|
|
|
- * 'os', 'browser', 'uagent' and 'error'. *
|
|
|
- * 'error' will contain the key of a *
|
|
|
- * mandatory value if it has not been *
|
|
|
- * provided, or will be empty if there *
|
|
|
- * were no problem. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets request info.
|
|
|
+ *
|
|
|
+ * Gets information about the request by reading it's parameters.
|
|
|
+ *
|
|
|
+ * @since 3.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $get Array with the request parameters.
|
|
|
+ * @return array {
|
|
|
+ * @type string client Client identifier. Empty if not provided.
|
|
|
+ * @type string user User identifier. Empty if not provided.
|
|
|
+ * @type int foreground 1 if the sync is being made in the app
|
|
|
+ * foreground, 0 otherwise.
|
|
|
+ * @type string ip Client IP.
|
|
|
+ * @type string os Client operating system identifier. Empty if not
|
|
|
+ * found.
|
|
|
+ * @type string browser Client browser identifier. Empty if not found.
|
|
|
+ * @type string uagent Client user agent. Empty if not found.
|
|
|
+ * @type string error Will contain ERR_CLIENT if the client was not
|
|
|
+ * specified, empty otherwise.
|
|
|
+ * }
|
|
|
+ */
|
|
|
function get_user_info($con, $get){
|
|
|
$info = array();
|
|
|
$error = "";
|
|
|
- $info["client"] = extract_param($con, $get, GET_CLIENT);
|
|
|
+ $info["client"] = extract_param($con, GET_CLIENT);
|
|
|
if(strlen($info["client"]) == 0) {
|
|
|
error_log("SYNC ERROR: Trying to sync with no client name.");
|
|
|
$error = ERR_CLIENT;
|
|
|
}
|
|
|
- $info["user"] = extract_param($con, $get, GET_USER);
|
|
|
- $info["foreground"] = (int) extract_param($con, $get, GET_FOREGROUND);
|
|
|
+ $info["user"] = extract_param($con, GET_USER);
|
|
|
+ $info["foreground"] = (int) extract_param($con, GET_FOREGROUND);
|
|
|
if($info["foreground"] != 1){
|
|
|
$info["foreground"] = 0;
|
|
|
}
|
|
|
@@ -145,38 +169,43 @@
|
|
|
return $info;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Reads the version of the tables reported by the *
|
|
|
- * user as GET parameters. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) Db connector. *
|
|
|
- * get: (string array) Contains the GET *
|
|
|
- * parameters. *
|
|
|
- * @return: (int array): Array with the version of *
|
|
|
- * the tables in the user app, keyed with *
|
|
|
- * the table names. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Reads the table version in the client app.
|
|
|
+ *
|
|
|
+ * Reads the version of the tables reported by the user as GET parameters.
|
|
|
+ * Those parameters must be the same as the table names listed in
|
|
|
+ * {@see $tab_list}.
|
|
|
+ *
|
|
|
+ * @since 3.0.0
|
|
|
+ * @global array $tab_list Array with the names of the tables to sync.
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $get Array with the request parameters.
|
|
|
+ * @return array Integer array with the version of the tables reported in
|
|
|
+ * the request, keyed with the table names. If no table
|
|
|
+ * version was specified, the array will be empty.
|
|
|
+ */
|
|
|
function get_user_versions($con, $get){
|
|
|
global $tab_list;
|
|
|
$versions = array();
|
|
|
foreach($tab_list as $tab){
|
|
|
- $versions[$tab] = intval(extract_param($con, $get, $tab));
|
|
|
+ $versions[$tab] = intval(extract_param($con, $tab));
|
|
|
}
|
|
|
return $versions;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Reads the version of the tables reported by the *
|
|
|
- * user as GET parameters. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) RO mode enough. *
|
|
|
- * parameters. *
|
|
|
- * @return: (int array): Array with the version of *
|
|
|
- * the tables in the server, keyed with *
|
|
|
- * the table names. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Reads the table version in the server.
|
|
|
+ *
|
|
|
+ * Reads from the database the version of the tables that sync with the
|
|
|
+ * clients.
|
|
|
+ *
|
|
|
+ * @since 3.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @return array Integer array with the version of the tables in the
|
|
|
+ * database, keyed with the table names.
|
|
|
+ */
|
|
|
function get_server_versions($con){
|
|
|
$versions = array();
|
|
|
$q = mysqli_query($con, "SELECT section, version FROM version;");
|
|
|
@@ -186,17 +215,24 @@
|
|
|
return $versions;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Select the tables that need to be synced. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * user: (int array) Versions of tables in the *
|
|
|
- * user app. *
|
|
|
- * server: (int array) Versions of tables in the *
|
|
|
- * server. *
|
|
|
- * @return: (string array): Array with the names of *
|
|
|
- * the tables that need to be synced. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Select the tables that need to be synced.
|
|
|
+ *
|
|
|
+ * Determines the tables in {@see $tab_list} that are out of sync between
|
|
|
+ * the server and the client.
|
|
|
+ *
|
|
|
+ * @since 3.0.0
|
|
|
+ * @global array $tab_list Array with the names of the tables that sync
|
|
|
+ * whit clients.
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $user Integer array with the version of the tables reported
|
|
|
+ * in the request, keyed with the table names.
|
|
|
+ * @param array $server Integer array with the version of the tables in the
|
|
|
+ * database, keyed with the table names.
|
|
|
+ * @return array String array with the name of the tables present in $user whose
|
|
|
+ * versions are lower than the ones in $server.
|
|
|
+ */
|
|
|
function select_tables($user, $server){
|
|
|
global $tab_list;
|
|
|
$tables = array();
|
|
|
@@ -208,15 +244,19 @@
|
|
|
return $tables;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Formats the contents of ther 'versions' table, *
|
|
|
- * Only for the tables that will be synced. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) Db connector. *
|
|
|
- * tables (String array): List of table. *
|
|
|
- * @return: (Assoc Array): Data in the table. *
|
|
|
- ****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * JSON-izes the versions of the tables to sync.
|
|
|
+ *
|
|
|
+ * Generates a JSON-formatted string with the versions of all the tables
|
|
|
+ * to sync.
|
|
|
+ *
|
|
|
+ * @since 3.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $tables String array with the names of the tables.
|
|
|
+ * @return string JSON-formatted string with the version of the tables.
|
|
|
+ * Empty string if no valid table names were passes in $tables.
|
|
|
+ */
|
|
|
function get_table_version($con, $tables){
|
|
|
// Build query, showing only tables to sync
|
|
|
$s = "SELECT * FROM version WHERE ";
|
|
|
@@ -224,14 +264,14 @@
|
|
|
$s = $s . "section = '$table' OR ";
|
|
|
}
|
|
|
$s = $s . "1 = 2;";
|
|
|
- $q = mysqli_query($con, $s);
|
|
|
+ $q = mysqli_query($con, $s);
|
|
|
|
|
|
//If no rows, return
|
|
|
if (mysqli_num_rows($q) == 0){
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
- //Create result array
|
|
|
+ //Create result JSON
|
|
|
$str = "";
|
|
|
$str = $str. "\"version\":[";
|
|
|
while($r = mysqli_fetch_assoc($q)) {
|
|
|
@@ -243,16 +283,19 @@
|
|
|
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Formats the contents of a table in the database. *
|
|
|
- * Inaccessible or sensitive tables or fields are *
|
|
|
- * not printed. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) RO mode enough. *
|
|
|
- * table (string): The name of the table. *
|
|
|
- * @return: (Assoc Array): Data in the table. *
|
|
|
- ****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * JSON-izes the data in a table.
|
|
|
+ *
|
|
|
+ * Generates a JSON-formatted string with the data in a table. Inaccessible
|
|
|
+ * or sensitive tables or fields are not returned.
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param string $table Table name.
|
|
|
+ * @return string JSON-formatted string with the data in the table. Empty
|
|
|
+ * string if $table was not a valid table name.
|
|
|
+ */
|
|
|
function get_table($con, $table){
|
|
|
$table = strtolower($table);
|
|
|
switch ($table){
|
|
|
@@ -305,14 +348,21 @@
|
|
|
return $str;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Prints out required tables. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) Db connector. *
|
|
|
- * tables: (String array) List of tables to sync. *
|
|
|
- * @return: (String): Client IP address. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets the data on the requested tables.
|
|
|
+ *
|
|
|
+ * Builds a JSON string with the data in all the requested tables.
|
|
|
+ * Inaccessible or sensitive tables or fields are not returned.
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ * @see get_table($con, $table)
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $tables String array with the names of the tables to sync.
|
|
|
+ * @return string JSON-formatted string with the data in the requested
|
|
|
+ * tables. Empty string if no valid table names were
|
|
|
+ * provided in $tables.
|
|
|
+ */
|
|
|
function sync($con, $tables){
|
|
|
$str = "";
|
|
|
if(sizeof($tables) > 0){
|
|
|
@@ -329,11 +379,13 @@
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Gets the IP address of the client. *
|
|
|
- * *
|
|
|
- * @return: (String): Client IP address. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets the user IP address.
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ * @return string User IP address.
|
|
|
+ */
|
|
|
function get_user_ip(){
|
|
|
$client = @$_SERVER['HTTP_CLIENT_IP'];
|
|
|
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
|
|
|
@@ -350,39 +402,59 @@
|
|
|
return $ip;
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Registers the request in the database. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) RO mode enough. *
|
|
|
- * user: (String array): Array with, at least, *
|
|
|
- * the keys 'client', 'user', 'foreground', *
|
|
|
- * 'ip', 'os', 'browser', 'uagent', with *
|
|
|
- * info about the calling app. *
|
|
|
- * synced: (Int): 1 if a sync content was sent, 0 *
|
|
|
- * otherwise. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Logs a request to the database.
|
|
|
+ *
|
|
|
+ * Creates an entry in the table 'sync' with the details of the request.
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $user {
|
|
|
+ * @type string client Client identifier. Empty if not provided.
|
|
|
+ * @type string user User identifier. Empty if not provided.
|
|
|
+ * @type int foreground 1 if the sync is being made in the app
|
|
|
+ * foreground, 0 otherwise.
|
|
|
+ * @type string ip Client IP.
|
|
|
+ * @type string os Client operating system identifier. Empty if not
|
|
|
+ * found.
|
|
|
+ * @type string browser Client browser identifier. Empty if not found.
|
|
|
+ * @type string uagent Client user agent. Empty if not found.
|
|
|
+ * }
|
|
|
+ * @param int synced 1 if sync data was finally sent, 0 otherwise.
|
|
|
+ */
|
|
|
function log_sync($con, $user, $synced){
|
|
|
mysqli_query($con, "INSERT INTO sync (client, user, fg, synced, ip, os, uagent) VALUES ('$user[client]', '$user[user]', $user[foreground], $synced, '$user[ip]', '$user[os]', '$user[uagent]');");
|
|
|
}
|
|
|
|
|
|
- /*****************************************************
|
|
|
- * Registers a failed request in the database. *
|
|
|
- * *
|
|
|
- * @params: *
|
|
|
- * con: (MySQL server connection) RO mode enough. *
|
|
|
- * user: (String array): Array with, at least, *
|
|
|
- * the keys 'client', 'user', 'foreground', *
|
|
|
- * 'ip', 'os', 'browser', 'uagent', and *
|
|
|
- * 'error', with info about the calling *
|
|
|
- * app. The 'error' key will contain an *
|
|
|
- * error description. *
|
|
|
- *****************************************************/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Logs a failed request to the database.
|
|
|
+ *
|
|
|
+ * Creates an entry in the table 'sync' with the details of the failed request.
|
|
|
+ *
|
|
|
+ * @since 1.0.0
|
|
|
+ * @param object $con Open database connection.
|
|
|
+ * @param array $user {
|
|
|
+ * @type string client Client identifier. Empty if not provided.
|
|
|
+ * @type string user User identifier. Empty if not provided.
|
|
|
+ * @type int foreground 1 if the sync is being made in the app
|
|
|
+ * foreground, 0 otherwise.
|
|
|
+ * @type string ip Client IP.
|
|
|
+ * @type string os Client operating system identifier. Empty if not
|
|
|
+ * found.
|
|
|
+ * @type string browser Client browser identifier. Empty if not found.
|
|
|
+ * @type string uagent Client user agent. Empty if not found.
|
|
|
+ * @type string error Error code.
|
|
|
+ * }
|
|
|
+ */
|
|
|
function log_error($con, $user){
|
|
|
mysqli_query($con, "INSERT INTO sync (client, user, fg, error, ip, os, uagent) VALUES ('$user[client]', '$user[user]', $user[foreground], $user[error], '$user[ip]', '$user[os]', '$user[uagent]');");
|
|
|
}
|
|
|
|
|
|
|
|
|
+ // SCRIPT START
|
|
|
+
|
|
|
|
|
|
// Connect to the database
|
|
|
$con = startdb('rw');
|