Search in sources :

Example 61 with CharonException

use of org.wso2.charon3.core.exceptions.CharonException in project charon by wso2.

the class UserResourceManager method get.

/*
     * Retrieves a user resource given an unique user id. Mapped to HTTP GET request.
     *
     * @param id          - unique resource id
     * @param usermanager - usermanager instance defined by the external implementor of charon
     * @return SCIM response to be returned.
     */
public SCIMResponse get(String id, UserManager userManager, String attributes, String excludeAttributes) {
    JSONEncoder encoder = null;
    try {
        // obtain the json encoder
        encoder = getEncoder();
        // obtain the schema corresponding to user
        // unless configured returns core-user schema or else returns extended user schema)
        SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getUserResourceSchema();
        // get the URIs of required attributes which must be given a value
        Map<String, Boolean> requiredAttributes = ResourceManagerUtil.getOnlyRequiredAttributesURIs((SCIMResourceTypeSchema) CopyUtil.deepCopy(schema), attributes, excludeAttributes);
        /*API user should pass a usermanager impl to UserResourceEndpoint.
            retrieve the user from the provided UM handler.*/
        User user = ((UserManager) userManager).getUser(id, requiredAttributes);
        // if user not found, return an error in relevant format.
        if (user == null) {
            String error = "User not found in the user store.";
            throw new NotFoundException(error);
        }
        // perform service provider side validation.
        ServerSideValidator.validateRetrievedSCIMObject(user, schema, attributes, excludeAttributes);
        // convert the user into requested format.
        String encodedUser = encoder.encodeSCIMObject(user);
        // if there are any http headers to be added in the response header.
        Map<String, String> responseHeaders = new HashMap<String, String>();
        responseHeaders.put(SCIMConstants.CONTENT_TYPE_HEADER, SCIMConstants.APPLICATION_JSON);
        responseHeaders.put(SCIMConstants.LOCATION_HEADER, getResourceEndpointURL(SCIMConstants.USER_ENDPOINT) + "/" + user.getId());
        return new SCIMResponse(ResponseCodeConstants.CODE_OK, encodedUser, responseHeaders);
    } catch (NotFoundException e) {
        return AbstractResourceManager.encodeSCIMException(e);
    } catch (CharonException e) {
        return AbstractResourceManager.encodeSCIMException(e);
    } catch (BadRequestException e) {
        return AbstractResourceManager.encodeSCIMException(e);
    }
}
Also used : User(org.wso2.charon3.core.objects.User) HashMap(java.util.HashMap) NotFoundException(org.wso2.charon3.core.exceptions.NotFoundException) UserManager(org.wso2.charon3.core.extensions.UserManager) BadRequestException(org.wso2.charon3.core.exceptions.BadRequestException) JSONEncoder(org.wso2.charon3.core.encoder.JSONEncoder) SCIMResourceTypeSchema(org.wso2.charon3.core.schema.SCIMResourceTypeSchema) CharonException(org.wso2.charon3.core.exceptions.CharonException) SCIMResponse(org.wso2.charon3.core.protocol.SCIMResponse)

Example 62 with CharonException

use of org.wso2.charon3.core.exceptions.CharonException in project charon by wso2.

the class AbstractValidator method setDisplayNameInComplexMultiValuedSubAttributes.

/*
     * set the displayname sub attribute in complex type multi valued attribute
     * eg. display name of emails
     *
     * @param multiValuedAttribute
     * @param attributeSchema
     * @throws CharonException
     * @throws BadRequestException
     */
