diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d346745b2..58439dd8f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,11 +27,14 @@ If you have an idea you're sure would benefit to all of iTop users, you may [create a corresponding ticket](https://sourceforge.net/p/itop/tickets/new/) to submit it, but be warned that there are lots of good reasons to refuse such changes. -### šŸ“„ License +### šŸ“„ License and copyright iTop is distributed under the AGPL-3.0 license (see the [license.txt] file), your code must comply with this license. -If you want to use another license, you may [create an extension][wiki new ext]. +Combodo has the copyright on each and every source file in the iTop repository: please do not modify the existing file copyrights. +Anyhow, you are encouraged to signal your contribution by the mean of `@author` annotations. + +If you want to use another license or keep the code ownership (copyright), you may [create an extension][wiki new ext]. [license.txt]: https://github.com/Combodo/iTop/blob/develop/license.txt [wiki new ext]: https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Astart#by_writing_your_own_extension @@ -141,9 +144,9 @@ Detailed procedure to work on fork and create PR is available [in GitHub help pa ### šŸ™ We are thankful -We are thankful for all your contributions to the iTop universe! As a thank you gift, we will send stickers to every iTop (& extensions) contributors! +We are thankful for all your contributions to the iTop universe! As a thank you gift, we will send stickers to every iTop (& extensions) contributors! -Stickers' design might change from one year to another. For the first year we wanted to try a "craft beer label" look, see examples below: +We have one sticker per contribution type. You might get multiple stickers with one contribution though :) * Bug hunter: Fix a bug * Translator: Add/update translations @@ -155,4 +158,6 @@ Stickers' design might change from one year to another. For the first year we wa * Beta tester: Test and give feedback on beta releases * Extension developer: Develop and publish an extension -![](.doc/contributing-guide/contributing-stickers-side-by-side.png) +Here is the design of each stickers for year 2022: + +![iTop stickers 2022](.doc/contributing-guide/contributing-stickers-side-by-side.png) diff --git a/addons/userrights/userrightsmatrix.class.inc.php b/addons/userrights/userrightsmatrix.class.inc.php index d80af3ed0..da64e17df 100644 --- a/addons/userrights/userrightsmatrix.class.inc.php +++ b/addons/userrights/userrightsmatrix.class.inc.php @@ -121,7 +121,6 @@ class UserRightsMatrix extends UserRightsAddOnAPI public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US') { // Maybe we should check that no other user with userid == 0 exists - CMDBObject::SetTrackInfo('Initialization'); $oUser = new UserLocal(); $oUser->Set('login', $sAdminUser); $oUser->Set('password', $sAdminPwd); diff --git a/addons/userrights/userrightsprofile.class.inc.php b/addons/userrights/userrightsprofile.class.inc.php index f91149843..c6b1ca722 100644 --- a/addons/userrights/userrightsprofile.class.inc.php +++ b/addons/userrights/userrightsprofile.class.inc.php @@ -435,20 +435,18 @@ class UserRightsProfile extends UserRightsAddOnAPI // Installation: create the very first user public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US') { - CMDBObject::SetTrackInfo('Initialization'); + CMDBObject::SetCurrentChangeFromParams('Initialization create administrator'); $iContactId = 0; // Support drastic data model changes: no organization class (or not writable)! - if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization')) - { + if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization')) { $oOrg = MetaModel::NewObject('Organization'); $oOrg->Set('name', 'My Company/Department'); $oOrg->Set('code', 'SOMECODE'); $iOrgId = $oOrg->DBInsertNoReload(); // Support drastic data model changes: no Person class (or not writable)! - if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person')) - { + if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person')) { $oContact = MetaModel::NewObject('Person'); $oContact->Set('name', 'My last name'); $oContact->Set('first_name', 'My first name'); diff --git a/addons/userrights/userrightsprofile.db.class.inc.php b/addons/userrights/userrightsprofile.db.class.inc.php index ac5b2277b..44b40ab30 100644 --- a/addons/userrights/userrightsprofile.db.class.inc.php +++ b/addons/userrights/userrightsprofile.db.class.inc.php @@ -508,24 +508,18 @@ class UserRightsProfile extends UserRightsAddOnAPI public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US') { // Create a change to record the history of the User object - /** @var \CMDBChange $oChange */ - $oChange = MetaModel::NewObject("CMDBChange"); - $oChange->Set("date", time()); - $oChange->Set("userinfo", "Initialization"); + CMDBObject::SetCurrentChangeFromParams('Initialization : create first user admin profile'); $iContactId = 0; // Support drastic data model changes: no organization class (or not writable)! - if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization')) - { + if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization')) { $oOrg = MetaModel::NewObject('Organization'); $oOrg->Set('name', 'My Company/Department'); $oOrg->Set('code', 'SOMECODE'); - $oOrg::SetCurrentChange($oChange); $iOrgId = $oOrg->DBInsertNoReload(); // Support drastic data model changes: no Person class (or not writable)! - if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person')) - { + if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person')) { $oContact = MetaModel::NewObject('Person'); $oContact->Set('name', 'My last name'); $oContact->Set('first_name', 'My first name'); @@ -534,7 +528,6 @@ class UserRightsProfile extends UserRightsAddOnAPI $oContact->Set('org_id', $iOrgId); } $oContact->Set('email', 'my.email@foo.org'); - $oContact::SetCurrentChange($oChange); $iContactId = $oContact->DBInsertNoReload(); } } @@ -543,24 +536,22 @@ class UserRightsProfile extends UserRightsAddOnAPI $oUser = new UserLocal(); $oUser->Set('login', $sAdminUser); $oUser->Set('password', $sAdminPwd); - if (MetaModel::IsValidAttCode('UserLocal', 'contactid') && ($iContactId != 0)) - { + if (MetaModel::IsValidAttCode('UserLocal', 'contactid') && ($iContactId != 0)) { $oUser->Set('contactid', $iContactId); } $oUser->Set('language', $sLanguage); // Language was chosen during the installation // Add this user to the very specific 'admin' profile $oAdminProfile = MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", array('name' => ADMIN_PROFILE_NAME), true /*all data*/); - if (is_object($oAdminProfile)) - { + if (is_object($oAdminProfile)) { $oUserProfile = new URP_UserProfile(); $oUserProfile->Set('profileid', $oAdminProfile->GetKey()); $oUserProfile->Set('reason', 'By definition, the administrator must have the administrator profile'); $oSet = DBObjectSet::FromObject($oUserProfile); $oUser->Set('profile_list', $oSet); } - $oUser::SetCurrentChange($oChange); - $iUserId = $oUser->DBInsertNoReload(); + $oUser->DBInsertNoReload(); + return true; } diff --git a/addons/userrights/userrightsprojection.class.inc.php b/addons/userrights/userrightsprojection.class.inc.php index 61fb07fe6..6aa5eefc0 100644 --- a/addons/userrights/userrightsprojection.class.inc.php +++ b/addons/userrights/userrightsprojection.class.inc.php @@ -568,14 +568,11 @@ class UserRightsProjection extends UserRightsAddOnAPI public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US') { // Create a change to record the history of the User object - $oChange = MetaModel::NewObject("CMDBChange"); - $oChange->Set("date", time()); - $oChange->Set("userinfo", "Initialization"); + CMDBObject::SetCurrentChangeFromParams('Initialization : create first user admin'); $oOrg = new Organization(); $oOrg->Set('name', 'My Company/Department'); $oOrg->Set('code', 'SOMECODE'); - $oOrg::SetCurrentChange($oChange); $iOrgId = $oOrg->DBInsertNoReload(); $oContact = new Person(); @@ -584,7 +581,6 @@ class UserRightsProjection extends UserRightsAddOnAPI //$oContact->Set('status', 'available'); $oContact->Set('org_id', $iOrgId); $oContact->Set('email', 'my.email@foo.org'); - $oContact::SetCurrentChange($oChange); $iContactId = $oContact->DBInsertNoReload(); $oUser = new UserLocal(); @@ -592,7 +588,6 @@ class UserRightsProjection extends UserRightsAddOnAPI $oUser->Set('password', $sAdminPwd); $oUser->Set('contactid', $iContactId); $oUser->Set('language', $sLanguage); // Language was chosen during the installation - $oUser::SetCurrentChange($oChange); $iUserId = $oUser->DBInsertNoReload(); // Add this user to the very specific 'admin' profile @@ -600,7 +595,6 @@ class UserRightsProjection extends UserRightsAddOnAPI $oUserProfile->Set('userid', $iUserId); $oUserProfile->Set('profileid', ADMIN_PROFILE_ID); $oUserProfile->Set('reason', 'By definition, the administrator must have the administrator profile'); - $oUserProfile::SetCurrentChange($oChange); $oUserProfile->DBInsertNoReload(); return true; } diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 1bd3c3269..4bd293a0a 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -342,13 +342,17 @@ JS } /** - * Important: For compatibility reasons, this function still allows to manipulate the $oPage. In that case, markup will be put above the real header of the panel. - * To insert something IN the panel, we now need to add UIBlocks in either the "subtitle" or "toolbar" sections of the array that will be returned. + * @param \WebPage $oPage warning, since 3.0.0 this parameter was kept for compatibility reason. You shouldn't write directly on the page ! + * When writing to the page, markup will be put above the real header of the panel. + * To insert something IN the panel, we now need to add UIBlocks in either the "subtitle" or "toolbar" sections of the array that will be returned. + * @param bool $bEditMode Deprecated parameter in iTop 3.0.0, use {@see GetDisplayMode()} and ENUM_DISPLAY_MODE_* constants instead * - * @param \WebPage $oPage - * @param bool $bEditMode Note that this parameter is no longer used in this method. Use {@see static::$sDisplayMode} instead - * - * @return array UIBlocks to be inserted in the "subtitle" and the "toolbar" sections of the ObjectDetails block. eg. ['subtitle' => [, ], 'toolbar' => []] + * @return array{ + * subtitle: \Combodo\iTop\Application\UI\Base\UIBlock[], + * toolbar: \Combodo\iTop\Application\UI\Base\UIBlock[] + * } + * blocks to be inserted in the "subtitle" and the "toolbar" sections of the ObjectDetails block. + * eg. ['subtitle' => [, ], 'toolbar' => []] * * @throws \ApplicationException * @throws \ArchivedObjectException @@ -357,7 +361,10 @@ JS * @throws \MySQLException * @throws \OQLException * - * @since 3.0.0 $bEditMode is deprecated and no longer used + * @since 3.0.0 $bEditMode is deprecated, see param documentation above + * @since 3.0.0 changed signature : method must return header content in an array (no more writing directly to the $oPage) + * + * @noinspection PhpUnusedParameterInspection */ public function DisplayBareHeader(WebPage $oPage, $bEditMode = false) { diff --git a/application/logintwig.class.inc.php b/application/logintwig.class.inc.php index b800e2e80..b7d411b1d 100644 --- a/application/logintwig.class.inc.php +++ b/application/logintwig.class.inc.php @@ -9,6 +9,9 @@ use Combodo\iTop\Application\Branding; use Combodo\iTop\Application\TwigBase\Twig\Extension; +use Twig\Environment; +use Twig\Loader\ChainLoader; +use Twig\Loader\FilesystemLoader; /** * Twig context for modules extending the login screen @@ -217,14 +220,14 @@ class LoginTwigRenderer $sTwigLoaderPath = $oLoginContext->GetTwigLoaderPath(); if ($sTwigLoaderPath != null) { - $oExtensionLoader = new Twig_Loader_Filesystem(); + $oExtensionLoader = new FilesystemLoader(); $oExtensionLoader->setPaths($sTwigLoaderPath); $aTwigLoaders[] = $oExtensionLoader; } $this->aPostedVars = array_merge($this->aPostedVars, $oLoginContext->GetPostedVars()); } - $oCoreLoader = new Twig_Loader_Filesystem(array(), APPROOT.'templates'); + $oCoreLoader = new FilesystemLoader(array(), APPROOT.'templates'); $aCoreTemplatesPaths = array('pages/login', 'pages/login/password'); // Having this path declared after the plugins let the plugins replace the core templates $oCoreLoader->setPaths($aCoreTemplatesPaths); @@ -232,8 +235,8 @@ class LoginTwigRenderer $oCoreLoader->setPaths($aCoreTemplatesPaths, 'ItopCore'); $aTwigLoaders[] = $oCoreLoader; - $oLoader = new Twig_Loader_Chain($aTwigLoaders); - $this->oTwig = new Twig_Environment($oLoader); + $oLoader = new ChainLoader($aTwigLoaders); + $this->oTwig = new Environment($oLoader); Extension::RegisterTwigExtensions($this->oTwig); } @@ -306,7 +309,7 @@ class LoginTwigRenderer } /** - * @return \Twig_Environment + * @return \Twig\Environment */ public function GetTwig() { diff --git a/application/twigextension.class.inc.php b/application/twigextension.class.inc.php index d0a92aab4..5234eb96a 100644 --- a/application/twigextension.class.inc.php +++ b/application/twigextension.class.inc.php @@ -8,9 +8,9 @@ use DeprecatedCallsLog; use Dict; use Exception; use MetaModel; -use Twig_Environment; -use Twig_SimpleFilter; -use Twig_SimpleFunction; +use Twig\Environment; +use Twig\TwigFilter; +use Twig\TwigFunction; use utils; DeprecatedCallsLog::NotifyDeprecatedFile('instead use sources/Application/TwigBase/Twig/Extension.php, which is loaded by the autoloader'); @@ -28,13 +28,13 @@ class TwigExtension * Registers Twig extensions such as filters or functions. * It allows us to access some stuff directly in twig. * - * @param \Twig_Environment $oTwigEnv + * @param Environment $oTwigEnv */ - public static function RegisterTwigExtensions(Twig_Environment &$oTwigEnv) + public static function RegisterTwigExtensions(Environment &$oTwigEnv) { // Filter to translate a string via the Dict::S function // Usage in twig: {{ 'String:ToTranslate'|dict_s }} - $oTwigEnv->addFilter(new Twig_SimpleFilter('dict_s', + $oTwigEnv->addFilter(new TwigFilter('dict_s', function ($sStringCode, $sDefault = null, $bUserLanguageOnly = false) { return Dict::S($sStringCode, $sDefault, $bUserLanguageOnly); }) @@ -42,7 +42,7 @@ class TwigExtension // Filter to format a string via the Dict::Format function // Usage in twig: {{ 'String:ToTranslate'|dict_format() }} - $oTwigEnv->addFilter(new Twig_SimpleFilter('dict_format', + $oTwigEnv->addFilter(new TwigFilter('dict_format', function ($sStringCode, $sParam01 = null, $sParam02 = null, $sParam03 = null, $sParam04 = null) { return Dict::Format($sStringCode, $sParam01, $sParam02, $sParam03, $sParam04); }) @@ -51,16 +51,13 @@ class TwigExtension // Filter to format output // example a DateTime is converted to user format // Usage in twig: {{ 'String:ToFormat'|output_format }} - $oTwigEnv->addFilter(new Twig_SimpleFilter('date_format', + $oTwigEnv->addFilter(new TwigFilter('date_format', function ($sDate) { - try - { - if (preg_match('@^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$@', trim($sDate))) - { + try { + if (preg_match('@^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$@', trim($sDate))) { return AttributeDateTime::GetFormat()->Format($sDate); } - if (preg_match('@^\d\d\d\d-\d\d-\d\d$@', trim($sDate))) - { + if (preg_match('@^\d\d\d\d-\d\d-\d\d$@', trim($sDate))) { return AttributeDate::GetFormat()->Format($sDate); } } @@ -75,7 +72,7 @@ class TwigExtension // Filter to format output // example a DateTime is converted to user format // Usage in twig: {{ 'String:ToFormat'|output_format }} - $oTwigEnv->addFilter(new Twig_SimpleFilter('size_format', + $oTwigEnv->addFilter(new TwigFilter('size_format', function ($sSize) { return utils::BytesToFriendlyFormat($sSize); }) @@ -83,24 +80,25 @@ class TwigExtension // Filter to enable base64 encode/decode // Usage in twig: {{ 'String to encode'|base64_encode }} - $oTwigEnv->addFilter(new Twig_SimpleFilter('base64_encode', 'base64_encode')); - $oTwigEnv->addFilter(new Twig_SimpleFilter('base64_decode', 'base64_decode')); + $oTwigEnv->addFilter(new TwigFilter('base64_encode', 'base64_encode')); + $oTwigEnv->addFilter(new TwigFilter('base64_decode', 'base64_decode')); // Filter to enable json decode (encode already exists) // Usage in twig: {{ aSomeArray|json_decode }} - $oTwigEnv->addFilter(new Twig_SimpleFilter('json_decode', function ($sJsonString, $bAssoc = false) { + $oTwigEnv->addFilter(new TwigFilter('json_decode', function ($sJsonString, $bAssoc = false) { return json_decode($sJsonString, $bAssoc); }) ); // Filter to add itopversion to an url - $oTwigEnv->addFilter(new Twig_SimpleFilter('add_itop_version', function ($sUrl) { + $oTwigEnv->addFilter(new TwigFilter('add_itop_version', function ($sUrl) { $sUrl = utils::AddParameterToUrl($sUrl, 'itopversion', ITOP_VERSION); + return $sUrl; })); // Filter to add a module's version to an url - $oTwigEnv->addFilter(new Twig_SimpleFilter('add_module_version', function ($sUrl, $sModuleName) { + $oTwigEnv->addFilter(new TwigFilter('add_module_version', function ($sUrl, $sModuleName) { $sModuleVersion = utils::GetCompiledModuleVersion($sModuleName); $sUrl = utils::AddParameterToUrl($sUrl, 'moduleversion', $sModuleVersion); @@ -109,38 +107,36 @@ class TwigExtension // Function to check our current environment // Usage in twig: {% if is_development_environment() %} - $oTwigEnv->addFunction(new Twig_SimpleFunction('is_development_environment', function() - { + $oTwigEnv->addFunction(new TwigFunction('is_development_environment', function () { return utils::IsDevelopmentEnvironment(); })); // Function to get configuration parameter // Usage in twig: {{ get_config_parameter('foo') }} - $oTwigEnv->addFunction(new Twig_SimpleFunction('get_config_parameter', function($sParamName) - { + $oTwigEnv->addFunction(new TwigFunction('get_config_parameter', function ($sParamName) { $oConfig = MetaModel::GetConfig(); + return $oConfig->Get($sParamName); })); // Function to get a module setting // Usage in twig: {{ get_module_setting(, [, ]) }} // since 3.0.0, but see N°4034 for upcoming evolutions in the 3.1 - $oTwigEnv->addFunction(new Twig_SimpleFunction('get_module_setting', function (string $sModuleCode, string $sPropertyCode, $defaultValue = null) { + $oTwigEnv->addFunction(new TwigFunction('get_module_setting', function (string $sModuleCode, string $sPropertyCode, $defaultValue = null) { $oConfig = MetaModel::GetConfig(); + return $oConfig->GetModuleSetting($sModuleCode, $sPropertyCode, $defaultValue); })); // Function to get the URL of a static page in a module // Usage in twig: {{ get_static_page_module_url('itop-my-module', 'path-to-my-page') }} - $oTwigEnv->addFunction(new Twig_SimpleFunction('get_static_page_module_url', function($sModuleName, $sPage) - { + $oTwigEnv->addFunction(new TwigFunction('get_static_page_module_url', function ($sModuleName, $sPage) { return utils::GetAbsoluteUrlModulesRoot().$sModuleName.'/'.$sPage; })); // Function to get the URL of a php page in a module // Usage in twig: {{ get_page_module_url('itop-my-module', 'path-to-my-my-page.php') }} - $oTwigEnv->addFunction(new Twig_SimpleFunction('get_page_module_url', function($sModuleName, $sPage) - { + $oTwigEnv->addFunction(new TwigFunction('get_page_module_url', function ($sModuleName, $sPage) { return utils::GetAbsoluteUrlModulePage($sModuleName, $sPage); })); } diff --git a/application/utils.inc.php b/application/utils.inc.php index f9f00c199..09f60bb13 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -21,6 +21,8 @@ use Combodo\iTop\Application\Helper\Session; use Combodo\iTop\Application\UI\Base\iUIBlock; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use ScssPhp\ScssPhp\Compiler; +use ScssPhp\ScssPhp\OutputStyle; +use ScssPhp\ScssPhp\ValueConverter; /** @@ -1940,20 +1942,25 @@ class utils */ public static function CompileCSSFromSASS($sSassContent, $aImportPaths = array(), $aVariables = array()) { - $oSass = new Compiler(); - $oSass->setFormatter('ScssPhp\\ScssPhp\\Formatter\\Compressed'); + $oSass = new Compiler();//['checkImportResolutions'=>true]); + $oSass->setOutputStyle(OutputStyle::COMPRESSED); // Setting our variables - $oSass->setVariables($aVariables); + $aCssVariable = []; + foreach ($aVariables as $entry=>$value) { + $aCssVariable[$entry] = ValueConverter::parseValue($value); + } + $oSass->addVariables($aCssVariable); // Setting our imports paths $oSass->setImportPaths($aImportPaths); // Temporary disabling max exec time while compiling $iCurrentMaxExecTime = (int) ini_get('max_execution_time'); set_time_limit(0); // Compiling SASS - $sCss = $oSass->compile($sSassContent); + //checkImportResolutions + $sCss = $oSass->compileString($sSassContent); set_time_limit(intval($iCurrentMaxExecTime)); - return $sCss; + return $sCss->getCss(); } /** diff --git a/composer.json b/composer.json index b705f215d..6fb9e827e 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "type": "project", "license": "AGPLv3", "require": { - "php": ">=7.1.3 <8.0.0", + "php": ">=7.2.5 <8.0.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -11,25 +11,24 @@ "ext-mysqli": "*", "ext-soap": "*", "combodo/tcpdf": "~6.4.4", - "guzzlehttp/guzzle": "^6.5", + "guzzlehttp/guzzle": "^6.5.8", "laminas/laminas-mail": "^2.11", "laminas/laminas-servicemanager": "^3.5", "league/oauth2-google": "^3.0", "nikic/php-parser": "~4.13.2", "pear/archive_tar": "~1.4.14", "pelago/emogrifier": "~3.1.0", - "scssphp/scssphp": "1.0.6", - "symfony/console": "~3.4.47", - "symfony/dotenv": "~3.4.47", - "symfony/framework-bundle": "~3.4.47", - "symfony/twig-bundle": "~3.4.47", - "symfony/yaml": "~3.4.47", - "thenetworg/oauth2-azure": "^2.0", - "twig/twig": "~1.42.5" + "scssphp/scssphp": "^1.10.3", + "symfony/console": "5.4.*", + "symfony/dotenv": "5.4.*", + "symfony/framework-bundle": "5.4.*", + "symfony/twig-bundle": "5.4.*", + "symfony/yaml": "5.4.*", + "thenetworg/oauth2-azure": "^2.0" }, "require-dev": { - "symfony/stopwatch": "~3.4.47", - "symfony/web-profiler-bundle": "~3.4.47" + "symfony/stopwatch": "5.4.*", + "symfony/web-profiler-bundle": "5.4.*" }, "suggest": { "ext-libsodium": "Required to use the AttributeEncryptedString.", @@ -41,7 +40,7 @@ }, "config": { "platform": { - "php": "7.1.3" + "php": "7.2.5" }, "vendor-dir": "lib", "preferred-install": { diff --git a/composer.lock b/composer.lock index d62b45e1f..9132e4f7f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ec514b23be219595cb60a167c8da7f27", + "content-hash": "3438e44ef160404089e3bfa9719f11dd", "packages": [ { "name": "combodo/tcpdf", @@ -179,24 +179,24 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.6", + "version": "6.5.8", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f092dd734083473658de3ee4bef093ed77d2689c" + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f092dd734083473658de3ee4bef093ed77d2689c", - "reference": "f092dd734083473658de3ee4bef093ed77d2689c", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", + "guzzlehttp/psr7": "^1.9", "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" + "symfony/polyfill-intl-idn": "^1.17" }, "require-dev": { "ext-curl": "*", @@ -274,7 +274,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.6" + "source": "https://github.com/guzzle/guzzle/tree/6.5.8" }, "funding": [ { @@ -290,7 +290,7 @@ "type": "tidelift" } ], - "time": "2022-05-25T13:19:12+00:00" + "time": "2022-06-20T22:16:07+00:00" }, { "name": "guzzlehttp/promises", @@ -378,16 +378,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.5", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268" + "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/337e3ad8e5716c15f9657bd214d16cc5e69df268", - "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318", + "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318", "shasum": "" }, "require": { @@ -408,7 +408,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -468,7 +468,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.5" + "source": "https://github.com/guzzle/psr7/tree/1.9.0" }, "funding": [ { @@ -484,7 +484,7 @@ "type": "tidelift" } ], - "time": "2022-03-20T21:51:18+00:00" + "time": "2022-06-20T21:43:03+00:00" }, { "name": "laminas/laminas-loader", @@ -1157,33 +1157,29 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.18", + "version": "v9.99.100", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db" + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", - "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", "shasum": "" }, "require": { - "php": ">=5.2.0" + "php": ">= 7" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -1202,7 +1198,12 @@ "pseudorandom", "random" ], - "time": "2019-01-03T20:59:08+00:00" + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" }, { "name": "pear/archive_tar", @@ -1337,16 +1338,16 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.10", + "version": "v1.10.11", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "625a3c429d9b2c1546438679074cac1b089116a7" + "reference": "68d0d32ada737153b7e93b8d3c710ebe70ac867d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/625a3c429d9b2c1546438679074cac1b089116a7", - "reference": "625a3c429d9b2c1546438679074cac1b089116a7", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/68d0d32ada737153b7e93b8d3c710ebe70ac867d", + "reference": "68d0d32ada737153b7e93b8d3c710ebe70ac867d", "shasum": "" }, "require": { @@ -1381,7 +1382,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", "source": "https://github.com/pear/pear-core-minimal" }, - "time": "2019-11-19T19:00:24+00:00" + "time": "2021-08-10T22:31:03+00:00" }, { "name": "pear/pear_exception", @@ -1564,31 +1565,29 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -1601,7 +1600,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -1613,7 +1612,61 @@ "container-interop", "psr" ], - "time": "2017-02-14T16:28:37+00:00" + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/http-message", @@ -1670,16 +1723,16 @@ }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -1703,7 +1756,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -1713,55 +1766,10 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "time": "2017-10-23T01:57:42+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -1809,16 +1817,16 @@ }, { "name": "scssphp/scssphp", - "version": "1.0.6", + "version": "v1.10.3", "source": { "type": "git", "url": "https://github.com/scssphp/scssphp.git", - "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c" + "reference": "0f1e1516ed2412ad43e42a6a319e77624ba1f713" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scssphp/scssphp/zipball/5b3c9d704950d8f9637f5110c36c281ec47dc13c", - "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/0f1e1516ed2412ad43e42a6a319e77624ba1f713", + "reference": "0f1e1516ed2412ad43e42a6a319e77624ba1f713", "shasum": "" }, "require": { @@ -1827,11 +1835,20 @@ "php": ">=5.6.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3", - "squizlabs/php_codesniffer": "~2.5", - "twbs/bootstrap": "~4.3", + "bamarni/composer-bin-plugin": "^1.4", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^5.1", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "~5.0", + "twbs/bootstrap4": "4.6.1", "zurb/foundation": "~6.5" }, + "suggest": { + "ext-iconv": "Can be used as fallback when ext-mbstring is not available", + "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" + }, "bin": [ "bin/pscss" ], @@ -1868,43 +1885,58 @@ ], "support": { "issues": "https://github.com/scssphp/scssphp/issues", - "source": "https://github.com/scssphp/scssphp/tree/master" + "source": "https://github.com/scssphp/scssphp/tree/v1.10.3" }, - "time": "2019-12-12T05:00:52+00:00" + "time": "2022-05-16T07:22:18+00:00" }, { "name": "symfony/cache", - "version": "v3.4.47", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a7a14c4832760bd1fbd31be2859ffedc9b6ff813" + "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a7a14c4832760bd1fbd31be2859ffedc9b6ff813", - "reference": "a7a14c4832760bd1fbd31be2859ffedc9b6ff813", + "url": "https://api.github.com/repos/symfony/cache/zipball/a50b7249bea81ddd6d3b799ce40c5521c2f72f0b", + "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/cache": "~1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0", - "symfony/polyfill-apcu": "~1.1" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "conflict": { - "symfony/var-dumper": "<3.3" + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" }, "provide": { - "psr/cache-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6", - "doctrine/dbal": "^2.4|^3.0", - "predis/predis": "^1.0" + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -1929,14 +1961,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", "homepage": "https://symfony.com", "keywords": [ "caching", "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v3.4.47" + "source": "https://github.com/symfony/cache/tree/v5.4.9" }, "funding": [ { @@ -1952,40 +1984,43 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-21T10:24:18+00:00" }, { - "name": "symfony/class-loader", - "version": "v3.4.47", + "name": "symfony/cache-contracts", + "version": "v2.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/class-loader.git", - "reference": "a22265a9f3511c0212bf79f54910ca5a77c0e92c" + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/a22265a9f3511c0212bf79f54910ca5a77c0e92c", - "reference": "a22265a9f3511c0212bf79f54910ca5a77c0e92c", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/polyfill-apcu": "~1.1" + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { - "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM" + "symfony/cache-implementation": "" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\ClassLoader\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Contracts\\Cache\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1993,18 +2028,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ClassLoader Component", + "description": "Generic abstractions related to caching", "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "source": "https://github.com/symfony/class-loader/tree/v3.4.47" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.1" }, "funding": [ { @@ -2020,36 +2063,39 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/config", - "version": "v3.4.47", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f" + "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f", - "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f", + "url": "https://api.github.com/repos/symfony/config/zipball/8f551fe22672ac7ab2c95fe46d899f960ed4d979", + "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0|~4.0", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" }, "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/finder": "<3.3" + "symfony/finder": "<4.4" }, "require-dev": { - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/event-dispatcher": "~3.3|~4.0", - "symfony/finder": "~3.3|~4.0", - "symfony/yaml": "~3.0|~4.0" + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -2077,10 +2123,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Config Component", + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v3.4.47" + "source": "https://github.com/symfony/config/tree/v5.4.9" }, "funding": [ { @@ -2096,41 +2142,50 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-17T10:39:36+00:00" }, { "name": "symfony/console", - "version": "v3.4.47", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81" + "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81", - "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", + "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -2161,10 +2216,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v3.4.47" + "source": "https://github.com/symfony/console/tree/v5.4.9" }, "funding": [ { @@ -2180,24 +2241,25 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-18T06:17:34+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.47", + "version": "v5.4.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33" + "reference": "b0a190285cd95cb019237851205b8140ef6e368e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/da3d9da2ce0026771f5fe64cb332158f1bd2bc33", - "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e", + "reference": "b0a190285cd95cb019237851205b8140ef6e368e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -2226,10 +2288,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v3.4.47" + "source": "https://github.com/symfony/css-selector/tree/v5.4.3" }, "funding": [ { @@ -2245,107 +2307,45 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" - }, - { - "name": "symfony/debug", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/ab42889de57fdfcfcc0759ab102e2fd4ea72dcae", - "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/debug/tree/v3.4.47" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.47", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b" + "reference": "beecae161577305926ec078c4ed973f2b98880b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51d2a2708c6ceadad84393f8581df1dcf9e5e84b", - "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/beecae161577305926ec078c4ed973f2b98880b3", + "reference": "beecae161577305926ec078c4ed973f2b98880b3", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/container": "^1.0" + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<3.3.7", - "symfony/finder": "<3.3", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" }, "provide": { - "psr/container-implementation": "1.0" + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/yaml": "~3.4|~4.0" + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" }, "suggest": { "symfony/config": "", @@ -2377,10 +2377,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DependencyInjection Component", + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v3.4.47" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.9" }, "funding": [ { @@ -2396,27 +2396,96 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-27T06:40:03+00:00" }, { - "name": "symfony/dotenv", - "version": "v3.4.47", + "name": "symfony/deprecation-contracts", + "version": "v2.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "1022723ac4f56b001d99691d96c6025dbf1404f1" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/1022723ac4f56b001d99691d96c6025dbf1404f1", - "reference": "1022723ac4f56b001d99691d96c6025dbf1404f1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v5.4.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9", + "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3" }, "require-dev": { - "symfony/process": "^3.4.2|^4.0" + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -2449,7 +2518,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v3.4.47" + "source": "https://github.com/symfony/dotenv/tree/v5.4.5" }, "funding": [ { @@ -2465,35 +2534,115 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-02-15T17:04:12+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v3.4.47", + "name": "symfony/error-handler", + "version": "v5.4.9", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "31fde73757b6bad247c54597beef974919ec6860" + "url": "https://github.com/symfony/error-handler.git", + "reference": "c116cda1f51c678782768dce89a45f13c949455d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/31fde73757b6bad247c54597beef974919ec6860", - "reference": "31fde73757b6bad247c54597beef974919ec6860", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d", + "reference": "c116cda1f51c678782768dce89a45f13c949455d", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "symfony/dependency-injection": "<3.3" + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/debug": "~3.4|~4.4", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-21T13:57:48+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -2522,10 +2671,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v3.4.47" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -2541,25 +2690,106 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-05T16:45:39+00:00" }, { - "name": "symfony/filesystem", - "version": "v3.4.47", + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e58d7841cddfed6e846829040dca2cca0ebbbbb3", - "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -2584,10 +2814,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v3.4.47" + "source": "https://github.com/symfony/filesystem/tree/v5.4.9" }, "funding": [ { @@ -2603,24 +2833,26 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-20T13:55:35+00:00" }, { "name": "symfony/finder", - "version": "v3.4.47", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e" + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/b6b6ad3db3edb1b4b1c1896b1975fb684994de6e", - "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e", + "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -2645,10 +2877,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v3.4.47" + "source": "https://github.com/symfony/finder/tree/v5.4.8" }, "funding": [ { @@ -2664,80 +2896,104 @@ "type": "tidelift" } ], - "time": "2020-11-16T17:02:08+00:00" + "time": "2022-04-15T08:07:45+00:00" }, { "name": "symfony/framework-bundle", - "version": "v3.4.47", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "6c95e747b75ddd2af61152ce93bf87299d15710e" + "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6c95e747b75ddd2af61152ce93bf87299d15710e", - "reference": "6c95e747b75ddd2af61152ce93bf87299d15710e", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1cb89cd3e36d5060545d0f223f00a774fa6430ef", + "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef", "shasum": "" }, "require": { "ext-xml": "*", - "php": "^5.5.9|>=7.0.8", - "symfony/cache": "~3.4.31|^4.3.4", - "symfony/class-loader": "~3.2", - "symfony/config": "^3.4.31|^4.3.4", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.24|^4.2.5", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/filesystem": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "^3.4.38|^4.3", - "symfony/http-kernel": "^3.4.44|^4.3.4", + "php": ">=7.2.5", + "symfony/cache": "^5.2|^6.0", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^5.4.5|^6.0.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4.1|^5.0.1|^6.0", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^3.4.5|^4.0.5" + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/routing": "^5.3|^6.0" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/asset": "<3.3", - "symfony/console": "<3.4", - "symfony/form": "<3.4", - "symfony/property-info": "<3.3", - "symfony/serializer": "<3.3", - "symfony/stopwatch": "<3.4", - "symfony/translation": "<3.4", - "symfony/validator": "<3.4", - "symfony/workflow": "<3.3" + "doctrine/annotations": "<1.13.1", + "doctrine/cache": "<1.11", + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "phpunit/phpunit": "<5.4.3", + "symfony/asset": "<5.3", + "symfony/console": "<5.2.5", + "symfony/dom-crawler": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<5.2", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<5.2", + "symfony/messenger": "<5.4", + "symfony/mime": "<4.4", + "symfony/property-access": "<5.3", + "symfony/property-info": "<4.4", + "symfony/security-csrf": "<5.3", + "symfony/serializer": "<5.2", + "symfony/service-contracts": ">=3.0", + "symfony/stopwatch": "<4.4", + "symfony/translation": "<5.3", + "symfony/twig-bridge": "<4.4", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<5.2", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<5.2" }, "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "fig/link-util": "^1.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "~3.3|~4.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/console": "~3.4.31|^4.3.4", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/form": "^3.4.31|^4.3.4", - "symfony/lock": "~3.4|~4.0", + "doctrine/annotations": "^1.13.1", + "doctrine/cache": "^1.11|^2.0", + "doctrine/persistence": "^1.3|^2|^3", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.3|^6.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/console": "^5.4.9|^6.0.9", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", + "symfony/dotenv": "^5.1|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^5.2|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/mailer": "^5.2|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/notifier": "^5.4|^6.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "~2.8|~3.0|~4.0", - "symfony/property-info": "~3.3|~4.0", - "symfony/security-core": "~3.2|~4.0", - "symfony/security-csrf": "^2.8.31|^3.3.13|~4.0", - "symfony/serializer": "~3.3|~4.0", - "symfony/stopwatch": "~3.4|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~3.4|~4.0", - "symfony/validator": "~3.4|~4.0", - "symfony/var-dumper": "~3.3|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/workflow": "~3.3|~4.0", - "symfony/yaml": "~3.2|~4.0", - "twig/twig": "~1.34|~2.4" + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/property-info": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/security-bundle": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/string": "^5.0|^6.0", + "symfony/translation": "^5.3|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/validator": "^5.2|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/workflow": "^5.2|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^2.10|^3.0" }, "suggest": { "ext-apcu": "For best performance of the system caches", @@ -2772,10 +3028,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony FrameworkBundle", + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v3.4.47" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.9" }, "funding": [ { @@ -2791,29 +3047,36 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-27T06:29:07+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.47", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8" + "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b9885fcce6fe494201da4f70a9309770e9d13dc8", - "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522", + "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" }, "type": "library", "autoload": { @@ -2838,10 +3101,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v3.4.47" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.9" }, "funding": [ { @@ -2857,65 +3120,75 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-17T15:07:29+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.49", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "5aa72405f5bd5583c36ed6e756acb17d3f98ac40" + "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5aa72405f5bd5583c36ed6e756acb17d3f98ac40", - "reference": "5aa72405f5bd5583c36ed6e756acb17d3f98ac40", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8", + "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0", - "symfony/debug": "^3.3.3|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php56": "~1.8" + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.3.7|^6.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", - "symfony/var-dumper": "<3.3", - "twig/twig": "<1.34|<2.4,>=2" + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.10|^4.0.10", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", - "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", "symfony/config": "", "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "", - "symfony/var-dumper": "" + "symfony/dependency-injection": "" }, "type": "library", "autoload": { @@ -2940,10 +3213,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v3.4.49" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.9" }, "funding": [ { @@ -2959,29 +3232,35 @@ "type": "tidelift" } ], - "time": "2021-05-19T12:06:59+00:00" + "time": "2022-05-27T07:09:08+00:00" }, { - "name": "symfony/polyfill-apcu", - "version": "v1.19.0", + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-apcu.git", - "reference": "b44b51e7814c23bfbd793a16ead5d7ce43ed23c5" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/b44b51e7814c23bfbd793a16ead5d7ce43ed23c5", - "reference": "b44b51e7814c23bfbd793a16ead5d7ce43ed23c5", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.19-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2992,89 +3271,9 @@ "files": [ "bootstrap.php" ], - "psr-4": { - "Symfony\\Polyfill\\Apcu\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "apcu", - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-apcu/tree/v1.19.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-21T09:57:48+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.19.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b", - "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.19-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3099,7 +3298,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -3115,7 +3314,88 @@ "type": "tidelift" } ], - "time": "2020-10-23T09:01:57+00:00" + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -3290,20 +3570,23 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.19.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce", - "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" @@ -3311,7 +3594,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.19-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3319,12 +3602,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3350,7 +3633,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -3366,164 +3649,7 @@ "type": "tidelift" } ], - "time": "2020-10-23T09:01:57+00:00" - }, - { - "name": "symfony/polyfill-php56", - "version": "v1.19.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "ea19621731cbd973a6702cfedef3419768bf3372" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/ea19621731cbd973a6702cfedef3419768bf3372", - "reference": "ea19621731cbd973a6702cfedef3419768bf3372", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-util": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.19-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php56\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php56/tree/v1.19.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T09:01:57+00:00" - }, - { - "name": "symfony/polyfill-php70", - "version": "v1.19.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3fe414077251a81a1b15b1c709faf5c2fbae3d4e", - "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.19-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php70/tree/v1.19.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T09:01:57+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", @@ -3602,26 +3728,26 @@ "time": "2022-05-24T11:49:31+00:00" }, { - "name": "symfony/polyfill-util", - "version": "v1.19.0", + "name": "symfony/polyfill-php73", + "version": "v1.26.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-util.git", - "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a", - "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.19-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3629,9 +3755,15 @@ } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Polyfill\\Util\\": "" - } + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3647,16 +3779,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony utilities for portability of PHP codes", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ - "compat", "compatibility", "polyfill", + "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-util/tree/v1.19.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -3672,41 +3804,205 @@ "type": "tidelift" } ], - "time": "2020-10-21T09:57:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { - "name": "symfony/routing", - "version": "v3.4.47", + "name": "symfony/polyfill-php80", + "version": "v1.26.0", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "3e522ac69cadffd8131cc2b22157fa7662331a6c" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3e522ac69cadffd8131cc2b22157fa7662331a6c", - "reference": "3e522ac69cadffd8131cc2b22157fa7662331a6c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-10T07:21:04+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", + "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/config": "<3.3.1", - "symfony/dependency-injection": "<3.3", - "symfony/yaml": "<3.4" + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "~1.0", - "psr/log": "~1.0", - "symfony/config": "^3.3.1|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/yaml": "~3.4|~4.0" + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", @@ -3735,7 +4031,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -3744,7 +4040,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v3.4.47" + "source": "https://github.com/symfony/routing/tree/v5.4.8" }, "funding": [ { @@ -3760,51 +4056,315 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-04-18T21:45:37+00:00" }, { - "name": "symfony/twig-bridge", - "version": "v3.4.47", + "name": "symfony/service-contracts", + "version": "v2.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042", - "reference": "090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "twig/twig": "^1.41|^2.10" + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { - "symfony/console": "<3.4", - "symfony/form": "<3.4.31|>=4.0,<4.3.4" + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-03-13T20:07:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" }, "require-dev": { - "fig/link-util": "^1.0", - "symfony/asset": "~2.8|~3.0|~4.0", - "symfony/console": "~3.4|~4.0", - "symfony/dependency-injection": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "^3.4.31|^4.3.4", - "symfony/http-foundation": "^3.3.11|~4.0", - "symfony/http-kernel": "~3.2|~4.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-04-19T10:40:37+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "1211df0afa701e45a04253110e959d4af4ef0f07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07", + "reference": "1211df0afa701e45a04253110e959d4af4ef0f07", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf", + "reference": "fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<5.3", + "symfony/form": "<5.3", + "symfony/http-foundation": "<5.3", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "egulias/email-validator": "^2.1.10|^3", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/console": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/form": "^5.3|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/security": "^2.8.31|^3.3.13|~4.0", - "symfony/security-acl": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/workflow": "~3.3|~4.0", - "symfony/yaml": "~2.8|~3.0|~4.0" + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/security-http": "^4.4|^5.0|^6.0", + "symfony/serializer": "^5.2|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.2|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/workflow": "^5.2|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" }, "suggest": { "symfony/asset": "For using the AssetExtension", @@ -3813,9 +4373,10 @@ "symfony/form": "For using the FormExtension", "symfony/http-kernel": "For using the HttpKernelExtension", "symfony/routing": "For using the RoutingExtension", - "symfony/security": "For using the SecurityExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/templating": "For using the TwigEngine", "symfony/translation": "For using the TranslationExtension", "symfony/var-dumper": "For using the DumpExtension", "symfony/web-link": "For using the WebLinkExtension", @@ -3844,10 +4405,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Twig Bridge", + "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v3.4.47" + "source": "https://github.com/symfony/twig-bridge/tree/v5.4.9" }, "funding": [ { @@ -3863,50 +4424,52 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-05-21T10:24:18+00:00" }, { "name": "symfony/twig-bundle", - "version": "v3.4.47", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "977b3096e2df96bc8a8d2329e83466cfc30c373d" + "reference": "c992b4474c3a31f3c40a1ca593d213833f91b818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/977b3096e2df96bc8a8d2329e83466cfc30c373d", - "reference": "977b3096e2df96bc8a8d2329e83466cfc30c373d", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/c992b4474c3a31f3c40a1ca593d213833f91b818", + "reference": "c992b4474c3a31f3c40a1ca593d213833f91b818", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/config": "~3.2|~4.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/http-kernel": "^3.3|~4.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.0|^6.0", "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^3.4.3|^4.0.3", - "twig/twig": "~1.41|~2.10" + "symfony/polyfill-php80": "^1.16", + "symfony/twig-bridge": "^5.3|^6.0", + "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<3.3.1" + "symfony/dependency-injection": "<5.3", + "symfony/framework-bundle": "<5.0", + "symfony/service-contracts": ">=3.0", + "symfony/translation": "<5.0" }, "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.4.24|^4.2.5", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "~2.8|~3.0|~4.0", - "symfony/framework-bundle": "^3.3.11|~4.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/yaml": "~2.8|~3.0|~4.0" + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.0|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "type": "symfony-bundle", "autoload": { @@ -3931,10 +4494,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony TwigBundle", + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v3.4.47" + "source": "https://github.com/symfony/twig-bundle/tree/v5.4.8" }, "funding": [ { @@ -3950,35 +4513,201 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-04-03T13:03:10+00:00" }, { - "name": "symfony/yaml", - "version": "v3.4.47", + "name": "symfony/var-dumper", + "version": "v5.4.9", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "af52239a330fafd192c773795520dc2dd62b5657" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657", + "reference": "af52239a330fafd192c773795520dc2dd62b5657", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/console": "<3.4" + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" }, "require-dev": { - "symfony/console": "~3.4|~4.0" + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-21T10:24:18+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/63249ebfca4e75a357679fa7ba2089cfb898aa67", + "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-21T10:24:18+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { @@ -4002,10 +4731,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v3.4.47" + "source": "https://github.com/symfony/yaml/tree/v5.4.3" }, "funding": [ { @@ -4021,7 +4750,7 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-01-26T16:32:32+00:00" }, { "name": "thenetworg/oauth2-azure", @@ -4130,36 +4859,34 @@ }, { "name": "twig/twig", - "version": "v1.42.5", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e" + "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e", - "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/e939eae92386b69b49cfa4599dd9bead6bf4a342", + "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342", "shasum": "" }, "require": { - "php": ">=5.5.0", - "symfony/polyfill-ctype": "^1.8" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.0" + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.42-dev" + "dev-master": "3.4-dev" } }, "autoload": { - "psr-0": { - "Twig_": "lib/" - }, "psr-4": { "Twig\\": "src/" } @@ -4192,28 +4919,39 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/1.x" + "source": "https://github.com/twigphp/Twig/tree/v3.4.1" }, - "time": "2020-02-11T05:59:23+00:00" + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2022-05-17T05:48:52+00:00" } ], "packages-dev": [ { "name": "symfony/stopwatch", - "version": "v3.4.47", + "version": "v5.4.5", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462" + "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/298b81faad4ce60e94466226b2abbb8c9bca7462", - "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" }, "type": "library", "autoload": { @@ -4238,10 +4976,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v3.4.47" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.5" }, "funding": [ { @@ -4257,125 +4995,43 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0719f6cf4633a38b2c1585140998579ce23b4b7d", - "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" - }, - "require-dev": { - "ext-iconv": "*", - "twig/twig": "~1.34|~2.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v3.4.47" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-02-18T16:06:09+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v3.4.47", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "ccb83b3a508f4a683e44f571f127beebdc315ff9" + "reference": "909c6eea7815066a80d0a362ed41abd7924e376a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ccb83b3a508f4a683e44f571f127beebdc315ff9", - "reference": "ccb83b3a508f4a683e44f571f127beebdc315ff9", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/909c6eea7815066a80d0a362ed41abd7924e376a", + "reference": "909c6eea7815066a80d0a362ed41abd7924e376a", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/config": "~3.4|~4.0", - "symfony/http-kernel": "~3.4.25|^4.2.6", - "symfony/polyfill-php70": "~1.0", - "symfony/routing": "~3.4.7|~4.0", - "symfony/twig-bundle": "~3.4|~4.0", - "symfony/var-dumper": "~3.3|~4.0", - "twig/twig": "~1.34|~2.4" + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.3|^6.0", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<3.3.1", - "symfony/framework-bundle": ">4.3.99", - "symfony/var-dumper": "<3.3" + "symfony/dependency-injection": "<5.2", + "symfony/form": "<4.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<4.4" }, "require-dev": { - "symfony/browser-kit": "~3.4|~4.0", - "symfony/console": "~3.4|~4.0", - "symfony/css-selector": "~3.4|~4.0", - "symfony/framework-bundle": "~3.4|~4.0", - "symfony/stopwatch": "~3.4|~4.0" + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "type": "symfony-bundle", "autoload": { @@ -4400,10 +5056,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony WebProfilerBundle", + "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v3.4.47" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.8" }, "funding": [ { @@ -4419,7 +5075,7 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-04-22T08:14:12+00:00" } ], "aliases": [], @@ -4428,7 +5084,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.1.3 <8.0.0", + "php": ">=7.2.5 <8.0.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -4439,7 +5095,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "7.1.3" + "php": "7.2.5" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.3.0" } diff --git a/core/cmdbobject.class.inc.php b/core/cmdbobject.class.inc.php index 44a22c865..6d3cac992 100644 --- a/core/cmdbobject.class.inc.php +++ b/core/cmdbobject.class.inc.php @@ -614,7 +614,9 @@ abstract class CMDBObject extends DBObject { return $this->DBCloneTracked_Internal(); } - + /* + * @deprecated 3.1.0 not used N°5232 + */ public function DBCloneTracked(CMDBChange $oChange, $newKey = null) { self::SetCurrentChange($oChange); diff --git a/core/config.class.inc.php b/core/config.class.inc.php index 3b1caf24d..405997818 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -592,46 +592,6 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], - 'email_transport_smtp.oauth.provider' => [ - 'type' => 'string', - 'description' => 'Email OAuth provider', - 'default' => '', - 'value' => '', - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], - 'email_transport_smtp.oauth.client_id' => [ - 'type' => 'string', - 'description' => 'Email OAuth client id', - 'default' => '', - 'value' => '', - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], - 'email_transport_smtp.oauth.client_secret' => [ - 'type' => 'string', - 'description' => 'Email OAuth client secret', - 'default' => '', - 'value' => '', - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], - 'email_transport_smtp.oauth.access_token' => [ - 'type' => 'string', - 'description' => 'Email OAuth access token', - 'default' => '', - 'value' => '', - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], - 'email_transport_smtp.oauth.refresh_token' => [ - 'type' => 'string', - 'description' => 'Email OAuth refresh token', - 'default' => '', - 'value' => '', - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], 'email_css' => [ 'type' => 'string', 'description' => 'CSS that will override the standard stylesheet used for the notifications', diff --git a/core/ormcaselog.class.inc.php b/core/ormcaselog.class.inc.php index 2d024fa31..950ff0627 100644 --- a/core/ormcaselog.class.inc.php +++ b/core/ormcaselog.class.inc.php @@ -155,7 +155,7 @@ class ormCaseLog { break; case static::ENUM_FORMAT_HTML: - $sHtmlEntry = $sTextEntry; + $sHtmlEntry = InlineImage::FixUrls($sTextEntry); $sTextEntry = utils::HtmlToText($sHtmlEntry); break; } @@ -723,7 +723,7 @@ class ormCaseLog { } else { - $sRes = $sRaw; + $sRes = InlineImage::FixUrls($sRaw); } break; } @@ -758,6 +758,6 @@ class ormCaseLog { } $iPos += $this->m_aIndex[$index]['separator_length']; $sText = substr($this->m_sLog, $iPos, $this->m_aIndex[$index]['text_length']); - return $sText; + return InlineImage::FixUrls($sText); } } diff --git a/core/ormstopwatch.class.inc.php b/core/ormstopwatch.class.inc.php index 7bcd5f3d9..b4dddbb91 100644 --- a/core/ormstopwatch.class.inc.php +++ b/core/ormstopwatch.class.inc.php @@ -596,10 +596,9 @@ class CheckStopWatchThresholds implements iBackgroundProcess $oSW = $oObj->Get($sAttCode); $oSW->MarkThresholdAsTriggered($iThreshold); $oObj->Set($sAttCode, $oSW); - - if($oObj->IsModified()) - { - CMDBObject::SetTrackInfo("Automatic - threshold triggered"); + + if ($oObj->IsModified()) { + CMDBObject::SetCurrentChangeFromParams("Automatic - threshold triggered"); $oObj->DBUpdate(); } diff --git a/css/backoffice/components/_field.scss b/css/backoffice/components/_field.scss index f6993b06d..f86e7db85 100644 --- a/css/backoffice/components/_field.scss +++ b/css/backoffice/components/_field.scss @@ -94,14 +94,13 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default; max-width: 145px; width: 30%; } - .ibo-field--value { margin-top: $ibo-field--value--margin-top--for-large; /* Mostly used to have a clear separation from elements in .ibo-field--comments */ } /* N°4318 - Visible scrollbar background for large fields overflowing to ease "limits" visualization by the user */ .ibo-field--value > * { - --ibo-scrollbar--scrollbar-track-background-color: $ibo-field--value--scrollbar-track-background-color; + --ibo-scrollbar--scrollbar-track-background-color: #{$ibo-field--value--scrollbar-track-background-color}; } /* Fullscreen mode */ diff --git a/css/backoffice/components/_panel.scss b/css/backoffice/components/_panel.scss index c4afc19a6..92331faa5 100644 --- a/css/backoffice/components/_panel.scss +++ b/css/backoffice/components/_panel.scss @@ -89,7 +89,7 @@ $ibo-panel--collapsible-toggler--color: $ibo-color-grey-700 !default; .ibo-panel { - --ibo-main-color: map-get($ibo-panel-colors, 'neutral'); /* --ibo-main-color is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */ + --ibo-main-color: #{map-get($ibo-panel-colors, 'neutral')}; /* --ibo-main-color is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */ position: relative; diff --git a/css/backoffice/components/_pill.scss b/css/backoffice/components/_pill.scss index d45236c5c..71481bc63 100644 --- a/css/backoffice/components/_pill.scss +++ b/css/backoffice/components/_pill.scss @@ -79,8 +79,8 @@ $ibo-pill-states-colors: ( /* Rules */ .ibo-pill { /* --ibo-main-color-xxx is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */ - --ibo-main-color--100: map-get(map-get($ibo-pill-states-colors, 'neutral'), 'primary-color'); - --ibo-main-color--900: map-get(map-get($ibo-pill-states-colors, 'neutral'), 'secondary-color'); + --ibo-main-color--100: #{map-get(map-get($ibo-pill-states-colors, 'neutral'), 'primary-color')}; + --ibo-main-color--900: #{map-get(map-get($ibo-pill-states-colors, 'neutral'), 'secondary-color')}; @extend %ibo-fully-centered-content; max-width: $ibo-pill--max-width; diff --git a/css/backoffice/components/_quick-create.scss b/css/backoffice/components/_quick-create.scss index 80c81643a..17534e8e2 100644 --- a/css/backoffice/components/_quick-create.scss +++ b/css/backoffice/components/_quick-create.scss @@ -235,7 +235,7 @@ $ibo-quick-create--compartment--placeholder-hint--text-color: $ibo-color-grey-70 } &:hover{ cursor: pointer; - @extend a:hover; + @extend a; } .highlight{ diff --git a/css/backoffice/pages/_all.scss b/css/backoffice/pages/_all.scss index d911ff390..3e6b6b39a 100644 --- a/css/backoffice/pages/_all.scss +++ b/css/backoffice/pages/_all.scss @@ -14,4 +14,5 @@ @import "csv-import"; @import "global-search"; @import "run-query"; -@import "welcome-popup"; \ No newline at end of file +@import "welcome-popup"; +@import "oauth.wizard"; \ No newline at end of file diff --git a/css/backoffice/pages/_oauth.wizard.scss b/css/backoffice/pages/_oauth.wizard.scss new file mode 100644 index 000000000..04fb33089 --- /dev/null +++ b/css/backoffice/pages/_oauth.wizard.scss @@ -0,0 +1,16 @@ +.ibo-oauth-wizard .ibo-panel--body{ + .ibo-oauth-wizard--form--container{ + display: flex; + flex-direction: row; + flex-grow: 1; + } + .ibo-oauth-wizard--form { + + } + .ibo-oauth-wizard--illustration svg{ + max-height: 400px; + } +} +#ibo-oauth-wizard--conf--result{ + white-space: pre-wrap +} diff --git a/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php b/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php index b105e4029..b8b81e265 100644 --- a/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php +++ b/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php @@ -40,20 +40,20 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:UserLocal/Attribute:password+' => 'ē”ØäŗŽéŖŒčÆē”Øęˆ·čŗ«ä»½ēš„å­—ē¬¦äø²', 'Class:UserLocal/Attribute:expiration' => 'åÆ†ē čæ‡ęœŸ', - 'Class:UserLocal/Attribute:expiration+' => 'åÆ†ē čæ‡ęœŸēŠ¶ę€ (éœ€č¦äø€äøŖę‰©å±•ę‰čƒ½ē”Ÿę•ˆ)', + 'Class:UserLocal/Attribute:expiration+' => 'åÆ†ē čæ‡ęœŸēŠ¶ę€(éœ€č¦äø€äøŖę‰©å±•ę‰čƒ½ē”Ÿę•ˆ)', 'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'å…č®øčæ‡ęœŸ', 'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '', 'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'ę°øäøčæ‡ęœŸ', 'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '', 'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'å·²čæ‡ęœŸ', 'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '', - 'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'One-time Password~~', - 'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~', + 'Class:UserLocal/Attribute:expiration/Value:otp_expire' => '一欔性密码', + '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' => '密码必锻至少8个字符,包含大小写,ę•°å­—å’Œē‰¹ę®Šå­—ē¬¦.', 'UserLocal:password:expiration' => 'äø‹é¢ēš„åŒŗåŸŸéœ€č¦ę’ä»¶ę‰©å±•', - 'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~', + 'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'äøå…č®øē”Øęˆ·äøŗč‡Ŗå·±č®¾ē½®"一欔性密码"ēš„å¤±ę•ˆęœŸé™', )); diff --git a/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss b/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss index a8b2e550b..690d3af8b 100644 --- a/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss +++ b/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss @@ -202,7 +202,7 @@ $ibo-tab-container--tab-header--text-color: $ibo-color-grey-50; $ibo-vendors-datatables--row-highlight--colors:('red': ($ibo-color-red-700),'danger': ($ibo-color-red-700),'alert': ($ibo-color-red-700),'orange': ($ibo-color-orange-700),'warning': (#d08770),'blue': (#5e81ac),'info': (#5e81ac),); -$ibo-vendors-jqueryui--ui-dialog--background-color: $ibo-color-grey-800;jquer +$ibo-vendors-jqueryui--ui-dialog--background-color: $ibo-color-grey-800; $ibo-vendors-jqueryui--ui-dialog-titlebar--border-bottom: solid 1px $ibo-color-grey-500; @@ -231,13 +231,16 @@ $ibo-keyboard-shortcut--input--background-color: $ibo-input--background-color; $ibo-keyboard-shortcut--input--color: $ibo-input--color; -$ibo-button-colors: ('regular': ('neutral': ('': ($ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-300, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), /* Primary action does not have the colors from the primary brand color, at least not for now */ 'primary': ( '': ( $ibo-color-primary-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':hover': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':active': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-primary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-600, $ibo-color-primary-800, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'secondary': ( '': ( $ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-200, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'danger': ( '': ( $ibo-color-danger-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':hover': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':active': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-danger-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-600, $ibo-color-danger-700, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'success': ( '': ( $ibo-color-success-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':hover': ( $ibo-color-success-800, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':active': ($ibo-color-success-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-success-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-800,$ibo-color-success-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), /* Colors */ 'red': ( '': ($ibo-color-red-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':hover': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':active': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-red-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-600,$ibo-color-red-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'green': ( '': ($ibo-color-green-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':hover': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':active': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-green-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-800,$ibo-color-green-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'cyan': ( '': ($ibo-color-cyan-500,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':hover': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':active': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-cyan-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-700,$ibo-color-cyan-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ) ), 'alternative': ( /* Semantics */ 'neutral': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-top $ibo-color-secondary-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), /* Primary action does not have the colors from the primary brand color, at least not for now */ 'primary': ( '': (transparent,$ibo-color-primary-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-700, ), ':hover': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':active': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-top $ibo-color-primary-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'secondary': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-top $ibo-color-secondary-200 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'danger': ( '': (transparent,$ibo-color-danger-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-danger-600, ), ':hover': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':active': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-top $ibo-color-danger-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'success': ( '': (transparent,$ibo-color-success-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-success-800, ), ':hover': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':active': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-top $ibo-color-success-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), /* Colors */ 'red': ( '': (transparent,$ibo-color-red-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-red-600, ), ':hover': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':active': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-top $ibo-color-red-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'green': ( '': (transparent,$ibo-color-green-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-green-800, ), ':hover': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':active': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-top $ibo-color-green-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'cyan': ( '': (transparent,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-800, ), ':hover': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':active': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-top $ibo-color-cyan-800 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), )); +$ibo-button-colors: ('regular': ('neutral': ('': ($ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-300, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'primary': ( '': ( $ibo-color-primary-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':hover': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':active': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-primary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-600, $ibo-color-primary-800, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'secondary': ( '': ( $ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-200, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'danger': ( '': ( $ibo-color-danger-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':hover': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':active': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-danger-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-600, $ibo-color-danger-700, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'success': ( '': ( $ibo-color-success-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':hover': ( $ibo-color-success-800, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':active': ($ibo-color-success-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-success-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-800,$ibo-color-success-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'red': ( '': ($ibo-color-red-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':hover': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':active': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-red-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-600,$ibo-color-red-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'green': ( '': ($ibo-color-green-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':hover': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':active': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-green-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-800,$ibo-color-green-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'cyan': ( '': ($ibo-color-cyan-500,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':hover': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':active': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-cyan-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-700,$ibo-color-cyan-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ) ), 'alternative': ( 'neutral': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-top $ibo-color-secondary-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'primary': ( '': (transparent,$ibo-color-primary-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-700, ), ':hover': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':active': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-top $ibo-color-primary-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'secondary': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-top $ibo-color-secondary-200 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'danger': ( '': (transparent,$ibo-color-danger-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-danger-600, ), ':hover': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':active': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-top $ibo-color-danger-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'success': ( '': (transparent,$ibo-color-success-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-success-800, ), ':hover': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':active': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-top $ibo-color-success-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'red': ( '': (transparent,$ibo-color-red-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-red-600, ), ':hover': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':active': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-top $ibo-color-red-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'green': ( '': (transparent,$ibo-color-green-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-green-800, ), ':hover': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':active': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-top $ibo-color-green-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'cyan': ( '': (transparent,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-800, ), ':hover': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':active': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-top $ibo-color-cyan-800 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), )); -$ibo-alert-colors: ('primary': ($ibo-color-primary-900, $ibo-color-primary-700, $ibo-color-primary-200),'secondary': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'neutral': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'information': ($ibo-color-information-900, $ibo-color-information-700, $ibo-color-information-200),'success': ($ibo-color-success-900, $ibo-color-success-700, $ibo-color-success-100),'failure': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'warning': ($ibo-color-warning-900, $ibo-color-warning-700, $ibo-color-warning-200),'danger': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'grey' : ($ibo-color-grey-900, $ibo-color-grey-700, $ibo-color-grey-200),'blue-grey': ($ibo-color-blue-grey-900, $ibo-color-blue-grey-700, $ibo-color-blue-grey-200),'blue': ($ibo-color-blue-900, $ibo-color-blue-700, $ibo-color-blue-200),'cyan': ($ibo-color-cyan-900, $ibo-color-blue-700, $ibo-color-cyan-100),'green': ($ibo-color-green-900, $ibo-color-green-700, $ibo-color-green-100),'orange' : ($ibo-color-orange-900, $ibo-color-orange-700, $ibo-color-orange-200),'red': ($ibo-color-red-900, $ibo-color-red-700, $ibo-color-red-200),'pink': ($ibo-color-pink-900, $ibo-color-pink-700, $ibo-color-pink-200),); +$ibo-alert-colors: ('primary': ($ibo-color-primary-900, $ibo-color-primary-700, $ibo-color-primary-200), 'secondary': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'neutral': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'information': ($ibo-color-information-900, $ibo-color-information-700, $ibo-color-information-200),'success': ($ibo-color-success-900, $ibo-color-success-700, $ibo-color-success-100),'failure': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'warning': ($ibo-color-warning-900, $ibo-color-warning-700, $ibo-color-warning-200),'danger': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'grey' : ($ibo-color-grey-900, $ibo-color-grey-700, $ibo-color-grey-200),'blue-grey': ($ibo-color-blue-grey-900, $ibo-color-blue-grey-700, $ibo-color-blue-grey-200),'blue': ($ibo-color-blue-900, $ibo-color-blue-700, $ibo-color-blue-200),'cyan': ($ibo-color-cyan-900, $ibo-color-blue-700, $ibo-color-cyan-100),'green': ($ibo-color-green-900, $ibo-color-green-700, $ibo-color-green-100),'orange' : ($ibo-color-orange-900, $ibo-color-orange-700, $ibo-color-orange-200),'red': ($ibo-color-red-900, $ibo-color-red-700, $ibo-color-red-200),'pink': ($ibo-color-pink-900, $ibo-color-pink-700, $ibo-color-pink-200),); $ibo-color-base-lightness-100: 23%; $ibo-color-base-lightness-900: 93%; +$ibo-color-base-opacity-for-lightness-100: 1; +$ibo-color-base-opacity-for-lightness-900: 1; + $ibo-vendors-c3--path--color: $ibo-color-grey-300; $ibo-vendors-c3--tooltip--background-color: $ibo-color-grey-600; $ibo-vendors-c3--tooltip-th--background-color: $ibo-color-grey-600; diff --git a/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php index 58223d2bd..0c58b402e 100644 --- a/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php @@ -23,23 +23,23 @@ // Database inconsistencies Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dictionary entries go here - 'Menu:DBToolsMenu' => 'DB å·„å…·', - 'DBTools:Class' => 'Class~~', + 'Menu:DBToolsMenu' => 'ę•°ę®åŗ“å·„å…·', + 'DBTools:Class' => 'ē±»', 'DBTools:Title' => 'ę•°ę®åŗ“ē»“ęŠ¤å·„å…·', 'DBTools:ErrorsFound' => 'å‘ēŽ°é”™čÆÆ', - 'DBTools:Indication' => 'Important: after fixing errors in the database you\'ll have to run the analysis again as new inconsistencies will be generated~~', - 'DBTools:Disclaimer' => 'DISCLAIMER: BACKUP YOUR DATABASE BEFORE RUNNING THE FIXES~~', + 'DBTools:Indication' => 'é‡č¦: äæ®å¤ę•°ę®åŗ“é”™čÆÆåŽ,åÆčƒ½ä¼šå‡ŗēŽ°ę–°ēš„äøäø€č‡“,ę‚Øåæ…é”»é‡ę–°čæč”Œäø€ę¬”åˆ†ęž.', + 'DBTools:Disclaimer' => 'å…č“£ē”³ę˜Ž: åœØåŗ”ē”Øäæ®å¤ä¹‹å‰,åŗ”å…ˆå¤‡ä»½ę•°ę®åŗ“', 'DBTools:Error' => '错误', 'DBTools:Count' => 'äøŖę•°', 'DBTools:SQLquery' => 'SQL 柄询', 'DBTools:FixitSQLquery' => 'SQL query To Fix it (indication)~~', 'DBTools:SQLresult' => 'SQL ē»“ęžœ', - 'DBTools:NoError' => 'ę•°ę®åŗ“OK ', + 'DBTools:NoError' => 'ę•°ę®åŗ“ę­£ē”®', 'DBTools:HideIds' => 'é”™čÆÆåˆ—č”Ø', 'DBTools:ShowIds' => '详细视图', 'DBTools:ShowReport' => 'ęŠ„å‘Š', 'DBTools:IntegrityCheck' => 'å®Œę•“ę€§ę£€ęŸ„', - 'DBTools:FetchCheck' => 'Fetch Check (long)~~', + 'DBTools:FetchCheck' => 'ęå–ę£€ęŸ„(耗时长)', 'DBTools:SelectAnalysisType' => 'čÆ·é€‰ę‹©åˆ†ęžē±»åž‹', 'DBTools:Analyze' => 'åˆ†ęž', @@ -47,17 +47,17 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'DBTools:ShowAll' => 'ę˜¾ē¤ŗę‰€ęœ‰é”™čÆÆ', 'DBTools:Inconsistencies' => 'ę•°ę®åŗ“äøäø€č‡“', - 'DBTools:DetailedErrorTitle' => '%2$s error(s) in class %1$s: %3$s~~', + 'DBTools:DetailedErrorTitle' => '%2$s äøŖé”™čÆÆåœØē±» %1$s: %3$s', 'DBAnalyzer-Integrity-OrphanRecord' => 'Orphan record in `%1$s`, it should have its counterpart in table `%2$s`~~', 'DBAnalyzer-Integrity-InvalidExtKey' => 'ę— ę•ˆēš„å¤–é”® %1$s (列: `%2$s.%3$s`)', 'DBAnalyzer-Integrity-MissingExtKey' => '外键丢失 %1$s (列: `%2$s.%3$s`)', 'DBAnalyzer-Integrity-InvalidValue' => 'ę— ę•ˆēš„å€¼ %1$s (列: `%2$s.%3$s`)', - 'DBAnalyzer-Integrity-UsersWithoutProfile' => 'Some user accounts have no profile at all~~', - 'DBAnalyzer-Integrity-HKInvalid' => 'Broken hierarchical key `%1$s`~~', + 'DBAnalyzer-Integrity-UsersWithoutProfile' => 'äø€äŗ›ē”Øęˆ·č“¦å·ę²”ęœ‰č§’č‰²', + 'DBAnalyzer-Integrity-HKInvalid' => 'ęŸåēš„å±‚ēŗ§é“¾ `%1$s`', 'DBAnalyzer-Fetch-Count-Error' => 'Fetch count error in `%1$s`, %2$d entries fetched / %3$d counted~~', - 'DBAnalyzer-Integrity-FinalClass' => 'Field `%2$s`.`%1$s` must have the same value than `%3$s`.`%1$s`~~', - 'DBAnalyzer-Integrity-RootFinalClass' => 'Field `%2$s`.`%1$s` must contains a valid class~~', + 'DBAnalyzer-Integrity-FinalClass' => '字段 `%2$s`.`%1$s` åæ…é”»ę˜Æē›øåŒēš„å€¼,č€Œäøę˜Æ `%3$s`.`%1$s`', + 'DBAnalyzer-Integrity-RootFinalClass' => '字段 `%2$s`.`%1$s` åæ…é”»åŒ…å«äø€äøŖęœ‰ę•ˆēš„ē±»', )); // Database Info @@ -70,11 +70,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Lost attachments Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'DBTools:LostAttachments' => '缺失附件', - 'DBTools:LostAttachments:Disclaimer' => 'Here you can search your database for lost or misplaced attachments. This is NOT a data recovery tool, is does not retrieve deleted data.~~', + 'DBTools:LostAttachments:Disclaimer' => 'åÆä»„åœØę­¤ęœē“¢ę•°ę®åŗ“äø­äø¢å¤±ęˆ–é”™ę”¾ēš„é™„ä»¶.čæ™äøę˜Æę•°ę®ę¢å¤å·„å…·,å…¶ę— ę³•ę¢å¤å·²åˆ é™¤ēš„ę•°ę®.', 'DBTools:LostAttachments:Button:Analyze' => 'åˆ†ęž', 'DBTools:LostAttachments:Button:Restore' => 'čæ˜åŽŸ', - 'DBTools:LostAttachments:Button:Restore:Confirm' => 'čÆ„ę“ä½œę— ę³•å›žé€€, čÆ·ē”®č®¤ę˜Æå¦ē»§ē»­čæ˜åŽŸ.', + 'DBTools:LostAttachments:Button:Restore:Confirm' => 'ę­¤ę“ä½œę— ę³•å›žé€€, čÆ·ē”®č®¤ę˜Æå¦ē»§ē»­čæ˜åŽŸ.', 'DBTools:LostAttachments:Button:Busy' => 'čÆ·ēØåŽ...', 'DBTools:LostAttachments:Step:Analyze' => '首先, é€ščæ‡åˆ†ęžę•°ę®åŗ“ę„ęœē“¢äø¢å¤±ęˆ–čÆÆęŒŖåŠØēš„é™„ä»¶.', @@ -89,6 +89,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'DBTools:LostAttachments:Step:RestoreResults' => 'čæ˜åŽŸē»“ęžœ:', 'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d ēš„é™„ä»¶č¢«čæ˜åŽŸ.', - 'DBTools:LostAttachments:StoredAsInlineImage' => 'Stored as inline image~~', - 'DBTools:LostAttachments:History' => '附件 "%1$s" restored with DB å·„å…·~~' + 'DBTools:LostAttachments:StoredAsInlineImage' => 'å­˜å‚Øäøŗå†…åµŒå›¾åƒ', + 'DBTools:LostAttachments:History' => '附件 "%1$s" å·²ä½æē”Øę•°ę®åŗ“å·„å…·čæ˜åŽŸ' )); diff --git a/datamodels/2.x/installation.xml b/datamodels/2.x/installation.xml index 330736741..1812f6a94 100755 --- a/datamodels/2.x/installation.xml +++ b/datamodels/2.x/installation.xml @@ -21,6 +21,7 @@ combodo-db-tools itop-core-update itop-hub-connector + itop-oauth-client combodo-backoffice-darkmoon-theme itop-themes-compat diff --git a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php index 7dffe2b81..484816092 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php @@ -29,9 +29,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Attachment:Max_Mo' => '(ęœ€å¤§ę–‡ä»¶å°ŗåÆø: %1$s MB)', 'Attachment:Max_Ko' => '(ęœ€å¤§ę–‡ä»¶å°ŗåÆø: %1$s KB)', 'Attachments:NoAttachment' => 'ę²”ęœ‰é™„ä»¶. ', - 'Attachments:PreviewNotAvailable' => 'čÆ„é™„ä»¶ē±»åž‹äøę”ÆęŒé¢„č§ˆ.', + 'Attachments:PreviewNotAvailable' => 'ę­¤é™„ä»¶ē±»åž‹äøę”ÆęŒé¢„č§ˆ.', 'Attachments:Error:FileTooLarge' => 'äøŠä¼ ēš„ę–‡ä»¶čæ‡å¤§. %1$s', - 'Attachments:Error:UploadedFileEmpty' => 'ę”¶åˆ°ēš„ę–‡ä»¶äøŗē©ŗļ¼Œę— ę³•ę·»åŠ . åÆčƒ½ę˜Æå› äøŗę‚Øå‘é€ēš„ę˜Æē©ŗę–‡ä»¶,ęˆ–č€…å’ØčÆ¢ '.ITOP_APPLICATION_SHORT.' ē®”ē†å‘˜ęœåŠ”å™Øē£ē›˜ę˜Æå¦å·²ę»”. ', + 'Attachments:Error:UploadedFileEmpty' => 'ę”¶åˆ°ēš„ę–‡ä»¶äøŗē©ŗ,ę— ę³•ę·»åŠ . åÆčƒ½ę˜Æå› äøŗę‚Øå‘é€ēš„ę˜Æē©ŗę–‡ä»¶,ęˆ–č€…å’ØčÆ¢ '.ITOP_APPLICATION_SHORT.' ē®”ē†å‘˜ęœåŠ”å™Øē£ē›˜ę˜Æå¦å·²ę»”. ', 'Attachments:Render:Icons' => 'ę˜¾ē¤ŗäøŗå›¾ę ‡', 'Attachments:Render:Table' => 'ę˜¾ē¤ŗäøŗåˆ—č”Ø', 'UI:Attachments:DropYourFileHint' => 'å°†ę–‡ä»¶ę‹–ę”¾åˆ°ę­¤åŒŗåŸŸēš„ä»»ę„ä½ē½®', @@ -48,11 +48,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Attachment/Attribute:expire+' => '~~', 'Class:Attachment/Attribute:temp_id' => 'äø“ę—¶id', 'Class:Attachment/Attribute:temp_id+' => '~~', - 'Class:Attachment/Attribute:item_class' => 'Item class~~', + 'Class:Attachment/Attribute:item_class' => '锹目类', 'Class:Attachment/Attribute:item_class+' => '~~', 'Class:Attachment/Attribute:item_id' => '锹目', 'Class:Attachment/Attribute:item_id+' => '~~', - 'Class:Attachment/Attribute:item_org_id' => 'Item 组织~~', + 'Class:Attachment/Attribute:item_org_id' => '锹目组织', 'Class:Attachment/Attribute:item_org_id+' => '', 'Class:Attachment/Attribute:contents' => '内容', 'Class:Attachment/Attribute:contents+' => '', @@ -74,8 +74,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Attachment/Attribute:creation_date' => 'åˆ›å»ŗę—„ęœŸ', 'Class:Attachment/Attribute:creation_date+' => '~~', - 'Class:Attachment/Attribute:user_id' => 'ē”Øęˆ· id', + 'Class:Attachment/Attribute:user_id' => 'ē”Øęˆ·id', 'Class:Attachment/Attribute:user_id+' => '~~', - 'Class:Attachment/Attribute:contact_id' => '联系人 id', + 'Class:Attachment/Attribute:contact_id' => '联系人id', 'Class:Attachment/Attribute:contact_id+' => '~~', )); diff --git a/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php b/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php index 44a4ffcfa..fa126492e 100644 --- a/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php +++ b/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php @@ -28,14 +28,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Menu:BackupStatus' => 'å®šę—¶å¤‡ä»½', 'bkp-status-title' => 'å®šę—¶å¤‡ä»½', 'bkp-status-checks' => 'č®¾ē½®äøŽę£€ęŸ„', - 'bkp-mysqldump-ok' => 'å·²ę‰¾åˆ° mysqldump : %1$s', + 'bkp-mysqldump-ok' => 'å·²ę‰¾åˆ°mysqldump : %1$s', 'bkp-mysqldump-notfound' => 'mysqldump ę‰¾äøåˆ°: %1$s - čÆ·ē”®č®¤å®ƒå®‰č£…åœØę­£ē”®ēš„č·Æå¾„, ęˆ–č€…č°ƒę•“'.ITOP_APPLICATION_SHORT.' é…ē½®ę–‡ä»¶ēš„é€‰é”¹mysql_bindir.', 'bkp-mysqldump-issue' => 'mysqldump ę— ę³•čæč”Œ (retcode=%1$d): čÆ·ē”®č®¤å®ƒå®‰č£…åœØę­£ē”®ēš„č·Æå¾„, ęˆ–č€…č°ƒę•“'.ITOP_APPLICATION_SHORT.' é…ē½®ę–‡ä»¶ēš„é€‰é”¹mysql_bindir', 'bkp-missing-dir' => '目标目录 %1$s ę‰¾äøåˆ°', - 'bkp-free-disk-space' => '%1$s 空闲 在 %2$s', + 'bkp-free-disk-space' => '%1$s åÆē”Øē©ŗé—“ ä½äŗŽ %2$s', 'bkp-dir-not-writeable' => '%1$s ę²”ęœ‰å†™å…„ęƒé™', 'bkp-wrong-format-spec' => 'å½“å‰ę–‡ä»¶åę ¼å¼é”™čÆÆ (%1$s). é»˜č®¤ę ¼å¼åŗ”čÆ„ę˜Æ: %2$s', - 'bkp-name-sample' => 'å¤‡ä»½ę–‡ä»¶å°†ä»„ę•°ę®åŗ“åć€ę—„ęœŸå’Œę—¶é—“čæ›č”Œå‘½å. 例如: %1$s', + 'bkp-name-sample' => 'å¤‡ä»½ę–‡ä»¶å°†ä»„ę•°ę®åŗ“å,ę—„ęœŸå’Œę—¶é—“čæ›č”Œå‘½å. 例如: %1$s', 'bkp-week-days' => 'åœØęÆäøŖ %1$s ēš„ %2$s čæ›č”Œå¤‡ä»½', 'bkp-retention' => 'ęœ€å¤š %1$d 份备份文件 åœØē›®ę ‡ē›®å½•.', 'bkp-next-to-delete' => 'å½“äø‹äø€ę¬”å¤‡ä»½ę—¶å°†č¢«åˆ é™¤ (see the setting "retention_count")', @@ -49,7 +49,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'bkp-status-backups-manual' => 'ę‰‹åŠØå¤‡ä»½', 'bkp-status-backups-none' => 'å°šęœŖå¼€å§‹å¤‡ä»½', 'bkp-next-backup' => 'äø‹äø€ę¬”å¤‡ä»½å°†å‘ē”ŸåœØ %1$s (%2$s) ēš„ %3$s', - 'bkp-next-backup-unknown' => 'The next backup is not scheduled yet.~~', + 'bkp-next-backup-unknown' => 'äø‹äø€ę¬”å¤‡ä»½å°šęœŖč¢«č®”åˆ’.', 'bkp-button-backup-now' => 'ē«‹å³å¤‡ä»½!', 'bkp-button-restore-now' => 'čæ˜åŽŸ!', 'bkp-confirm-backup' => 'čÆ·ē”®č®¤ę˜Æå¦ē«‹å³å¼€å§‹å¤‡ä»½.', diff --git a/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php b/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php index b76026964..365ea8d30 100644 --- a/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php +++ b/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php @@ -91,9 +91,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:FunctionalCI/Attribute:providercontracts_list' => 'ä¾›åŗ”å•†åˆåŒ', - 'Class:FunctionalCI/Attribute:providercontracts_list+' => 'čÆ„é…ē½®é”¹ēš„ę‰€ęœ‰ä¾›åŗ”å•†åˆåŒ', + 'Class:FunctionalCI/Attribute:providercontracts_list+' => 'ę­¤é…ē½®é”¹ēš„ę‰€ęœ‰ä¾›åŗ”å•†åˆåŒ', 'Class:FunctionalCI/Attribute:services_list' => 'ęœåŠ”', - 'Class:FunctionalCI/Attribute:services_list+' => 'čÆ„é…ē½®é”¹å½±å“ēš„ę‰€ęœ‰ęœåŠ”', + 'Class:FunctionalCI/Attribute:services_list+' => 'ę­¤é…ē½®é”¹å½±å“ēš„ę‰€ęœ‰ęœåŠ”', 'Class:FunctionalCI/Attribute:tickets_list' => '巄单', - 'Class:FunctionalCI/Attribute:tickets_list+' => 'čÆ„é…ē½®é”¹åŒ…å«ēš„ę‰€ęœ‰å·„å•', + 'Class:FunctionalCI/Attribute:tickets_list+' => 'ę­¤é…ē½®é”¹åŒ…å«ēš„ę‰€ęœ‰å·„å•', )); diff --git a/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php b/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php index c674a35d5..226cd808c 100644 --- a/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php +++ b/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php @@ -125,13 +125,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Change/Attribute:parent_name' => 'å˜ę›“ē¼–å·', 'Class:Change/Attribute:parent_name+' => '', 'Class:Change/Attribute:related_request_list' => 'ē›øå…³éœ€ę±‚', - 'Class:Change/Attribute:related_request_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰ē”Øęˆ·éœ€ę±‚', + 'Class:Change/Attribute:related_request_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰ē”Øęˆ·éœ€ę±‚', 'Class:Change/Attribute:related_problems_list' => 'ē›øå…³é—®é¢˜', - 'Class:Change/Attribute:related_problems_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰é—®é¢˜', + 'Class:Change/Attribute:related_problems_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰é—®é¢˜', 'Class:Change/Attribute:related_incident_list' => '相关事件', - 'Class:Change/Attribute:related_incident_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰äŗ‹ä»¶', + 'Class:Change/Attribute:related_incident_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰äŗ‹ä»¶', 'Class:Change/Attribute:child_changes_list' => 'å­å˜ę›“', - 'Class:Change/Attribute:child_changes_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„å­—å˜ę›“', + 'Class:Change/Attribute:child_changes_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„å­—å˜ę›“', 'Class:Change/Attribute:parent_id_friendlyname' => 'ēˆ¶ēŗ§å˜ę›“ę˜µē§°', 'Class:Change/Attribute:parent_id_friendlyname+' => '', 'Class:Change/Attribute:parent_id_finalclass_recall' => 'å˜ę›“ē±»åž‹', diff --git a/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php b/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php index 09c552bf2..dfc38f83b 100644 --- a/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php +++ b/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php @@ -109,13 +109,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Change/Attribute:fallback_plan' => 'å›žę»šč®”åˆ’', 'Class:Change/Attribute:fallback_plan+' => '', 'Class:Change/Attribute:related_request_list' => 'ē›øå…³éœ€ę±‚', - 'Class:Change/Attribute:related_request_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰ē”Øęˆ·éœ€ę±‚', + 'Class:Change/Attribute:related_request_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰ē”Øęˆ·éœ€ę±‚', 'Class:Change/Attribute:related_incident_list' => '相关事件', - 'Class:Change/Attribute:related_incident_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰äŗ‹ä»¶', + 'Class:Change/Attribute:related_incident_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰äŗ‹ä»¶', 'Class:Change/Attribute:related_problems_list' => 'ē›øå…³é—®é¢˜', - 'Class:Change/Attribute:related_problems_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰é—®é¢˜', + 'Class:Change/Attribute:related_problems_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰é—®é¢˜', 'Class:Change/Attribute:child_changes_list' => 'å­å˜ę›“', - 'Class:Change/Attribute:child_changes_list+' => 'čÆ„å˜ę›“ē›øå…³ēš„ę‰€ęœ‰å­å˜ę›“', + 'Class:Change/Attribute:child_changes_list+' => 'ę­¤å˜ę›“ē›øå…³ēš„ę‰€ęœ‰å­å˜ę›“', 'Class:Change/Attribute:parent_id_friendlyname' => 'ēˆ¶ēŗ§å˜ę›“ę˜µē§°', 'Class:Change/Attribute:parent_id_friendlyname+' => '', 'Class:Change/Stimulus:ev_assign' => '分配', diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php index eb9177d51..b9b97c278 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php @@ -29,12 +29,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Relation:impacts/DownStream' => '影响...', 'Relation:impacts/DownStream+' => 'č¢«å½±å“ēš„å…ƒē“ ', 'Relation:impacts/UpStream' => 'ä¾čµ–äŗŽ...', - 'Relation:impacts/UpStream+' => 'čÆ„å…ƒē“ ä¾čµ–ēš„å…ƒē“ ...', + 'Relation:impacts/UpStream+' => 'ę­¤å…ƒē“ ä¾čµ–ēš„å…ƒē“ ...', // Legacy entries - 'Relation:depends on/Description' => 'čÆ„å…ƒē“ ä¾čµ–ēš„å…ƒē“ ...', + 'Relation:depends on/Description' => 'ę­¤å…ƒē“ ä¾čµ–ēš„å…ƒē“ ...', 'Relation:depends on/DownStream' => 'ä¾čµ–äŗŽ...', 'Relation:depends on/UpStream' => '影响...', - 'Relation:impacts/LoadData' => 'Load data~~', + 'Relation:impacts/LoadData' => 'åŠ č½½ę•°ę®', 'Relation:impacts/NoFilteredData' => 'please select objects in Graphical view tag~~', )); @@ -81,7 +81,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkContactToFunctionalCI' => 'é“¾ęŽ„ 联系人 / 功能锹', + 'Class:lnkContactToFunctionalCI' => '关联 联系人/功能锹', 'Class:lnkContactToFunctionalCI+' => '', 'Class:lnkContactToFunctionalCI/Attribute:functionalci_id' => '功能锹', 'Class:lnkContactToFunctionalCI/Attribute:functionalci_id+' => '', @@ -119,13 +119,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:FunctionalCI/Attribute:move2production' => 'ęŠ•äŗ§ę—„ęœŸ', 'Class:FunctionalCI/Attribute:move2production+' => '', 'Class:FunctionalCI/Attribute:contacts_list' => '联系人', - 'Class:FunctionalCI/Attribute:contacts_list+' => 'čÆ„é…ē½®é”¹ēš„ę‰€ęœ‰č”ē³»äŗŗ', + 'Class:FunctionalCI/Attribute:contacts_list+' => 'ę­¤é…ē½®é”¹ēš„ę‰€ęœ‰č”ē³»äŗŗ', 'Class:FunctionalCI/Attribute:documents_list' => '文攣', - 'Class:FunctionalCI/Attribute:documents_list+' => 'čÆ„é…ē½®é”¹å…³č”ēš„ę‰€ęœ‰ę–‡ę”£', + 'Class:FunctionalCI/Attribute:documents_list+' => 'ę­¤é…ē½®é”¹å…³č”ēš„ę‰€ęœ‰ę–‡ę”£', 'Class:FunctionalCI/Attribute:applicationsolution_list' => 'åŗ”ē”Øę–¹ę”ˆ', - 'Class:FunctionalCI/Attribute:applicationsolution_list+' => 'čÆ„é…ē½®é”¹ä¾čµ–ēš„ę‰€ęœ‰åŗ”ē”Øę–¹ę”ˆ', + 'Class:FunctionalCI/Attribute:applicationsolution_list+' => 'ę­¤é…ē½®é”¹ä¾čµ–ēš„ę‰€ęœ‰åŗ”ē”Øę–¹ę”ˆ', 'Class:FunctionalCI/Attribute:softwares_list' => '软件', - 'Class:FunctionalCI/Attribute:softwares_list+' => 'čÆ„é…ē½®é”¹äøŠå·²å®‰č£…ēš„ę‰€ęœ‰č½Æä»¶', + 'Class:FunctionalCI/Attribute:softwares_list+' => 'ę­¤é…ē½®é”¹äøŠå·²å®‰č£…ēš„ę‰€ęœ‰č½Æä»¶', 'Class:FunctionalCI/Attribute:finalclass' => 'äŗŒēŗ§é…ē½®é”¹', 'Class:FunctionalCI/Attribute:finalclass+' => 'Name of the final class', 'Class:FunctionalCI/Tab:OpenedTickets' => 'ę“»č·ƒēš„å·„å•', @@ -180,9 +180,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Rack/Attribute:nb_u' => '机柜高度', 'Class:Rack/Attribute:nb_u+' => '', 'Class:Rack/Attribute:device_list' => '设备', - 'Class:Rack/Attribute:device_list+' => 'čÆ„ęœŗęŸœę‰˜ē®”ēš„ę‰€ęœ‰ē‰©ē†č®¾å¤‡', + 'Class:Rack/Attribute:device_list+' => 'ę­¤ęœŗęŸœę‰˜ē®”ēš„ę‰€ęœ‰ē‰©ē†č®¾å¤‡', 'Class:Rack/Attribute:enclosure_list' => 'ęœŗä½', - 'Class:Rack/Attribute:enclosure_list+' => 'čÆ„ęœŗęŸœäøŠēš„ę‰€ęœ‰ęœŗä½', + 'Class:Rack/Attribute:enclosure_list+' => 'ę­¤ęœŗęŸœäøŠēš„ę‰€ęœ‰ęœŗä½', )); // @@ -190,7 +190,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:TelephonyCI' => 'Telephony CI', + 'Class:TelephonyCI' => 'ē”µč®Æé…ē½®é”¹', 'Class:TelephonyCI+' => '', 'Class:TelephonyCI/Attribute:phonenumber' => 'ē”µčÆå·ē ', 'Class:TelephonyCI/Attribute:phonenumber+' => '', @@ -270,20 +270,20 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:DatacenterDevice/Attribute:managementip+' => '', 'Class:DatacenterDevice/Attribute:powerA_id' => '电源A', 'Class:DatacenterDevice/Attribute:powerA_id+' => '', - 'Class:DatacenterDevice/Attribute:powerA_name' => 'PowerA source name', + 'Class:DatacenterDevice/Attribute:powerA_name' => '电源Aåē§°', 'Class:DatacenterDevice/Attribute:powerA_name+' => '', 'Class:DatacenterDevice/Attribute:powerB_id' => '电源B', 'Class:DatacenterDevice/Attribute:powerB_id+' => '', - 'Class:DatacenterDevice/Attribute:powerB_name' => 'PowerB source name', + 'Class:DatacenterDevice/Attribute:powerB_name' => '电源Båē§°', 'Class:DatacenterDevice/Attribute:powerB_name+' => '', 'Class:DatacenterDevice/Attribute:fiberinterfacelist_list' => 'å…‰ēŗ¤ē«Æå£', - 'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => 'čÆ„č®¾å¤‡ēš„ę‰€ęœ‰å…‰ēŗ¤ē«Æå£', + 'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => 'ę­¤č®¾å¤‡ēš„ę‰€ęœ‰å…‰ēŗ¤ē«Æå£', 'Class:DatacenterDevice/Attribute:san_list' => 'SANs', - 'Class:DatacenterDevice/Attribute:san_list+' => 'ę‰€ęœ‰čæžęŽ„åˆ°čæ™å°č®¾å¤‡ēš„SAN äŗ¤ę¢ęœŗ', + 'Class:DatacenterDevice/Attribute:san_list+' => 'ę‰€ęœ‰čæžęŽ„åˆ°čæ™å°č®¾å¤‡ēš„SANäŗ¤ę¢ęœŗ', 'Class:DatacenterDevice/Attribute:redundancy' => '冗余', - 'Class:DatacenterDevice/Attribute:redundancy/count' => 'čÆ„č®¾å¤‡čæč”Œę­£åøøč‡³å°‘éœ€č¦äø€č·Æē”µęŗ (A ꈖ B)', + 'Class:DatacenterDevice/Attribute:redundancy/count' => 'ę­¤č®¾å¤‡čæč”Œę­£åøøč‡³å°‘éœ€č¦äø€č·Æē”µęŗ (A ꈖ B)', // Unused yet - 'Class:DatacenterDevice/Attribute:redundancy/disabled' => 'ę‰€ęœ‰ē”µęŗę­£åøø,čÆ„č®¾å¤‡ę‰ę­£åøø', + 'Class:DatacenterDevice/Attribute:redundancy/disabled' => 'ę‰€ęœ‰ē”µęŗę­£åøø,ę­¤č®¾å¤‡ę‰ę­£åøø', 'Class:DatacenterDevice/Attribute:redundancy/percent' => '至少 %1$s %% 路电源正常,č®¾å¤‡ę‰ę­£åøø', )); @@ -299,10 +299,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:NetworkDevice/Attribute:networkdevicetype_name' => 'ē½‘ē»œč®¾å¤‡ē±»åž‹åē§°', 'Class:NetworkDevice/Attribute:networkdevicetype_name+' => '', 'Class:NetworkDevice/Attribute:connectablecis_list' => '设备', - 'Class:NetworkDevice/Attribute:connectablecis_list+' => 'čæžęŽ„åˆ°čÆ„ē½‘ē»œč®¾å¤‡ēš„ę‰€ęœ‰č®¾å¤‡', - 'Class:NetworkDevice/Attribute:iosversion_id' => 'IOS ē‰ˆęœ¬', + 'Class:NetworkDevice/Attribute:connectablecis_list+' => 'čæžęŽ„åˆ°ę­¤ē½‘ē»œč®¾å¤‡ēš„ę‰€ęœ‰č®¾å¤‡', + 'Class:NetworkDevice/Attribute:iosversion_id' => 'IOSē‰ˆęœ¬', 'Class:NetworkDevice/Attribute:iosversion_id+' => '', - 'Class:NetworkDevice/Attribute:iosversion_name' => 'IOS ē‰ˆęœ¬åē§°', + 'Class:NetworkDevice/Attribute:iosversion_name' => 'IOSē‰ˆęœ¬åē§°', 'Class:NetworkDevice/Attribute:iosversion_name+' => '', 'Class:NetworkDevice/Attribute:ram' => '内存', 'Class:NetworkDevice/Attribute:ram+' => '', @@ -332,7 +332,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Server/Attribute:ram' => '内存', 'Class:Server/Attribute:ram+' => '', 'Class:Server/Attribute:logicalvolumes_list' => 'é€»č¾‘å·', - 'Class:Server/Attribute:logicalvolumes_list+' => 'čæžęŽ„åˆ°čÆ„ęœåŠ”å™Øēš„ę‰€ęœ‰é€»č¾‘å·', + 'Class:Server/Attribute:logicalvolumes_list+' => 'čæžęŽ„åˆ°ę­¤ęœåŠ”å™Øēš„ę‰€ęœ‰é€»č¾‘å·', )); // @@ -343,7 +343,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:StorageSystem' => 'å­˜å‚Øē³»ē»Ÿ', 'Class:StorageSystem+' => '', 'Class:StorageSystem/Attribute:logicalvolume_list' => 'é€»č¾‘å·', - 'Class:StorageSystem/Attribute:logicalvolume_list+' => 'čÆ„å­˜å‚Øē³»ē»ŸåŒ…å«ēš„ę‰€ęœ‰é€»č¾‘å·', + 'Class:StorageSystem/Attribute:logicalvolume_list+' => 'ę­¤å­˜å‚Øē³»ē»ŸåŒ…å«ēš„ę‰€ęœ‰é€»č¾‘å·', )); // @@ -351,10 +351,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:SANSwitch' => 'SAN äŗ¤ę¢ęœŗ', + 'Class:SANSwitch' => 'SANäŗ¤ę¢ęœŗ', 'Class:SANSwitch+' => '', 'Class:SANSwitch/Attribute:datacenterdevice_list' => '设备', - 'Class:SANSwitch/Attribute:datacenterdevice_list+' => 'čæžęŽ„åˆ°čÆ„SAN äŗ¤ę¢ęœŗēš„ę‰€ęœ‰č®¾å¤‡', + 'Class:SANSwitch/Attribute:datacenterdevice_list+' => 'čæžęŽ„åˆ°ę­¤SANäŗ¤ę¢ęœŗēš„ę‰€ęœ‰č®¾å¤‡', )); // @@ -365,7 +365,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:TapeLibrary' => '磁带库', 'Class:TapeLibrary+' => '', 'Class:TapeLibrary/Attribute:tapes_list' => '磁带', - 'Class:TapeLibrary/Attribute:tapes_list+' => 'čÆ„ē£åø¦åŗ“é‡Œēš„ę‰€ęœ‰ē£åø¦', + 'Class:TapeLibrary/Attribute:tapes_list+' => 'ę­¤ē£åø¦åŗ“é‡Œēš„ę‰€ęœ‰ē£åø¦', )); // @@ -376,7 +376,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:NAS' => 'NAS', 'Class:NAS+' => '', 'Class:NAS/Attribute:nasfilesystem_list' => 'ę–‡ä»¶ē³»ē»Ÿ', - 'Class:NAS/Attribute:nasfilesystem_list+' => '评NAS é‡Œēš„ę‰€ęœ‰ę–‡ä»¶ē³»ē»Ÿ', + 'Class:NAS/Attribute:nasfilesystem_list+' => 'ę­¤NASé‡Œēš„ę‰€ęœ‰ę–‡ä»¶ē³»ē»Ÿ', )); // @@ -432,7 +432,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:PowerSource' => '电源', 'Class:PowerSource+' => '', 'Class:PowerSource/Attribute:pdus_list' => 'PDU', - 'Class:PowerSource/Attribute:pdus_list+' => 'ä½æē”ØčÆ„ē”µęŗēš„ę‰€ęœ‰PDU', + 'Class:PowerSource/Attribute:pdus_list+' => 'ä½æē”Øę­¤ē”µęŗēš„ę‰€ęœ‰PDU', )); // @@ -475,7 +475,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Enclosure/Attribute:nb_u' => '高度', 'Class:Enclosure/Attribute:nb_u+' => '', 'Class:Enclosure/Attribute:device_list' => '设备', - 'Class:Enclosure/Attribute:device_list+' => 'čÆ„ęœŗä½ēš„ę‰€ęœ‰č®¾å¤‡', + 'Class:Enclosure/Attribute:device_list+' => 'ę­¤ęœŗä½ēš„ę‰€ęœ‰č®¾å¤‡', )); // @@ -486,9 +486,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:ApplicationSolution' => 'åŗ”ē”Øę–¹ę”ˆ', 'Class:ApplicationSolution+' => '', 'Class:ApplicationSolution/Attribute:functionalcis_list' => 'é…ē½®é”¹', - 'Class:ApplicationSolution/Attribute:functionalcis_list+' => 'čÆ„åŗ”ē”Øę–¹ę”ˆåŒ…å«ēš„ę‰€ęœ‰é…ē½®é”¹', + 'Class:ApplicationSolution/Attribute:functionalcis_list+' => 'ę­¤åŗ”ē”Øę–¹ę”ˆåŒ…å«ēš„ę‰€ęœ‰é…ē½®é”¹', 'Class:ApplicationSolution/Attribute:businessprocess_list' => 'äøšåŠ”ęµēØ‹', - 'Class:ApplicationSolution/Attribute:businessprocess_list+' => 'ę‰€ęœ‰ä¾čµ–čÆ„åŗ”ē”Øę–¹ę”ˆēš„äøšåŠ”ęµēØ‹', + 'Class:ApplicationSolution/Attribute:businessprocess_list+' => 'ę‰€ęœ‰ä¾čµ–ę­¤åŗ”ē”Øę–¹ę”ˆēš„äøšåŠ”ęµēØ‹', 'Class:ApplicationSolution/Attribute:status' => 'ēŠ¶ę€', 'Class:ApplicationSolution/Attribute:status+' => '', 'Class:ApplicationSolution/Attribute:status/Value:active' => '启用', @@ -496,9 +496,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:ApplicationSolution/Attribute:status/Value:inactive' => 'åœē”Ø', 'Class:ApplicationSolution/Attribute:status/Value:inactive+' => 'åœē”Ø', 'Class:ApplicationSolution/Attribute:redundancy' => 'å½±å“åˆ†ęž: å†—ä½™é…ē½®', - 'Class:ApplicationSolution/Attribute:redundancy/disabled' => 'The solution is up if all CIs are up', - 'Class:ApplicationSolution/Attribute:redundancy/count' => 'The solution is up if at least %1$s CI(s) is(are) up', - 'Class:ApplicationSolution/Attribute:redundancy/percent' => 'The solution is up if at least %1$s %% of the CIs are up', + 'Class:ApplicationSolution/Attribute:redundancy/disabled' => 'ę‰€ęœ‰é…ē½®é”¹ę­£åøø,ę­¤åŗ”ē”Øę–¹ę”ˆę‰ę­£åøø', + 'Class:ApplicationSolution/Attribute:redundancy/count' => '至少 %1$s äøŖé…ē½®é”¹ę­£åøøę—¶ę­¤åŗ”ē”Øę–¹ę”ˆę‰ę­£åøø', + 'Class:ApplicationSolution/Attribute:redundancy/percent' => '至少 %1$s %% ēš„é…ē½®é”¹ę­£åøø,ę­¤åŗ”ē”Øę–¹ę”ˆę‰ę­£åøø', )); // @@ -509,7 +509,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:BusinessProcess' => 'äøšåŠ”ęµēØ‹', 'Class:BusinessProcess+' => '', 'Class:BusinessProcess/Attribute:applicationsolutions_list' => 'åŗ”ē”Øę–¹ę”ˆ', - 'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'ę‰€ęœ‰å½±å“čÆ„äøšåŠ”ęµēØ‹ēš„åŗ”ē”Øę–¹ę”ˆ', + 'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'ę‰€ęœ‰å½±å“ę­¤äøšåŠ”ęµēØ‹ēš„åŗ”ē”Øę–¹ę”ˆ', 'Class:BusinessProcess/Attribute:status' => 'ēŠ¶ę€', 'Class:BusinessProcess/Attribute:status+' => '', 'Class:BusinessProcess/Attribute:status/Value:active' => '启用', @@ -555,7 +555,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Middleware' => 'äø­é—“ä»¶', 'Class:Middleware+' => '', 'Class:Middleware/Attribute:middlewareinstance_list' => 'äø­é—“ä»¶å®žä¾‹', - 'Class:Middleware/Attribute:middlewareinstance_list+' => 'čÆ„äø­é—“ä»¶ēš„ę‰€ęœ‰å®žä¾‹', + 'Class:Middleware/Attribute:middlewareinstance_list+' => 'ę­¤äø­é—“ä»¶ēš„ę‰€ęœ‰å®žä¾‹', )); // @@ -566,7 +566,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:DBServer' => 'ę•°ę®åŗ“ęœåŠ”å™Ø', 'Class:DBServer+' => '', 'Class:DBServer/Attribute:dbschema_list' => 'ę•°ę®åŗ“', - 'Class:DBServer/Attribute:dbschema_list+' => 'čÆ„ę•°ę®åŗ“ęœåŠ”å™ØäøŠēš„ę‰€ęœ‰ę•°ę®åŗ“ęž¶ęž„', + 'Class:DBServer/Attribute:dbschema_list+' => 'ę­¤ę•°ę®åŗ“ęœåŠ”å™ØäøŠēš„ę‰€ęœ‰ę•°ę®åŗ“ęž¶ęž„', )); // @@ -577,7 +577,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:WebServer' => 'Web ęœåŠ”å™Ø', 'Class:WebServer+' => '', 'Class:WebServer/Attribute:webapp_list' => 'Web 应用', - 'Class:WebServer/Attribute:webapp_list+' => '评web ęœåŠ”å™ØäøŠēš„ę‰€ęœ‰web 应用', + 'Class:WebServer/Attribute:webapp_list+' => 'ę­¤web ęœåŠ”å™ØäøŠēš„ę‰€ęœ‰web 应用', )); // @@ -658,7 +658,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:VirtualDevice/Attribute:status/Value:stock' => 'åŗ“å­˜', 'Class:VirtualDevice/Attribute:status/Value:stock+' => 'åŗ“å­˜', 'Class:VirtualDevice/Attribute:logicalvolumes_list' => 'é€»č¾‘å·', - 'Class:VirtualDevice/Attribute:logicalvolumes_list+' => 'čÆ„č®¾å¤‡ä½æē”Øēš„ę‰€ęœ‰é€»č¾‘å·', + 'Class:VirtualDevice/Attribute:logicalvolumes_list+' => 'ę­¤č®¾å¤‡ä½æē”Øēš„ę‰€ęœ‰é€»č¾‘å·', )); // @@ -669,7 +669,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:VirtualHost' => '宿主机', 'Class:VirtualHost+' => '', 'Class:VirtualHost/Attribute:virtualmachine_list' => 'č™šę‹Ÿęœŗ', - 'Class:VirtualHost/Attribute:virtualmachine_list+' => 'čÆ„å®æäø»ęœŗę‰˜ē®”ēš„ę‰€ęœ‰č™šę‹Ÿęœŗ', + 'Class:VirtualHost/Attribute:virtualmachine_list+' => 'ę­¤å®æäø»ęœŗę‰˜ē®”ēš„ę‰€ęœ‰č™šę‹Ÿęœŗ', )); // @@ -759,9 +759,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:LogicalVolume/Attribute:storagesystem_name' => 'åē§°', 'Class:LogicalVolume/Attribute:storagesystem_name+' => '', 'Class:LogicalVolume/Attribute:servers_list' => 'ęœåŠ”å™Ø', - 'Class:LogicalVolume/Attribute:servers_list+' => 'ä½æē”ØčÆ„é€»č¾‘å·ēš„ęœåŠ”å™Ø', + 'Class:LogicalVolume/Attribute:servers_list+' => 'ä½æē”Øę­¤é€»č¾‘å·ēš„ęœåŠ”å™Ø', 'Class:LogicalVolume/Attribute:virtualdevices_list' => 'č™šę‹Ÿč®¾å¤‡', - 'Class:LogicalVolume/Attribute:virtualdevices_list+' => 'ä½æē”ØčÆ„é€»č¾‘å·ēš„ę‰€ęœ‰č™šę‹Ÿč®¾å¤‡', + 'Class:LogicalVolume/Attribute:virtualdevices_list+' => 'ä½æē”Øę­¤é€»č¾‘å·ēš„ę‰€ęœ‰č™šę‹Ÿč®¾å¤‡', )); // @@ -769,7 +769,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkServerToVolume' => 'é“¾ęŽ„ ęœåŠ”å™Ø / é€»č¾‘å·', + 'Class:lnkServerToVolume' => '关联 ęœåŠ”å™Ø/é€»č¾‘å·', 'Class:lnkServerToVolume+' => '', 'Class:lnkServerToVolume/Attribute:volume_id' => 'é€»č¾‘å·', 'Class:lnkServerToVolume/Attribute:volume_id+' => '', @@ -788,7 +788,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkVirtualDeviceToVolume' => 'é“¾ęŽ„ č™šę‹Ÿč®¾å¤‡ / é€»č¾‘å·', + 'Class:lnkVirtualDeviceToVolume' => '关联 č™šę‹Ÿč®¾å¤‡/é€»č¾‘å·', 'Class:lnkVirtualDeviceToVolume+' => '', 'Class:lnkVirtualDeviceToVolume/Attribute:volume_id' => 'é€»č¾‘å·', 'Class:lnkVirtualDeviceToVolume/Attribute:volume_id+' => '', @@ -807,7 +807,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkSanToDatacenterDevice' => 'é“¾ęŽ„ SAN / ę•°ę®äø­åæƒč®¾å¤‡', + 'Class:lnkSanToDatacenterDevice' => '关联 SAN/ę•°ę®äø­åæƒč®¾å¤‡', 'Class:lnkSanToDatacenterDevice+' => '', 'Class:lnkSanToDatacenterDevice/Attribute:san_id' => 'SAN äŗ¤ę¢ęœŗ', 'Class:lnkSanToDatacenterDevice/Attribute:san_id+' => '', @@ -877,7 +877,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Software/Attribute:version' => 'ē‰ˆęœ¬', 'Class:Software/Attribute:version+' => '', 'Class:Software/Attribute:documents_list' => '文攣', - 'Class:Software/Attribute:documents_list+' => 'čÆ„č½Æä»¶ēš„ę‰€ęœ‰ę–‡ę”£', + 'Class:Software/Attribute:documents_list+' => 'ę­¤č½Æä»¶ēš„ę‰€ęœ‰ę–‡ę”£', 'Class:Software/Attribute:type' => 'ē±»åž‹', 'Class:Software/Attribute:type+' => '', 'Class:Software/Attribute:type/Value:DBServer' => 'ę•°ę®åŗ“ęœåŠ”å™Ø', @@ -891,11 +891,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Software/Attribute:type/Value:WebServer' => 'Web ęœåŠ”å™Ø', 'Class:Software/Attribute:type/Value:WebServer+' => 'Web ęœåŠ”å™Ø', 'Class:Software/Attribute:softwareinstance_list' => 'č½Æä»¶å®žä¾‹', - 'Class:Software/Attribute:softwareinstance_list+' => 'čÆ„č½Æä»¶ēš„ę‰€ęœ‰å®žä¾‹', + 'Class:Software/Attribute:softwareinstance_list+' => 'ę­¤č½Æä»¶ēš„ę‰€ęœ‰å®žä¾‹', 'Class:Software/Attribute:softwarepatch_list' => '软件蔄丁', - 'Class:Software/Attribute:softwarepatch_list+' => 'čÆ„č½Æä»¶ēš„ę‰€ęœ‰č”„äø', + 'Class:Software/Attribute:softwarepatch_list+' => 'ę­¤č½Æä»¶ēš„ę‰€ęœ‰č”„äø', 'Class:Software/Attribute:softwarelicence_list' => 'č½Æä»¶č®øåÆčÆ', - 'Class:Software/Attribute:softwarelicence_list+' => 'čÆ„č½Æä»¶ēš„ę‰€ęœ‰č®øåÆčÆ', + 'Class:Software/Attribute:softwarelicence_list+' => 'ę­¤č½Æä»¶ēš„ę‰€ęœ‰č®øåÆčÆ', )); // @@ -908,7 +908,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Patch/Attribute:name' => 'åē§°', 'Class:Patch/Attribute:name+' => '', 'Class:Patch/Attribute:documents_list' => '文攣', - 'Class:Patch/Attribute:documents_list+' => 'čÆ„č”„äøå…³č”ēš„ę‰€ęœ‰ę–‡ę”£', + 'Class:Patch/Attribute:documents_list+' => 'ę­¤č”„äøå…³č”ēš„ę‰€ęœ‰ę–‡ę”£', 'Class:Patch/Attribute:description' => 'ęčæ°', 'Class:Patch/Attribute:description+' => '', 'Class:Patch/Attribute:finalclass' => '蔄丁子类别', @@ -923,7 +923,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:OSPatch' => 'ę“ä½œē³»ē»Ÿč”„äø', 'Class:OSPatch+' => '', 'Class:OSPatch/Attribute:functionalcis_list' => '设备', - 'Class:OSPatch/Attribute:functionalcis_list+' => 'å·²å®‰č£…čÆ„č”„äøēš„ę‰€ęœ‰ē³»ē»Ÿ', + 'Class:OSPatch/Attribute:functionalcis_list+' => 'å·²å®‰č£…ę­¤č”„äøēš„ę‰€ęœ‰ē³»ē»Ÿ', 'Class:OSPatch/Attribute:osversion_id' => 'ę“ä½œē³»ē»Ÿē‰ˆęœ¬', 'Class:OSPatch/Attribute:osversion_id+' => '', 'Class:OSPatch/Attribute:osversion_name' => 'åē§°', @@ -942,7 +942,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:SoftwarePatch/Attribute:software_name' => 'åē§°', 'Class:SoftwarePatch/Attribute:software_name+' => '', 'Class:SoftwarePatch/Attribute:softwareinstances_list' => 'č½Æä»¶å®žä¾‹', - 'Class:SoftwarePatch/Attribute:softwareinstances_list+' => 'å·²å®‰č£…čÆ„č½Æä»¶č”„äøēš„ę‰€ęœ‰ē³»ē»Ÿ', + 'Class:SoftwarePatch/Attribute:softwareinstances_list+' => 'å·²å®‰č£…ę­¤č½Æä»¶č”„äøēš„ę‰€ęœ‰ē³»ē»Ÿ', )); // @@ -955,7 +955,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Licence/Attribute:name' => 'åē§°', 'Class:Licence/Attribute:name+' => '', 'Class:Licence/Attribute:documents_list' => '文攣', - 'Class:Licence/Attribute:documents_list+' => 'čÆ„č®øåÆčÆå…³č”ēš„ę‰€ęœ‰ę–‡ę”£', + 'Class:Licence/Attribute:documents_list+' => 'ę­¤č®øåÆčÆå…³č”ēš„ę‰€ęœ‰ę–‡ę”£', 'Class:Licence/Attribute:org_id' => '组织', 'Class:Licence/Attribute:org_id+' => '', 'Class:Licence/Attribute:organization_name' => 'ē»„ē»‡åē§°', @@ -992,9 +992,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:OSLicence/Attribute:osversion_name' => 'åē§°', 'Class:OSLicence/Attribute:osversion_name+' => '', 'Class:OSLicence/Attribute:virtualmachines_list' => 'č™šę‹Ÿęœŗ', - 'Class:OSLicence/Attribute:virtualmachines_list+' => 'ä½æē”ØčÆ„č®øåÆčÆēš„ę‰€ęœ‰č™šę‹Ÿęœŗ', + 'Class:OSLicence/Attribute:virtualmachines_list+' => 'ä½æē”Øę­¤č®øåÆčÆēš„ę‰€ęœ‰č™šę‹Ÿęœŗ', 'Class:OSLicence/Attribute:servers_list' => 'ęœåŠ”å™Ø', - 'Class:OSLicence/Attribute:servers_list+' => 'ä½æē”ØčÆ„č®øåÆčÆēš„ę‰€ęœ‰ęœåŠ”å™Ø', + 'Class:OSLicence/Attribute:servers_list+' => 'ä½æē”Øę­¤č®øåÆčÆēš„ę‰€ęœ‰ęœåŠ”å™Ø', )); // @@ -1009,7 +1009,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:SoftwareLicence/Attribute:software_name' => 'åē§°', 'Class:SoftwareLicence/Attribute:software_name+' => '', 'Class:SoftwareLicence/Attribute:softwareinstance_list' => 'č½Æä»¶å®žä¾‹', - 'Class:SoftwareLicence/Attribute:softwareinstance_list+' => 'ä½æē”ØčÆ„č®øåÆčÆēš„ę‰€ęœ‰ē³»ē»Ÿ', + 'Class:SoftwareLicence/Attribute:softwareinstance_list+' => 'ä½æē”Øę­¤č®øåÆčÆēš„ę‰€ęœ‰ē³»ē»Ÿ', )); // @@ -1017,7 +1017,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkDocumentToLicence' => 'é“¾ęŽ„ 文攣 / č®øåÆčÆ', + 'Class:lnkDocumentToLicence' => '关联 文攣/č®øåÆčÆ', 'Class:lnkDocumentToLicence+' => '', 'Class:lnkDocumentToLicence/Attribute:licence_id' => 'č®øåÆčÆ', 'Class:lnkDocumentToLicence/Attribute:licence_id+' => '', @@ -1059,9 +1059,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Brand' => 'å“ē‰Œ', 'Class:Brand+' => '', 'Class:Brand/Attribute:physicaldevices_list' => '物理设备', - 'Class:Brand/Attribute:physicaldevices_list+' => 'čÆ„å“ē‰Œēš„ę‰€ęœ‰ē‰©ē†č®¾å¤‡', + 'Class:Brand/Attribute:physicaldevices_list+' => 'ę­¤å“ē‰Œēš„ę‰€ęœ‰ē‰©ē†č®¾å¤‡', 'Class:Brand/UniquenessRule:name+' => 'åē§°åæ…é”»å”Æäø€', - 'Class:Brand/UniquenessRule:name' => 'čÆ„å“ē‰Œå·²å­˜åœØ', + 'Class:Brand/UniquenessRule:name' => 'ę­¤å“ē‰Œå·²å­˜åœØ', )); // @@ -1083,8 +1083,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Model/Attribute:type/Value:DiskArray+' => 'ē£ē›˜é˜µåˆ—', 'Class:Model/Attribute:type/Value:Enclosure' => 'ęœŗä½', 'Class:Model/Attribute:type/Value:Enclosure+' => 'ęœŗä½', - 'Class:Model/Attribute:type/Value:IPPhone' => 'IP ē”µčÆ', - 'Class:Model/Attribute:type/Value:IPPhone+' => 'IP ē”µčÆ', + 'Class:Model/Attribute:type/Value:IPPhone' => 'IPē”µčÆ', + 'Class:Model/Attribute:type/Value:IPPhone+' => 'IPē”µčÆ', 'Class:Model/Attribute:type/Value:MobilePhone' => 'ē§»åŠØē”µčÆ', 'Class:Model/Attribute:type/Value:MobilePhone+' => 'ē§»åŠØē”µčÆ', 'Class:Model/Attribute:type/Value:NAS' => 'NAS', @@ -1101,10 +1101,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Model/Attribute:type/Value:Printer+' => 'ę‰“å°ęœŗ', 'Class:Model/Attribute:type/Value:Rack' => '机柜', 'Class:Model/Attribute:type/Value:Rack+' => '机柜', - 'Class:Model/Attribute:type/Value:SANSwitch' => 'SAN äŗ¤ę¢ęœŗ', - 'Class:Model/Attribute:type/Value:SANSwitch+' => 'SAN äŗ¤ę¢ęœŗ', + 'Class:Model/Attribute:type/Value:SANSwitch' => 'SANäŗ¤ę¢ęœŗ', + 'Class:Model/Attribute:type/Value:SANSwitch+' => 'SANäŗ¤ę¢ęœŗ', 'Class:Model/Attribute:type/Value:Server' => 'ęœåŠ”å™Ø', - 'Class:Model/Attribute:type/Value:Server+' => 'Server', + 'Class:Model/Attribute:type/Value:Server+' => 'ęœåŠ”å™Ø', 'Class:Model/Attribute:type/Value:StorageSystem' => 'å­˜å‚Øē³»ē»Ÿ', 'Class:Model/Attribute:type/Value:StorageSystem+' => 'å­˜å‚Øē³»ē»Ÿ', 'Class:Model/Attribute:type/Value:Tablet' => 'å¹³ęæ', @@ -1114,9 +1114,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Model/Attribute:type/Value:Phone' => 'ē”µčÆ', 'Class:Model/Attribute:type/Value:Phone+' => 'ē”µčÆ', 'Class:Model/Attribute:physicaldevices_list' => '物理设备', - 'Class:Model/Attribute:physicaldevices_list+' => 'čÆ„åž‹å·ēš„ę‰€ęœ‰ē‰©ē†č®¾å¤‡', + 'Class:Model/Attribute:physicaldevices_list+' => 'ę­¤åž‹å·ēš„ę‰€ęœ‰ē‰©ē†č®¾å¤‡', 'Class:Model/UniquenessRule:name_brand+' => 'åē§°åæ…é”»å”Æäø€', - 'Class:Model/UniquenessRule:name_brand' => 'čÆ„åž‹å·å·²å­˜åœØ', + 'Class:Model/UniquenessRule:name_brand' => 'ę­¤åž‹å·å·²å­˜åœØ', )); // @@ -1127,7 +1127,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:NetworkDeviceType' => 'ē½‘ē»œč®¾å¤‡ē±»åž‹', 'Class:NetworkDeviceType+' => '', 'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'ē½‘ē»œč®¾å¤‡', - 'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'čÆ„ē±»åž‹ēš„ę‰€ęœ‰ē½‘ē»œč®¾å¤‡', + 'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'ę­¤ē±»åž‹ēš„ę‰€ęœ‰ē½‘ē»œč®¾å¤‡', )); // @@ -1135,7 +1135,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:IOSVersion' => 'IOS ē‰ˆęœ¬', + 'Class:IOSVersion' => 'IOSē‰ˆęœ¬', 'Class:IOSVersion+' => '', 'Class:IOSVersion/Attribute:brand_id' => 'å“ē‰Œ', 'Class:IOSVersion/Attribute:brand_id+' => '', @@ -1148,7 +1148,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkDocumentToPatch' => 'é“¾ęŽ„ 文攣 / 蔄丁', + 'Class:lnkDocumentToPatch' => '关联 文攣/蔄丁', 'Class:lnkDocumentToPatch+' => '', 'Class:lnkDocumentToPatch/Attribute:patch_id' => '蔄丁', 'Class:lnkDocumentToPatch/Attribute:patch_id+' => '', @@ -1165,7 +1165,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkSoftwareInstanceToSoftwarePatch' => 'é“¾ęŽ„ č½Æä»¶å®žä¾‹ / 软件蔄丁', + 'Class:lnkSoftwareInstanceToSoftwarePatch' => ' 关联 č½Æä»¶å®žä¾‹/软件蔄丁', 'Class:lnkSoftwareInstanceToSoftwarePatch+' => '', 'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => '软件蔄丁', 'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id+' => '', @@ -1182,7 +1182,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkFunctionalCIToOSPatch' => 'é“¾ęŽ„ 功能锹 / ę“ä½œē³»ē»Ÿč”„äø', + 'Class:lnkFunctionalCIToOSPatch' => '关联 功能锹/ę“ä½œē³»ē»Ÿč”„äø', 'Class:lnkFunctionalCIToOSPatch+' => '', 'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id' => 'ę“ä½œē³»ē»Ÿč”„äø', 'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id+' => '', @@ -1199,7 +1199,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkDocumentToSoftware' => 'é“¾ęŽ„ 文攣 / 软件', + 'Class:lnkDocumentToSoftware' => '关联 文攣/软件', 'Class:lnkDocumentToSoftware+' => '', 'Class:lnkDocumentToSoftware/Attribute:software_id' => '软件', 'Class:lnkDocumentToSoftware/Attribute:software_id+' => '', @@ -1241,7 +1241,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:VLAN' => 'VLAN', 'Class:VLAN+' => '', - 'Class:VLAN/Attribute:vlan_tag' => 'VLAN ꠇ记', + 'Class:VLAN/Attribute:vlan_tag' => 'VLANꠇ记', 'Class:VLAN/Attribute:vlan_tag+' => '', 'Class:VLAN/Attribute:description' => 'ęčæ°', 'Class:VLAN/Attribute:description+' => '', @@ -1260,7 +1260,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkSubnetToVLAN' => 'é“¾ęŽ„ 子网 / VLAN', + 'Class:lnkSubnetToVLAN' => '关联 子网/VLAN', 'Class:lnkSubnetToVLAN+' => '', 'Class:lnkSubnetToVLAN/Attribute:subnet_id' => '子网', 'Class:lnkSubnetToVLAN/Attribute:subnet_id+' => '', @@ -1292,13 +1292,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:IPInterface' => 'IP Interface', + 'Class:IPInterface' => 'IPęŽ„å£', 'Class:IPInterface+' => '', - 'Class:IPInterface/Attribute:ipaddress' => 'IP 地址', + 'Class:IPInterface/Attribute:ipaddress' => 'IP地址', 'Class:IPInterface/Attribute:ipaddress+' => '', - 'Class:IPInterface/Attribute:macaddress' => 'MAC 地址', + 'Class:IPInterface/Attribute:macaddress' => 'MAC地址', 'Class:IPInterface/Attribute:macaddress+' => '', 'Class:IPInterface/Attribute:comment' => 'ę³Øé‡Š', 'Class:IPInterface/Attribute:coment+' => '', @@ -1330,7 +1330,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkPhysicalInterfaceToVLAN' => 'é“¾ęŽ„ ē‰©ē†ē½‘å” / VLAN', + 'Class:lnkPhysicalInterfaceToVLAN' => '关联 ē‰©ē†ē½‘å”/VLAN', 'Class:lnkPhysicalInterfaceToVLAN+' => '', 'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => 'ē‰©ē†ē½‘å”', 'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id+' => '', @@ -1342,7 +1342,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_name+' => '', 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id' => 'VLAN', 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id+' => '', - 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag' => 'VLAN ꠇ记', + 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag' => 'VLANꠇ记', 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag+' => '', )); @@ -1384,7 +1384,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkConnectableCIToNetworkDevice' => 'é“¾ęŽ„ åÆčæžęŽ„é”¹ / ē½‘ē»œč®¾å¤‡', + 'Class:lnkConnectableCIToNetworkDevice' => '关联 åÆčæžęŽ„é”¹/ē½‘ē»œč®¾å¤‡', 'Class:lnkConnectableCIToNetworkDevice+' => '', 'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id' => 'ē½‘ē»œč®¾å¤‡', 'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id+' => '', @@ -1411,7 +1411,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkApplicationSolutionToFunctionalCI' => 'é“¾ęŽ„ åŗ”ē”Øę–¹ę”ˆ / 功能锹', + 'Class:lnkApplicationSolutionToFunctionalCI' => '关联 åŗ”ē”Øę–¹ę”ˆ/功能锹', 'Class:lnkApplicationSolutionToFunctionalCI+' => '', 'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id' => 'åŗ”ē”Øę–¹ę”ˆ', 'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id+' => '', @@ -1428,7 +1428,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkApplicationSolutionToBusinessProcess' => 'é“¾ęŽ„ åŗ”ē”Øę–¹ę”ˆ / äøšåŠ”ęµēØ‹', + 'Class:lnkApplicationSolutionToBusinessProcess' => '关联 åŗ”ē”Øę–¹ę”ˆ/äøšåŠ”ęµēØ‹', 'Class:lnkApplicationSolutionToBusinessProcess+' => '', 'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id' => 'äøšåŠ”ęµēØ‹', 'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id+' => '', @@ -1470,8 +1470,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Group/Attribute:parent_id+' => '', 'Class:Group/Attribute:parent_name' => 'åē§°', 'Class:Group/Attribute:parent_name+' => '', - 'Class:Group/Attribute:ci_list' => 'é“¾ęŽ„ēš„é…ē½®é”¹', - 'Class:Group/Attribute:ci_list+' => 'čÆ„ē»„å…³č”ēš„ę‰€ęœ‰é…ē½®é”¹', + 'Class:Group/Attribute:ci_list' => 'å…³č”ēš„é…ē½®é”¹', + 'Class:Group/Attribute:ci_list+' => 'ę­¤ē»„å…³č”ēš„ę‰€ęœ‰é…ē½®é”¹', 'Class:Group/Attribute:parent_id_friendlyname' => 'äøŠēŗ§é…ē½®ē»„', 'Class:Group/Attribute:parent_id_friendlyname+' => '', )); @@ -1481,7 +1481,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkGroupToCI' => 'é“¾ęŽ„ é…ē½®ē»„ / é…ē½®é”¹', + 'Class:lnkGroupToCI' => '关联 é…ē½®ē»„/é…ē½®é”¹', 'Class:lnkGroupToCI+' => '', 'Class:lnkGroupToCI/Attribute:group_id' => '组', 'Class:lnkGroupToCI/Attribute:group_id+' => '', @@ -1505,8 +1505,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Server:power' => 'ē”µåŠ›ä¾›åŗ”', 'Class:Subnet/Tab:IPUsage' => 'IP ä½æē”ØēŽ‡', 'Class:Subnet/Tab:IPUsage-explain' => 'ē½‘å”IPčŒƒå›“: %1$s 到 %2$s', - 'Class:Subnet/Tab:FreeIPs' => '空闲 IP', - 'Class:Subnet/Tab:FreeIPs-count' => '空闲 IP: %1$s', + 'Class:Subnet/Tab:FreeIPs' => '空闲IP', + 'Class:Subnet/Tab:FreeIPs-count' => '空闲IP: %1$s', 'Class:Subnet/Tab:FreeIPs-explain' => 'ä»„äø‹ę˜ÆęŠ½å–ēš„10个空闲IP', 'Class:Document:PreviewTab' => 'é¢„č§ˆ', )); @@ -1517,7 +1517,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:lnkDocumentToFunctionalCI' => 'é“¾ęŽ„ 文攣 / 功能锹', + 'Class:lnkDocumentToFunctionalCI' => '关联 文攣/功能锹', 'Class:lnkDocumentToFunctionalCI+' => '', 'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => '功能锹', 'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id+' => '', @@ -1574,7 +1574,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Menu:ConfigManagement:Misc' => 'ę‚é”¹', 'Menu:Group' => 'é…ē½®ē»„', 'Menu:Group+' => 'é…ē½®ē»„', - 'Menu:OSVersion' => 'OS ē‰ˆęœ¬', + 'Menu:OSVersion' => 'OSē‰ˆęœ¬', 'Menu:OSVersion+' => '', 'Menu:Software' => 'č½Æä»¶ęø…å•', 'Menu:Software+' => 'č½Æä»¶ęø…å•', diff --git a/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php b/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php index 050bf7996..20d3e9c04 100644 --- a/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php +++ b/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php @@ -25,7 +25,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'itop-core-update:UI:SelectUpdateFile' => 'åŗ”ē”Øå‡ēŗ§', 'itop-core-update:UI:ConfirmUpdate' => ' å‡ēŗ§', 'itop-core-update:UI:UpdateCoreFiles' => 'åŗ”ē”Øå‡ēŗ§', - 'iTopUpdate:UI:MaintenanceModeActive' => 'The application is currently under maintenance, no user can access the application. You have to run a setup or restore the application archive to return in normal mode.~~', + 'iTopUpdate:UI:MaintenanceModeActive' => 'ę­¤åŗ”ē”Øå½“å‰ē»“ęŠ¤äø­,äøå…č®øä»»ä½•ē”Øęˆ·č®æé—®.åæ…é”»čæč”Œå®‰č£…ęˆ–ę¢å¤å½’ę”£ę„ä½æå…¶å¤„äŗŽę­£åøøęØ”å¼.', 'itop-core-update:UI:UpdateDone' => 'åŗ”ē”Øå‡ēŗ§', 'itop-core-update/Operation:SelectUpdateFile/Title' => 'åŗ”ē”Øå‡ēŗ§', @@ -94,15 +94,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'iTopUpdate:Error:MissingFunction' => 'ę— ę³•å¼€å§‹å‡ēŗ§, 功能缺失', 'iTopUpdate:Error:MissingFile' => '缺少文件: %1$s', 'iTopUpdate:Error:CorruptedFile' => 'ꖇ件 %1$s å·²ęŸå', - 'iTopUpdate:Error:BadFileFormat' => 'äøŠä¼ ēš„äøę˜Æzip ꖇ件', + 'iTopUpdate:Error:BadFileFormat' => 'äøŠä¼ ēš„äøę˜Æzipę ¼å¼ēš„ę–‡ä»¶', 'iTopUpdate:Error:BadFileContent' => 'å‡ēŗ§ę–‡ä»¶äøę˜ÆēØ‹åŗå‡ēŗ§åŒ…', 'iTopUpdate:Error:BadItopProduct' => 'å‡ēŗ§ę–‡ä»¶äøŽę‚Øēš„ē³»ē»Ÿäøå…¼å®¹', 'iTopUpdate:Error:Copy' => '错误, ę— ę³•å¤åˆ¶ \'%1$s\' 到 \'%2$s\'', 'iTopUpdate:Error:FileNotFound' => 'ę–‡ä»¶ę‰¾äøåˆ°', 'iTopUpdate:Error:NoFile' => 'ę²”ęœ‰ęä¾›ę–‡ä»¶', - 'iTopUpdate:Error:InvalidToken' => 'ę— ę•ˆēš„ token', + 'iTopUpdate:Error:InvalidToken' => 'ę— ę•ˆēš„token', 'iTopUpdate:Error:UpdateFailed' => 'å‡ēŗ§å¤±č“„', - 'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => 'äøŠä¼ äøŠé™å¤Ŗå°. čÆ·č°ƒę•“ PHP é…ē½®.', + 'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => 'äøŠä¼ äøŠé™å¤Ŗå°. čÆ·č°ƒę•“PHPé…ē½®.', 'iTopUpdate:UI:RestoreArchive' => 'ę‚ØåÆä»„ä»Žå½’ę”£ę–‡ä»¶ \'%1$s\' čæ˜åŽŸåŗ”ē”ØēØ‹åŗ', 'iTopUpdate:UI:RestoreBackup' => 'ę‚ØåÆä»„ä»Ž \'%1$s\' čæ˜åŽŸę•°ę®åŗ“', diff --git a/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php b/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php index 0fdf768c3..fb23d2945 100644 --- a/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php +++ b/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php @@ -62,7 +62,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:FAQ/Attribute:error_code+' => '', 'Class:FAQ/Attribute:key_words' => '关键字', 'Class:FAQ/Attribute:key_words+' => '', - 'Class:FAQ/Attribute:domains' => '领域~~', + 'Class:FAQ/Attribute:domains' => 'čŒƒå›“', )); // @@ -70,19 +70,19 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:FAQCategory' => 'FAQ 类别', - 'Class:FAQCategory+' => 'FAQ 类别', + 'Class:FAQCategory' => 'FAQ类别', + 'Class:FAQCategory+' => 'FAQ类别', 'Class:FAQCategory/Attribute:name' => 'åē§°', 'Class:FAQCategory/Attribute:name+' => '', 'Class:FAQCategory/Attribute:faq_list' => 'FAQ', - 'Class:FAQCategory/Attribute:faq_list+' => '评类别FAQ ē›øå…³ēš„ę‰€ęœ‰åøøč§é—®é¢˜', + 'Class:FAQCategory/Attribute:faq_list+' => '此类别FAQ ē›øå…³ēš„ę‰€ęœ‰åøøč§é—®é¢˜', )); Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Menu:ProblemManagement' => 'é—®é¢˜ē®”ē†', 'Menu:ProblemManagement+' => 'é—®é¢˜ē®”ē†', 'Menu:Problem:Shortcuts' => 'åæ«ę·ę–¹å¼', 'Menu:FAQCategory' => 'FAQ 类别', - 'Menu:FAQCategory+' => 'ꉀ꜉FAQ 类别', + 'Menu:FAQCategory+' => 'ꉀ꜉FAQ类别', 'Menu:FAQ' => 'FAQ', 'Menu:FAQ+' => 'ꉀ꜉FAQ', 'Brick:Portal:FAQ:Menu' => 'FAQ', diff --git a/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php b/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php index 3693ede2d..d751da9f0 100644 --- a/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php +++ b/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php @@ -24,7 +24,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Errors 'FilesInformation:Error:MissingFile' => '文件丢失: %1$s~~', 'FilesInformation:Error:CorruptedFile' => 'ꖇ件 %1$s å·²ęŸå', - 'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~', + 'FilesInformation:Error:ListCorruptedFile' => 'å·²ęŸåēš„ę–‡ä»¶: %1$s', 'FilesInformation:Error:CantWriteToFile' => 'ꖇ件 %1$s 无法写兄', )); diff --git a/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml b/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml index b28f107b7..65b2cbb12 100644 --- a/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml +++ b/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml @@ -15,12 +15,13 @@ https://www.itophub.io - /my-instances/landing-from-remote - /stateless-remote-itop/landing-from-remote-stateless - /api/messages - /api/messages/mark-all-as-read - /messages + /my-instances/landing-from-remote + /stateless-remote-itop/landing-from-remote-stateless + /api/messages + /api/messages/mark-all-as-read + /messages ../pages/exec.php?exec_module=itop-hub-connector&exec_page=launch.php&target=inform_after_setup + https://www.itophub.io/page/data-privacy diff --git a/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php b/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php index 1bbab2eaa..47b79401b 100644 --- a/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php +++ b/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php @@ -23,46 +23,46 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dictionary entries go here 'Menu:iTopHub' => 'iTop Hub', - 'Menu:iTopHub:Register' => '进兄 iTop Hub ', - 'Menu:iTopHub:Register+' => '进兄 iTop Hub ę›“ę–°ę‚Øēš„ē»„ä»¶', - 'Menu:iTopHub:Register:Description' => '

进兄 iTop Hub ē¤¾åŒŗå¹³å°!
åÆ»ę‰¾ę‚Øęƒ³č¦ēš„å†…å®¹å’Œäæ”ęÆ, ē®”ē†ęœ¬ęœŗę‰©å±•ęˆ–å®‰č£…ę–°ēš„ę‰©å±•.

é€ščæ‡čæ™äøŖé”µé¢čæžęŽ„åˆ°iTop Hub, ęœ¬ęœŗēš„äæ”ęÆä¹Ÿä¼šč¢«ęŽØé€åˆ° iTop Hub 上.

', + 'Menu:iTopHub:Register' => '进兄iTop Hub', + 'Menu:iTopHub:Register+' => '进兄iTop Hubę›“ę–°ę‚Øēš„ē»„ä»¶', + 'Menu:iTopHub:Register:Description' => '

进兄iTop Hubē¤¾åŒŗå¹³å°!
åÆ»ę‰¾ę‚Øęƒ³č¦ēš„å†…å®¹å’Œäæ”ęÆ, ē®”ē†ęœ¬ęœŗę‰©å±•ęˆ–å®‰č£…ę–°ēš„ę‰©å±•.

é€ščæ‡čæ™äøŖé”µé¢čæžęŽ„åˆ°iTop Hub, ęœ¬ęœŗēš„äæ”ęÆä¹Ÿä¼šč¢«ęŽØé€åˆ° iTop Hub 上.

', 'Menu:iTopHub:MyExtensions' => 'å·²å®‰č£…ēš„ę‰©å±•', 'Menu:iTopHub:MyExtensions+' => 'ęŸ„ēœ‹ęœ¬ęœŗå·²å®‰č£…ēš„ę‰©å±•', - 'Menu:iTopHub:BrowseExtensions' => '从 iTop Hub čŽ·å–ę‰©å±•', - 'Menu:iTopHub:BrowseExtensions+' => '去 iTop Hub ęµč§ˆę›“å¤šēš„ę‰©å±•', - 'Menu:iTopHub:BrowseExtensions:Description' => '

进兄 iTop Hub 商店, äø€ē«™å¼ęŸ„ę‰¾å„ē§iTop ę‰©å±•ēš„åœ°ę–¹ !
åÆ»ę‰¾ē¬¦åˆę‚Øč¦ę±‚ēš„ę‰©å±•.

é€ščæ‡čæ™äøŖé”µé¢čæžęŽ„åˆ°iTop Hub, ęœ¬ęœŗēš„äæ”ęÆä¹Ÿä¼šč¢«ęŽØé€åˆ° iTop Hub 上.

', + 'Menu:iTopHub:BrowseExtensions' => '从iTop HubčŽ·å–ę‰©å±•', + 'Menu:iTopHub:BrowseExtensions+' => '去iTop Hubęµč§ˆę›“å¤šēš„ę‰©å±•', + 'Menu:iTopHub:BrowseExtensions:Description' => '

进兄iTop Hub商店, äø€ē«™å¼ęŸ„ę‰¾å„ē§iTopę‰©å±•ēš„åœ°ę–¹ !
åÆ»ę‰¾ē¬¦åˆę‚Øč¦ę±‚ēš„ę‰©å±•.

é€ščæ‡čæ™äøŖé”µé¢čæžęŽ„åˆ°iTop Hub, ęœ¬ęœŗēš„äæ”ęÆä¹Ÿä¼šč¢«ęŽØé€åˆ° iTop Hub 上.

', 'iTopHub:GoBtn' => '进兄iTop Hub', 'iTopHub:CloseBtn' => '关闭', 'iTopHub:GoBtn:Tooltip' => '跳到 www.itophub.io', - 'iTopHub:OpenInNewWindow' => 'ä»Žę–°ēŖ—å£ę‰“å¼€ iTop Hub', - 'iTopHub:AutoSubmit' => 'äøå†čÆ¢é—®. äø‹ę¬”č‡ŖåŠØčæ›å…„ iTop Hub .', + 'iTopHub:OpenInNewWindow' => 'ä»Žę–°ēŖ—å£ę‰“å¼€iTop Hub', + 'iTopHub:AutoSubmit' => 'äøå†čÆ¢é—®. äø‹ę¬”č‡ŖåŠØčæ›å…„iTop Hub .', 'UI:About:RemoteExtensionSource' => 'iTop Hub', - 'iTopHub:Explanation' => 'ē‚¹å‡»čæ™äøŖęŒ‰é’®ę‚Øå°†č¢«å¼•åÆ¼č‡³ iTop Hub.', + 'iTopHub:Explanation' => 'ē‚¹å‡»čæ™äøŖęŒ‰é’®ę‚Øå°†č¢«å¼•åÆ¼č‡³iTop Hub.', - 'iTopHub:BackupFreeDiskSpaceIn' => '%1$s free disk space in %2$s.', - 'iTopHub:FailedToCheckFreeDiskSpace' => 'ę£€ęŸ„ē©ŗé—²ēš„ē£ē›˜ē©ŗé—“å¤±č“„.', + 'iTopHub:BackupFreeDiskSpaceIn' => '%1$s åÆē”Øē£ē›˜ē©ŗé—“ä½äŗŽ %2$s.', + 'iTopHub:FailedToCheckFreeDiskSpace' => 'ę£€ęŸ„åÆē”Øē£ē›˜ē©ŗé—“å¤±č“„.', 'iTopHub:BackupOk' => 'å¤‡ä»½ęˆåŠŸ.', 'iTopHub:BackupFailed' => '备份失蓄!', 'iTopHub:Landing:Status' => 'å®‰č£…ēŠ¶ę€', 'iTopHub:Landing:Install' => 'ę‰©å±•å®‰č£…čæ›č”Œäø­...', 'iTopHub:CompiledOK' => 'ē¼–čÆ‘ęˆåŠŸ.', - 'iTopHub:ConfigurationSafelyReverted' => 'å®‰č£…ę—¶å‘ē”Ÿé”™čÆÆ!
iTop é…ē½®å°†äøä¼šę”¹å˜.', + 'iTopHub:ConfigurationSafelyReverted' => 'å®‰č£…ę—¶å‘ē”Ÿé”™čÆÆ!
iTopé…ē½®å°†äøä¼šę”¹å˜.', 'iTopHub:FailAuthent' => '认证失蓄.', 'iTopHub:InstalledExtensions' => 'ęœ¬ęœŗå·²å®‰č£…ēš„ę‰©å±•', 'iTopHub:ExtensionCategory:Manual' => 'ę‰‹åŠØå®‰č£…ēš„ę‰©å±•', 'iTopHub:ExtensionCategory:Manual+' => 'äø‹åˆ—å·²å®‰č£…ēš„ę‰©å±•ę˜Æę‰‹åŠØå°†ę–‡ä»¶ę”¾ē½®åˆ° %1$s ē›®å½•ēš„:', - 'iTopHub:ExtensionCategory:Remote' => '从 iTop Hub å®‰č£…ēš„ę‰©å±•', - 'iTopHub:ExtensionCategory:Remote+' => 'äø‹åˆ—å·²å®‰č£…ēš„ę‰©å±•ę˜Æę„č‡Ŗ iTop Hub:', + 'iTopHub:ExtensionCategory:Remote' => '从iTop Hub å®‰č£…ēš„ę‰©å±•', + 'iTopHub:ExtensionCategory:Remote+' => 'äø‹åˆ—å·²å®‰č£…ēš„ę‰©å±•ę˜Æę„č‡ŖiTop Hub:', 'iTopHub:NoExtensionInThisCategory' => 'å°šęœŖå®‰č£…ę‰©å±•', - 'iTopHub:NoExtensionInThisCategory+' => 'ęµč§ˆ iTop Hub ,åŽ»åÆ»ę‰¾ē¬¦åˆę‚Øå–œę¬¢ēš„ę‰©å±•å§.', + 'iTopHub:NoExtensionInThisCategory+' => 'ęµč§ˆiTop Hub,åŽ»åÆ»ę‰¾ē¬¦åˆę‚Øå–œę¬¢ēš„ę‰©å±•å§.', 'iTopHub:ExtensionNotInstalled' => 'ęœŖå®‰č£…', - 'iTopHub:GetMoreExtensions' => '从 iTop Hub čŽ·å–ę‰©å±•...', + 'iTopHub:GetMoreExtensions' => '从iTop HubčŽ·å–ę‰©å±•...', - 'iTopHub:LandingWelcome' => 'ę­å–œ! äø‹åˆ—ę„č‡Ŗ iTop Hub ēš„ę‰©å±•å·²č¢«äø‹č½½å¹¶å®‰č£…åˆ°ęœ¬ęœŗ.', + 'iTopHub:LandingWelcome' => 'ę­å–œ! äø‹åˆ—ę„č‡ŖiTop Hubēš„ę‰©å±•å·²č¢«äø‹č½½å¹¶å®‰č£…åˆ°ęœ¬ęœŗ.', 'iTopHub:GoBackToITopBtn' => 'čæ”å›ž'.ITOP_APPLICATION_SHORT, 'iTopHub:Uncompressing' => 'ę‰©å±•č§£åŽ‹äø­...', - 'iTopHub:InstallationWelcome' => 'å®‰č£…ę„č‡Ŗ iTop Hub ēš„ę‰©å±•', + 'iTopHub:InstallationWelcome' => 'å®‰č£…ę„č‡ŖiTop Hubēš„ę‰©å±•', 'iTopHub:DBBackupLabel' => 'ęœ¬ęœŗå¤‡ä»½', 'iTopHub:DBBackupSentence' => 'åœØå‡ēŗ§ä¹‹å‰,å¤‡ä»½ę•°ę®åŗ“å’Œ '.ITOP_APPLICATION_SHORT.' é…ē½®ę–‡ä»¶', 'iTopHub:DeployBtn' => '安装 !', @@ -75,7 +75,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' ęœ¬ęœŗå¤‡ä»½...', 'iTopHub:InstallationProgress:ExtensionsInstallation' => '安装扩展', 'iTopHub:InstallationEffect:MissingDependencies' => '扩展无法安装,å› äøŗęœŖēŸ„ēš„ä¾čµ–.', - 'iTopHub:InstallationEffect:MissingDependencies_Details' => 'čÆ„ę‰©å±•ä¾čµ–ęØ”å—: %1$s', + 'iTopHub:InstallationEffect:MissingDependencies_Details' => 'ę­¤ę‰©å±•ä¾čµ–ęØ”å—: %1$s', 'iTopHub:InstallationProgress:InstallationSuccessful' => 'å®‰č£…ęˆåŠŸ!', 'iTopHub:InstallationStatus:Installed_Version' => '%1$s ē‰ˆęœ¬: %2$s.', diff --git a/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php b/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php index 432c10d96..575bbd61e 100644 --- a/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php +++ b/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php @@ -116,8 +116,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Incident/Attribute:origin/Value:monitoring+' => 'ē›‘ęŽ§', 'Class:Incident/Attribute:origin/Value:phone' => 'ē”µčÆ', 'Class:Incident/Attribute:origin/Value:phone+' => 'ē”µčÆ', - 'Class:Incident/Attribute:origin/Value:portal' => 'portal', - 'Class:Incident/Attribute:origin/Value:portal+' => 'portal', + 'Class:Incident/Attribute:origin/Value:portal' => 'é—Øęˆ·', + 'Class:Incident/Attribute:origin/Value:portal+' => 'é—Øęˆ·', 'Class:Incident/Attribute:service_id' => 'ęœåŠ”', 'Class:Incident/Attribute:service_id+' => '', 'Class:Incident/Attribute:service_name' => 'ęœåŠ”åē§°', @@ -164,8 +164,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Incident/Attribute:resolution_code+' => '', 'Class:Incident/Attribute:resolution_code/Value:assistance' => 'å¤–éƒØę”ÆęŒ', 'Class:Incident/Attribute:resolution_code/Value:assistance+' => 'å¤–éƒØę”ÆęŒ', - 'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'bug äæ®å¤', - 'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'bug äæ®å¤', + 'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'ē¼ŗé™·äæ®å¤', + 'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'ē¼ŗé™·äæ®å¤', 'Class:Incident/Attribute:resolution_code/Value:hardware repair' => '甬件结修', 'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => '甬件结修', 'Class:Incident/Attribute:resolution_code/Value:other' => '其它', @@ -188,14 +188,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Incident/Attribute:parent_change_id+' => '', 'Class:Incident/Attribute:parent_change_ref' => 'å˜ę›“ē¼–å·', 'Class:Incident/Attribute:parent_change_ref+' => '', - 'Class:Incident/Attribute:parent_problem_id' => 'Parent problem id~~', + 'Class:Incident/Attribute:parent_problem_id' => 'ēˆ¶ēŗ§é—®é¢˜', 'Class:Incident/Attribute:parent_problem_id+' => '~~', - 'Class:Incident/Attribute:parent_problem_ref' => 'Parent problem ref~~', + 'Class:Incident/Attribute:parent_problem_ref' => 'ēˆ¶ēŗ§é—®é¢˜ē¼–å·', 'Class:Incident/Attribute:parent_problem_ref+' => '~~', 'Class:Incident/Attribute:related_request_list' => 'ē›øå…³éœ€ę±‚', - 'Class:Incident/Attribute:related_request_list+' => 'čÆ„äŗ‹ä»¶ē›øå…³ēš„ę‰€ęœ‰éœ€ę±‚', + 'Class:Incident/Attribute:related_request_list+' => 'ę­¤äŗ‹ä»¶ē›øå…³ēš„ę‰€ęœ‰éœ€ę±‚', 'Class:Incident/Attribute:child_incidents_list' => 'č”ē”Ÿäŗ‹ä»¶', - 'Class:Incident/Attribute:child_incidents_list+' => 'čÆ„äŗ‹ä»¶ē›øå…³ēš„ę‰€ęœ‰å­äŗ‹ä»¶', + 'Class:Incident/Attribute:child_incidents_list+' => 'ę­¤äŗ‹ä»¶ē›øå…³ēš„ę‰€ęœ‰å­äŗ‹ä»¶', 'Class:Incident/Attribute:public_log' => '评论', 'Class:Incident/Attribute:public_log+' => '', 'Class:Incident/Attribute:user_satisfaction' => 'ē”Øęˆ·ę»”ę„åŗ¦', @@ -210,7 +210,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Incident/Attribute:user_satisfaction/Value:4+' => 'éžåøøäøę»”ę„', 'Class:Incident/Attribute:user_comment' => 'ē”Øęˆ·čÆ„č®ŗ', 'Class:Incident/Attribute:user_comment+' => '', - 'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'å„½č®°ēš„ēˆ¶ēŗ§äŗ‹ä»¶IDåē§°', + 'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'ēˆ¶ēŗ§äŗ‹ä»¶åē§°', 'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '', 'Class:Incident/Stimulus:ev_assign' => '分配', 'Class:Incident/Stimulus:ev_assign+' => '', diff --git a/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php b/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php index 133cb62cb..ee1ec3a1c 100644 --- a/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php +++ b/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php @@ -85,9 +85,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:KnownError/Attribute:version' => 'ē‰ˆęœ¬', 'Class:KnownError/Attribute:version+' => '', 'Class:KnownError/Attribute:ci_list' => 'é…ē½®é”¹', - 'Class:KnownError/Attribute:ci_list+' => 'čÆ„å·²ēŸ„é”™čÆÆē›øå…³ēš„ę‰€ęœ‰é…ē½®é”¹', + 'Class:KnownError/Attribute:ci_list+' => 'ę­¤å·²ēŸ„é”™čÆÆē›øå…³ēš„ę‰€ęœ‰é…ē½®é”¹', 'Class:KnownError/Attribute:document_list' => '文攣', - 'Class:KnownError/Attribute:document_list+' => 'čÆ„å·²ēŸ„é”™čÆÆē›øå…³ēš„ę‰€ęœ‰ę–‡ę”£', + 'Class:KnownError/Attribute:document_list+' => 'ę­¤å·²ēŸ„é”™čÆÆē›øå…³ēš„ę‰€ęœ‰ę–‡ę”£', )); // diff --git a/datamodels/2.x/itop-oauth-client/README.md b/datamodels/2.x/itop-oauth-client/README.md new file mode 100644 index 000000000..a520ac75c --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/README.md @@ -0,0 +1,2 @@ +# Extension OAuth 2.0 client + diff --git a/datamodels/2.x/itop-oauth-client/ajax.php b/datamodels/2.x/itop-oauth-client/ajax.php new file mode 100644 index 000000000..1b81b0829 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/ajax.php @@ -0,0 +1,24 @@ += 0) { + $sTemplates = MODULESROOT.'itop-oauth-client/templates'; +} else { + $sTemplates = MODULESROOT.'itop-oauth-client/templates/legacy'; +} + +$oUpdateController = new AjaxOauthClientController($sTemplates, 'itop-oauth-client'); +$oUpdateController->AllowOnlyAdmin(); +$oUpdateController->SetDefaultOperation('CreateMailbox'); +$oUpdateController->HandleOperation(); + + diff --git a/images/icons/icons8-azure.svg b/datamodels/2.x/itop-oauth-client/assets/img/icons8-azure.svg similarity index 100% rename from images/icons/icons8-azure.svg rename to datamodels/2.x/itop-oauth-client/assets/img/icons8-azure.svg diff --git a/images/icons/icons8-google.svg b/datamodels/2.x/itop-oauth-client/assets/img/icons8-google.svg similarity index 100% rename from images/icons/icons8-google.svg rename to datamodels/2.x/itop-oauth-client/assets/img/icons8-google.svg diff --git a/datamodels/2.x/itop-oauth-client/assets/js/oauth_connect.js b/datamodels/2.x/itop-oauth-client/assets/js/oauth_connect.js new file mode 100644 index 000000000..1ce571112 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/assets/js/oauth_connect.js @@ -0,0 +1,99 @@ +/** + * @copyright Copyright (C) 2010-2022 Combodo SARL + * @license http://opensource.org/licenses/AGPL-3.0 + */ + +// Function used to open OAuth popup +var oWindowObjectReference = null; +var sPreviousUrl = null; +var oListener = null; +var sOAuthAjaxURI = null; +var sOAuthObjClass = null; +var sOAuthObjKey = null; +var sOAuthReturnURI = null; + + +const oOnOauthSuccess = function (event) { + if (oListener !== null) { + clearInterval(oListener); + } + + $.post( + sOAuthAjaxURI, + { + operation: 'GetDisplayAuthenticationResults', + class: sOAuthObjClass, + id: sOAuthObjKey, + redirect_url: event.data + }, + function (oData) { + window.location = oData.data; + } + ); +} +const oOpenSignInWindow = function (url, name) { + // Remove any existing event listener + window.removeEventListener('message', oOnOauthSuccess); + if (oListener !== null) { + clearInterval(oListener); + } + + // Window features + const sWindowFeatures = 'toolbar=no, menubar=no, width=600, height=700, top=100, left=100'; + + if (oWindowObjectReference === null || oWindowObjectReference.closed) { + /* If the pointer to the window object in memory does not exist + or if such pointer exists but the window was closed */ + oWindowObjectReference = window.open(url, name, sWindowFeatures); + } else if (sPreviousUrl !== url) { + /* If the resource to load is different, + then we load it in the already opened secondary window, and then + we bring such window back on top/in front of its parent window. */ + oWindowObjectReference = window.open(url, name, sWindowFeatures); + oWindowObjectReference.focus(); + } else { + /* Else the window reference must exist and the window + is not closed; therefore, we can bring it back on top of any other + window with the focus() method. There would be no need to re-create + the window or to reload the referenced resource. */ + oWindowObjectReference.focus(); + } + /* Let know every second our child window that we're waiting for it to complete, + once we reach our landing page, it'll send us a reply + */ + oListener = window.setInterval(function () { + if (oWindowObjectReference.closed) { + clearInterval(oListener); + } + oWindowObjectReference.postMessage('anyone', sOAuthReturnURI); + }, 1000); + + /* Once we receive a response, transmit it to the server to get authenticate and display + results + */ + window.addEventListener('message', oOnOauthSuccess, false); + // Assign the previous URL + sPreviousUrl = url; +}; + + +const OAuthConnect = function(sClass, sId, sAjaxUri, sReturnUri) { + sOAuthAjaxURI = sAjaxUri; + sOAuthObjClass = sClass; + sOAuthObjKey = sId; + sOAuthReturnURI = sReturnUri; + + $.post( + sOAuthAjaxURI, + { + operation: 'GetOAuthAuthorizationUrl', + class: sOAuthObjClass, + id: sOAuthObjKey + }, + function (oData) { + if (oData.status === 'success') { + oOpenSignInWindow(oData.data.authorization_url, 'OAuth authorization') + } + } + ); +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/composer.json b/datamodels/2.x/itop-oauth-client/composer.json new file mode 100644 index 000000000..f12b85530 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/composer.json @@ -0,0 +1,16 @@ +{ + "config": { + "classmap-authoritative": true + }, + "autoload": { + "psr-4": { + "Combodo\\iTop\\OAuthClient\\": "src" + } + }, + "name": "combodo/itop-oauth-client", + "type": "itop-extension", + "description": "Remote authentication for OAuth 2.0", + "require": { + "composer-runtime-api": "^2.0" + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/composer.lock b/datamodels/2.x/itop-oauth-client/composer.lock new file mode 100644 index 000000000..b1b3d9fd2 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/composer.lock @@ -0,0 +1,20 @@ +{ + "_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": "285a4d33f818950c151bb893193d2cce", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "composer-runtime-api": "^2.0" + }, + "platform-dev": [], + "plugin-api-version": "2.1.0" +} diff --git a/datamodels/2.x/itop-oauth-client/cs.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/cs.dict.itop-oauth-client.php new file mode 100644 index 000000000..ac3a5196f --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/cs.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('CS CZ', 'Czech', 'ČeÅ”tina', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('CS CZ', 'Czech', 'ČeÅ”tina', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('CS CZ', 'Czech', 'ČeÅ”tina', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/da.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/da.dict.itop-oauth-client.php new file mode 100644 index 000000000..5bcb967ee --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/da.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('DA DA', 'Danish', 'Dansk', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('DA DA', 'Danish', 'Dansk', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('DA DA', 'Danish', 'Dansk', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml b/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml new file mode 100644 index 000000000..70c6eeeea --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml @@ -0,0 +1,301 @@ + + + + + + cmdbAbstractObject + + cloud,searchable + true + autoincrement + priv_oauth_client + id + + + + + + + + + + + + + + + + + + + provider + + false + + + name + + false + + + true + + + active + + + + inactive + + + + status + inactive + false + + + description + + true + + + client_id + + false + + + client_secret + + false + + + refresh_token + + true + none + + + refresh_token_expiration + + true + none + + + token + + true + none + + + token_expiration + + true + none + + + redirect_url + + _blank + true + + + MailInboxOAuth + oauth_client_id + 0 + 0 + + + + + false + public + Overload-DBObject + Get('scope'); + if ($this->Get('status') == 'inactive') { + $oPage->p(''.Dict::S('itop-oauth-client:Message:MissingToken').''); + } elseif (($sScope == 'SMTP' || $sScope == 'EMail') && $oConfig->Get('email_transport_smtp.username') == $this->Get('name')) { + $sLabel = Dict::S('itop-oauth-client:UsedForSMTP'); + $sTestLabel = Dict::S('itop-oauth-client:TestSMTP'); + $sTestURL = utils::GetAbsoluteUrlAppRoot().'setup/email.test.php'; + $oPage->p("$sLabel $sTestLabel"); + } + } + } + ]]> + + + false + public + Overload-DBObject + + + + false + public + Overload-DBObject + + + + false + public + Get('provider').'.com'; + } + ]]> + + + false + public + + + + false + public + Get('status') == 'active') { + return new \League\OAuth2\Client\Token\AccessToken([ + 'access_token' => $this->Get('token'), + 'expires_in' => date_format(new DateTime($this->Get('token_expiration')), 'U') - time(), + 'refresh_token' => $this->Get('refresh_token'), + 'token_type' => 'Bearer', + ]); + } + return null; + } + ]]> + + + false + public + Set('token', $oAccessToken->getToken()); + $this->Set('token_expiration', date(AttributeDateTime::GetSQLFormat(), $oAccessToken->getExpires())); + if (!empty($oAccessToken->getRefreshToken())) { + $this->Set('refresh_token', $oAccessToken->getRefreshToken()); + } + $this->Set('status', 'active'); + $this->DBUpdate(); + } + ]]> + + + +
+ + + 1 + + + 2 + + + 3 + + + 5 + + + 6 + + + 7 + + + 8 + + +
+ + + + 1 + + + 3 + + + + + + + 1 + + + 2 + + + + + + + 1 + + + 2 + + + +
+
+
+ + + 100 + ConfigurationTools + + 1 + 0 + OAuthClient + UR_ACTION_READ + + + + + + + + +
diff --git a/datamodels/2.x/itop-oauth-client/de.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/de.dict.itop-oauth-client.php new file mode 100644 index 000000000..fc7d62765 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/de.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access token...~~', + 'Menu:RegenerateTokens' => 'Regenerate access token...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('DE DE', 'German', 'Deutsch', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('DE DE', 'German', 'Deutsch', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('DE DE', 'German', 'Deutsch', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php new file mode 100644 index 000000000..1a91fb173 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php @@ -0,0 +1,78 @@ + 'Create a mailbox...', + 'Menu:OAuthClient' => 'OAuth Client', + 'Menu:OAuthClient+' => '', + 'Menu:GenerateTokens' => 'Generate access token...', + 'Menu:RegenerateTokens' => 'Regenerate access token...', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP', + 'itop-oauth-client:TestSMTP' => 'Email send test', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated', +]); + +// +// Class: OAuthClient +// + +Dict::Add('EN US', 'English', 'English', [ + 'Class:OAuthClient' => 'Oauth Client', + 'Class:OAuthClient/Attribute:provider' => 'Provider', + 'Class:OAuthClient/Attribute:provider+' => '', + 'Class:OAuthClient/Attribute:name' => 'Login', + 'Class:OAuthClient/Attribute:name+' => '', + 'Class:OAuthClient/Attribute:scope' => 'Scope', + 'Class:OAuthClient/Attribute:scope+' => '', + 'Class:OAuthClient/Attribute:status' => 'Status', + 'Class:OAuthClient/Attribute:status+' => '', + 'Class:OAuthClient/Attribute:status/Value:active' => 'Access token generated', + 'Class:OAuthClient/Attribute:status/Value:inactive' => 'No Access token', + 'Class:OAuthClient/Attribute:description' => 'Description', + 'Class:OAuthClient/Attribute:description+' => '', + 'Class:OAuthClient/Attribute:client_id' => 'Client id', + 'Class:OAuthClient/Attribute:client_id+' => '', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret', + 'Class:OAuthClient/Attribute:client_secret+' => '', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token', + 'Class:OAuthClient/Attribute:refresh_token+' => '', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '', + 'Class:OAuthClient/Attribute:token' => 'Access token', + 'Class:OAuthClient/Attribute:token+' => '', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration', + 'Class:OAuthClient/Attribute:token_expiration+' => '', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url', + 'Class:OAuthClient/Attribute:redirect_url+' => '', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list', + 'Class:OAuthClient/Attribute:mailbox_list+' => '', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('EN US', 'English', 'English', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('EN US', 'English', 'English', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)', +]); + diff --git a/datamodels/2.x/itop-oauth-client/es_cr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/es_cr.dict.itop-oauth-client.php new file mode 100644 index 000000000..5baf5dbf9 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/es_cr.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('ES CR', 'Spanish', 'EspaƱol, CastellaƱo', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('ES CR', 'Spanish', 'EspaƱol, CastellaƱo', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('ES CR', 'Spanish', 'EspaƱol, CastellaƱo', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php new file mode 100644 index 000000000..e8461b535 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php @@ -0,0 +1,78 @@ + 'CrĆ©er une boite mail...', + 'Menu:OAuthClient' => 'Client OAuth', + 'Menu:OAuthClient+' => '', + 'Menu:GenerateTokens' => 'CrĆ©er un jeton d\'accĆØs...', + 'Menu:RegenerateTokens' => 'RecrĆ©er un jeton d\'accĆØs..', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'CrĆ©ation de boite mail', + + 'itop-oauth-client:UsedForSMTP' => 'Ce client Oauth est utilisĆ© pour SMTP', + 'itop-oauth-client:TestSMTP' => 'Tester l\'envoi de mail', + 'itop-oauth-client:MissingOAuthClient' => 'Il n\'y a pas de client OAuth pour l\'utilisateur %1$s', + 'itop-oauth-client:Message:MissingToken' => 'GĆ©nĆ©rez le jeton d\'accĆØs avant d\'utiliser ce client OAuth', + 'itop-oauth-client:Message:TokenCreated' => 'Le jeton d\'accĆØs Ć  Ć©tĆ© crƩƩ', + 'itop-oauth-client:Message:TokenRecreated' => 'Le jeton d\'accĆØs Ć  Ć©tĆ© renouvelĆ©', +]); + +// +// Class: OAuthClient +// + +Dict::Add('FR FR', 'French', 'FranƧais', [ + 'Class:OAuthClient' => 'Client OAuth', + 'Class:OAuthClient/Attribute:provider' => 'Fournisseur', + 'Class:OAuthClient/Attribute:provider+' => '', + 'Class:OAuthClient/Attribute:name' => 'Login', + 'Class:OAuthClient/Attribute:name+' => '', + 'Class:OAuthClient/Attribute:scope' => 'Niveaux d\'accĆØs', + 'Class:OAuthClient/Attribute:scope+' => '', + 'Class:OAuthClient/Attribute:description' => 'Description', + 'Class:OAuthClient/Attribute:description+' => '', + 'Class:OAuthClient/Attribute:client_id' => 'ID Client', + 'Class:OAuthClient/Attribute:client_id+' => '', + 'Class:OAuthClient/Attribute:client_secret' => 'Code secret du client', + 'Class:OAuthClient/Attribute:client_secret+' => '', + 'Class:OAuthClient/Attribute:refresh_token' => 'Jeton de renouvellement', + 'Class:OAuthClient/Attribute:refresh_token+' => '', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Date d\'expiration du jeton de renouvellement', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '', + 'Class:OAuthClient/Attribute:token' => 'Jeton d\'accĆØs', + 'Class:OAuthClient/Attribute:token+' => '', + 'Class:OAuthClient/Attribute:token_expiration' => 'Date d\'expiration du jeton d\'accĆØs', + 'Class:OAuthClient/Attribute:token_expiration+' => '', + 'Class:OAuthClient/Attribute:redirect_url' => 'URL de redirection', + 'Class:OAuthClient/Attribute:redirect_url+' => '', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list', + 'Class:OAuthClient/Attribute:mailbox_list+' => '', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('FR FR', 'French', 'FranƧais', [ + 'Class:OAuthClientAzure' => 'Client OAuth pour Microsoft Azure', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('FR FR', 'French', 'FranƧais', [ + 'Class:OAuthClientGoogle' => 'Client OAuth pour Google', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)', +]); + + +// Additional language entries not present in English dict +Dict::Add('FR FR', 'French', 'FranƧais', array( + 'Class:OAuthClient/Name' => '%1$s-%%2$~', +)); diff --git a/datamodels/2.x/itop-oauth-client/hu.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/hu.dict.itop-oauth-client.php new file mode 100644 index 000000000..6c6287f9f --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/hu.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('HU HU', 'Hungarian', 'Magyar', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('HU HU', 'Hungarian', 'Magyar', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('HU HU', 'Hungarian', 'Magyar', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/index.php b/datamodels/2.x/itop-oauth-client/index.php new file mode 100644 index 000000000..4078be629 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/index.php @@ -0,0 +1,24 @@ += 0) { + $sTemplates = MODULESROOT.'itop-oauth-client/templates'; +} else { + $sTemplates = MODULESROOT.'itop-oauth-client/templates/legacy'; +} + +$oUpdateController = new OAuthClientController($sTemplates, 'itop-oauth-client'); +$oUpdateController->AllowOnlyAdmin(); +$oUpdateController->SetDefaultOperation('CreateMailbox'); +$oUpdateController->HandleOperation(); + + diff --git a/datamodels/2.x/itop-oauth-client/it.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/it.dict.itop-oauth-client.php new file mode 100644 index 000000000..bc601ae8b --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/it.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('IT IT', 'Italian', 'Italiano', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('IT IT', 'Italian', 'Italiano', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('IT IT', 'Italian', 'Italiano', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/ja.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/ja.dict.itop-oauth-client.php new file mode 100644 index 000000000..1a5bdca02 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/ja.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('JA JP', 'Japanese', 'ę—„ęœ¬čŖž', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('JA JP', 'Japanese', 'ę—„ęœ¬čŖž', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('JA JP', 'Japanese', 'ę—„ęœ¬čŖž', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php new file mode 100644 index 000000000..3e80fcaf3 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php @@ -0,0 +1,54 @@ + 'OAuth 2.0 client', + 'category' => 'business', + + // Setup + // + 'dependencies' => array( + 'itop-welcome-itil/3.1.0,', + ), + 'mandatory' => false, + 'visible' => true, + + // Components + // + 'datamodel' => array( + 'vendor/autoload.php', + 'model.itop-oauth-client.php', // Contains the PHP code generated by the "compilation" of datamodel.remote-authent-oauth.xml + 'src/Model/OAuthClientGoogle.php', + 'src/Model/OAuthClientAzure.php', + 'src/Service/PopupMenuExtension.php', + ), + 'webservice' => array( + + ), + 'data.struct' => array( + // add your 'structure' definition XML files here, + ), + 'data.sample' => array( + // 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' => array( + // Module specific settings go here, if any + ), + ) +); + diff --git a/datamodels/2.x/itop-oauth-client/nl.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/nl.dict.itop-oauth-client.php new file mode 100644 index 000000000..81d390251 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/nl.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('NL NL', 'Dutch', 'Nederlands', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('NL NL', 'Dutch', 'Nederlands', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('NL NL', 'Dutch', 'Nederlands', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/pt_br.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/pt_br.dict.itop-oauth-client.php new file mode 100644 index 000000000..150ac6fc6 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/pt_br.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/ru.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/ru.dict.itop-oauth-client.php new file mode 100644 index 000000000..b97fad178 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/ru.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('RU RU', 'Russian', 'Русский', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('RU RU', 'Russian', 'Русский', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('RU RU', 'Russian', 'Русский', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/sk.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/sk.dict.itop-oauth-client.php new file mode 100644 index 000000000..d1e15cc49 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/sk.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/src/Controller/AjaxOauthClientController.php b/datamodels/2.x/itop-oauth-client/src/Controller/AjaxOauthClientController.php new file mode 100644 index 000000000..51367d34e --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/src/Controller/AjaxOauthClientController.php @@ -0,0 +1,77 @@ + 'success', 'data' => []]; + + $sAuthorizationUrl = OAuthClientProviderFactory::GetAuthorizationUrl($oOAuthClient); + $aResult['data']['authorization_url'] = $sAuthorizationUrl; + + $this->DisplayJSONPage($aResult); + } + + public function OperationGetDisplayAuthenticationResults() + { + $sClass = utils::ReadParam('class'); + $sId = utils::ReadParam('id'); + + IssueLog::Debug("GetDisplayAuthenticationResults for $sClass::$sId", self::LOG_CHANNEL); + + /** @var \OAuthClient $oOAuthClient */ + $oOAuthClient = MetaModel::GetObject($sClass, $sId); + $bIsCreation = empty($oOAuthClient->Get('token')); + + $sRedirectUrl = utils::ReadParam('redirect_url', '', false, 'raw'); + + $sRedirectUrlQuery = parse_url($sRedirectUrl)['query']; + + $aQuery = []; + parse_str($sRedirectUrlQuery, $aQuery); + $sCode = $aQuery['code']; + $oAccessToken = OAuthClientProviderFactory::GetAccessTokenFromCode($oOAuthClient, $sCode); + + $oOAuthClient->SetAccessToken($oAccessToken); + + cmdbAbstractObject::SetSessionMessage( + $sClass, + $sId, + "$sClass:$sId:TokenCreated", + $bIsCreation ? Dict::S('itop-oauth-client:Message:TokenCreated') : Dict::S('itop-oauth-client:Message:TokenRecreated'), + 'ok', + 1, + true + ); + + $aResult = ['status' => 'success']; + $aResult['data'] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=details&class=$sClass&id=$sId"; + + $this->DisplayJSONPage($aResult); + } + +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Controller/OAuthClientController.php b/datamodels/2.x/itop-oauth-client/src/Controller/OAuthClientController.php new file mode 100644 index 000000000..26d2b05b6 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/src/Controller/OAuthClientController.php @@ -0,0 +1,41 @@ +Get('name'); + $sDefaultServer = $oOAuthClient->GetDefaultMailServer(); + $sDefaultPort = $oOAuthClient->GetDefaultMailServerPort(); + + $aParams['sURL'] = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=new&class=MailInboxOAuth'. + '&default[mailbox]=INBOX'. + '&default[server]='.$sDefaultServer. + '&default[port]='.$sDefaultPort. + '&default[oauth_client_id]='.$sId. + '&default[login]='.$sLogin; + + $this->DisplayPage($aParams); + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php new file mode 100644 index 000000000..eb798e64d --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php @@ -0,0 +1,128 @@ + 'cloud', + 'key_type' => 'autoincrement', + 'name_attcode' => ['name', 'scope'], + 'state_attcode' => '', + 'reconc_keys' => ['provider', 'name'], + 'db_table' => 'priv_oauth_client_azure', + 'db_key_field' => 'id', + 'icon' => utils::GetAbsoluteUrlModulesRoot().'itop-oauth-client/assets/img/icons8-azure.svg', + 'db_finalclass_field' => '', + 'uniqueness_rules' => [ + 'Username for scope' => + [ + 'attributes' => ['name', 'scope'], + 'filter' => null, + 'disabled' => false, + 'is_blocking' => true, + ], + 'OAuth Server' => + [ + 'attributes' => ['provider', 'scope', 'client_id', 'client_secret'], + 'filter' => null, + 'disabled' => false, + 'is_blocking' => true, + ], + ], + ]; + MetaModel::Init_Params($aParams); + MetaModel::Init_InheritAttributes(); + MetaModel::Init_AddAttribute(new AttributeEnum('scope', [ + 'allowed_values' => new ValueSetEnum('EMail'), + 'display_style' => 'list', + 'sql' => 'scope', + 'default_value' => 'EMail', + 'is_null_allowed' => false, + 'depends_on' => [], + 'always_load_in_tables' => true, + ])); + + MetaModel::Init_SetZListItems('details', [ + 'name', + 'status', + 'description', + 'provider', + 'scope', + 'redirect_url', + 'client_id', + 'client_secret', + 'mailbox_list', + ]); + MetaModel::Init_SetZListItems('standard_search', [ + 'name', + 'provider', + 'status', + ]); + MetaModel::Init_SetZListItems('list', [ + 'status', + 'provider', + ]); + } + + public function PrefillCreationForm(&$aContextParam) + { + $this->Set('provider', 'Azure'); + $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); + + parent::PrefillCreationForm($aContextParam); + } + + /** + * Compute read-only values + * + * @return void + * @throws \ArchivedObjectException + * @throws \CoreException + * @throws \CoreUnexpectedValue + */ + public function ComputeValues() + { + parent::ComputeValues(); + if (empty($this->Get('provider'))) { + $this->Set('provider', 'Azure'); + } + if (empty($this->Get('redirect_url'))) { + $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); + } + } + + public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '') + { + if ($sAttCode == 'provider' || $sAttCode == 'redirect_url') { + return OPT_ATT_READONLY; + } + + return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState); + } + + public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array()) + { + if ($sAttCode == 'provider' || $sAttCode == 'redirect_url') { + return OPT_ATT_READONLY; + } + + return parent::GetInitialStateAttributeFlags($sAttCode, $aReasons); + } + + public function GetDefaultMailServer() + { + return 'outlook.office365.com'; + } + + public function GetScope() + { + return 'https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send offline_access'; + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php new file mode 100644 index 000000000..83c111852 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php @@ -0,0 +1,134 @@ + 'cloud', + 'key_type' => 'autoincrement', + 'name_attcode' => ['name', 'scope'], + 'state_attcode' => '', + 'reconc_keys' => ['provider', 'name'], + 'db_table' => 'priv_oauth_client_google', + 'db_key_field' => 'id', + 'icon' => utils::GetAbsoluteUrlModulesRoot().'itop-oauth-client/assets/img/icons8-google.svg', + 'db_finalclass_field' => '', + 'uniqueness_rules' => [ + 'Username for scope' => + [ + 'attributes' => ['name', 'scope'], + 'filter' => null, + 'disabled' => false, + 'is_blocking' => true, + ], + 'OAuth Server' => + [ + 'attributes' => ['provider', 'scope', 'client_id', 'client_secret'], + 'filter' => null, + 'disabled' => false, + 'is_blocking' => true, + ], + ], + ); + MetaModel::Init_Params($aParams); + MetaModel::Init_InheritAttributes(); + MetaModel::Init_AddAttribute(new AttributeEnum('scope', [ + 'allowed_values' => new ValueSetEnum('EMail'), + 'display_style' => 'list', + 'sql' => 'scope', + 'default_value' => 'EMail', + 'is_null_allowed' => false, + 'depends_on' => [], + 'always_load_in_tables' => true, + ])); + + MetaModel::Init_SetZListItems('details', [ + 'name', + 'status', + 'description', + 'provider', + 'scope', + 'redirect_url', + 'client_id', + 'client_secret', + 'mailbox_list', + ]); + MetaModel::Init_SetZListItems('standard_search', [ + 'name', + 'provider', + 'status', + ]); + MetaModel::Init_SetZListItems('list', [ + 'status', + 'provider', + ]); + } + + public function PrefillCreationForm(&$aContextParam) + { + $this->Set('provider', 'Google'); + $this->Set('scope', 'EMail'); + $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); + + parent::PrefillCreationForm($aContextParam); + } + + public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '') + { + if ($sAttCode == 'provider' || $sAttCode == 'scope' || $sAttCode == 'redirect_url') { + return OPT_ATT_READONLY; + } + + return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState); + } + + public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array()) + { + if ($sAttCode == 'provider' || $sAttCode == 'scope' || $sAttCode == 'redirect_url') { + return OPT_ATT_READONLY; + } + + return parent::GetInitialStateAttributeFlags($sAttCode, $aReasons); + } + + /** + * Compute read-only values + * + * @return void + * @throws \ArchivedObjectException + * @throws \CoreException + * @throws \CoreUnexpectedValue + */ + public function ComputeValues() + { + parent::ComputeValues(); + if (empty($this->Get('provider'))) { + $this->Set('provider', 'Google'); + } + if (empty($this->Get('redirect_url'))) { + $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); + } + if (empty($this->Get('scope'))) { + $this->Set('scope', 'EMail'); + } + } + + + public function GetDefaultMailServer() + { + return 'imap.gmail.com'; + } + + public function GetScope() + { + return 'https://mail.google.com/'; + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php b/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php new file mode 100644 index 000000000..6ca4783b4 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php @@ -0,0 +1,79 @@ +Get('token')); + $aResult[] = new SeparatorPopupMenuItem(); + + $oAppContext = new ApplicationContext(); + $sMenu = $bHasToken ? 'Menu:RegenerateTokens' : 'Menu:GenerateTokens'; + $sObjClass = get_class($oObj); + $sClass = $sObjClass; + $sId = $oObj->GetKey(); + $sAjaxUri = utils::GetAbsoluteUrlModulePage(static::MODULE_CODE, 'ajax.php'); + // Add a new menu item that triggers a custom JS function defined in our own javascript file: js/sample.js + $sJSFileUrl = utils::GetAbsoluteUrlModulesRoot().static::MODULE_CODE.'/assets/js/oauth_connect.js'; + $sRedirectUri = OAuthClientProviderFactory::GetRedirectUri(); + $aResult[] = new JSPopupMenuItem( + $sMenu.' from '.$sObjClass, + Dict::S($sMenu), + "OAuthConnect('$sClass', $sId, '$sAjaxUri', '$sRedirectUri')", + [$sJSFileUrl] + ); + + if ($bHasToken) { + $sScope = $oObj->Get('scope'); + if ($sScope == 'EMail') { + $aParams = $oAppContext->GetAsHash(); + $sMenu = 'Menu:CreateMailbox'; + $sObjClass = get_class($oObj); + $aParams['class'] = $sObjClass; + $aParams['id'] = $oObj->GetKey(); + $aParams['operation'] = 'CreateMailbox'; + $aResult[] = new URLPopupMenuItem( + $sMenu.' from '.$sObjClass, + Dict::S($sMenu), + utils::GetAbsoluteUrlModulePage(static::MODULE_CODE, 'index.php', $aParams) + ); + } + } + } + break; + + default: + // Unknown type of menu, do nothing + break; + } + + return $aResult; + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.html.twig b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.html.twig new file mode 100644 index 000000000..578bce7b0 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.html.twig @@ -0,0 +1,3 @@ +{# @copyright Copyright (C) 2010-2022 Combodo SARL #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} + diff --git a/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.ready.js.twig b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.ready.js.twig new file mode 100644 index 000000000..8b3d10330 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.ready.js.twig @@ -0,0 +1,4 @@ +{# @copyright Copyright (C) 2010-2022 Combodo SARL #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} + +window.location.href = '{{ sURL|raw }}' \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/tr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/tr.dict.itop-oauth-client.php new file mode 100644 index 000000000..8ef119962 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/tr.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('TR TR', 'Turkish', 'TürkƧe', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('TR TR', 'Turkish', 'TürkƧe', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('TR TR', 'Turkish', 'TürkƧe', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-oauth-client/vendor/autoload.php b/datamodels/2.x/itop-oauth-client/vendor/autoload.php new file mode 100644 index 000000000..d7cdc470f --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * 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 + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var ?string */ + private $vendorDir; + + // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ + private $missingClasses = array(); + + /** @var ?string */ + private $apcuPrefix; + + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + /** + * @return string[] + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array[] + * @psalm-return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return string[] Array of classname => path + * @psalm-var array + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @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 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) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $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 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) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $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] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $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 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 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($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 indexed by their corresponding vendor directories. + * + * @return 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; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private + */ +function includeFile($file) +{ + include $file; +} diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/InstalledVersions.php b/datamodels/2.x/itop-oauth-client/vendor/composer/InstalledVersions.php new file mode 100644 index 000000000..d50e0c9fc --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/InstalledVersions.php @@ -0,0 +1,350 @@ + + * Jordi Boggiano + * + * 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` + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + 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 + */ + 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 + */ + 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 || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + 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($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, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} + */ + 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, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} + */ + 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}> + */ + 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, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + 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 = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } +} diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/LICENSE b/datamodels/2.x/itop-oauth-client/vendor/composer/LICENSE new file mode 100644 index 000000000..f27399a04 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/LICENSE @@ -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. + diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_classmap.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_classmap.php new file mode 100644 index 000000000..25e360e9d --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_classmap.php @@ -0,0 +1,13 @@ + $baseDir . '/src/Controller/AjaxOauthClientController.php', + 'Combodo\\iTop\\OAuthClient\\Controller\\OAuthClientController' => $baseDir . '/src/Controller/OAuthClientController.php', + 'Combodo\\iTop\\OAuthClient\\Service\\PopupMenuExtension' => $baseDir . '/src/Service/PopupMenuExtension.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_namespaces.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_namespaces.php new file mode 100644 index 000000000..b7fc0125d --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($baseDir . '/src'), +); diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_real.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_real.php new file mode 100644 index 000000000..ad033ac9f --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_real.php @@ -0,0 +1,46 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInitd52424b43ff18219f2ec935428aff074::getInitializer($loader)); + } else { + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->setClassMapAuthoritative(true); + $loader->register(true); + + return $loader; + } +} diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_static.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_static.php new file mode 100644 index 000000000..3f16c1e01 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_static.php @@ -0,0 +1,39 @@ + + array ( + 'Combodo\\iTop\\OAuthClient\\' => 25, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Combodo\\iTop\\OAuthClient\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + ); + + public static $classMap = array ( + 'Combodo\\iTop\\OAuthClient\\Controller\\AjaxOauthClientController' => __DIR__ . '/../..' . '/src/Controller/AjaxOauthClientController.php', + 'Combodo\\iTop\\OAuthClient\\Controller\\OAuthClientController' => __DIR__ . '/../..' . '/src/Controller/OAuthClientController.php', + 'Combodo\\iTop\\OAuthClient\\Service\\PopupMenuExtension' => __DIR__ . '/../..' . '/src/Service/PopupMenuExtension.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitd52424b43ff18219f2ec935428aff074::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitd52424b43ff18219f2ec935428aff074::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitd52424b43ff18219f2ec935428aff074::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/installed.json b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.json new file mode 100644 index 000000000..87fda747e --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.json @@ -0,0 +1,5 @@ +{ + "packages": [], + "dev": true, + "dev-package-names": [] +} diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/installed.php b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.php new file mode 100644 index 000000000..78d9f7563 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.php @@ -0,0 +1,23 @@ + array( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'type' => 'itop-extension', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => '1135896b3d084aa9df778bfbb724b7e992534989', + 'name' => 'combodo/itop-oauth-client', + 'dev' => true, + ), + 'versions' => array( + 'combodo/itop-oauth-client' => array( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'type' => 'itop-extension', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => '1135896b3d084aa9df778bfbb724b7e992534989', + 'dev_requirement' => false, + ), + ), +); diff --git a/datamodels/2.x/itop-oauth-client/zh_cn.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/zh_cn.dict.itop-oauth-client.php new file mode 100644 index 000000000..e4f644fde --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/zh_cn.dict.itop-oauth-client.php @@ -0,0 +1,74 @@ + 'Create a mailbox...~~', + 'Menu:OAuthClient' => 'OAuth Client~~', + 'Menu:OAuthClient+' => '~~', + 'Menu:GenerateTokens' => 'Generate access tokens...~~', + 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~', + + 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~', + + 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~', + 'itop-oauth-client:TestSMTP' => 'Email send test~~', + 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~', + 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~', + 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~', + 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~', +]); + +// +// Class: OAuthClient +// + +Dict::Add('ZH CN', 'Chinese', '简体中文', [ + 'Class:OAuthClient' => 'Oauth Client~~', + 'Class:OAuthClient/Attribute:provider' => 'Provider~~', + 'Class:OAuthClient/Attribute:provider+' => '~~', + 'Class:OAuthClient/Attribute:name' => 'Login~~', + 'Class:OAuthClient/Attribute:name+' => '~~', + 'Class:OAuthClient/Attribute:scope' => 'Scope~~', + 'Class:OAuthClient/Attribute:scope+' => '~~', + 'Class:OAuthClient/Attribute:description' => 'Description~~', + 'Class:OAuthClient/Attribute:description+' => '~~', + 'Class:OAuthClient/Attribute:client_id' => 'Client id~~', + 'Class:OAuthClient/Attribute:client_id+' => '~~', + 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~', + 'Class:OAuthClient/Attribute:client_secret+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~', + 'Class:OAuthClient/Attribute:refresh_token+' => '~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~', + 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:token' => 'Access token~~', + 'Class:OAuthClient/Attribute:token+' => '~~', + 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~', + 'Class:OAuthClient/Attribute:token_expiration+' => '~~', + 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~', + 'Class:OAuthClient/Attribute:redirect_url+' => '~~', + 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~', + 'Class:OAuthClient/Attribute:mailbox_list+' => '~~', +]); + +// +// Class: OAuthClientAzure +// +Dict::Add('ZH CN', 'Chinese', '简体中文', [ + 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~', + 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~', + +]); + +// +// Class: OAuthClientGoogle +// +Dict::Add('ZH CN', 'Chinese', '简体中文', [ + 'Class:OAuthClientGoogle' => 'OAuth client for Google~~', + 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~', +]); + diff --git a/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php index ffa019b87..6742a5ed8 100644 --- a/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php @@ -33,28 +33,28 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Portal:Button:Delete' => '删除', 'Portal:EnvironmentBanner:Title' => 'ę‚Øē›®å‰å¤„äŗŽ %1$s ęØ”å¼', 'Portal:EnvironmentBanner:GoToProduction' => 'å›žåˆ°äŗ§å“ęØ”å¼', - 'Error:HTTP:400' => 'Bad request~~', - 'Error:HTTP:401' => '认证', + 'Error:HTTP:400' => '请求错误', + 'Error:HTTP:401' => '认证错误', 'Error:HTTP:404' => 'é”µé¢ę‰¾äøåˆ°', 'Error:HTTP:500' => 'Oops! å‘ē”Ÿäŗ†äø€äøŖé”™čÆÆ.', 'Error:HTTP:GetHelp' => 'å¦‚ęžœé—®é¢˜ä»ē„¶å­˜åœØ,čÆ·č”ē³»ē®”ē†å‘˜.', 'Error:XHR:Fail' => 'ę— ę³•åŠ č½½ę•°ę®, čÆ·č”ē³»ē®”ē†å‘˜', - 'Portal:ErrorUserLoggedOut' => 'ę‚Øå·²é€€å‡ŗļ¼ŒčÆ·é‡ę–°ē™»å½•.', + 'Portal:ErrorUserLoggedOut' => '您已退出,čÆ·é‡ę–°ē™»å½•.', 'Portal:Datatables:Language:Processing' => 'čÆ·ēØåŽ...', 'Portal:Datatables:Language:Search' => '过滤器:', 'Portal:Datatables:Language:LengthMenu' => 'ęÆé”µę˜¾ē¤ŗ _MENU_ 锹', 'Portal:Datatables:Language:ZeroRecords' => 'ę²”ęœ‰ē»“ęžœ', 'Portal:Datatables:Language:Info' => '第 _PAGE_ 锵,共 _PAGES_ 锵', 'Portal:Datatables:Language:InfoEmpty' => 'ę²”ęœ‰äæ”ęÆ', - 'Portal:Datatables:Language:InfoFiltered' => 'filtered out of _MAX_ items', + 'Portal:Datatables:Language:InfoFiltered' => 'ęœ€å¤ščæ‡ę»¤ _MAX_ 锹', 'Portal:Datatables:Language:EmptyTable' => 'č”Øę ¼äø­ę²”ęœ‰ę•°ę®', 'Portal:Datatables:Language:DisplayLength:All' => 'å…ØéƒØ', 'Portal:Datatables:Language:Paginate:First' => '首锵', 'Portal:Datatables:Language:Paginate:Previous' => 'äøŠäø€é”µ', 'Portal:Datatables:Language:Paginate:Next' => '下一锵', 'Portal:Datatables:Language:Paginate:Last' => '尾锵', - 'Portal:Datatables:Language:Sort:Ascending' => 'å‡åŗęŽ’åŗ', - 'Portal:Datatables:Language:Sort:Descending' => 'é™åŗęŽ’åŗ', + 'Portal:Datatables:Language:Sort:Ascending' => 'å‡åŗ', + 'Portal:Datatables:Language:Sort:Descending' => 'é™åŗ', 'Portal:Autocomplete:NoResult' => 'ę²”ęœ‰ę•°ę®', 'Portal:Attachments:DropZone:Message' => 'ęŠŠę–‡ä»¶ę·»åŠ äøŗé™„ä»¶', 'Portal:File:None' => 'ę²”ęœ‰ę–‡ä»¶', @@ -110,7 +110,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Brick:Portal:Manage:Name' => '箔理锹目', 'Brick:Portal:Manage:Table:NoData' => 'ę²”ęœ‰é”¹ē›®.', - 'Brick:Portal:Manage:Table:ItemActions' => 'Actions', + 'Brick:Portal:Manage:Table:ItemActions' => 'ę“ä½œ', 'Brick:Portal:Manage:DisplayMode:list' => 'åˆ—č”Ø', 'Brick:Portal:Manage:DisplayMode:pie-chart' => '鄼图', 'Brick:Portal:Manage:DisplayMode:bar-chart' => 'ę”å½¢å›¾', @@ -135,8 +135,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Brick:Portal:Object:Form:Message:ObjectSaved' => 'å·²äæå­˜ %1$s~~', 'Brick:Portal:Object:Search:Regular:Title' => '选ꋩ %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => '选ꋩ %1$s (%2$s)', - 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', - 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s', + 'Brick:Portal:Object:Copy:Tooltip' => 'å¤åˆ¶åÆ¹č±”é“¾ęŽ„', 'Brick:Portal:Object:Copy:CopiedTooltip' => '已复制' )); diff --git a/datamodels/2.x/itop-portal-base/portal/bin/console b/datamodels/2.x/itop-portal-base/portal/bin/console index 02af7bfa0..140caa4db 100644 --- a/datamodels/2.x/itop-portal-base/portal/bin/console +++ b/datamodels/2.x/itop-portal-base/portal/bin/console @@ -14,20 +14,18 @@ set_time_limit(0); if (!defined('APPROOT')) { - if (file_exists(__DIR__.'/../../../../approot.inc.php')) - { - require_once __DIR__.'/../../../../approot.inc.php'; // When in env-xxxx folder - } - else - { - require_once __DIR__.'/../../../../../approot.inc.php'; // When in datamodels/x.x folder - } + if (file_exists(__DIR__.'/../../../../approot.inc.php')) { + require_once __DIR__ . '/../../../../approot.inc.php'; // When in env-xxxx folder + } else { + require_once __DIR__ . '/../../../../../approot.inc.php'; // When in datamodels/x.x folder + } } -require_once APPROOT.'lib/autoload.php'; +require_once APPROOT . 'lib/autoload.php'; -if (!class_exists(Application::class)) -{ - throw new RuntimeException('You need to add "symfony/framework-bundle" as a Composer dependency.'); +require_once APPROOT . 'application/startup.inc.php'; + +if (!class_exists(Application::class)) { + throw new RuntimeException('You need to add "symfony/framework-bundle" as a Composer dependency.'); } // Remove --portal_id from CLI params to avoid SF CLI conflicts diff --git a/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php b/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php index 2a64a5c79..eb79bf4fc 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php +++ b/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php @@ -21,7 +21,7 @@ // Disable PhpUnhandledExceptionInspection as the exception handling is made by the file including this one /** @noinspection PhpUnhandledExceptionInspection */ -use Symfony\Component\Debug\Debug; +use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\Dotenv\Dotenv; // Global autoloader (portal autoloader is already required through module.itop-portal-base.php) @@ -43,55 +43,43 @@ if (!defined('MODULESROOT')) // Load cached env vars if the .env.local.php file exists // Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) -if (is_array($sEnv = @include dirname(__DIR__).'/.env.local.php')) -{ - $_ENV += $sEnv; -} -elseif (!class_exists(Dotenv::class)) -{ +if (file_exists(dirname(__DIR__).'/.env.local.php')) { + if (is_array($sEnv = @include dirname(__DIR__).'/.env.local.php')) { + $_ENV += $sEnv; + } +} elseif (!class_exists(Dotenv::class)) { throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} -else -{ +} else { $sPath = dirname(__DIR__).'/.env'; $oDotenv = new Dotenv(); + $oDotenv->usePutenv(); // load all the .env files - if (method_exists($oDotenv, 'loadEnv')) - { + if (method_exists($oDotenv, 'loadEnv')) { $oDotenv->loadEnv($sPath); - } - else - { + } else { // fallback code in case your Dotenv component is not 4.2 or higher (when loadEnv() was added) - if (file_exists($sPath) || !file_exists($sPathDist = "$sPath.dist")) - { + if (file_exists($sPath) || !file_exists($sPathDist = "$sPath.dist")) { $oDotenv->load($sPath); - } - else - { + } else { $oDotenv->load($sPathDist); } - if (null === $sEnv = (isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : (isset($_ENV['APP_ENV']) ? $_ENV['APP_ENV'] : null))) - { + if (null === $sEnv = (isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : (isset($_ENV['APP_ENV']) ? $_ENV['APP_ENV'] : null))) { $oDotenv->populate(array('APP_ENV' => $sEnv = 'prod')); } - if ('test' !== $sEnv && file_exists($sPathDist = "$sPath.local")) - { + if ('test' !== $sEnv && file_exists($sPathDist = "$sPath.local")) { $oDotenv->load($sPathDist); $sEnv = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : (isset($_ENV['APP_ENV']) ? $_ENV['APP_ENV'] : $sEnv); } - if (file_exists($sPathDist = "$sPath.$sEnv")) - { + if (file_exists($sPathDist = "$sPath.$sEnv")) { $oDotenv->load($sPathDist); } - if (file_exists($sPathDist = "$sPath.$sEnv.local")) - { + if (file_exists($sPathDist = "$sPath.$sEnv.local")) { $oDotenv->load($sPathDist); } } diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml index 37e916327..5e374f117 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml +++ b/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml @@ -1,10 +1,10 @@ framework: cache: - # Put the unique name of your app here: the prefix seed - # is used to compute stable namespaces for cache keys. + # Unique name of your app: used to compute stable namespaces for cache keys. #prefix_seed: your_vendor_name/app_name - # The app cache caches to the filesystem by default. + # The "app" cache stores to the filesystem by default. + # The data in this cache should persist between deploys. # Other options include: # Redis @@ -16,4 +16,4 @@ framework: # Namespaced pools use the above "app" backend by default #pools: - #my.dedicated.cache: ~ + #my.dedicated.cache: null diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/routing.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/dev/routing.yaml deleted file mode 100644 index a3d2503d5..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/routing.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - router: - strict_requirements: true diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/dev/web_profiler.yaml deleted file mode 100644 index 278d5fd42..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: true - intercept_redirects: false - -framework: - profiler: { only_exceptions: false } \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml index 27b6842c7..b5707a878 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml +++ b/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml @@ -7,9 +7,25 @@ framework: # Enables session support. Note that the session will ONLY be started if you read or write from it. # Remove or comment this section to explicitly disable session support. session: - handler_id: ~ + handler_id: null + cookie_secure: auto + cookie_samesite: lax + storage_factory_id: session.storage.factory.native #esi: true #fragments: true php_errors: log: true + +when@test: + framework: + test: true + profiler: { collect: false } + router: { strict_requirements: true} + session: + storage_factory_id: session.storage.factory.mock_file + +when@dev: + framework: + profiler: { only_exceptions: false } + router: { strict_requirements: true} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml index 17ae54822..8701b05af 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml +++ b/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml @@ -1,3 +1,17 @@ framework: router: - strict_requirements: ~ + utf8: true + + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + #default_uri: http://localhost + +when@prod: + framework: + router: + strict_requirements: null + +when@dev: + framework: + router: + strict_requirements: true \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/test/framework.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/test/framework.yaml deleted file mode 100644 index d153e0d23..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/test/framework.yaml +++ /dev/null @@ -1,4 +0,0 @@ -framework: - test: true - session: - storage_id: session.storage.mock_file diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/test/routing.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/test/routing.yaml deleted file mode 100644 index a3d2503d5..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/test/routing.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - router: - strict_requirements: true diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/test/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/test/web_profiler.yaml deleted file mode 100644 index fd7ff5a35..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/test/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: false - intercept_redirects: false - -framework: - profiler: { collect: false } \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml index e4a98b501..e17e03cc9 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml +++ b/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml @@ -2,3 +2,7 @@ twig: default_path: '%combodo.modules.absolute_path%' debug: '%kernel.debug%' strict_variables: '%kernel.debug%' + +when@test: + twig: + strict_variables: true \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/web_profiler.yaml new file mode 100644 index 000000000..7676f2292 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/config/packages/web_profiler.yaml @@ -0,0 +1,12 @@ + +when@dev: + web_profiler: + toolbar: true + intercept_redirects: false + +when@test: + web_profiler: + toolbar: false + intercept_redirects: false + + diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/twig.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/dev/twig.yaml deleted file mode 100644 index 93c0e4cf8..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/twig.yaml +++ /dev/null @@ -1,3 +0,0 @@ -_errors: - resource: '@TwigBundle/Resources/config/routing/errors.xml' - prefix: /_error diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/dev/web_profiler.yaml deleted file mode 100644 index df4ab33bf..000000000 --- a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/web_profiler.yaml +++ /dev/null @@ -1,7 +0,0 @@ -web_profiler_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' - prefix: /_wdt - -web_profiler_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' - prefix: /_profiler \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/framework.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/framework.yaml new file mode 100644 index 000000000..0fc74bbac --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/config/routes/framework.yaml @@ -0,0 +1,4 @@ +when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + prefix: /_error diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/web_profiler.yaml new file mode 100644 index 000000000..8d85319fd --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/config/routes/web_profiler.yaml @@ -0,0 +1,8 @@ +when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/datamodels/2.x/itop-portal-base/portal/config/services.yaml b/datamodels/2.x/itop-portal-base/portal/config/services.yaml index 249b6b42e..17e82f3f1 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/services.yaml +++ b/datamodels/2.x/itop-portal-base/portal/config/services.yaml @@ -24,8 +24,6 @@ imports: # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration parameters: - # Replace default url generator service - router.options.generator_base_class: Combodo\iTop\Portal\Routing\UrlGenerator # Used in templates combodo.current_environment: '%env(string:COMBODO_CURRENT_ENVIRONMENT)%' @@ -100,17 +98,19 @@ services: - '@Combodo\iTop\Portal\Twig\AppVariable.inner' - '@service_container' + Combodo\iTop\Portal\Routing\UrlGenerator: + decorates: 'router' + arguments: ['@Combodo\iTop\Portal\Routing\UrlGenerator.inner'] + # Standard services combodo.current_contact.photo_url: public: true class: Combodo\iTop\Portal\VariableAccessor\CombodoCurrentContactPhotoUrl - arguments: ['@combodo.current_user', '@service_container'] - # Note: This service is initialized with a UserLocal object as it needs a class that can be instantiated. - # Anyway, it will be replaced with the real class by UserProvider in onKernelRequestEvent. - # Note: Services relying on this one should use \User in their signature and not \UserLocal. + arguments: ['@Combodo\iTop\Portal\EventListener\UserProvider', '@service_container'] + combodo.current_user: + alias: Combodo\iTop\Portal\Twig\CurrentUserAccessor public: true - class: UserLocal # Aliases brick_collection: diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php index 9d69df51b..89ddeaba0 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php @@ -20,7 +20,7 @@ namespace Combodo\iTop\Portal\Controller; -use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use \Symfony\Bundle\FrameworkBundle\Controller\AbstractController as SymfonyAbstractController; /** * Class AbstractController @@ -29,8 +29,37 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; * @author Guillaume Lajarige * @since 2.3.0 */ -abstract class AbstractController extends Controller +abstract class AbstractController extends SymfonyAbstractController { + /** + * Return services needed inside controllers. + * Allow access to service via $controller->get(`service_name`). + * + * Improvement: Use service dependency injection + * + * @return array array of service injected to controllers + * @since 3.1.0 + * + */ + public static function getSubscribedServices(): array + { + return array_merge(parent::getSubscribedServices(), [ + 'brick_collection' => 'Combodo\iTop\Portal\Brick\BrickCollection', + 'request_manipulator' => 'Combodo\iTop\Portal\Helper\RequestManipulatorHelper', + 'scope_validator' => 'Combodo\iTop\Portal\Helper\ScopeValidatorHelper', + 'security_helper' => 'Combodo\iTop\Portal\Helper\SecurityHelper', + 'context_manipulator' => 'Combodo\iTop\Portal\Helper\ContextManipulatorHelper', + 'navigation_rule_helper' => 'Combodo\iTop\Portal\Helper\NavigationRuleHelper', + 'ui_extensions_helper' => 'Combodo\iTop\Portal\Helper\UIExtensionsHelper', + 'lifecycle_validator' => 'Combodo\iTop\Portal\Helper\LifecycleValidatorHelper', + 'url_generator' => 'router', + 'object_form_handler' => 'Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper', + 'browse_brick' => 'Combodo\iTop\Portal\Helper\BrowseBrickHelper', + 'brick_controller_helper' => 'Combodo\iTop\Portal\Helper\BrickControllerHelper', + 'session_message_helper' => 'Combodo\iTop\Portal\Helper\SessionMessageHelper', + ]); + } + /** * Unlike {@see \Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait::redirectToRoute()}, this method directly calls the route controller without creating a redirection client side * diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php index 682b084f7..4fde47639 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php @@ -40,11 +40,11 @@ class AggregatePageBrickController extends BrickController { /** * @param \Symfony\Component\HttpFoundation\Request $oRequest - * @param string $sBrickId + * @param string $sBrickId * * @return \Symfony\Component\HttpFoundation\Response * - * @throws \Combodo\iTop\Portal\Brick\BrickNotFoundException + * @throws BrickNotFoundException * @throws \Exception */ public function DisplayAction(Request $oRequest, $sBrickId) diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php index a78973331..7bec67c51 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php @@ -20,7 +20,7 @@ namespace Combodo\iTop\Portal\EventListener; use ApplicationContext; -use Symfony\Component\HttpKernel\Event\GetResponseEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; use UserRights; use utils; @@ -34,17 +34,16 @@ use utils; class ApplicationContextSetPluginPropertyClass { /** - * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent + * @param RequestEvent $oRequestEvent */ - public function onKernelRequest(GetResponseEvent $oGetResponseEvent) - { - // Enable archived data - utils::InitArchiveMode(); - - // Enabling datalocalizer if needed - if (!defined('DISABLE_DATA_LOCALIZER_PORTAL')) - { - ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', UserRights::GetUserLanguage()); - } - } + public function onKernelRequest(RequestEvent $oRequestEvent) + { + // Enable archived data + utils::InitArchiveMode(); + + // Enabling datalocalizer if needed + if (!defined('DISABLE_DATA_LOCALIZER_PORTAL')) { + ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', UserRights::GetUserLanguage()); + } + } } \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php index 286d333c3..c0574e454 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php @@ -20,7 +20,7 @@ namespace Combodo\iTop\Portal\EventListener; use ApplicationContext; -use Symfony\Component\HttpKernel\Event\GetResponseEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; /** * Class ApplicationContextSetUrlMakerClass @@ -43,13 +43,12 @@ class ApplicationContextSetUrlMakerClass } /** - * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent + * @param RequestEvent $oRequestEvent */ - public function onKernelRequest(GetResponseEvent $oGetResponseEvent) - { - if ($this->aCombodoPortalInstanceConf['properties']['urlmaker_class'] !== null) - { - ApplicationContext::SetUrlMakerClass($this->aCombodoPortalInstanceConf['properties']['urlmaker_class']); - } - } + public function onKernelRequest(RequestEvent $oRequestEvent) + { + if ($this->aCombodoPortalInstanceConf['properties']['urlmaker_class'] !== null) { + ApplicationContext::SetUrlMakerClass($this->aCombodoPortalInstanceConf['properties']['urlmaker_class']); + } + } } \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php index de5253180..0b914c0dd 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php @@ -19,7 +19,7 @@ namespace Combodo\iTop\Portal\EventListener; -use Symfony\Component\HttpKernel\Event\GetResponseEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; use utils; /** @@ -47,19 +47,17 @@ class CssFromSassCompiler } /** - * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent + * @param RequestEvent $oRequestEvent */ - public function onKernelRequest(GetResponseEvent $oGetResponseEvent) + public function onKernelRequest(RequestEvent $oRequestEvent) { // Force compilation need only when by-passing cache to limit server load. - if (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] !== 'no-cache')) - { + if (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] !== 'no-cache')) { return; } $aImportPaths = array($_ENV['COMBODO_PORTAL_BASE_ABSOLUTE_PATH'].'css/'); - foreach ($this->aCombodoPortalInstanceConf['properties']['themes'] as $sKey => $value) - { + foreach ($this->aCombodoPortalInstanceConf['properties']['themes'] as $sKey => $value) { if (!is_array($value)) { utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$value, $aImportPaths); diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php index 6b585ffbe..bde7d0f60 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php @@ -24,13 +24,12 @@ namespace Combodo\iTop\Portal\EventListener; use Dict; use ExceptionLog; -use IssueLog; -use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; /** @@ -52,10 +51,10 @@ class ExceptionListener implements ContainerAwareInterface * @throws \Twig\Error\RuntimeError * @throws \Twig\Error\SyntaxError */ - public function onKernelException(GetResponseForExceptionEvent $oEvent) + public function onKernelException(ExceptionEvent $oEvent) { // Get the exception object from the received event - $oException = $oEvent->getException(); + $oException = $oEvent->getThrowable(); // Prepare / format exception data if ($oException instanceof \MySQLException) { @@ -78,7 +77,7 @@ class ExceptionListener implements ContainerAwareInterface } // Prepare flatten exception - $oFlattenException = ($_SERVER['APP_DEBUG'] == 1) ? FlattenException::create($oException) : null; + $oFlattenException = ($_SERVER['APP_DEBUG'] == 1) ? FlattenException::createFromThrowable($oException) : null; // Remove APPROOT from file paths if in production (SF context) if (!is_null($oFlattenException) && ($_SERVER['APP_ENV'] === 'prod')) { diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php index da42e9370..439e92fa6 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php @@ -26,7 +26,7 @@ use ModuleDesign; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Event\GetResponseEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Exception\HttpException; use UserRights; @@ -44,12 +44,16 @@ class UserProvider implements ContainerAwareInterface private $sPortalId; /** @var \Symfony\Component\DependencyInjection\ContainerInterface $container */ private $oContainer; + /** @var \User $oUser */ + private $oUser; + /** @var array $aAllowedPortals */ + private $aAllowedPortals; /** * UserProvider constructor. * * @param \ModuleDesign $oModuleDesign - * @param string $sPortalId + * @param string $sPortalId */ public function __construct(ModuleDesign $oModuleDesign, $sPortalId) { @@ -58,11 +62,11 @@ class UserProvider implements ContainerAwareInterface } /** - * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent + * @param RequestEvent $oRequestEvent * * @throws \Exception */ - public function onKernelRequest(GetResponseEvent $oGetResponseEvent) + public function onKernelRequest(RequestEvent $oRequestEvent) { // User pre-checks // Note: The following note and handling of the $iExitMethod were for the old login mechanism @@ -71,45 +75,62 @@ class UserProvider implements ContainerAwareInterface // // Note: At this point the Exception handler is not registered, so we can't use $oApp::abort() method, hence the die(). // - Checking user rights and prompt if needed (401 HTTP code returned if XHR request) - $iExitMethod = ($oGetResponseEvent->getRequest()->isXmlHttpRequest()) ? LoginWebPage::EXIT_RETURN : LoginWebPage::EXIT_PROMPT; + $iExitMethod = ($oRequestEvent->getRequest()->isXmlHttpRequest()) ? LoginWebPage::EXIT_RETURN : LoginWebPage::EXIT_PROMPT; $iLogonRes = LoginWebPage::DoLoginEx($this->sPortalId, false, $iExitMethod); - if( ($iExitMethod === LoginWebPage::EXIT_RETURN) && ($iLogonRes != 0) ) - { + if( ($iExitMethod === LoginWebPage::EXIT_RETURN) && ($iLogonRes != 0) ) { die(Dict::S('Portal:ErrorUserLoggedOut')); } // - User must be associated with a Contact - if (UserRights::GetContactId() == 0) - { + if (UserRights::GetContactId() == 0) { die(Dict::S('Portal:ErrorNoContactForThisUser')); } // User - $oUser = UserRights::GetUserObject(); - if ($oUser === null) - { + $this->oUser = UserRights::GetUserObject(); + if ($this->oUser === null) { throw new Exception('Could not load connected user.'); } - $this->oContainer->set('combodo.current_user', $oUser); // Allowed portals $aAllowedPortals = UserRights::GetAllowedPortals(); // Checking that user is allowed this portal $bAllowed = false; - foreach ($aAllowedPortals as $aAllowedPortal) - { - if ($aAllowedPortal['id'] === $this->sPortalId) - { + foreach ($aAllowedPortals as $aAllowedPortal) { + if ($aAllowedPortal['id'] === $this->sPortalId) { $bAllowed = true; break; } } - if (!$bAllowed) - { + if (!$bAllowed) { throw new HttpException(Response::HTTP_NOT_FOUND); } - /** @noinspection PhpParamsInspection It's an array and it's gonna stay that way */ - $this->oContainer->set('combodo.current_user.allowed_portals', $aAllowedPortals); + + $this->aAllowedPortals = $aAllowedPortals; + } + + /** + * Get current user. + * + * @return \User current user + * @since 3.1.0 + * + */ + public function getCurrentUser() + { + return $this->oUser; + } + + /** + * Get allowed portals. + * + * @return array allowed portals + * @since 3.1.0 + * + */ + public function getAllowedPortals() + { + return $this->aAllowedPortals; } /** diff --git a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php index 2c36eed94..e77312602 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php @@ -36,7 +36,8 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Twig_Environment; +use Twig\Environment; +use Twig\Loader\ArrayLoader; use Twig_Loader_Array; use URLButtonItem; use UserRights; @@ -420,7 +421,7 @@ class ObjectFormHandlerHelper public function RenderFormFromTwig($sId, $sTwigString, $aData) { // Creating sandbox twig env. to load and test the custom form template - $oTwig = new Twig_Environment(new Twig_Loader_Array(array($sId => $sTwigString))); + $oTwig = new Environment(new ArrayLoader(array($sId => $sTwigString))); // Manually registering filters and functions as we didn't find how to do it automatically $aFilters = $this->oAppExtension->getFilters(); diff --git a/datamodels/2.x/itop-portal-base/portal/src/Kernel.php b/datamodels/2.x/itop-portal-base/portal/src/Kernel.php index f67bab16c..d0ecb0b21 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Kernel.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Kernel.php @@ -83,9 +83,6 @@ class Kernel extends BaseKernel protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) { $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); - // Feel free to remove the "container.autowiring.strict_mode" parameter - // if you are using symfony/dependency-injection 4.0+ as it's the default behavior - $container->setParameter('container.autowiring.strict_mode', true); $container->setParameter('container.dumper.inline_class_loader', true); $confDir = $this->getProjectDir().'/config'; diff --git a/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php b/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php index f16ed4f49..1dd2b4e86 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php @@ -19,43 +19,72 @@ namespace Combodo\iTop\Portal\Routing; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\RouterInterface; use utils; -use Symfony\Component\Routing\Generator\UrlGenerator as BaseUrlGenerator; /** * Class UrlGenerator * + * @author Benjamin Dalsass * @package Combodo\iTop\Portal\Routing - * @since 2.7.0 - * @author Bruno Da Silva - * @author Guillaume Lajarige + * @since 3.1.0 */ -class UrlGenerator extends BaseUrlGenerator +class UrlGenerator implements RouterInterface { - /** @noinspection PhpTooManyParametersInspection */ + /** @var \Symfony\Component\Routing\RouterInterface $router */ + private $router; + /** - * Overloading of the parent function to add the $_REQUEST parameters to the url parameters. - * This is used to keep additional parameters in the url, especially when portal is accessed from the /pages/exec.php + * Constructor. * - * Note: As of now, it only adds the exec_module/exec_page/portal_id/env_switch/debug parameters. Any other parameter will be ignored. - * - * @param $variables - * @param $defaults - * @param $requirements - * @param $tokens - * @param $parameters - * @param $name - * @param $referenceType - * @param $hostTokens - * @param array $requiredSchemes - * - * @return string + * @param \Symfony\Component\Routing\RouterInterface $router */ - protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array()) + public function __construct(RouterInterface $router) + { + $this->router = $router; + } + + /** + * @inheritDoc + */ + public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH) { $parameters = $this->getExtraParams($parameters); - return parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes); + return $this->router->generate($name, $parameters, $referenceType); + } + + /** + * @inheritDoc + */ + public function setContext(RequestContext $context) + { + $this->router->setContext($context); + } + + /** + * @inheritDoc + */ + public function getContext() + { + return $this->router->getContext(); + } + + /** + * @inheritDoc + */ + public function getRouteCollection() + { + return $this->router->getRouteCollection(); + } + + /** + * @inheritDoc + */ + public function match($pathinfo) + { + return $this->router->match($pathinfo); } /** @@ -67,26 +96,22 @@ class UrlGenerator extends BaseUrlGenerator { $sExecModule = utils::ReadParam('exec_module', '', false, 'string'); $sExecPage = utils::ReadParam('exec_page', '', false, 'string'); - if ($sExecModule !== '' && $sExecPage !== '') - { + if ($sExecModule !== '' && $sExecPage !== '') { $aParameters['exec_module'] = $sExecModule; $aParameters['exec_page'] = $sExecPage; } // Optional parameters $sPortalId = utils::ReadParam('portal_id', '', false, 'string'); - if ($sPortalId !== '') - { + if ($sPortalId !== '') { $aParameters['portal_id'] = $sPortalId; } $sEnvSwitch = utils::ReadParam('env_switch', '', false, 'string'); - if ($sEnvSwitch !== '') - { + if ($sEnvSwitch !== '') { $aParameters['env_switch'] = $sEnvSwitch; } $sDebug = utils::ReadParam('debug', '', false, 'string'); - if ($sDebug !== '') - { + if ($sDebug !== '') { $aParameters['debug'] = $sDebug; } diff --git a/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php index 1790b5426..b783fb79b 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php @@ -19,18 +19,9 @@ namespace Combodo\iTop\Portal\Twig; -use AttributeDate; use Combodo\iTop\Application\TwigBase\Twig\Extension; use Twig\Extension\AbstractExtension; -use AttributeDateTime; -use AttributeText; -use Twig_SimpleFilter; -use Twig_SimpleFunction; -use utils; -use Dict; -use MetaModel; - /** * Class AppExtension * diff --git a/datamodels/2.x/itop-portal-base/portal/src/Twig/AppGlobal.php b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppGlobal.php new file mode 100644 index 000000000..a1c3907d4 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppGlobal.php @@ -0,0 +1,63 @@ + + * @package Combodo\iTop\Portal\Twig + * @since 3.1.0 + */ +class AppGlobal extends AbstractExtension implements GlobalsInterface +{ + /** @var \Combodo\iTop\Portal\EventListener\UserProvider $userProvider */ + private $userProvider; + + /** + * Constructor. + * + * @param \Combodo\iTop\Portal\EventListener\UserProvider $userProvider + */ + public function __construct(UserProvider $userProvider) + { + $this->userProvider = $userProvider; + } + + /** + * Return global variables. + * + * @return array + */ + public function getGlobals(): array + { + $data = array(); + $data['allowed_portals'] = $this->userProvider->getAllowedPortals(); + + return $data; + } + +} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Twig/CurrentUserAccessor.php b/datamodels/2.x/itop-portal-base/portal/src/Twig/CurrentUserAccessor.php new file mode 100644 index 000000000..28a1f567a --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/Twig/CurrentUserAccessor.php @@ -0,0 +1,64 @@ +> app['combodo.current_user'].Get('first_name') + * To prevent changes in templates we expose a service CurrentUserAccessor with a bridge role. + * + * @author Benjamin Dalsass + * @package Combodo\iTop\Portal\Twig + * @since 3.1.0 + */ +class CurrentUserAccessor +{ + /** @var \Combodo\iTop\Portal\EventListener\UserProvider $userProvider */ + private $userProvider; + + /** + * Constructor. + * + * @param \Combodo\iTop\Portal\EventListener\UserProvider $userProvider + */ + public function __construct(UserProvider $userProvider) + { + $this->userProvider = $userProvider; + } + + /** + * Get (UserLocal meme function) + * + * @param $key + * + * @return int|mixed|\ormLinkSet|string|null + * @throws \ArchivedObjectException + * @throws \CoreException + */ + public function Get($key) + { + return $this->userProvider->getCurrentUser()->Get($key); + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php b/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php index 5ae7f2412..34b3b52f3 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php +++ b/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php @@ -20,10 +20,10 @@ namespace Combodo\iTop\Portal\VariableAccessor; +use Combodo\iTop\Portal\EventListener\UserProvider; use Exception; use MetaModel; use Symfony\Component\DependencyInjection\ContainerInterface; -use User; use UserRights; /** @@ -35,25 +35,24 @@ use UserRights; */ class CombodoCurrentContactPhotoUrl { - /** @var \User $oUser */ - private $oUser; /** @var string $sCombodoPortalBaseAbsoluteUrl */ private $sCombodoPortalBaseAbsoluteUrl; /** @var string|null $sContactPhotoUrl */ private $sContactPhotoUrl; /** @var \Symfony\Component\DependencyInjection\ContainerInterface */ private $oContainer; + /** @var UserProvider $oUserProvider */ + private $oUserProvider; /** * CombodoCurrentContactPhotoUrl constructor. * - * @param \User $oUser * @param \Symfony\Component\DependencyInjection\ContainerInterface $oContainer - * @param string $sCombodoPortalBaseAbsoluteUrl + * @param string $sCombodoPortalBaseAbsoluteUrl */ - public function __construct(User $oUser, ContainerInterface $oContainer, $sCombodoPortalBaseAbsoluteUrl) + public function __construct(UserProvider $userProvider, ContainerInterface $oContainer, $sCombodoPortalBaseAbsoluteUrl) { - $this->oUser = $oUser; + $this->oUserProvider = $userProvider; $this->oContainer = $oContainer; $this->sCombodoPortalBaseAbsoluteUrl = $sCombodoPortalBaseAbsoluteUrl; $this->sContactPhotoUrl = null; @@ -65,8 +64,7 @@ class CombodoCurrentContactPhotoUrl */ public function __toString() { - if ($this->sContactPhotoUrl === null) - { + if ($this->sContactPhotoUrl === null) { $this->sContactPhotoUrl = $this->ComputeContactPhotoUrl(); } @@ -84,44 +82,35 @@ class CombodoCurrentContactPhotoUrl // Contact $sContactPhotoUrl = "{$this->sCombodoPortalBaseAbsoluteUrl}img/user-profile-default-256px.png"; // - Checking if we can load the contact - try - { + try { /** @var \cmdbAbstractObject $oContact */ $oContact = UserRights::GetContactObject(); } - catch (Exception $e) - { - $oAllowedOrgSet = $this->oUser->Get('allowed_org_list'); - if ($oAllowedOrgSet->Count() > 0) - { + catch (Exception $e) { + $oUser = $this->oUserProvider->getCurrentUser(); + $oAllowedOrgSet = $oUser->Get('allowed_org_list'); + if ($oAllowedOrgSet->Count() > 0) { throw new Exception('Could not load contact related to connected user. (Tip: Make sure the contact\'s organization is among the user\'s allowed organizations)'); - } - else - { + } else { throw new Exception('Could not load contact related to connected user.'); } } // - Retrieving picture - if ($oContact) - { + if ($oContact) { $sPictureAttCode = 'picture'; - if (MetaModel::IsValidAttCode(get_class($oContact), $sPictureAttCode)) - { + if (MetaModel::IsValidAttCode(get_class($oContact), $sPictureAttCode)) { /** @var \ormDocument $oImage */ $oImage = $oContact->Get($sPictureAttCode); - if (is_object($oImage) && !$oImage->IsEmpty()) - { + if (is_object($oImage) && !$oImage->IsEmpty()) { // TODO: This should be changed when refactoring the ormDocument GetDisplayUrl() and GetDownloadUrl() in iTop 3.0 $sContactPhotoUrl = $this->oContainer->get('url_generator')->generate('p_object_document_display', [ 'sObjectClass' => get_class($oContact), - 'sObjectId' => $oContact->GetKey(), + 'sObjectId' => $oContact->GetKey(), 'sObjectField' => $sPictureAttCode, - 'cache' => 86400, - 's' => $oImage->GetSignature(), - ]); - } - else - { + 'cache' => 86400, + 's' => $oImage->GetSignature(), + ]); + } else { $sContactPhotoUrl = MetaModel::GetAttributeDef(get_class($oContact), $sPictureAttCode)->Get('default_image'); } } diff --git a/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig index 676c9a263..78d5ff17c 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig @@ -22,26 +22,6 @@ margin: 0 5px; } - {# Stack trace is only displayed in debug #} - {% if app['kernel'].debug == true %} - code { - background-color: transparent; - } - - {# Include SF style for the stack trace #} - {{ include('@Twig/exception.css.twig') }} - - {# In production (SF context, not iTop), we hide some element as the code will not be displayed #} - {% if app['kernel'].environment == 'prod' %} - .trace-line-header > .icon{ - display: none !important; - } - .trace-code{ - display: none !important; - - } - {% endif %} - {% endif %} {% endblock %} @@ -61,36 +41,6 @@

- {% if app['kernel'].debug == true %} -
- {# Note: The following is copied by the '@Twig/Exception/exception.html.twig' #} - {% set exception_as_array = exception.toarray %} - {% set _exceptions_with_user_code = [] %} - {% for i, e in exception_as_array %} - {% for trace in e.trace %} - {% if (trace.file is not empty) and ('/vendor/' not in trace.file) and ('/var/cache/' not in trace.file) and not loop.last %} - {% set _exceptions_with_user_code = _exceptions_with_user_code|merge([i]) %} - {% endif %} - {% endfor %} - {% endfor %} -

- {% if exception_as_array|length > 1 %} - Exceptions {{ exception_as_array|length }} - {% else %} - Exception - {% endif %} -

-
- {% for i, e in exception_as_array %} - {{ include('@Twig/Exception/traces.html.twig', { exception: e, index: loop.index, expand: i in _exceptions_with_user_code or (_exceptions_with_user_code is empty and loop.first) }, with_context = false) }} - {% endfor %} -
- {% endif %} - -{% endblock %} - -{% block pPageLiveScripts %} - {{ include('@Twig/base_js.html.twig') }} {% endblock %} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig index 506dbb465..56b0aa404 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig @@ -224,14 +224,14 @@ {% if bUserConnected %}
  • {{ 'Brick:Portal:UserProfile:Navigation:Dropdown:MyProfil'|dict_s }}
  • - {% for aPortal in app['combodo.current_user.allowed_portals'] %} + {% for aPortal in allowed_portals %} {% if aPortal.id != app['combodo.portal.instance.conf'].properties.id %} {% set sIconClass = (aPortal.id == 'backoffice') ? 'far fa-list-alt' : 'fas fa-external-link-alt' %}
  • {{ aPortal.label|dict_s }}
  • {% endif %} {% endfor %} {# We display the separator only if the user has more then 1 portal. Meaning default portal + console or several portal at least #} - {% if app['combodo.current_user.allowed_portals']|length > 1 %} + {% if allowed_portals|length > 1 %} {% endif %}
  • {{ 'Brick:Portal:UserProfile:Navigation:Dropdown:Logout'|dict_s }}
  • @@ -263,14 +263,14 @@