diff --git a/htdocs/core/ajax/pingresult.php b/htdocs/core/ajax/pingresult.php
new file mode 100644
index 00000000000..9b46546f5c3
--- /dev/null
+++ b/htdocs/core/ajax/pingresult.php
@@ -0,0 +1,72 @@
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ * \file htdocs/core/ajax/pingresult.php
+ * \brief File to save result of anonymous ping
+ * Example: captureserver/public/index.php?action=dolibarrping
+ */
+
+if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Disables token renewal
+if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1');
+if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1');
+if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1');
+if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1');
+if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1');
+
+require '../../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
+
+$action=GETPOST('action', 'alpha');
+$hash_unique_id=GETPOST('hash_unique_id', 'alpha');
+$hash_algo=GETPOST('hash', 'alpha');
+
+
+// Security check
+if (! empty($user->societe_id))
+ $socid = $user->societe_id;
+
+$now = dol_now();
+
+
+/*
+ * View
+ */
+
+top_httphead();
+
+print ''."\n";
+
+// If ok
+if ($action == 'firstpingok')
+{
+ // Note: pings are by entities
+ dolibarr_set_const($db, 'MAIN_FIRST_PING_OK_DATE', dol_print_date($now, 'dayhourlog', 'gmt'));
+ dolibarr_set_const($db, 'MAIN_FIRST_PING_OK_ID', $hash_unique_id);
+
+ print 'First ping OK saved for entity '.$conf->entity;
+}
+// If ko
+elseif ($action == 'firstpingko')
+{
+ // Note: pings are by entities
+ dolibarr_set_const($db, 'MAIN_LAST_PING_KO_DATE', dol_print_date($now, 'dayhourlog'), 'gmt');
+ print 'First ping KO saved for entity '.$conf->entity;
+}
+else {
+ print 'Error action='.$action.' not supported';
+}
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index bf4c40a4176..96ddd9696a7 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -1124,6 +1124,7 @@ function top_httphead($contenttype = 'text/html', $forcenocache = 0)
if ($contenttype == 'text/html' ) header("Content-Type: text/html; charset=".$conf->file->character_set_client);
else header("Content-Type: ".$contenttype);
+
// Security options
header("X-Content-Type-Options: nosniff"); // With the nosniff option, if the server says the content is text/html, the browser will render it as text/html (note that most browsers now force this option to on)
if (! defined('XFRAMEOPTIONS_ALLOWALL')) header("X-Frame-Options: SAMEORIGIN"); // Frames allowed only if on same domain (stop some XSS attacks)
@@ -2319,6 +2320,54 @@ if (! function_exists("llxFooter"))
print "\n\n";
print '
'."\n";
+ // Add code for the fist asynchronous anonymous ping
+ if (($_SERVER["PHP_SELF"] == DOL_URL_ROOT.'/index.php') || GETPOST('forceping', 'alpha'))
+ {
+ if (empty($conf->global->MAIN_FIRST_PING_OK_DATE)
+ || (! empty($conf->file->instance_unique_id) && $conf->file->instance_unique_id != $conf->global->MAIN_FIRST_PING_OK_ID)
+ || GETPOST('forceping', 'alpha'))
+ {
+ print "\n".''."\n";
+ print "\n\n";
+ ?>
+
+ \n";
print "