private static void setDisplayNameInComplexMultiValuedSubAttributes(Attribute multiValuedAttribute, AttributeSchema attributeSchema) throws CharonException, BadRequestException {
    List<Attribute> subValuesList = ((MultiValuedAttribute) (multiValuedAttribute)).getAttributeValues();
    for (Attribute subValue : subValuesList) {
        for (AttributeSchema subAttributeSchema : attributeSchema.getSubAttributeSchemas()) {
            if (subAttributeSchema.getName().equals(SCIMConstants.CommonSchemaConstants.VALUE)) {
                if (!subAttributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX) && !subAttributeSchema.getMultiValued()) {
                    // take the value from the value sub attribute and put is as display attribute
                    SimpleAttribute simpleAttribute = null;
                    simpleAttribute = new SimpleAttribute(SCIMConstants.CommonSchemaConstants.DISPLAY, ((SimpleAttribute) (subValue.getSubAttribute(subAttributeSchema.getName()))).getValue());
                    AttributeSchema subSchema = attributeSchema.getSubAttributeSchema(SCIMConstants.CommonSchemaConstants.DISPLAY);
                    simpleAttribute = (SimpleAttribute) DefaultAttributeFactory.createAttribute(subSchema, simpleAttribute);
                    ((ComplexAttribute) (subValue)).setSubAttribute(simpleAttribute);
                } else if (!subAttributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX) && subAttributeSchema.getMultiValued()) {
                    Attribute valueSubAttribute = (MultiValuedAttribute) (subValue.getSubAttribute(subAttributeSchema.getName()));
                    Object displayValue = null;
                    try {
                        displayValue = ((MultiValuedAttribute) (valueSubAttribute)).getAttributePrimitiveValues().get(0);
                    } catch (Exception e) {
                        String error = "Can not set display attribute value without a value attribute value.";
                        throw new BadRequestException(ResponseCodeConstants.INVALID_SYNTAX, error);
                    }
                    // if multiple values are available, get the first value and put it as display name
                    SimpleAttribute simpleAttribute = new SimpleAttribute(SCIMConstants.CommonSchemaConstants.DISPLAY, displayValue);
                    AttributeSchema subSchema = attributeSchema.getSubAttributeSchema(SCIMConstants.CommonSchemaConstants.DISPLAY);
                    simpleAttribute = (SimpleAttribute) DefaultAttributeFactory.createAttribute(subSchema, simpleAttribute);
                    ((ComplexAttribute) (subValue)).setSubAttribute(simpleAttribute);
                }
            }
        }
    }
}
Also used : MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) AbstractAttribute(org.wso2.charon3.core.attributes.AbstractAttribute) Attribute(org.wso2.charon3.core.attributes.Attribute) SimpleAttribute(org.wso2.charon3.core.attributes.SimpleAttribute) SimpleAttribute(org.wso2.charon3.core.attributes.SimpleAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) BadRequestException(org.wso2.charon3.core.exceptions.BadRequestException) AbstractSCIMObject(org.wso2.charon3.core.objects.AbstractSCIMObject) CharonException(org.wso2.charon3.core.exceptions.CharonException) BadRequestException(org.wso2.charon3.core.exceptions.BadRequestException) MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute)

Example 63 with CharonException

use of org.wso2.charon3.core.exceptions.CharonException in project charon by wso2.

the class AbstractValidator method validateReturnedAttributes.

/*
     * This method is to remove any defined and requested attributes and include
     * requested attributes if not they have been removed.
     *
     * @param scimObject
     * @param requestedAttributes
     * @param requestedExcludingAttributes
     */
