Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5381842
add swagger-ui documentation
pifou25 Jun 21, 2025
7701abe
Fix wrong variable check in scenario AJAX eqLogic validation
kwizer15 Sep 20, 2025
203b1c6
Fix duplicate position parameter in log::getDelta call
kwizer15 Sep 20, 2025
9959357
Fix duplicate position parameter in log::getDelta call (proApi)
kwizer15 Sep 20, 2025
60778c4
Fix PHP 8+ TypeError in cmd::formatValue() when round() receives non-…
kwizer15 Sep 21, 2025
b8768db
Merge pull request #3123 from kwizer15/fix/proapi-log
Salvialf Sep 21, 2025
9fb4d9b
Merge pull request #3120 from kwizer15/fix/jeeapi-log
Salvialf Sep 21, 2025
e607943
Update PHPStan baseline
Salvialf Sep 21, 2025
7c9b02b
Merge pull request #3126 from jeedom/update-phpstan-baseline
Sekiro-kost Sep 21, 2025
48d568b
Merge pull request #3119 from kwizer15/fix/scenario-ajax
Salvialf Sep 21, 2025
28169be
Update PHPStan baseline
Salvialf Sep 21, 2025
6515fe9
Merge pull request #3128 from jeedom/update-phpstan-baseline
Sekiro-kost Sep 21, 2025
818a8a3
Fix scenario report theme parameter: use $options instead of $_parame…
kwizer15 Sep 23, 2025
f9313dd
Merge pull request #3129 from kwizer15/fix/scenario-report-theme-para…
Sekiro-kost Sep 24, 2025
6f0382b
Update PHPStan baseline
Sekiro-kost Sep 24, 2025
2906e09
Merge pull request #3130 from jeedom/update-phpstan-baseline
Sekiro-kost Sep 24, 2025
ed0c9a0
Merge pull request #3124 from kwizer15/fix/cmd-format-value
Sekiro-kost Sep 25, 2025
96bea6c
Update PHPStan baseline
Sekiro-kost Sep 25, 2025
addac37
Merge pull request #3132 from jeedom/update-phpstan-baseline
Sekiro-kost Sep 25, 2025
a0fd920
[Jenkins] Updated translation
Sep 25, 2025
6fcc9f5
add swagger-ui documentation
pifou25 Jun 21, 2025
f4b99f0
Merge branch 'feat/swagger-ui' of https://github.com/pifou25/jeedom-c…
pifou25 Oct 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .htaccess
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Options -Indexes -ExecCGI -FollowSymLinks
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|css|js|php)$
mod_gzip_item_include file .(html?|css|js|php|md)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
Expand Down Expand Up @@ -79,7 +79,9 @@ DirectoryIndex index.php

RedirectMatch 403 (?i)^.*\/data\/.*\/((?!\.m3u8|\.ts|\.jpg|\.jpeg|\.gif|\.webp|\.png|\.mp3|\.mp4|\.aac|\.svg|\.obj|\.mtl|\.woff|\.woff2|\.ttf|\.css|\.pdf|\.css.map|\.js|\.js.map).)*$
RedirectMatch 403 (?i)^.*\/desktop\/.*\/((?!\.png|\.jpg|\.jpeg|\.gif|\.webp|\.css|\.css.map|\.woff|\.woff2|\.ttf|\.svg|\.txt).)*$
RedirectMatch 403 (?i)^.*\/docs\/.*$
# dans /doc/* Refuser tout sauf les fichiers .md et .yaml et .html et ...
RedirectMatch 403 (?i)^.*\/docs\/.*/((?!\.md|\.yaml|\.html|\.js|\.css|\.png|\.map).)*$

RedirectMatch 403 (?i)^.*\/install\/.*$
RedirectMatch 403 (?i)^.*\/log\/.*$
RedirectMatch 403 (?i)^.*\/mobile\/.*\/((?!\.png|\.jpg|\.jpeg|\.gif|\.webp|\.css|\.css.map|\.woff|\.woff2|\.ttf|\.svg|\.html|\.php).)*$
Expand All @@ -101,7 +103,7 @@ Order Allow,Deny

# Allow all :

