Compare commits

..

No commits in common. "master" and "v0.6" have entirely different histories.
master ... v0.6

13 changed files with 195 additions and 443 deletions

View File

@ -1,65 +1,3 @@
DotclearWatch 0.9.3 - 2023.10.22
===========================================================
* Require dotclear 2.28
* Require php 8.1
* Add PHP minor version (using PHP constants)
* Add uninstall feature (plugin Uninstaller)
* Fix colored synthax
* Use Helper Form everywhere
DotclearWatch 0.9.2 - 2023.10.14
===========================================================
* Require dotclear 2.28
* Require php 8.1
* Fix last minute update from Dtoclear 2.28
DotclearWatch 0.9.1 - 2023.10.09
===========================================================
* Require dotclear 2.28
* Require php 8.1
* Fix permissions
* Code review
DotclearWatch 0.9 - 2023.10.07
===========================================================
* Require dotclear 2.28
* Require php 8.1
* Update to Dotclear 2.28-dev
DotclearWatch 0.8 - 2023.08.27
===========================================================
* Require dotclear 2.27
* Require php 7.4
* Add web server name and version to stats
DotclearWatch 0.7.2 - 2023.08.26
===========================================================
* Require dotclear 2.27
* Require php 7.4
* fix type hint
* fix README
DotclearWatch 0.7.2 - 2023.08.16
===========================================================
* Require dotclear 2.27
* Require php 7.4
* Fix unset user prefs
* Change page footer
DotclearWatch 0.7.1 - 2023.08.14
===========================================================
* Require dotclear 2.27
* Require php 7.4
* Fix help URLs, fix #2
* Fix server public URL
DotclearWatch 0.7 - 2023.08.12
===========================================================
* require dotclear 2.27
* require php 7.4
* Use asynchronous report sending
* Use HttpClient first to send report
DotclearWatch 0.6 - 2023.08.09
===========================================================
* require dotclear 2.27

View File

