diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ApplicationBasicInfo.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ApplicationBasicInfo.java index c5242a66a693..7066dd2dee87 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ApplicationBasicInfo.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ApplicationBasicInfo.java @@ -28,6 +28,7 @@ public class ApplicationBasicInfo implements Serializable { private int applicationId; private String applicationName; + private String applicationVersion; private String description; private String applicationResourceId; @@ -80,6 +81,26 @@ public void setApplicationName(String applicationName) { this.applicationName = applicationName; } + /** + * Get application version. + * + * @return Application version. + */ + public String getApplicationVersion() { + + return applicationVersion; + } + + /** + * Set application version. + * + * @param applicationVersion Application version. + */ + public void setApplicationVersion(String applicationVersion) { + + this.applicationVersion = applicationVersion; + } + /** * Get application description. * diff --git a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ServiceProvider.java b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ServiceProvider.java index aaf9b1132ef7..cfc86bada292 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ServiceProvider.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.common/src/main/java/org/wso2/carbon/identity/application/common/model/ServiceProvider.java @@ -47,6 +47,7 @@ public class ServiceProvider implements Serializable { private static final Log log = LogFactory.getLog(ServiceProvider.class); private static final String CONSENT_CONFIG_ELEM = "ConsentConfig"; + private static final String APPLICATION_VERSION = "ApplicationVersion"; private static final String ACCESS_URL = "AccessUrl"; private static final String IMAGE_URL = "ImageUrl"; private static final String TEMPLATE_ID = "TemplateId"; @@ -66,6 +67,9 @@ public class ServiceProvider implements Serializable { @XmlElement(name = "ApplicationName") private String applicationName; + @XmlElement(name = APPLICATION_VERSION) + private String applicationVersion; + @XmlElement(name = "Description") private String description; @@ -201,6 +205,8 @@ public static ServiceProvider build(OMElement serviceProviderOM) { log.error("Service provider not loaded from the file. Application Name is null."); return null; } + } else if (APPLICATION_VERSION.equals(elementName)) { + serviceProvider.setApplicationVersion(element.getText()); } else if ("Description".equals(elementName)) { serviceProvider.setDescription(element.getText()); } else if (IMAGE_URL.equals(elementName)) { @@ -454,6 +460,22 @@ public void setApplicationName(String applicationName) { this.applicationName = applicationName; } + /** + * @return Application version. + */ + public String getApplicationVersion() { + + return applicationVersion; + } + + /** + * @param applicationVersion Application version. + */ + public void setApplicationVersion(String applicationVersion) { + + this.applicationVersion = applicationVersion; + } + /** * @return */ diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java index 2bca40c45d54..0db312e835d0 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java @@ -41,6 +41,8 @@ private ApplicationConstants() { public static final String STANDARD_APPLICATION = "standardAPP"; public static final String WELLKNOWN_APPLICATION_TYPE = "appType"; public static final String SERVICE_PROVIDERS = "ServiceProviders"; + public static final String LATEST_APP_VERSION = "v1.0.0"; + public static final String BASE_APP_VERSION = "v0.0.0"; public static final String AUTH_TYPE_DEFAULT = "default"; public static final String AUTH_TYPE_LOCAL = "local"; @@ -150,6 +152,7 @@ public static class ApplicationTableColumns { public static final String ID = "ID"; public static final String APP_NAME = "APP_NAME"; + public static final String APP_VERSION = "VERSION"; public static final String DESCRIPTION = "DESCRIPTION"; public static final String USERNAME = "USERNAME"; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java index 75ae6831f283..2b715dd17879 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java @@ -234,6 +234,9 @@ public ServiceProvider createApplicationWithTemplate(ServiceProvider serviceProv } } + // Set default application version. + serviceProvider.setApplicationVersion(ApplicationConstants.LATEST_APP_VERSION); + doPreAddApplicationChecks(serviceProvider, tenantDomain, username); ApplicationDAO appDAO = ApplicationMgtSystemConfig.getInstance().getApplicationDAO(); serviceProvider.setOwner(getUser(tenantDomain, username).orElseThrow(() -> @@ -2543,6 +2546,9 @@ public String createApplication(ServiceProvider application, String tenantDomain } } + // Set default application version. + application.setApplicationVersion(ApplicationConstants.LATEST_APP_VERSION); + doPreAddApplicationChecks(application, tenantDomain, username); ApplicationDAO applicationDAO = ApplicationMgtSystemConfig.getInstance().getApplicationDAO(); String resourceId = doAddApplication(application, tenantDomain, username, applicationDAO::addApplication); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java index 745068863338..1261d3c86c5a 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java @@ -360,6 +360,11 @@ public int createApplication(ServiceProvider application, String tenantDomain) Connection connection = IdentityDatabaseUtil.getDBConnection(true); try { + // Set application version to the latest if not set. + if (application.getApplicationVersion() == null) { + application.setApplicationVersion(ApplicationConstants.LATEST_APP_VERSION); + } + // Create basic application. ApplicationCreateResult result = persistBasicApplicationInformation(connection, application, tenantDomain); IdentityDatabaseUtil.commitTransaction(connection); return result.getApplicationId(); @@ -404,6 +409,7 @@ private ApplicationCreateResult persistBasicApplicationInformation(Connection co String username = UserCoreUtil.removeDomainFromName(qualifiedUsername); String userStoreDomain = IdentityUtil.extractDomainFromName(qualifiedUsername); String applicationName = application.getApplicationName(); + String applicationVersion = application.getApplicationVersion(); String description = application.getDescription(); if (log.isDebugEnabled()) { @@ -438,6 +444,7 @@ private ApplicationCreateResult persistBasicApplicationInformation(Connection co storeAppPrepStmt.setString(10, resourceId); storeAppPrepStmt.setString(11, application.getImageUrl()); storeAppPrepStmt.setString(12, templatedAccessUrl); + storeAppPrepStmt.setString(13, applicationVersion); storeAppPrepStmt.execute(); results = storeAppPrepStmt.getGeneratedKeys(); @@ -981,6 +988,7 @@ private void updateBasicApplicationData(ServiceProvider serviceProvider, Connect throws SQLException, UserStoreException, IdentityApplicationManagementException { int applicationId = serviceProvider.getApplicationID(); + String applicationVersion = serviceProvider.getApplicationVersion(); String applicationName = serviceProvider.getApplicationName(); String description = serviceProvider.getDescription(); boolean isSaasApp = serviceProvider.isSaasApp(); @@ -1056,6 +1064,7 @@ private void updateBasicApplicationData(ServiceProvider serviceProvider, Connect } statement.setInt(ApplicationTableColumns.TENANT_ID, tenantID); statement.setInt(ApplicationTableColumns.ID, applicationId); + statement.setString(ApplicationTableColumns.APP_VERSION, applicationVersion); statement.executeUpdate(); } @@ -1837,6 +1846,7 @@ public ServiceProvider getApplication(String applicationName, localServiceProvider.setApplicationName(applicationName); localServiceProvider.setDescription("Local Service Provider"); localServiceProvider.setSpProperties(prepareLocalSpProperties()); + localServiceProvider.setApplicationVersion(); applicationId = createServiceProvider(tenantDomain, localServiceProvider); } return getApplication(applicationId); @@ -2608,6 +2618,7 @@ private ServiceProvider getBasicApplicationData(int appId, Connection connection serviceProvider.setApplicationID(rs.getInt(ApplicationTableColumns.ID)); serviceProvider.setApplicationResourceId(rs.getString(ApplicationTableColumns.UUID)); serviceProvider.setApplicationName(rs.getString(ApplicationTableColumns.APP_NAME)); + serviceProvider.setApplicationVersion(rs.getString(ApplicationTableColumns.APP_VERSION)); serviceProvider.setDescription(rs.getString(ApplicationTableColumns.DESCRIPTION)); serviceProvider.setImageUrl(rs.getString(ApplicationTableColumns.IMAGE_URL)); @@ -3810,6 +3821,7 @@ public ApplicationBasicInfo[] getAllApplicationBasicInfo() basicInfo.setApplicationId(appNameResultSet.getInt("ID")); basicInfo.setApplicationName(appNameResultSet.getString("APP_NAME")); basicInfo.setDescription(appNameResultSet.getString("DESCRIPTION")); + basicInfo.setApplicationVersion(appNameResultSet.getString(ApplicationTableColumns.APP_VERSION)); appInfo.add(basicInfo); } @@ -4075,6 +4087,7 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter) basicInfo.setApplicationId(appNameResultSet.getInt("ID")); basicInfo.setApplicationName(appNameResultSet.getString("APP_NAME")); basicInfo.setDescription(appNameResultSet.getString("DESCRIPTION")); + basicInfo.setApplicationVersion(appNameResultSet.getString(ApplicationTableColumns.APP_VERSION)); appInfo.add(basicInfo); } } catch (SQLException e) { @@ -4935,6 +4948,7 @@ public boolean isApplicationExists(String serviceProviderName, String tenantName } try (Connection connection = IdentityDatabaseUtil.getDBConnection(false)) { + // Todo: change the query to something basic without getting all info. try (PreparedStatement checkAppExistence = connection .prepareStatement(ApplicationMgtDBQueries.LOAD_BASIC_APP_INFO_BY_APP_NAME)) { checkAppExistence.setString(1, serviceProviderName); @@ -6250,6 +6264,7 @@ private ApplicationBasicInfo buildApplicationBasicInfo(ResultSet appNameResultSe basicInfo.setApplicationName(appNameResultSet.getString(ApplicationTableColumns.APP_NAME)); basicInfo.setDescription(appNameResultSet.getString(ApplicationTableColumns.DESCRIPTION)); basicInfo.setUuid(appNameResultSet.getString(ApplicationTableColumns.UUID)); + basicInfo.setApplicationVersion(appNameResultSet.getString(ApplicationTableColumns.APP_VERSION)); basicInfo.setApplicationResourceId(appNameResultSet.getString(ApplicationTableColumns.UUID)); basicInfo.setImageUrl(appNameResultSet.getString(ApplicationTableColumns.IMAGE_URL)); @@ -6308,6 +6323,7 @@ private ApplicationBasicInfo buildApplicationBasicInfoWithInboundConfig(ResultSe basicInfo.setApplicationId(appNameResultSet.getInt(ApplicationTableColumns.ID)); basicInfo.setApplicationName(appNameResultSet.getString(ApplicationTableColumns.APP_NAME)); basicInfo.setDescription(appNameResultSet.getString(ApplicationTableColumns.DESCRIPTION)); + basicInfo.setApplicationVersion(appNameResultSet.getString(ApplicationTableColumns.APP_VERSION)); basicInfo.setApplicationResourceId(appNameResultSet.getString(ApplicationTableColumns.UUID)); basicInfo.setImageUrl(appNameResultSet.getString(ApplicationTableColumns.IMAGE_URL)); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java index d5818025a738..a5d401dfce30 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java @@ -28,16 +28,17 @@ public class ApplicationMgtDBQueries { // STORE Queries public static final String STORE_BASIC_APPINFO = "INSERT INTO SP_APP (TENANT_ID, APP_NAME, USER_STORE, USERNAME, " + - "DESCRIPTION, AUTH_TYPE, IS_USE_TENANT_DOMAIN_SUBJECT, ENABLE_AUTHORIZATION,IS_USE_USER_DOMAIN_SUBJECT, " + - "UUID, IMAGE_URL, ACCESS_URL) " + - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; + "DESCRIPTION, AUTH_TYPE, IS_USE_TENANT_DOMAIN_SUBJECT, ENABLE_AUTHORIZATION, IS_USE_USER_DOMAIN_SUBJECT, " + + "UUID, IMAGE_URL, ACCESS_URL, VERSION) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"; public static final String UPDATE_BASIC_APPINFO = "UPDATE SP_APP SET APP_NAME=:APP_NAME;, " + "DESCRIPTION=:DESCRIPTION;, IS_SAAS_APP=:IS_SAAS_APP;, IS_DISCOVERABLE=:IS_DISCOVERABLE;, " + - "IMAGE_URL=:IMAGE_URL;, ACCESS_URL=:ACCESS_URL; WHERE TENANT_ID=:TENANT_ID; AND ID=:ID;"; + "IMAGE_URL=:IMAGE_URL;, ACCESS_URL=:ACCESS_URL;, VERSION=:VERSION; " + + "WHERE TENANT_ID=:TENANT_ID; AND ID=:ID;"; public static final String UPDATE_BASIC_APPINFO_WITH_OWNER_UPDATE = "UPDATE SP_APP SET APP_NAME=:APP_NAME;, " + "DESCRIPTION=:DESCRIPTION;, IS_SAAS_APP=:IS_SAAS_APP;, IS_DISCOVERABLE=:IS_DISCOVERABLE;, " + "USERNAME=:USERNAME;, USER_STORE=:USER_STORE;, IMAGE_URL=:IMAGE_URL;, " + - "ACCESS_URL=:ACCESS_URL; WHERE TENANT_ID=:TENANT_ID; AND ID=:ID;"; + "ACCESS_URL=:ACCESS_URL;, VERSION=:VERSION; WHERE TENANT_ID=:TENANT_ID; AND ID=:ID;"; public static final String UPDATE_BASIC_APPINFO_WITH_ROLE_CLAIM = "UPDATE SP_APP SET ROLE_CLAIM=? WHERE TENANT_ID" + "= ? AND ID = ?"; public static final String UPDATE_BASIC_APPINFO_WITH_CLAIM_DIALEECT_AND_SEND_LOCAL_SUB_ID = @@ -76,10 +77,10 @@ public class ApplicationMgtDBQueries { // LOAD Queries public static final String LOAD_APP_ID_BY_APP_NAME = "SELECT ID FROM SP_APP WHERE APP_NAME = ? AND TENANT_ID = ?"; - public static final String LOAD_APP_NAMES_BY_TENANT = "SELECT ID, APP_NAME, DESCRIPTION FROM SP_APP WHERE " + - "TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC"; - public static final String LOAD_APP_NAMES_BY_TENANT_AND_APP_NAME = "SELECT ID, APP_NAME, DESCRIPTION FROM SP_APP " + - "WHERE TENANT_ID = ? AND APP_NAME != ? AND (%s) ORDER BY ID DESC"; + public static final String LOAD_APP_NAMES_BY_TENANT = "SELECT ID, APP_NAME, VERSION, DESCRIPTION FROM SP_APP " + + "WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC"; + public static final String LOAD_APP_NAMES_BY_TENANT_AND_APP_NAME = "SELECT ID, APP_NAME, VERSION, " + + "DESCRIPTION FROM SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? AND (%s) ORDER BY ID DESC"; public static final String LOAD_APP_IDS_BY_SP_PROPERTY_H2 = "SELECT SP_APP.UUID FROM SP_APP JOIN " + "SP_METADATA ON SP_APP.ID = SP_METADATA.SP_ID WHERE SP_METADATA.NAME=? and " + @@ -95,79 +96,80 @@ public class ApplicationMgtDBQueries { public static final String LOAD_APP_COUNT_BY_TENANT_AND_FILTER = "SELECT COUNT(DISTINCT(SP_APP.APP_NAME)) FROM " + "SP_APP LEFT JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? " + "AND SP_APP.APP_NAME != ? AND (%s)"; - public static final String LOAD_APP_BY_TENANT_AND_NAME = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + - "ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = :TENANT_ID; " + - "AND APP_NAME = :APP_NAME;"; + public static final String LOAD_APP_BY_TENANT_AND_NAME = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, " + + "IMAGE_URL, ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE " + + "TENANT_ID = :TENANT_ID; AND APP_NAME = :APP_NAME;"; // Load application basic information for listing with pagination - public static final String LOAD_APP_NAMES_BY_TENANT_MYSQL = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + - "ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY " + - "ID DESC LIMIT ?, ?"; + public static final String LOAD_APP_NAMES_BY_TENANT_MYSQL = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, " + + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = ? AND " + + "APP_NAME != ? ORDER BY ID DESC LIMIT ?, ?"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MYSQL = "SELECT DISTINCT SP_APP.ID," + - " SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, SP_APP.USERNAME," + - " SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP LEFT JOIN SP_INBOUND_AUTH ON SP_APP.ID =" + - " SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME != ? AND (%s)" + - " ORDER BY SP_APP.ID DESC LIMIT ?, ?"; + " SP_APP.APP_NAME, SP_APP.VERSION, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL," + + " SP_APP.ACCESS_URL, SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP LEFT" + + " JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND" + + " SP_APP.APP_NAME != ? AND (%s) ORDER BY SP_APP.ID DESC LIMIT ?, ?"; - public static final String LOAD_APP_NAMES_BY_TENANT_ORACLE = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + - "ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + + public static final String LOAD_APP_NAMES_BY_TENANT_ORACLE = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, " + + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "(SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + "TENANT_ID, rownum AS rnum FROM " + - "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID " + - "FROM SP_APP ORDER BY ID DESC) WHERE TENANT_ID = ? AND APP_NAME != ? AND rownum <= ?) WHERE rnum > ? "; - - public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_ORACLE = "SELECT DISTINCT ID, APP_NAME, " + - "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, INBOUND_AUTH_KEY, INBOUND_AUTH_TYPE, " + - "USERNAME, USER_STORE, TENANT_ID, ROWNUM AS rn from " + - "(SELECT SP_APP.ID, SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, " + + "(SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + + "TENANT_ID FROM SP_APP ORDER BY ID DESC) WHERE TENANT_ID = ? AND APP_NAME != ? AND rownum <= ?) WHERE " + + "rnum > ? "; + + public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_ORACLE = "SELECT DISTINCT ID, APP_NAME " + + "VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "(SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, INBOUND_AUTH_KEY, " + + "INBOUND_AUTH_TYPE, USERNAME, USER_STORE, TENANT_ID, ROWNUM AS rn from " + + "(SELECT SP_APP.ID, SP_APP.APP_NAME, SP_APP.VERSION, SP_APP.DESCRIPTION, SP_APP.UUID, " + "SP_APP.ACCESS_URL, SP_INBOUND_AUTH.INBOUND_AUTH_KEY, SP_INBOUND_AUTH.INBOUND_AUTH_TYPE, " + - "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + + "SP_APP.IMAGE_URL, SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + "LEFT JOIN SP_INBOUND_AUTH on SP_APP.ID = SP_INBOUND_AUTH.APP_ID " + "WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME <> ? AND (%s) ORDER BY SP_APP.ID DESC) " + "WHERE ROWNUM <= ?) WHERE rn > ?"; - public static final String LOAD_APP_NAMES_BY_TENANT_DB2SQL = "SELECT ID, APP_NAME, DESCRIPTION, " + + public static final String LOAD_APP_NAMES_BY_TENANT_DB2SQL = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, " + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM (SELECT " + "ROW_NUMBER() OVER(ORDER BY ID DESC) AS rn,SP_APP.* FROM SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ) " + "WHERE rn BETWEEN ? AND ?"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_DB2SQL = "SELECT DISTINCT ID, APP_NAME, " + - "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "(SELECT SP_APP.ID, SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, " + - "SP_APP.ACCESS_URL, SP_INBOUND_AUTH.INBOUND_AUTH_KEY, SP_INBOUND_AUTH.INBOUND_AUTH_TYPE, " + - "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID, ROW_NUMBER() " + + "VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "(SELECT SP_APP.ID, SP_APP.APP_NAME, SP_APP.VERSION, SP_APP.DESCRIPTION, SP_APP.UUID, " + + "SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, SP_INBOUND_AUTH.INBOUND_AUTH_KEY, " + + "SP_INBOUND_AUTH.INBOUND_AUTH_TYPE, SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID, ROW_NUMBER() " + "OVER (ORDER BY SP_APP.ID DESC) AS rn FROM SP_APP LEFT JOIN SP_INBOUND_AUTH ON " + "SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND " + "SP_APP.APP_NAME <> ? AND (%s) ORDER BY SP_APP.ID DESC ) WHERE rn BETWEEN ? AND ?"; - public static final String LOAD_APP_NAMES_BY_TENANT_MSSQL = "SELECT ID, APP_NAME, DESCRIPTION, " + + public static final String LOAD_APP_NAMES_BY_TENANT_MSSQL = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, " + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MSSQL = "SELECT DISTINCT SP_APP.ID, " + - "SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, SP_APP.USERNAME, " + - "SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP LEFT JOIN SP_INBOUND_AUTH ON " + - "SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND " + + "SP_APP.APP_NAME, SP_APP.VERSION, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, " + + "SP_APP.ACCESS_URL, SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP LEFT JOIN " + + "SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND " + "SP_APP.APP_NAME != ? AND (%s) ORDER BY SP_APP.ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; - public static final String LOAD_APP_NAMES_BY_TENANT_POSTGRESQL = "SELECT ID, APP_NAME, DESCRIPTION, " + + public static final String LOAD_APP_NAMES_BY_TENANT_POSTGRESQL = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, " + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC LIMIT ? OFFSET ?"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_POSTGRESQL = "SELECT DISTINCT SP_APP.ID, " + - "SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, " + - "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + + "SP_APP.APP_NAME, SP_APP.VERSION, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, " + + "SP_APP.ACCESS_URL, SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + "LEFT JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? " + "AND SP_APP.APP_NAME != ? AND (%s) ORDER BY SP_APP.ID DESC LIMIT ? OFFSET ?"; - public static final String LOAD_APP_NAMES_BY_TENANT_INFORMIX = "SELECT SKIP ? FIRST ? ID, APP_NAME, " + + public static final String LOAD_APP_NAMES_BY_TENANT_INFORMIX = "SELECT SKIP ? FIRST ? ID, APP_NAME, VERSION, " + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP " + "WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_INFORMIX = "SELECT SKIP ? FIRST ? DISTINCT " + - "SP_APP.ID, SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, " + - "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + + "SP_APP.ID, SP_APP.APP_NAME, SP_APP.VERSION, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, " + + "SP_APP.ACCESS_URL, SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + "LEFT OUTER JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID " + "WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME <> ? AND (%s) ORDER BY SP_APP.ID desc"; @@ -195,10 +197,10 @@ public class ApplicationMgtDBQueries { "FROM SP_APP WHERE APP_NAME " + "= ? AND TENANT_ID= ?"; - public static final String LOAD_BASIC_APP_INFO_BY_APP_ID = "SELECT ID, TENANT_ID, APP_NAME, USER_STORE, " + - "USERNAME, DESCRIPTION, ROLE_CLAIM, AUTH_TYPE, PROVISIONING_USERSTORE_DOMAIN, IS_LOCAL_CLAIM_DIALECT," + - "IS_SEND_LOCAL_SUBJECT_ID, IS_SEND_AUTH_LIST_OF_IDPS, IS_USE_TENANT_DOMAIN_SUBJECT, " + - "IS_USE_USER_DOMAIN_SUBJECT, ENABLE_AUTHORIZATION, " + + public static final String LOAD_BASIC_APP_INFO_BY_APP_ID = "SELECT ID, TENANT_ID, APP_NAME, VERSION, " + + "USER_STORE, USERNAME, DESCRIPTION, ROLE_CLAIM, AUTH_TYPE, PROVISIONING_USERSTORE_DOMAIN, " + + "IS_LOCAL_CLAIM_DIALECT, IS_SEND_LOCAL_SUBJECT_ID, IS_SEND_AUTH_LIST_OF_IDPS, " + + "IS_USE_TENANT_DOMAIN_SUBJECT, IS_USE_USER_DOMAIN_SUBJECT, ENABLE_AUTHORIZATION, " + "SUBJECT_CLAIM_URI, IS_SAAS_APP, UUID, IMAGE_URL, " + "ACCESS_URL, IS_DISCOVERABLE " + "FROM SP_APP WHERE ID = ?"; @@ -375,9 +377,9 @@ public class ApplicationMgtDBQueries { public static final String DELETE_DEFAULT_SEQ = "DELETE FROM SP_DEFAULT_AUTH_SEQ WHERE NAME = ? AND TENANT_ID = ?"; // DB queries for application management using the resourceId - public static final String LOAD_APP_BY_TENANT_AND_UUID = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + - "ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = :TENANT_ID; " + - "AND UUID = :UUID;"; + public static final String LOAD_APP_BY_TENANT_AND_UUID = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, " + + "IMAGE_URL, ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE " + + "TENANT_ID = :TENANT_ID; AND UUID = :UUID;"; public static final String LOAD_APP_ID_BY_UUID_AND_TENANT_ID = "SELECT ID FROM SP_APP WHERE UUID = :UUID; " + "AND TENANT_ID = :TENANT_ID;"; @@ -390,16 +392,16 @@ public class ApplicationMgtDBQueries { public static final String REMOVE_APP_FROM_SP_APP_WITH_UUID = "DELETE FROM SP_APP WHERE UUID=:UUID; " + "AND TENANT_ID=:TENANT_ID;"; - public static final String LOAD_APP_BY_NAME_AND_TENANT = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + - "ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP " + + public static final String LOAD_APP_BY_NAME_AND_TENANT = "SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, " + + "IMAGE_URL, ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP " + "WHERE TENANT_ID = :TENANT_ID; AND APP_NAME = :APP_NAME;"; // DB queries to manage application discoverability - public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_MYSQL = "SELECT ID, APP_NAME, DESCRIPTION, UUID, " + - "IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = :TENANT_ID; AND " + - "IS_DISCOVERABLE = '1' ORDER BY ID DESC LIMIT :OFFSET;, :LIMIT;"; + public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_MYSQL = "SELECT ID, APP_NAME, VERSION, " + + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE " + + "TENANT_ID = :TENANT_ID; AND IS_DISCOVERABLE = '1' ORDER BY ID DESC LIMIT :OFFSET;, :LIMIT;"; - public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_ORACLE = "SELECT ID, APP_NAME, " + + public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_ORACLE = "SELECT ID, APP_NAME, VERSION, " + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID, rownum " + "AS rnum FROM " + @@ -407,59 +409,59 @@ public class ApplicationMgtDBQueries { "TENANT_ID, IS_DISCOVERABLE FROM SP_APP ORDER BY ID DESC) WHERE TENANT_ID = :TENANT_ID; AND " + "rownum <= :END_INDEX; AND IS_DISCOVERABLE = '1') WHERE rnum > :ZERO_BASED_START_INDEX;"; - public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_MSSQL = "SELECT ID, APP_NAME, " + + public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_MSSQL = "SELECT ID, APP_NAME, VERSION, " + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "SP_APP WHERE TENANT_ID = :TENANT_ID; AND IS_DISCOVERABLE = '1' ORDER BY ID " + "DESC OFFSET :OFFSET; ROWS FETCH NEXT :LIMIT; ROWS ONLY"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_POSTGRESQL = "SELECT ID, " + - "APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "SP_APP WHERE TENANT_ID = :TENANT_ID; AND IS_DISCOVERABLE = '1' ORDER BY ID " + "DESC LIMIT :LIMIT; OFFSET :OFFSET;"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_DB2SQL = "SELECT ID, " + - "APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) AS rn,SP_APP.* FROM SP_APP WHERE TENANT_ID = :TENANT_ID; " + "AND IS_DISCOVERABLE = '1') WHERE rn BETWEEN :ONE_BASED_START_INDEX; AND :END_INDEX;"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_INFORMIX = "SELECT SKIP :OFFSET; FIRST " + - ":LIMIT; ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "SP_APP WHERE TENANT_ID = :TENANT_ID; AND IS_DISCOVERABLE = '1' ORDER BY ID DESC"; + ":LIMIT; ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + + "TENANT_ID FROM SP_APP WHERE TENANT_ID = :TENANT_ID; AND IS_DISCOVERABLE = '1' ORDER BY ID DESC"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_AND_APP_NAME_MYSQL = - "SELECT ID, APP_NAME, DESCRIPTION" + + "SELECT ID, APP_NAME, VERSION, DESCRIPTION" + " , UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP " + "WHERE TENANT_ID = :TENANT_ID; " + "AND APP_NAME LIKE :APP_NAME; AND IS_DISCOVERABLE = '1' ORDER BY ID DESC LIMIT :OFFSET;, :LIMIT;"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_AND_APP_NAME_ORACLE = "SELECT ID, APP_NAME, " + - "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID, rownum " + - "AS rnum FROM " + - "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + + "VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "(SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + + "TENANT_ID, rownum AS rnum FROM " + + "(SELECT ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + "TENANT_ID FROM SP_APP ORDER BY ID DESC) WHERE TENANT_ID = :TENANT_ID; AND APP_NAME LIKE :APP_NAME; AND " + "rownum <= :END_INDEX; AND IS_DISCOVERABLE = '1') WHERE rnum > :ZERO_BASED_START_INDEX;"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_AND_APP_NAME_MSSQL = "SELECT ID, APP_NAME, " + - "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "SP_APP WHERE TENANT_ID = :TENANT_ID; AND APP_NAME LIKE :APP_NAME; AND IS_DISCOVERABLE = '1' ORDER BY ID " + "DESC OFFSET :OFFSET; ROWS FETCH NEXT :LIMIT; ROWS ONLY"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_AND_APP_NAME_POSTGRESQL = "SELECT ID, " + - "APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + + "APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "SP_APP WHERE TENANT_ID = :TENANT_ID; AND APP_NAME LIKE :APP_NAME; AND IS_DISCOVERABLE = '1' ORDER BY ID " + "DESC LIMIT :LIMIT; OFFSET :OFFSET;"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_AND_APP_NAME_DB2 = "SELECT ID, " + - "APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + "(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) AS rn,SP_APP.* FROM SP_APP WHERE TENANT_ID = :TENANT_ID; " + "AND APP_NAME LIKE :APP_NAME; AND IS_DISCOVERABLE = '1)WHERE rn BETWEEN :ONE_BASED_START_INDEX; AND " + ":END_INDEX;"; public static final String LOAD_DISCOVERABLE_APPS_BY_TENANT_AND_APP_NAME_INFORMIX = "SELECT SKIP :OFFSET; FIRST " + - ":LIMIT; ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "SP_APP WHERE TENANT_ID = :TENANT_ID; AND APP_NAME LIKE :APP_NAME; AND IS_DISCOVERABLE = '1' ORDER BY ID " + - "DESC"; + ":LIMIT; ID, APP_NAME, VERSION, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + + "TENANT_ID FROM SP_APP WHERE TENANT_ID = :TENANT_ID; AND APP_NAME LIKE :APP_NAME; AND " + + "IS_DISCOVERABLE = '1' ORDER BY ID DESC"; public static final String LOAD_DISCOVERABLE_APP_COUNT_BY_APP_NAME_AND_TENANT = "SELECT COUNT(UUID) FROM SP_APP " + "WHERE TENANT_ID = :TENANT_ID; AND APP_NAME LIKE :APP_NAME; AND IS_DISCOVERABLE = '1'"; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/FileBasedApplicationDAO.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/FileBasedApplicationDAO.java index 53ee53379035..2ccb1909eb57 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/FileBasedApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/FileBasedApplicationDAO.java @@ -25,6 +25,7 @@ import org.wso2.carbon.identity.application.common.model.InboundAuthenticationRequestConfig; import org.wso2.carbon.identity.application.common.model.LocalAndOutboundAuthenticationConfig; import org.wso2.carbon.identity.application.common.model.ServiceProvider; +import org.wso2.carbon.identity.application.mgt.ApplicationConstants; import org.wso2.carbon.identity.application.mgt.internal.ApplicationManagementServiceComponent; import java.util.ArrayList; @@ -92,8 +93,12 @@ public ApplicationBasicInfo[] getAllApplicationBasicInfo() ApplicationBasicInfo basicInfo = new ApplicationBasicInfo(); basicInfo.setApplicationName(entry.getValue().getApplicationName()); basicInfo.setDescription(entry.getValue().getDescription()); + if (entry.getValue().getApplicationVersion() == null) { + basicInfo.setApplicationVersion(ApplicationConstants.BASE_APP_VERSION); + } else { + basicInfo.setApplicationVersion(entry.getValue().getApplicationVersion()); + } appInfo.add(basicInfo); - } return appInfo.toArray(new ApplicationBasicInfo[appInfo.size()]); @@ -122,6 +127,11 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter) ApplicationBasicInfo basicInfo = new ApplicationBasicInfo(); basicInfo.setApplicationName(entry.getValue().getApplicationName()); basicInfo.setDescription(entry.getValue().getDescription()); + if (entry.getValue().getApplicationVersion() == null) { + basicInfo.setApplicationVersion(ApplicationConstants.BASE_APP_VERSION); + } else { + basicInfo.setApplicationVersion(entry.getValue().getApplicationVersion()); + } appInfo.add(basicInfo); } diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/internal/ApplicationManagementServiceComponent.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/internal/ApplicationManagementServiceComponent.java index cbef7a879f0d..750ccda24df0 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/internal/ApplicationManagementServiceComponent.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/internal/ApplicationManagementServiceComponent.java @@ -264,6 +264,9 @@ private void buildFileBasedSPList() { documentElement = new StAXOMBuilder(fileInputStream).getDocumentElement(); ServiceProvider sp = ServiceProvider.build(documentElement); if (sp != null) { + if (StringUtils.isBlank(sp.getApplicationVersion())) { + sp.setApplicationVersion(ApplicationConstants.BASE_APP_VERSION); + } fileBasedSPs.put(sp.getApplicationName(), sp); } } diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/listener/ApplicationMgtAuditLogger.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/listener/ApplicationMgtAuditLogger.java index 459b4f82934f..1a98e82b6c6e 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/listener/ApplicationMgtAuditLogger.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/listener/ApplicationMgtAuditLogger.java @@ -138,6 +138,7 @@ private String buildData(ServiceProvider serviceProvider) { StringBuilder data = new StringBuilder(); data.append("Name:").append(serviceProvider.getApplicationName()).append(", "); data.append("Description:").append(serviceProvider.getDescription()).append(", "); + data.append("Application Version:").append(serviceProvider.getApplicationVersion()).append(", "); data.append("Resource ID:").append(serviceProvider.getApplicationResourceId()).append(", "); data.append("Access URL:").append(serviceProvider.getAccessUrl()).append(", "); data.append("Is Discoverable:").append(serviceProvider.isDiscoverable()).append(", "); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/validator/DefaultApplicationValidator.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/validator/DefaultApplicationValidator.java index e124e86c33bc..2a31335d868d 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/validator/DefaultApplicationValidator.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/validator/DefaultApplicationValidator.java @@ -112,6 +112,21 @@ public class DefaultApplicationValidator implements ApplicationValidator { private static final int MODE_MULTI_LINE = 5; private static final int DEFAULT_MAX_ANDROID_THUMBPRINT_COUNT = 20; + private enum ApplicationVersions { + V0("v0.0.0"), + V1("v1.0.0"); + + private final String value; + + ApplicationVersions(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } + public DefaultApplicationValidator() { loopPattern = Pattern.compile("\\b(for|while|forEach)\\b"); @@ -128,6 +143,7 @@ public List validateApplication(ServiceProvider serviceProvider, String String username) throws IdentityApplicationManagementException { List validationErrors = new ArrayList<>(); + validateApplicationVersion(validationErrors, serviceProvider.getApplicationVersion()); validateDiscoverabilityConfigs(validationErrors, serviceProvider); validateInboundAuthenticationConfig(serviceProvider.getInboundAuthenticationConfig(), tenantDomain, serviceProvider.getApplicationID()); @@ -151,6 +167,13 @@ public List validateApplication(ServiceProvider serviceProvider, String return validationErrors; } + private void validateApplicationVersion(List validationErrors, String applicationVersion) { + + if (Stream.of(ApplicationVersions.values()).noneMatch(v -> v.getValue().equals(applicationVersion))) { + validationErrors.add("Invalid application version: " + applicationVersion); + } + } + private void validateDiscoverabilityConfigs(List validationErrors, ServiceProvider serviceProvider) { diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java index 4d95b4d7dbd5..982bf181e93d 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java @@ -220,6 +220,7 @@ public void testAddApplication(Object serviceProvider, String tenantDomain, Stri Assert.assertEquals(retrievedSP.getApplicationID(), inputSP.getApplicationID()); Assert.assertEquals(retrievedSP.getOwner().getUserName(), inputSP.getOwner().getUserName()); + Assert.assertEquals(retrievedSP.getApplicationVersion(), ApplicationConstants.LATEST_APP_VERSION); Assert.assertFalse(retrievedSP.isManagementApp()); // Deleting added application. @@ -333,6 +334,7 @@ public void testGetApplicationBasicInfoWithNameFilter(Object serviceProvider, St (tenantDomain, username, "name eq " + inputSP.getApplicationName()); Assert.assertEquals(applicationBasicInfo[0].getApplicationName(), inputSP.getApplicationName()); Assert.assertEquals(applicationBasicInfo[0].getApplicationName(), addedSP.getApplicationName()); + Assert.assertEquals(applicationBasicInfo[0].getApplicationVersion(), ApplicationConstants.LATEST_APP_VERSION); // Deleting added application. applicationManagementService.deleteApplication(inputSP.getApplicationName(), tenantDomain, username); @@ -352,6 +354,7 @@ public void testGetPaginatedApplicationBasicInfo(Object serviceProvider, String (tenantDomain, username, 1, "name co " + inputSP.getApplicationName()); Assert.assertEquals(applicationBasicInfo[0].getApplicationName(), inputSP.getApplicationName()); Assert.assertEquals(applicationBasicInfo[0].getApplicationName(), addedSP.getApplicationName()); + Assert.assertEquals(applicationBasicInfo[0].getApplicationVersion(), ApplicationConstants.LATEST_APP_VERSION); // Deleting added application. applicationManagementService.deleteApplication(inputSP.getApplicationName(), tenantDomain, username); @@ -853,6 +856,7 @@ public void testGetServiceProviderByClientId() throws IdentityApplicationManagem Assert.assertEquals(actual.getApplicationName(), inputSP.getApplicationName()); Assert.assertEquals(actual.getOwner().getUserName(), USERNAME_1); Assert.assertEquals(actual.getDescription(), inputSP.getDescription()); + Assert.assertEquals(actual.getApplicationVersion(), ApplicationConstants.LATEST_APP_VERSION); // Deleting all added application. applicationManagementService.deleteApplications(SUPER_TENANT_ID); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/DefaultApplicationValidatorTest.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/DefaultApplicationValidatorTest.java index be12a814e7b6..a0eacc14397c 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/DefaultApplicationValidatorTest.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/DefaultApplicationValidatorTest.java @@ -263,4 +263,37 @@ public void testValidateTrustedAppWithEmptyMetadataObj() throws NoSuchMethodExce Assert.assertTrue(validationErrors.isEmpty(), "Validation should be skipped and there should not be any " + "error messages."); } + + @DataProvider(name = "validateApplicationVersionDataProvider") + public Object[][] validateApplicationVersionDataProvider() { + + return new Object[][]{ + // version, valid status + {"v1.0.0", true}, + {"v0.0.0", true}, + {"v0.0.1", false}, + {"v0.1.1", false}, + {"v1.1.1", false}, + {"dummy", false}, + }; + } + + @Test(dataProvider = "validateApplicationVersionDataProvider") + public void testValidateApplicationVersion(String version, boolean isValid) throws NoSuchMethodException, + InvocationTargetException, IllegalAccessException { + + // Prepare the service provider object. + ServiceProvider sp = new ServiceProvider(); + sp.setApplicationVersion(version); + List validationErrors = new ArrayList<>(); + + DefaultApplicationValidator defaultApplicationValidator = new DefaultApplicationValidator(); + Method validateApplicationVersion = DefaultApplicationValidator.class.getDeclaredMethod( + "validateApplicationVersion", List.class, String.class); + validateApplicationVersion.setAccessible(true); + validateApplicationVersion.invoke(defaultApplicationValidator, validationErrors, sp.getApplicationVersion()); + + Assert.assertEquals(validationErrors.isEmpty(), isValid, "Valid app version has been introduced. " + + "Please update the test case accordingly."); + } } diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/resources/dbscripts/identity.sql b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/resources/dbscripts/identity.sql index ff1e7a44b2d4..054399b42288 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/resources/dbscripts/identity.sql +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/resources/dbscripts/identity.sql @@ -346,9 +346,10 @@ CREATE TABLE IF NOT EXISTS IDN_AUTH_SESSION_META_DATA ( CREATE TABLE IF NOT EXISTS SP_APP ( ID INTEGER NOT NULL AUTO_INCREMENT, TENANT_ID INTEGER NOT NULL, - APP_NAME VARCHAR (255) NOT NULL , + APP_NAME VARCHAR (255) NOT NULL, + VERSION VARCHAR (255) NOT NULL, USER_STORE VARCHAR (255) NOT NULL, - USERNAME VARCHAR (255) NOT NULL , + USERNAME VARCHAR (255) NOT NULL, DESCRIPTION VARCHAR (1024), ROLE_CLAIM VARCHAR (512), AUTH_TYPE VARCHAR (255) NOT NULL, diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/db2.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/db2.sql index 7facf6a4d8a0..7e36802586e1 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/db2.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/db2.sql @@ -404,6 +404,7 @@ CREATE TABLE SP_APP ( ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/h2.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/h2.sql index 6da58b00a5cd..6b9c26054187 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/h2.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/h2.sql @@ -358,6 +358,7 @@ CREATE TABLE IF NOT EXISTS SP_APP ( ID INTEGER NOT NULL AUTO_INCREMENT, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mssql.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mssql.sql index cc3ce1c9ad1e..2167f259682e 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mssql.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mssql.sql @@ -389,6 +389,7 @@ CREATE TABLE SP_APP ( ID INTEGER NOT NULL IDENTITY, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql-cluster.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql-cluster.sql index 8e827ea7552d..ba152db4fe63 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql-cluster.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql-cluster.sql @@ -399,6 +399,7 @@ CREATE TABLE IF NOT EXISTS SP_APP ( ID INTEGER NOT NULL AUTO_INCREMENT, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR(255) NOT NULL, + VERSION VARCHAR(255) DEFAULT 'v1.0.0', USER_STORE VARCHAR(255) NOT NULL, USERNAME VARCHAR(255) NOT NULL, DESCRIPTION VARCHAR(1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql.sql index f09ae2e4513b..7e0e67b92201 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/mysql.sql @@ -362,6 +362,7 @@ CREATE TABLE IF NOT EXISTS SP_APP ( ID INTEGER NOT NULL AUTO_INCREMENT, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle.sql index 6f9e84488ed2..55f8c9dd9a69 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle.sql @@ -432,6 +432,7 @@ CREATE TABLE SP_APP ( ID INTEGER, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle_rac.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle_rac.sql index 8f06bfedecd9..92b7d807ef43 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle_rac.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/oracle_rac.sql @@ -423,6 +423,7 @@ CREATE TABLE SP_APP ( ID INTEGER, TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024), diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/postgresql.sql b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/postgresql.sql index 20793bca2de2..43a9beba1948 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/postgresql.sql +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/dbscripts/postgresql.sql @@ -425,6 +425,7 @@ CREATE TABLE SP_APP ( ID INTEGER DEFAULT NEXTVAL('SP_APP_SEQ'), TENANT_ID INTEGER NOT NULL, APP_NAME VARCHAR (255) NOT NULL , + VERSION VARCHAR (255) DEFAULT 'v1.0.0', USER_STORE VARCHAR (255) NOT NULL, USERNAME VARCHAR (255) NOT NULL , DESCRIPTION VARCHAR (1024),