<FilesMatch ".*\.(css|map|js|jpeg|jpg|png|php|html|svg|woff|woff2|ttf|m3u8|ts|ico|gif|webp|mp3|aac|mp4|pdf|txt)$|(apple\-app\-site\-association)$">
<FilesMatch ".*\.(css|map|js|jpeg|jpg|png|php|html|svg|woff|woff2|ttf|m3u8|ts|ico|gif|webp|mp3|aac|mp4|pdf|txt|md|yaml)$|(apple\-app\-site\-association)$">
Order Allow,Deny
Allow from all
</FilesMatch>
Expand All @@ -127,3 +129,7 @@ Order Allow,Deny
Order Allow,Deny
Deny from all
</FilesMatch>

AddType text/plain .yaml .yml
AddCharset UTF-8 .yaml .yml .html
AddType application/yaml .yaml
2 changes: 1 addition & 1 deletion core/ajax/scenario.ajax.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@
$return[$match[0]] = '';
try {
$eqLogic = eqLogic::byString($match[0]);
if (is_object($cmd)) {
if (is_object($eqLogic)) {
$return[$match[0]] = '#' . $eqLogic->getHumanName() . '#';
}
} catch (Exception $e) {
Expand Down
1 change: 0 additions & 1 deletion core/api/jeeApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -1009,7 +1009,6 @@
$params['log'],
$params['position'],
$params['search'],
$params['position'],
$params['colored'],
$params['numbered'],
$params['numStart'],
Expand Down
1 change: 0 additions & 1 deletion core/api/proApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,6 @@
$params['log'],
$params['position'],
$params['search'],
$params['position'],
$params['colored'],
$params['numbered'],
$params['numStart'],
Expand Down
4 changes: 4 additions & 0 deletions core/class/cmd.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -1042,6 +1042,10 @@ public function formatValue($_value, $_quote = false) {
return intval($binary xor boolval($this->getConfiguration('invertBinary', false)));
case 'numeric':
if ($this->getConfiguration('historizeRound') !== '' && is_numeric($this->getConfiguration('historizeRound')) && $this->getConfiguration('historizeRound') >= 0) {
if (!is_numeric($_value)) {
log::add('cmd', 'error', __('La formule de calcul doit retourner une valeur numérique uniquement : ', __FILE__) . $this->getHumanName() . ' => ' . $_value);
$_value = (float) (str_replace(',', '.', $_value));
}
$_value = round($_value, $this->getConfiguration('historizeRound'));
}
if ($_value > $this->getConfiguration('maxValue', $_value)) {
Expand Down
16 changes: 8 additions & 8 deletions core/class/scenarioExpression.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -1855,8 +1855,8 @@ public function execute(&$scenario = null) {
break;
case 'eqAnalyse':
$url = network::getNetworkAccess('internal') . '/index.php?v=d&p=eqAnalyse&report=1';
if (isset($_parameters['theme']) && $_parameters['theme'] != '') {
$url .= '&theme=' . $_parameters['theme'];
if (isset($options['theme']) && $options['theme'] != '') {
$url .= '&theme=' . $options['theme'];
}
$this->setLog($scenario, __('Génération du rapport', __FILE__) . ' ' . $url);
$cmd_parameters['files'] = array(report::generate($url, 'other', 'eqAnalyse', $options['export_type'], $options));
Expand All @@ -1865,8 +1865,8 @@ public function execute(&$scenario = null) {
break;
case 'eqAnalyseAlert':
$url = network::getNetworkAccess('internal') . '/index.php?v=d&p=eqAnalyse&report=1';
if (isset($_parameters['theme']) && $_parameters['theme'] != '') {
$url .= '&theme=' . $_parameters['theme'];
if (isset($options['theme']) && $options['theme'] != '') {
$url .= '&theme=' . $options['theme'];
}
$this->setLog($scenario, __('Génération du rapport', __FILE__) . ' ' . $url);
$options['tab'] = 'alertEqlogic';
Expand All @@ -1876,8 +1876,8 @@ public function execute(&$scenario = null) {
break;
case 'health':
$url = network::getNetworkAccess('internal') . '/index.php?v=d&p=health&report=1';
if (isset($_parameters['theme']) && $_parameters['theme'] != '') {
$url .= '&theme=' . $_parameters['theme'];
if (isset($options['theme']) && $options['theme'] != '') {
$url .= '&theme=' . $options['theme'];
}
$this->setLog($scenario, __('Génération du rapport', __FILE__) . ' ' . $url);
$cmd_parameters['files'] = array(report::generate($url, 'other', 'health', $options['export_type'], $options));
Expand All @@ -1886,8 +1886,8 @@ public function execute(&$scenario = null) {
break;
case 'timeline':
$url = network::getNetworkAccess('internal') . '/index.php?v=d&p=timeline&report=1&timeline=' . $options['timeline'];
if (isset($_parameters['theme']) && $_parameters['theme'] != '') {
$url .= '&theme=' . $_parameters['theme'];
if (isset($options['theme']) && $options['theme'] != '') {
$url .= '&theme=' . $options['theme'];
}
$this->setLog($scenario, __('Génération du rapport timeline', __FILE__) . ' ' . $options['timeline']);
$cmd_parameters['files'] = array(report::generate($url, 'other', 'timeline', $options['export_type'], $options));
Expand Down
1 change: 1 addition & 0 deletions core/i18n/de_DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Nein",
"Impossible de traduire la couleur en code hexadécimal :": "Farbe kann nicht in hexadezimalen Code übersetzt werden:",
"Type ou sous-type de commande invalide": "Ungültiger Befehlstyp oder Untertyp",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "Der Name des Befehls darf nicht leer sein:",
"Le type de la commande ne peut pas être vide :": "Der Befehlstyp darf nicht leer sein:",
"Le sous-type de la commande ne peut pas être vide :": "Der Befehlssubtyp darf nicht leer sein:",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "None",
"Impossible de traduire la couleur en code hexadécimal :": "Unable to translate color into hexadecimal code:",
"Type ou sous-type de commande invalide": "Invalid command type or subtype",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "The name of the command cannot be empty:",
"Le type de la commande ne peut pas être vide :": "The type of the command cannot be empty:",
"Le sous-type de la commande ne peut pas être vide :": "The command subtype cannot be empty:",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/es_ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "No",
"Impossible de traduire la couleur en code hexadécimal :": "No se puede traducir el color en código hexadecimal :",
"Type ou sous-type de commande invalide": "Tipo o subtipo de comando no válido",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "El nombre del comando no puede estar vacío:",
"Le type de la commande ne peut pas être vide :": "El tipo del comando no puede estar vacío:",
"Le sous-type de la commande ne peut pas être vide :": "El subtipo de comando no puede estar vacío:",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/fr_FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Aucun",
"Impossible de traduire la couleur en code hexadécimal :": "Impossible de traduire la couleur en code hexadécimal :",
"Type ou sous-type de commande invalide": "Type ou sous-type de commande invalide",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement : ",
"Le nom de la commande ne peut pas être vide :": "Le nom de la commande ne peut pas être vide :",
"Le type de la commande ne peut pas être vide :": "Le type de la commande ne peut pas être vide :",
"Le sous-type de la commande ne peut pas être vide :": "Le sous-type de la commande ne peut pas être vide :",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/id_ID.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Tak ada",
"Impossible de traduire la couleur en code hexadécimal :": "Tidak dapat menerjemahkan warna dalam kode heksadesimal:",
"Type ou sous-type de commande invalide": "Type ou sous-type de commande invalide",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "Le nom de la commande ne peut pas être vide :",
"Le type de la commande ne peut pas être vide :": "Le type de la commande ne peut pas être vide :",
"Le sous-type de la commande ne peut pas être vide :": "Le sous-type de la commande ne peut pas être vide :",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/it_IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Nessuno",
"Impossible de traduire la couleur en code hexadécimal :": "Impossibile tradurre il colore in codice esadecimale:",
"Type ou sous-type de commande invalide": "Type ou sous-type de commande invalide",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "Il nome del comando non può essere vuoto:",
"Le type de la commande ne peut pas être vide :": "Il tipo di comando non può essere vuoto:",
"Le sous-type de la commande ne peut pas être vide :": "Il sottotipo di comando non può essere vuoto:",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/ja_JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "いいえ",
"Impossible de traduire la couleur en code hexadécimal :": "進コードで色を変換することができません。",
"Type ou sous-type de commande invalide": "Type ou sous-type de commande invalide",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "Le nom de la commande ne peut pas être vide :",
"Le type de la commande ne peut pas être vide :": "Le type de la commande ne peut pas être vide :",
"Le sous-type de la commande ne peut pas être vide :": "Le sous-type de la commande ne peut pas être vide :",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/pt_PT.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Não",
"Impossible de traduire la couleur en code hexadécimal :": "Incapaz de traduzir cor em código hexadecimal:",
"Type ou sous-type de commande invalide": "Tipo ou subtipo de comando inválido",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "O nome do comando não pode estar vazio:",
"Le type de la commande ne peut pas être vide :": "O tipo do comando não pode estar vazio:",
"Le sous-type de la commande ne peut pas être vide :": "O subtipo de comando não pode estar vazio:",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/ru_RU.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Нет",
"Impossible de traduire la couleur en code hexadécimal :": "Невозможно перевести цвет в шестнадцатеричном коде:",
"Type ou sous-type de commande invalide": "Type ou sous-type de commande invalide",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "Le nom de la commande ne peut pas être vide :",
"Le type de la commande ne peut pas être vide :": "Le type de la commande ne peut pas être vide :",
"Le sous-type de la commande ne peut pas être vide :": "Le sous-type de la commande ne peut pas être vide :",
Expand Down
1 change: 1 addition & 0 deletions core/i18n/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,7 @@
"Aucun": "Hiçbir",
"Impossible de traduire la couleur en code hexadécimal :": "Renk onaltılık koda çevrilemiyor:",
"Type ou sous-type de commande invalide": "Type ou sous-type de commande invalide",
"La formule de calcul doit retourner une valeur numérique uniquement : ": "La formule de calcul doit retourner une valeur numérique uniquement :",
"Le nom de la commande ne peut pas être vide :": "Komutun adı boş olamaz:",
"Le type de la commande ne peut pas être vide :": "Komutun türü boş olamaz:",
"Le sous-type de la commande ne peut pas être vide :": "Komut alt türü boş bırakılamaz:",
Expand Down
2 changes: 0 additions & 2 deletions docs/.htaccess

This file was deleted.

Binary file added docs/swagger-ui/favicon-16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/swagger-ui/favicon-32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions docs/swagger-ui/index.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}

*,
*:before,
*:after {
box-sizing: inherit;
}

body {
margin: 0;
background: #fafafa;
}
19 changes: 19 additions & 0 deletions docs/swagger-ui/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Swagger UI</title>
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
<link rel="stylesheet" type="text/css" href="index.css" />
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
</head>

<body>
<div id="swagger-ui"></div>
<script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
<script src="./swagger-initializer.js" charset="UTF-8"> </script>
</body>
</html>
79 changes: 79 additions & 0 deletions docs/swagger-ui/oauth2-redirect.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<!doctype html>
<html lang="en-US">
<head>
<title>Swagger UI: OAuth2 Redirect</title>
</head>
<body>
<script>
'use strict';
function run () {
var oauth2 = window.opener.swaggerUIRedirectOauth2;
var sentState = oauth2.state;
var redirectUrl = oauth2.redirectUrl;
var isValid, qp, arr;

if (/code|token|error/.test(window.location.hash)) {
qp = window.location.hash.substring(1).replace('?', '&');
} else {
qp = location.search.substring(1);
}

arr = qp.split("&");
arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
qp = qp ? JSON.parse('{' + arr.join() + '}',
function (key, value) {
return key === "" ? value : decodeURIComponent(value);
}
) : {};

isValid = qp.state === sentState;

if ((
oauth2.auth.schema.get("flow") === "accessCode" ||
oauth2.auth.schema.get("flow") === "authorizationCode" ||
oauth2.auth.schema.get("flow") === "authorization_code"
) && !oauth2.auth.code) {
if (!isValid) {
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "warning",
message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server."
});
}

if (qp.code) {
delete oauth2.state;
oauth2.auth.code = qp.code;
oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
} else {
let oauthErrorMsg;
if (qp.error) {
oauthErrorMsg = "["+qp.error+"]: " +
(qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
(qp.error_uri ? "More info: "+qp.error_uri : "");
}

oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "error",
message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server."
});
}
} else {
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
}
window.close();
}

if (document.readyState !== 'loading') {
run();
} else {
document.addEventListener('DOMContentLoaded', function () {
run();
});
}
</script>
</body>
</html>
Loading