jcifs.smb.SmbComTreeConnectAndX Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jcifs-krb5-jdk7 Show documentation
Show all versions of jcifs-krb5-jdk7 Show documentation
JCIFS is an Open Source client library that implements the CIFS/SMB networking protocol in 100% Java
/* jcifs smb client library in Java
* Copyright (C) 2000 "Michael B. Allen"
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package jcifs.smb;
import jcifs.Config;
import java.io.UnsupportedEncodingException;
import jcifs.util.Hexdump;
class SmbComTreeConnectAndX extends AndXServerMessageBlock {
private static final boolean DISABLE_PLAIN_TEXT_PASSWORDS =
Config.getBoolean( "jcifs.smb.client.disablePlainTextPasswords", true );
private SmbSession session;
private boolean disconnectTid = false;
private String service;
private byte[] password;
private int passwordLength;
String path;
/* batchLimits indecies
*
* 0 = SMB_COM_CHECK_DIRECTORY
* 2 = SMB_COM_CREATE_DIRECTORY
* 3 = SMB_COM_DELETE
* 4 = SMB_COM_DELETE_DIRECTORY
* 5 = SMB_COM_OPEN_ANDX
* 6 = SMB_COM_RENAME
* 7 = SMB_COM_TRANSACTION
* 8 = SMB_COM_QUERY_INFORMATION
*/
/* All batch limits are single batch only until further notice
*/
private static byte[] batchLimits = {
1, 1, 1, 1, 1, 1, 1, 1, 0
};
static {
String s;
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.CheckDirectory" )) != null ) {
batchLimits[0] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.CreateDirectory" )) != null ) {
batchLimits[2] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.Delete" )) != null ) {
batchLimits[3] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.DeleteDirectory" )) != null ) {
batchLimits[4] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.OpenAndX" )) != null ) {
batchLimits[5] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.Rename" )) != null ) {
batchLimits[6] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.Transaction" )) != null ) {
batchLimits[7] = Byte.parseByte( s );
}
if(( s = Config.getProperty( "jcifs.smb.client.TreeConnectAndX.QueryInformation" )) != null ) {
batchLimits[8] = Byte.parseByte( s );
}
}
SmbComTreeConnectAndX( SmbSession session, String path,
String service, ServerMessageBlock andx ) {
super( andx );
this.session = session;
this.path = path;
this.service = service;
command = SMB_COM_TREE_CONNECT_ANDX;
}
int getBatchLimit( byte command ) {
int c = (int)( command & 0xFF );
// why isn't this just return batchLimits[c]?
switch( c ) {
case SMB_COM_CHECK_DIRECTORY:
return batchLimits[0];
case SMB_COM_CREATE_DIRECTORY:
return batchLimits[2];
case SMB_COM_DELETE:
return batchLimits[3];
case SMB_COM_DELETE_DIRECTORY:
return batchLimits[4];
case SMB_COM_OPEN_ANDX:
return batchLimits[5];
case SMB_COM_RENAME:
return batchLimits[6];
case SMB_COM_TRANSACTION:
return batchLimits[7];
case SMB_COM_QUERY_INFORMATION:
return batchLimits[8];
}
return 0;
}
int writeParameterWordsWireFormat( byte[] dst, int dstIndex ) {
if( session.transport.server.security == SECURITY_SHARE &&
( session.auth.hashesExternal ||
session.auth.password.length() > 0 )) {
if( session.transport.server.encryptedPasswords ) {
// encrypted
password = session.auth.getAnsiHash( session.transport.server.encryptionKey );
passwordLength = password.length;
} else if( DISABLE_PLAIN_TEXT_PASSWORDS ) {
throw new RuntimeException( "Plain text passwords are disabled" );
} else {
// plain text
password = new byte[(session.auth.password.length() + 1) * 2];
passwordLength = writeString( session.auth.password, password, 0 );
}
} else {
// no password in tree connect
passwordLength = 1;
}
dst[dstIndex++] = disconnectTid ? (byte)0x01 : (byte)0x00;
dst[dstIndex++] = (byte)0x00;
writeInt2( passwordLength, dst, dstIndex );
return 4;
}
int writeBytesWireFormat( byte[] dst, int dstIndex ) {
int start = dstIndex;
if( session.transport.server.security == SECURITY_SHARE &&
( session.auth.hashesExternal ||
session.auth.password.length() > 0 )) {
System.arraycopy( password, 0, dst, dstIndex, passwordLength );
dstIndex += passwordLength;
} else {
// no password in tree connect
dst[dstIndex++] = (byte)0x00;
}
dstIndex += writeString( path, dst, dstIndex );
try {
System.arraycopy( service.getBytes( "ASCII" ), 0, dst, dstIndex, service.length() );
} catch( UnsupportedEncodingException uee ) {
return 0;
}
dstIndex += service.length();
dst[dstIndex++] = (byte)'\0';
return dstIndex - start;
}
int readParameterWordsWireFormat( byte[] buffer, int bufferIndex ) {
return 0;
}
int readBytesWireFormat( byte[] buffer, int bufferIndex ) {
return 0;
}
public String toString() {
String result = new String( "SmbComTreeConnectAndX[" +
super.toString() +
",disconnectTid=" + disconnectTid +
",passwordLength=" + passwordLength +
",password=" + Hexdump.toHexString( password, passwordLength, 0 ) +
",path=" + path +
",service=" + service + "]" );
return result;
}
}