@ -1,19 +1,18 @@
# README
[![Release](https://img.shields.io/badge/release-0.9.3-a2cbe9.svg)](https://git.dotclear.watch/dw/DotclearWatch/releases)
![Date](https://img.shields.io/badge/date-2023.10.22-c44d58.svg)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.28-137bbb.svg)](https://fr.dotclear.org/download)
[![Release](https://img.shields.io/badge/release-0.6-a2cbe9.svg)](https://git.dotclear.watch/dw/DotclearWatch/releases)
[![Date](https://img.shields.io/badge/date-2023.08.09-c44d58.svg)](https://git.dotclear.watch/dw/DotclearWatch/releases)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.27-137bbb.svg)](https://fr.dotclear.org/download)
[![Dotaddict](https://img.shields.io/badge/dotaddict-official-9ac123.svg)](https://plugins.dotaddict.org/dc2/details/DotclearWatch)
[![License](https://img.shields.io/badge/license-GPL--2.0-ececec.svg)](https://git.dotclear.watch/dw/DotclearWatch/src/branch/master/LICENSE)
[![License](https://img.shields.io/github/license/JcDenis/DotclearWatch)](https://git.dotclear.watch/dw/DotclearWatch/blob/master/LICENSE)
## ABOUT
## WHAT IS DOTCLEARWATCH ?
_dotclear watch_ is a plugin for the open-source web publishing software called [Dotclear](https://www.dotclear.org).
> Send report about your Dotclear
"dotclear watch" is a plugin for the open-source
web publishing software called Dotclear.
It tracks Dotclear's installation to get stats about it.
Default statistics server is located at https://stat.dotclear.watch
Default statistics server is located at https://dotclear.watch/statistics
What's being track :
* Dotclear version,
@ -29,9 +28,11 @@ in aboutConfig global parameters called DotclearWatch->hidden_modules
## REQUIREMENTS
* Dotclear 2.28
* PHP 8.1+
* Dotclear super admin permission to intall it
DotclearWatch requires:
* super admin permission to intall it
* Dotclear 2.27
* PHP 7.4+
## USAGE
@ -42,10 +43,10 @@ To disable sending stats, just deactivate or uninstall this plugin.
## LINKS
* [License](https://git.dotclear.watch/dw/DotclearWatch/src/branch/master/LICENSE)
* [Packages & details](https://git.dotclear.watch/dw/DotclearWatch/releases) (or on [Dotaddict](https://plugins.dotaddict.org/dc2/details/DotclearWatch))
* [Sources & contributions](https://git.dotclear.watch/dw/DotclearWatch) (or on [GitHub](https://github.com/JcDenis/DotclearWatch))
* [Issues & security](https://git.dotclear.watch/dw/DotclearWatch/issues) (or on [GitHub](https://github.com/JcDenis/DotclearWatch/issues))
* License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html)
* Source & contributions : [Gitea Page](https://git.dotclear.watch/dw/DotclearWatch) or [GitHub Page](https://github.com/JcDenis/DotclearWatch)
* Packages & details : [Gitea Page](https://git.dotclear.watch/dw/DotclearWatch/releases) or[Dotaddict Page](https://plugins.dotaddict.org/dc2/details/DotclearWatch)
* Discussion & Help : [Gitea Page](https://github.com/dw/DotclearWatch/issues)
## CONTRIBUTORS

View File

@ -1,30 +1,28 @@
<?php
/**
* @file
* @brief The plugin DotclearWatch definition
* @ingroup DotclearWatch
* @brief DotclearWatch, a plugin for Dotclear 2
*
* @defgroup DotclearWatch Plugin DotclearWatch.
* @package Dotclear
* @subpackage Plugin
*
* QSend report about your Dotclear.
* @author Jean-Christian Denis and contributors
*
* @author Jean-Christian Denis
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
* @copyright Jean-Christain Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
$this->registerModule(
'Dotclear Watch',
'Send report about your Dotclear',
'Jean-Christian Denis and contributors',
'0.9.3',
'0.6',
[
'requires' => [['core', '2.28']],
'permissions' => 'My',
'type' => 'plugin',
'support' => 'https://git.dotclear.watch/dw/' . basename(__DIR__) . '/issues',
'details' => 'https://git.dotclear.watch/dw/' . basename(__DIR__) . '/src/branch/master/README.md',
'repository' => 'https://git.dotclear.watch/dw/' . basename(__DIR__) . '/raw/branch/master/dcstore.xml',
'requires' => [
['php', '7.4'],
['core', '2.27'],
],
'type' => 'plugin',
'support' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/issues',
'details' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/src/branch/master/README.md',
'repository' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/raw/branch/master/dcstore.xml',
]
);

View File

@ -2,12 +2,12 @@
<modules xmlns:da="http://dotaddict.org/da/">
<module id="DotclearWatch">
<name>Dotclear Watch</name>
<version>0.9.3</version>
<version>0.6</version>
<author>Jean-Christian Denis and contributors</author>
<desc>Send report about your Dotclear</desc>
<file>https://git.dotclear.watch/dw/DotclearWatch/releases/download/v0.9.3/plugin-DotclearWatch.zip</file>
<da:dcmin>2.28</da:dcmin>
<da:details>https://git.dotclear.watch/dw/DotclearWatch/src/branch/master/README.md</da:details>
<file>https://git.dotclear.watch/dw/DotclearWatch/releases/download/v0.6/plugin-DotclearWatch.zip</file>
<da:dcmin>2.27</da:dcmin>
<da:details>http://plugins.dotaddict.org/dc2/details/DotclearWatch</da:details>
<da:support>https://git.dotclear.watch/dw/DotclearWatch/issues</da:support>
</module>
</modules>

View File

@ -1,29 +0,0 @@
/*global $, dotclear */
'use strict';
dotclear.adminDotclearWatchSendReport = () => {
dotclear.services(
'adminDotclearWatchSendReport',
(data) => {
try {
const response = JSON.parse(data);
if (response?.success) {
} else {
console.log(dotclear.debug && response?.message ? response.message : 'Dotclear REST server error');
return;
}
} catch (e) {
console.log(e);
}
},
(error) => {
console.log(error);
},
true, // Use GET method
{ json: 1 },
);
};
$(() => {
dotclear.adminDotclearWatchSendReport();
});

View File

@ -11,8 +11,6 @@
use Dotclear\Helper\L10n;
L10n::$locales['Uses DotclearWatch plugin statistics'] = 'Utilise le plugin de statistiques DotclearWatch';
L10n::$locales['Shared statistics'] = 'Statistiques partagées';
L10n::$locales['Cache directory sucessfully cleared.'] = 'Répertoire de cache des rapports nettoyé.';
L10n::$locales['Settings successfully updated.'] = 'Paramètres mis à jour.';
L10n::$locales['Report sent.'] = 'Rapport envoyé.';

View File

@ -1,21 +1,15 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: DotclearWatch 0.7.1\n"
"Project-Id-Version: DotclearWatch 0.1\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2023-08-16T14:14:45+00:00\n"
"PO-Revision-Date: 2023-07-23T09:13:29+00:00\n"
"Last-Translator: Jean-Christain Denis\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "Uses DotclearWatch plugin statistics"
msgstr "Utilise le plugin de statistiques DotclearWatch"
msgid "Shared statistics"
msgstr "Statistiques partagées"
msgid "Cache directory sucessfully cleared."
msgstr "Répertoire de cache des rapports nettoyé."

View File

@ -1,25 +1,22 @@
<?php
/**
* @brief DotclearWatch, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and contributors
*
* @copyright Jean-Christain Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\DotclearWatch;
use Dotclear\App;
use dcCore;
use Dotclear\Core\Process;
use Dotclear\Helper\Html\Form\{
Img,
Li,
Link,
Ul
};
/**
* @brief DotclearWatch backend class.
* @ingroup DotclearWatch
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Backend extends Process
{
public static function init(): bool
@ -33,43 +30,13 @@ class Backend extends Process
return false;
}
App::behavior()->addBehaviors([
// Add JS for asynchronous report sending
'adminDashboardHeaders' => function (): string {
return My::jsLoad('service', App::version()->getVersion(My::id()));
},
// Add icon on bottom of dashboard sidebar menu
'adminPageFooterV2' => function (): void {
if (My::settings()->getGlobal('distant_api_url')) {
echo (new Ul())->items([
(new li())->items([
(new Link())
->class('outgoing')
->href('https://stat.dotclear.watch')
->title(__('Uses DotclearWatch plugin statistics'))
->text(__('Shared statistics'))
->items([
(new Img(My::fileURL('icon.svg'))),
]),
]),
])->render();
}
},
//My::addBackendMenuItem();
dcCore::app()->addBehaviors([
'adminDashboardHeaders' => [Utils::class, 'sendReport'],
'adminPageFooterV2' => [Utils::class, 'addMark'],
]);
App::rest()->addFunction(
// Add REST service for asynchronous report sending
'adminDotclearWatchSendReport',
function (): array {
Utils::sendReport();
return [
'ret' => true,
'msg' => 'report sent',
];
},
);
return true;
}
}

View File

@ -1,10 +1,18 @@
<?php
/**
* @brief DotclearWatch, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugins
*
* @copyright Olivier Meunier & Association Dotclear
* @copyright GPL-2.0-only
*/
declare(strict_types=1);
namespace Dotclear\Plugin\DotclearWatch;
use Dotclear\App;
use dcCore;
use Dotclear\Core\Backend\Notices;
use Dotclear\Core\Backend\Page;
use Dotclear\Core\Process;
@ -22,32 +30,14 @@ use Dotclear\Helper\Html\Form\{
};
use Dotclear\Helper\Html\Html;
/**
* @brief DotclearWatch configuration class.
* @ingroup DotclearWatch
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Config extends Process
{
/**
* List of hidden modules.
*
* @var string $hidden_modules
*/
private static string $hidden_modules = '';
/**
* Distant API URL.
*
* @var string $distant_api_url
*/
private static string $hidden_modules = '';
private static string $distant_api_url = '';
public static function init(): bool
{
return self::status(My::checkContext(My::CONFIG));
return self::status(My::checkContext(My::MANAGE));
}
public static function process(): bool
@ -56,8 +46,8 @@ class Config extends Process
return false;
}
if (App::auth()->prefs()->get('interface')->get('colorsyntax')) {
App::behavior()->addBehavior('pluginsToolsHeadersV2', fn (bool $plugin): string => Page::jsLoadCodeMirror(App::auth()->prefs()->get('interface')->get('colorsyntax_theme')));
if (dcCore::app()->auth->user_prefs->get('interface')->get('colorsyntax')) {
dcCore::app()->addBehavior('pluginsToolsHeadersV2', fn (bool $plugin): string => Page::jsLoadCodeMirror(dcCore::app()->auth->user_prefs->get('interface')->get('colorsyntax_theme')));
}
self::$hidden_modules = (string) My::settings()->getGlobal('hidden_modules');
@ -72,8 +62,7 @@ class Config extends Process
Notices::AddSuccessNotice(__('Cache directory sucessfully cleared.'));
}
self::$distant_api_url = !empty($_POST['distant_api_url']) && is_string($_POST['distant_api_url']) ? $_POST['distant_api_url'] : Utils::DISTANT_API_URL;
self::$hidden_modules = '';
self::$hidden_modules = '';
foreach (explode(',', $_POST['hidden_modules']) as $hidden) {
$hidden = trim($hidden);
if (!empty($hidden)) {
@ -81,6 +70,8 @@ class Config extends Process
}
}
self::$distant_api_url = !empty($_POST['distant_api_url']) && is_string($_POST['distant_api_url']) ? $_POST['distant_api_url'] : Utils::DISTANT_API_URL;
My::settings()->put('hidden_modules', self::$hidden_modules, 'string', 'Hidden modules from report', true, true);
My::settings()->put('distant_api_url', self::$distant_api_url, 'string', 'Distant API report URL', true, true);
Notices::AddSuccessNotice(__('Settings successfully updated.'));
@ -95,7 +86,7 @@ class Config extends Process
}
}
App::backend()->url()->redirect('admin.plugins', ['module' => My::id(), 'conf' => '1']);
dcCore::app()->admin->url->redirect('admin.plugins', ['module' => My::id(), 'conf' => '1']);
return true;
}
@ -115,12 +106,12 @@ class Config extends Process
]),
(new Para())->items([
(new Label(__('Hidden modules:')))->for('hidden_modules'),
(new Input('hidden_modules'))->class('maximal')->size(65)->maxlength(255)->value(self::$hidden_modules),
(new Input('hidden_modules'))->class('maximal')->size(65)->maxlenght(255)->value(self::$hidden_modules),
]),
(new Note())->class('form-note')->text(__('This is the comma separated list of plugins IDs and themes IDs to ignore in report.')),
(new Para())->items([
(new Label(__('Distant API URL:')))->for('distant_api_url'),
(new Input('distant_api_url'))->class('maximal')->size(65)->maxlength(255)->value(self::$distant_api_url),
(new Input('distant_api_url'))->class('maximal')->size(65)->maxlenght(255)->value(self::$distant_api_url),
]),
(new Note())->class('form-note')->text(__('This is the URL of the API to send report. Leave empty to reset value.')),
(new Para())->items([
@ -147,8 +138,8 @@ class Config extends Process
->class('maximal'),
])->render() .
(
App::auth()->prefs()->get('interface')->get('colorsyntax') ?
Page::jsRunCodeMirror(My::id() . 'editor', 'report_contents', 'json', App::auth()->prefs()->get('interface')->get('colorsyntax_theme')) : ''
!dcCore::app()->auth->user_prefs->get('interface')->get('colorsyntax') ? '' :
Page::jsRunCodeMirror(My::id() . 'editor', 'report_contents', 'json', dcCore::app()->auth->user_prefs->get('interface')->get('colorsyntax_theme'))
);
}
}

View File

@ -1,18 +1,21 @@
<?php
/**
* @brief DotclearWatch, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and contributors
*
* @copyright Jean-Christain Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\DotclearWatch;
use Dotclear\Core\Process;
/**
* @brief DotclearWatch install class.
* @ingroup DotclearWatch
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Install extends Process
{
public static function init(): bool
@ -22,8 +25,9 @@ class Install extends Process
public static function process(): bool
{
if (self::status()) {
My::settings()->put(
$s = My::settings();
if (self::status() && $s !== null) {
$s->put(
'hidden_modules',
'DotclearWatch',
'string',
@ -31,7 +35,7 @@ class Install extends Process
false,
true
);
My::settings()->put(
$s->put(
'distant_api_url',
'https://dotclear.watch/api',
'string',

View File

@ -1,19 +1,27 @@
<?php
/**
* @brief DotclearWatch, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and contributors
*
* @copyright Jean-Christain Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\DotclearWatch;
use dcCore;
use Dotclear\Module\MyPlugin;
/**
* @brief DotclearWatch My helper.
* @ingroup DotclearWatch
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class My extends MyPlugin
{
// Use default permissions
protected static function checkCustomContext(int $context): ?bool
{
return $context === My::INSTALL ? null :
defined('DC_CONTEXT_ADMIN') && dcCore::app()->auth->isSuperAdmin();
}
}

View File

@ -1,66 +0,0 @@
<?php
declare(strict_types=1);
namespace Dotclear\Plugin\DotclearWatch;
use Dotclear\Core\Process;
use Dotclear\Plugin\Uninstaller\Uninstaller;
/**
* @brief DotclearWatch uninstall class.
* @ingroup DotclearWatch
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Uninstall extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::UNINSTALL));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
Uninstaller::instance()
->addUserAction(
'settings',
'delete_all',
My::id()
)
->addUserAction(
'plugins',
'delete',
My::id()
)
->addUserAction(
'versions',
'delete',
My::id()
)
->addDirectAction(
'settings',
'delete_all',
My::id()
)
->addDirectAction(
'plugins',
'delete',
My::id()
)
->addDirectAction(
'versions',
'delete',
My::id()
)
;
// no custom action
return false;
}
}

View File

@ -1,59 +1,61 @@
<?php
/**
* @brief DotclearWatch, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and contributors
*
* @copyright Jean-Christain Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\DotclearWatch;
use Dotclear\App;
use dcCore;
use dcLog;
use dcModuleDefine;
use dcThemes;
use Dotclear\Helper\Crypt;
use Dotclear\Helper\Date;
use Dotclear\Helper\Network\HttpClient;
use Dotclear\Module\ModuleDefine;
use Exception;
/**
* @brief DotclearWatch utils class.
* @ingroup DotclearWatch
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Utils
{
/**
* The expiration delay before resend report (one week).
*
* @var int EXPIRED_DELAY
*/
/** @var int The expiration delay before resend report (one week) */
public const EXPIRED_DELAY = 604800;
/**
* The default distant API URL.
*
* @var string DISTANT_API_URL
*/
/** @var string The default distant API URL */
public const DISTANT_API_URL = 'https://dotclear.watch/api';
/**
* The distant API version.
*
* @var string DISTANT_API_VERSION
*/
/** @var string The distant API version */
public const DISTANT_API_VERSION = '1.1';
/**
* The hiddens modules IDs.
*
* @var array<int,string> $hiddens
*/
/** @var array<int,string> The hiddens modules IDs */
private static array $hiddens = [];
/**
* Multiblog unique identifiant.
*
* @var string $uid
*/
/** @var string Multiblog unique identifiant */
private static string $uid = '';
/**
* Add mark to backend menu footer.
*/
public static function addMark(): void
{
if (My::settings()->getGlobal('distant_api_url')) {
echo sprintf(
'<ul><li><a href="%s" title="%s" class="outgoing">%s<img src="%s" /></a></ul></li>',
'https://statistics.dotclear.watch',
__('DotclearWatch plugin statistics'),
__('Tracked by dotclear.watch'),
My::fileURL('icon.svg')
);
}
}
/**
* Get hidden modules.
*
@ -86,12 +88,12 @@ class Utils
{
$modules = [];
$hiddens = self::getHiddens();
$defines = App::plugins()->getDefines($strict ? ['state' => ModuleDefine::STATE_ENABLED] : []);
$defines = dcCore::app()->plugins->getDefines($strict ? ['state' => dcModuleDefine::STATE_ENABLED] : []);
foreach ($defines as $define) {
if ($strict && in_array($define->getId(), $hiddens)) {
continue;
}
$modules[(string) $define->getId()] = (string) $define->get('version');
$modules[$define->getId()] = $define->get('version');
}
return $modules;
@ -106,48 +108,24 @@ class Utils
*/
public static function getThemes(bool $strict = true): array
{
if (App::themes()->isEmpty()) {
App::themes()->loadModules(App::blog()->themesPath());
if (!(dcCore::app()->themes instanceof dcThemes)) {
dcCore::app()->themes = new dcThemes();
dcCore::app()->themes->loadModules(dcCore::app()->blog->themes_path);
}
$modules = [];
$hiddens = self::getHiddens();
$defines = App::themes()->getDefines($strict ? ['state' => ModuleDefine::STATE_ENABLED] : []);
$defines = dcCore::app()->themes->getDefines($strict ? ['state' => dcModuleDefine::STATE_ENABLED] : []);
foreach ($defines as $define) {
if ($strict && in_array($define->getId(), $hiddens)) {
continue;
}
$modules[(string) $define->getId()] = (string) $define->get('version');
$modules[$define->getId()] = $define->get('version');
}
return $modules;
}
/**
* Get server software and version.
*
* @return array<string,string> The server info
*/
public static function getServer(): array
{
$res = [
'name' => 'undefined',
'version' => 'undefined',
];
if (!empty($_SERVER['SERVER_SOFTWARE'])) {
$exp = explode('/', $_SERVER['SERVER_SOFTWARE']);
if (count($exp) == 2) {
$res = [
'name' => $exp[0],
'version' => $exp[1],
];
}
}
return $res;
}
/**
* Get report contents.
*
@ -171,7 +149,7 @@ class Utils
*/
public static function getError(): string
{
$rs = App::log()->getLogs([
$rs = dcCore::app()->log->getLogs([
'log_table' => My::id() . '_error',
]);
@ -214,18 +192,9 @@ class Utils
$status = 500;
$response = '';
$url = sprintf(self::url(), 'report');
$path = '';
try {
if (false !== ($client = HttpClient::initClient($url, $path))) {
$client->setUserAgent('Dotclear.watch ' . My::id() . '/' . self::DISTANT_API_VERSION);
$client->useGzip(false);
$client->setPersistReferers(false);
$client->post($path, ['key' => self::key(), 'report' => $contents]);
$status = (int) $client->getStatus();
$response = $client->getContent();
} elseif (function_exists('curl_init')) {
if (function_exists('curl_init')) {
if (false !== ($client = curl_init($url))) {
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_POST, true);
@ -235,6 +204,17 @@ class Utils
$status = (int) curl_getinfo($client, CURLINFO_HTTP_CODE);
}
}
} else {
$path = '';
if (false !== ($client = HttpClient::initClient($url, $path))) {
$client->setUserAgent('Dotclear.watch ' . My::id() . '/' . self::DISTANT_API_VERSION);
$client->useGzip(false);
$client->setPersistReferers(false);
$client->post($path, ['key' => self::key(), 'report' => $contents]);
$status = (int) $client->getStatus();
$response = $client->getContent();
}
}
unset($client);
@ -255,24 +235,14 @@ class Utils
}
}
/**
* Check if report can be done.
*
* @return bool True if it can
*/
private static function check(): bool
{
return true; // not yet
return defined('DC_CRYPT_ALGO');
}
/**
* Get report key.
*
* @return string The report key
*/
private static function key(): string
{
return Crypt::hmac(self::uid() . My::id(), App::config()->cryptAlgo());
return Crypt::hmac(self::uid() . My::id(), DC_CRYPT_ALGO);
}
private static function uid(): string
@ -288,21 +258,11 @@ class Utils
return self::$uid;
}
/**
* Get blog report uid.
*
* @return string The blog report uid
*/
private static function buid(): string
{
return md5(self::uid() . App::blog()->uid());
return md5(self::uid() . dcCore::app()->blog->uid);
}
/**
* Get query URL.
*
* @return string The URL
*/
private static function url(): string
{
$api_url = My::settings()->getGlobal('distant_api_url');
@ -310,12 +270,9 @@ class Utils
return (is_string($api_url) ? $api_url : self::DISTANT_API_URL) . '/' . self::DISTANT_API_VERSION . '/%s/' . self::uid();
}
/**
* Clear report logs.
*/
private static function clear(): void
{
$rs = App::log()->getLogs([
$rs = dcCore::app()->log->getLogs([
'log_table' => [
My::id() . '_report',
My::id() . '_error',
@ -330,56 +287,49 @@ class Utils
while ($rs->fetch()) {
$logs[] = (int) $rs->f('log_id');
}
App::log()->delLogs($logs);
dcCore::app()->log->delLogs($logs);
}
/**
* Log error.
*/
private static function error(string $message): void
{
self::clear();
$cur = App::log()->openLogCursor();
$cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME);
$cur->setField('log_table', My::id() . '_error');
$cur->setField('log_msg', $message);
App::log()->addLog($cur);
dcCore::app()->log->addLog($cur);
}
/**
* Write report.
*/
private static function write(string $contents): void
{
self::clear();
$cur = App::log()->openLogCursor();
$cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME);
$cur->setField('log_table', My::id() . '_report');
$cur->setField('log_msg', $contents);
App::log()->addLog($cur);
dcCore::app()->log->addLog($cur);
}
/**
* Check if report is expired.
*
* @return bool True if expired
*/
private static function expired(): bool
private static function read(): string
{
$rs = App::log()->getLogs([
$rs = dcCore::app()->log->getLogs([
'log_table' => My::id() . '_report',
]);
return $rs->isEmpty() || !is_string($rs->f('log_dt')) || (int) strtotime($rs->f('log_dt')) + self::EXPIRED_DELAY < time();
return $rs->isEmpty() || !is_string($rs->f('log_msg')) ? '' : $rs->f('log_msg');
}
private static function expired(): bool
{
$rs = dcCore::app()->log->getLogs([
'log_table' => My::id() . '_report',
]);
return $rs->isEmpty() || !is_string($rs->f('log_dt')) || (int) Date::str('%s', $rs->f('log_dt')) + self::EXPIRED_DELAY < time();
}
/**
* Get report content.
*
* @return string Teh report content
*/
private static function contents(): string
{
// Build json response
@ -389,28 +339,26 @@ class Utils
'plugins' => self::getPlugins(), // enabled plugins
'themes' => self::getThemes(), // enabled themes
'blog' => [
'lang' => (string) App::blog()->settings()->get('system')->get('lang'),
'theme' => (string) App::blog()->settings()->get('system')->get('theme'),
'lang' => (string) dcCore::app()->blog->settings->get('system')->get('lang'),
'theme' => (string) dcCore::app()->blog->settings->get('system')->get('theme'),
],
'blogs' => [
'count' => (int) App::blogs()->getBlogs([], true)->f(0),
'count' => (int) dcCore::app()->getBlogs([], true)->f(0),
],
'core' => [
'version' => App::config()->dotclearVersion(),
'version' => DC_VERSION,
],
'server' => self::getServer(),
'php' => [
'php' => [
'sapi' => php_sapi_name() ?: 'php',
'version' => PHP_VERSION,
'minor' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION,
'version' => phpversion(),
],
'system' => [
'name' => php_uname('s'),
'version' => php_uname('r'),
],
'database' => [
'driver' => App::con()->driver(),
'version' => App::con()->version(),
'driver' => dcCore::app()->con->driver(),
'version' => dcCore::app()->con->version(),
],
], JSON_PRETTY_PRINT);
}