Skip to content

Commit

Permalink
Merge pull request wso2#1309 from sachiniWettasinghe/sw-support-4.6.1…
Browse files Browse the repository at this point in the history
….x-full

[UMT - 5.11.0] Use equal operator instead of LIKE to filter users based on an attribute
  • Loading branch information
sachiniWettasinghe authored Feb 18, 2021
2 parents 9443166 + 24319d7 commit d62f05f
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ public final class JDBCRealmConstants {
public static final String GET_PROP_FOR_PROFILE = "GetUserPropertyForProfileSQL";
public static final String GET_PROP_FOR_PROFILE_WITH_ID = "GetUserPropertyForProfileWithIDSQL";
public static final String GET_USERS_FOR_PROP = "GetUserLisForPropertySQL";
public static final String GET_USERS_FOR_CLAIM_VALUE = "GetUserListForClaimValueSQL";
public static final String GET_USERS_FOR_PROP_WITH_ID = "GetUserLisForPropertyWithIDSQL";
public static final String GET_USERS_FOR_CLAIM_VALUE_WITH_ID = "GetUserListForClaimValueWithIDSQL";
public static final String GET_PAGINATED_USERS_FOR_PROP = "GetPaginatedUserLisForPropertySQL";
public static final String GET_PAGINATED_USERS_FOR_PROP_WITH_ID = "GetPaginatedUserLisForPropertyWithIDSQL";
public static final String GET_PAGINATED_USERS_FOR_PROP_MSSQL = "GetPaginatedUserLisForPropertySQL-mssql";
Expand Down Expand Up @@ -276,10 +278,18 @@ public final class JDBCRealmConstants {
"WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND UM_USER_ATTRIBUTE.UM_ATTR_NAME =? " +
"AND UM_USER_ATTRIBUTE.UM_ATTR_VALUE LIKE ? AND UM_USER_ATTRIBUTE.UM_PROFILE_ID=? " +
"AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=?";
public static final String GET_USERS_FOR_CLAIM_VALUE_SQL = "SELECT DISTINCT UM_USER_NAME FROM UM_USER, UM_USER_ATTRIBUTE " +
"WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND UM_USER_ATTRIBUTE.UM_ATTR_NAME =? " +
"AND UM_USER_ATTRIBUTE.UM_ATTR_VALUE =? AND UM_USER_ATTRIBUTE.UM_PROFILE_ID=? " +
"AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=?";
public static final String GET_USERS_FOR_PROP_WITH_ID_SQL = "SELECT DISTINCT UM_USER.UM_USER_ID FROM UM_USER, "
+ "UM_USER_ATTRIBUTE WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND UM_USER_ATTRIBUTE.UM_ATTR_NAME =? " +
"AND UM_USER_ATTRIBUTE.UM_ATTR_VALUE LIKE ? AND UM_USER_ATTRIBUTE.UM_PROFILE_ID=? " +
"AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=?";
public static final String GET_USERS_FOR_CLAIM_VALUE_WITH_ID_SQL = "SELECT DISTINCT UM_USER.UM_USER_ID FROM " +
"UM_USER, UM_USER_ATTRIBUTE WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND " +
"UM_USER_ATTRIBUTE.UM_ATTR_NAME =? AND UM_USER_ATTRIBUTE.UM_ATTR_VALUE =? AND " +
"UM_USER_ATTRIBUTE.UM_PROFILE_ID=? AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=?";
public static final String GET_PAGINATED_USERS_FOR_PROP_SQL = "SELECT UM_USER_NAME FROM UM_USER, " +
"UM_USER_ATTRIBUTE WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND UM_USER_ATTRIBUTE.UM_ATTR_NAME " +
"=? AND UM_USER_ATTRIBUTE.UM_ATTR_VALUE LIKE ? AND UM_USER_ATTRIBUTE.UM_PROFILE_ID=? AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=? ORDER BY UM_USER_NAME ASC LIMIT ? OFFSET ?";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,13 +409,23 @@ public class JDBCUserStoreConstants {
setAdvancedProperty(JDBCRealmConstants.GET_USERS_FOR_PROP, "Get User List for Property SQL",
JDBCRealmConstants.GET_USERS_FOR_PROP_SQL, "",
new Property[] { USER.getProperty(), SQL.getProperty(), FALSE.getProperty() });
setAdvancedProperty(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE, "Get User List for Claim Value SQL",
JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_SQL, "",
new Property[] { USER.getProperty(), SQL.getProperty(), FALSE.getProperty() });
setAdvancedProperty(JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID, "Get User List for Property With ID SQL",
JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID_SQL, "",
new Property[] { USER.getProperty(), SQL.getProperty(), FALSE.getProperty() });
setAdvancedProperty(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID,
"Get User List for Claim Value With ID SQL", JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_SQL, "",
new Property[]{USER.getProperty(), SQL.getProperty(), FALSE.getProperty()});
setAdvancedProperty(JDBCCaseInsensitiveConstants.GET_USERS_FOR_PROP_WITH_ID_CASE_INSENSITIVE,
"Get User List For Property With ID SQL With Case Insensitive Username",
JDBCCaseInsensitiveConstants.GET_USERS_FOR_PROP_WITH_ID_SQL_CASE_INSENSITIVE, "",
new Property[] { USER.getProperty(), SQL.getProperty(), FALSE.getProperty() });
setAdvancedProperty(JDBCCaseInsensitiveConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_CASE_INSENSITIVE,
"Get User List For Claim Value With ID SQL With Case Insensitive Username",
JDBCCaseInsensitiveConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_SQL_CASE_INSENSITIVE, "",
new Property[] { USER.getProperty(), SQL.getProperty(), FALSE.getProperty() });
setAdvancedProperty(JDBCRealmConstants.GET_PROFILE_NAMES, "Get Profile Names SQL",
JDBCRealmConstants.GET_PROFILE_NAMES_SQL, "",
new Property[] { USER.getProperty(), SQL.getProperty(), FALSE.getProperty() });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2978,24 +2978,27 @@ public String[] getUserListFromProperties(String property, String value, String
if(value == null){
throw new IllegalArgumentException("Filter value cannot be null");
}

String sqlStmt;
if (value.contains(QUERY_FILTER_STRING_ANY)) {
// This is to support LDAP like queries. Value having only * is restricted except one *.
if (!value.matches("(\\*)\\1+")) {
// Convert all the * to % except \*.
value = value.replaceAll("(?<!\\\\)\\*", SQL_FILTER_STRING_ANY);
}
sqlStmt = realmConfig.getUserStoreProperty(JDBCRealmConstants.GET_USERS_FOR_PROP);
} else {
sqlStmt = realmConfig.getUserStoreProperty(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE);
}

String[] users = new String[0];
Connection dbConnection = null;
String sqlStmt = null;
PreparedStatement prepStmt = null;
ResultSet rs = null;

List<String> list = new ArrayList<String>();
try {
dbConnection = getDBConnection();
sqlStmt = realmConfig.getUserStoreProperty(JDBCRealmConstants.GET_USERS_FOR_PROP);
prepStmt = dbConnection.prepareStatement(sqlStmt);
prepStmt.setString(1, property);
prepStmt.setString(2, value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2299,27 +2299,35 @@ public List<String> doGetUserListFromPropertiesWithID(String property, String va
if (value == null) {
throw new IllegalArgumentException("Filter value cannot be null");
}

String sqlStmt;
if (value.contains(QUERY_FILTER_STRING_ANY)) {
// This is to support LDAP like queries. Value having only * is restricted except one *.
if (!value.matches("(\\*)\\1+")) {
// Convert all the * to % except \*.
value = value.replaceAll("(?<!\\\\)\\*", SQL_FILTER_STRING_ANY);
}
if (!isCaseSensitiveUsername() && UID.equals(property)) {
sqlStmt = realmConfig.getUserStoreProperty(JDBCCaseInsensitiveConstants.
GET_USERS_FOR_PROP_WITH_ID_CASE_INSENSITIVE);
} else {
sqlStmt = realmConfig.getUserStoreProperty(JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID);
}
} else {
if (!isCaseSensitiveUsername() && UID.equals(property)) {
sqlStmt = realmConfig.getUserStoreProperty(JDBCCaseInsensitiveConstants.
GET_USERS_FOR_CLAIM_VALUE_WITH_ID_CASE_INSENSITIVE);
} else {
sqlStmt = realmConfig.getUserStoreProperty(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID);
}
}

Connection dbConnection = null;
String sqlStmt;
PreparedStatement prepStmt = null;
ResultSet rs = null;
List<String> userList = new ArrayList<>();
try {
dbConnection = getDBConnection();
if (!isCaseSensitiveUsername() && UID.equals(property)) {
sqlStmt = realmConfig.getUserStoreProperty(JDBCCaseInsensitiveConstants.
GET_USERS_FOR_PROP_WITH_ID_CASE_INSENSITIVE);
} else {
sqlStmt = realmConfig.getUserStoreProperty(JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID);
}
prepStmt = dbConnection.prepareStatement(sqlStmt);
prepStmt.setString(1, property);
prepStmt.setString(2, value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public class JDBCCaseInsensitiveConstants {
public static final String GET_PROFILE_NAMES_FOR_USER_CASE_INSENSITIVE = "GetUserProfileNamesSQLCaseInsensitive";
public static final String GET_USERS_FOR_PROP_WITH_ID_CASE_INSENSITIVE =
"GetUserListForPropertyWithIDSQLCaseInsensitive";
public static final String GET_USERS_FOR_CLAIM_VALUE_WITH_ID_CASE_INSENSITIVE =
"GetUserListForClaimValueWithIDSQLCaseInsensitive";
public static final String GET_USERID_FROM_USERNAME_CASE_INSENSITIVE = "GetUserIDFromUserNameSQLCaseInsensitive";
public static final String GET_TENANT_ID_FROM_USERNAME_CASE_INSENSITIVE =
"GetTenantIDFromUserNameSQLCaseInsensitive";
Expand Down Expand Up @@ -148,6 +150,10 @@ public class JDBCCaseInsensitiveConstants {
"FROM UM_USER, UM_USER_ATTRIBUTE WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND " +
"UM_USER_ATTRIBUTE.UM_ATTR_NAME =? AND LOWER(UM_USER_ATTRIBUTE.UM_ATTR_VALUE) LIKE LOWER(?) AND " +
"UM_USER_ATTRIBUTE.UM_PROFILE_ID=? AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=?";
public static final String GET_USERS_FOR_CLAIM_VALUE_WITH_ID_SQL_CASE_INSENSITIVE = "SELECT DISTINCT UM_USER" +
".UM_USER_ID FROM UM_USER, UM_USER_ATTRIBUTE WHERE UM_USER_ATTRIBUTE.UM_USER_ID = UM_USER.UM_ID AND " +
"UM_USER_ATTRIBUTE.UM_ATTR_NAME =? AND LOWER(UM_USER_ATTRIBUTE.UM_ATTR_VALUE)=LOWER(?) AND " +
"UM_USER_ATTRIBUTE.UM_PROFILE_ID=? AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND UM_USER.UM_TENANT_ID=?";
public static final String GET_PROP_FOR_PROFILE_SQL_CASE_INSENSITIVE = "SELECT UM_ATTR_VALUE FROM " +
"UM_USER_ATTRIBUTE, UM_USER WHERE UM_USER.UM_ID = UM_USER_ATTRIBUTE.UM_USER_ID AND LOWER(UM_USER" +
".UM_USER_NAME)=LOWER(?) AND UM_ATTR_NAME=? AND UM_PROFILE_ID=? AND UM_USER_ATTRIBUTE.UM_TENANT_ID=? AND " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,14 +195,26 @@ public static Map<String, String> getSQL(Map<String, String> properties) {
properties.put(JDBCRealmConstants.GET_USERS_FOR_PROP,
JDBCRealmConstants.GET_USERS_FOR_PROP_SQL);
}
if (!properties.containsKey(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE)) {
properties.put(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE,
JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_SQL);
}
if (!properties.containsKey(JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID)) {
properties.put(JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID,
JDBCRealmConstants.GET_USERS_FOR_PROP_WITH_ID_SQL);
}
if (!properties.containsKey(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID)) {
properties.put(JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID,
JDBCRealmConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_SQL);
}
if (!properties.containsKey(JDBCCaseInsensitiveConstants.GET_USERS_FOR_PROP_WITH_ID_CASE_INSENSITIVE)) {
properties.put(JDBCCaseInsensitiveConstants.GET_USERS_FOR_PROP_WITH_ID_CASE_INSENSITIVE,
JDBCCaseInsensitiveConstants.GET_USERS_FOR_PROP_WITH_ID_SQL_CASE_INSENSITIVE);
}
if (!properties.containsKey(JDBCCaseInsensitiveConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_CASE_INSENSITIVE)) {
properties.put(JDBCCaseInsensitiveConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_CASE_INSENSITIVE,
JDBCCaseInsensitiveConstants.GET_USERS_FOR_CLAIM_VALUE_WITH_ID_SQL_CASE_INSENSITIVE);
}
if (!properties.containsKey(JDBCRealmConstants.GET_PAGINATED_USERS_FOR_PROP)) {
properties.put(JDBCRealmConstants.GET_PAGINATED_USERS_FOR_PROP,
JDBCRealmConstants.GET_PAGINATED_USERS_FOR_PROP_SQL);
Expand Down

0 comments on commit d62f05f

Please sign in to comment.