blob: 2a7e1db986ae5c564265a81ea32f722fb3696a70 [file] [log] [blame]
package de.ids_mannheim.korap.web.filter;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.ext.Provider;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;
import com.sun.jersey.spi.container.ContainerResponseFilter;
import com.sun.jersey.spi.container.ResourceFilter;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.logging.LoggingFeature;
import de.ids_mannheim.korap.authentication.AuthenticationManager;
import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.security.context.TokenContext;
import de.ids_mannheim.korap.user.User;
import de.ids_mannheim.korap.user.UserSettingProcessor;
import de.ids_mannheim.korap.user.Userdata;
import net.minidev.json.JSONArray;
/**
* @author hanl
* @date 13/05/2014
*/
@Component
@Provider
public class PiwikFilter implements ContainerRequestFilter, ResourceFilter {
private WebTarget service;
// private static final String SERVICE = "http://localhost:8888";
private static final String SERVICE = "http://10.0.10.13";
private static Logger jlog = LogManager.getLogger(PiwikFilter.class);
public static boolean ENABLED = false;
private Map<String, String> customVars;
@Autowired
private AuthenticationManager authenticationManager;
public PiwikFilter () {
// controller = BeansFactory.getKustvaktContext()
// .getAuthenticationManager();
ClientConfig clientConfig = new ClientConfig();
if (jlog.isDebugEnabled())
clientConfig.register(LoggingFeature.class);
Client client = ClientBuilder.newClient(clientConfig);
UriBuilder b = UriBuilder.fromUri(SERVICE);
service = client.target(b.build());
this.customVars = new HashMap<>();
}
private void send (ContainerRequest request) {
Random random = new SecureRandom();
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
params.add("idsite", "2");
params.add("rec", "1");
if (!customVars.isEmpty())
params.add("_cvar", translateCustomData());
params.add("cip", request.getHeaderValue("Host"));
params.add("cookie", "false");
params.add("r", String.valueOf(random.nextDouble()));
params.add("action_name", request.getRequestUri().toASCIIString());
Locale l = null;
if (request.getAcceptableLanguages() != null)
l = request.getAcceptableLanguages().get(0);
try {
service.path("piwik/piwik.php")
.queryParam("idsite", "2")
.queryParam("rec", "1")
//todo check for empty container
.queryParam("_cvar", translateCustomData())
.queryParam("cip", request.getHeaderValue("Host"))
.queryParam("cookie", "false")
.queryParam("r", String.valueOf(random.nextDouble()))
.queryParam("action_name",
request.getRequestUri().toASCIIString())
.queryParams(params).accept("text/html")
.header("Host", request.getHeaderValue("Host"))
.header("User-Agent", request.getHeaderValue("User-Agent"))
.acceptLanguage(l).method("GET");
}
catch (Exception e) {
// do nothing if piwik not available!
}
}
private String translateCustomData () {
final Map<String, List<String>> customVariables = new HashMap<String, List<String>>();
int i = 0;
for (final Map.Entry<String, String> entry : this.customVars.entrySet()) {
i++;
final List<String> list = new ArrayList<String>();
list.add(entry.getKey());
list.add(entry.getValue());
customVariables.put(Integer.toString(i), list);
}
final JSONArray json = new JSONArray();
json.add(customVariables);
// remove unnecessary parent square brackets from JSON-string
String jsonString = json.toString().substring(1,
json.toString().length() - 1);
customVars.clear();
return jsonString;
}
@Override
public ContainerRequest filter (ContainerRequest request) {
if (ENABLED) {
try {
TokenContext context = (TokenContext) request
.getUserPrincipal();
if (context.getUsername() != null){
// since this is cached, not very expensive!
User user = authenticationManager.getUser(context.getUsername());
Userdata data = authenticationManager
.getUserData(user, UserSettingProcessor.class);
if ((Boolean) data.get(Attributes.COLLECT_AUDITING_DATA))
customVars.put("username", context.getUsername());
}
}
catch (KustvaktException | UnsupportedOperationException e) {
//do nothing
}
send(request);
}
return request;
}
@Override
public ContainerRequestFilter getRequestFilter () {
return this;
}
@Override
public ContainerResponseFilter getResponseFilter () {
return null;
}
}