Skip to content

Commit

Permalink
[KEYCLOAK-3135] - Rules UI Tests
Browse files Browse the repository at this point in the history
  • Loading branch information
pedroigor committed Apr 25, 2017
1 parent 4b01c8e commit b3131bf
Show file tree
Hide file tree
Showing 24 changed files with 964 additions and 51 deletions.
Expand Up @@ -23,9 +23,7 @@
import org.keycloak.Config; import org.keycloak.Config;
import org.keycloak.authorization.AuthorizationProvider; import org.keycloak.authorization.AuthorizationProvider;
import org.keycloak.authorization.model.Policy; import org.keycloak.authorization.model.Policy;
import org.keycloak.authorization.model.ResourceServer;
import org.keycloak.authorization.policy.provider.PolicyProvider; import org.keycloak.authorization.policy.provider.PolicyProvider;
import org.keycloak.authorization.policy.provider.PolicyProviderAdminService;
import org.keycloak.authorization.policy.provider.PolicyProviderFactory; import org.keycloak.authorization.policy.provider.PolicyProviderFactory;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.models.KeycloakSessionFactory;
Expand Down Expand Up @@ -74,6 +72,16 @@ public void onImport(Policy policy, PolicyRepresentation representation, Authori
verifyCircularReference(policy, new ArrayList<>()); verifyCircularReference(policy, new ArrayList<>());
} }


@Override
public AggregatePolicyRepresentation toRepresentation(Policy policy, AggregatePolicyRepresentation representation) {
return representation;
}

@Override
public Class<AggregatePolicyRepresentation> getRepresentationType() {
return AggregatePolicyRepresentation.class;
}

