blob: abf920851234321a20f08d730ace60ba5602a340 [file] [log] [blame]
/**
* 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.sharedrive;
import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import jcifs.ACE;
import jcifs.smb.NtlmPasswordAuthenticator;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileFilter;
import jcifs.context.SingletonContext;
/** This class contains test code that is useful for performing test operations
using JCifs from the appliance. Basic operations are: addDocument, deleteDocument,
addFolderUser, and deleteFolderUser.
*/
public class SharedDriveHelpers
{
public static final String _rcsid = "@(#)$Id: SharedDriveHelpers.java 988245 2010-08-23 18:39:35Z kwright $";
private NtlmPasswordAuthenticator pa;
private SmbFile smbconnection;
/** Construct the helper and initialize the connection.
*@param serverName is the DNS name of the server.
*@param userName is the name to use to log in.
*@param password is the password.
*/
public SharedDriveHelpers(String serverName, String userName, String password)
throws ManifoldCFException
{
try
{
// make the smb connection to the server
// use NtlmPasswordAuthentication so that we can reuse credential for DFS support
pa = new NtlmPasswordAuthenticator(userName, password);
smbconnection = new SmbFile("smb://" + serverName + "/",SingletonContext.getInstance().withCredentials(pa));
}
catch (MalformedURLException e)
{
throw new ManifoldCFException("Unable to access SMB/CIFS share: "+serverName, e, ManifoldCFException.SETUP_ERROR);
}
}
/** Close the connection.
*/
public void close()
throws ManifoldCFException
{
// Just let stuff go
pa = null;
smbconnection = null;
}
/** See if a document exists.
*@param targetPath is the document's path, beginning with the share name and
* separated by "/" characters.
*@return the target path if the document is found, or "" if it is not.
*/
public String lookupDocument(String targetPath)
throws ManifoldCFException
{
try
{
String identifier = mapToIdentifier(targetPath);
SmbFile file = new SmbFile(identifier,SingletonContext.getInstance().withCredentials(pa));
if (file.exists())
return targetPath;
return "";
}
catch (IOException e)
{
throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
}
}
/** Add a document.
*@param targetPath is the target path, beginning with the share name and separated
* by "/" characters.
*@param sourceFile is the local source file name to copy to the target.
*@return the target path.
*/
public String addDocument(String targetPath, String sourceFile)
throws ManifoldCFException
{
try
{
String identifier = mapToIdentifier(targetPath);
SmbFile file = new SmbFile(identifier,SingletonContext.getInstance().withCredentials(pa));
// Open source file for read
InputStream is = new FileInputStream(sourceFile);
try
{
// Open smbfile for write
if (!file.exists())
{
file.createNewFile();
file = new SmbFile(identifier,SingletonContext.getInstance().withCredentials(pa));
}
OutputStream os = file.getOutputStream();
try
{
byte[] bytes = new byte[65536];
while (true)
{
int amt = is.read(bytes,0,bytes.length);
if (amt == -1)
break;
if (amt > 0)
os.write(bytes,0,amt);
}
}
finally
{
os.close();
}
}
finally
{
is.close();
}
return targetPath;
}
catch (IOException e)
{
throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
}
}
/** Delete a document.
*@param targetPath is the file path to delete, beginning with the share name and
* separated by "/" characters.
*/
public void deleteDocument(String targetPath)
throws ManifoldCFException
{
try
{
String identifier = mapToIdentifier(targetPath);
SmbFile file = new SmbFile(identifier,SingletonContext.getInstance().withCredentials(pa));
file.delete();
}
catch (IOException e)
{
throw new ManifoldCFException("IO exception: "+e.getMessage(),e);
}
}
/** Add user ACL to folder.
*@param targetPath is the folder path to add the acl to, beginning with the share
* name and separated by "/" characters.
*@param userName is the user to add.
*/
public void addUserToFolder(String targetPath, String userName)
throws ManifoldCFException
{
// MHL
}
/** Remove user ACL from folder.
*@param targetPath is the folder path to add the acl to, beginning with the share
* name and separated by "/" characters.
*@param userName is the user to remove.
*/
public void removeUserFromFolder(String targetPath, String userName)
throws ManifoldCFException
{
// MHL
}
/** Map a "path" specification to a full identifier.
*/
protected String mapToIdentifier(String path)
throws IOException
{
String smburi = smbconnection.getCanonicalPath();
String uri = smburi + path + "/";
return new SmbFile(uri,SingletonContext.getInstance().withCredentials(pa)).getCanonicalPath();
}
}