use of org.wso2.carbon.apimgt.api.model.policy.Pipeline in project carbon-apimgt by wso2.
the class APIProviderImpl method addPolicy.
/**
* Deploy policy to global CEP and persist the policy object
*
* @param policy policy object
*/
public void addPolicy(Policy policy) throws APIManagementException {
if (policy instanceof APIPolicy) {
APIPolicy apiPolicy = (APIPolicy) policy;
// Check if there's a policy exists before adding the new policy
Policy existingPolicy = getAPIPolicy(userNameWithoutChange, apiPolicy.getPolicyName());
if (existingPolicy != null) {
handleException("Advanced Policy with name " + apiPolicy.getPolicyName() + " already exists");
}
apiPolicy.setUserLevel(PolicyConstants.ACROSS_ALL);
apiPolicy = apiMgtDAO.addAPIPolicy(apiPolicy);
List<Integer> addedConditionGroupIds = new ArrayList<>();
for (Pipeline pipeline : apiPolicy.getPipelines()) {
addedConditionGroupIds.add(pipeline.getId());
}
APIPolicyEvent apiPolicyEvent = new APIPolicyEvent(UUID.randomUUID().toString(), System.currentTimeMillis(), APIConstants.EventType.POLICY_CREATE.name(), tenantId, apiPolicy.getTenantDomain(), apiPolicy.getPolicyId(), apiPolicy.getPolicyName(), apiPolicy.getDefaultQuotaPolicy().getType(), addedConditionGroupIds, null);
APIUtil.sendNotification(apiPolicyEvent, APIConstants.NotifierType.POLICY.name());
} else if (policy instanceof ApplicationPolicy) {
ApplicationPolicy appPolicy = (ApplicationPolicy) policy;
// Check if there's a policy exists before adding the new policy
Policy existingPolicy = getApplicationPolicy(userNameWithoutChange, appPolicy.getPolicyName());
if (existingPolicy != null) {
handleException("Application Policy with name " + appPolicy.getPolicyName() + " already exists");
}
apiMgtDAO.addApplicationPolicy(appPolicy);
// policy id is not set. retrieving policy to get the id.
ApplicationPolicy retrievedPolicy = apiMgtDAO.getApplicationPolicy(appPolicy.getPolicyName(), tenantId);
ApplicationPolicyEvent applicationPolicyEvent = new ApplicationPolicyEvent(UUID.randomUUID().toString(), System.currentTimeMillis(), APIConstants.EventType.POLICY_CREATE.name(), tenantId, appPolicy.getTenantDomain(), retrievedPolicy.getPolicyId(), appPolicy.getPolicyName(), appPolicy.getDefaultQuotaPolicy().getType());
APIUtil.sendNotification(applicationPolicyEvent, APIConstants.NotifierType.POLICY.name());
} else if (policy instanceof SubscriptionPolicy) {
SubscriptionPolicy subPolicy = (SubscriptionPolicy) policy;
// Check if there's a policy exists before adding the new policy
Policy existingPolicy = getSubscriptionPolicy(userNameWithoutChange, subPolicy.getPolicyName());
if (existingPolicy != null) {
handleException("Subscription Policy with name " + subPolicy.getPolicyName() + " already exists");
}
apiMgtDAO.addSubscriptionPolicy(subPolicy);
String monetizationPlan = subPolicy.getMonetizationPlan();
Map<String, String> monetizationPlanProperties = subPolicy.getMonetizationPlanProperties();
if (StringUtils.isNotBlank(monetizationPlan) && MapUtils.isNotEmpty(monetizationPlanProperties)) {
createMonetizationPlan(subPolicy);
}
// policy id is not set. retrieving policy to get the id.
SubscriptionPolicy retrievedPolicy = apiMgtDAO.getSubscriptionPolicy(subPolicy.getPolicyName(), tenantId);
SubscriptionPolicyEvent subscriptionPolicyEvent = new SubscriptionPolicyEvent(UUID.randomUUID().toString(), System.currentTimeMillis(), APIConstants.EventType.POLICY_CREATE.name(), tenantId, subPolicy.getTenantDomain(), retrievedPolicy.getPolicyId(), subPolicy.getPolicyName(), subPolicy.getDefaultQuotaPolicy().getType(), subPolicy.getRateLimitCount(), subPolicy.getRateLimitTimeUnit(), subPolicy.isStopOnQuotaReach(), subPolicy.getGraphQLMaxDepth(), subPolicy.getGraphQLMaxComplexity(), subPolicy.getSubscriberCount());
APIUtil.sendNotification(subscriptionPolicyEvent, APIConstants.NotifierType.POLICY.name());
} else if (policy instanceof GlobalPolicy) {
GlobalPolicy globalPolicy = (GlobalPolicy) policy;
// checking if policy already exist
Policy existingPolicy = getGlobalPolicy(globalPolicy.getPolicyName());
if (existingPolicy != null) {
throw new APIManagementException("Policy name already exists");
}
apiMgtDAO.addGlobalPolicy(globalPolicy);
publishKeyTemplateEvent(globalPolicy.getKeyTemplate(), "add");
GlobalPolicy retrievedPolicy = apiMgtDAO.getGlobalPolicy(globalPolicy.getPolicyName());
GlobalPolicyEvent globalPolicyEvent = new GlobalPolicyEvent(UUID.randomUUID().toString(), System.currentTimeMillis(), APIConstants.EventType.POLICY_CREATE.name(), tenantId, globalPolicy.getTenantDomain(), retrievedPolicy.getPolicyId(), globalPolicy.getPolicyName());
APIUtil.sendNotification(globalPolicyEvent, APIConstants.NotifierType.POLICY.name());
} else {
String msg = "Policy type " + policy.getClass().getName() + " is not supported";
log.error(msg);
throw new UnsupportedPolicyTypeException(msg);
}
}
use of org.wso2.carbon.apimgt.api.model.policy.Pipeline in project carbon-apimgt by wso2.
the class InboundWebSocketProcessor method handleHandshake.
/**
* This method process websocket handshake and extract necessary API information from the channel context and
* request. Finally, hand over the processing to relevant handshake processor for authentication etc.
*
* @param req Handshake request
* @param ctx Channel pipeline context
* @param inboundMessageContext InboundMessageContext
* @return InboundProcessorResponseDTO with handshake processing response
*/
public InboundProcessorResponseDTO handleHandshake(FullHttpRequest req, ChannelHandlerContext ctx, InboundMessageContext inboundMessageContext) {
InboundProcessorResponseDTO inboundProcessorResponseDTO;
try {
HandshakeProcessor handshakeProcessor = new HandshakeProcessor();
setUris(req, inboundMessageContext);
InboundWebsocketProcessorUtil.setTenantDomainToContext(inboundMessageContext);
setMatchingResource(ctx, req, inboundMessageContext);
String userAgent = req.headers().get(HttpHeaders.USER_AGENT);
// '-' is used for empty values to avoid possible errors in DAS side.
// Required headers are stored one by one as validateOAuthHeader()
// removes some headers from the request
userAgent = userAgent != null ? userAgent : "-";
inboundMessageContext.getRequestHeaders().put(HttpHeaders.USER_AGENT, userAgent);
PrivilegedCarbonContext.startTenantFlow();
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(inboundMessageContext.getTenantDomain(), true);
if (validateOAuthHeader(req, inboundMessageContext)) {
setRequestHeaders(req, inboundMessageContext);
inboundMessageContext.getRequestHeaders().put(HttpHeaders.AUTHORIZATION, req.headers().get(HttpHeaders.AUTHORIZATION));
inboundProcessorResponseDTO = handshakeProcessor.processHandshake(inboundMessageContext);
} else {
String errorMessage = "No Authorization Header or access_token query parameter present";
log.error(errorMessage + " in request for the websocket context " + inboundMessageContext.getApiContext());
inboundProcessorResponseDTO = InboundWebsocketProcessorUtil.getHandshakeErrorDTO(WebSocketApiConstants.HandshakeErrorConstants.API_AUTH_ERROR, errorMessage);
}
publishHandshakeAuthErrorEvent(ctx, inboundProcessorResponseDTO.getErrorMessage());
return inboundProcessorResponseDTO;
} catch (APISecurityException e) {
log.error("Authentication Failure for the websocket context: " + inboundMessageContext.getApiContext() + e.getMessage());
inboundProcessorResponseDTO = InboundWebsocketProcessorUtil.getHandshakeErrorDTO(WebSocketApiConstants.HandshakeErrorConstants.API_AUTH_ERROR, e.getMessage());
publishHandshakeAuthErrorEvent(ctx, e.getMessage());
} catch (WebSocketApiException e) {
log.error(e.getMessage());
inboundProcessorResponseDTO = InboundWebsocketProcessorUtil.getHandshakeErrorDTO(WebSocketApiConstants.HandshakeErrorConstants.INTERNAL_SERVER_ERROR, e.getMessage());
} catch (ResourceNotFoundException e) {
log.error(e.getMessage());
inboundProcessorResponseDTO = InboundWebsocketProcessorUtil.getHandshakeErrorDTO(WebSocketApiConstants.HandshakeErrorConstants.RESOURCE_NOT_FOUND_ERROR, e.getMessage());
publishResourceNotFoundEvent(ctx);
}
return inboundProcessorResponseDTO;
}
use of org.wso2.carbon.apimgt.api.model.policy.Pipeline in project carbon-apimgt by wso2.
the class CommonThrottleMappingUtil method fromConditionalGroupDTOToPipeline.
/**
* Converts a single Conditional Group DTO into a Pipeline object
*
* @param dto Conditional Group DTO
* @return Derived Pipeline object from Conditional Group DTO
* @throws UnsupportedThrottleLimitTypeException
* @throws UnsupportedThrottleConditionTypeException
*/
public static Pipeline fromConditionalGroupDTOToPipeline(ConditionalGroupDTO dto) throws UnsupportedThrottleLimitTypeException, UnsupportedThrottleConditionTypeException {
Pipeline pipeline = new Pipeline();
pipeline.setDescription(dto.getDescription());
pipeline.setEnabled(true);
pipeline.setQuotaPolicy(fromDTOToQuotaPolicy(dto.getLimit()));
List<Condition> conditions = fromDTOListToConditionList(dto.getConditions());
pipeline.setConditions(conditions);
return pipeline;
}
use of org.wso2.carbon.apimgt.api.model.policy.Pipeline in project carbon-apimgt by wso2.
the class ThrottlePolicyTemplateBuilder method getPolicyConditionJson.
/**
* Produces final condition inside a pipeline
*
* @param conditions set of conditions
* @return conditions as a JSON
*/
private static JSONObject getPolicyConditionJson(Set<Condition> conditions) {
JSONObject tempCondition = new JSONObject();
for (Condition condition : conditions) {
org.wso2.carbon.apimgt.api.model.policy.Condition mappedCondition = PolicyMappingUtil.mapCondition(condition);
JSONObject conditionJson;
if (tempCondition.containsKey(mappedCondition.getType().toLowerCase(Locale.ENGLISH))) {
conditionJson = (JSONObject) tempCondition.get(mappedCondition.getType().toLowerCase(Locale.ENGLISH));
} else {
conditionJson = new JSONObject();
}
tempCondition.put(mappedCondition.getType().toLowerCase(Locale.ENGLISH), conditionJson);
if (PolicyConstants.IP_SPECIFIC_TYPE.equals(mappedCondition.getType())) {
IPCondition ipCondition = (IPCondition) mappedCondition;
if (IPCondition.isIPv6Address(ipCondition.getSpecificIP())) {
conditionJson.put("specificIp", String.valueOf(APIUtil.ipToBigInteger(ipCondition.getSpecificIP())));
} else {
conditionJson.put("specificIp", ipCondition.ipToLong(ipCondition.getSpecificIP()));
}
} else if (PolicyConstants.IP_RANGE_TYPE.equals(mappedCondition.getType())) {
IPCondition ipRangeCondition = (IPCondition) mappedCondition;
if (IPCondition.isIPv6Address(ipRangeCondition.getStartingIP()) && IPCondition.isIPv6Address(ipRangeCondition.getEndingIP())) {
conditionJson.put("startingIp", String.valueOf(APIUtil.ipToBigInteger(ipRangeCondition.getStartingIP())));
conditionJson.put("endingIp", String.valueOf(APIUtil.ipToBigInteger(ipRangeCondition.getEndingIP())));
} else {
conditionJson.put("startingIp", ipRangeCondition.ipToLong(ipRangeCondition.getStartingIP()));
conditionJson.put("endingIp", ipRangeCondition.ipToLong(ipRangeCondition.getEndingIP()));
}
} else if (mappedCondition instanceof QueryParameterCondition) {
QueryParameterCondition queryParameterCondition = (QueryParameterCondition) mappedCondition;
JSONObject values;
if (conditionJson.containsKey("values")) {
values = (JSONObject) conditionJson.get("values");
} else {
values = new JSONObject();
conditionJson.put("values", values);
}
values.put(queryParameterCondition.getParameter(), queryParameterCondition.getValue());
} else if (mappedCondition instanceof HeaderCondition) {
HeaderCondition headerCondition = (HeaderCondition) mappedCondition;
JSONObject values;
if (conditionJson.containsKey("values")) {
values = (JSONObject) conditionJson.get("values");
} else {
values = new JSONObject();
conditionJson.put("values", values);
}
values.put(headerCondition.getHeaderName(), headerCondition.getValue());
} else if (mappedCondition instanceof JWTClaimsCondition) {
JWTClaimsCondition jwtClaimsCondition = (JWTClaimsCondition) mappedCondition;
JSONObject values;
if (conditionJson.containsKey("values")) {
values = (JSONObject) conditionJson.get("values");
} else {
values = new JSONObject();
conditionJson.put("values", values);
}
values.put(jwtClaimsCondition.getClaimUrl(), jwtClaimsCondition.getAttribute());
}
conditionJson.put("invert", mappedCondition.isInvertCondition());
}
return tempCondition;
}
use of org.wso2.carbon.apimgt.api.model.policy.Pipeline in project carbon-apimgt by wso2.
the class ThrottlePolicyTemplateBuilder method getThrottlePolicyForGlobalLevel.
/**
* Generate policy for global level
*
* @param policy policy with level 'global'. Multiple pipelines are not allowed. Can define more than one condition
* as set of conditions. all these conditions should be passed as a single pipeline
* @return the generated execution plan for the policy
* @throws APITemplateException if failed to generate policy
*/
public String getThrottlePolicyForGlobalLevel(GlobalPolicy policy) throws APITemplateException {
StringWriter writer = new StringWriter();
if (log.isDebugEnabled()) {
log.debug("Generating policy for global level :" + policy.toString());
}
try {
VelocityEngine velocityengine = new VelocityEngine();
APIUtil.initializeVelocityContext(velocityengine);
velocityengine.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, CarbonUtils.getCarbonHome());
velocityengine.init();
Template template = velocityengine.getTemplate(getTemplatePathForGlobal());
VelocityContext context = new VelocityContext();
setConstantContext(context);
context.put("policy", policy);
if (log.isDebugEnabled()) {
log.debug("Policy : " + writer.toString());
}
template.merge(context, writer);
} catch (VelocityException e) {
log.error("Velocity Error", e);
throw new APITemplateException("Velocity Error", e);
}
return writer.toString();
}
Aggregations