public static void validateReturnedAttributes(AbstractSCIMObject scimObject, String requestedAttributes, String requestedExcludingAttributes) throws CharonException {
    List<String> requestedAttributesList = null;
    List<String> requestedExcludingAttributesList = null;
    if (requestedAttributes != null) {
        // make a list from the comma separated requestedAttributes
        requestedAttributesList = Arrays.asList(requestedAttributes.split(","));
    }
    if (requestedExcludingAttributes != null) {
        // make a list from the comma separated requestedExcludingAttributes
        requestedExcludingAttributesList = Arrays.asList(requestedExcludingAttributes.split(","));
    }
    Map<String, Attribute> attributeList = scimObject.getAttributeList();
    ArrayList<Attribute> attributeTemporyList = new ArrayList<Attribute>();
    for (Attribute attribute : attributeList.values()) {
        attributeTemporyList.add(attribute);
    }
    for (Attribute attribute : attributeTemporyList) {
        // check for never/request attributes.
        if (attribute.getReturned().equals(SCIMDefinitions.Returned.NEVER)) {
            scimObject.deleteAttribute(attribute.getName());
        }
        // If so return it.
        if (requestedAttributes == null && requestedExcludingAttributes == null) {
            if (attribute.getReturned().equals(SCIMDefinitions.Returned.REQUEST)) {
                scimObject.deleteAttribute(attribute.getName());
            }
        } else {
            // A request should only contains either attributes or exclude attribute params. Not both
            if (requestedAttributes != null) {
                // and add only the requested attributes
                if ((attribute.getReturned().equals(SCIMDefinitions.Returned.DEFAULT) || attribute.getReturned().equals(SCIMDefinitions.Returned.REQUEST)) && (!requestedAttributesList.contains(attribute.getName()) && !isSubAttributeExistsInList(requestedAttributesList, attribute))) {
                    scimObject.deleteAttribute(attribute.getName());
                }
            } else if (requestedExcludingAttributes != null) {
                // removing attributes which has returned as request. This is because no request is made
                if (attribute.getReturned().equals(SCIMDefinitions.Returned.REQUEST)) {
                    scimObject.deleteAttribute(attribute.getName());
                }
                // removed from the default set of attributes
                if ((attribute.getReturned().equals(SCIMDefinitions.Returned.DEFAULT)) && requestedExcludingAttributesList.contains(attribute.getName())) {
                    scimObject.deleteAttribute(attribute.getName());
                }
            }
        }
        // check the same for sub attributes
        if (attribute.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
            if (attribute.getMultiValued()) {
                List<Attribute> valuesList = ((MultiValuedAttribute) attribute).getAttributeValues();
                for (Attribute subAttribute : valuesList) {
                    Map<String, Attribute> valuesSubAttributeList = ((ComplexAttribute) subAttribute).getSubAttributesList();
                    ArrayList<Attribute> valuesSubAttributeTemporyList = new ArrayList<Attribute>();
                    // hence need to traverse on a copy
                    for (Attribute subSimpleAttribute : valuesSubAttributeList.values()) {
                        valuesSubAttributeTemporyList.add(subSimpleAttribute);
                    }
                    for (Attribute subSimpleAttribute : valuesSubAttributeTemporyList) {
                        removeValuesSubAttributeOnReturn(subSimpleAttribute, subAttribute, attribute, requestedAttributes, requestedExcludingAttributes, requestedAttributesList, requestedExcludingAttributesList, scimObject);
                    }
                }
            } else {
                Map<String, Attribute> subAttributeList = ((ComplexAttribute) attribute).getSubAttributesList();
                ArrayList<Attribute> subAttributeTemporyList = new ArrayList<Attribute>();
                for (Attribute subAttribute : subAttributeList.values()) {
                    subAttributeTemporyList.add(subAttribute);
                }
                for (Attribute subAttribute : subAttributeTemporyList) {
                    if (subAttribute.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
                        // this applicable for extension schema only
                        if (subAttribute.getMultiValued()) {
                            List<Attribute> valuesList = ((MultiValuedAttribute) subAttribute).getAttributeValues();
                            for (Attribute subSubValue : valuesList) {
                                Map<String, Attribute> subValuesSubAttributeList = ((ComplexAttribute) subSubValue).getSubAttributesList();
                                ArrayList<Attribute> valuesSubSubAttributeTemporyList = new ArrayList<Attribute>();
                                // hence need to traverse on a copy
                                for (Attribute subSubSimpleAttribute : subValuesSubAttributeList.values()) {
                                    valuesSubSubAttributeTemporyList.add(subSubSimpleAttribute);
                                }
                                for (Attribute subSubSimpleAttribute : valuesSubSubAttributeTemporyList) {
                                    removeValuesSubSubAttributeOnReturn(attribute, subAttribute, subSubValue, subSubSimpleAttribute, requestedAttributes, requestedExcludingAttributes, requestedAttributesList, requestedExcludingAttributesList, scimObject);
                                }
                            }
                        } else {
                            ArrayList<Attribute> subSubAttributeTemporyList = new ArrayList<Attribute>();
                            Map<String, Attribute> subSubAttributeList = ((ComplexAttribute) subAttribute).getSubAttributesList();
                            for (Attribute subSubAttribute : subSubAttributeList.values()) {
                                subSubAttributeTemporyList.add(subSubAttribute);
                            }
                            for (Attribute subSubAttribute : subSubAttributeTemporyList) {
                                removeSubSubAttributesOnReturn(attribute, subAttribute, subSubAttribute, requestedAttributes, requestedExcludingAttributes, requestedAttributesList, requestedExcludingAttributesList, scimObject);
                            }
                        }
                        removeSubAttributesOnReturn(subAttribute, attribute, requestedAttributes, requestedExcludingAttributes, requestedAttributesList, requestedExcludingAttributesList, scimObject);
                    } else {
                        removeSubAttributesOnReturn(subAttribute, attribute, requestedAttributes, requestedExcludingAttributes, requestedAttributesList, requestedExcludingAttributesList, scimObject);
                    }
                }
            }
        }
    }
}
Also used : MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) AbstractAttribute(org.wso2.charon3.core.attributes.AbstractAttribute) Attribute(org.wso2.charon3.core.attributes.Attribute) SimpleAttribute(org.wso2.charon3.core.attributes.SimpleAttribute) ArrayList(java.util.ArrayList) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute)

