blob: 4105522894dccbcf7a69719c365470a9d8d6a39e [file] [log] [blame]
/* $Id: LLSERVER.java 988245 2010-08-23 18:39:35Z kwright $ */
/**
* 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.crawler.connectors.livelink;
import org.apache.manifoldcf.core.interfaces.*;
import org.apache.manifoldcf.core.common.Base64;
import org.apache.manifoldcf.agents.interfaces.*;
import org.apache.manifoldcf.crawler.interfaces.*;
import org.apache.manifoldcf.crawler.system.Logging;
import org.apache.manifoldcf.crawler.system.ManifoldCF;
import java.io.*;
import com.opentext.api.LLSession;
import com.opentext.api.LLValue;
/**
* @author Riccardo, modified extensively by Karl Wright
*
* This class represents information about a particular
* Livelink Server. It also maintains a particular server session.
* NOTE: The original Volant code insisted at a fundamental level that there be only
* one session per JVM. Not sure why they did this, and this is a vile restriction
* if true. I've therefore reworked this class to be able to work in a multi-session
* environment, if possible; the instantiator gets to determine how many there will be.
*/
public class LLSERVER
{
public static final String _rcsid = "@(#)$Id: LLSERVER.java 988245 2010-08-23 18:39:35Z kwright $";
private final boolean useHttp;
private final boolean useSSL;
private final String LLServer;
private final int LLPort;
private final String LLUser;
private final String LLPwd;
private final String httpCgiPath;
private final String httpNtlmDomain;
private final String httpNtlmUser;
private final String httpNtlmPassword;
private final IKeystoreManager keystore;
private LLSession session = null;
private File certFolder = null;
public LLSERVER(boolean useHttp, boolean useSSL, String server, int port, String user, String pwd,
String httpCgiPath, String httpNtlmDomain, String httpNtlmUser, String httpNtlmPassword,
IKeystoreManager keystoreManager)
throws ManifoldCFException
{
this.useHttp = useHttp;
this.useSSL = useSSL;
LLServer = server;
LLPort = port;
LLUser = user;
LLPwd = pwd;
this.httpCgiPath = httpCgiPath;
this.httpNtlmDomain = httpNtlmDomain;
this.httpNtlmUser = httpNtlmUser;
this.httpNtlmPassword = httpNtlmPassword;
this.keystore = keystoreManager;
connect();
}
private void connect()
throws ManifoldCFException
{
try
{
LLValue configuration;
if (useHttp)
{
boolean useNTLM;
String userNameAndDomain;
if (httpNtlmDomain != null)
{
useNTLM = true;
userNameAndDomain = httpNtlmUser + "@" + httpNtlmDomain;
}
else
{
useNTLM = false;
userNameAndDomain = httpNtlmUser;
}
configuration = new LLValue();
configuration.setAssoc();
configuration.add("Encoding","UTF-8");
configuration.add("LivelinkCGI", httpCgiPath);
if (userNameAndDomain != null && userNameAndDomain.length() > 0)
{
configuration.add("HTTPUserName", userNameAndDomain);
configuration.add("HTTPPassword", httpNtlmPassword);
}
if (useNTLM)
configuration.add("EnableNTLM", LLValue.LL_TRUE);
else
configuration.add("EnableNTLM", LLValue.LL_FALSE);
if (useSSL)
{
configuration.add("HTTPS", LLValue.LL_TRUE);
// Create the place to put the certs
createCertFolder();
if (keystore != null)
{
// Now, write the certs themselves
String[] aliases = keystore.getContents();
for (String alias : aliases)
{
java.security.cert.Certificate cert = keystore.getCertificate(alias);
byte[] certData = cert.getEncoded();
File fileName = new File(certFolder,ManifoldCF.safeFileName(alias) + ".cer");
OutputStream fos = new FileOutputStream(fileName);
try
{
Writer osw = new OutputStreamWriter(fos,"utf-8");
try
{
String certBase64 = new Base64().encodeByteArray(certData);
osw.write("-----BEGIN CERTIFICATE-----\n");
int index = 0;
while (true)
{
if (certBase64.length() - index > 64)
{
osw.write(certBase64.substring(index,index+64) + "\n");
index += 64;
}
else
{
osw.write(certBase64.substring(index) + "\n");
break;
}
}
osw.write("-----END CERTIFICATE-----\n");
}
finally
{
osw.flush();
}
}
finally
{
fos.flush();
fos.close();
}
}
}
LLValue rootCACertList = new LLValue();
LLSession.GetCARootCerts(certFolder.toString(),rootCACertList);
configuration.add("CARootCerts", rootCACertList);
}
}
else
configuration = null;
session = new LLSession (this.LLServer, this.LLPort, "", this.LLUser, this.LLPwd, configuration);
}
catch (IOException e)
{
releaseCertFolder();
throw new ManifoldCFException("IO Exception writing cert files: "+e.getMessage(),e);
}
catch (java.security.cert.CertificateEncodingException e)
{
releaseCertFolder();
throw new ManifoldCFException("Bad certificate: "+e.getMessage(),e);
}
catch (ManifoldCFException e)
{
releaseCertFolder();
throw e;
}
catch (Error e)
{
releaseCertFolder();
throw e;
}
catch (RuntimeException e)
{
releaseCertFolder();
throw e;
}
}
/**
* Disconnects
*
*/
public void disconnect()
{
releaseCertFolder();
session = null;
}
/** Create temporary session-bound cert directory.
*/
protected void createCertFolder()
throws ManifoldCFException
{
certFolder = ManifoldCF.createTempDir("llcrt_",".d");
ManifoldCF.addFile(certFolder);
}
/** Release temporary session-bound cert directory.
*/
protected void releaseCertFolder()
{
if (certFolder != null)
{
ManifoldCF.deleteFile(certFolder);
certFolder = null;
}
}
/**
* Returns the server name where the Livelink
* Server has been installed on
*
* @return the server name
*/
public String getHost()
{
if (session != null)
{
return session.getHost();
}
return null;
}
/**
* Returns the port Livelink is listening on
* @return the port number
*/
public int getPort ()
{
if (session != null)
{
return session.getPort();
}
return -1;
}
/**
* Returns the Livelink user currently connected
* to the Livelink Server
* @return the user name
*/
public String getLLUser()
{
return LLUser;
}
/**
* Returns the password of the user currently connected
* to the Livelink Server
* @return the user password
*/
public String getLLPwd()
{
return LLPwd;
}
/**
* Returns the Livelink session
* @return Livelink session
*/
public LLSession getLLSession()
{
return session;
}
/**
* Get the current session errors as a string.
*/
public String getErrors()
{
if (session == null)
return null;
StringBuilder rval = new StringBuilder();
if (session.getStatus() != 0)
rval.append("LAPI status code: ").append(session.getStatus());
if (session.getApiError().length() > 0)
{
if (rval.length() > 0)
rval.append("; ");
rval.append("LAPI error detail: ").append(session.getApiError());
}
if (session.getErrMsg().length() > 0)
{
if (rval.length() > 0)
rval.append("; ");
rval.append("LAPI error message: ").append(session.getErrMsg());
}
if (session.getStatusMessage().length() > 0)
{
if (rval.length() > 0)
rval.append("; ");
rval.append("LAPI status message: ").append(session.getStatusMessage());
}
if (rval.length() > 0)
return rval.toString();
return null;
}
}