From 1ee4663c4f098d9ec01cdc6c8f55daa685419457 Mon Sep 17 00:00:00 2001 From: Benoit DUMONT Date: Thu, 1 Aug 2024 10:12:27 +0200 Subject: [PATCH] Secret management on application active environment management. --- .../impl/CountryEnvironmentParametersDAO.java | 55 +++++++++++-------- .../entity/CountryEnvironmentParameters.java | 3 + .../core/crud/entity/TestCaseExecution.java | 2 +- .../IFactoryCountryEnvironmentParameters.java | 4 +- .../FactoryCountryEnvironmentParameters.java | 7 ++- .../service/impl/CountryEnvParamService.java | 2 +- .../CountryEnvironmentParametersService.java | 6 ++ .../DocumentationDatabaseService.java | 13 ++++- .../execution/impl/ExecutionStartService.java | 7 ++- .../core/engine/gwt/impl/VariableService.java | 2 + .../core/enums/MessageGeneralEnum.java | 2 +- .../countryenvironment/CreateApplication.java | 5 +- .../ReadCountryEnvironmentParameters.java | 6 ++ .../countryenvironment/UpdateApplication.java | 5 +- .../UpdateCountryEnvParam.java | 5 +- .../zzpublic/AddToExecutionQueueV003.java | 6 +- source/src/main/resources/database.sql | 6 +- .../en/testmanagement_tcproperties_en.adoc | 2 + .../D2/include/en/changelog_4.19_en.adoc | 5 +- .../src/main/webapp/js/global/autocomplete.js | 2 +- .../main/webapp/js/pages/TestCaseScript.js | 2 +- .../js/transversalobject/Application.js | 53 +++++++++++++----- 22 files changed, 142 insertions(+), 58 deletions(-) diff --git a/source/src/main/java/org/cerberus/core/crud/dao/impl/CountryEnvironmentParametersDAO.java b/source/src/main/java/org/cerberus/core/crud/dao/impl/CountryEnvironmentParametersDAO.java index a577384de..3cd409f6f 100644 --- a/source/src/main/java/org/cerberus/core/crud/dao/impl/CountryEnvironmentParametersDAO.java +++ b/source/src/main/java/org/cerberus/core/crud/dao/impl/CountryEnvironmentParametersDAO.java @@ -326,7 +326,7 @@ public AnswerList readByVariousByCriteria(String s //were applied -- used for pagination p query.append("SELECT SQL_CALC_FOUND_ROWS cea.* FROM countryenvironmentparameters cea"); query.append(" JOIN application app on app.Application = cea.Application and app.`System` = cea.`System` "); - + searchSQL.append(" where 1=1 "); if (!StringUtil.isEmpty(searchTerm)) { @@ -490,7 +490,7 @@ public AnswerList readDependenciesByVarious(String query.append(" JOIN application app on app.Application = cea.Application and app.`System` = cea.`System` "); query.append(" JOIN (SELECT systemLink , CountryLink , EnvironmentLink from countryenvlink where `system` = ? and Country = ? and Environment = ? ) as lnk "); query.append(" where cea.`system` = lnk.systemLink and cea.`Country` = lnk.CountryLink and cea.`Environment` = lnk.EnvironmentLink ; "); - + // Debug message on SQL. if (LOG.isDebugEnabled()) { LOG.debug("SQL : " + query.toString()); @@ -588,8 +588,8 @@ public AnswerList readDependenciesByVarious(String public Answer create(CountryEnvironmentParameters object) { MessageEvent msg = null; StringBuilder query = new StringBuilder(); - query.append("INSERT INTO `countryenvironmentparameters` (`system`, `country`, `environment`, `application`, `ip`, `domain`, `url`, `urllogin`, `Var1`, `Var2`, `Var3`, `Var4`, `poolSize`, `mobileActivity`, `mobilePackage`, `UsrCreated`) "); - query.append("VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + query.append("INSERT INTO `countryenvironmentparameters` (`system`, `country`, `environment`, `application`, `isActive`, `ip`, `domain`, `url`, `urllogin`, `Var1`, `Var2`, `Var3`, `Var4`, `Secret1`, `Secret2`, `poolSize`, `mobileActivity`, `mobilePackage`, `UsrCreated`) "); + query.append("VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); // Debug message on SQL. if (LOG.isDebugEnabled()) { @@ -600,22 +600,26 @@ public Answer create(CountryEnvironmentParameters object) { try { PreparedStatement preStat = connection.prepareStatement(query.toString()); try { - preStat.setString(1, object.getSystem()); - preStat.setString(2, object.getCountry()); - preStat.setString(3, object.getEnvironment()); - preStat.setString(4, object.getApplication()); - preStat.setString(5, object.getIp()); - preStat.setString(6, object.getDomain()); - preStat.setString(7, object.getUrl()); - preStat.setString(8, object.getUrlLogin()); - preStat.setString(9, object.getVar1()); - preStat.setString(10, object.getVar2()); - preStat.setString(11, object.getVar3()); - preStat.setString(12, object.getVar4()); - preStat.setInt(13, object.getPoolSize()); - preStat.setString(14, object.getMobileActivity()); - preStat.setString(15, object.getMobilePackage()); - preStat.setString(16, object.getUsrCreated()); + int i=1; + preStat.setString(i++, object.getSystem()); + preStat.setString(i++, object.getCountry()); + preStat.setString(i++, object.getEnvironment()); + preStat.setString(i++, object.getApplication()); + preStat.setBoolean(i++, object.isActive()); + preStat.setString(i++, object.getIp()); + preStat.setString(i++, object.getDomain()); + preStat.setString(i++, object.getUrl()); + preStat.setString(i++, object.getUrlLogin()); + preStat.setString(i++, object.getVar1()); + preStat.setString(i++, object.getVar2()); + preStat.setString(i++, object.getVar3()); + preStat.setString(i++, object.getVar4()); + preStat.setString(i++, object.getSecret1()); + preStat.setString(i++, object.getSecret2()); + preStat.setInt(i++, object.getPoolSize()); + preStat.setString(i++, object.getMobileActivity()); + preStat.setString(i++, object.getMobilePackage()); + preStat.setString(i++, object.getUsrCreated()); preStat.executeUpdate(); msg = new MessageEvent(MessageEventEnum.DATA_OPERATION_OK); @@ -697,7 +701,7 @@ public Answer delete(CountryEnvironmentParameters object) { @Override public Answer update(CountryEnvironmentParameters object) { MessageEvent msg = null; - final String query = "UPDATE `countryenvironmentparameters` SET `IP`=?, `URL`=?, `URLLOGIN`=?, `domain`=?, Var1=?, Var2=?, Var3=?, Var4=?, poolSize=?, mobileActivity=?, mobilePackage=?, `UsrModif`= ?, `DateModif` = NOW()" + final String query = "UPDATE `countryenvironmentparameters` SET `IsActive`=?, `IP`=?, `URL`=?, `URLLOGIN`=?, `domain`=?, Var1=?, Var2=?, Var3=?, Var4=?, Secret1=?, Secret2=?, poolSize=?, mobileActivity=?, mobilePackage=?, `UsrModif`= ?, `DateModif` = NOW()" + " where `system`=? and `country`=? and `environment`=? and `application`=? "; // Debug message on SQL. @@ -709,6 +713,7 @@ public Answer update(CountryEnvironmentParameters object) { PreparedStatement preStat = connection.prepareStatement(query); try { int i = 1; + preStat.setBoolean(i++, object.isActive()); preStat.setString(i++, object.getIp()); preStat.setString(i++, object.getUrl()); preStat.setString(i++, object.getUrlLogin()); @@ -717,6 +722,8 @@ public Answer update(CountryEnvironmentParameters object) { preStat.setString(i++, object.getVar2()); preStat.setString(i++, object.getVar3()); preStat.setString(i++, object.getVar4()); + preStat.setString(i++, object.getSecret1()); + preStat.setString(i++, object.getSecret2()); preStat.setInt(i++, object.getPoolSize()); preStat.setString(i++, object.getMobileActivity()); preStat.setString(i++, object.getMobilePackage()); @@ -757,6 +764,7 @@ private CountryEnvironmentParameters loadFromResultSet(ResultSet resultSet) thro String count = resultSet.getString("cea.Country"); String env = resultSet.getString("cea.Environment"); String application = resultSet.getString("cea.application"); + boolean isActive = resultSet.getBoolean("cea.isActive"); String ip = resultSet.getString("cea.ip"); String domain = resultSet.getString("cea.domain"); String url = resultSet.getString("cea.url"); @@ -765,6 +773,8 @@ private CountryEnvironmentParameters loadFromResultSet(ResultSet resultSet) thro String var2 = resultSet.getString("cea.Var2"); String var3 = resultSet.getString("cea.Var3"); String var4 = resultSet.getString("cea.Var4"); + String secret1 = resultSet.getString("cea.Secret1"); + String secret2 = resultSet.getString("cea.Secret2"); String mobileActivity = resultSet.getString("cea.mobileActivity"); if (mobileActivity == null) { mobileActivity = ""; @@ -779,7 +789,8 @@ private CountryEnvironmentParameters loadFromResultSet(ResultSet resultSet) thro Timestamp dateCreated = resultSet.getTimestamp("cea.DateCreated"); Timestamp dateModif = resultSet.getTimestamp("cea.DateModif"); - return factoryCountryEnvironmentParameters.create(system, count, env, application, ip, domain, url, urllogin, var1, var2, var3, var4, poolSize, mobileActivity, mobilePackage, usrCreated, dateCreated, usrModif, dateModif); + return factoryCountryEnvironmentParameters.create(system, count, env, application, isActive, ip, domain, url, urllogin, var1, var2, var3, var4, secret1, secret2, + poolSize, mobileActivity, mobilePackage, usrCreated, dateCreated, usrModif, dateModif); } } diff --git a/source/src/main/java/org/cerberus/core/crud/entity/CountryEnvironmentParameters.java b/source/src/main/java/org/cerberus/core/crud/entity/CountryEnvironmentParameters.java index 5d92ca468..1aff9b827 100644 --- a/source/src/main/java/org/cerberus/core/crud/entity/CountryEnvironmentParameters.java +++ b/source/src/main/java/org/cerberus/core/crud/entity/CountryEnvironmentParameters.java @@ -52,6 +52,7 @@ public class CountryEnvironmentParameters { @Id private String application; + private boolean isActive; private String ip; private String domain; private String url; @@ -60,6 +61,8 @@ public class CountryEnvironmentParameters { private String var2; private String var3; private String var4; + private String secret1; + private String secret2; private String mobileActivity; private String mobilePackage; private int poolSize; diff --git a/source/src/main/java/org/cerberus/core/crud/entity/TestCaseExecution.java b/source/src/main/java/org/cerberus/core/crud/entity/TestCaseExecution.java index cc56226fb..8c5fc09c0 100644 --- a/source/src/main/java/org/cerberus/core/crud/entity/TestCaseExecution.java +++ b/source/src/main/java/org/cerberus/core/crud/entity/TestCaseExecution.java @@ -293,7 +293,7 @@ public void addNetworkTrafficIndexList(NetworkTrafficIndex newIndex) { } public void addSecret(String secret) { - if (secret != null) { + if (secret != null && (!"".equals(secret))) { this.secrets.put(secret, ""); } } diff --git a/source/src/main/java/org/cerberus/core/crud/factory/IFactoryCountryEnvironmentParameters.java b/source/src/main/java/org/cerberus/core/crud/factory/IFactoryCountryEnvironmentParameters.java index 03bf267c5..0c49c6ae9 100644 --- a/source/src/main/java/org/cerberus/core/crud/factory/IFactoryCountryEnvironmentParameters.java +++ b/source/src/main/java/org/cerberus/core/crud/factory/IFactoryCountryEnvironmentParameters.java @@ -28,7 +28,7 @@ */ public interface IFactoryCountryEnvironmentParameters { - CountryEnvironmentParameters create(String system, String country, String environment, String application, String ip, - String Domain, String url, String urlLogin, String var1, String var2, String var3, String var4, int poolSize, + CountryEnvironmentParameters create(String system, String country, String environment, String application, boolean isActive, String ip, + String Domain, String url, String urlLogin, String var1, String var2, String var3, String var4, String secret1, String secret2, int poolSize, String mobileActivity, String mobilePackage, String usrCreated, Timestamp dateCreated, String usrModif, Timestamp dateModif); } diff --git a/source/src/main/java/org/cerberus/core/crud/factory/impl/FactoryCountryEnvironmentParameters.java b/source/src/main/java/org/cerberus/core/crud/factory/impl/FactoryCountryEnvironmentParameters.java index 457f9b4a6..9a164cee5 100644 --- a/source/src/main/java/org/cerberus/core/crud/factory/impl/FactoryCountryEnvironmentParameters.java +++ b/source/src/main/java/org/cerberus/core/crud/factory/impl/FactoryCountryEnvironmentParameters.java @@ -31,14 +31,15 @@ public class FactoryCountryEnvironmentParameters implements IFactoryCountryEnvironmentParameters { @Override - public CountryEnvironmentParameters create(String system, String country, String environment, String application, String ip, - String domain, String url, String urlLogin, String var1, String var2, String var3, String var4, int poolSize, + public CountryEnvironmentParameters create(String system, String country, String environment, String application, boolean isActive, String ip, + String domain, String url, String urlLogin, String var1, String var2, String var3, String var4, String secret1, String secret2, int poolSize, String mobileActivity, String mobilePackage, String usrCreated, Timestamp dateCreated, String usrModif, Timestamp dateModif) { CountryEnvironmentParameters object = new CountryEnvironmentParameters(); object.setSystem(system); object.setCountry(country); object.setEnvironment(environment); object.setApplication(application); + object.setActive(isActive); object.setIp(ip); object.setDomain(domain); object.setUrl(url); @@ -47,6 +48,8 @@ public CountryEnvironmentParameters create(String system, String country, String object.setVar2(var2); object.setVar3(var3); object.setVar4(var4); + object.setSecret1(secret1); + object.setSecret2(secret2); object.setPoolSize(poolSize); object.setMobileActivity(mobileActivity); object.setMobilePackage(mobilePackage); diff --git a/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvParamService.java b/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvParamService.java index 1eb68358c..e855dca11 100644 --- a/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvParamService.java +++ b/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvParamService.java @@ -68,7 +68,7 @@ public List findCountryEnvParamByCriteria(CountryEnvParam count public List findActiveEnvironmentBySystemCountryApplication(String system, String country, String application) throws CerberusException { List result = new ArrayList<>(); CountryEnvParam countryEnvParam = countryEnvParamFactory.create(system, country, true); - CountryEnvironmentParameters countryEnvironmentParameters = countryEnvironmentParametersFactory.create(system, country, null, application, null, null, null, null, null, null, null, null, + CountryEnvironmentParameters countryEnvironmentParameters = countryEnvironmentParametersFactory.create(system, country, null, application, true, null, null, null, null, null, null, null, null, null, null, CountryEnvironmentParameters.DEFAULT_POOLSIZE, null, null, null, null, null, null); List ceaList = countryEnvironmentParametersService.findCountryEnvironmentParametersByCriteria(countryEnvironmentParameters); diff --git a/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvironmentParametersService.java b/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvironmentParametersService.java index 1992f1603..a70f2eba5 100644 --- a/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvironmentParametersService.java +++ b/source/src/main/java/org/cerberus/core/crud/service/impl/CountryEnvironmentParametersService.java @@ -218,6 +218,12 @@ public Answer compareListAndUpdateInsertDeleteElements(String system, String app if (objectDifference.getIp().contains(StringUtil.SECRET_STRING)) { objectDifference.setIp(objectDifference.getIp().replace(StringUtil.SECRET_STRING, StringUtil.getPasswordFromAnyUrl(objectInDatabase.getIp()))); } + if (StringUtil.SECRET_STRING.equals(objectDifference.getSecret1())) { + objectDifference.setSecret1(objectInDatabase.getSecret1()); + } + if (StringUtil.SECRET_STRING.equals(objectDifference.getSecret2())) { + objectDifference.setSecret2(objectInDatabase.getSecret2()); + } ans = this.update(objectDifference); finalAnswer = AnswerUtil.agregateAnswer(finalAnswer, ans); listToUpdateOrInsert.remove(objectDifference); diff --git a/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java b/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java index 5c66509c7..7226fee69 100644 --- a/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java +++ b/source/src/main/java/org/cerberus/core/database/DocumentationDatabaseService.java @@ -446,6 +446,15 @@ public ArrayList getSqlDocumentation() { b.append(",('countryenvironmentparameters','Var4','','en','Variable 4','Variable can be used inside testcases with %SYS_APP_VAR4% variable.','_environment')"); b.append(",('countryenvironmentparameters','Var4','','fr','Variable 4','Variable qui peut être utilisée dans les test avec : %SYS_APP_VAR4%','_environnement')"); b.append(",('countryenvironmentparameters','Var4','','fa','متغیر ۴','متغیر را می توان با استفاد از متغیر %SYS_APP_VAR4% مورد استفاده قرار داد..','_environment')"); + b.append(",('countryenvironmentparameters','isActive','','en','Active','',NULL)"); + b.append(",('countryenvironmentparameters','isActive','','fr','Actif','',NULL)"); + b.append(",('countryenvironmentparameters','isActive','','fa','فعال','',NULL)"); + b.append(",('countryenvironmentparameters','secret1','','en','Secret 1','Secret Variable that can be used inside testcases with %system.APP_SECRET1% variable.','_environment')"); + b.append(",('countryenvironmentparameters','secret1','','fr','Secret 1','Variable securisée qui peut être utilisée dans les test avec : %system.APP_SECRET1%','_environnement')"); + b.append(",('countryenvironmentparameters','secret1','','fa','متغیر 1','متغیر را می توان با استفاده از متغیر %system.APP_SECRET1% در موارد آزمون استفاده کرد','_environment')"); + b.append(",('countryenvironmentparameters','secret2','','en','Secret 2','Secret Variable that can be used inside testcases with %system.APP_SECRET2% variable.','_environment')"); + b.append(",('countryenvironmentparameters','secret2','','fr','Secret 2','Variable qui peut être utilisée dans les test avec : %system.APP_SECRET2%','_environnement')"); + b.append(",('countryenvironmentparameters','secret2','','fa','متغیر 2','متغیر را می توان با استفاده از متغیر %system.APP_SECRET2% در موارد آزمون مورد استفاده قرار بگیرد.','_environment')"); b.append(",('countryenvironmentparameters','mobileActivity','','en','Mobile Activity','When defined, it feed the \\'appWaitActivity\\' capability.','_environment')"); b.append(",('countryenvironmentparameters','mobileActivity','','fr','Mobile Activity','Lorsque défini, renseigne automatiquement la capability \\'appWaitActivity\\'.','_environnement')"); b.append(",('countryenvironmentparameters','mobileActivity','','fa','فعالیت موبایل','زمانیکه تعریف می شود, برای قابلیت \\'appWaitActivity\\' مورد استفاده قرار می گیرد.','_environment')"); @@ -2357,8 +2366,8 @@ public ArrayList getSqlDocumentation() { b.append(",('page_global','tooltip_savetableconfig','','ru','Сохранить конфигурацию таблицы','Фильтры и показываемые колонки сохранены в ',NULL)"); b.append(",('page_global','tooltip_savetableconfig','','fr','Sauvegarder la configuration de la table','Sauvegarder la configuration de la table. Les filtres et l\\'affichage des colonnes sont sauvegardés dans les préférences utilisateur',NULL)"); b.append(",('page_global','tooltip_savetableconfig','','fa','ذخیره سازی پیکربندی جول','پیکربندی جدول را ذخیره کنید.فیلترها و نمایش ستون ها در تنظیمات برگزیده کاربر ذخیره می شوند.',NULL)"); - b.append(",('page_global','tooltip_resettableconfig','','en','Reset the table configuration to its default value','Reset the table configuration. Filters and column display will go back to its default value',NULL)"); - b.append(",('page_global','tooltip_resettableconfig','','fr','Restaurer la configuration par defaut de la table','Restaurer la configuration de la table par defaut. Les filtres et l\\'affichage des colonnes seront restauré à leur valeur d\\'origine',NULL)"); + b.append(",('page_global','tooltip_resettableconfig','','en','Reset the table configuration to its default value','Reset the table configuration. Filters and column display will go back to its default values',NULL)"); + b.append(",('page_global','tooltip_resettableconfig','','fr','Restaurer la configuration par defaut de la table','Restaurer la configuration de la table par defaut. Les filtres et l\\'affichage des colonnes seront restaurés à leur valeures d\\'origines',NULL)"); b.append(",('page_global','tooltip_showHideColumns','','en','Show/hide columns','',NULL)"); b.append(",('page_global','tooltip_showHideColumns','','ru','Показать/Скрыть колонки','',NULL)"); b.append(",('page_global','tooltip_showHideColumns','','fr','Afficher/cacher des colonnes','',NULL)"); diff --git a/source/src/main/java/org/cerberus/core/engine/execution/impl/ExecutionStartService.java b/source/src/main/java/org/cerberus/core/engine/execution/impl/ExecutionStartService.java index 67e01912f..324a70ab4 100644 --- a/source/src/main/java/org/cerberus/core/engine/execution/impl/ExecutionStartService.java +++ b/source/src/main/java/org/cerberus/core/engine/execution/impl/ExecutionStartService.java @@ -270,7 +270,7 @@ public TestCaseExecution startExecution(TestCaseExecution execution) throws Cerb } else { CountryEnvironmentParameters cea; cea = this.factorycountryEnvironmentParameters.create(execution.getApplicationObj().getSystem(), execution.getCountry(), execution.getEnvironment(), execution.getApplicationObj().getApplication(), - execution.getMyHost(), "", execution.getMyContextRoot(), execution.getMyLoginRelativeURL(), "", "", "", "", CountryEnvironmentParameters.DEFAULT_POOLSIZE, "", "", null, null, null, null); + true, execution.getMyHost(), "", execution.getMyContextRoot(), execution.getMyLoginRelativeURL(), "", "", "", "", "", "", CountryEnvironmentParameters.DEFAULT_POOLSIZE, "", "", null, null, null, null); cea.setIp(execution.getMyHost()); cea.setUrl(execution.getMyContextRoot()); appURL = StringUtil.getURLFromString(cea.getIp(), cea.getUrl(), "", ""); @@ -300,7 +300,7 @@ public TestCaseExecution startExecution(TestCaseExecution execution) throws Cerb try { cea = this.countryEnvironmentParametersService.convert(this.countryEnvironmentParametersService.readByKey( execution.getApplicationObj().getSystem(), execution.getCountry(), execution.getEnvironment(), execution.getApplicationObj().getApplication())); - if (cea != null) { + if (cea != null && (cea.isActive())) { if (execution.getManualURL() == 2) { // add possibility to override URL with MyHost if MyHost is available if (!StringUtil.isEmpty(execution.getMyHost())) { @@ -321,6 +321,9 @@ public TestCaseExecution startExecution(TestCaseExecution execution) throws Cerb // If domain is empty we guess it from URL. cea.setDomain(StringUtil.getDomainFromUrl(execution.getUrl())); } + // Protect Secret data coming from application-environment. + execution.addSecret(cea.getSecret1()); + execution.addSecret(cea.getSecret2()); execution.setCountryEnvApplicationParam(cea); // Load all associated application informations (same system, country and env as the execution). diff --git a/source/src/main/java/org/cerberus/core/engine/gwt/impl/VariableService.java b/source/src/main/java/org/cerberus/core/engine/gwt/impl/VariableService.java index 0bda294bb..b33058b9d 100644 --- a/source/src/main/java/org/cerberus/core/engine/gwt/impl/VariableService.java +++ b/source/src/main/java/org/cerberus/core/engine/gwt/impl/VariableService.java @@ -282,6 +282,8 @@ public String decodeStringWithSystemVariable(String stringToDecode, TestCaseExec stringToDecode = stringToDecode.replace("%system.APP_VAR2%", envappli.getVar2()); stringToDecode = stringToDecode.replace("%system.APP_VAR3%", envappli.getVar3()); stringToDecode = stringToDecode.replace("%system.APP_VAR4%", envappli.getVar4()); + stringToDecode = stringToDecode.replace("%system.APP_SECRET1%", envappli.getSecret1()); + stringToDecode = stringToDecode.replace("%system.APP_SECRET2%", envappli.getSecret2()); stringToDecode = stringToDecode.replace("%system.EXEURL%", execution.getUrl()); stringToDecode = stringToDecode.replace("%system.ENV%", execution.getEnvironmentData()); stringToDecode = stringToDecode.replace("%system.ENVGP%", execution.getEnvironmentDataObj().getGp1()); diff --git a/source/src/main/java/org/cerberus/core/enums/MessageGeneralEnum.java b/source/src/main/java/org/cerberus/core/enums/MessageGeneralEnum.java index 60f75cac3..793512e3c 100644 --- a/source/src/main/java/org/cerberus/core/enums/MessageGeneralEnum.java +++ b/source/src/main/java/org/cerberus/core/enums/MessageGeneralEnum.java @@ -47,7 +47,7 @@ public enum MessageGeneralEnum { VALIDATION_FAILED_SIKULI_COULDNOTCONNECT(63, "FA", "Could not contact Sikuli server on %SSIP% using port %SSPORT%. Possible causes are invalid address of the remote server or cerberus-extension-sikuli not started properly."), VALIDATION_FAILED_APPLICATION_NOT_FOUND(64, "FA", "Application '%APPLI%' does not exist."), VALIDATION_FAILED_COUNTRYENV_NOT_FOUND(65, "FA", "System '%SYSTEM%' Country '%COUNTRY%' environment '%ENV%' parameters does not exist."), - VALIDATION_FAILED_COUNTRYENVAPP_NOT_FOUND(66, "FA", "Country '%COUNTRY%' environment '%ENV%' application '%APPLI%' parameters does not exist."), + VALIDATION_FAILED_COUNTRYENVAPP_NOT_FOUND(66, "FA", "Country '%COUNTRY%' environment '%ENV%' application '%APPLI%' parameters does not exist or is not active."), VALIDATION_FAILED_TESTCASE_NOT_FOUND(67, "FA", "The test case ('%TEST%'-'%TESTCASE%') does not exist."), VALIDATION_FAILED_COULDNOTCREATE_RUNID(68, "FA", "RunID could not be created."), VALIDATION_FAILED_OUTPUTFORMAT_INVALID(69, "FA", "outputformat parameter value '%PARAM%' is not valid."), diff --git a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/CreateApplication.java b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/CreateApplication.java index e3415f419..1ee58937d 100644 --- a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/CreateApplication.java +++ b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/CreateApplication.java @@ -232,6 +232,7 @@ private List getCountryEnvironmentApplicationFromP boolean delete = tcsaJson.getBoolean("toDelete"); String country = policy.sanitize(tcsaJson.getString("country")); String environment = policy.sanitize(tcsaJson.getString("environment")); + boolean isActive = tcsaJson.getBoolean("isActive"); // Parameter that needs to be secured --> We SECURE+DECODE them // Parameter that we cannot secure as we need the html --> We DECODE them String ip = tcsaJson.getString("ip"); @@ -242,6 +243,8 @@ private List getCountryEnvironmentApplicationFromP String var2 = tcsaJson.getString("var2"); String var3 = tcsaJson.getString("var3"); String var4 = tcsaJson.getString("var4"); + String secret1 = tcsaJson.getString("secret1"); + String secret2 = tcsaJson.getString("secret2"); String strPoolSize = tcsaJson.getString("poolSize"); String mobileActivity = tcsaJson.getString("mobileActivity"); String mobilePackage = tcsaJson.getString("mobilePackage"); @@ -259,7 +262,7 @@ private List getCountryEnvironmentApplicationFromP } if (!delete) { - CountryEnvironmentParameters ced = cedFactory.create(system, country, environment, application, ip, domain, url, urlLogin, var1, var2, var3, var4, poolSize, mobileActivity, mobilePackage, request.getRemoteUser(), null, request.getRemoteUser(), null); + CountryEnvironmentParameters ced = cedFactory.create(system, country, environment, application, isActive, ip, domain, url, urlLogin, var1, var2, var3, var4, secret1, secret2, poolSize, mobileActivity, mobilePackage, request.getRemoteUser(), null, request.getRemoteUser(), null); cedList.add(ced); } } diff --git a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/ReadCountryEnvironmentParameters.java b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/ReadCountryEnvironmentParameters.java index 5021a8dc3..09339613a 100644 --- a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/ReadCountryEnvironmentParameters.java +++ b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/ReadCountryEnvironmentParameters.java @@ -208,6 +208,12 @@ private JSONObject convertCountryEnvParamtoJSONObject(CountryEnvironmentParamete if (StringUtil.isNotEmptyOrNullValue(StringUtil.getPasswordFromAnyUrl(cepl.getIp()))) { result.put("ip", cepl.getIp().replace(StringUtil.getPasswordFromAnyUrl(cepl.getIp()), StringUtil.SECRET_STRING)); } + if (StringUtil.isNotEmptyOrNullValue(cepl.getSecret1())) { + result.put("secret1", StringUtil.SECRET_STRING); + } + if (StringUtil.isNotEmptyOrNullValue(cepl.getSecret2())) { + result.put("secret2", StringUtil.SECRET_STRING); + } return result; } diff --git a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateApplication.java b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateApplication.java index fc606819c..1f1f5373f 100644 --- a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateApplication.java +++ b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateApplication.java @@ -245,6 +245,7 @@ private List getCountryEnvironmentApplicationFromP boolean delete = tcsaJson.getBoolean("toDelete"); String country = policy.sanitize(tcsaJson.getString("country")); String environment = policy.sanitize(tcsaJson.getString("environment")); + boolean isActive = tcsaJson.getBoolean("isActive"); // Parameter that needs to be secured --> We SECURE+DECODE them // Parameter that we cannot secure as we need the html --> We DECODE them String ip = tcsaJson.getString("ip"); @@ -255,6 +256,8 @@ private List getCountryEnvironmentApplicationFromP String var2 = tcsaJson.getString("var2"); String var3 = tcsaJson.getString("var3"); String var4 = tcsaJson.getString("var4"); + String secret1 = tcsaJson.getString("secret1"); + String secret2 = tcsaJson.getString("secret2"); String strPoolSize = tcsaJson.getString("poolSize"); String mobileActivity = tcsaJson.getString("mobileActivity"); String mobilePackage = tcsaJson.getString("mobilePackage"); @@ -272,7 +275,7 @@ private List getCountryEnvironmentApplicationFromP } if (!delete) { - CountryEnvironmentParameters ced = cedFactory.create(system, country, environment, application, ip, domain, url, urlLogin, var1, var2, var3, var4, poolSize, mobileActivity, mobilePackage, request.getRemoteUser(), null, request.getRemoteUser(), null); + CountryEnvironmentParameters ced = cedFactory.create(system, country, environment, application, isActive, ip, domain, url, urlLogin, var1, var2, var3, var4, secret1, secret2, poolSize, mobileActivity, mobilePackage, request.getRemoteUser(), null, request.getRemoteUser(), null); cedList.add(ced); } } diff --git a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateCountryEnvParam.java b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateCountryEnvParam.java index d2d4048f1..df8f24892 100644 --- a/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateCountryEnvParam.java +++ b/source/src/main/java/org/cerberus/core/servlet/crud/countryenvironment/UpdateCountryEnvParam.java @@ -276,6 +276,7 @@ private List getCountryEnvironmentApplicationFromP boolean delete = tcsaJson.getBoolean("toDelete"); String application = tcsaJson.getString("application"); + boolean isActive = tcsaJson.getBoolean("isActive"); String ip = tcsaJson.getString("ip"); String domain = tcsaJson.getString("domain"); String url = tcsaJson.getString("url"); @@ -284,6 +285,8 @@ private List getCountryEnvironmentApplicationFromP String var2 = tcsaJson.getString("var2"); String var3 = tcsaJson.getString("var3"); String var4 = tcsaJson.getString("var4"); + String secret1 = tcsaJson.getString("secret1"); + String secret2 = tcsaJson.getString("secret2"); String strPoolSize = tcsaJson.getString("poolSize"); String mobileActivity = tcsaJson.getString("mobileActivity"); String mobilePackage = tcsaJson.getString("mobilePackage"); @@ -301,7 +304,7 @@ private List getCountryEnvironmentApplicationFromP } if (!delete) { - CountryEnvironmentParameters cea = ceaFactory.create(system, country, environment, application, ip, domain, url, urlLogin, var1, var2, var3, var4, poolSize, mobileActivity, mobilePackage, null, null, request.getRemoteUser(), null); + CountryEnvironmentParameters cea = ceaFactory.create(system, country, environment, application, isActive, ip, domain, url, urlLogin, var1, var2, var3, var4, secret1, secret2, poolSize, mobileActivity, mobilePackage, null, null, request.getRemoteUser(), null); ceaList.add(cea); } } diff --git a/source/src/main/java/org/cerberus/core/servlet/zzpublic/AddToExecutionQueueV003.java b/source/src/main/java/org/cerberus/core/servlet/zzpublic/AddToExecutionQueueV003.java index 9293e7ea5..38a30acab 100644 --- a/source/src/main/java/org/cerberus/core/servlet/zzpublic/AddToExecutionQueueV003.java +++ b/source/src/main/java/org/cerberus/core/servlet/zzpublic/AddToExecutionQueueV003.java @@ -516,7 +516,9 @@ private void processRequest(HttpServletRequest request, HttpServletResponse resp HashMap envAppMap = new HashMap<>(); LOG.debug("Loading all environments."); for (CountryEnvironmentParameters envAppParam : countryEnvironmentParametersService.convert(countryEnvironmentParametersService.readByVarious(null, null, null, null))) { - envAppMap.put(envAppParam.getSystem() + LOCAL_SEPARATOR + envAppParam.getCountry() + LOCAL_SEPARATOR + envAppParam.getEnvironment() + LOCAL_SEPARATOR + envAppParam.getApplication(), envAppParam); + if (envAppParam.isActive()) { + envAppMap.put(envAppParam.getSystem() + LOCAL_SEPARATOR + envAppParam.getCountry() + LOCAL_SEPARATOR + envAppParam.getEnvironment() + LOCAL_SEPARATOR + envAppParam.getApplication(), envAppParam); + } } if (!StringUtil.isEmpty(campaign)) { @@ -625,7 +627,7 @@ private void processRequest(HttpServletRequest request, HttpServletResponse resp } } } else { - LOG.debug("Env Application does not exist."); + LOG.debug("Env Application does not exist or is not active."); // messages.add(String.format("Environment '%s' and Country %s doesn't exist for application '%s'", environment, country.getCountry(), tc.getApplication())); nbenvnotexist += nbrobot; } diff --git a/source/src/main/resources/database.sql b/source/src/main/resources/database.sql index 8701d27e4..532e8064e 100644 --- a/source/src/main/resources/database.sql +++ b/source/src/main/resources/database.sql @@ -6459,4 +6459,8 @@ UPDATE robotexecutor SET `IsDeviceLockUnlock` = 1 WHERE `IsDeviceLockUnlock` = ' UPDATE robotexecutor SET `IsDeviceLockUnlock` = 0 WHERE `IsDeviceLockUnlock` != '1'; ALTER TABLE robotexecutor MODIFY `IsDeviceLockUnlock` BOOLEAN DEFAULT 0; - +-- 1826 +ALTER TABLE countryenvironmentparameters + ADD Secret1 varchar(200) DEFAULT '' NOT NULL AFTER Var4, + ADD Secret2 varchar(200) DEFAULT '' NOT NULL AFTER Secret1, + ADD `IsActive` BOOLEAN DEFAULT 1 AFTER Application; diff --git a/source/src/main/resources/documentation/D1/include/en/testmanagement_tcproperties_en.adoc b/source/src/main/resources/documentation/D1/include/en/testmanagement_tcproperties_en.adoc index d0890664b..98cf01602 100644 --- a/source/src/main/resources/documentation/D1/include/en/testmanagement_tcproperties_en.adoc +++ b/source/src/main/resources/documentation/D1/include/en/testmanagement_tcproperties_en.adoc @@ -186,6 +186,8 @@ NOTE: You can also get the nb of rows your variable has by using the `**nbrows** | %system.**APP_VAR2**% | VAR2 of the application on the environment. | %system.**APP_VAR3**% | VAR3 of the application on the environment. | %system.**APP_VAR4**% | VAR4 of the application on the environment. +| %system.**APP_SECRET1**% | Secret 1 of the application on the environment (Secrets will be protected by not displaying anywhere in the Cerberus GUI and API). +| %system.**APP_SECRET2**% | Secret 2 of the application on the environment (Secrets will be protected by not displaying anywhere in the Cerberus GUI and API). | %system.**ENV**% | Environment value | %system.**ENVGP**% | Environment group code | %system.**COUNTRY**% | Country code diff --git a/source/src/main/resources/documentation/D2/include/en/changelog_4.19_en.adoc b/source/src/main/resources/documentation/D2/include/en/changelog_4.19_en.adoc index 74c84f523..9398a96c3 100644 --- a/source/src/main/resources/documentation/D2/include/en/changelog_4.19_en.adoc +++ b/source/src/main/resources/documentation/D2/include/en/changelog_4.19_en.adoc @@ -11,9 +11,11 @@ * [ENGINE] Added CSV ignoreFirstLine boolean at datalib level. * [ENGINE] When callService that is attached to an application, host and contextroot of the corresponding application is used (if country env of the application does not exist on the test case application, search is also made on linked environments). * [ENGINE] New variable for system.dates. You can now for example do %system.DAY-13-d% that will return the day of month (d) of 13 days ago (DAY-13). (locale of country invariant is used) -* [ENGINE] test case dependency engine now alow to define a delay between the end of an execution and the start of the next one. That allow to execute a campaign with some testcases on day 1 and release the rest of the testcases on day 2 (after some end of day treatments has been executed) +* [ENGINE] test case dependency engine now allow to define a delay between the end of an execution and the start of the next one. That allow to execute a campaign with some testcases on day 1 and release the rest of the testcases on day 2 (after some end of day treatments has been executed) * [ENGINE] Drag and drop now report error on Drop element and not drag when necessary. * [ENGINE] Timeout overwrite option now also overwrite pageLoadTimeout and setScriptTimeout. +* [ENGINE] Every application environment now can have 2 secrets data that can be used for password of apikey (with %system.APP_SECRET1% and %system.APP_SECRET2%). Once application is updated with its secret data, you can't access it and data is protected during execution. +* [ENGINE] You can now disable an environment at the application level thanks to the new active checkbox available. * [GUI] Added service call simulation feature. When editing a service, you can make calls outside a testcase context in order to control and tune the definition of the call. * [GUI] Improved autocompletion adding boolean, flags and contextual element for select and switchWindow actions. * [GUI] Improved navigation on campaign execution screen. Adding CTA on top of the screen and toggle buttons for reporting details hidden by default. @@ -33,7 +35,6 @@ * [GUI] Reports over time can now be filtered by result status (in order to focus and isolate non OK result for example) * [GUI] Report over time display spot with bigger radius when comment or description has been entered. False Negative are surrounded with green. - *Warning to be considered before applying the version (deprecated features)* [square] * [ENGINE] Datalib no longuer support direct definition of SOAP Calls. You need to replace them by SOAP services. diff --git a/source/src/main/webapp/js/global/autocomplete.js b/source/src/main/webapp/js/global/autocomplete.js index d120b7fb4..efb9ee1f7 100644 --- a/source/src/main/webapp/js/global/autocomplete.js +++ b/source/src/main/webapp/js/global/autocomplete.js @@ -327,7 +327,7 @@ function initTags(configs, context) { "SYSTEM", "APPLI", "BROWSER", "ROBOT", "ROBOTDECLI", "SCREENSIZE", - "APP_DOMAIN", "APP_HOST", "APP_CONTEXTROOT", "EXEURL", "APP_VAR1", "APP_VAR2", "APP_VAR3", "APP_VAR4", + "APP_DOMAIN", "APP_HOST", "APP_CONTEXTROOT", "EXEURL", "APP_VAR1", "APP_VAR2", "APP_VAR3", "APP_VAR4", "APP_SECRET1", "APP_SECRET2", "ENV", "ENVGP", "COUNTRY", "COUNTRYGP1", "COUNTRYGP2", "COUNTRYGP3", "COUNTRYGP4", "COUNTRYGP5", "COUNTRYGP6", "COUNTRYGP7", "COUNTRYGP8", "COUNTRYGP9", "TEST", diff --git a/source/src/main/webapp/js/pages/TestCaseScript.js b/source/src/main/webapp/js/pages/TestCaseScript.js index 8c35ceaab..c4fc0ad64 100644 --- a/source/src/main/webapp/js/pages/TestCaseScript.js +++ b/source/src/main/webapp/js/pages/TestCaseScript.js @@ -4293,7 +4293,7 @@ function createAllKeywordList(objectList, propertyList) { "SYSTEM", "APPLI", "BROWSER", "ROBOT", "ROBOTDECLI", "SCREENSIZE", - "APP_DOMAIN", "APP_HOST", "APP_CONTEXTROOT", "EXEURL", "APP_VAR1", "APP_VAR2", "APP_VAR3", "APP_VAR4", + "APP_DOMAIN", "APP_HOST", "APP_CONTEXTROOT", "EXEURL", "APP_VAR1", "APP_VAR2", "APP_VAR3", "APP_VAR4", "APP_SECRET1", "APP_SECRET2", "ENV", "ENVGP", "COUNTRY", "COUNTRYGP1", "COUNTRYGP2", "COUNTRYGP3", "COUNTRYGP4", "COUNTRYGP5", "COUNTRYGP6", "COUNTRYGP7", "COUNTRYGP8", "COUNTRYGP9", "TEST", diff --git a/source/src/main/webapp/js/transversalobject/Application.js b/source/src/main/webapp/js/transversalobject/Application.js index 485701644..f85d03b2b 100644 --- a/source/src/main/webapp/js/transversalobject/Application.js +++ b/source/src/main/webapp/js/transversalobject/Application.js @@ -200,7 +200,10 @@ function confirmApplicationModalHandler(mode) { for (var i = 0; i < table1.length; i++) { table_environment.push($(table1[i]).data("environment")); } - + console.info(table_environment); + console.info($(table1[i])); + console.info($(table1[i]).data("environment")); + // Get the header data from the form. var data = convertSerialToJSONObject(formEdit.serialize()); @@ -427,7 +430,10 @@ function appendEnvironmentRow(env) { var var2Input = $("").addClass("form-control input-sm").val(env.var2); var var3Input = $("").addClass("form-control input-sm").val(env.var3); var var4Input = $("").addClass("form-control input-sm").val(env.var4); + var secret1Input = $("").addClass("form-control input-sm").val(env.secret1); + var secret2Input = $("").addClass("form-control input-sm").val(env.secret2); var poolSizeInput = $("").addClass("form-control input-sm").val(env.poolSize); + var activeInput = $("").addClass("form-control input-sm").prop("checked", env.isActive); var mobileActivity = $("").addClass("form-control input-sm").val(env.mobileActivity); var mobilePackage = $("").addClass("form-control input-sm").val(env.mobilePackage); @@ -443,29 +449,34 @@ function appendEnvironmentRow(env) { var drow02 = $("
").append(country); var td2 = $("").append(drow01).append(drow02); - var ipName = $("
").append("").append(ipInput); + var ipName = $("
").append("").append(ipInput); var urlName = $("
").append("").append(urlInput); - var poolSizeName = $("
").append("").append(poolSizeInput); - var expandName = $("
").append(""); - var drow1 = $("
").append(ipName).append(urlName).append(poolSizeName).append(expandName); + var poolSizeName = $("
").append("").append(poolSizeInput); + var activeName = $("
").append("").append(activeInput); + var expandName = $("
").append(""); var loginName = $("
").append("").append(urlLoginInput); var domainName = $("
").append("").append(domainInput); - var drow2 = $("
").append(loginName).append(domainName); - var var1Name = $("
").append("").append(var1Input); + var var1Name = $("
").append("").append(var1Input); var var2Name = $("
").append("").append(var2Input); - var var3Name = $("
").append("").append(var3Input); - var var4Name = $("
").append("").append(var4Input); - var drow3 = $("
").append(var1Name).append(var2Name).append(var3Name).append(var4Name); + var var3Name = $("
").append("").append(var3Input); + var var4Name = $("
").append("").append(var4Input); - var mobileActivityName = $("
").append("").append(mobileActivity); - var mobilePackageName = $("
").append("").append(mobilePackage); - var drow4 = $("
").append(mobileActivityName).append(mobilePackageName); + var secret1Name = $("
").append("").append(secret1Input); + var secret2Name = $("
").append("").append(secret2Input); + var mobileActivityName = $("
").append("").append(mobileActivity); + var mobilePackageName = $("
").append("").append(mobilePackage); + + var drow1 = $("
").append(activeName).append(ipName).append(urlName).append(poolSizeName); + var drow2 = $("
").append(var1Name).append(var2Name).append(secret1Name).append(expandName); + var drow3 = $("
").append(loginName).append(domainName); + var drow4 = $("
").append(var3Name).append(var4Name).append(secret2Name); + var drow5 = $("
").append(mobileActivityName).append(mobilePackageName); - var panelExtra = $("
").append(drow2).append(drow3).append(drow4); + var panelExtra = $("
").append(drow3).append(drow4).append(drow5); - var td3 = $("").append(drow1).append(panelExtra); + var td3 = $("").append(drow1).append(drow2).append(panelExtra); deleteBtn.click(function () { env.toDelete = (env.toDelete) ? false : true; @@ -481,6 +492,9 @@ function appendEnvironmentRow(env) { selectCountry.change(function () { env.country = $(this).val(); }); + activeInput.change(function () { + env.isActive = $(this).prop("checked"); + }); ipInput.change(function () { env.ip = $(this).val(); }); @@ -505,6 +519,12 @@ function appendEnvironmentRow(env) { var4Input.change(function () { env.var4 = $(this).val(); }); + secret1Input.change(function () { + env.secret1 = $(this).val(); + }); + secret2Input.change(function () { + env.secret2 = $(this).val(); + }); poolSizeInput.change(function () { env.poolSize = $(this).val(); }); @@ -528,6 +548,7 @@ function addNewEnvironmentRow() { var newEnvironment = { environment: "", country: "", + isActive: true, ip: "", domain: "", url: "", @@ -536,6 +557,8 @@ function addNewEnvironmentRow() { var2: "", var3: "", var4: "", + secret1: "", + secret2: "", poolSize: "", mobileActivity: "", mobilePackage: "",