/* * Copyright (C) 2005 Alfresco, Inc. * * Licensed under the Mozilla Public License version 1.1 * with a permitted attribution clause. You may obtain a * copy of the License at * * http://www.alfresco.org/legal/license.txt * * 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.alfresco.filesys.smb; /** * PC share class. *
* The PC share class holds the details of a network share, including the required username and * password access control. */ public final class PCShare { // Domain name private String m_domain = null; // Node name string. private String m_nodename = null; // Remote share name string. private String m_shrname = null; // User name access control string. private String m_username = null; // Password access control string. private String m_password = null; // Remote path, relative to the share. private String m_path = null; // File name string. private String m_fname = null; // Primary and secondary protocols to try connection on private int m_primaryProto = Protocol.UseDefault; private int m_secondaryProto = Protocol.UseDefault; // Extended security negotiation flags private int m_extendedSecFlags; /** * Construct an empty PCShare object. */ public PCShare() { } /** * Construct a PCShare using the supplied UNC path. * * @param netpath Network path of the remote server, in UNC format ie. \\node\\share. * @exception InvalidUNCPathException If the network path is invalid. */ public PCShare(String netpath) throws InvalidUNCPathException { setNetworkPath(netpath); // If the user name has not been set, use the guest account if (m_username == null) setUserName("GUEST"); } /** * Construct a PCShare using the specified remote server and access control details. * * @param nname Node name of the remote server. * @param shr Share name on the remote server. * @param uname User name used to access the remote share. * @param pwd Password used to access the remote share. */ public PCShare(String nname, String shr, String uname, String pwd) { setNodeName(nname); setShareName(shr); setUserName(uname); setPassword(pwd); } /** * Build a share relative path using the supplied working directory and file name. * * @param workdir Working directory string, relative to the root of the share. * @param fname File name string. * @return Share relative path string. */ public static String makePath(String workdir, String fname) { // Create a string buffer to build the share relative path StringBuffer pathStr = new StringBuffer(); // Make sure there is a leading '\' on the path string if (!workdir.startsWith("\\")) pathStr.append("\\"); pathStr.append(workdir); // Make sure the path ends with '\' if (pathStr.charAt(pathStr.length() - 1) != '\\') pathStr.append("\\"); // Add the file name to the path string pathStr.append(fname); // Return share relative the path string return pathStr.toString(); } /** * Return the domain for the share. * * @return java.lang.String */ public final String getDomain() { return m_domain; } /** * Determine if extended security flags have been set * * @return boolean */ public final boolean hasExtendedSecurityFlags() { return m_extendedSecFlags != 0 ? true : false; } /** * Return the extended security flags * * @return int */ public final int getExtendedSecurityFlags() { return m_extendedSecFlags; } /** * Get the remote file name string. * * @return Remote file name string. */ public final String getFileName() { return m_fname; } /** * Return the full UNC path for this PC share object. * * @return Path string of the remote share/path/file in UNC format, ie. \\node\share\path\file. */ public final String getNetworkPath() { // Create a string buffer to build up the full network path StringBuffer strBuf = new StringBuffer(128); // Add the node name and share name strBuf.append("\\\\"); strBuf.append(getNodeName()); strBuf.append("\\"); strBuf.append(getShareName()); // Add the path, if there is one if (getPath() != null && getPath().length() > 0) { if (getPath().charAt(0) != '\\') { strBuf.append("\\"); } strBuf.append(getPath()); } // Add the file name if there is one if (getFileName() != null && getFileName().length() > 0) { if (strBuf.charAt(strBuf.length() - 1) != '\\') { strBuf.append("\\"); } strBuf.append(getFileName()); } // Return the network path return strBuf.toString(); } /** * Get the remote node name string. * * @return Node name string. */ public final String getNodeName() { return m_nodename; } /** * Get the remote password required to access the remote share. * * @return Remote password string. */ public final String getPassword() { return m_password; } /** * Get the share relative path string. * * @return Share relative path string. */ public final String getPath() { return m_path != null ? m_path : "\\"; } /** * Return the share relative path for this PC share object. * * @return Path string of the remote share/path/file relative to the share, ie. \path\file. */ public final String getRelativePath() { // Create a string buffer to build up the full network path StringBuffer strBuf = new StringBuffer(128); // Add the path, if there is one if (getPath().length() > 0) { if (getPath().charAt(0) != '\\') { strBuf.append("\\"); } strBuf.append(getPath()); } // Add the file name if there is one if (getFileName().length() > 0) { if (strBuf.charAt(strBuf.length() - 1) != '\\') { strBuf.append("\\"); } strBuf.append(getFileName()); } // Return the network path return strBuf.toString(); } /** * Get the remote share name string. * * @return Remote share name string. */ public final String getShareName() { return m_shrname; } /** * Get the remote user name string. * * @return Remote user name string required to access the remote share. */ public final String getUserName() { return m_username != null ? m_username : ""; } /** * Get the primary protocol to connect with * * @return int */ public final int getPrimaryProtocol() { return m_primaryProto; } /** * Get the secondary protocol to connect with * * @return int */ public final int getSecondaryProtocol() { return m_secondaryProto; } /** * Determine if the share has a domain specified. * * @return boolean */ public final boolean hasDomain() { return m_domain == null ? false : true; } /** * Set the domain to be used during the session setup. * * @param domain java.lang.String */ public final void setDomain(String domain) { m_domain = domain; if (m_domain != null) m_domain = m_domain.toUpperCase(); } /** * Set the remote file name string. * * @param fn Remote file name string. */ public final void setFileName(String fn) { m_fname = fn; } /** * Set the PC share from the supplied UNC path string. * * @param netpath UNC format remote file path. */ public final void setNetworkPath(String netpath) throws InvalidUNCPathException { // Take a copy of the network path StringBuffer path = new StringBuffer(netpath); for (int i = 0; i < path.length(); i++) { // Convert forward slashes to back slashes if (path.charAt(i) == '/') path.setCharAt(i, '\\'); } String npath = path.toString(); // UNC path starts with '\\' if (!npath.startsWith("\\\\") || npath.length() < 5) throw new InvalidUNCPathException(npath); // Extract the node name from the network path int pos = 2; int endpos = npath.indexOf("\\", pos); if (endpos == -1) throw new InvalidUNCPathException(npath); setNodeName(npath.substring(pos, endpos)); pos = endpos + 1; // Extract the share name from the network path endpos = npath.indexOf("\\", pos); if (endpos == -1) { // Share name is the last part of the UNC path setShareName(npath.substring(pos)); // Set the root path and clear the file name setPath("\\"); setFileName(""); } else { setShareName(npath.substring(pos, endpos)); pos = endpos + 1; // Extract the share relative path from the network path endpos = npath.lastIndexOf("\\"); if (endpos != -1 && endpos > pos) { // Set the share relative path, and update the current position index setPath(npath.substring(pos, endpos)); // File name is the rest of the UNC path setFileName(npath.substring(endpos + 1)); } else { // Set the share relative path to the root path setPath("\\"); // Set the file name string if (npath.length() > pos) setFileName(npath.substring(pos)); else setFileName(""); } } // Check if the share name contains embedded access control pos = m_shrname.indexOf("%"); if (pos != -1) { // Find the end of the user name endpos = m_shrname.indexOf(":", pos); if (endpos != -1) { // Extract the user name and password strings setUserName(m_shrname.substring(pos + 1, endpos)); setPassword(m_shrname.substring(endpos + 1)); } else { // Extract the user name string setUserName(m_shrname.substring(pos + 1)); } // Reset the share name string, to remove the access control setShareName(m_shrname.substring(0, pos)); } // Check if the path has been set, if not then use the root path if (m_path == null || m_path.length() == 0) m_path = "\\"; } /** * Set the extended security negotiation flags * * @param extFlags int */ public final void setExtendedSecurityFlags(int extFlags) { m_extendedSecFlags = extFlags; } /** * Set the remote node name string. * * @param nname Remote node name string. */ public final void setNodeName(String nname) { m_nodename = nname; } /** * Set the remote password string. * * @param pwd Remote password string, required to access the remote share. */ public final void setPassword(String pwd) { m_password = pwd; } /** * Set the share relative path string. * * @param pth Share relative path string. */ public final void setPath(String pth) { m_path = pth; } /** * Set the remote share name string. * * @param shr Remote share name string. */ public final void setShareName(String shr) { m_shrname = shr; } /** * Set the remote user name string. * * @param uname Remote user name string. */ public final void setUserName(String uname) { m_username = uname; } /** * Set the primary and secondary protocol order that is used to connect to the remote host. * * @param pri int * @param sec int */ public final void setProtocolOrder(int pri, int sec) { m_primaryProto = pri; m_secondaryProto = sec; } /** * Return the PCShare object as a string * * @return PCShare string. */ public final String toString() { return getNetworkPath(); } }