Example 64 with CharonException

use of org.wso2.charon3.core.exceptions.CharonException in project charon by wso2.

the class AbstractValidator method validateSCIMObjectForRequiredSubAttributes.

/*
     * Validate SCIMObject for required sub attributes given the object and the corresponding schema.
     *
     * @param attribute
     * @param attributeSchema
     * @throws CharonException
     * @throws BadRequestException
     */
private static void validateSCIMObjectForRequiredSubAttributes(AbstractAttribute attribute, AttributeSchema attributeSchema) throws CharonException, BadRequestException {
    if (attribute != null) {
        List<SCIMAttributeSchema> subAttributesSchemaList = ((SCIMAttributeSchema) attributeSchema).getSubAttributeSchemas();
        if (subAttributesSchemaList != null) {
            for (SCIMAttributeSchema subAttributeSchema : subAttributesSchemaList) {
                if (subAttributeSchema.getRequired()) {
                    if (attribute instanceof ComplexAttribute) {
                        if (attribute.getSubAttribute(subAttributeSchema.getName()) == null) {
                            String error = "Required sub attribute: " + subAttributeSchema.getName() + " is missing in the SCIM Attribute: " + attribute.getName();
                            throw new BadRequestException(error, ResponseCodeConstants.INVALID_VALUE);
                        }
                    } else if (attribute instanceof MultiValuedAttribute) {
                        List<Attribute> values = ((MultiValuedAttribute) attribute).getAttributeValues();
                        for (Attribute value : values) {
                            if (value instanceof ComplexAttribute) {
                                if (value.getSubAttribute(subAttributeSchema.getName()) == null) {
                                    String error = "Required sub attribute: " + subAttributeSchema.getName() + ", is missing in the SCIM Attribute: " + attribute.getName();
                                    throw new BadRequestException(error, ResponseCodeConstants.INVALID_VALUE);
                                }
                            }
                        }
                    }
                }
                // Following is only applicable for extension schema validation.
                AbstractAttribute subAttribute = null;
                if (attribute instanceof ComplexAttribute) {
                    subAttribute = (AbstractAttribute) ((ComplexAttribute) attribute).getSubAttribute(subAttributeSchema.getName());
                } else if (attribute instanceof MultiValuedAttribute) {
                    List<Attribute> subAttributeList = ((MultiValuedAttribute) attribute).getAttributeValues();
                    for (Attribute subAttrbte : subAttributeList) {
                        if (subAttrbte.getName().equals(subAttributeSchema.getName())) {
                            subAttribute = (AbstractAttribute) subAttrbte;
                        }
                    }
                }
                List<SCIMAttributeSchema> subSubAttributesSchemaList = ((SCIMAttributeSchema) subAttributeSchema).getSubAttributeSchemas();
                if (subSubAttributesSchemaList != null) {
                    validateSCIMObjectForRequiredSubAttributes(subAttribute, subAttributeSchema);
                }
            }
        }
    }
}
Also used : MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) AbstractAttribute(org.wso2.charon3.core.attributes.AbstractAttribute) Attribute(org.wso2.charon3.core.attributes.Attribute) SimpleAttribute(org.wso2.charon3.core.attributes.SimpleAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) BadRequestException(org.wso2.charon3.core.exceptions.BadRequestException) AbstractAttribute(org.wso2.charon3.core.attributes.AbstractAttribute) ArrayList(java.util.ArrayList) List(java.util.List) MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute)

Example 65 with CharonException

use of org.wso2.charon3.core.exceptions.CharonException in project charon by wso2.

the class AbstractValidator method removeAnyReadOnlySubAttributes.

/*
     * Check for readonlySubAttributes and remove them if they have been modified. - (create method)
     *
     * @param attribute
     * @param attributeSchema
     * @throws CharonException
     */
