Sat Jul 27 23:59:08 EDT 2002

Todo

Create ResourceBundle with internationalized error messages.

Perhaps it would be more efficient to use a LinkedList to build large
lists of SmbFile objects in listFiles?

Add a default workgroup for finding LMB/DMB in the absence of a master
browser.

Remove javax.servlet build dependancy just before release

Put NEW graphics next to new things in the API documentation.

DONE Do we need to tree connect every share when listing?

DONE Update SmbShell to support NtlmAuthenticator

DONE Re-write NTLM HTTP Authentication document

DONE(added SmbFile constructors. NetworkExplorer can use the
NtlmPasswordAuthentication object provided by IE clients if the
NtlmHttpFilter is used). Allow NtlmPasswordAuthentication objects to be
used when accessing arbitrary SMB resources.

HALFDONE(only READ for now) 64 bit offsets for SMB_COM_READ/WRITE_ANDX

NO(doesn't work) Specify last modified time in SMB_COM_CLOSE

DONE(don't see how it applies to TRANSACT Named Pipes though) Implement
available() for Named Pipes

DONE(Default is now 60416. Above that, the RAP transactions hang. Not
sure why. This is also a little slower than the ~4k value for some
strange reason.) Increase default snd_buf_size.

Implement DFS access.

Speed up delete()?

Implement these other methods?

  getParentFile()
  isAbsolute()
  getAbsolutePath()
  getAbsoluteFile()
  getCanonicalFile()
  createNewFile()
  deleteOnExit()
  list( FilenameFilter )
  listFiles( FilenameFilter )
  setLastModified()
  setReadOnly()
DONE mkdirs()
  listRoots() - doesn't apply really
  createTempFile()

De-reference SmbTransports and SmbSessions that have been inactive for
a configurable amount of time. Also double check to make sure each
SmbTransport thread is exiting after the soTimeout period. If it is not
an SmbCrawler would hang onto that threads stack and chew up huge amounts
of memory.

Create test suite with JUnit.

Use pcap from SamOemChangePassword to implement SmbSession.changePassword().

DONE(fixed getMimeType and the mime.map is now a resource in the jar)
getMimeType() does not appear to work. If I use a custom mime type map,
where should I put it. How are servlet packages supposed to be deployed?

Check Time/Date handling for shares in Hong Kong and Australia. I believe
they are in different timezones/daylight savings.

DONE(now called jcifs.encoding) Add jcifs.smb.client.codepage that
specifies codepage of "ASCII" strings.

DONE(isWorkgroup is gone) Add
SmbFile.getType() method that returns TYPE_WORKGROUP, TYPE_SERVER,
TYPE_SHARE, TYPE_NAMED_PIPE, TYPE_PRINTER, TYPE_FILESYSTEM and get rid
of isWorkgroup().

DONE(Converted to java.net.URL internally) The smb://workgroup
+ ../server combo is broken. There are possibly other exotic URL
combinations that do not work either. Demands study.

DONE Add a "lookup table" to NbtAddress
like InetAddress has to prevent a quick succession of queries for the
same name from going out to the network.

DONE(jcifs.smb.client.enablePlainTextPasswords=false by default)
Implement plain text passwords? If so, make users force it with
jcifs.smb.plainTextPasswords=yes and indicate that this property must
be set with an SmbAuthException message.

DONE(length() returns capacity, getDiskFreeSpace() returns amount of free
disk space) Have SmbFile.length() return the number of bytes allocated
on the disk via TRANS2_QUERY_FS_INFORMATION/SMB_QUERY_FS_VOLUME_INFO for
TYPE_SHARE. TYPE_WORKGROUP, TYPE_SERVER, TYPE_PRINTER, TYPE_NAMED_PIPE,
TYPE_COMM will return 0. Another method will be necessary like capacity()
to calculate the amount of free disk space with something like (length()
/ capacity()) * 100.

DONE(but still need FileFilter or FileNameFilter) Support listFiles,
filename filters ala wildcard expainsion as per the spec?

DONE Currently the default LogWriter OutputStream is System.out. Perhaps that
should be System.err? Generall logging might be trimmed down a little.

Remove PropertiesTree and replace with regular Properties?
Replace jcifs.util.Log with something a little simpler?

MOSTLYDONE(but need to update file attibutes) Add copyTo( SmbFile dest )
method optimized for recursively copying files and directories potentially
across hosts. Might also take advantage of the fact that SMB_COM_COPY
can copy between shares on the same server without going through the
client(this will undoubtedly be *a lot* faster than NT client when
copying many small files BTW).

Unicode, j9, and CodePage Support - Allow Unicode to be *completely*
turned off for use with micro VMs(also check to see if Unicode can be enabled
with j9). Allow an arbitrary encoding to be specified such that a CodePage
may be used to read strings. See Internationalization documents here:
http://java.sun.com/products/jdk/1.2/docs/guide/internat/index.html.

Create an XFileAccessor by extending SmbFile and looking at Thierry's code
(although we both agreed it was not correct, SmbFile should implement
XFile directly).

Add SmbRandomAccessFile; requires writing equivalent Win32 program
to compare. See code from savaJe.

Improve SmbShell. Better yet, create an SmbShell api for writing efficient
browsers that for example return file names as they are returned by the
server rather than storing them in memory and returning them all at once.

Switch to NT status codes.

Write DCE/RPC transactions for opererations such as NETLOGON
authentication for checking arbitrary domain\user and password
creadentials from perhaps a servlet or jsp etc. Netlogon and share
names longer than 13 characters are the two most compelling reasons to
implement this.

DONE(see NtlmHttpFilter and NtlmHttpSession) Also add httpNtlmAuth
SmbToolkit method to negotiate NTLM auth with IE and supporting browsers.

Alter canRead to try and open the file for reading and return false if
ERRbadshare is received? Err, as much as I hate to do this I think it
might be the right thing to do.

Correct for Unicode alignment in Trans2FindFirst2Response from NT with
useUnicode=no bug? This incongruentcey between MS servers and their
support for Unicode is the source of problems (e.g. the way short names
are returned in SMB_COM_TRANS2_FIND_FIRST2 responses from NT with Unicode
on/off. Is this still true?

DONE(No, files are not checked for perfomance reasons but listFiles
is now used to delete directories which is otherwise optimal) Should I
check to see if all files may be removed before recursively removing a
directory and all it's contents? Otherwise it will fail when it hits a
file that it can't delete. Does the current code skip that? Similarly
the current code doesn't check to see if the path points to a directory
and just fails if that is the case indicating the client should traverse
into that node. This will change when listFiles is implemented because the
necessary attributes will be available to make the traversal smarter. New
code is faster if there are more files than directories (actually probably
still faster anyway).

Ensure that setting a property in a PropertiesTree file without a value
will represent a null or empty string properly. Update: As it is, a
property without a value will be null. But this does not provide for a
method to specify an empty string. Perhaps quotes need to be addressed so
that "" can be used to symbolize an emtpy string. Update: I have not seen
a single bug in PropertiesTree so I don't think I should mess with it. If
anything it should be pulled out and replaced with simple Properties; the
client is just not that demanding to warrent the PropertiesTree mechanism.

Provide for testing to see if a file is "locked". Just try to send an
SMB_COM_NT_CREATE_ANDX with share access as FILE_NO_SHARE. This would
be trivial to add a boolen isLocked() method.

Write a CIFS server profileing/testing program or suite of programs that
can determine true capabilities of a server. Low priority and we don't
have enough functionality to really be usefull yet and it's a BIG job.

UPDATE(I'm not seeing any problems now and I have not heard any
complaints) I have seen a few "Timeout waiting for response from server"
when using AuthHandler. I believe I know why this happends but I have
not been able to reproduce the condition. If a *transaction is resent*,
it's writeWireFormat methods are called a *second* time. The Enumeration
interface does not have an initialisation method so I neglected to ensure
that these SMBs can be reencoded more than once. This is probably easy
to fix and I have since added:

  request.hasMore = request.isPrimary = true;

but this may not be enough ...

