/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.apache.manifoldcf.authorities.authorities.nuxeo;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.manifoldcf.authorities.authorities.BaseAuthorityConnector;
import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
import org.apache.manifoldcf.core.interfaces.ConfigParams;
import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
import org.apache.manifoldcf.core.interfaces.IPostParameters;
import org.apache.manifoldcf.core.interfaces.IThreadContext;
import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
import org.apache.manifoldcf.crawler.connectors.nuxeo.NuxeoConfiguration;
import org.nuxeo.client.api.NuxeoClient;
import org.nuxeo.client.api.objects.user.User;
import org.nuxeo.client.internals.spi.NuxeoClientException;
/**
*
* Nuxeo Authority Connector class
*
* @author David Arroyo Escobar <arroyoescobardavid@gmail.com>
*
*/
public class NuxeoAuthorityConnector extends BaseAuthorityConnector {
// Configuration tabs
private static final String CONF_SERVER_TAB_PROPERTY = "NuxeoAuthorityConnector.Server";
// Prefix for nuxeo configuration and specification parameters
private static final String PARAMETER_PREFIX = "nuxeo_";
// Templates
/**
* Javascript to check the configuration parameters
*/
private static final String EDIT_CONFIG_HEADER_FORWARD = "editConfiguration_conf.js";
/**
* Server edit tab template
*/
private static final String EDIT_CONFIG_FORWARD_SERVER = "editConfiguration_conf_server.html";
/**
* Server view tab template
*/
private static final String VIEW_CONFIG_FORWARD = "viewConfiguration_conf.html";
/* Nuxeo instance parameters */
protected String protocol = null;
protected String host = null;
protected String port = null;
protected String path = null;
protected String username = null;
protected String password = null;
protected NuxeoClient nuxeoClient = null;
protected long lastSessionFetch = -1L;
protected static final long timeToRelease = 300000L;
// Constructor
public NuxeoAuthorityConnector() {
super();
}
void setNuxeoClient(NuxeoClient nuxeoClient) {
this.nuxeoClient = nuxeoClient;
}
/** CONNECTION **/
// Makes connection to server
@Override
public void connect(ConfigParams configParams) {
super.connect(configParams);
protocol = params.getParameter(NuxeoConfiguration.Server.PROTOCOL);
host = params.getParameter(NuxeoConfiguration.Server.HOST);
port = params.getParameter(NuxeoConfiguration.Server.PORT);
path = params.getParameter(NuxeoConfiguration.Server.PATH);
username = params.getParameter(NuxeoConfiguration.Server.USERNAME);
password = params.getObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD);
}
@Override
public void disconnect() throws ManifoldCFException {
shutdownNuxeoClient();
protocol = null;
host = null;
port = null;
path = null;
username = null;
password = null;
super.disconnect();
}
/**
* Check the connection
*/
@Override
public String check() throws ManifoldCFException {
shutdownNuxeoClient();
initNuxeoClient();
try {
nuxeoClient.repository().getDocumentRoot();
} catch (NuxeoClientException ex) {
return "Connection failed: "+ex.getMessage();
}
return super.check();
}
/**
* Initialize Nuxeo client using the configured parameters.
*
* @throws ManifoldCFException
*/
private void initNuxeoClient() throws ManifoldCFException {
if (nuxeoClient == null) {
if (StringUtils.isEmpty(protocol)) {
throw new ManifoldCFException(
"Parameter " + NuxeoConfiguration.Server.PROTOCOL + " required but not set");
}
if (StringUtils.isEmpty(host)) {
throw new ManifoldCFException("Parameter " + NuxeoConfiguration.Server.HOST + " required but not set");
}
String url = getUrl();
nuxeoClient = new NuxeoClient(url, username, password);
}
}
/**
* Shut down Nuxeo client
*/
private void shutdownNuxeoClient() {
if (nuxeoClient != null) {
nuxeoClient.shutdown();
nuxeoClient = null;
lastSessionFetch = -1L;
}
}
@Override
public void poll() throws ManifoldCFException {
if (lastSessionFetch == -1L) {
return;
}
long currentTime = System.currentTimeMillis();
if (currentTime > lastSessionFetch + timeToRelease) {
shutdownNuxeoClient();
}
}
/**
* Formatter URL
*
* @throws ManifoldCFException
*/
String getUrl() throws ManifoldCFException {
int portInt;
if (port != null && port.length() > 0) {
try {
portInt = Integer.parseInt(port);
} catch (NumberFormatException formatException) {
throw new ManifoldCFException("Bad number: " + formatException.getMessage(), formatException);
}
} else {
if (protocol.toLowerCase(Locale.ROOT).equals("http")) {
portInt = 80;
} else {
portInt = 443;
}
}
String url = protocol + "://" + host + ":" + portInt + "/" + path;
return url;
}
/**
* @return true if the connector instance is connected.
*/
@Override
public boolean isConnected() {
return nuxeoClient != null;
}
/** VIEW CONFIGURATION **/
@Override
public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out, Locale locale, ConfigParams parameters)
throws ManifoldCFException, IOException {
Map<String, String> paramMap = new HashMap<String, String>();
fillInServerConfigurationMap(paramMap, out, parameters);
Messages.outputResourceWithVelocity(out, locale, VIEW_CONFIG_FORWARD, paramMap, true);
}
private static void fillInServerConfigurationMap(Map<String, String> serverMap, IPasswordMapperActivity mapper,
ConfigParams parameters) {
String nuxeoProtocol = parameters.getParameter(NuxeoConfiguration.Server.PROTOCOL);
String nuxeoHost = parameters.getParameter(NuxeoConfiguration.Server.HOST);
String nuxeoPort = parameters.getParameter(NuxeoConfiguration.Server.PORT);
String nuxeoPath = parameters.getParameter(NuxeoConfiguration.Server.PATH);
String nuxeoUsername = parameters.getParameter(NuxeoConfiguration.Server.USERNAME);
String nuxeoPassword = parameters.getObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD);
if (nuxeoProtocol == null)
nuxeoProtocol = NuxeoConfiguration.Server.PROTOCOL_DEFAULT_VALUE;
if (nuxeoHost == null)
nuxeoHost = NuxeoConfiguration.Server.HOST_DEFAULT_VALUE;
if (nuxeoPort == null)
nuxeoPort = NuxeoConfiguration.Server.PORT_DEFAULT_VALUE;
if (nuxeoPath == null)
nuxeoPath = NuxeoConfiguration.Server.PATH_DEFAULT_VALUE;
if (nuxeoUsername == null)
nuxeoUsername = NuxeoConfiguration.Server.USERNAME_DEFAULT_VALUE;
if (nuxeoPassword == null)
nuxeoPassword = NuxeoConfiguration.Server.PASSWORD_DEFAULT_VALUE;
else
nuxeoPassword = mapper.mapPasswordToKey(nuxeoPassword);
serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PROTOCOL, nuxeoProtocol);
serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.HOST, nuxeoHost);
serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PORT, nuxeoPort);
serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PATH, nuxeoPath);
serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.USERNAME, nuxeoUsername);
serverMap.put(PARAMETER_PREFIX + NuxeoConfiguration.Server.PASSWORD, nuxeoPassword);
}
/** CONFIGURATION CONNECTOR **/
@Override
public void outputConfigurationHeader(IThreadContext threadContext, IHTTPOutput out, Locale locale,
ConfigParams parameters, List<String> tabsArray) throws ManifoldCFException, IOException {
// Server tab
tabsArray.add(Messages.getString(locale, CONF_SERVER_TAB_PROPERTY));
Map<String, String> paramMap = new HashMap<String, String>();
// Fill in the parameters form each tab
fillInServerConfigurationMap(paramMap, out, parameters);
Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_HEADER_FORWARD, paramMap, true);
}
@Override
public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out, Locale locale,
ConfigParams parameters, String tabName) throws ManifoldCFException, IOException {
// Call the Velocity tempaltes for each tab
Map<String, String> paramMap = new HashMap<String, String>();
// Set the tab name
paramMap.put("TabName", tabName);
// Fill in the parameters
fillInServerConfigurationMap(paramMap, out, parameters);
// Server tab
Messages.outputResourceWithVelocity(out, locale, EDIT_CONFIG_FORWARD_SERVER, paramMap, true);
}
@Override
public String processConfigurationPost(IThreadContext thredContext, IPostParameters variableContext,
ConfigParams parameters) {
String nuxeoProtocol = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PROTOCOL);
if (nuxeoProtocol != null)
parameters.setParameter(NuxeoConfiguration.Server.PROTOCOL, nuxeoProtocol);
String nuxeoHost = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.HOST);
if (nuxeoHost != null)
parameters.setParameter(NuxeoConfiguration.Server.HOST, nuxeoHost);
String nuxeoPort = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PORT);
if (nuxeoPort != null)
parameters.setParameter(NuxeoConfiguration.Server.PORT, nuxeoPort);
String nuxeoPath = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PATH);
if (nuxeoPath != null)
parameters.setParameter(NuxeoConfiguration.Server.PATH, nuxeoPath);
String nuxeoUsername = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.USERNAME);
if (nuxeoUsername != null)
parameters.setParameter(NuxeoConfiguration.Server.USERNAME, nuxeoUsername);
String nuxeoPassword = variableContext.getParameter(PARAMETER_PREFIX + NuxeoConfiguration.Server.PASSWORD);
if (nuxeoPassword != null)
parameters.setObfuscatedParameter(NuxeoConfiguration.Server.PASSWORD,
variableContext.mapKeyToPassword(nuxeoPassword));
return null; // It returns null if the configuration has been successful
}
/** AUTHORITY **/
@Override
public AuthorizationResponse getDefaultAuthorizationResponse(String userName) {
return RESPONSE_UNREACHABLE;
}
@Override
public AuthorizationResponse getAuthorizationResponse(String username) throws ManifoldCFException {
initNuxeoClient();
try {
List<String> authorities = getGroupsByUser(username);
if (authorities == null || authorities.isEmpty()) {
return RESPONSE_USERNOTFOUND;
} else {
return new AuthorizationResponse(authorities.toArray(new String[0]), AuthorizationResponse.RESPONSE_OK);
}
} catch (NuxeoClientException e) {
return RESPONSE_UNREACHABLE;
}
}
List<String> getGroupsByUser(String username) {
List<String> authorities = null;
User user = nuxeoClient.getUserManager().fetchUser(username);
if (user != null) {
authorities = user.getGroups();
authorities.add(user.getUserName());
}
return authorities;
}
}