DcerpcHandlepublic abstract class DcerpcHandle extends Object implements DcerpcConstants
Fields Summary |
---|
protected DcerpcBinding | binding | protected int | max_xmit | protected int | max_recv | protected int | state | protected DcerpcSecurityProvider | securityProvider | private static int | call_id |
Methods Summary |
---|
public void | bind()
synchronized (this) {
try {
state = 1;
DcerpcMessage bind = new DcerpcBind(binding, this);
sendrecv(bind);
} catch (IOException ioe) {
state = 0;
throw ioe;
}
}
| public abstract void | close()
| protected abstract void | doReceiveFragment(byte[] buf, boolean isDirect)
| protected abstract void | doSendFragment(byte[] buf, int off, int length, boolean isDirect)
| public static jcifs.dcerpc.DcerpcHandle | getHandle(java.lang.String url, jcifs.smb.NtlmPasswordAuthentication auth)
if (url.startsWith("ncacn_np:")) {
return new DcerpcPipeHandle(url, auth);
}
throw new DcerpcException("DCERPC transport not supported: " + url);
| public java.security.Principal | getPrincipal()
if (this instanceof DcerpcPipeHandle)
return ((DcerpcPipeHandle)this).pipe.getPrincipal();
return null;
| public java.lang.String | getServer()
if (this instanceof DcerpcPipeHandle)
return ((DcerpcPipeHandle)this).pipe.getServer();
return null;
| protected static DcerpcBinding | parseBinding(java.lang.String str)
int state, mark, si;
char[] arr = str.toCharArray();
String proto = null, key = null;
DcerpcBinding binding = null;
state = mark = si = 0;
do {
char ch = arr[si];
switch (state) {
case 0:
if (ch == ':") {
proto = str.substring(mark, si);
mark = si + 1;
state = 1;
}
break;
case 1:
if (ch == '\\") {
mark = si + 1;
break;
}
state = 2;
case 2:
if (ch == '[") {
String server = str.substring(mark, si).trim();
if (server.length() == 0)
server = "127.0.0.1";
binding = new DcerpcBinding(proto, str.substring(mark, si));
mark = si + 1;
state = 5;
}
break;
case 5:
if (ch == '=") {
key = str.substring(mark, si).trim();
mark = si + 1;
} else if (ch == '," || ch == ']") {
String val = str.substring(mark, si).trim();
if (key == null)
key = "endpoint";
binding.setOption(key, val);
key = null;
}
break;
default:
si = arr.length;
}
si++;
} while (si < arr.length);
if (binding == null || binding.endpoint == null)
throw new DcerpcException("Invalid binding URL: " + str);
return binding;
| public void | sendrecv(DcerpcMessage msg)
byte[] stub, frag;
NdrBuffer buf, fbuf;
boolean isLast, isDirect;
DcerpcException de;
if (state == 0) {
bind();
}
isDirect = true;
stub = jcifs.smb.BufferCache.getBuffer();
try {
int off, tot, n;
buf = new NdrBuffer(stub, 0);
msg.flags = DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG;
msg.call_id = call_id++;
msg.encode(buf);
if (securityProvider != null) {
buf.setIndex(0);
securityProvider.wrap(buf);
}
tot = buf.getLength() - 24;
off = 0;
while (off < tot) {
n = tot - off;
if ((24 + n) > max_xmit) {
msg.flags &= ~DCERPC_LAST_FRAG;
n = max_xmit - 24;
} else {
msg.flags |= DCERPC_LAST_FRAG;
isDirect = false;
msg.alloc_hint = n;
}
msg.length = 24 + n;
if (off > 0)
msg.flags &= ~DCERPC_FIRST_FRAG;
if ((msg.flags & (DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG)) != (DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG)) {
buf.start = off;
buf.reset();
msg.encode_header(buf);
buf.enc_ndr_long(msg.alloc_hint);
buf.enc_ndr_short(0); /* context id */
buf.enc_ndr_short(msg.getOpnum());
}
doSendFragment(stub, off, msg.length, isDirect);
off += n;
}
doReceiveFragment(stub, isDirect);
buf.reset();
buf.setIndex(8);
buf.setLength(buf.dec_ndr_short());
if (securityProvider != null)
securityProvider.unwrap(buf);
buf.setIndex(0);
msg.decode_header(buf);
off = 24;
if (msg.ptype == 2 && msg.isFlagSet(DCERPC_LAST_FRAG) == false)
off = msg.length;
frag = null;
fbuf = null;
while (msg.isFlagSet(DCERPC_LAST_FRAG) == false) {
int stub_frag_len;
if (frag == null) {
frag = new byte[max_recv];
fbuf = new NdrBuffer(frag, 0);
}
doReceiveFragment(frag, isDirect);
fbuf.reset();
fbuf.setIndex(8);
fbuf.setLength(fbuf.dec_ndr_short());
if (securityProvider != null)
securityProvider.unwrap(fbuf);
fbuf.reset();
msg.decode_header(fbuf);
stub_frag_len = msg.length - 24;
if ((off + stub_frag_len) > stub.length) {
// shouldn't happen if alloc_hint is correct or greater
byte[] tmp = new byte[off + stub_frag_len];
System.arraycopy(stub, 0, tmp, 0, off);
stub = tmp;
}
System.arraycopy(frag, 24, stub, off, stub_frag_len);
off += stub_frag_len;
}
buf = new NdrBuffer(stub, 0);
msg.decode(buf);
} finally {
jcifs.smb.BufferCache.releaseBuffer(stub);
}
if ((de = msg.getResult()) != null)
throw de;
| public void | setDcerpcSecurityProvider(DcerpcSecurityProvider securityProvider)
this.securityProvider = securityProvider;
| public java.lang.String | toString()
return binding.toString();
|
|