private void verifyCircularReference(Policy policy, List<String> ids) { private void verifyCircularReference(Policy policy, List<String> ids) {
if (!policy.getType().equals("aggregate")) { if (!policy.getType().equals("aggregate")) {
return; return;
Expand Down
Expand Up @@ -17,13 +17,14 @@
package org.keycloak.authorization.policy.provider.drools; package org.keycloak.authorization.policy.provider.drools;


import org.keycloak.authorization.policy.provider.PolicyProviderAdminService; import org.keycloak.authorization.policy.provider.PolicyProviderAdminService;
import org.keycloak.representations.idm.authorization.PolicyRepresentation; import org.keycloak.representations.idm.authorization.RulePolicyRepresentation;
import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieContainer;


import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;


/** /**
Expand All @@ -39,24 +40,24 @@ public DroolsPolicyAdminResource(DroolsPolicyProviderFactory factory) {


@Path("/resolveModules") @Path("/resolveModules")
@POST @POST
@Consumes("application/json") @Consumes(MediaType.APPLICATION_JSON)
@Produces("application/json") @Produces("application/json")
public Response resolveModules(PolicyRepresentation policy) { public Response resolveModules(RulePolicyRepresentation policy) {
return Response.ok(getContainer(policy).getKieBaseNames()).build(); return Response.ok(getContainer(policy).getKieBaseNames()).build();
} }


@Path("/resolveSessions") @Path("/resolveSessions")
@POST @POST
@Consumes("application/json") @Consumes(MediaType.APPLICATION_JSON)
@Produces("application/json") @Produces(MediaType.APPLICATION_JSON)
public Response resolveSessions(PolicyRepresentation policy) { public Response resolveSessions(RulePolicyRepresentation policy) {
return Response.ok(getContainer(policy).getKieSessionNamesInKieBase(policy.getConfig().get("moduleName"))).build(); return Response.ok(getContainer(policy).getKieSessionNamesInKieBase(policy.getModuleName())).build();
} }


private KieContainer getContainer(PolicyRepresentation policy) { private KieContainer getContainer(RulePolicyRepresentation policy) {
String groupId = policy.getConfig().get("mavenArtifactGroupId"); String groupId = policy.getArtifactGroupId();
String artifactId = policy.getConfig().get("mavenArtifactId"); String artifactId = policy.getArtifactId();
String version = policy.getConfig().get("mavenArtifactVersion"); String version = policy.getArtifactVersion();
return this.factory.getKieContainer(groupId, artifactId, version); return this.factory.getKieContainer(groupId, artifactId, version);
} }
} }
Expand Up @@ -13,16 +13,16 @@
import org.keycloak.authorization.policy.provider.PolicyProviderFactory; import org.keycloak.authorization.policy.provider.PolicyProviderFactory;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.representations.idm.authorization.AbstractPolicyRepresentation;
import org.keycloak.representations.idm.authorization.PolicyRepresentation; import org.keycloak.representations.idm.authorization.PolicyRepresentation;
import org.keycloak.representations.idm.authorization.RulePolicyRepresentation;
import org.kie.api.KieServices; import org.kie.api.KieServices;
import org.kie.api.KieServices.Factory; import org.kie.api.KieServices.Factory;
import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieContainer;


/** /**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a> * @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
*/ */
public class DroolsPolicyProviderFactory implements PolicyProviderFactory { public class DroolsPolicyProviderFactory implements PolicyProviderFactory<RulePolicyRepresentation> {


private KieServices ks; private KieServices ks;
private final Map<String, DroolsPolicy> containers = Collections.synchronizedMap(new HashMap<>()); private final Map<String, DroolsPolicy> containers = Collections.synchronizedMap(new HashMap<>());
Expand Down Expand Up @@ -61,12 +61,14 @@ public PolicyProvider create(KeycloakSession session) {
} }


@Override @Override
public void onCreate(Policy policy, AbstractPolicyRepresentation representation, AuthorizationProvider authorization) { public void onCreate(Policy policy, RulePolicyRepresentation representation, AuthorizationProvider authorization) {
updateConfig(policy, representation);
update(policy); update(policy);
} }


@Override @Override
public void onUpdate(Policy policy, AbstractPolicyRepresentation representation, AuthorizationProvider authorization) { public void onUpdate(Policy policy, RulePolicyRepresentation representation, AuthorizationProvider authorization) {
updateConfig(policy, representation);
update(policy); update(policy);
} }


Expand All @@ -80,6 +82,23 @@ public void onRemove(Policy policy, AuthorizationProvider authorization) {
remove(policy); remove(policy);
} }


@Override
public RulePolicyRepresentation toRepresentation(Policy policy, RulePolicyRepresentation representation) {
representation.setArtifactGroupId(policy.getConfig().get("mavenArtifactGroupId"));
representation.setArtifactId(policy.getConfig().get("mavenArtifactId"));
representation.setArtifactVersion(policy.getConfig().get("mavenArtifactVersion"));
representation.setScannerPeriod(policy.getConfig().get("scannerPeriod"));
representation.setScannerPeriodUnit(policy.getConfig().get("scannerPeriodUnit"));
representation.setSessionName(policy.getConfig().get("sessionName"));
representation.setModuleName(policy.getConfig().get("moduleName"));
return representation;
}

@Override
public Class<RulePolicyRepresentation> getRepresentationType() {
return RulePolicyRepresentation.class;
}

@Override @Override
public void init(Config.Scope config) { public void init(Config.Scope config) {
this.ks = Factory.get(); this.ks = Factory.get();
Expand All @@ -100,6 +119,20 @@ public String getId() {
return "rules"; return "rules";
} }


private void updateConfig(Policy policy, RulePolicyRepresentation representation) {
Map<String, String> config = policy.getConfig();

config.put("mavenArtifactGroupId", representation.getArtifactGroupId());
config.put("mavenArtifactId", representation.getArtifactId());
config.put("mavenArtifactVersion", representation.getArtifactVersion());
config.put("scannerPeriod", representation.getScannerPeriod());
config.put("scannerPeriodUnit", representation.getScannerPeriodUnit());
config.put("sessionName", representation.getSessionName());
config.put("moduleName", representation.getModuleName());

policy.setConfig(config);
}

void update(Policy policy) { void update(Policy policy) {
remove(policy); remove(policy);
this.containers.put(policy.getId(), new DroolsPolicy(this.ks, policy)); this.containers.put(policy.getId(), new DroolsPolicy(this.ks, policy));
Expand Down
@@ -0,0 +1,92 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed 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.keycloak.representations.idm.authorization;

/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
*/
public class RulePolicyRepresentation extends AbstractPolicyRepresentation {

private String artifactGroupId;
private String artifactId;
private String artifactVersion;
private String moduleName;
private String sessionName;
private String scannerPeriod;
private String scannerPeriodUnit;

@Override
public String getType() {
return "rules";
}

public String getArtifactGroupId() {
return artifactGroupId;
}

public void setArtifactGroupId(String artifactGroupId) {
this.artifactGroupId = artifactGroupId;
}

public String getArtifactId() {
return artifactId;
}

public void setArtifactId(String artifactId) {
this.artifactId = artifactId;
}

public String getArtifactVersion() {
return artifactVersion;
}

public void setArtifactVersion(String artifactVersion) {
this.artifactVersion = artifactVersion;
}

public String getModuleName() {
return moduleName;
}

public void setModuleName(String moduleName) {
this.moduleName = moduleName;
}

public String getSessionName() {
return sessionName;
}

public void setSessionName(String sessionName) {
this.sessionName = sessionName;
}

public String getScannerPeriod() {
return scannerPeriod;
}

public void setScannerPeriod(String scannerPeriod) {
this.scannerPeriod = scannerPeriod;
}

public String getScannerPeriodUnit() {
return scannerPeriodUnit;
}

public void setScannerPeriodUnit(String scannerPeriodUnit) {
this.scannerPeriodUnit = scannerPeriodUnit;
}
}
@@ -0,0 +1,50 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed 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.keycloak.admin.client.resource;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.jboss.resteasy.annotations.cache.NoCache;
import org.keycloak.representations.idm.authorization.AggregatePolicyRepresentation;

/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
*/
public interface AggregatePoliciesResource {

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
Response create(AggregatePolicyRepresentation representation);

@Path("{id}")
AggregatePolicyResource findById(@PathParam("id") String id);

@Path("/search")
@GET
@Produces(MediaType.APPLICATION_JSON)
@NoCache
AggregatePolicyRepresentation findByName(@QueryParam("name") String name);
}
@@ -0,0 +1,69 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed 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.keycloak.admin.client.resource;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.jboss.resteasy.annotations.cache.NoCache;
import org.keycloak.representations.idm.authorization.AggregatePolicyRepresentation;
import org.keycloak.representations.idm.authorization.PolicyRepresentation;
import org.keycloak.representations.idm.authorization.ResourceRepresentation;

/**
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
*/
public interface AggregatePolicyResource {

@GET
@Produces(MediaType.APPLICATION_JSON)
@NoCache
AggregatePolicyRepresentation toRepresentation();

@PUT
@Consumes(MediaType.APPLICATION_JSON)
void update(AggregatePolicyRepresentation representation);

@DELETE
void remove();

@Path("/associatedPolicies")
@GET
@Produces(MediaType.APPLICATION_JSON)
@NoCache
List<PolicyRepresentation> associatedPolicies();

@Path("/dependentPolicies")
@GET
@Produces(MediaType.APPLICATION_JSON)
@NoCache
List<PolicyRepresentation> dependentPolicies();

@Path("/resources")
@GET
@Produces("application/json")
@NoCache
List<ResourceRepresentation> resources();

}
Expand Up @@ -80,4 +80,10 @@ public interface PoliciesResource {


@Path("time") @Path("time")
TimePoliciesResource time(); TimePoliciesResource time();

@Path("aggregate")
AggregatePoliciesResource aggregate();

@Path("rules")
RulePoliciesResource rule();
} }

0 comments on commit b3131bf

Please sign in to comment.