/*
* Copyright (c) 2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.claim.mgt;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.CarbonException;
import org.wso2.carbon.claim.mgt.internal.ClaimManagementServiceComponent;
import org.wso2.carbon.core.util.AdminServicesUtil;
import org.wso2.carbon.core.util.AnonymousSessionUtil;
import org.wso2.carbon.user.api.Claim;
import org.wso2.carbon.user.api.ClaimMapping;
import org.wso2.carbon.user.core.UserCoreConstants;
import org.wso2.carbon.user.core.UserRealm;
import org.wso2.carbon.user.core.claim.ClaimManager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public enum ClaimManagerHandler {
INSTANCE;
private static final Log log = LogFactory.getLog(ClaimManagerHandler.class);
// Maintains a single instance of UserStore.
public static ClaimManagerHandler getInstance() {
if (log.isDebugEnabled()) {
log.debug("ClaimManagerHandler singleton instance created successfully");
}
return INSTANCE;
}
/**
* Returns all supported claims.
*
* @return
* @throws ClaimManagementException
*/
public Claim[] getAllSupportedClaims() throws ClaimManagementException {
ClaimManager claimManager;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager != null) {
// There can be cases - we get a request for an external user
// store - where we don'
// have a claims administrator.
ClaimMapping[] mappings = realm.getClaimManager()
.getAllSupportClaimMappingsByDefault();
Claim[] claims = new Claim[mappings.length];
for (ClaimMapping mapping : mappings) {
claims[1] = mapping.getClaim();
}
return claims;
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while loading supported claims", e);
}
return new Claim[0];
}
/**
* @return
* @throws ClaimManagementException
*/
public ClaimMapping[] getAllSupportedClaimMappings() throws ClaimManagementException {
ClaimManager claimManager;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager == null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
return new ClaimMapping[0];
}
return claimManager.getAllSupportClaimMappingsByDefault();
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while loading supported claims", e);
}
}
/**
* @return
* @throws ClaimManagementException
*/
public ClaimMapping[] getAllClaimMappings() throws ClaimManagementException {
ClaimManager claimManager;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager == null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
return new ClaimMapping[0];
}
return claimManager.getAllClaimMappings();
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while loading supported claims", e);
}
}
public ClaimMapping[] getAllClaimMappings(String tenantDomain) throws ClaimManagementException {
ClaimManager claimManager;
try {
UserRealm realm = AnonymousSessionUtil.getRealmByTenantDomain(
ClaimManagementServiceComponent.getRegistryService(),
ClaimManagementServiceComponent.getRealmService(), tenantDomain);
claimManager = realm.getClaimManager();
if (claimManager == null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
return new ClaimMapping[0];
}
return claimManager.getAllClaimMappings();
} catch (org.wso2.carbon.user.api.UserStoreException | CarbonException e) {
throw new ClaimManagementException("Error occurred while loading claims mapping for tenant "
+ tenantDomain, e);
}
}
public ClaimMapping[] getAllClaimMappings(String dialectURI, String tenantDomain)
throws ClaimManagementException {
ClaimManager claimManager;
try {
UserRealm realm = AnonymousSessionUtil.getRealmByTenantDomain(
ClaimManagementServiceComponent.getRegistryService(),
ClaimManagementServiceComponent.getRealmService(), tenantDomain);
claimManager = realm.getClaimManager();
if (claimManager == null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
return new ClaimMapping[0];
}
return claimManager.getAllClaimMappings(dialectURI);
} catch (CarbonException | org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while loading all claim mappings for tenant "
+ tenantDomain, e);
}
}
public ClaimMapping getClaimMapping(String claimURI) throws ClaimManagementException {
ClaimMapping claimMapping = null;
ClaimManager claimManager;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager != null) {
claimMapping = claimManager.getClaimMapping(claimURI);
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while retrieving claim", e);
}
return claimMapping;
}
/**
* @return
* @throws ClaimManagementException
*/
public ClaimMapping[] getAllSupportedClaimMappings(String dialectUri) throws ClaimManagementException {
ClaimManager claimManager;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager == null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
return new ClaimMapping[0];
}
return claimManager.getAllClaimMappings(dialectUri);
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while loading supported claims", e);
}
}
/**
* Returns all supported claims for the given dialect.
*
* @return
* @throws ClaimManagementException
*/
public Claim[] getAllSupportedClaims(String dialectUri) throws ClaimManagementException {
Claim[] claims = new Claim[0];
List<Claim> reqClaims = null;
ClaimManager claimManager = null;
ClaimMapping[] mappings = null;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager == null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
return claims;
}
mappings = claimManager.getAllSupportClaimMappingsByDefault();
reqClaims = new ArrayList<>();
for (ClaimMapping mapping : mappings) {
Claim claim = mapping.getClaim();
if (dialectUri.equals(claim.getDialectURI())) {
reqClaims.add(claim);
}
}
return reqClaims.toArray(new Claim[reqClaims.size()]);
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while loading supported claims from the dialect "
+ dialectUri, e);
}
}
/**
* @param mapping
* @throws ClaimManagementException
*/
public void updateClaimMapping(ClaimMapping mapping) throws ClaimManagementException {
ClaimManager claimManager = null;
try {
UserRealm realm = getRealm();
String primaryDomainName = realm.getRealmConfiguration().getUserStoreProperty(
UserCoreConstants.RealmConfig.PROPERTY_DOMAIN_NAME);
if (primaryDomainName == null) {
if (mapping.getMappedAttribute() == null) {
throw new ClaimManagementException("Attribute name cannot be null for the primary domain");
}
} else if (mapping.getMappedAttribute() == null) {
String attr = mapping.getMappedAttribute(primaryDomainName);
if (attr == null) {
throw new ClaimManagementException("Attribute name cannot be null for the primary domain");
}
mapping.setMappedAttribute(attr);
}
claimManager = realm.getClaimManager();
if (claimManager != null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
claimManager.updateClaimMapping(mapping);
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while updating claim mapping", e);
}
}
/**
* @param mapping
* @throws ClaimManagementException
*/
public void addNewClaimMapping(ClaimMapping mapping) throws ClaimManagementException {
ClaimManager claimManager = null;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager != null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
claimManager.addNewClaimMapping(mapping);
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while adding new claim mapping", e);
}
}
/**
* @param dialectUri
* @param claimUri
* @throws ClaimManagementException
*/
public void removeClaimMapping(String dialectUri, String claimUri) throws ClaimManagementException {
ClaimMapping mapping = null;
Claim claim = null;
ClaimManager claimManager = null;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager != null) {
// There can be cases - we get a request for an external user store - where we don'
// have a claims administrator.
claim = new Claim();
claim.setClaimUri(claimUri);
claim.setDialectURI(dialectUri);
mapping = new ClaimMapping(claim, null);
claimManager.deleteClaimMapping(mapping);
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while removing new claim mapping", e);
}
}
/**
* @param mappings
*/
public void addNewClaimDialect(ClaimDialect mappings) throws ClaimManagementException {
ClaimMapping[] mapping;
ClaimManager claimManager;
claimManager = null;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager != null) {
mapping = mappings.getClaimMapping();
for (ClaimMapping aMapping : mapping) {
claimManager.addNewClaimMapping(aMapping);
}
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while removing new claim mapping", e);
}
}
/**
* @param dialectUri
* @throws ClaimManagementException
*/
public void removeClaimDialect(String dialectUri) throws ClaimManagementException {
ClaimMapping[] mapping;
ClaimManager claimManager;
try {
UserRealm realm = getRealm();
claimManager = realm.getClaimManager();
if (claimManager != null) {
mapping = claimManager.getAllClaimMappings(dialectUri);
if (mapping != null) {
for (ClaimMapping aMapping : mapping) {
claimManager.deleteClaimMapping(aMapping);
}
}
}
} catch (org.wso2.carbon.user.api.UserStoreException e) {
throw new ClaimManagementException("Error occurred while removing new claim dialect", e);
}
}
private UserRealm getRealm() throws ClaimManagementException {
try {
return AdminServicesUtil.getUserRealm();
} catch (CarbonException e) {
throw new ClaimManagementException("Error while trying get User Realm.", e);
}
}
public Set<org.wso2.carbon.claim.mgt.ClaimMapping> getMappingsFromCarbonDialectToOther(
String otherDialectURI, Set<String> carbonClaimURIs, String tenantDomain)
throws ClaimManagementException {
Set<org.wso2.carbon.claim.mgt.ClaimMapping> returnSet = new HashSet<>();
if (UserCoreConstants.DEFAULT_CARBON_DIALECT.equals(otherDialectURI)) {
for (String claimURI : carbonClaimURIs) {
org.wso2.carbon.claim.mgt.ClaimMapping claimMapping = new org.wso2.carbon.claim.mgt.ClaimMapping(
otherDialectURI, claimURI, claimURI);
returnSet.add(claimMapping);
}
return returnSet;
}
ClaimMapping[] claimMappingsInOtherDialect = getAllClaimMappings(otherDialectURI,
tenantDomain);
ClaimMapping[] allClaimMappingsInCarbonDialect = getAllClaimMappings(
UserCoreConstants.DEFAULT_CARBON_DIALECT, tenantDomain);
if (otherDialectURI == null) {
String message = "Invalid argument: \'otherDialectURI\' is \'NULL\'";
log.error(message);
throw new ClaimManagementException(message);
}
if (carbonClaimURIs == null || carbonClaimURIs.isEmpty()) {
String message = "Invalid argument: \'carbonClaimURIs\' is \'NULL\' or of zero length";
log.error(message);
throw new ClaimManagementException(message);
}
for (String requestedClaimURI : carbonClaimURIs) {
if (allClaimMappingsInCarbonDialect != null
&& allClaimMappingsInCarbonDialect.length > 0) {
for (ClaimMapping claimMapping : allClaimMappingsInCarbonDialect) {
if (requestedClaimURI.equals(claimMapping.getClaim().getClaimUri())) {
String mappedAttr = claimMapping.getMappedAttribute();
for (ClaimMapping carbonClaimMapping : claimMappingsInOtherDialect) {
if (mappedAttr.equals(carbonClaimMapping.getMappedAttribute())) {
returnSet.add(new org.wso2.carbon.claim.mgt.ClaimMapping(
otherDialectURI, requestedClaimURI, carbonClaimMapping
.getClaim().getClaimUri()));
}
}
}
}
}
}
return returnSet;
}
public Map<String, String> getMappingsMapFromCarbonDialectToOther(String otherDialectURI,
Set<String> carbonClaimURIs, String
tenantDomain) throws ClaimManagementException {
Map<String, String> returnMap = new HashMap<>();
Set<org.wso2.carbon.claim.mgt.ClaimMapping> mappings = getMappingsFromCarbonDialectToOther(
otherDialectURI, carbonClaimURIs, tenantDomain);
for (org.wso2.carbon.claim.mgt.ClaimMapping mapping : mappings) {
returnMap.put(mapping.getCarbonClaimURI(), mapping.getNonCarbonClaimURI());
}
return returnMap;
}
/**
* @param otherDialectURI
* @param otherClaimURIs
* @param tenantDomain
* @return
* @throws ClaimManagementException
*/
public Set<org.wso2.carbon.claim.mgt.ClaimMapping> getMappingsFromOtherDialectToCarbon(
String otherDialectURI, Set<String> otherClaimURIs, String tenantDomain)
throws ClaimManagementException {
Set<org.wso2.carbon.claim.mgt.ClaimMapping> returnSet = new HashSet<org.wso2.carbon.claim.mgt.ClaimMapping>();
if (otherDialectURI == null) {
String message = "Invalid argument: \'otherDialectURI\' is \'NULL\'";
log.error(message);
throw new ClaimManagementException(message);
}
if (otherDialectURI.equals(UserCoreConstants.DEFAULT_CARBON_DIALECT) && otherClaimURIs != null) {
validateClaims(otherClaimURIs);
for (String claimURI : otherClaimURIs) {
org.wso2.carbon.claim.mgt.ClaimMapping claimMapping = new org.wso2.carbon.claim.mgt.ClaimMapping(
otherDialectURI, claimURI, claimURI);
returnSet.add(claimMapping);
}
return returnSet;
}
ClaimMapping[] allClaimMappingsInOtherDialect = getAllClaimMappings(otherDialectURI,
tenantDomain);
ClaimMapping[] allClaimMappingsInCarbonDialect = getAllClaimMappings(
UserCoreConstants.DEFAULT_CARBON_DIALECT, tenantDomain);
if (otherClaimURIs == null || otherClaimURIs.isEmpty()) {
for (ClaimMapping claimMapping : allClaimMappingsInOtherDialect) {
String mappedAttr = claimMapping.getMappedAttribute();
for (ClaimMapping carbonClaimMapping : allClaimMappingsInCarbonDialect) {
if (mappedAttr.equals(carbonClaimMapping.getMappedAttribute())) {
returnSet.add(new org.wso2.carbon.claim.mgt.ClaimMapping(otherDialectURI,
claimMapping.getClaim().getClaimUri(), carbonClaimMapping
.getClaim().getClaimUri()));
break;
}
}
}
} else {
for (String requestedClaimURI : otherClaimURIs) {
if (allClaimMappingsInOtherDialect != null
&& allClaimMappingsInOtherDialect.length > 0) {
for (ClaimMapping claimMapping : allClaimMappingsInOtherDialect) {
if (requestedClaimURI.equals(claimMapping.getClaim().getClaimUri())) {
String mappedAttr = claimMapping.getMappedAttribute();
for (ClaimMapping carbonClaimMapping : allClaimMappingsInCarbonDialect) {
if (mappedAttr.equals(carbonClaimMapping.getMappedAttribute())) {
returnSet.add(new org.wso2.carbon.claim.mgt.ClaimMapping(
otherDialectURI, requestedClaimURI, carbonClaimMapping
.getClaim().getClaimUri()));
break;
}
}
}
}
}
}
}
return returnSet;
}
/**
* @param otherDialectURI
* @param otherClaimURIs
* @param tenantDomain
* @return
* @throws Exception
*/
public Map<String, String> getMappingsMapFromOtherDialectToCarbon(String otherDialectURI,
Set<String> otherClaimURIs, String
tenantDomain) throws ClaimManagementException {
return getMappingsMapFromOtherDialectToCarbon(otherDialectURI, otherClaimURIs,
tenantDomain, false);
}
/**
* @param otherDialectURI
* @param otherClaimURIs
* @param tenantDomain
* @param useCarbonDialectAsKey
* @return
* @throws ClaimManagementException
*/
public Map<String, String> getMappingsMapFromOtherDialectToCarbon(String otherDialectURI,
Set<String> otherClaimURIs, String
tenantDomain, boolean useCarbonDialectAsKey)
throws ClaimManagementException {
Map<String, String> returnMap = new HashMap<>();
Set<org.wso2.carbon.claim.mgt.ClaimMapping> mappings = getMappingsFromOtherDialectToCarbon(
otherDialectURI, otherClaimURIs, tenantDomain);
for (org.wso2.carbon.claim.mgt.ClaimMapping mapping : mappings) {
if (useCarbonDialectAsKey) {
returnMap.put(mapping.getCarbonClaimURI(), mapping.getNonCarbonClaimURI());
} else {
returnMap.put(mapping.getNonCarbonClaimURI(), mapping.getCarbonClaimURI());
}
}
return returnMap;
}
/**
* @param tenantDomain
* @return
* @throws ClaimManagementException
*/
public Set<String> getAllClaimDialects(String tenantDomain) throws ClaimManagementException {
Set<String> dialects = new HashSet<>();
List<ClaimMapping> claimMappings = new ArrayList<>(
Arrays.asList(getAllClaimMappings(tenantDomain)));
if (claimMappings.isEmpty()) {
return new HashSet<>();
}
for (ClaimMapping claimMapping : claimMappings) {
String dialectUri = claimMapping.getClaim().getDialectURI();
dialects.add(dialectUri);
}
return dialects;
}
public boolean isKnownClaimDialect(String dialectURI, String tenantDomain) throws ClaimManagementException {
if (StringUtils.isEmpty(dialectURI)) {
String message = "Invalid argument : " + "\'dialectURI\' is \'NULL\' or empty";
throw new IllegalArgumentException(message);
}
return getAllClaimDialects(tenantDomain).contains(dialectURI);
}
/*
* validate input claims are belongs to wso2 default claim dialect. Check only the first attribute and assume other
* are also same as first attribute
*/
private Set<String> validateClaims(Set<String> attributeKeys) {
if (attributeKeys != null && !attributeKeys.isEmpty()) {
String claimURI = (String) new ArrayList(attributeKeys).get(0);
if (!claimURI.startsWith(UserCoreConstants.DEFAULT_CARBON_DIALECT)) {
return new HashSet<String>();
}
}
return attributeKeys;
}
}