mirror of
https://github.com/Combodo/iTop.git
synced 2026-03-09 19:14:19 +01:00
Compare commits
64 Commits
feature/re
...
feature/81
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e898c86a05 | ||
|
|
b3613b6c4b | ||
|
|
ab8e7bd15e | ||
|
|
307c308eb0 | ||
|
|
61e5536b50 | ||
|
|
104dd1970f | ||
|
|
884d64a42a | ||
|
|
44c0a025a8 | ||
|
|
929b8b9eca | ||
|
|
3b8e079cf1 | ||
|
|
36247ba0ee | ||
|
|
091d99b08f | ||
|
|
3c60a80f9b | ||
|
|
ae633111c0 | ||
|
|
52a1d8d626 | ||
|
|
3a64e3bb9e | ||
|
|
fc967c06ce | ||
|
|
d4821b7edc | ||
|
|
94a36c0066 | ||
|
|
62e09f1224 | ||
|
|
57a0b5691f | ||
|
|
f82389d156 | ||
|
|
9e21976424 | ||
|
|
f558093f5d | ||
|
|
5201a1ed3b | ||
|
|
dad39c3ebe | ||
|
|
29920bfeb7 | ||
|
|
2313ee2bbd | ||
|
|
22b0c431a0 | ||
|
|
499b3bca88 | ||
|
|
aede5ea7b8 | ||
|
|
da6c443a35 | ||
|
|
9c39efd9af | ||
|
|
d5f2303ed2 | ||
|
|
48e584503e | ||
|
|
454a1b26eb | ||
|
|
4853ca444e | ||
|
|
330539abd2 | ||
|
|
5357a0c060 | ||
|
|
fc22cce037 | ||
|
|
34c8a57814 | ||
|
|
b91e6c384a | ||
|
|
2247691e58 | ||
|
|
f014b43761 | ||
|
|
076d49abc2 | ||
|
|
9fd0ffd84e | ||
|
|
0f11fd9919 | ||
|
|
2b828f8a22 | ||
|
|
d2f67dcb3c | ||
|
|
d5706fcbef | ||
|
|
807f2a88bc | ||
|
|
9d3311e623 | ||
|
|
9bf2cb7e1d | ||
|
|
0134ead5dd | ||
|
|
54909520e9 | ||
|
|
d124f8ee58 | ||
|
|
3fdbcbc0fb | ||
|
|
a5296e11e1 | ||
|
|
3b62597092 | ||
|
|
b085147f23 | ||
|
|
38fccf85e3 | ||
|
|
c0a2771d4e | ||
|
|
6bd5a7b634 | ||
|
|
82b7ef86c7 |
9
.doc/developers.md
Normal file
9
.doc/developers.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Developers
|
||||
|
||||
## PHP Code Styles
|
||||
We use `PHP CS Fixer` to ensure code formating consistency across PHP codebase.
|
||||
You can find the configuration and instructions to run it [here](../tests/php-code-style/README.md).
|
||||
|
||||
## PHP Static Analysis
|
||||
We use `PHPStan` to ensure code quality and to detect potential bugs in our PHP codebase.
|
||||
You can find the configuration and instructions to run it [here](../tests/php-static-analysis/README.md).
|
||||
14
.github/workflows/action.yml
vendored
14
.github/workflows/action.yml
vendored
@@ -26,13 +26,23 @@ jobs:
|
||||
|
||||
fi
|
||||
|
||||
- name: Add internal tag if member
|
||||
- name: Add internal tag if member of the organization
|
||||
if: env.is_member == 'true'
|
||||
run: |
|
||||
curl -X POST -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/labels \
|
||||
-d '{"labels":["internal"]}'
|
||||
|
||||
- name: Set PR author as assignee if member of the organization
|
||||
if: env.is_member == 'true'
|
||||
run: |
|
||||
curl -L \
|
||||
-X POST \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
||||
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/assignees \
|
||||
-d '{"assignees":["${{ github.event.pull_request.user.login }}"]}'
|
||||
env:
|
||||
is_member: ${{ env.is_member }}
|
||||
|
||||
@@ -40,4 +50,4 @@ jobs:
|
||||
uses: actions/add-to-project@v1.0.2
|
||||
with:
|
||||
project-url: ${{ env.project_url }}
|
||||
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}
|
||||
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -58,6 +58,9 @@ tests/*/vendor/*
|
||||
/tests/php-unit-tests/phpunit.xml
|
||||
/tests/php-unit-tests/postbuild_integration.xml
|
||||
|
||||
# PHP CS Fixer: Cache file
|
||||
/.php-cs-fixer.cache
|
||||
|
||||
|
||||
# Jetbrains
|
||||
/.idea/**
|
||||
|
||||
@@ -73,6 +73,9 @@ iTop development is sponsored, led, and supported by [Combodo][0].
|
||||
|
||||
[0]: https://www.combodo.com
|
||||
|
||||
## Developers
|
||||
|
||||
You can find information and instructions about our quality tools and how to run them [here](.doc/developers.md).
|
||||
|
||||
## Contributors
|
||||
|
||||
|
||||
@@ -97,77 +97,33 @@ class RestUtils
|
||||
* @throws Exception
|
||||
* @api
|
||||
*/
|
||||
public static function GetFieldList($sClass, $oData, $sParamName, $bFailIfNotFound = true)
|
||||
public static function GetFieldList($sClass, $oData, $sParamName)
|
||||
{
|
||||
$sFields = self::GetOptionalParam($oData, $sParamName, '*');
|
||||
return match($sFields) {
|
||||
'*' => self::GetFieldListForClass($sClass),
|
||||
'*+' => self::GetFieldListForParentClass($sClass),
|
||||
default => self::GetLimitedFieldListForClass($sClass, $sFields, $sParamName, $bFailIfNotFound),
|
||||
};
|
||||
}
|
||||
|
||||
public static function HasRequestedExtendedOutput(string $sFields): bool
|
||||
{
|
||||
return match($sFields) {
|
||||
'*' => false,
|
||||
'*+' => true,
|
||||
default => substr_count($sFields, ':') > 1,
|
||||
};
|
||||
}
|
||||
|
||||
public static function HasRequestedAllOutputFields(string $sFields): bool
|
||||
{
|
||||
return match($sFields) {
|
||||
'*', '*+' => true,
|
||||
default => false,
|
||||
};
|
||||
}
|
||||
|
||||
protected static function GetFieldListForClass(string $sClass): array
|
||||
{
|
||||
return [$sClass => array_keys(MetaModel::ListAttributeDefs($sClass))];
|
||||
}
|
||||
|
||||
protected static function GetFieldListForParentClass(string $sClass): array
|
||||
{
|
||||
$aFieldList = array();
|
||||
foreach (MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL) as $sRefClass) {
|
||||
$aFieldList = array_merge($aFieldList, self::GetFieldListForClass($sRefClass));
|
||||
}
|
||||
return $aFieldList;
|
||||
}
|
||||
|
||||
protected static function GetLimitedFieldListForSingleClass(string $sClass, string $sFields, string $sParamName, bool $bFailIfNotFound = true): array
|
||||
{
|
||||
$aFieldList = [$sClass => []];
|
||||
foreach (explode(',', $sFields) as $sAttCode) {
|
||||
$sAttCode = trim($sAttCode);
|
||||
if (($sAttCode == 'id') || (MetaModel::IsValidAttCode($sClass, $sAttCode))) {
|
||||
$aFieldList[$sClass][] = $sAttCode;
|
||||
} else {
|
||||
if ($bFailIfNotFound) {
|
||||
throw new Exception("$sParamName: invalid attribute code '$sAttCode' for class '$sClass'");
|
||||
$aShowFields = [];
|
||||
if ($sFields == '*') {
|
||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||
$aShowFields[$sClass][] = $sAttCode;
|
||||
}
|
||||
} elseif ($sFields == '*+') {
|
||||
foreach (MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL) as $sRefClass) {
|
||||
foreach (MetaModel::ListAttributeDefs($sRefClass) as $sAttCode => $oAttDef) {
|
||||
$aShowFields[$sRefClass][] = $sAttCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $aFieldList;
|
||||
}
|
||||
|
||||
protected static function GetLimitedFieldListForClass(string $sClass, string $sFields, string $sParamName, bool $bFailIfNotFound = true): array
|
||||
{
|
||||
if (!str_contains($sFields, ':')) {
|
||||
return self::GetLimitedFieldListForSingleClass($sClass, $sFields, $sParamName, $bFailIfNotFound);
|
||||
} else {
|
||||
foreach (explode(',', $sFields) as $sAttCode) {
|
||||
$sAttCode = trim($sAttCode);
|
||||
if (($sAttCode != 'id') && (!MetaModel::IsValidAttCode($sClass, $sAttCode))) {
|
||||
throw new Exception("$sParamName: invalid attribute code '$sAttCode'");
|
||||
}
|
||||
$aShowFields[$sClass][] = $sAttCode;
|
||||
}
|
||||
}
|
||||
|
||||
$aFieldList = [];
|
||||
$aFieldListParts = explode(';', $sFields);
|
||||
foreach ($aFieldListParts as $sClassFields) {
|
||||
list($sSubClass, $sSubClassFields) = explode(':', $sClassFields);
|
||||
$aFieldList = array_merge($aFieldList, self::GetLimitedFieldListForSingleClass(trim($sSubClass), trim($sSubClassFields), $sParamName, $bFailIfNotFound));
|
||||
}
|
||||
return $aFieldList;
|
||||
return $aShowFields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and interpret object search criteria from a Rest/Json structure
|
||||
*
|
||||
|
||||
@@ -5632,7 +5632,7 @@ JS
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
final public function AddAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', string $sReason = null): void
|
||||
final public function AddAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', ?string $sReason = null): void
|
||||
{
|
||||
if (!isset($this->aAttributesFlags[$sTargetState])) {
|
||||
$this->aAttributesFlags[$sTargetState] = [];
|
||||
@@ -5655,7 +5655,7 @@ JS
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
final public function ForceAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', string $sReason = null): void
|
||||
final public function ForceAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', ?string $sReason = null): void
|
||||
{
|
||||
if (!isset($this->aAttributesFlags[$sTargetState])) {
|
||||
$this->aAttributesFlags[$sTargetState] = [];
|
||||
@@ -5696,7 +5696,7 @@ JS
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
final public function AddInitialAttributeFlags(string $sAttCode, int $iFlags, string $sReason = null)
|
||||
final public function AddInitialAttributeFlags(string $sAttCode, int $iFlags, ?string $sReason = null)
|
||||
{
|
||||
if (!isset($this->aInitialAttributesFlags)) {
|
||||
$this->aInitialAttributesFlags = [];
|
||||
@@ -5718,7 +5718,7 @@ JS
|
||||
* @return void
|
||||
* @since 3.1.0
|
||||
*/
|
||||
final public function ForceInitialAttributeFlags(string $sAttCode, int $iFlags, string $sReason = null)
|
||||
final public function ForceInitialAttributeFlags(string $sAttCode, int $iFlags, ?string $sReason = null)
|
||||
{
|
||||
if (!isset($this->aInitialAttributesFlags)) {
|
||||
$this->aInitialAttributesFlags = [];
|
||||
|
||||
@@ -1029,7 +1029,7 @@ EOF
|
||||
var dashboard = $('.ibo-dashboard#$sDivId')
|
||||
dashboard.block();
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
|
||||
{ operation: 'toggle_dashboard', dashboard_id: '$sId', file: '$sFile', extra_params: $sExtraParams, reload_url: '$sReloadURL' },
|
||||
{ operation: 'toggle_dashboard', dashboard_id: '$sId', file: '$sFile', extra_params: $sExtraParams, reload_url: $sReloadURL },
|
||||
function(data) {
|
||||
dashboard.html(data);
|
||||
dashboard.unblock();
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
class ForgotPasswordApplicationException extends Exception
|
||||
{
|
||||
}
|
||||
10
application/exceptions/ForgotPasswordUserInputException.php
Normal file
10
application/exceptions/ForgotPasswordUserInputException.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
class ForgotPasswordUserInputException extends Exception
|
||||
{
|
||||
}
|
||||
@@ -243,15 +243,12 @@ class LoginTwigRenderer
|
||||
|
||||
public function GetDefaultVars()
|
||||
{
|
||||
$sVersionShort = Dict::Format('UI:iTopVersion:Short', ITOP_APPLICATION, ITOP_VERSION);
|
||||
$sIconUrl = Utils::GetConfig()->Get('app_icon_url');
|
||||
$sDisplayIcon = Branding::GetLoginLogoAbsoluteUrl();
|
||||
|
||||
$aVars = [
|
||||
'sAppRootUrl' => utils::GetAbsoluteUrlAppRoot(),
|
||||
'aPluginFormData' => $this->GetPluginFormData(),
|
||||
'sItopVersion' => ITOP_VERSION,
|
||||
'sVersionShort' => $sVersionShort,
|
||||
'sIconUrl' => $sIconUrl,
|
||||
'sDisplayIcon' => $sDisplayIcon,
|
||||
];
|
||||
|
||||
@@ -221,15 +221,15 @@ class LoginWebPage extends NiceWebPage
|
||||
|
||||
if ($oUser != null) {
|
||||
if (!MetaModel::IsValidAttCode(get_class($oUser), 'reset_pwd_token')) {
|
||||
throw new Exception(Dict::S('UI:ResetPwd-Error-NotPossible'));
|
||||
throw new ForgotPasswordUserInputException('External accounts do not allow password reset');
|
||||
}
|
||||
if (!$oUser->CanChangePassword()) {
|
||||
throw new Exception(Dict::S('UI:ResetPwd-Error-FixedPwd'));
|
||||
throw new ForgotPasswordUserInputException('The account does not allow password reset');
|
||||
}
|
||||
|
||||
$sTo = $oUser->GetResetPasswordEmail(); // throws Exceptions if not allowed
|
||||
if ($sTo == '') {
|
||||
throw new Exception(Dict::S('UI:ResetPwd-Error-NoEmail'));
|
||||
throw new ForgotPasswordUserInputException('Missing email address for this account');
|
||||
}
|
||||
|
||||
// This token allows the user to change the password without knowing the previous one
|
||||
@@ -255,17 +255,21 @@ class LoginWebPage extends NiceWebPage
|
||||
|
||||
case EMAIL_SEND_ERROR:
|
||||
default:
|
||||
IssueLog::Error('Failed to send the email with the NEW password for '.$oUser->Get('friendlyname').': '.implode(', ', $aIssues));
|
||||
throw new Exception(Dict::S('UI:ResetPwd-Error-Send'));
|
||||
throw new ForgotPasswordApplicationException('Failed to send the password reset email for '.$oUser->Get('friendlyname').': '.implode(', ', $aIssues));
|
||||
}
|
||||
}
|
||||
|
||||
$oTwigContext = new LoginTwigRenderer();
|
||||
$aVars = $oTwigContext->GetDefaultVars();
|
||||
$oTwigContext->Render($this, 'forgotpwdsent.html.twig', $aVars);
|
||||
} catch (Exception $e) {
|
||||
$this->DisplayForgotPwdForm(true, $e->getMessage());
|
||||
} catch (ForgotPasswordApplicationException $e) {
|
||||
IssueLog::Error('Failed to process the forgot password request for user "'.$sAuthUser.'" [reason='.get_class($e).']: '.$e->getMessage());
|
||||
} catch (ForgotPasswordUserInputException $e) {
|
||||
IssueLog::Info('Failed to process the forgot password request for user "'.$sAuthUser.'" [reason='.get_class($e).']: '.$e->getMessage());
|
||||
} catch (\Throwable $e) {
|
||||
IssueLog::Error('Unexpected error while processing the forgot password request for user "'.$sAuthUser.'": '.$e->getMessage());
|
||||
}
|
||||
|
||||
$oTwigContext = new LoginTwigRenderer();
|
||||
$aVars = $oTwigContext->GetDefaultVars();
|
||||
$oTwigContext->Render($this, 'forgotpwdsent.html.twig', $aVars);
|
||||
}
|
||||
|
||||
public function DisplayResetPwdForm($sErrorMessage = null)
|
||||
|
||||
@@ -34,7 +34,7 @@ interface iNewsroomProvider
|
||||
* @param User $oUser The user for who to check if the provider is applicable.
|
||||
* return bool
|
||||
*/
|
||||
public function IsApplicable(User $oUser = null);
|
||||
public function IsApplicable(?User $oUser = null);
|
||||
|
||||
/**
|
||||
* The human readable (localized) label for this provider
|
||||
@@ -139,7 +139,7 @@ abstract class NewsroomProviderBase implements iNewsroomProvider
|
||||
*/
|
||||
abstract public function GetViewAllURL();
|
||||
|
||||
public function IsApplicable(User $oUser = null)
|
||||
public function IsApplicable(?User $oUser = null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ abstract class Query extends cmdbAbstractObject
|
||||
* @return string|null
|
||||
* @since 3.1.0
|
||||
*/
|
||||
abstract public function GetExportUrl(array $aValues = null): ?string;
|
||||
abstract public function GetExportUrl(?array $aValues = null): ?string;
|
||||
|
||||
/**
|
||||
* Update last export information.
|
||||
@@ -227,7 +227,7 @@ class QueryOQL extends Query
|
||||
}
|
||||
|
||||
/** @inheritdoc */
|
||||
public function GetExportUrl(array $aValues = null): ?string
|
||||
public function GetExportUrl(?array $aValues = null): ?string
|
||||
{
|
||||
try {
|
||||
// retrieve attributes
|
||||
|
||||
@@ -967,7 +967,9 @@ CSS;
|
||||
}
|
||||
}
|
||||
}
|
||||
array_map(function ($sVariableValue) { return ltrim($sVariableValue); }, $aVariablesResults);
|
||||
array_map(function ($sVariableValue) {
|
||||
return ltrim($sVariableValue);
|
||||
}, $aVariablesResults);
|
||||
return $aVariablesResults;
|
||||
}
|
||||
|
||||
|
||||
@@ -181,6 +181,9 @@ class utils
|
||||
|
||||
protected static function LoadParamFile($sParamFile)
|
||||
{
|
||||
if (utils::RealPath($sParamFile, APPROOT) !== false) {
|
||||
throw new Exception("File '".utils::HtmlEntities($sParamFile)."' should be outside iTop");
|
||||
}
|
||||
if (!file_exists($sParamFile)) {
|
||||
throw new Exception("Could not find the parameter file: '".utils::HtmlEntities($sParamFile)."'");
|
||||
}
|
||||
@@ -1284,7 +1287,7 @@ class utils
|
||||
* @throws \CoreException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function ExecITopScript(string $sScriptName, array $aArguments, string $sAuthUser = null, string $sAuthPwd = null)
|
||||
public static function ExecITopScript(string $sScriptName, array $aArguments, ?string $sAuthUser = null, ?string $sAuthPwd = null)
|
||||
{
|
||||
$aDisabled = explode(', ', ini_get('disable_functions'));
|
||||
if (in_array('exec', $aDisabled)) {
|
||||
@@ -1374,7 +1377,7 @@ class utils
|
||||
* @return string A path to a folder into which any module can store cache data
|
||||
* The corresponding folder is created or cleaned upon code compilation
|
||||
*/
|
||||
public static function GetCachePath(string $sEnvironment = null): string
|
||||
public static function GetCachePath(?string $sEnvironment = null): string
|
||||
{
|
||||
if (is_null($sEnvironment)) {
|
||||
$sEnvironment = MetaModel::GetEnvironment();
|
||||
@@ -2081,7 +2084,9 @@ SQL;
|
||||
}
|
||||
|
||||
// Remove any remaining nulls (for positions that weren't referenced)
|
||||
$aReplacements = array_filter($aReplacements, static function ($val) { return $val !== null; });
|
||||
$aReplacements = array_filter($aReplacements, static function ($val) {
|
||||
return $val !== null;
|
||||
});
|
||||
} else {
|
||||
// For non-positional, we need to map each position
|
||||
$aReplacements = [];
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"type": "project",
|
||||
"license": "AGPL-3.0-only",
|
||||
"require": {
|
||||
"php": ">=8.1.0 <8.4.0",
|
||||
"php": ">=8.1.0 <8.5.0",
|
||||
"ext-ctype": "*",
|
||||
"ext-dom": "*",
|
||||
"ext-gd": "*",
|
||||
@@ -12,8 +12,7 @@
|
||||
"ext-json": "*",
|
||||
"ext-mysqli": "*",
|
||||
"ext-soap": "*",
|
||||
"apereo/phpcas": "~1.6.0",
|
||||
"firebase/php-jwt": "^6.4.0",
|
||||
"apereo/phpcas": "dev-master",
|
||||
"guzzlehttp/guzzle": "^7.5.1",
|
||||
"league/oauth2-google": "^4.0.1",
|
||||
"nikic/php-parser": "dev-master",
|
||||
@@ -40,10 +39,16 @@
|
||||
"symfony/stopwatch": "~6.4.0",
|
||||
"symfony/web-profiler-bundle": "~6.4.0"
|
||||
},
|
||||
"repositories": [{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/Combodo/PHP-Parser"
|
||||
}],
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/Combodo/PHP-Parser"
|
||||
},
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/EsupPortail/phpCAS"
|
||||
}
|
||||
],
|
||||
"suggest": {
|
||||
"ext-libsodium": "Required to use the AttributeEncryptedString.",
|
||||
"ext-openssl": "Can be used as a polyfill if libsodium is not installed",
|
||||
|
||||
745
composer.lock
generated
745
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -199,7 +199,7 @@ class CellStatus_SearchIssue extends CellStatus_Issue
|
||||
* @param null $sAllowedValues : used for additional message that provides allowed values $sAllowedValues for current class
|
||||
* @param string|null $sAllowedValuesSearch : used to search all allowed values
|
||||
*/
|
||||
public function __construct($sSerializedSearch, $sReason, $sClass = null, $sAllowedValues = null, string $sAllowedValuesSearch = null)
|
||||
public function __construct($sSerializedSearch, $sReason, $sClass = null, $sAllowedValues = null, ?string $sAllowedValuesSearch = null)
|
||||
{
|
||||
parent::__construct(null, null, $sReason);
|
||||
$this->sSerializedSearch = $sSerializedSearch;
|
||||
@@ -876,7 +876,7 @@ class BulkChange
|
||||
return $aResults;
|
||||
}
|
||||
|
||||
protected function CreateObject(&$aResult, $iRow, $aRowData, CMDBChange $oChange = null)
|
||||
protected function CreateObject(&$aResult, $iRow, $aRowData, ?CMDBChange $oChange = null)
|
||||
{
|
||||
$oTargetObj = MetaModel::NewObject($this->m_sClass);
|
||||
|
||||
@@ -965,7 +965,7 @@ class BulkChange
|
||||
* @throws \MySQLException
|
||||
* @throws \MySQLHasGoneAwayException
|
||||
*/
|
||||
protected function UpdateObject(&$aResult, $iRow, $oTargetObj, $aRowData, CMDBChange $oChange = null)
|
||||
protected function UpdateObject(&$aResult, $iRow, $oTargetObj, $aRowData, ?CMDBChange $oChange = null)
|
||||
{
|
||||
$aResult[$iRow] = $this->PrepareObject($oTargetObj, $aRowData, $aErrors);
|
||||
|
||||
@@ -1008,7 +1008,7 @@ class BulkChange
|
||||
*
|
||||
* @throws \BulkChangeException
|
||||
*/
|
||||
protected function UpdateMissingObject(&$aResult, $iRow, $oTargetObj, CMDBChange $oChange = null)
|
||||
protected function UpdateMissingObject(&$aResult, $iRow, $oTargetObj, ?CMDBChange $oChange = null)
|
||||
{
|
||||
$aResult[$iRow] = $this->PrepareMissingObject($oTargetObj, $aErrors);
|
||||
|
||||
@@ -1043,7 +1043,7 @@ class BulkChange
|
||||
}
|
||||
}
|
||||
|
||||
public function Process(CMDBChange $oChange = null)
|
||||
public function Process(?CMDBChange $oChange = null)
|
||||
{
|
||||
if ($oChange) {
|
||||
CMDBObject::SetCurrentChange($oChange);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
use Combodo\iTop\Application\Helper\ExportHelper;
|
||||
use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
|
||||
@@ -13,7 +14,6 @@ use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectUIBlockFactory
|
||||
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
|
||||
use Combodo\iTop\Application\Helper\ExportHelper;
|
||||
use Combodo\iTop\Application\WebPage\Page;
|
||||
use Combodo\iTop\Application\WebPage\WebPage;
|
||||
|
||||
@@ -55,6 +55,8 @@ class CSVBulkExport extends TabularBulkExport
|
||||
$this->aStatusInfo['charset'] = strtoupper(utils::ReadParam('charset', 'UTF-8', true, 'raw_data'));
|
||||
$this->aStatusInfo['formatted_text'] = (bool)utils::ReadParam('formatted_text', 0, true);
|
||||
|
||||
$this->aStatusInfo['ignore_excel_sanitization'] = (bool)utils::ReadParam('ignore_excel_sanitization', 0, true, utils::ENUM_SANITIZATION_FILTER_INTEGER);
|
||||
|
||||
$sDateFormatRadio = utils::ReadParam('csv_date_format_radio', '');
|
||||
switch ($sDateFormatRadio) {
|
||||
case 'default':
|
||||
@@ -223,6 +225,10 @@ class CSVBulkExport extends TabularBulkExport
|
||||
$oRadioCustom->GetInput()->AddCSSClass('ibo-input-checkbox');
|
||||
$oFieldSetDate->AddSubBlock($oRadioCustom);
|
||||
|
||||
$oFieldSetSecurity = FieldSetUIBlockFactory::MakeStandard(Dict::S('Core:BulkExport:Security'));
|
||||
$oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oFieldSetSecurity));
|
||||
$oFieldSetSecurity->AddSubBlock(ExportHelper::GetInputForSanitizeExcelExport());
|
||||
|
||||
$oP->add_ready_script(
|
||||
<<<EOF
|
||||
$('#form_part_csv_options').on('preview_updated', function() { FormatDatesInPreview('csv', 'csv'); });
|
||||
@@ -264,6 +270,13 @@ EOF
|
||||
default:
|
||||
$sRet = trim($oObj->GetAsCSV($sAttCode), '"');
|
||||
}
|
||||
|
||||
// If the option to ignore Excel sanitization is not set or explicitly set to false, apply sanitization
|
||||
if (!(array_key_exists('ignore_excel_sanitization', $this->aStatusInfo)) || $this->aStatusInfo['ignore_excel_sanitization'] === false) {
|
||||
return ExportHelper::SanitizeField($sRet, $this->aStatusInfo['text_qualifier'] ?? '');
|
||||
}
|
||||
|
||||
// The option to ignore Excel sanitization is explicitly set to true: return the raw value without sanitization
|
||||
return $sRet;
|
||||
}
|
||||
|
||||
@@ -337,6 +350,12 @@ EOF
|
||||
$sField = $oObj->GetAsCSV($sAttCode, $this->aStatusInfo['separator'], $this->aStatusInfo['text_qualifier'], $this->bLocalizeOutput, !$this->aStatusInfo['formatted_text']);
|
||||
}
|
||||
}
|
||||
|
||||
// If the option to ignore Excel sanitization is not set or absent, sanitize the field
|
||||
if (!(array_key_exists('ignore_excel_sanitization', $this->aStatusInfo)) || $this->aStatusInfo['ignore_excel_sanitization'] === false) {
|
||||
$sField = ExportHelper::SanitizeField($sField, $this->aStatusInfo['text_qualifier']);
|
||||
}
|
||||
|
||||
if ($this->aStatusInfo['charset'] != 'UTF-8') {
|
||||
// Note: due to bugs in the glibc library it's safer to call iconv on the smallest possible string
|
||||
// and thus to convert field by field and not the whole row or file at once (see ticket N°991)
|
||||
|
||||
@@ -2567,7 +2567,7 @@ abstract class DBObject implements iDisplay
|
||||
*
|
||||
* @see \RestUtils::FindObjectFromKey for the same check in the REST endpoint
|
||||
*/
|
||||
final public function CheckChangedExtKeysValues(callable $oIsObjectLoadableCallback = null)
|
||||
final public function CheckChangedExtKeysValues(?callable $oIsObjectLoadableCallback = null)
|
||||
{
|
||||
if (is_null($oIsObjectLoadableCallback)) {
|
||||
$oIsObjectLoadableCallback = function ($sClass, $sId) {
|
||||
@@ -3727,7 +3727,7 @@ abstract class DBObject implements iDisplay
|
||||
* @throws \MySQLException
|
||||
* @throws \OQLException
|
||||
*/
|
||||
private function ActivateOnObjectUpdateTriggers(?DBObject $oObject, array $aAttributes = null): void
|
||||
private function ActivateOnObjectUpdateTriggers(?DBObject $oObject, ?array $aAttributes = null): void
|
||||
{
|
||||
if (is_null($oObject)) {
|
||||
return;
|
||||
|
||||
@@ -650,7 +650,7 @@ abstract class DBSearch
|
||||
*
|
||||
* @throws OQLException
|
||||
*/
|
||||
public static function FromOQL($sQuery, $aParams = null, ModelReflection $oMetaModel = null)
|
||||
public static function FromOQL($sQuery, $aParams = null, ?ModelReflection $oMetaModel = null)
|
||||
{
|
||||
if (empty($sQuery)) {
|
||||
return null;
|
||||
|
||||
@@ -59,7 +59,7 @@ class DBUnionSearch extends DBSearch
|
||||
public function AllowAllData($bAllowAllData = true)
|
||||
{
|
||||
foreach ($this->aSearches as $oSearch) {
|
||||
$oSearch->AllowAllData();
|
||||
$oSearch->AllowAllData($bAllowAllData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -453,7 +453,7 @@ class DesignElement extends \DOMElement
|
||||
* @throws Exception
|
||||
* @since 3.1.2 3.2.0 N°6974
|
||||
*/
|
||||
public static function _FindNode(DOMNode $oParent, DesignElement $oRefNode, string $sSearchId = null): ?DesignElement
|
||||
public static function _FindNode(DOMNode $oParent, DesignElement $oRefNode, ?string $sSearchId = null): ?DesignElement
|
||||
{
|
||||
$oNodes = self::_FindNodes($oParent, $oRefNode, $sSearchId);
|
||||
if ($oNodes instanceof DOMNodeList) {
|
||||
@@ -477,7 +477,7 @@ class DesignElement extends \DOMElement
|
||||
* @return \DOMNodeList|false|mixed
|
||||
* @since 3.1.2 3.2.0 N°6974
|
||||
*/
|
||||
public static function _FindNodes(DOMNode $oParent, DesignElement $oRefNode, string $sSearchId = null)
|
||||
public static function _FindNodes(DOMNode $oParent, DesignElement $oRefNode, ?string $sSearchId = null)
|
||||
{
|
||||
if ($oParent instanceof DOMDocument) {
|
||||
$oDoc = $oParent->firstChild->ownerDocument;
|
||||
|
||||
@@ -632,7 +632,7 @@ class DisplayableGroupNode extends DisplayableNode
|
||||
$this->aObjects = [];
|
||||
}
|
||||
|
||||
public function AddObject(DBObject $oObj = null)
|
||||
public function AddObject(?DBObject $oObj = null)
|
||||
{
|
||||
if (is_object($oObj)) {
|
||||
$sPrevClass = $this->GetObjectClass();
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
use Combodo\iTop\Application\Helper\ExportHelper;
|
||||
use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
|
||||
use Combodo\iTop\Application\Helper\ExportHelper;
|
||||
use Combodo\iTop\Application\WebPage\Page;
|
||||
use Combodo\iTop\Application\WebPage\WebPage;
|
||||
|
||||
@@ -63,6 +63,8 @@ class ExcelBulkExport extends TabularBulkExport
|
||||
// Export from the command line (or scripted) => default format is SQL, as in previous versions of iTop, unless specified otherwise
|
||||
$this->aStatusInfo['date_format'] = utils::ReadParam('date_format', (string)AttributeDateTime::GetSQLFormat(), true, 'raw_data');
|
||||
}
|
||||
|
||||
$this->aStatusInfo['ignore_excel_sanitization'] = (bool)utils::ReadParam('ignore_excel_sanitization', 0, true, utils::ENUM_SANITIZATION_FILTER_INTEGER);
|
||||
}
|
||||
|
||||
public function EnumFormParts()
|
||||
@@ -121,6 +123,10 @@ class ExcelBulkExport extends TabularBulkExport
|
||||
$oRadioCustom->GetInput()->AddCSSClass('ibo-input-checkbox');
|
||||
$oFieldSetDate->AddSubBlock($oRadioCustom);
|
||||
|
||||
$oFieldSetSecurity = FieldSetUIBlockFactory::MakeStandard(Dict::S('Core:BulkExport:Security'));
|
||||
$oMulticolumn->AddColumn(ColumnUIBlockFactory::MakeForBlock($oFieldSetSecurity));
|
||||
$oFieldSetSecurity->AddSubBlock(ExportHelper::GetInputForSanitizeExcelExport());
|
||||
|
||||
$oP->add_ready_script(
|
||||
<<<EOF
|
||||
$('#form_part_xlsx_options').on('preview_updated', function() { FormatDatesInPreview('excel', 'xlsx'); });
|
||||
@@ -216,6 +222,12 @@ EOF
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If the option to ignore Excel sanitization is not set or absent, sanitize the field
|
||||
if (!(array_key_exists('ignore_excel_sanitization', $this->aStatusInfo)) || $this->aStatusInfo['ignore_excel_sanitization'] === false) {
|
||||
return ExportHelper::SanitizeField($sRet, '');
|
||||
}
|
||||
|
||||
return $sRet;
|
||||
}
|
||||
|
||||
|
||||
@@ -259,13 +259,18 @@ class InlineImage extends DBObject
|
||||
* that refer to an InlineImage (detected via the attribute data-img-id="") so that
|
||||
* the URL is consistent with the current URL of the application.
|
||||
*
|
||||
* @param string $sHtml The HTML fragment to process
|
||||
N°8681 * @param string|null $sHtml The HTML fragment to process
|
||||
*
|
||||
* @return string The modified HTML
|
||||
* @throws \Exception
|
||||
*
|
||||
* @since 3.3.0 N°8681 Add type hint for parameters and return value
|
||||
*/
|
||||
public static function FixUrls($sHtml)
|
||||
public static function FixUrls(string|null $sHtml): string
|
||||
{
|
||||
// N°8681 - Ensure to have a string value
|
||||
$sHtml = $sHtml ?? '';
|
||||
|
||||
$aNeedles = [];
|
||||
$aReplacements = [];
|
||||
// Find img tags with an attribute data-img-id
|
||||
|
||||
@@ -1656,7 +1656,7 @@ class PHP_ParserGenerator_Data
|
||||
function emit_code($out, PHP_ParserGenerator_Rule $rp, &$lineno)
|
||||
{
|
||||
$linecnt = 0;
|
||||
|
||||
|
||||
/* Generate code to do the reduce action */
|
||||
if ($rp->code) {
|
||||
$this->tplt_linedir($out, $rp->line, $this->filename);
|
||||
|
||||
@@ -1084,7 +1084,7 @@ static public $yy_action = array(
|
||||
function yy_find_shift_action($iLookAhead)
|
||||
{
|
||||
$stateno = $this->yystack[$this->yyidx]->stateno;
|
||||
|
||||
|
||||
/* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
|
||||
if (!isset(self::$yy_shift_ofst[$stateno])) {
|
||||
// no shift actions
|
||||
@@ -1767,7 +1767,7 @@ throw new OQLParserParseFailureException($this->m_sSourceQuery, $this->m_iLine,
|
||||
function yy_syntax_error($yymajor, $TOKEN)
|
||||
{
|
||||
#line 25 "..\oql-parser.y"
|
||||
|
||||
|
||||
throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
|
||||
#line 1779 "..\oql-parser.php"
|
||||
}
|
||||
@@ -1806,7 +1806,7 @@ throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $
|
||||
// $yyact; /* The parser action. */
|
||||
// $yyendofinput; /* True if we are at the end of input */
|
||||
$yyerrorhit = 0; /* True if yymajor has invoked an error */
|
||||
|
||||
|
||||
/* (re)initialize the parser, if necessary */
|
||||
if ($this->yyidx === null || $this->yyidx < 0) {
|
||||
/* if ($yymajor == 0) return; // not sure why this was here... */
|
||||
@@ -1819,7 +1819,7 @@ throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $
|
||||
array_push($this->yystack, $x);
|
||||
}
|
||||
$yyendofinput = ($yymajor==0);
|
||||
|
||||
|
||||
if (self::$yyTraceFILE) {
|
||||
fprintf(
|
||||
self::$yyTraceFILE,
|
||||
@@ -1828,7 +1828,7 @@ throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $
|
||||
self::$yyTokenName[$yymajor]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
do {
|
||||
$yyact = $this->yy_find_shift_action($yymajor);
|
||||
if ($yymajor < self::YYERRORSYMBOL
|
||||
@@ -2002,7 +2002,7 @@ class OQLParser extends OQLParserRaw
|
||||
$this->m_sSourceQuery = $sQuery;
|
||||
// no constructor - parent::__construct();
|
||||
}
|
||||
|
||||
|
||||
public function doParse($token, $value, $iCurrPosition = 0)
|
||||
{
|
||||
$this->m_iColPrev = $this->m_iCol;
|
||||
@@ -2016,7 +2016,7 @@ class OQLParser extends OQLParserRaw
|
||||
$this->doParse(0, 0);
|
||||
return $this->my_result;
|
||||
}
|
||||
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
// Bug in the original destructor, causing an infinite loop !
|
||||
|
||||
@@ -370,7 +370,7 @@ class ormCaseLog
|
||||
/**
|
||||
* Produces an HTML representation, aimed at being used within the iTop framework
|
||||
*/
|
||||
public function GetAsHTML(WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
|
||||
public function GetAsHTML(?WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
|
||||
{
|
||||
$bPrintableVersion = (utils::ReadParam('printable', '0') == '1');
|
||||
|
||||
|
||||
@@ -362,8 +362,7 @@ class ormDocument
|
||||
throw new Exception("Invalid id ($id) for class '$sClass' - the object does not exist or you are not allowed to view it");
|
||||
}
|
||||
}
|
||||
if (($sSecretField != null) && ($oObj->Get($sSecretField) != $sSecretValue)) {
|
||||
usleep(200);
|
||||
if (($sSecretField != null) && !hash_equals($oObj->Get($sSecretField), $sSecretValue)) {
|
||||
throw new Exception("Invalid secret for class '$sClass' - the object does not exist or you are not allowed to view it");
|
||||
}
|
||||
/** @var \ormDocument $oDocument */
|
||||
|
||||
@@ -93,7 +93,7 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator
|
||||
* @param DBObjectSet|null $oOriginalSet
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct($sHostClass, $sAttCode, DBObjectSet $oOriginalSet = null)
|
||||
public function __construct($sHostClass, $sAttCode, ?DBObjectSet $oOriginalSet = null)
|
||||
{
|
||||
$this->sHostClass = $sHostClass;
|
||||
$this->sAttCode = $sAttCode;
|
||||
|
||||
@@ -98,9 +98,9 @@ class ormPassword
|
||||
$bResult = false;
|
||||
$aInfo = password_get_info($this->m_sHashed);
|
||||
if (is_null($aInfo["algo"]) || $aInfo["algo"] === 0) {
|
||||
//unknown, assume it's a legacy password
|
||||
// - Unknown algorithm, assume it's a legacy password
|
||||
$sHashedPwd = $this->ComputeHash($sClearTextPassword);
|
||||
$bResult = ($this->m_sHashed == $sHashedPwd);
|
||||
$bResult = hash_equals($this->m_sHashed, $sHashedPwd);
|
||||
} else {
|
||||
$bResult = password_verify($sClearTextPassword, $this->m_sHashed);
|
||||
}
|
||||
|
||||
@@ -248,45 +248,6 @@ class RestResultWithObjects extends RestResult
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @package RESTAPI
|
||||
* @api
|
||||
*/
|
||||
class RestResultWithObjectSets extends RestResultWithObjects
|
||||
{
|
||||
private $current_object = null;
|
||||
|
||||
public function MakeNewObjectSet()
|
||||
{
|
||||
$arr = array();
|
||||
$this->current_object = &$arr;
|
||||
$this->objects[] = &$arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the given object
|
||||
*
|
||||
* @api
|
||||
* @param string $sObjectAlias Name of the subobject, usually the OQL class alias
|
||||
* @param int $iCode An error code (RestResult::OK is no issue has been found)
|
||||
* @param string $sMessage Description of the error if any, an empty string otherwise
|
||||
* @param DBObject $oObject The object being reported
|
||||
* @param array|null $aFieldSpec An array of class => attribute codes (Cf. RestUtils::GetFieldList). List of the attributes to be reported.
|
||||
* @param boolean $bExtendedOutput Output all of the link set attributes ?
|
||||
*
|
||||
* @return void
|
||||
* @throws \ArchivedObjectException
|
||||
* @throws \CoreException
|
||||
* @throws \CoreUnexpectedValue
|
||||
* @throws \MySQLException
|
||||
*/
|
||||
public function AppendSubObject($sObjectAlias, $iCode, $sMessage, $oObject, $aFieldSpec = null, $bExtendedOutput = false)
|
||||
{
|
||||
$oObjRes = ObjectResult::FromDBObject($oObject, $aFieldSpec, $bExtendedOutput, $iCode, $sMessage);
|
||||
$this->current_object[$sObjectAlias] = $oObjRes;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @package RESTAPI
|
||||
* @api
|
||||
@@ -539,22 +500,15 @@ class CoreServices implements iRestServiceProvider, iRestInputSanitizer
|
||||
break;
|
||||
|
||||
case 'core/get':
|
||||
$sClassParam = RestUtils::GetMandatoryParam($aParams, 'class');
|
||||
$sClass = RestUtils::GetClass($aParams, 'class');
|
||||
$key = RestUtils::GetMandatoryParam($aParams, 'key');
|
||||
$sShowFields = RestUtils::GetOptionalParam($aParams, 'output_fields', '*');
|
||||
$aShowFields = RestUtils::GetFieldList($sClass, $aParams, 'output_fields');
|
||||
$bExtendedOutput = (RestUtils::GetOptionalParam($aParams, 'output_fields', '*') == '*+');
|
||||
$iLimit = (int)RestUtils::GetOptionalParam($aParams, 'limit', 0);
|
||||
$iPage = (int)RestUtils::GetOptionalParam($aParams, 'page', 1);
|
||||
|
||||
// Validate the class(es)
|
||||
$aClass = explode(',', $sClassParam);
|
||||
foreach ($aClass as $sClass) {
|
||||
if (!MetaModel::IsValidClass(trim($sClass))) {
|
||||
throw new Exception("class '$sClass' is not valid");
|
||||
}
|
||||
}
|
||||
|
||||
$oObjectSet = RestUtils::GetObjectSetFromKey($sClassParam, $key, $iLimit, self::getOffsetFromLimitAndPage($iLimit, $iPage));
|
||||
$sTargetClass = $oObjectSet->GetFilter()->GetClass();
|
||||
$oObjectSet = RestUtils::GetObjectSetFromKey($sClass, $key, $iLimit, self::getOffsetFromLimitAndPage($iLimit, $iPage));
|
||||
$sTargetClass = $oObjectSet->GetFilter()->GetClass();
|
||||
|
||||
if (UserRights::IsActionAllowed($sTargetClass, UR_ACTION_READ) != UR_ALLOWED_YES) {
|
||||
$oResult->code = RestResult::UNAUTHORIZED;
|
||||
@@ -565,67 +519,19 @@ class CoreServices implements iRestServiceProvider, iRestInputSanitizer
|
||||
} elseif ($iPage < 1) {
|
||||
$oResult->code = RestResult::INVALID_PAGE;
|
||||
$oResult->message = "The request page number is not valid. It must be an integer greater than 0";
|
||||
} elseif (count($oObjectSet->GetSelectedClasses()) > 1) {
|
||||
$oResult = new RestResultWithObjectSets();
|
||||
$aCache = [];
|
||||
$aShowFields = [];
|
||||
foreach ($oObjectSet->GetSelectedClasses() as $sSelectedClass) {
|
||||
$aShowFields = array_merge( $aShowFields, RestUtils::GetFieldList($sSelectedClass, $aParams, 'output_fields', false));
|
||||
}
|
||||
|
||||
while ($oObjects = $oObjectSet->FetchAssoc()) {
|
||||
$oResult->MakeNewObjectSet();
|
||||
|
||||
foreach ($oObjects as $sAlias => $oObject) {
|
||||
if (!$oObject) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!array_key_exists($sAlias, $aCache)) {
|
||||
$sClass = get_class($oObject);
|
||||
$bExtendedOutput = RestUtils::HasRequestedExtendedOutput($sShowFields);
|
||||
|
||||
if (!RestUtils::HasRequestedAllOutputFields($sShowFields)) {
|
||||
$aFields = $aShowFields[$sClass];
|
||||
//Id is not a valid attribute to optimize
|
||||
if ($aFields && in_array('id', $aFields)) {
|
||||
unset($aFields[array_search('id', $aFields)]);
|
||||
}
|
||||
$aAttToLoad = [$sAlias => $aFields];
|
||||
$oObjectSet->OptimizeColumnLoad($aAttToLoad);
|
||||
}
|
||||
$aCache[$sAlias] = [
|
||||
'aShowFields' => $aShowFields,
|
||||
'bExtendedOutput' => $bExtendedOutput,
|
||||
];
|
||||
} else {
|
||||
$aShowFields = $aCache[$sAlias]['aShowFields'];
|
||||
$bExtendedOutput = $aCache[$sAlias]['bExtendedOutput'];
|
||||
}
|
||||
|
||||
$oResult->AppendSubObject($sAlias, 0, '', $oObject, $aShowFields, $bExtendedOutput);
|
||||
}
|
||||
}
|
||||
$oResult->message = "Found: ".$oObjectSet->Count();
|
||||
} else {
|
||||
$aShowFields =[];
|
||||
foreach ($aClass as $sSelectedClass) {
|
||||
$sSelectedClass = trim($sSelectedClass);
|
||||
$aShowFields = array_merge($aShowFields, RestUtils::GetFieldList($sSelectedClass, $aParams, 'output_fields', false));
|
||||
}
|
||||
|
||||
if (!RestUtils::HasRequestedAllOutputFields($sShowFields) && count($aShowFields) == 1) {
|
||||
$aFields = $aShowFields[$sClass];
|
||||
//Id is not a valid attribute to optimize
|
||||
if (in_array('id', $aFields)) {
|
||||
unset($aFields[array_search('id', $aFields)]);
|
||||
}
|
||||
if (!$bExtendedOutput && RestUtils::GetOptionalParam($aParams, 'output_fields', '*') != '*') {
|
||||
$aFields = $aShowFields[$sClass];
|
||||
//Id is not a valid attribute to optimize
|
||||
if (in_array('id', $aFields)) {
|
||||
unset($aFields[array_search('id', $aFields)]);
|
||||
}
|
||||
$aAttToLoad = [$oObjectSet->GetClassAlias() => $aFields];
|
||||
$oObjectSet->OptimizeColumnLoad($aAttToLoad);
|
||||
}
|
||||
$oObjectSet->OptimizeColumnLoad($aAttToLoad);
|
||||
}
|
||||
|
||||
while ($oObject = $oObjectSet->Fetch()) {
|
||||
$oResult->AddObject(0, '', $oObject, $aShowFields, RestUtils::HasRequestedExtendedOutput($sShowFields));
|
||||
$oResult->AddObject(0, '', $oObject, $aShowFields, $bExtendedOutput);
|
||||
}
|
||||
$oResult->message = "Found: ".$oObjectSet->Count();
|
||||
}
|
||||
|
||||
@@ -4,3 +4,4 @@
|
||||
*/
|
||||
|
||||
@import "bulk-modify";
|
||||
@import "bulk-export";
|
||||
|
||||
10
css/backoffice/application/bulk/_bulk-export.scss
Normal file
10
css/backoffice/application/bulk/_bulk-export.scss
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
#form_part_csv_options:has(#ibo-sanitize-excel-export--input:checked), #form_part_xlsx_options:has(#ibo-sanitize-excel-export--input:checked){
|
||||
#ibo-sanitize-excel-export--alert {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@@ -72,9 +72,12 @@ $ibo-panel--icon--spacing--as-medallion--is-sticking: $ibo-panel--icon--spacing-
|
||||
$ibo-panel--icon--bottom--as-medallion--is-sticking: -12px !default;
|
||||
$ibo-panel--icon--border--as-medallion--is-sticking: 1px $ibo-panel--base-border-style $ibo-panel--base-border-color !default;
|
||||
|
||||
$ibo-panel--icon-background--size--must-contain: contain !default;
|
||||
$ibo-panel--icon-background--size--must-cover: cover !default;
|
||||
$ibo-panel--icon-background--size--must-zoomout: 66.67% !default;
|
||||
$ibo-panel--icon-background--size--must-contain: contain !default; // deprecated, to be removed in favor of $ibo-panel--icon-img--size--must-contain
|
||||
$ibo-panel--icon-background--size--must-cover: cover !default; // deprecated, to be removed in favor of $ibo-panel--icon-img--size--must-cover
|
||||
$ibo-panel--icon-background--size--must-zoomout: 66.67% !default; // deprecated, to be removed in favor of $ibo-panel--icon-img--size--must-zoomout
|
||||
$ibo-panel--icon-img--size--must-contain: $ibo-panel--icon-background--size--must-contain !default; // TODO remove when dealing with N°9317
|
||||
$ibo-panel--icon-img--size--must-cover: $ibo-panel--icon-background--size--must-cover !default; // TODO remove when dealing with N°9317
|
||||
$ibo-panel--icon-img--size--must-zoomout: $ibo-panel--icon-background--size--must-zoomout !default; // TODO remove when dealing with N°9317
|
||||
|
||||
$ibo-panel--title--font-size--is-sticking: $ibo-font-size-150 !default;
|
||||
$ibo-panel--title--color: $ibo-color-grey-900 !default;
|
||||
@@ -179,24 +182,25 @@ $ibo-panel--is-selectable--body--after--font-size: $ibo-font-size-700 !default;
|
||||
min-height: $ibo-panel--icon--size;
|
||||
}
|
||||
|
||||
.ibo-panel--icon-background {
|
||||
.ibo-panel--icon-img, .ibo-panel--icon-background { // second class is deprecated, remove it when dealing with N°9317
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: $ibo-panel--icon-background--size--must-contain;
|
||||
background-size: $ibo-panel--icon-img--size--must-contain;
|
||||
}
|
||||
|
||||
.ibo-panel--icon-background--must-contain {
|
||||
background-size: $ibo-panel--icon-background--size--must-contain;
|
||||
.ibo-panel--icon-img--must-contain, .ibo-panel--icon-background--must-contain { // second class is deprecated, remove it when dealing with N°9317
|
||||
background-size: $ibo-panel--icon-img--size--must-contain;
|
||||
}
|
||||
|
||||
.ibo-panel--icon-background--must-cover {
|
||||
background-size: $ibo-panel--icon-background--size--must-cover;
|
||||
.ibo-panel--icon-img--must-cover, .ibo-panel--icon-background--must-cover { // second class is deprecated, remove it when dealing with N°9317
|
||||
background-size: $ibo-panel--icon-img--size--must-cover;
|
||||
}
|
||||
|
||||
.ibo-panel--icon-background--must-zoomout {
|
||||
background-size: $ibo-panel--icon-background--size--must-zoomout;
|
||||
.ibo-panel--icon-img--must-zoomout, .ibo-panel--icon-background--must-zoomout { // second class is deprecated, remove it when dealing with N°9317
|
||||
width: $ibo-panel--icon-img--size--must-zoomout;
|
||||
height: $ibo-panel--icon-img--size--must-zoomout;
|
||||
}
|
||||
|
||||
.ibo-panel--title {
|
||||
|
||||
@@ -11,9 +11,12 @@ $ibo-title--icon--size: 90px !default;
|
||||
$ibo-title--icon--size-2: 80px !default;
|
||||
$ibo-title--icon--size-3: 70px !default;
|
||||
|
||||
$ibo-title--icon-background--size--must-contain: contain !default;
|
||||
$ibo-title--icon-background--size--must-cover: cover !default;
|
||||
$ibo-title--icon-background--size--must-zoomout: 66.67% !default;
|
||||
$ibo-title--icon-background--size--must-contain: contain !default; // deprecated, to be removed in favor of $ibo-title--icon-img--size--must-contain
|
||||
$ibo-title--icon-background--size--must-cover: cover !default; // deprecated, to be removed in favor of $ibo-title--icon-img--size--must-cover
|
||||
$ibo-title--icon-background--size--must-zoomout: 66.67% !default; // deprecated, to be removed in favor of $ibo-title--icon-img--size--must-zoomout
|
||||
$ibo-title--icon-img--size--must-contain: $ibo-title--icon-background--size--must-contain !default; // TODO remove when dealing with N°9317
|
||||
$ibo-title--icon-img--size--must-cover: $ibo-title--icon-background--size--must-cover !default; // TODO remove when dealing with N°9317
|
||||
$ibo-title--icon-img--size--must-zoomout: $ibo-title--icon-background--size--must-zoomout !default; // TODO remove when dealing with N°9317
|
||||
|
||||
|
||||
.ibo-title {
|
||||
@@ -44,24 +47,23 @@ $ibo-title--icon-background--size--must-zoomout: 66.67% !default;
|
||||
min-height: $ibo-title--icon--size-3;
|
||||
}
|
||||
|
||||
.ibo-title--icon-background {
|
||||
.ibo-title--icon-img, .ibo-title--icon-background { // second class is deprecated, remove it when dealing with N°9317
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: $ibo-title--icon-background--size--must-contain;
|
||||
object-position: center;
|
||||
background-size: $ibo-title--icon-img--size--must-contain;
|
||||
}
|
||||
|
||||
.ibo-title--icon-background--must-contain {
|
||||
background-size: $ibo-title--icon-background--size--must-contain;
|
||||
.ibo-title--icon-img--must-contain, .ibo-title--icon-background--must-contain { // second class is deprecated, remove it when dealing with N°9317
|
||||
background-size: $ibo-title--icon-img--size--must-contain;
|
||||
}
|
||||
|
||||
.ibo-title--icon-background--must-cover {
|
||||
background-size: $ibo-title--icon-background--size--must-cover;
|
||||
.ibo-title--icon-img--must-cover, .ibo-title--icon-background--must-cover { // second class is deprecated, remove it when dealing with N°9317
|
||||
background-size: $ibo-title--icon-img--size--must-cover;
|
||||
}
|
||||
|
||||
.ibo-title--icon-background--must-zoomout {
|
||||
background-size: $ibo-title--icon-background--size--must-zoomout;
|
||||
.ibo-title--icon-img--must-zoomout, .ibo-title--icon-background--must-zoomout { // second class is deprecated, remove it when dealing with N°9317
|
||||
background-size: $ibo-title--icon-img--size--must-zoomout;
|
||||
}
|
||||
|
||||
.ibo-title--for-object-details {
|
||||
|
||||
2
css/backoffice/vendors/_selectize.scss
vendored
2
css/backoffice/vendors/_selectize.scss
vendored
@@ -29,7 +29,7 @@ $ibo-vendors-selectize--element--active--background: $ibo-color-blue-100 !defaul
|
||||
$ibo-vendors-selectize--element--active--color: $ibo-color-grey-900 !default;
|
||||
|
||||
$ibo-vendors-selectize--dropdown--background-color: $ibo-vendors-selectize-input--background-color !default;
|
||||
$ibo-vendors-selectize--dropdown--color: $ibo-vendors-selectize-input--color!default;
|
||||
$ibo-vendors-selectize--dropdown--color: $ibo-vendors-selectize-input--color !default;
|
||||
|
||||
$ibo-vendors-selectize--header--padding-x: 8px !default;
|
||||
$ibo-vendors-selectize--header--padding-y: 5px !default;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
||||
<module_parameters>
|
||||
<parameters id="authent-local" _delta="define">
|
||||
<password_validation.pattern>^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$</password_validation.pattern>
|
||||
<password_validation.pattern>^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{12,}$</password_validation.pattern>
|
||||
<password_validation.message type="hash"/>
|
||||
</parameters>
|
||||
</module_parameters>
|
||||
|
||||
@@ -29,7 +29,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Heslo nemůže uživatel změnit.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Heslo bylo obnoveno',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Termín, kdy bylo heslo změneno',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Heslo musí obsahovat minimálně 8 znaků a musí obsahovat minimálně jedno velké písmeno, jedno malé písmeno, jedno číslo a speciální znak.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Heslo musí obsahovat minimálně 12 znaků a musí obsahovat minimálně jedno velké písmeno, jedno malé písmeno, jedno číslo a speciální znak.',
|
||||
'UserLocal:password:expiration' => 'Níže uvedená pole vyžadují rozšíření',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Nastavení exspirace "Jednorázového hesla" nelze u vlastního účtu uživatele.',
|
||||
]);
|
||||
|
||||
@@ -28,7 +28,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||
]);
|
||||
|
||||
@@ -28,7 +28,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Letzte Passworterneuerung',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Letztes Änderungsdatum',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort entspricht nicht dem in den Konfigurationsregeln hinterlegten RegEx-Ausdruck',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort muss mindestens 12 Zeichen lang sein und Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten.',
|
||||
'UserLocal:password:expiration' => 'Die folgenden Felder benötigen eine '.ITOP_APPLICATION_SHORT.' Erweiterung',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Das setzen des Passwortablaufs auf "Einmalpasswort" ist für den eigenen Benutzer nicht erlaubt.',
|
||||
]);
|
||||
|
||||
@@ -55,7 +55,7 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
|
||||
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.',
|
||||
'UserLocal:password:expiration' => 'The fields below require an extension',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
|
||||
]);
|
||||
|
||||
@@ -55,7 +55,7 @@ Dict::Add('EN GB', 'British English', 'British English', [
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
|
||||
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.',
|
||||
'UserLocal:password:expiration' => 'The fields below require an extension',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
|
||||
]);
|
||||
|
||||
@@ -25,7 +25,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'El usuario no puede cambiar la contraseña.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Renovación de contraseña',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Cuando fue el último cambio de contraseña',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La contraseña debe ser de al menos 8 caracteres e incluír mayúsculas, minúsculas, números y caracteres especiales.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La contraseña debe ser de al menos 12 caracteres e incluir mayúsculas, minúsculas, números y caracteres especiales.',
|
||||
'UserLocal:password:expiration' => 'El siguiente campo requiere una extensión',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Configurar expiración de contraseña para "ontraseña de un solo uso" no está permitido para su propio Usuario',
|
||||
]);
|
||||
|
||||
@@ -27,7 +27,7 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Mot de passe changé le',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Dernière date à laquelle le mot de passe a été changé',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Le mot de passe doit contenir au moins 8 caractères, avec minuscule, majuscule, nombre et caractère spécial.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Le mot de passe doit contenir au moins 12 caractères, avec minuscule, majuscule, nombre et caractère spécial.',
|
||||
'UserLocal:password:expiration' => 'Les champs ci-dessous nécessitent une extension',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Impossible de mettre "Usage unique" comme validité du mot de passe pour son propre utilisateur.',
|
||||
]);
|
||||
|
||||
@@ -27,7 +27,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'A felhasználó nem változtathat jelszót.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Jelszó megújítás ideje',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'A jelszó legutóbbi módosításának időpontja',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'A jelszónak legalább 8 karakterből kell állnia, és tartalmaznia kell nagybetűket, kisbetűket, numerikus és speciális karaktereket.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'A jelszónak legalább 12 karakterből kell állnia, és tartalmaznia kell nagybetűket, kisbetűket, numerikus és speciális karaktereket.',
|
||||
'UserLocal:password:expiration' => 'Az alábbi mezőkhöz egy bővítmény szükséges',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'A jelszó lejárati idejének beállítása "Egyszeri jelszóra" nem engedélyezett a saját Felhasználó számára.',
|
||||
]);
|
||||
|
||||
@@ -27,7 +27,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'La password non può essere cambiata dall\'utente.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Rinnovo della password',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Quando è stata cambiata l\'ultima volta la password',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La password deve essere di almeno 8 caratteri e includere lettere maiuscole, minuscole, numeri e caratteri speciali.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La password deve essere di almeno 12 caratteri e includere lettere maiuscole, minuscole, numeri e caratteri speciali.',
|
||||
'UserLocal:password:expiration' => 'I campi sottostanti richiedono un\'estensione',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Impostare la scadenza della password su "Password monouso" non è consentito per il proprio utente',
|
||||
]);
|
||||
|
||||
@@ -28,7 +28,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||
]);
|
||||
|
||||
@@ -28,7 +28,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'De gebruiker kan dit wachtwoord niet veranderen.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Wachtwoord laatst aangepast',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Tijdstip waarop het wachtwoord het laatst aangepast werd.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Het wachtwoord bestaat uit minstens 8 tekens en bestaat uit een mix van minstens 1 hoofdletter, kleine letter, cijfer en speciaal teken.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Het wachtwoord bestaat uit minstens 12 tekens en bestaat uit een mix van minstens 1 hoofdletter, kleine letter, cijfer en speciaal teken.',
|
||||
'UserLocal:password:expiration' => 'De velden hieronder vereisen een extensie.',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Je kan geen eenmalig wachtwoord instellen voor je eigen gebruiker.',
|
||||
]);
|
||||
|
||||
@@ -27,7 +27,7 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Hasło nie może być zmienione przez użytkownika.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Odnowienie hasła',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Kiedy ostatnio zmieniano hasło',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Hasło musi mieć co najmniej 8 znaków i zawierać duże, małe litery, cyfry i znaki specjalne.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Hasło musi mieć co najmniej 12 znaków i zawierać duże, małe litery, cyfry i znaki specjalne.',
|
||||
'UserLocal:password:expiration' => 'Poniższe pola wymagają rozszerzenia',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Ustawienie wygaśnięcia hasła "Hasło jednorazowe" nie jest dozwolone dla własnego użytkownika',
|
||||
]);
|
||||
|
||||
@@ -28,7 +28,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Дата изменения пароля',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Когда пароль был изменен в последний раз',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Пароль должен содержать не менее 8 символов и включать прописные, строчные, числовые и специальные символы.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Пароль должен содержать не менее 12 символов и включать прописные, строчные, числовые и специальные символы.',
|
||||
'UserLocal:password:expiration' => 'Поля требуют наличия доп. расширения',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||
]);
|
||||
|
||||
@@ -27,7 +27,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||
]);
|
||||
|
||||
@@ -28,7 +28,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||
]);
|
||||
|
||||
@@ -51,7 +51,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
|
||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新',
|
||||
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少8个字符, 包含大小写, 数字和特殊字符.',
|
||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少12个字符, 包含大小写, 数字和特殊字符.',
|
||||
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
|
||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
||||
]);
|
||||
|
||||
@@ -10,22 +10,87 @@
|
||||
*/
|
||||
|
||||
use Combodo\iTop\Core\MetaModel\HierarchicalKey;
|
||||
use Combodo\iTop\DBTools\Enum\BinExitCode;
|
||||
use Combodo\iTop\DBTools\Exception\AuthenticationException;
|
||||
|
||||
require_once('../../../approot.inc.php');
|
||||
// env-xxx folders
|
||||
if (file_exists(__DIR__.'/../../../approot.inc.php')) {
|
||||
require_once __DIR__.'/../../../approot.inc.php';
|
||||
}
|
||||
// datamodel/2.x and data/xxx-modules folders
|
||||
elseif (file_exists(__DIR__.'/../../../../approot.inc.php')) {
|
||||
require_once __DIR__.'/../../../../approot.inc.php';
|
||||
}
|
||||
require_once APPROOT.'application/startup.inc.php';
|
||||
|
||||
foreach (MetaModel::GetClasses() as $sClass) {
|
||||
if (!MetaModel::HasTable($sClass)) {
|
||||
continue;
|
||||
}
|
||||
// Prepare output page
|
||||
$sPageTitle = "Database maintenance tools - Report";
|
||||
$bIsModeCLI = utils::IsModeCLI();
|
||||
if ($bIsModeCLI) {
|
||||
$oP = new CLIPage($sPageTitle);
|
||||
|
||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||
// Check (once) all the attributes that are hierarchical keys
|
||||
if ((MetaModel::GetAttributeOrigin($sClass, $sAttCode) == $sClass) && $oAttDef->IsHierarchicalKey()) {
|
||||
echo "Rebuild hierarchical key $sAttCode from $sClass.\n";
|
||||
HierarchicalKey::Rebuild($sClass, $sAttCode, $oAttDef);
|
||||
}
|
||||
}
|
||||
SetupUtils::CheckPhpAndExtensionsForCli($oP, BinExitCode::FATAL->value);
|
||||
} else {
|
||||
$oP = new WebPage($sPageTitle);
|
||||
}
|
||||
|
||||
echo "Done\n";
|
||||
// Authentication logic
|
||||
try {
|
||||
utils::UseParamFile();
|
||||
|
||||
if ($bIsModeCLI) {
|
||||
$sAuthUser = utils::ReadParam('auth_user', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||
$sAuthPwd = utils::ReadParam('auth_pwd', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||
if (utils::IsNullOrEmptyString($sAuthUser) || utils::IsNullOrEmptyString($sAuthPwd)) {
|
||||
throw new AuthenticationException("Access credentials not provided, usage: php rebuildhk.php --auth_user=<login> --auth_pwd=<password> [--param_file=<file_path>]");
|
||||
}
|
||||
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd)) {
|
||||
UserRights::Login($sAuthUser);
|
||||
} else {
|
||||
throw new AuthenticationException("Access wrong credentials ('$sAuthUser')");
|
||||
}
|
||||
} else {
|
||||
// Check user rights and prompt if needed
|
||||
LoginWebPage::DoLoginEx(null, true);
|
||||
}
|
||||
|
||||
if (!UserRights::IsAdministrator()) {
|
||||
throw new AuthenticationException("Access restricted to administrators");
|
||||
}
|
||||
} catch (AuthenticationException $oException) {
|
||||
$oP->p($oException->getMessage());
|
||||
$oP->output();
|
||||
exit(BinExitCode::ERROR->value);
|
||||
} catch (Exception $oException) {
|
||||
$oP->p("Error: ".$oException->GetMessage());
|
||||
$oP->output();
|
||||
exit(BinExitCode::FATAL->value);
|
||||
}
|
||||
|
||||
// Business logic
|
||||
try {
|
||||
foreach (MetaModel::GetClasses() as $sClass) {
|
||||
if (!MetaModel::HasTable($sClass)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||
// Check (once) all the attributes that are hierarchical keys
|
||||
if ((MetaModel::GetAttributeOrigin($sClass, $sAttCode) == $sClass) && $oAttDef->IsHierarchicalKey()) {
|
||||
$oP->p("Rebuild hierarchical key $sAttCode from $sClass.");
|
||||
HierarchicalKey::Rebuild($sClass, $sAttCode, $oAttDef);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$oP->p("Done");
|
||||
$oP->output();
|
||||
} catch (AuthenticationException $oException) {
|
||||
$oP->p($oException->getMessage());
|
||||
$oP->output();
|
||||
exit(BinExitCode::ERROR->value);
|
||||
} catch (Exception $oException) {
|
||||
$oP->p("Error: ".$oException->GetMessage());
|
||||
$oP->output();
|
||||
exit(BinExitCode::FATAL->value);
|
||||
}
|
||||
|
||||
@@ -5,22 +5,93 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
use Combodo\iTop\DBTools\Enum\BinExitCode;
|
||||
use Combodo\iTop\DBTools\Exception\AuthenticationException;
|
||||
use Combodo\iTop\DBTools\Service\DBAnalyzerUtils;
|
||||
|
||||
require_once('../../../approot.inc.php');
|
||||
require_once(APPROOT.'application/startup.inc.php');
|
||||
|
||||
require_once('../db_analyzer.class.inc.php');
|
||||
require_once('../src/Service/DBAnalyzerUtils.php');
|
||||
|
||||
$oDBAnalyzer = new DatabaseAnalyzer(0);
|
||||
$aResults = $oDBAnalyzer->CheckIntegrity([]);
|
||||
|
||||
if (empty($aResults)) {
|
||||
echo "Database OK\n";
|
||||
exit(0);
|
||||
// env-xxx folders
|
||||
if (file_exists(__DIR__.'/../../../approot.inc.php')) {
|
||||
require_once __DIR__.'/../../../approot.inc.php';
|
||||
}
|
||||
// datamodel/2.x and data/xxx-modules folders
|
||||
elseif (file_exists(__DIR__.'/../../../../approot.inc.php')) {
|
||||
require_once __DIR__.'/../../../../approot.inc.php';
|
||||
}
|
||||
|
||||
$sReportFile = DBAnalyzerUtils::GenerateReport($aResults);
|
||||
require_once APPROOT.'application/startup.inc.php';
|
||||
require_once APPROOT.'application/loginwebpage.class.inc.php';
|
||||
|
||||
echo "Report generated: {$sReportFile}.log\n";
|
||||
require_once __DIR__.'/../db_analyzer.class.inc.php';
|
||||
|
||||
// Prepare output page
|
||||
$sPageTitle = "Database maintenance tools - Report";
|
||||
$bIsModeCLI = utils::IsModeCLI();
|
||||
if ($bIsModeCLI) {
|
||||
$oP = new CLIPage($sPageTitle);
|
||||
|
||||
SetupUtils::CheckPhpAndExtensionsForCli($oP, BinExitCode::FATAL->value);
|
||||
} else {
|
||||
$oP = new WebPage($sPageTitle);
|
||||
}
|
||||
|
||||
// Authentication logic
|
||||
try {
|
||||
utils::UseParamFile();
|
||||
|
||||
if ($bIsModeCLI) {
|
||||
$sAuthUser = utils::ReadParam('auth_user', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||
$sAuthPwd = utils::ReadParam('auth_pwd', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||
if (utils::IsNullOrEmptyString($sAuthUser) || utils::IsNullOrEmptyString($sAuthPwd)) {
|
||||
throw new AuthenticationException("Access credentials not provided, usage: php report.php --auth_user=<login> --auth_pwd=<password> [--param_file=<file_path>]");
|
||||
}
|
||||
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd)) {
|
||||
UserRights::Login($sAuthUser);
|
||||
} else {
|
||||
throw new AuthenticationException("Access wrong credentials ('$sAuthUser')");
|
||||
}
|
||||
} else {
|
||||
// Check user rights and prompt if needed
|
||||
LoginWebPage::DoLoginEx(null, true);
|
||||
}
|
||||
|
||||
if (!UserRights::IsAdministrator()) {
|
||||
throw new AuthenticationException("Access restricted to administrators");
|
||||
}
|
||||
} catch (AuthenticationException $oException) {
|
||||
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||
$oP->p($sExceptionMessage);
|
||||
$oP->output();
|
||||
exit(BinExitCode::ERROR->value);
|
||||
} catch (Exception $oException) {
|
||||
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||
$oP->p("Error: ".$sExceptionMessage);
|
||||
$oP->output();
|
||||
exit(BinExitCode::FATAL->value);
|
||||
}
|
||||
|
||||
// Business logic
|
||||
try {
|
||||
$oDBAnalyzer = new DatabaseAnalyzer(0);
|
||||
$aResults = $oDBAnalyzer->CheckIntegrity([]);
|
||||
|
||||
if (empty($aResults)) {
|
||||
$oP->p("Database OK");
|
||||
$oP->output();
|
||||
exit(BinExitCode::SUCCESS->value);
|
||||
}
|
||||
|
||||
$sReportFile = DBAnalyzerUtils::GenerateReport($aResults);
|
||||
|
||||
$oP->p("Report generated: {$sReportFile}.log");
|
||||
$oP->output();
|
||||
} catch (AuthenticationException $oException) {
|
||||
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||
$oP->p($sExceptionMessage);
|
||||
$oP->output();
|
||||
exit(BinExitCode::ERROR->value);
|
||||
} catch (Exception $oException) {
|
||||
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||
$oP->p("Error: ".$sExceptionMessage);
|
||||
$oP->output();
|
||||
exit(BinExitCode::FATAL->value);
|
||||
}
|
||||
|
||||
9
datamodels/2.x/combodo-db-tools/composer.json
Normal file
9
datamodels/2.x/combodo-db-tools/composer.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "combodo/combodo-db-tools",
|
||||
"license": "AGPL-3.0-only",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Combodo\\iTop\\DBTools\\": "src/"
|
||||
}
|
||||
}
|
||||
}
|
||||
18
datamodels/2.x/combodo-db-tools/composer.lock
generated
Normal file
18
datamodels/2.x/combodo-db-tools/composer.lock
generated
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "38292b9b3a56c6c8776285a17c58034e",
|
||||
"packages": [],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {},
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {},
|
||||
"platform-dev": {},
|
||||
"plugin-api-version": "2.6.0"
|
||||
}
|
||||
@@ -43,6 +43,7 @@ SetupWebPage::AddModule(
|
||||
// Components
|
||||
//
|
||||
'datamodel' => [
|
||||
'vendor/autoload.php',
|
||||
'src/Service/DBToolsUtils.php',
|
||||
'src/Service/DBAnalyzerUtils.php',
|
||||
],
|
||||
|
||||
18
datamodels/2.x/combodo-db-tools/src/Enum/BinExitCode.php
Normal file
18
datamodels/2.x/combodo-db-tools/src/Enum/BinExitCode.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\DBTools\Enum;
|
||||
|
||||
/**
|
||||
* Enum for the exit codes of the bin scripts
|
||||
*/
|
||||
enum BinExitCode: int
|
||||
{
|
||||
case SUCCESS = 0;
|
||||
case ERROR = -1;
|
||||
case FATAL = -2;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\DBTools\Exception;
|
||||
|
||||
class AuthenticationException extends \Exception
|
||||
{
|
||||
}
|
||||
22
datamodels/2.x/combodo-db-tools/vendor/autoload.php
vendored
Normal file
22
datamodels/2.x/combodo-db-tools/vendor/autoload.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
if (PHP_VERSION_ID < 50600) {
|
||||
if (!headers_sent()) {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
}
|
||||
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
|
||||
if (!ini_get('display_errors')) {
|
||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||
fwrite(STDERR, $err);
|
||||
} elseif (!headers_sent()) {
|
||||
echo $err;
|
||||
}
|
||||
}
|
||||
throw new RuntimeException($err);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e::getLoader();
|
||||
579
datamodels/2.x/combodo-db-tools/vendor/composer/ClassLoader.php
vendored
Normal file
579
datamodels/2.x/combodo-db-tools/vendor/composer/ClassLoader.php
vendored
Normal file
@@ -0,0 +1,579 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
/**
|
||||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||
*
|
||||
* $loader = new \Composer\Autoload\ClassLoader();
|
||||
*
|
||||
* // register classes with namespaces
|
||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||
* $loader->add('Symfony', __DIR__.'/framework');
|
||||
*
|
||||
* // activate the autoloader
|
||||
* $loader->register();
|
||||
*
|
||||
* // to enable searching the include path (eg. for PEAR packages)
|
||||
* $loader->setUseIncludePath(true);
|
||||
*
|
||||
* In this example, if you try to use a class in the Symfony\Component
|
||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||
* the autoloader will first look for the class under the component/
|
||||
* directory, and it will then fallback to the framework/ directory if not
|
||||
* found before giving up.
|
||||
*
|
||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
* @see https://www.php-fig.org/psr/psr-0/
|
||||
* @see https://www.php-fig.org/psr/psr-4/
|
||||
*/
|
||||
class ClassLoader
|
||||
{
|
||||
/** @var \Closure(string):void */
|
||||
private static $includeFile;
|
||||
|
||||
/** @var string|null */
|
||||
private $vendorDir;
|
||||
|
||||
// PSR-4
|
||||
/**
|
||||
* @var array<string, array<string, int>>
|
||||
*/
|
||||
private $prefixLengthsPsr4 = array();
|
||||
/**
|
||||
* @var array<string, list<string>>
|
||||
*/
|
||||
private $prefixDirsPsr4 = array();
|
||||
/**
|
||||
* @var list<string>
|
||||
*/
|
||||
private $fallbackDirsPsr4 = array();
|
||||
|
||||
// PSR-0
|
||||
/**
|
||||
* List of PSR-0 prefixes
|
||||
*
|
||||
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
|
||||
*
|
||||
* @var array<string, array<string, list<string>>>
|
||||
*/
|
||||
private $prefixesPsr0 = array();
|
||||
/**
|
||||
* @var list<string>
|
||||
*/
|
||||
private $fallbackDirsPsr0 = array();
|
||||
|
||||
/** @var bool */
|
||||
private $useIncludePath = false;
|
||||
|
||||
/**
|
||||
* @var array<string, string>
|
||||
*/
|
||||
private $classMap = array();
|
||||
|
||||
/** @var bool */
|
||||
private $classMapAuthoritative = false;
|
||||
|
||||
/**
|
||||
* @var array<string, bool>
|
||||
*/
|
||||
private $missingClasses = array();
|
||||
|
||||
/** @var string|null */
|
||||
private $apcuPrefix;
|
||||
|
||||
/**
|
||||
* @var array<string, self>
|
||||
*/
|
||||
private static $registeredLoaders = array();
|
||||
|
||||
/**
|
||||
* @param string|null $vendorDir
|
||||
*/
|
||||
public function __construct($vendorDir = null)
|
||||
{
|
||||
$this->vendorDir = $vendorDir;
|
||||
self::initializeIncludeClosure();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, list<string>>
|
||||
*/
|
||||
public function getPrefixes()
|
||||
{
|
||||
if (!empty($this->prefixesPsr0)) {
|
||||
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, list<string>>
|
||||
*/
|
||||
public function getPrefixesPsr4()
|
||||
{
|
||||
return $this->prefixDirsPsr4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
public function getFallbackDirs()
|
||||
{
|
||||
return $this->fallbackDirsPsr0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
public function getFallbackDirsPsr4()
|
||||
{
|
||||
return $this->fallbackDirsPsr4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string> Array of classname => path
|
||||
*/
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, string> $classMap Class to filename map
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addClassMap(array $classMap)
|
||||
{
|
||||
if ($this->classMap) {
|
||||
$this->classMap = array_merge($this->classMap, $classMap);
|
||||
} else {
|
||||
$this->classMap = $classMap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix, either
|
||||
* appending or prepending to the ones previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param list<string>|string $paths The PSR-0 root directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function add($prefix, $paths, $prepend = false)
|
||||
{
|
||||
$paths = (array) $paths;
|
||||
if (!$prefix) {
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$paths,
|
||||
$this->fallbackDirsPsr0
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$this->fallbackDirsPsr0,
|
||||
$paths
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$first = $prefix[0];
|
||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||
$this->prefixesPsr0[$first][$prefix] = $paths;
|
||||
|
||||
return;
|
||||
}
|
||||
if ($prepend) {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$paths,
|
||||
$this->prefixesPsr0[$first][$prefix]
|
||||
);
|
||||
} else {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$this->prefixesPsr0[$first][$prefix],
|
||||
$paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace, either
|
||||
* appending or prepending to the ones previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param list<string>|string $paths The PSR-4 base directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addPsr4($prefix, $paths, $prepend = false)
|
||||
{
|
||||
$paths = (array) $paths;
|
||||
if (!$prefix) {
|
||||
// Register directories for the root namespace.
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$paths,
|
||||
$this->fallbackDirsPsr4
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$this->fallbackDirsPsr4,
|
||||
$paths
|
||||
);
|
||||
}
|
||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||
// Register directories for a new namespace.
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = $paths;
|
||||
} elseif ($prepend) {
|
||||
// Prepend directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$paths,
|
||||
$this->prefixDirsPsr4[$prefix]
|
||||
);
|
||||
} else {
|
||||
// Append directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$this->prefixDirsPsr4[$prefix],
|
||||
$paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix,
|
||||
* replacing any others previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param list<string>|string $paths The PSR-0 base directories
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function set($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr0 = (array) $paths;
|
||||
} else {
|
||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace,
|
||||
* replacing any others previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param list<string>|string $paths The PSR-4 base directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setPsr4($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr4 = (array) $paths;
|
||||
} else {
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns on searching the include path for class files.
|
||||
*
|
||||
* @param bool $useIncludePath
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setUseIncludePath($useIncludePath)
|
||||
{
|
||||
$this->useIncludePath = $useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to check if the autoloader uses the include path to check
|
||||
* for classes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getUseIncludePath()
|
||||
{
|
||||
return $this->useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns off searching the prefix and fallback directories for classes
|
||||
* that have not been registered with the class map.
|
||||
*
|
||||
* @param bool $classMapAuthoritative
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||
{
|
||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should class lookup fail if not found in the current class map?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isClassMapAuthoritative()
|
||||
{
|
||||
return $this->classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||
*
|
||||
* @param string|null $apcuPrefix
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setApcuPrefix($apcuPrefix)
|
||||
{
|
||||
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getApcuPrefix()
|
||||
{
|
||||
return $this->apcuPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this instance as an autoloader.
|
||||
*
|
||||
* @param bool $prepend Whether to prepend the autoloader or not
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register($prepend = false)
|
||||
{
|
||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||
|
||||
if (null === $this->vendorDir) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($prepend) {
|
||||
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
|
||||
} else {
|
||||
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||
self::$registeredLoaders[$this->vendorDir] = $this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters this instance as an autoloader.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function unregister()
|
||||
{
|
||||
spl_autoload_unregister(array($this, 'loadClass'));
|
||||
|
||||
if (null !== $this->vendorDir) {
|
||||
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given class or interface.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
* @return true|null True if loaded, null otherwise
|
||||
*/
|
||||
public function loadClass($class)
|
||||
{
|
||||
if ($file = $this->findFile($class)) {
|
||||
$includeFile = self::$includeFile;
|
||||
$includeFile($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the path to the file where the class is defined.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
*
|
||||
* @return string|false The path if found, false otherwise
|
||||
*/
|
||||
public function findFile($class)
|
||||
{
|
||||
// class map lookup
|
||||
if (isset($this->classMap[$class])) {
|
||||
return $this->classMap[$class];
|
||||
}
|
||||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||
return false;
|
||||
}
|
||||
if (null !== $this->apcuPrefix) {
|
||||
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||
if ($hit) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
$file = $this->findFileWithExtension($class, '.php');
|
||||
|
||||
// Search for Hack files if we are running on HHVM
|
||||
if (false === $file && defined('HHVM_VERSION')) {
|
||||
$file = $this->findFileWithExtension($class, '.hh');
|
||||
}
|
||||
|
||||
if (null !== $this->apcuPrefix) {
|
||||
apcu_add($this->apcuPrefix.$class, $file);
|
||||
}
|
||||
|
||||
if (false === $file) {
|
||||
// Remember that this class does not exist.
|
||||
$this->missingClasses[$class] = true;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the currently registered loaders keyed by their corresponding vendor directories.
|
||||
*
|
||||
* @return array<string, self>
|
||||
*/
|
||||
public static function getRegisteredLoaders()
|
||||
{
|
||||
return self::$registeredLoaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
* @param string $ext
|
||||
* @return string|false
|
||||
*/
|
||||
private function findFileWithExtension($class, $ext)
|
||||
{
|
||||
// PSR-4 lookup
|
||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||
|
||||
$first = $class[0];
|
||||
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||
$subPath = $class;
|
||||
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||
$subPath = substr($subPath, 0, $lastPos);
|
||||
$search = $subPath . '\\';
|
||||
if (isset($this->prefixDirsPsr4[$search])) {
|
||||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||
if (file_exists($file = $dir . $pathEnd)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-4 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 lookup
|
||||
if (false !== $pos = strrpos($class, '\\')) {
|
||||
// namespaced class name
|
||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// PEAR-like class name
|
||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||
}
|
||||
|
||||
if (isset($this->prefixesPsr0[$first])) {
|
||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||
if (0 === strpos($class, $prefix)) {
|
||||
foreach ($dirs as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 include paths.
|
||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
private static function initializeIncludeClosure()
|
||||
{
|
||||
if (self::$includeFile !== null) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope isolated include.
|
||||
*
|
||||
* Prevents access to $this/self from included files.
|
||||
*
|
||||
* @param string $file
|
||||
* @return void
|
||||
*/
|
||||
self::$includeFile = \Closure::bind(static function($file) {
|
||||
include $file;
|
||||
}, null, null);
|
||||
}
|
||||
}
|
||||
378
datamodels/2.x/combodo-db-tools/vendor/composer/InstalledVersions.php
vendored
Normal file
378
datamodels/2.x/combodo-db-tools/vendor/composer/InstalledVersions.php
vendored
Normal file
@@ -0,0 +1,378 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
use Composer\Autoload\ClassLoader;
|
||||
use Composer\Semver\VersionParser;
|
||||
|
||||
/**
|
||||
* This class is copied in every Composer installed project and available to all
|
||||
*
|
||||
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
||||
*
|
||||
* To require its presence, you can require `composer-runtime-api ^2.0`
|
||||
*
|
||||
* @final
|
||||
*/
|
||||
class InstalledVersions
|
||||
{
|
||||
/**
|
||||
* @var mixed[]|null
|
||||
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
|
||||
*/
|
||||
private static $installed;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private static $installedIsLocalDir;
|
||||
|
||||
/**
|
||||
* @var bool|null
|
||||
*/
|
||||
private static $canGetVendors;
|
||||
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||
*/
|
||||
private static $installedByVendor = array();
|
||||
|
||||
/**
|
||||
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
||||
*
|
||||
* @return string[]
|
||||
* @psalm-return list<string>
|
||||
*/
|
||||
public static function getInstalledPackages()
|
||||
{
|
||||
$packages = array();
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
$packages[] = array_keys($installed['versions']);
|
||||
}
|
||||
|
||||
if (1 === \count($packages)) {
|
||||
return $packages[0];
|
||||
}
|
||||
|
||||
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all package names with a specific type e.g. 'library'
|
||||
*
|
||||
* @param string $type
|
||||
* @return string[]
|
||||
* @psalm-return list<string>
|
||||
*/
|
||||
public static function getInstalledPackagesByType($type)
|
||||
{
|
||||
$packagesByType = array();
|
||||
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
foreach ($installed['versions'] as $name => $package) {
|
||||
if (isset($package['type']) && $package['type'] === $type) {
|
||||
$packagesByType[] = $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $packagesByType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given package is installed
|
||||
*
|
||||
* This also returns true if the package name is provided or replaced by another package
|
||||
*
|
||||
* @param string $packageName
|
||||
* @param bool $includeDevRequirements
|
||||
* @return bool
|
||||
*/
|
||||
public static function isInstalled($packageName, $includeDevRequirements = true)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (isset($installed['versions'][$packageName])) {
|
||||
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given package satisfies a version constraint
|
||||
*
|
||||
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
||||
*
|
||||
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
||||
*
|
||||
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
||||
* @param string $packageName
|
||||
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
||||
* @return bool
|
||||
*/
|
||||
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||
{
|
||||
$constraint = $parser->parseConstraints((string) $constraint);
|
||||
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||
|
||||
return $provided->matches($constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a version constraint representing all the range(s) which are installed for a given package
|
||||
*
|
||||
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
||||
* whether a given version of a package is installed, and not just whether it exists
|
||||
*
|
||||
* @param string $packageName
|
||||
* @return string Version constraint usable with composer/semver
|
||||
*/
|
||||
public static function getVersionRanges($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$ranges = array();
|
||||
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
||||
}
|
||||
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
||||
}
|
||||
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
||||
}
|
||||
|
||||
return implode(' || ', $ranges);
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||
*/
|
||||
public static function getVersion($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['version'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||
*/
|
||||
public static function getPrettyVersion($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
||||
*/
|
||||
public static function getReference($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['reference'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['reference'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||
*/
|
||||
public static function getInstallPath($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
|
||||
*/
|
||||
public static function getRootPackage()
|
||||
{
|
||||
$installed = self::getInstalled();
|
||||
|
||||
return $installed[0]['root'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw installed.php data for custom implementations
|
||||
*
|
||||
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||
* @return array[]
|
||||
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
|
||||
*/
|
||||
public static function getRawData()
|
||||
{
|
||||
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||
|
||||
if (null === self::$installed) {
|
||||
// only require the installed.php file if this file is loaded from its dumped location,
|
||||
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||
self::$installed = include __DIR__ . '/installed.php';
|
||||
} else {
|
||||
self::$installed = array();
|
||||
}
|
||||
}
|
||||
|
||||
return self::$installed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||
*
|
||||
* @return array[]
|
||||
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||
*/
|
||||
public static function getAllRawData()
|
||||
{
|
||||
return self::getInstalled();
|
||||
}
|
||||
|
||||
/**
|
||||
* Lets you reload the static array from another file
|
||||
*
|
||||
* This is only useful for complex integrations in which a project needs to use
|
||||
* this class but then also needs to execute another project's autoloader in process,
|
||||
* and wants to ensure both projects have access to their version of installed.php.
|
||||
*
|
||||
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
||||
* the data it needs from this class, then call reload() with
|
||||
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
||||
* the project in which it runs can then also use this class safely, without
|
||||
* interference between PHPUnit's dependencies and the project's dependencies.
|
||||
*
|
||||
* @param array[] $data A vendor/composer/installed.php data set
|
||||
* @return void
|
||||
*
|
||||
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
|
||||
*/
|
||||
public static function reload($data)
|
||||
{
|
||||
self::$installed = $data;
|
||||
self::$installedByVendor = array();
|
||||
|
||||
// when using reload, we disable the duplicate protection to ensure that self::$installed data is
|
||||
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
|
||||
// so we have to assume it does not, and that may result in duplicate data being returned when listing
|
||||
// all installed packages for example
|
||||
self::$installedIsLocalDir = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||
*/
|
||||
private static function getInstalled()
|
||||
{
|
||||
if (null === self::$canGetVendors) {
|
||||
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
||||
}
|
||||
|
||||
$installed = array();
|
||||
$copiedLocalDir = false;
|
||||
|
||||
if (self::$canGetVendors) {
|
||||
$selfDir = strtr(__DIR__, '\\', '/');
|
||||
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||
$vendorDir = strtr($vendorDir, '\\', '/');
|
||||
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||
$installed[] = self::$installedByVendor[$vendorDir];
|
||||
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||
$required = require $vendorDir.'/composer/installed.php';
|
||||
self::$installedByVendor[$vendorDir] = $required;
|
||||
$installed[] = $required;
|
||||
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
|
||||
self::$installed = $required;
|
||||
self::$installedIsLocalDir = true;
|
||||
}
|
||||
}
|
||||
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
|
||||
$copiedLocalDir = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (null === self::$installed) {
|
||||
// only require the installed.php file if this file is loaded from its dumped location,
|
||||
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||
$required = require __DIR__ . '/installed.php';
|
||||
self::$installed = $required;
|
||||
} else {
|
||||
self::$installed = array();
|
||||
}
|
||||
}
|
||||
|
||||
if (self::$installed !== array() && !$copiedLocalDir) {
|
||||
$installed[] = self::$installed;
|
||||
}
|
||||
|
||||
return $installed;
|
||||
}
|
||||
}
|
||||
21
datamodels/2.x/combodo-db-tools/vendor/composer/LICENSE
vendored
Normal file
21
datamodels/2.x/combodo-db-tools/vendor/composer/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
15
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_classmap.php
vendored
Normal file
15
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_classmap.php
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Combodo\\iTop\\DBTools\\Enum\\BinExitCode' => $baseDir . '/src/Enum/BinExitCode.php',
|
||||
'Combodo\\iTop\\DBTools\\Exception\\AuthenticationException' => $baseDir . '/src/Exception/AuthenticationException.php',
|
||||
'Combodo\\iTop\\DBTools\\Service\\BinUtils' => $baseDir . '/src/Service/BinUtils.php',
|
||||
'Combodo\\iTop\\DBTools\\Service\\DBAnalyzerUtils' => $baseDir . '/src/Service/DBAnalyzerUtils.php',
|
||||
'Combodo\\iTop\\DBTools\\Service\\DBToolsUtils' => $baseDir . '/src/Service/DBToolsUtils.php',
|
||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||
);
|
||||
9
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_namespaces.php
vendored
Normal file
9
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_namespaces.php
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
);
|
||||
10
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_psr4.php
vendored
Normal file
10
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_psr4.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
// autoload_psr4.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Combodo\\iTop\\DBTools\\' => array($baseDir . '/src'),
|
||||
);
|
||||
37
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_real.php
vendored
Normal file
37
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_real.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
public static function loadClassLoader($class)
|
||||
{
|
||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||
require __DIR__ . '/ClassLoader.php';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Composer\Autoload\ClassLoader
|
||||
*/
|
||||
public static function getLoader()
|
||||
{
|
||||
if (null !== self::$loader) {
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e', 'loadClassLoader'));
|
||||
|
||||
require __DIR__ . '/autoload_static.php';
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::getInitializer($loader));
|
||||
|
||||
$loader->setClassMapAuthoritative(true);
|
||||
$loader->register(true);
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
41
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_static.php
vendored
Normal file
41
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_static.php
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
// autoload_static.php @generated by Composer
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInit38292b9b3a56c6c8776285a17c58034e
|
||||
{
|
||||
public static $prefixLengthsPsr4 = array (
|
||||
'C' =>
|
||||
array (
|
||||
'Combodo\\iTop\\DBTools\\' => 21,
|
||||
),
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'Combodo\\iTop\\DBTools\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/../..' . '/src',
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'Combodo\\iTop\\DBTools\\Enum\\BinExitCode' => __DIR__ . '/../..' . '/src/Enum/BinExitCode.php',
|
||||
'Combodo\\iTop\\DBTools\\Exception\\AuthenticationException' => __DIR__ . '/../..' . '/src/Exception/AuthenticationException.php',
|
||||
'Combodo\\iTop\\DBTools\\Service\\BinUtils' => __DIR__ . '/../..' . '/src/Service/BinUtils.php',
|
||||
'Combodo\\iTop\\DBTools\\Service\\DBAnalyzerUtils' => __DIR__ . '/../..' . '/src/Service/DBAnalyzerUtils.php',
|
||||
'Combodo\\iTop\\DBTools\\Service\\DBToolsUtils' => __DIR__ . '/../..' . '/src/Service/DBToolsUtils.php',
|
||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
}
|
||||
5
datamodels/2.x/combodo-db-tools/vendor/composer/installed.json
vendored
Normal file
5
datamodels/2.x/combodo-db-tools/vendor/composer/installed.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"packages": [],
|
||||
"dev": true,
|
||||
"dev-package-names": []
|
||||
}
|
||||
23
datamodels/2.x/combodo-db-tools/vendor/composer/installed.php
vendored
Normal file
23
datamodels/2.x/combodo-db-tools/vendor/composer/installed.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php return array(
|
||||
'root' => array(
|
||||
'name' => 'combodo/combodo-db-tools',
|
||||
'pretty_version' => '1.0.0+no-version-set',
|
||||
'version' => '1.0.0.0',
|
||||
'reference' => null,
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'dev' => true,
|
||||
),
|
||||
'versions' => array(
|
||||
'combodo/combodo-db-tools' => array(
|
||||
'pretty_version' => '1.0.0+no-version-set',
|
||||
'version' => '1.0.0.0',
|
||||
'reference' => null,
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -71,6 +71,19 @@
|
||||
<module>itop-virtualization-mgmt</module>
|
||||
</modules>
|
||||
<default>true</default>
|
||||
<sub_options>
|
||||
<options type="array">
|
||||
<choice>
|
||||
<extension_code>itop-container-mgmt</extension_code>
|
||||
<title>Containerization</title>
|
||||
<description><![CDATA[Manage Container Images, Applications and Hosts]]></description>
|
||||
<modules type="array">
|
||||
<module>itop-container-mgmt</module>
|
||||
</modules>
|
||||
<default>false</default>
|
||||
</choice>
|
||||
</options>
|
||||
</sub_options>
|
||||
</choice>
|
||||
</options>
|
||||
</step>
|
||||
|
||||
@@ -199,15 +199,15 @@ function RaiseAlarm($sMessage)
|
||||
//////////
|
||||
// Main
|
||||
|
||||
try {
|
||||
utils::UseParamFile();
|
||||
} catch (Exception $e) {
|
||||
echo "Error: ".$e->GetMessage()."\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
if (utils::IsModeCLI()) {
|
||||
SetupUtils::CheckPhpAndExtensionsForCli(new CLIPage('Check backup utility'));
|
||||
try {
|
||||
utils::UseParamFile();
|
||||
} catch (Exception $e) {
|
||||
echo 'Error: '.$e->GetMessage()."\n";
|
||||
exit;
|
||||
}
|
||||
$oP = new CLIPage('Check backup utility');
|
||||
SetupUtils::CheckPhpAndExtensionsForCli($oP);
|
||||
|
||||
echo date('Y-m-d H:i:s')." - running check-backup utility\n";
|
||||
try {
|
||||
|
||||
@@ -88,16 +88,15 @@ if (utils::IsModeCLI()) {
|
||||
$oP = new CLIPage(GetOperationName());
|
||||
|
||||
SetupUtils::CheckPhpAndExtensionsForCli($oP);
|
||||
try {
|
||||
utils::UseParamFile();
|
||||
} catch (Exception $e) {
|
||||
ExitError($oP, $e->GetMessage());
|
||||
}
|
||||
} else {
|
||||
$oP = new WebPage(GetOperationName());
|
||||
}
|
||||
|
||||
try {
|
||||
utils::UseParamFile();
|
||||
} catch (Exception $e) {
|
||||
ExitError($oP, $e->GetMessage());
|
||||
}
|
||||
|
||||
ExecuteMainOperation($oP);
|
||||
|
||||
$oP->output();
|
||||
|
||||
@@ -24,7 +24,7 @@ class DBRestore extends DBBackup
|
||||
/** @var string */
|
||||
private $sDBUser;
|
||||
|
||||
public function __construct(\Config $oConfig = null)
|
||||
public function __construct(?\Config $oConfig = null)
|
||||
{
|
||||
parent::__construct($oConfig);
|
||||
|
||||
|
||||
@@ -4415,6 +4415,11 @@
|
||||
<extkey_attcode>osfamily_id</extkey_attcode>
|
||||
<target_attcode>name</target_attcode>
|
||||
</field>
|
||||
<field id="ospatches_list" xsi:type="AttributeLinkedSet">
|
||||
<linked_class>OSPatch</linked_class>
|
||||
<ext_key_to_me>osversion_id</ext_key_to_me>
|
||||
<edit_mode>in_place</edit_mode>
|
||||
</field>
|
||||
</fields>
|
||||
<methods/>
|
||||
<presentation>
|
||||
@@ -4426,6 +4431,9 @@
|
||||
<item id="osfamily_id">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="ospatches_list">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
</items>
|
||||
</details>
|
||||
<search>
|
||||
@@ -4481,6 +4489,11 @@
|
||||
<storage_max_height>128</storage_max_height>
|
||||
<is_null_allowed>true</is_null_allowed>
|
||||
</field>
|
||||
<field id="osversions_list" xsi:type="AttributeLinkedSet">
|
||||
<linked_class>OSVersion</linked_class>
|
||||
<ext_key_to_me>osfamily_id</ext_key_to_me>
|
||||
<edit_mode>in_place</edit_mode>
|
||||
</field>
|
||||
</fields>
|
||||
<methods/>
|
||||
<presentation>
|
||||
@@ -4492,6 +4505,9 @@
|
||||
<item id="logo">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="osversions_list">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
</items>
|
||||
</details>
|
||||
<search>
|
||||
@@ -4563,6 +4579,16 @@
|
||||
<count_max>0</count_max>
|
||||
<duplicates/>
|
||||
</field>
|
||||
<field id="models_list" xsi:type="AttributeLinkedSet">
|
||||
<linked_class>Model</linked_class>
|
||||
<ext_key_to_me>brand_id</ext_key_to_me>
|
||||
<edit_mode>in_place</edit_mode>
|
||||
</field>
|
||||
<field id="iosversions_list" xsi:type="AttributeLinkedSet">
|
||||
<linked_class>IOSVersion</linked_class>
|
||||
<ext_key_to_me>brand_id</ext_key_to_me>
|
||||
<edit_mode>in_place</edit_mode>
|
||||
</field>
|
||||
</fields>
|
||||
<methods/>
|
||||
<presentation>
|
||||
@@ -4574,9 +4600,15 @@
|
||||
<item id="logo">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="physicaldevices_list">
|
||||
<item id="models_list">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
<item id="physicaldevices_list">
|
||||
<rank>40</rank>
|
||||
</item>
|
||||
<item id="iosversions_list">
|
||||
<rank>50</rank>
|
||||
</item>
|
||||
</items>
|
||||
</details>
|
||||
<search>
|
||||
@@ -4894,6 +4926,11 @@
|
||||
<extkey_attcode>brand_id</extkey_attcode>
|
||||
<target_attcode>name</target_attcode>
|
||||
</field>
|
||||
<field id="networkdevices_list" xsi:type="AttributeLinkedSet">
|
||||
<linked_class>NetworkDevice</linked_class>
|
||||
<ext_key_to_me>iosversion_id</ext_key_to_me>
|
||||
<edit_mode>add_only</edit_mode>
|
||||
</field>
|
||||
</fields>
|
||||
<methods/>
|
||||
<presentation>
|
||||
@@ -4905,6 +4942,9 @@
|
||||
<item id="brand_id">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="networkdevices_list">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
</items>
|
||||
</details>
|
||||
<search>
|
||||
|
||||
@@ -1073,6 +1073,8 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||
'Class:OSVersion/Attribute:osfamily_name' => 'OS family name',
|
||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||
'Class:OSVersion/Attribute:ospatches_list' => 'OS patches',
|
||||
'Class:OSVersion/Attribute:ospatches_list+' => 'All the OS patches for this OS version',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1082,6 +1084,8 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:OSFamily' => 'OS Family',
|
||||
'Class:OSFamily+' => '',
|
||||
'Class:OSFamily/Attribute:osversions_list' => 'OS versions',
|
||||
'Class:OSFamily/Attribute:osversions_list+' => 'All the OS versions for this OS family',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1091,8 +1095,12 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:Brand' => 'Brand',
|
||||
'Class:Brand+' => '',
|
||||
'Class:Brand/Attribute:iosversions_list' => 'IOS versions',
|
||||
'Class:Brand/Attribute:iosversions_list+' => 'All the IOS versions from this brand',
|
||||
'Class:Brand/Attribute:logo' => 'Logo',
|
||||
'Class:Brand/Attribute:logo+' => '',
|
||||
'Class:Brand/Attribute:models_list' => 'Models',
|
||||
'Class:Brand/Attribute:models_list+' => 'All models for this brand',
|
||||
'Class:Brand/Attribute:physicaldevices_list' => 'Physical devices',
|
||||
'Class:Brand/Attribute:physicaldevices_list+' => 'All the physical devices corresponding to this brand',
|
||||
'Class:Brand/UniquenessRule:name+' => 'The name must be unique',
|
||||
@@ -1179,6 +1187,8 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||
'Class:IOSVersion/Attribute:brand_name' => 'Brand name',
|
||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||
'Class:IOSVersion/Attribute:networkdevices_list' => 'Network devices',
|
||||
'Class:IOSVersion/Attribute:networkdevices_list+' => 'All the network devices running this IOS version',
|
||||
]);
|
||||
|
||||
//
|
||||
|
||||
@@ -1203,6 +1203,8 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||
'Class:OSVersion/Attribute:osfamily_name' => 'Nom Famille OS',
|
||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||
'Class:OSVersion/Attribute:ospatches_list' => 'Patchs OS',
|
||||
'Class:OSVersion/Attribute:ospatches_list+' => 'Tous les patchs de cette version OS',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1212,6 +1214,8 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:OSFamily' => 'Famille OS',
|
||||
'Class:OSFamily+' => '',
|
||||
'Class:OSFamily/Attribute:osversions_list' => 'Versions OS',
|
||||
'Class:OSFamily/Attribute:osversions_list+' => 'Toutes les versions OS pour cette famille',
|
||||
]);
|
||||
|
||||
//
|
||||
@@ -1221,8 +1225,12 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:Brand' => 'Marque',
|
||||
'Class:Brand+' => '',
|
||||
'Class:Brand/Attribute:iosversions_list' => 'Versions IOS',
|
||||
'Class:Brand/Attribute:iosversions_list+' => 'Toutes les versions IOS pour cette marque',
|
||||
'Class:Brand/Attribute:logo' => 'Logo',
|
||||
'Class:Brand/Attribute:logo+' => '',
|
||||
'Class:Brand/Attribute:models_list' => 'Modèles',
|
||||
'Class:Brand/Attribute:models_list+' => 'Tous les modèles pour cette marque',
|
||||
'Class:Brand/Attribute:physicaldevices_list' => 'Matériels',
|
||||
'Class:Brand/Attribute:physicaldevices_list+' => 'Tous les matériels correspondant à cette marque',
|
||||
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Create:Button+' => 'Créer un %4$s',
|
||||
@@ -1327,6 +1335,8 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||
'Class:IOSVersion/Attribute:brand_name' => 'Nom Marque',
|
||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||
'Class:IOSVersion/Attribute:networkdevices_list' => 'Equipements réseaux',
|
||||
'Class:IOSVersion/Attribute:networkdevices_list+' => 'Tous les équipements réseaux utilisant cette version IOS',
|
||||
]);
|
||||
|
||||
//
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<ContainerImageType alias="ContainerImageType" id="1">
|
||||
<name>Docker Hardened Image</name>
|
||||
</ContainerImageType>
|
||||
<ContainerImageType alias="ContainerImageType" id="2">
|
||||
<name>Docker Official Image</name>
|
||||
</ContainerImageType>
|
||||
<ContainerImageType alias="ContainerImageType" id="3">
|
||||
<name>Verified Publisher</name>
|
||||
</ContainerImageType>
|
||||
</Set>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Set>
|
||||
<ContainerType alias="ContainerType" id="1">
|
||||
<name>AWS - Elastic Container Service</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="2">
|
||||
<name>AWS - Elastic Kubernetes Service</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="3">
|
||||
<name>Azure Kubernetes Service</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="4">
|
||||
<name>Docker Swarm</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="5">
|
||||
<name>Google Kubernetes Engine</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="6">
|
||||
<name>Kubernetes</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="7">
|
||||
<name>Nomad</name>
|
||||
</ContainerType>
|
||||
<ContainerType alias="ContainerType" id="8">
|
||||
<name>OpenShift</name>
|
||||
</ContainerType>
|
||||
</Set>
|
||||
1280
datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
Normal file
1280
datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2013 XXXXX
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
//
|
||||
// Fieldsets for Container classes
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Container:baseinfo' => 'General',
|
||||
'Container:moreinfo' => 'Container specifics',
|
||||
'Container:otherinfo' => 'Dates and description',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Image
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerImage/Name' => '%1$s %2$s',
|
||||
'Class:ContainerImage/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:ContainerImage' => 'Container Image',
|
||||
'Class:ContainerImage+' => 'The image of a software ready to be launched as a container',
|
||||
'Class:ContainerImage/Attribute:name' => 'Name',
|
||||
'Class:ContainerImage/Attribute:name+' => '',
|
||||
'Class:ContainerImage/Attribute:version' => 'Version',
|
||||
'Class:ContainerImage/Attribute:version+' => '',
|
||||
'Class:ContainerImage/Attribute:description' => 'Description',
|
||||
'Class:ContainerImage/Attribute:description+' => '',
|
||||
'Class:ContainerImage/Attribute:publisher' => 'Publisher',
|
||||
'Class:ContainerImage/Attribute:publisher+' => 'Publisher of the image. Eg. php, nginx, ...',
|
||||
'Class:ContainerImage/Attribute:image' => 'Image',
|
||||
'Class:ContainerImage/Attribute:image+' => 'Detailed information to retrieve the image on the appropriate hosting platform',
|
||||
'Class:ContainerImage/Attribute:type_id' => 'Type',
|
||||
'Class:ContainerImage/Attribute:type_id+' => 'Type d\image',
|
||||
'Class:ContainerImage/Attribute:software_id' => 'Software',
|
||||
'Class:ContainerImage/Attribute:software_id+' => '',
|
||||
'Class:ContainerImage/Attribute:containerapplications_list' => 'Containerized Applications',
|
||||
'Class:ContainerImage/Attribute:containerapplications_list+' => 'Applications to which this image contributes',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Application
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerApplication/Name' => '%1$s',
|
||||
'Class:ContainerApplication/ComplementaryName' => '%1$s',
|
||||
'Class:ContainerApplication' => 'Containerized Application',
|
||||
'Class:ContainerApplication+' => 'An application deployed on a Container Platform',
|
||||
'Class:ContainerApplication/Attribute:descriptor' => 'Deployment file',
|
||||
'Class:ContainerApplication/Attribute:descriptor+' => 'File describing how to deploy the application on the container platform (e.g., Docker Compose, Helm Chart, etc.)',
|
||||
'Class:ContainerApplication/Attribute:containervirtualhost_id' => 'Container Host',
|
||||
'Class:ContainerApplication/Attribute:containervirtualhost_id+' => 'Container Platform on which the application is running',
|
||||
'Class:ContainerApplication/Attribute:containertype_id' => 'Container type',
|
||||
'Class:ContainerApplication/Attribute:containertype_id+' => 'Technology used for containerization',
|
||||
'Class:ContainerApplication/Attribute:containerimages_list' => 'Container images',
|
||||
'Class:ContainerApplication/Attribute:containerimages_list+' => 'Software images used to build the containerized application',
|
||||
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: lnkContainerApplicationToImage
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:lnkContainerApplicationToImage' => 'Link Container Application / Image',
|
||||
'Class:lnkContainerApplicationToImage+' => '',
|
||||
'Class:lnkContainerApplicationToImage/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContainerApplicationToImage/Name+' => '',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id' => 'Containerized Application',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id+' => 'Application which uses this image',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id' => 'Container Image',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id+' => 'Software image used to build the containerized application',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Virtual Host
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerVirtualHost/Name' => '%1$s',
|
||||
'Class:ContainerVirtualHost/ComplementaryName' => '',
|
||||
'Class:ContainerVirtualHost' => 'Container Platform',
|
||||
'Class:ContainerVirtualHost+' => 'Platform on which applications run as containers',
|
||||
'Class:ContainerVirtualHost/Attribute:containertype_id' => 'Container Type',
|
||||
'Class:ContainerVirtualHost/Attribute:containertype_id+' => 'Technology used to deliver containerization',
|
||||
'Class:ContainerVirtualHost/Attribute:status' => 'Status',
|
||||
'Class:ContainerVirtualHost/Attribute:status+' => 'Status of the container platform',
|
||||
'Class:ContainerVirtualHost/Attribute:containerapplications_list' => 'Applications',
|
||||
'Class:ContainerVirtualHost/Attribute:containerapplications_list+' => 'Applications running on this container environment',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Host
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerHost/Name' => '%1$s',
|
||||
'Class:ContainerHost/ComplementaryName' => '%1$s-%2$s',
|
||||
'Class:ContainerHost' => 'Container Host',
|
||||
'Class:ContainerHost+' => 'Host dedicated to containers. It is the basic element of a Container Platform',
|
||||
'Class:ContainerHost/Attribute:containercluster_id' => 'Container Cluster',
|
||||
'Class:ContainerHost/Attribute:containercluster_id+' => '',
|
||||
'Class:ContainerHost/Attribute:role' => 'Role',
|
||||
'Class:ContainerHost/Attribute:role+' => 'Role of the host within its cluster: Master or Worker. Standalone when not part of a cluster.',
|
||||
'Class:ContainerHost/Attribute:system_id' => 'System',
|
||||
'Class:ContainerHost/Attribute:system_id+' => 'The system can be a Server, a Virtual Machine, a Cloud, ...',
|
||||
'Class:ContainerHost/Attribute:role/Value:master' => 'Master',
|
||||
'Class:ContainerHost/Attribute:role/Value:worker' => 'Worker',
|
||||
'Class:ContainerHost/Attribute:role/Value:standalone' => 'Standalone',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Cluster
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerCluster/Name' => '%1$s',
|
||||
'Class:ContainerCluster/ComplementaryName' => '',
|
||||
'Class:ContainerCluster' => 'Container Cluster',
|
||||
'Class:ContainerCluster+' => 'A Container Platform made of a cluster of Container Hosts',
|
||||
'Class:ContainerCluster/Attribute:redundancy' => 'Configuration of the redundancy',
|
||||
'Class:ContainerCluster/Attribute:redundancy/disabled' => 'The cluster is up if all its hosts are up',
|
||||
'Class:ContainerCluster/Attribute:redundancy/count' => 'The cluster is up if at least %1$s hosts are up',
|
||||
'Class:ContainerCluster/Attribute:redundancy/percent' => 'The cluster is up if at least %1$s %% of the hosts are up',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list' => 'Container Hosts',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list+' => 'Hosts part of this cluster',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Type
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerType/Name' => '%1$s',
|
||||
'Class:ContainerType/ComplementaryName' => '',
|
||||
'Class:ContainerType' => 'Container Type',
|
||||
'Class:ContainerType+' => 'Technology used to deliver containerization',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Type
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', [
|
||||
'Class:ContainerImageType/Name' => '%1$s',
|
||||
'Class:ContainerImageType/ComplementaryName' => '',
|
||||
'Class:ContainerImageType' => 'Container Image Type',
|
||||
'Class:ContainerImageType+' => 'Typology of container images',
|
||||
]);
|
||||
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @copyright Copyright (C) 2013 XXXXX
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
//
|
||||
// Fieldsets for Container classes
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Container:baseinfo' => 'Informations générales',
|
||||
'Container:moreinfo' => 'Spécificités de la conteneurisation',
|
||||
'Container:otherinfo' => 'Dates et description',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Image
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerImage/Name' => '%1$s %2$s',
|
||||
'Class:ContainerImage/ComplementaryName' => '%1$s - %2$s',
|
||||
'Class:ContainerImage' => 'Image pour Conteneur',
|
||||
'Class:ContainerImage+' => 'L\'image d\'un logiciel, constituant d\'une Application Conteneurisée',
|
||||
'Class:ContainerImage/Attribute:name' => 'Nom',
|
||||
'Class:ContainerImage/Attribute:name+' => '',
|
||||
'Class:ContainerImage/Attribute:version' => 'Version',
|
||||
'Class:ContainerImage/Attribute:version+' => '',
|
||||
'Class:ContainerImage/Attribute:description' => 'Description',
|
||||
'Class:ContainerImage/Attribute:description+' => '',
|
||||
'Class:ContainerImage/Attribute:publisher' => 'Editeur',
|
||||
'Class:ContainerImage/Attribute:publisher+' => 'Fournisseur de l\image',
|
||||
'Class:ContainerImage/Attribute:image' => 'Image',
|
||||
'Class:ContainerImage/Attribute:image+' => 'Détail permettant de récupérer l\'image sur la plateforme d\'hébergement appropriée',
|
||||
'Class:ContainerImage/Attribute:type_id' => 'Type',
|
||||
'Class:ContainerImage/Attribute:type_id+' => 'Type d\image',
|
||||
'Class:ContainerImage/Attribute:software_id' => 'Logiciel',
|
||||
'Class:ContainerImage/Attribute:software_id+' => '',
|
||||
'Class:ContainerImage/Attribute:containerapplications_list' => 'Applications conteneurisées',
|
||||
'Class:ContainerImage/Attribute:containerapplications_list+' => 'Les applications qui utilisent cette image',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Application
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerApplication/Name' => '%1$s',
|
||||
'Class:ContainerApplication/ComplementaryName' => '%1$s',
|
||||
'Class:ContainerApplication' => 'Application Conteneurisée',
|
||||
'Class:ContainerApplication+' => 'Une application déployée sur une Plateforme de Conteneurisation',
|
||||
'Class:ContainerApplication/Attribute:descriptor' => 'Fichier de déploiement',
|
||||
'Class:ContainerApplication/Attribute:descriptor+' => 'Fichier décrivant la manière de déployer l\'application sur la plateforme de conteneurisation (par exemple, Docker Compose, Helm Chart, etc.)',
|
||||
'Class:ContainerApplication/Attribute:containervirtualhost_id' => 'Hôte',
|
||||
'Class:ContainerApplication/Attribute:containervirtualhost_id+' => 'Plateforme de conteneurisation sur laquelle cette application est déployée',
|
||||
'Class:ContainerApplication/Attribute:containertype_id' => 'Type de conteneur',
|
||||
'Class:ContainerApplication/Attribute:containertype_id+' => 'Typologie de plateforme de conteneurisation',
|
||||
'Class:ContainerApplication/Attribute:containerimages_list' => 'Images',
|
||||
'Class:ContainerApplication/Attribute:containerimages_list+' => 'Images des conteneurs constitutifs de cette application',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class: lnkContainerApplicationToImage
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:lnkContainerApplicationToImage' => 'Lien Application / Image pour Conteneur',
|
||||
'Class:lnkContainerApplicationToImage+' => '',
|
||||
'Class:lnkContainerApplicationToImage/Name' => '%1$s / %2$s',
|
||||
'Class:lnkContainerApplicationToImage/Name+' => '',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id' => 'Application conteneurisée',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id+' => 'Application qui utilise cette image',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id' => 'Image pour conteneur',
|
||||
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id+' => 'Une image qui contribue à l\'application',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Virtual Host
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerVirtualHost/Name' => '%1$s',
|
||||
'Class:ContainerVirtualHost/ComplementaryName' => '',
|
||||
'Class:ContainerVirtualHost' => 'Plateforme de Conteneurisation',
|
||||
'Class:ContainerVirtualHost+' => 'Plateforme sur laquelle des applications s\'exécutent dans des conteneurs',
|
||||
'Class:ContainerVirtualHost/Attribute:containertype_id' => 'Type de plateforme',
|
||||
'Class:ContainerVirtualHost/Attribute:containertype_id+' => 'Technologie de conteneurisation utilisée',
|
||||
'Class:ContainerVirtualHost/Attribute:status' => 'État',
|
||||
'Class:ContainerVirtualHost/Attribute:status+' => 'État de la plateforme de conteneurisation',
|
||||
'Class:ContainerVirtualHost/Attribute:containerapplications_list' => 'Applications',
|
||||
'Class:ContainerVirtualHost/Attribute:containerapplications_list+' => 'Applications qui sont déployées sur cette plateforme',
|
||||
'ContainerVirtualHost:baseinfo' => 'Informations générales',
|
||||
'ContainerVirtualHost:moreinfo' => 'Spécificités de la conteneurisation',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Host
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerHost/Name' => '%1$s',
|
||||
'Class:ContainerHost/ComplementaryName' => '%1$s-%2$s',
|
||||
'Class:ContainerHost' => 'Hôte pour Conteneurs',
|
||||
'Class:ContainerHost+' => 'Logiciel hôte dédié à l\'exécution de conteneurs. C\'est l\'élément de base d\'une Plateforme de Conteneurisation',
|
||||
'Class:ContainerHost/Attribute:containercluster_id' => 'Grappe pour conteneurs',
|
||||
'Class:ContainerHost/Attribute:containercluster_id+' => 'Grappe d\'hôtes pour conteneurs',
|
||||
'Class:ContainerHost/Attribute:role' => 'Rôle',
|
||||
'Class:ContainerHost/Attribute:role+' => 'Rôle de cet hôte au sein de la grappe : Maître ou Esclave. Autonome en l\'absence de grappe',
|
||||
'Class:ContainerHost/Attribute:role/Value:master' => 'Maître',
|
||||
'Class:ContainerHost/Attribute:role/Value:worker' => 'Esclave',
|
||||
'Class:ContainerHost/Attribute:role/Value:standalone' => 'Autonome',
|
||||
'Class:ContainerHost/Attribute:system_id' => 'Système',
|
||||
'Class:ContainerHost/Attribute:system_id+' => 'Le système sur lequel cet hôte tourne. Cela peut être un Serveur, une Machine Virtuelle ou un Nuage',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Cluster
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerCluster/Name' => '%1$s',
|
||||
'Class:ContainerCluster/ComplementaryName' => '',
|
||||
'Class:ContainerCluster' => 'Grappe pour Conteneurs',
|
||||
'Class:ContainerCluster+' => 'Plateforme de Conteneurisation constitué d\'une grappe d\'Hôtes pour Conteneurs',
|
||||
'Class:ContainerCluster/Attribute:redundancy' => 'Configuration de la redondance',
|
||||
'Class:ContainerCluster/Attribute:redundancy/disabled' => 'La grappe est opérationnelle si tous les hôtes qui la composent sont opérationnels',
|
||||
'Class:ContainerCluster/Attribute:redundancy/count' => 'Nombre minimal d\'hôtes pour que la grappe soit opérationnelle : %1$s',
|
||||
'Class:ContainerCluster/Attribute:redundancy/percent' => 'Pourcentage minimal d\'hôtes pour que la grappe soit opérationnelle : %1$s %%',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list' => 'Hôtes pour conteneurs',
|
||||
'Class:ContainerCluster/Attribute:containerhosts_list+' => 'Hôtes composant cette grappe',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Type
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerType/Name' => '%1$s',
|
||||
'Class:ContainerType/ComplementaryName' => '',
|
||||
'Class:ContainerType' => 'Type de conteneurisation',
|
||||
'Class:ContainerType+' => 'Technologie de conteneurisation',
|
||||
]);
|
||||
|
||||
//
|
||||
// Class Container Image Type
|
||||
//
|
||||
|
||||
Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Class:ContainerImageType/Name' => '%1$s',
|
||||
'Class:ContainerImageType/ComplementaryName' => '',
|
||||
'Class:ContainerImageType' => 'Type d\'image',
|
||||
'Class:ContainerImageType+' => 'Typologie d\'images pour container',
|
||||
]);
|
||||
@@ -0,0 +1,346 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 48 48"
|
||||
width="48px"
|
||||
height="48px"
|
||||
version="1.1"
|
||||
id="svg17"
|
||||
sodipodi:docname="icons8-desktop-container-alt(2).svg"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs17">
|
||||
<linearGradient
|
||||
id="z~0a6SjB_MRO4U5XcH~qfa"
|
||||
x1="24"
|
||||
x2="24"
|
||||
y1="4.4889998"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.50425665,0,0,0.52649101,23.048596,23.922275)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#21ad64"
|
||||
id="stop1-3" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#088242"
|
||||
id="stop2-6" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="24"
|
||||
y1="4.4889998"
|
||||
x2="24"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="color-1">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#f44f5a"
|
||||
id="stop1-7" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#e52030"
|
||||
id="stop2-5" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview17"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="8"
|
||||
inkscape:cx="-14"
|
||||
inkscape:cy="22"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1360"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg17"
|
||||
showguides="true">
|
||||
<sodipodi:guide
|
||||
position="8.6248555,32.468683"
|
||||
orientation="1,0"
|
||||
id="guide17"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="18.623701,39.409067"
|
||||
orientation="0,-1"
|
||||
id="guide18"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="14.939875,32.189707"
|
||||
orientation="0,-1"
|
||||
id="guide19"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="-48.5,14.5625"
|
||||
orientation="1,0"
|
||||
id="guide20"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="10.092844,11.552042"
|
||||
orientation="0,-1"
|
||||
id="guide21"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<radialGradient
|
||||
id="JbJPDQpzlQgFl0pQhERgYa"
|
||||
cx="232.47"
|
||||
cy="544.051"
|
||||
r="86.245"
|
||||
gradientTransform="matrix(0.7455679,0,0,-0.93789676,-130.40909,581.4208)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset=".323"
|
||||
stop-color="#23d9d6"
|
||||
id="stop1" />
|
||||
<stop
|
||||
offset=".427"
|
||||
stop-color="#23d4d7"
|
||||
id="stop2" />
|
||||
<stop
|
||||
offset=".542"
|
||||
stop-color="#21c7dc"
|
||||
id="stop3" />
|
||||
<stop
|
||||
offset=".664"
|
||||
stop-color="#1fb0e2"
|
||||
id="stop4" />
|
||||
<stop
|
||||
offset=".789"
|
||||
stop-color="#1c91ec"
|
||||
id="stop5" />
|
||||
<stop
|
||||
offset=".917"
|
||||
stop-color="#1969f8"
|
||||
id="stop6" />
|
||||
<stop
|
||||
offset=".944"
|
||||
stop-color="#1860fb"
|
||||
id="stop7" />
|
||||
</radialGradient>
|
||||
<path
|
||||
fill="url(#JbJPDQpzlQgFl0pQhERgYa)"
|
||||
d="M 7.7397454,6 H 35.575672 c 0.96121,0 1.739746,0.7785361 1.739746,1.7397454 V 35.575672 c 0,0.96121 -0.778536,1.739746 -1.739746,1.739746 H 7.7397454 C 6.7785361,37.315418 6,36.536882 6,35.575672 V 7.7397454 C 6,6.7785361 6.7785361,6 7.7397454,6 Z"
|
||||
id="path7"
|
||||
style="fill:url(#JbJPDQpzlQgFl0pQhERgYa);stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#184f85"
|
||||
d="M 37.315418,35.575672 V 32.096181 H 6 v 3.479491 c 0,0.96121 0.7785361,1.739746 1.7397454,1.739746 H 35.575672 c 0.96121,0 1.739746,-0.778536 1.739746,-1.739746 z"
|
||||
id="path8"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 8.1746818,36.445545 c -0.7193848,0 -1.3048091,-0.585424 -1.3048091,-1.304809 v -0.869873 c 0,-0.719385 0.5854243,-1.304809 1.3048091,-1.304809 h 0.8698727 c 0.7193847,0 1.3048095,0.585424 1.3048095,1.304809 v 0.869873 c 0,0.719385 -0.5854248,1.304809 -1.3048095,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path9"
|
||||
style="display:inline;stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 8.1746818,36.010609 c -0.4792999,0 -0.8698727,-0.390573 -0.8698727,-0.869873 v -0.869873 c 0,-0.4793 0.3905728,-0.869873 0.8698727,-0.869873 h 0.8698727 c 0.4792999,0 0.8698727,0.390573 0.8698727,0.869873 v 0.869873 c 0,0.4793 -0.3905728,0.869873 -0.8698727,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path10"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="M 9.0445545,35.575672 H 8.1746818 c -0.2400849,0 -0.4349364,-0.194851 -0.4349364,-0.434936 v -0.869873 c 0,-0.240085 0.1948515,-0.434936 0.4349364,-0.434936 h 0.8698727 c 0.2400849,0 0.4349363,0.194851 0.4349363,0.434936 v 0.869873 c 0,0.240085 -0.1948514,0.434936 -0.4349363,0.434936 z"
|
||||
id="path11"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 12.442916,36.457287 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -0.869873 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 0.869873 c 0.719384,0 1.304809,0.585424 1.304809,1.304809 v 0.869873 c 0,0.719385 -0.585425,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path9-5"
|
||||
style="display:inline;stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 12.442916,36.022351 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -0.869873 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 0.869873 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 0.869873 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path10-9"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 13.312789,35.587414 h -0.869873 c -0.240085,0 -0.434936,-0.194851 -0.434936,-0.434936 v -0.869873 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 0.869873 c 0.240085,0 0.434936,0.194851 0.434936,0.434936 v 0.869873 c 0,0.240085 -0.194851,0.434936 -0.434936,0.434936 z"
|
||||
id="path11-2"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 16.812935,36.440821 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -0.869873 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 0.869873 c 0.719384,0 1.304809,0.585424 1.304809,1.304809 v 0.869873 c 0,0.719385 -0.585425,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path9-8"
|
||||
style="display:inline;stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 16.812935,36.005885 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -0.869873 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 0.869873 c 0.4793,0 0.869872,0.390573 0.869872,0.869873 v 0.869873 c 0,0.4793 -0.390572,0.869873 -0.869872,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path10-97"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 17.682808,35.570948 h -0.869873 c -0.240085,0 -0.434936,-0.194851 -0.434936,-0.434936 v -0.869873 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 0.869873 c 0.240085,0 0.434936,0.194851 0.434936,0.434936 v 0.869873 c 0,0.240085 -0.194851,0.434936 -0.434936,0.434936 z"
|
||||
id="path11-3"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 21.172333,36.463025 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -0.869873 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 0.869872 c 0.719385,0 1.30481,0.585424 1.30481,1.304809 v 0.869873 c 0,0.719385 -0.585425,1.304809 -1.30481,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path9-1"
|
||||
style="display:inline;stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 21.172333,36.028089 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -0.869873 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 0.869872 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 0.869873 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path10-2"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 22.042205,35.593152 h -0.869872 c -0.240085,0 -0.434937,-0.194851 -0.434937,-0.434936 v -0.869873 c 0,-0.240085 0.194852,-0.434936 0.434937,-0.434936 h 0.869872 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 0.869873 c 0,0.240085 -0.194852,0.434936 -0.434937,0.434936 z"
|
||||
id="path11-9"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 9.9144272,13.828854 c -0.7193847,0 -1.3048091,-0.585424 -1.3048091,-1.304809 V 9.9144272 c 0,-0.7193847 0.5854244,-1.3048091 1.3048091,-1.3048091 h 2.6096178 c 0.719385,0 1.304809,0.5854244 1.304809,1.3048091 v 2.6096178 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path12"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 9.9144272,13.393918 c -0.4792999,0 -0.8698727,-0.390573 -0.8698727,-0.869873 V 9.9144272 c 0,-0.4792999 0.3905728,-0.8698727 0.8698727,-0.8698727 h 2.6096178 c 0.4793,0 0.869873,0.3905728 0.869873,0.8698727 v 2.6096178 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path13"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="M 12.524045,12.958982 H 9.9144272 c -0.2400849,0 -0.4349364,-0.194852 -0.4349364,-0.434937 V 9.9144272 c 0,-0.2400849 0.1948515,-0.4349364 0.4349364,-0.4349364 h 2.6096178 c 0.240085,0 0.434937,0.1948515 0.434937,0.4349364 v 2.6096178 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||
id="path14"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 9.925223,21.049076 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -2.609618 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 2.609618 c 0.719385,0 1.304809,0.585424 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path12-7"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 9.925223,20.61414 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.609618 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path13-0"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="M 12.534841,20.179204 H 9.925223 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.609618 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||
id="path14-9"
|
||||
style="stroke-width:0.869873" />
|
||||
<g
|
||||
id="g17">
|
||||
<path
|
||||
d="m 9.9239547,28.13042 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -2.609618 c 0,-0.719384 0.585424,-1.304809 1.304809,-1.304809 h 2.6096183 c 0.719385,0 1.304809,0.585425 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path12-6"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 9.9239547,27.695484 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.6096183 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path13-06"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="M 12.533573,27.260548 H 9.9239547 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.6096183 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||
id="path14-2"
|
||||
style="stroke-width:0.869873" />
|
||||
</g>
|
||||
<g
|
||||
id="g18"
|
||||
transform="translate(1.8119612,-8.374796)">
|
||||
<path
|
||||
d="M 15.304809,22.219236 C 14.585424,22.219236 14,21.633812 14,20.914427 V 18.304809 C 14,17.585424 14.585424,17 15.304809,17 h 2.609618 c 0.719385,0 1.304809,0.585424 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path12-1"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 15.304809,21.7843 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.609618 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path13-8"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 17.914427,21.349364 h -2.609618 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.609618 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||
id="path14-7"
|
||||
style="stroke-width:0.869873" />
|
||||
</g>
|
||||
<path
|
||||
d="m 17.084265,21.042459 c -0.719384,0 -1.304809,-0.585424 -1.304809,-1.304809 v -2.609618 c 0,-0.719385 0.585425,-1.304809 1.304809,-1.304809 h 2.609618 c 0.719385,0 1.304809,0.585424 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||
opacity="0.05"
|
||||
id="path12-2"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
d="m 17.084265,20.607523 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.609618 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||
opacity="0.07"
|
||||
id="path13-02"
|
||||
style="stroke-width:0.869873" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="m 19.693883,20.172587 h -2.609618 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.609618 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||
id="path14-3"
|
||||
style="stroke-width:0.869873" />
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="nonzero"
|
||||
stroke="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke-miterlimit="10"
|
||||
stroke-dasharray="none"
|
||||
stroke-dashoffset="0"
|
||||
font-family="none"
|
||||
font-weight="none"
|
||||
font-size="none"
|
||||
text-anchor="none"
|
||||
style="display:inline;mix-blend-mode:normal"
|
||||
id="g9"
|
||||
transform="matrix(0.09476897,0,0,0.09902703,23.025816,23.874812)">
|
||||
<g
|
||||
transform="scale(5.33333)"
|
||||
id="g8">
|
||||
<path
|
||||
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||
fill="#b41530"
|
||||
id="path2-3" />
|
||||
<path
|
||||
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||
fill="url(#color-1)"
|
||||
id="path3-5"
|
||||
style="fill:url(#color-1)" />
|
||||
<path
|
||||
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path4-6" />
|
||||
<path
|
||||
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path5" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle5-2" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle6-9" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle7-1" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle8" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLa" x1="33.5" x2="33.5" y1="21.279" y2="14.16" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset=".168" stop-color="#c9cdcf"/><stop offset=".423" stop-color="#dcdee0"/><stop offset=".477" stop-color="#e1e2e4"/><stop offset=".859" stop-color="#e4e4e6"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLa)" d="M37,38c-0.132,0-0.266-0.025-0.394-0.081l-4.575-1.961C30.189,35.169,29,33.365,29,31.362V25 c0-0.553,0.447-1,1-1s1,0.447,1,1v6.362c0,1.201,0.714,2.284,1.818,2.758l4.575,1.961c0.508,0.218,0.743,0.806,0.525,1.313 C37.757,37.773,37.388,38,37,38z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLb" x1="-533.666" x2="-536.399" y1="13.398" y2="8.258" gradientTransform="rotate(180 -249 23.945)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bef0"/><stop offset="1" stop-color="#0a85d9"/></linearGradient><circle cx="37" cy="37" r="3" fill="url(#IW_Sf1PHIv01Y0HkR8iXLb)"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLc" x1="14.5" x2="14.5" y1="21.279" y2="14.16" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset=".194" stop-color="#c9cdcf"/><stop offset=".503" stop-color="#e1e2e4"/><stop offset=".859" stop-color="#e4e4e6"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLc)" d="M11,38c-0.388,0-0.757-0.227-0.919-0.606c-0.218-0.507,0.018-1.095,0.525-1.313l4.575-1.961 C16.286,33.646,17,32.563,17,31.362V25c0-0.553,0.447-1,1-1s1,0.447,1,1v6.362c0,2.003-1.189,3.807-3.031,4.596l-4.575,1.961 C11.266,37.975,11.132,38,11,38z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLd" x1="24" x2="24" y1="21.279" y2="14.16" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset=".149" stop-color="#c9cdcf"/><stop offset=".318" stop-color="#d2d5d7"/><stop offset=".494" stop-color="#e1e2e4"/><stop offset=".859" stop-color="#e4e4e6"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLd)" d="M24,41c-0.553,0-1-0.447-1-1V24c0-0.553,0.447-1,1-1s1,0.447,1,1v16 C25,40.553,24.553,41,24,41z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLe" x1="16.832" x2="30.197" y1="42.119" y2="16.983" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2aa4f4"/><stop offset="1" stop-color="#007ad9"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLe)" d="M34.183,9.034C31.992,5.422,28.034,3,23.5,3c-6.087,0-11.152,4.353-12.266,10.115 C7.696,13.718,5,16.79,5,20.5c0,4.142,3.358,7.5,7.5,7.5c0.007,0,0.014-0.001,0.021-0.001V28H33.5c5.247,0,9.5-4.253,9.5-9.5 C43,13.484,39.11,9.386,34.183,9.034z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLf" x1="22.666" x2="25.399" y1="9.398" y2="4.258" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bef0"/><stop offset="1" stop-color="#0a85d9"/></linearGradient><circle cx="24" cy="41" r="3" fill="url(#IW_Sf1PHIv01Y0HkR8iXLf)"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLg" x1="9.666" x2="12.399" y1="13.398" y2="8.258" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bef0"/><stop offset="1" stop-color="#0a85d9"/></linearGradient><circle cx="11" cy="37" r="3" fill="url(#IW_Sf1PHIv01Y0HkR8iXLg)"/></svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,524 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 240 240"
|
||||
width="240px"
|
||||
height="240px"
|
||||
version="1.1"
|
||||
id="svg48"
|
||||
sodipodi:docname="icons8-farm-container(2).svg"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview50"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.0187236"
|
||||
inkscape:cx="89.456264"
|
||||
inkscape:cy="163.73358"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1360"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg48"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<defs
|
||||
id="defs27">
|
||||
<linearGradient
|
||||
id="linear0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="37.685921"
|
||||
y1="19.14217"
|
||||
x2="130.956497"
|
||||
y2="148.210251"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(16.470589%,64.313728%,95.686275%);stop-opacity:1;"
|
||||
id="stop2" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(0%,47.843137%,85.09804%);stop-opacity:1;"
|
||||
id="stop4" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="radial0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="86"
|
||||
cy="132.583328"
|
||||
fx="86"
|
||||
fy="132.583328"
|
||||
r="10.75"
|
||||
gradientTransform="scale(4.999995)">
|
||||
<stop
|
||||
offset="0.582"
|
||||
style="stop-color:rgb(0%,0%,0%);stop-opacity:0.2;"
|
||||
id="stop7" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"
|
||||
id="stop9" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="linear1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="50.166672"
|
||||
y1="39.416672"
|
||||
x2="121.833328"
|
||||
y2="39.416672"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(11.372549%,34.901962%,70.19608%);stop-opacity:1;"
|
||||
id="stop12" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(9.803922%,35.686275%,73.725492%);stop-opacity:1;"
|
||||
id="stop14" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linear2"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="50.166672"
|
||||
y1="68.083328"
|
||||
x2="121.833328"
|
||||
y2="68.083328"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(11.372549%,34.901962%,70.19608%);stop-opacity:1;"
|
||||
id="stop17" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(9.803922%,35.686275%,73.725492%);stop-opacity:1;"
|
||||
id="stop19" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linear3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="50.166672"
|
||||
y1="96.75"
|
||||
x2="121.833328"
|
||||
y2="96.75"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(11.372549%,34.901962%,70.19608%);stop-opacity:1;"
|
||||
id="stop22" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(9.803922%,35.686275%,73.725492%);stop-opacity:1;"
|
||||
id="stop24" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linear0-3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="37.685921"
|
||||
y1="19.14217"
|
||||
x2="130.9565"
|
||||
y2="148.21025"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(69.803923%,16.470589%,95.686275%);stop-opacity:1;"
|
||||
id="stop2-6" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(52.549022%,0%,85.09804%);stop-opacity:1;"
|
||||
id="stop4-7" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="radial0-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="86"
|
||||
cy="132.58333"
|
||||
fx="86"
|
||||
fy="132.58333"
|
||||
r="10.75"
|
||||
gradientTransform="scale(4.999995)">
|
||||
<stop
|
||||
offset="0.582"
|
||||
style="stop-color:rgb(0%,0%,0%);stop-opacity:0.2;"
|
||||
id="stop7-3" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"
|
||||
id="stop9-5" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="linear1-6"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="50.166672"
|
||||
y1="39.416672"
|
||||
x2="121.83333"
|
||||
y2="39.416672"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(46.27451%,8.627451%,56.078434%);stop-opacity:1;"
|
||||
id="stop12-2" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(44.313726%,5.490196%,62.352943%);stop-opacity:1;"
|
||||
id="stop14-9" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linear2-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="50.166672"
|
||||
y1="68.083328"
|
||||
x2="121.83333"
|
||||
y2="68.083328"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(46.27451%,8.627451%,56.078434%);stop-opacity:1;"
|
||||
id="stop17-2" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(44.313726%,5.490196%,62.352943%);stop-opacity:1;"
|
||||
id="stop19-7" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linear3-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="50.166672"
|
||||
y1="96.75"
|
||||
x2="121.83333"
|
||||
y2="96.75"
|
||||
gradientTransform="scale(1.395349)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:rgb(46.27451%,8.627451%,56.078434%);stop-opacity:1;"
|
||||
id="stop22-9" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(44.313726%,5.490196%,62.352943%);stop-opacity:1;"
|
||||
id="stop24-3" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="radial0-2"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="86"
|
||||
cy="132.58333"
|
||||
fx="86"
|
||||
fy="132.58333"
|
||||
r="10.75"
|
||||
gradientTransform="scale(4.999995)">
|
||||
<stop
|
||||
offset="0.582"
|
||||
style="stop-color:rgb(0%,0%,0%);stop-opacity:0.2;"
|
||||
id="stop7-37" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"
|
||||
id="stop9-59" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear0"
|
||||
id="linearGradient251"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="37.685921"
|
||||
y1="19.14217"
|
||||
x2="130.956497"
|
||||
y2="148.210251" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear1"
|
||||
id="linearGradient253"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="50.166672"
|
||||
y1="39.416672"
|
||||
x2="121.833328"
|
||||
y2="39.416672" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear2"
|
||||
id="linearGradient255"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="50.166672"
|
||||
y1="68.083328"
|
||||
x2="121.833328"
|
||||
y2="68.083328" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear3"
|
||||
id="linearGradient257"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="50.166672"
|
||||
y1="96.75"
|
||||
x2="121.833328"
|
||||
y2="96.75" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear0"
|
||||
id="linearGradient269"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="37.685921"
|
||||
y1="19.14217"
|
||||
x2="130.956497"
|
||||
y2="148.210251" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear1"
|
||||
id="linearGradient271"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="50.166672"
|
||||
y1="39.416672"
|
||||
x2="121.833328"
|
||||
y2="39.416672" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear2"
|
||||
id="linearGradient273"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="50.166672"
|
||||
y1="68.083328"
|
||||
x2="121.833328"
|
||||
y2="68.083328" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linear3"
|
||||
id="linearGradient275"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.395349)"
|
||||
x1="50.166672"
|
||||
y1="96.75"
|
||||
x2="121.833328"
|
||||
y2="96.75" />
|
||||
<linearGradient
|
||||
x1="24"
|
||||
y1="4.4889998"
|
||||
x2="24"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="color-1">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#f44f5a"
|
||||
id="stop1-7" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#e52030"
|
||||
id="stop2-5" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="z~0a6SjB_MRO4U5XcH~qfa-3"
|
||||
x1="24"
|
||||
x2="24"
|
||||
y1="4.4889998"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-38,-2)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#21ad64"
|
||||
id="stop1-1" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#088242"
|
||||
id="stop2-9" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g
|
||||
id="surface37962620"
|
||||
transform="matrix(0.70082968,0,0,0.70082968,-9.1125191,8.1014159)">
|
||||
<path
|
||||
style="fill:url(#linearGradient269);fill-rule:nonzero;stroke:none"
|
||||
d="M 180,20 H 60 c -5.523438,0 -10,4.476562 -10,10 v 180 c 0,5.52344 4.476562,10 10,10 h 120 c 5.52344,0 10,-4.47656 10,-10 V 30 c 0,-5.523438 -4.47656,-10 -10,-10 z m 0,0"
|
||||
id="path29" />
|
||||
<path
|
||||
style="fill:url(#radial0);fill-rule:nonzero;stroke:none"
|
||||
d="m 135,185 c 0,8.28516 -6.71484,15 -15,15 -8.28516,0 -15,-6.71484 -15,-15 0,-8.28516 6.71484,-15 15,-15 8.28516,0 15,6.71484 15,15 z m 0,0"
|
||||
id="path31" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 130,185 c 0,5.52344 -4.47656,10 -10,10 -5.52344,0 -10,-4.47656 -10,-10 0,-5.52344 4.47656,-10 10,-10 5.52344,0 10,4.47656 10,10 z m 0,0"
|
||||
id="path33" />
|
||||
<path
|
||||
style="fill:url(#linearGradient271);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,70 h -95 C 71.121094,70 70,68.878906 70,67.5 v -25 C 70,41.121094 71.121094,40 72.5,40 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.378906 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path35" />
|
||||
<path
|
||||
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,55 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||
id="path37" />
|
||||
<path
|
||||
style="fill:url(#linearGradient273);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,110 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 C 70,81.121094 71.121094,80 72.5,80 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path39" />
|
||||
<path
|
||||
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,95 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||
id="path41" />
|
||||
<path
|
||||
style="fill:url(#linearGradient275);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,150 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 c 0,-1.37891 1.121094,-2.5 2.5,-2.5 h 95 c 1.37891,0 2.5,1.12109 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path43" />
|
||||
<path
|
||||
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,135 c 0,2.76172 -2.23828,5 -5,5 -2.76172,0 -5,-2.23828 -5,-5 0,-2.76172 2.23828,-5 5,-5 2.76172,0 5,2.23828 5,5 z m 0,0"
|
||||
id="path45" />
|
||||
</g>
|
||||
<g
|
||||
id="surface39050914"
|
||||
transform="matrix(0.70448581,0,0,0.70448581,24.194376,16.874754)">
|
||||
<path
|
||||
style="fill:url(#linear0-3);fill-rule:nonzero;stroke:none"
|
||||
d="M 180,20 H 60 c -5.523438,0 -10,4.476562 -10,10 v 180 c 0,5.52344 4.476562,10 10,10 h 120 c 5.52344,0 10,-4.47656 10,-10 V 30 c 0,-5.523438 -4.47656,-10 -10,-10 z m 0,0"
|
||||
id="path29-6" />
|
||||
<path
|
||||
style="fill:url(#radial0-5);fill-rule:nonzero;stroke:none"
|
||||
d="m 135,185 c 0,8.28516 -6.71484,15 -15,15 -8.28516,0 -15,-6.71484 -15,-15 0,-8.28516 6.71484,-15 15,-15 8.28516,0 15,6.71484 15,15 z m 0,0"
|
||||
id="path31-0" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 130,185 c 0,5.52344 -4.47656,10 -10,10 -5.52344,0 -10,-4.47656 -10,-10 0,-5.52344 4.47656,-10 10,-10 5.52344,0 10,4.47656 10,10 z m 0,0"
|
||||
id="path33-6" />
|
||||
<path
|
||||
style="fill:url(#linear1-6);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,70 h -95 C 71.121094,70 70,68.878906 70,67.5 v -25 C 70,41.121094 71.121094,40 72.5,40 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.378906 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path35-2" />
|
||||
<path
|
||||
style="fill:#f530ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,55 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||
id="path37-6" />
|
||||
<path
|
||||
style="fill:url(#linear2-1);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,110 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 C 70,81.121094 71.121094,80 72.5,80 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path39-1" />
|
||||
<path
|
||||
style="fill:#f530ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,95 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||
id="path41-8" />
|
||||
<path
|
||||
style="fill:url(#linear3-0);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,150 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 c 0,-1.37891 1.121094,-2.5 2.5,-2.5 h 95 c 1.37891,0 2.5,1.12109 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path43-7" />
|
||||
<path
|
||||
style="fill:#f530ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,135 c 0,2.76172 -2.23828,5 -5,5 -2.76172,0 -5,-2.23828 -5,-5 0,-2.76172 2.23828,-5 5,-5 2.76172,0 5,2.23828 5,5 z m 0,0"
|
||||
id="path45-9" />
|
||||
</g>
|
||||
<g
|
||||
id="surface37962620-2"
|
||||
transform="matrix(0.70082968,0,0,0.70082968,64.946318,26.356156)">
|
||||
<path
|
||||
style="fill:url(#linearGradient251);fill-rule:nonzero;stroke:none"
|
||||
d="M 180,20 H 60 c -5.523438,0 -10,4.476562 -10,10 v 180 c 0,5.52344 4.476562,10 10,10 h 120 c 5.52344,0 10,-4.47656 10,-10 V 30 c 0,-5.523438 -4.47656,-10 -10,-10 z m 0,0"
|
||||
id="path29-9" />
|
||||
<path
|
||||
style="fill:url(#radial0-2);fill-rule:nonzero;stroke:none"
|
||||
d="m 135,185 c 0,8.28516 -6.71484,15 -15,15 -8.28516,0 -15,-6.71484 -15,-15 0,-8.28516 6.71484,-15 15,-15 8.28516,0 15,6.71484 15,15 z m 0,0"
|
||||
id="path31-3" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 130,185 c 0,5.52344 -4.47656,10 -10,10 -5.52344,0 -10,-4.47656 -10,-10 0,-5.52344 4.47656,-10 10,-10 5.52344,0 10,4.47656 10,10 z m 0,0"
|
||||
id="path33-1" />
|
||||
<path
|
||||
style="fill:url(#linearGradient253);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,70 h -95 C 71.121094,70 70,68.878906 70,67.5 v -25 C 70,41.121094 71.121094,40 72.5,40 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.378906 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path35-9" />
|
||||
<path
|
||||
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,55 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||
id="path37-4" />
|
||||
<path
|
||||
style="fill:url(#linearGradient255);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,110 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 C 70,81.121094 71.121094,80 72.5,80 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path39-7" />
|
||||
<path
|
||||
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,95 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||
id="path41-84" />
|
||||
<path
|
||||
style="fill:url(#linearGradient257);fill-rule:nonzero;stroke:none"
|
||||
d="m 167.5,150 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 c 0,-1.37891 1.121094,-2.5 2.5,-2.5 h 95 c 1.37891,0 2.5,1.12109 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||
id="path43-5" />
|
||||
<path
|
||||
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
d="m 160,135 c 0,2.76172 -2.23828,5 -5,5 -2.76172,0 -5,-2.23828 -5,-5 0,-2.76172 2.23828,-5 5,-5 2.76172,0 5,2.23828 5,5 z m 0,0"
|
||||
id="path45-0" />
|
||||
</g>
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="nonzero"
|
||||
stroke="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke-miterlimit="10"
|
||||
stroke-dasharray="none"
|
||||
stroke-dashoffset="0"
|
||||
font-family="none"
|
||||
font-weight="none"
|
||||
font-size="none"
|
||||
text-anchor="none"
|
||||
style="display:inline;mix-blend-mode:normal"
|
||||
id="g9"
|
||||
transform="matrix(0.52119415,0,0,0.5446121,102.47174,115.50098)">
|
||||
<g
|
||||
transform="scale(5.33333)"
|
||||
id="g8">
|
||||
<path
|
||||
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||
fill="#b41530"
|
||||
id="path2-3" />
|
||||
<path
|
||||
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||
fill="url(#color-1)"
|
||||
id="path3-5"
|
||||
style="fill:url(#color-1)" />
|
||||
<path
|
||||
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path4-6" />
|
||||
<path
|
||||
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path5" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle5-2" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle6-9" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle7-1" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle8" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,275 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 48 48"
|
||||
width="240px"
|
||||
height="240px"
|
||||
version="1.1"
|
||||
id="svg1633"
|
||||
sodipodi:docname="icons8-server-container(2).svg"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
inkscape:export-filename="icons8-hypervisor.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1637">
|
||||
<linearGradient
|
||||
x1="24"
|
||||
y1="4.4889998"
|
||||
x2="24"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="color-1">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#f44f5a"
|
||||
id="stop1-7" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#e52030"
|
||||
id="stop2-5" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="z~0a6SjB_MRO4U5XcH~qfa-3"
|
||||
x1="24"
|
||||
x2="24"
|
||||
y1="4.4889998"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-38,-2)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#21ad64"
|
||||
id="stop1-1" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#088242"
|
||||
id="stop2-9" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview1635"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.8416667"
|
||||
inkscape:cx="124.04692"
|
||||
inkscape:cy="133.72434"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1360"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1633"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<linearGradient
|
||||
id="H5zWGZDzzYRltSZyl6Krha"
|
||||
x1="10.517"
|
||||
x2="36.546"
|
||||
y1="5.342"
|
||||
y2="41.361"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#2aa4f4"
|
||||
id="stop1590" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#007ad9"
|
||||
id="stop1592" />
|
||||
</linearGradient>
|
||||
<path
|
||||
fill="url(#H5zWGZDzzYRltSZyl6Krha)"
|
||||
d="M 32.725418,5.8345643 H 13.76154 c -0.873128,0 -1.580323,0.7071946 -1.580323,1.5803232 V 35.860705 c 0,0.873128 0.707195,1.580323 1.580323,1.580323 h 18.963878 c 0.873129,0 1.580324,-0.707195 1.580324,-1.580323 V 7.4148875 c 0,-0.8731286 -0.707195,-1.5803232 -1.580324,-1.5803232 z"
|
||||
id="path1595"
|
||||
style="fill:url(#H5zWGZDzzYRltSZyl6Krha);stroke-width:0.790162" />
|
||||
<radialGradient
|
||||
id="H5zWGZDzzYRltSZyl6Krhb"
|
||||
cx="24"
|
||||
cy="37"
|
||||
r="3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||
<stop
|
||||
offset=".582"
|
||||
stop-opacity=".2"
|
||||
id="stop1597" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-opacity="0"
|
||||
id="stop1599" />
|
||||
</radialGradient>
|
||||
<circle
|
||||
cx="23.243479"
|
||||
cy="31.909897"
|
||||
r="2.3704848"
|
||||
fill="url(#H5zWGZDzzYRltSZyl6Krhb)"
|
||||
id="circle1602"
|
||||
style="fill:url(#H5zWGZDzzYRltSZyl6Krhb);stroke-width:0.790162" />
|
||||
<circle
|
||||
cx="23.243479"
|
||||
cy="31.909897"
|
||||
r="1.5803232"
|
||||
fill="#ffffff"
|
||||
id="circle1604"
|
||||
style="stroke-width:0.790162" />
|
||||
<linearGradient
|
||||
id="H5zWGZDzzYRltSZyl6Krhc"
|
||||
x1="14"
|
||||
x2="34"
|
||||
y1="11"
|
||||
y2="11"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#1d59b3"
|
||||
id="stop1606" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#195bbc"
|
||||
id="stop1608" />
|
||||
</linearGradient>
|
||||
<path
|
||||
fill="url(#H5zWGZDzzYRltSZyl6Krhc)"
|
||||
d="m 30.750014,13.73618 h -15.01307 c -0.218084,0 -0.395081,-0.176996 -0.395081,-0.395081 V 9.3902915 c 0,-0.2180846 0.176997,-0.3950808 0.395081,-0.3950808 h 15.01307 c 0.218085,0 0.395081,0.1769962 0.395081,0.3950808 v 3.9508075 c 0,0.218085 -0.176996,0.395081 -0.395081,0.395081 z"
|
||||
id="path1611"
|
||||
style="fill:url(#H5zWGZDzzYRltSZyl6Krhc);stroke-width:0.790162" />
|
||||
<circle
|
||||
cx="28.774611"
|
||||
cy="11.365695"
|
||||
r="0.79016161"
|
||||
fill="#50e6ff"
|
||||
id="circle1613"
|
||||
style="stroke-width:0.790162" />
|
||||
<linearGradient
|
||||
id="H5zWGZDzzYRltSZyl6Krhd"
|
||||
x1="14"
|
||||
x2="34"
|
||||
y1="19"
|
||||
y2="19"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#1d59b3"
|
||||
id="stop1615" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#195bbc"
|
||||
id="stop1617" />
|
||||
</linearGradient>
|
||||
<path
|
||||
fill="url(#H5zWGZDzzYRltSZyl6Krhd)"
|
||||
d="m 30.750014,20.057473 h -15.01307 c -0.218084,0 -0.395081,-0.176997 -0.395081,-0.395081 v -3.950808 c 0,-0.218085 0.176997,-0.395081 0.395081,-0.395081 h 15.01307 c 0.218085,0 0.395081,0.176996 0.395081,0.395081 v 3.950808 c 0,0.218084 -0.176996,0.395081 -0.395081,0.395081 z"
|
||||
id="path1620"
|
||||
style="fill:url(#H5zWGZDzzYRltSZyl6Krhd);stroke-width:0.790162" />
|
||||
<circle
|
||||
cx="28.774611"
|
||||
cy="17.686989"
|
||||
r="0.79016161"
|
||||
fill="#50e6ff"
|
||||
id="circle1622"
|
||||
style="stroke-width:0.790162" />
|
||||
<linearGradient
|
||||
id="H5zWGZDzzYRltSZyl6Krhe"
|
||||
x1="14"
|
||||
x2="34"
|
||||
y1="27"
|
||||
y2="27"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#1d59b3"
|
||||
id="stop1624" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#195bbc"
|
||||
id="stop1626" />
|
||||
</linearGradient>
|
||||
<path
|
||||
fill="url(#H5zWGZDzzYRltSZyl6Krhe)"
|
||||
d="m 30.750014,26.378765 h -15.01307 c -0.218084,0 -0.395081,-0.176996 -0.395081,-0.39508 v -3.950808 c 0,-0.218085 0.176997,-0.395081 0.395081,-0.395081 h 15.01307 c 0.218085,0 0.395081,0.176996 0.395081,0.395081 v 3.950808 c 0,0.218084 -0.176996,0.39508 -0.395081,0.39508 z"
|
||||
id="path1629"
|
||||
style="fill:url(#H5zWGZDzzYRltSZyl6Krhe);stroke-width:0.790162" />
|
||||
<circle
|
||||
cx="28.774611"
|
||||
cy="24.008282"
|
||||
r="0.79016161"
|
||||
fill="#50e6ff"
|
||||
id="circle1631"
|
||||
style="stroke-width:0.790162" />
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="nonzero"
|
||||
stroke="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke-miterlimit="10"
|
||||
stroke-dasharray="none"
|
||||
stroke-dashoffset="0"
|
||||
font-family="none"
|
||||
font-weight="none"
|
||||
font-size="none"
|
||||
text-anchor="none"
|
||||
style="display:inline;mix-blend-mode:normal"
|
||||
id="g9"
|
||||
transform="matrix(0.10423883,0,0,0.10892242,19.519126,22.252121)">
|
||||
<g
|
||||
transform="scale(5.33333)"
|
||||
id="g8">
|
||||
<path
|
||||
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||
fill="#b41530"
|
||||
id="path2-3" />
|
||||
<path
|
||||
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||
fill="url(#color-1)"
|
||||
id="path3-5"
|
||||
style="fill:url(#color-1)" />
|
||||
<path
|
||||
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path4-6" />
|
||||
<path
|
||||
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path5" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle5-2" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle6-9" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle7-1" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle8" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.4 KiB |
@@ -0,0 +1,336 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 48 48"
|
||||
width="240px"
|
||||
height="240px"
|
||||
version="1.1"
|
||||
id="svg320"
|
||||
sodipodi:docname="icons8-software-container.svg"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs324">
|
||||
<linearGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmng"
|
||||
x1="12.496"
|
||||
x2="15.03"
|
||||
y1="26.719999"
|
||||
y2="21.954"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#737b80"
|
||||
id="stop449" />
|
||||
<stop
|
||||
offset=".473"
|
||||
stop-color="#686f74"
|
||||
id="stop451" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#575c61"
|
||||
id="stop453" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmnf"
|
||||
x1="32.495998"
|
||||
x2="35.028999"
|
||||
y1="26.719999"
|
||||
y2="21.954"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#737b80"
|
||||
id="stop440" />
|
||||
<stop
|
||||
offset=".473"
|
||||
stop-color="#686f74"
|
||||
id="stop442" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#575c61"
|
||||
id="stop444" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmne"
|
||||
x1="22.496"
|
||||
x2="25.028999"
|
||||
y1="26.719999"
|
||||
y2="21.954"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#737b80"
|
||||
id="stop431" />
|
||||
<stop
|
||||
offset=".473"
|
||||
stop-color="#686f74"
|
||||
id="stop433" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#575c61"
|
||||
id="stop435" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmnd"
|
||||
cx="14"
|
||||
cy="23.889999"
|
||||
r="4"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset=".696"
|
||||
stop-opacity=".2"
|
||||
id="stop424" />
|
||||
<stop
|
||||
offset=".959"
|
||||
stop-opacity="0"
|
||||
id="stop426" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmnc"
|
||||
cx="24"
|
||||
cy="23.889999"
|
||||
r="4"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset=".696"
|
||||
stop-opacity=".2"
|
||||
id="stop417" />
|
||||
<stop
|
||||
offset=".959"
|
||||
stop-opacity="0"
|
||||
id="stop419" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmnb"
|
||||
cx="34"
|
||||
cy="23.889999"
|
||||
r="4"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset=".696"
|
||||
stop-opacity=".2"
|
||||
id="stop410" />
|
||||
<stop
|
||||
offset=".959"
|
||||
stop-opacity="0"
|
||||
id="stop412" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="M0KIpv9F9DO9XPHmZgcmna"
|
||||
x1="10.302"
|
||||
x2="32.533001"
|
||||
y1="49.653"
|
||||
y2="7.8410001"
|
||||
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#fcfcfc"
|
||||
id="stop403" />
|
||||
<stop
|
||||
offset=".95"
|
||||
stop-color="#c3c9cd"
|
||||
id="stop405" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="24"
|
||||
y1="4.4889998"
|
||||
x2="24"
|
||||
y2="45.143002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="color-1">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#f44f5a"
|
||||
id="stop1-7" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#e52030"
|
||||
id="stop2-5" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview322"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.4208334"
|
||||
inkscape:cx="-122.81525"
|
||||
inkscape:cy="44.340175"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1360"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg320"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<linearGradient
|
||||
id="SVGID_1_"
|
||||
x1="23.855"
|
||||
x2="23.983"
|
||||
y1="4.908"
|
||||
y2="17.227"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.83754239,0,0,0.83754239,1.9089261,1.7931334)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#7dd8f3"
|
||||
id="stop291" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#45b0d0"
|
||||
id="stop293" />
|
||||
</linearGradient>
|
||||
<circle
|
||||
cx="22.009941"
|
||||
cy="17.622683"
|
||||
r="12.563135"
|
||||
fill="url(#SVGID_1_)"
|
||||
id="circle296"
|
||||
style="fill:url(#SVGID_1_);stroke-width:0.837541" />
|
||||
<linearGradient
|
||||
id="SVGID_2_"
|
||||
x1="18.175"
|
||||
x2="29.825"
|
||||
y1="19.021"
|
||||
y2="19.021"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.83754239,0,0,0.83754239,1.9089261,1.7931334)">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#3079d6"
|
||||
id="stop298" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#297cd2"
|
||||
id="stop300" />
|
||||
</linearGradient>
|
||||
<circle
|
||||
cx="22.009941"
|
||||
cy="17.706436"
|
||||
r="4.8577456"
|
||||
fill="url(#SVGID_2_)"
|
||||
id="circle303"
|
||||
style="fill:url(#SVGID_2_);stroke-width:0.837541" />
|
||||
<circle
|
||||
cx="22.009941"
|
||||
cy="17.706436"
|
||||
r="1.9263473"
|
||||
fill="#ffffff"
|
||||
id="circle305"
|
||||
style="stroke-width:0.837541" />
|
||||
<path
|
||||
d="m 9.4468073,17.622683 c 0,6.951602 5.6115347,12.563137 12.5631357,12.563137 6.951601,0 12.563135,-5.611535 12.563135,-12.563137 0,-0.251262 0,-0.502525 0,-0.753787 H 9.4468073 c 0,0.251262 0,0.502525 0,0.753787 z"
|
||||
opacity="0.05"
|
||||
id="path307"
|
||||
style="stroke-width:0.837541" />
|
||||
<path
|
||||
d="m 9.4468073,17.622683 c 0,6.951602 5.6115347,12.563137 12.5631357,12.563137 6.951601,0 12.563135,-5.611535 12.563135,-12.563137 0,-0.08376 0,-0.167507 0,-0.335016 H 9.4468073 c 0,0.08376 0,0.167509 0,0.335016 z"
|
||||
opacity="0.07"
|
||||
id="path309"
|
||||
style="stroke-width:0.837541" />
|
||||
<linearGradient
|
||||
id="SVGID_3_"
|
||||
x1="16.786"
|
||||
x2="30.174"
|
||||
y1="-440.286"
|
||||
y2="-472.232"
|
||||
gradientTransform="matrix(0.83754239,0,0,-0.83754239,1.9089261,-354.99993)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#eba84b"
|
||||
id="stop311" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#d97218"
|
||||
id="stop313" />
|
||||
</linearGradient>
|
||||
<path
|
||||
fill="url(#SVGID_3_)"
|
||||
d="M 36.248163,38.644997 H 7.7717222 c -0.5025255,0 -0.8375424,-0.418771 -0.8375424,-0.837543 V 18.543981 c 0,-0.502525 0.3350169,-0.837544 0.8375424,-0.837544 H 36.248163 c 0.502526,0 0.837542,0.335019 0.837542,0.837544 v 19.263473 c 0,0.418772 -0.418771,0.837543 -0.837542,0.837543 z"
|
||||
id="path316"
|
||||
style="fill:url(#SVGID_3_);stroke-width:0.837541" />
|
||||
<path
|
||||
fill="#633412"
|
||||
d="m 18.659773,21.056608 h 6.700339 c 0.502526,0 0.837542,0.335017 0.837542,0.837542 v 0 c 0,0.502525 -0.335016,0.837542 -0.837542,0.837542 h -6.700339 c -0.502525,0 -0.837541,-0.335017 -0.837541,-0.837542 v 0 c 0,-0.502525 0.335016,-0.837542 0.837541,-0.837542 z"
|
||||
id="path318"
|
||||
style="stroke-width:0.837541" />
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="nonzero"
|
||||
stroke="none"
|
||||
stroke-width="1"
|
||||
stroke-linecap="butt"
|
||||
stroke-linejoin="miter"
|
||||
stroke-miterlimit="10"
|
||||
stroke-dasharray="none"
|
||||
stroke-dashoffset="0"
|
||||
font-family="none"
|
||||
font-weight="none"
|
||||
font-size="none"
|
||||
text-anchor="none"
|
||||
style="display:inline;mix-blend-mode:normal"
|
||||
id="g9"
|
||||
transform="matrix(0.10423883,0,0,0.10892242,19.968987,23.126292)">
|
||||
<g
|
||||
transform="scale(5.33333)"
|
||||
id="g8">
|
||||
<path
|
||||
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||
fill="#b41530"
|
||||
id="path2-3" />
|
||||
<path
|
||||
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||
fill="url(#color-1)"
|
||||
id="path3-5"
|
||||
style="fill:url(#color-1)" />
|
||||
<path
|
||||
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path4-6" />
|
||||
<path
|
||||
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||
fill="#a3102a"
|
||||
id="path5" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle5-2" />
|
||||
<circle
|
||||
cx="45"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle6-9" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="12"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle7-1" />
|
||||
<circle
|
||||
cx="3"
|
||||
cy="36"
|
||||
r="1"
|
||||
fill="#a3102a"
|
||||
id="circle8" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.7 KiB |
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
//
|
||||
// iTop module definition file
|
||||
//
|
||||
|
||||
SetupWebPage::AddModule(
|
||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||
'itop-container-mgmt/3.3.0',
|
||||
[
|
||||
// Identification
|
||||
//
|
||||
'label' => 'Container management',
|
||||
'category' => 'business',
|
||||
|
||||
// Setup
|
||||
//
|
||||
'dependencies' => [
|
||||
'itop-virtualization-mgmt/3.3.0',
|
||||
],
|
||||
'mandatory' => false,
|
||||
'visible' => true,
|
||||
|
||||
// Components
|
||||
//
|
||||
'datamodel' => [
|
||||
|
||||
],
|
||||
'webservice' => [
|
||||
|
||||
],
|
||||
'data.struct' => [
|
||||
// add your 'structure' definition XML files here,
|
||||
'data/en_us.data.itop-container-type.xml',
|
||||
'data/en_us.data.itop-container-image-type.xml',
|
||||
],
|
||||
'data.sample' => [
|
||||
// add your sample data XML files here,
|
||||
],
|
||||
|
||||
// Documentation
|
||||
//
|
||||
'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any
|
||||
'doc.more_information' => '', // hyperlink to more information, if any
|
||||
|
||||
// Default settings
|
||||
//
|
||||
'settings' => [
|
||||
// Module specific settings go here, if any
|
||||
],
|
||||
]
|
||||
);
|
||||
@@ -18,7 +18,7 @@ class HubNewsroomProvider extends NewsroomProviderBase
|
||||
* {@inheritDoc}
|
||||
* @see NewsroomProviderBase::IsApplicable()
|
||||
*/
|
||||
public function IsApplicable(User $oUser = null)
|
||||
public function IsApplicable(?User $oUser = null)
|
||||
{
|
||||
if ($oUser !== null) {
|
||||
return UserRights::IsAdministrator($oUser);
|
||||
|
||||
@@ -21,11 +21,11 @@ Dict::Add('FR FR', 'French', 'Français', [
|
||||
'Menu:SearchIncidents+' => 'Rechercher parmi les tickets d\'incidents',
|
||||
'Menu:Incident:Shortcuts' => 'Raccourcis',
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:Incident:MyIncidents' => 'Mes incidents',
|
||||
'Menu:Incident:MyIncidents' => 'Incident qui me sont assignés',
|
||||
'Menu:Incident:MyIncidents+' => 'Tickets d\'incident qui me sont assignés',
|
||||
'Menu:Incident:EscalatedIncidents' => 'Incidents en cours d\'escalade',
|
||||
'Menu:Incident:EscalatedIncidents' => 'Incidents en escalade',
|
||||
'Menu:Incident:EscalatedIncidents+' => 'Ticket d\'incident en cours d\'escalade',
|
||||
'Menu:Incident:OpenIncidents' => 'Incidents ouverts',
|
||||
'Menu:Incident:OpenIncidents' => 'Incidents en cours',
|
||||
'Menu:Incident:OpenIncidents+' => 'Tous les tickets d\'incident ouverts',
|
||||
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => 'Incidents des 14 derniers jours par priorité',
|
||||
'UI-IncidentManagementOverview-Last-14-days' => 'Incidents des 14 derniers jours',
|
||||
|
||||
@@ -10,8 +10,6 @@ $ipb-progress--bar--border-radius: $ipb-progress--border-radius !default;
|
||||
}
|
||||
|
||||
.ipb-progress--bar, .progress-bar {
|
||||
background-color: $ipb-color-primary-600;
|
||||
color: #ffffff;
|
||||
line-height: $ipb-progress--bar--line-height;
|
||||
border-radius: $ipb-progress--bar--border-radius;
|
||||
|
||||
|
||||
@@ -9,6 +9,6 @@ $ipb-progress--bar--color: $ipb-color-white-100 !default;
|
||||
}
|
||||
|
||||
.ipb-progress--bar, .progress-bar {
|
||||
background-color: $ipb-color-primary-700;
|
||||
background-color: $ipb-progress--bar--background-color;
|
||||
color: $ipb-progress--bar--color;
|
||||
}
|
||||
@@ -27,7 +27,7 @@ class PortalCollector extends AbstractDataCollector
|
||||
}
|
||||
|
||||
/** @inheritdoc */
|
||||
public function collect(Request $request, Response $response, Throwable $exception = null): void
|
||||
public function collect(Request $request, Response $response, ?Throwable $exception = null): void
|
||||
{
|
||||
$oRegister = $this->oTemplatesProviderService->GetRegister();
|
||||
$aTemplatesDefinitions = $oRegister->GetTemplatesDefinitions();
|
||||
|
||||
@@ -129,7 +129,7 @@ class ObjectFormHandlerHelper
|
||||
* @throws \OQLException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function HandleForm(Request $oRequest, $sMode, $sObjectClass, $sObjectId = null, array $aFormProperties = null)
|
||||
public function HandleForm(Request $oRequest, $sMode, $sObjectClass, $sObjectId = null, ?array $aFormProperties = null)
|
||||
{
|
||||
$aFormData = [];
|
||||
$sOperation = $this->oRequestManipulator->ReadParam('operation', '');
|
||||
|
||||
@@ -40,7 +40,7 @@ class AppVariable implements ArrayAccess
|
||||
/** @var DecoratedAppVariable */
|
||||
private $decorated;
|
||||
|
||||
public function __construct(DecoratedAppVariable $decorated, ContainerInterface $container = null)
|
||||
public function __construct(DecoratedAppVariable $decorated, ?ContainerInterface $container = null)
|
||||
{
|
||||
$this->decorated = $decorated;
|
||||
$this->container = $container;
|
||||
|
||||
@@ -57,7 +57,7 @@ class TemplatesTwigExtension extends AbstractExtension
|
||||
* @return string the template path
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
public function GetTemplate(string $sId, string $sProviderClass = self::DEFAULT_PROVIDER_CLASS, object $oProviderInstance = null): string
|
||||
public function GetTemplate(string $sId, string $sProviderClass = self::DEFAULT_PROVIDER_CLASS, ?object $oProviderInstance = null): string
|
||||
{
|
||||
if ($oProviderInstance === null) {
|
||||
return $this->oTemplatesService->GetTemplatePath($sProviderClass, $sId);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</div>
|
||||
|
||||
<div id="export-feedback" class="ipb-export--feedback">
|
||||
<p id="export-excel-warning" class="ipb-alert alert alert-warning" role="alert">{{ 'UI:Bulk:Export:MaliciousInjection:Alert:Message'|dict_format(sWikiUrl)|raw }}</p>
|
||||
<p id="export-excel-warning" class="ipb-alert alert alert-warning" role="alert">{{ 'UI:Bulk:Export:MaliciousInjection:Sanitization:Alert:Message'|dict_format(sWikiUrl)|raw }}</p>
|
||||
<div class="ipb-export--illustration ipb-svg-illustration--container">
|
||||
{{ source('illustrations/undraw_export-files.svg') }}
|
||||
</div>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user