private static void removeAnyReadOnlySubAttributes(Attribute attribute, AttributeSchema attributeSchema) throws CharonException {
    if (attribute != null) {
        List<SCIMAttributeSchema> subAttributesSchemaList = ((SCIMAttributeSchema) attributeSchema).getSubAttributeSchemas();
        if (subAttributesSchemaList != null && !subAttributesSchemaList.isEmpty()) {
            for (SCIMAttributeSchema subAttributeSchema : subAttributesSchemaList) {
                if (subAttributeSchema.getMutability() == SCIMDefinitions.Mutability.READ_ONLY) {
                    if (attribute instanceof ComplexAttribute) {
                        if (attribute.getSubAttribute(subAttributeSchema.getName()) != null) {
                            String error = "Readonly sub attribute: " + subAttributeSchema.getName() + " is set in the SCIM Attribute: " + attribute.getName() + ". Removing it.";
                            logger.debug(error);
                            ((ComplexAttribute) attribute).removeSubAttribute(subAttributeSchema.getName());
                        }
                    } else if (attribute instanceof MultiValuedAttribute) {
                        List<Attribute> values = ((MultiValuedAttribute) attribute).getAttributeValues();
                        for (Attribute value : values) {
                            if (value instanceof ComplexAttribute) {
                                if (value.getSubAttribute(subAttributeSchema.getName()) != null) {
                                    String error = "Readonly sub attribute: " + subAttributeSchema.getName() + " is set in the SCIM Attribute: " + attribute.getName() + ". Removing it.";
                                    logger.debug(error);
                                    ((ComplexAttribute) value).removeSubAttribute(subAttributeSchema.getName());
                                }
                            }
                        }
                    }
                }
                // Otherwise no complex attribute can complex sub attributes.
                if (subAttributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
                    // check for readonly sub-sub attributes in extension.
                    // get attributes from schema.
                    Map<String, Attribute> subAttributeList = ((ComplexAttribute) attribute).getSubAttributesList();
                    for (Attribute subSubAttribute : subAttributeList.values()) {
                        removeAnyReadOnlySubAttributes(subSubAttribute, subAttributeSchema);
                    }
                }
            }
        }
    }
}
Also used : MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) AbstractAttribute(org.wso2.charon3.core.attributes.AbstractAttribute) Attribute(org.wso2.charon3.core.attributes.Attribute) SimpleAttribute(org.wso2.charon3.core.attributes.SimpleAttribute) ComplexAttribute(org.wso2.charon3.core.attributes.ComplexAttribute) ArrayList(java.util.ArrayList) List(java.util.List) MultiValuedAttribute(org.wso2.charon3.core.attributes.MultiValuedAttribute)

Aggregations

CharonException (org.wso2.charon3.core.exceptions.CharonException)46 BadRequestException (org.wso2.charon3.core.exceptions.BadRequestException)44 SimpleAttribute (org.wso2.charon3.core.attributes.SimpleAttribute)34 ComplexAttribute (org.wso2.charon3.core.attributes.ComplexAttribute)32 SCIMResponse (org.wso2.charon3.core.protocol.SCIMResponse)31 MultiValuedAttribute (org.wso2.charon3.core.attributes.MultiValuedAttribute)28 Attribute (org.wso2.charon3.core.attributes.Attribute)27 HashMap (java.util.HashMap)22 InternalErrorException (org.wso2.charon3.core.exceptions.InternalErrorException)19 SCIMResourceTypeSchema (org.wso2.charon3.core.schema.SCIMResourceTypeSchema)19 NotFoundException (org.wso2.charon3.core.exceptions.NotFoundException)18 AbstractSCIMObject (org.wso2.charon3.core.objects.AbstractSCIMObject)17 JSONEncoder (org.wso2.charon3.core.encoder.JSONEncoder)15 UserManager (org.wso2.charon3.core.extensions.UserManager)15 JSONObject (org.json.JSONObject)14 JSONDecoder (org.wso2.charon3.core.encoder.JSONDecoder)14 NotImplementedException (org.wso2.charon3.core.exceptions.NotImplementedException)14 JSONException (org.json.JSONException)13 User (org.wso2.charon3.core.objects.User)13 ApiOperation (io.swagger.annotations.ApiOperation)12