Previous Next Up FAQ Table of Contents

3.3 New Features

Customers using earlier versions of VolanoChat and VolanoChatPro should upgrade to the latest release. The installation process does not update the previous version—it installs into a new directory by default. Be sure to retain the customized property files from your previous installation.

26 October 2004 - Version 2.6.4

Support for Java 2 Standard Edition (J2SE) 5.0

Added a work-around for Sun Bug ID 5003402, "REGRESSION: java.awt.TextArea stops scrolling when it loses the keyboard focus." The bug is present in J2SE 5.0 and prevented the applet from autoscrolling when chat messages are displayed in the chat room window. The work-around solves the problem even with the bug present. The fix from Sun will be included in a future release of Java.

You need this update if you have visitors who have upgraded their Sun Java Plug-in from version 1.3 or 1.4 to version 5.0. J2SE 5.0 was released on September 30, 2004, but as of October 26 is not yet posted to the main Java Technology Web site.

Dynamic text-based ads or announcements

Allows the dynamic loading of the applet's lower text label and its corresponding link as Java properties returned from a URL service. The URL and the names of the properties it returns are defined by the following applet properties:

label.url
the URL which returns the Java properties when invoked.
label.url.text
the name of the property returned whose value is the text to display.
label.url.link
the name of the property returned whose value is the URL to which the text is linked.

For example, in our demonstration VolanoChat server, we define the following advertisement service:

label.url=http://.../proxy?src=http://inline.antarasystems.com/jp.php?aid=volano
label.url.text=label.1.text
label.url.link=label.1.link

which uses the Volano ProxyServlet to pull text-based ads from a remote server. The remote ad server returns an HTTP response like the following:

label.1.text=Great Deals At Dell
label.1.link=http://64.106.252.70:80/j?sid=3QDZAte9QwLsGRuZ
label.2.text=Up to $500 off at Dell
label.2.link=http://64.106.252.70:80/j?sid=OtjtAr5lwFoYmxk1
label.3.text=Buy Toshiba Laptops Direct From Toshiba
label.3.link=http://64.106.252.70:80/j?sid=AcmdUd312m0IY5dB

We pull just the first text string and link from the response for display in the chat room windows.

If the URL service fails, the error message itself is written in the label. If the property names defined by label.url.text and label.url.link are not found in the HTTP response, the text and link values defined by the following VolanoChat applet properties are displayed as a default:

label.text
label.link
Fixed server-side event reporting

Fixed a bug in the server-side event reporting which caused it to fail on permanent chat rooms (those listed in the conf/rooms.txt file) when those rooms were also being transcribed (with transcribe.room.permanent=true). The server-side events were not reported at all in this case. This update is required only if you need to enable both the chat message logging, known as message transcription, and the server-side event reporting for the same permanent rooms.

Updated locations for Sun Java on Windows and Linux

Changed the startup.bat, startup.sh, and service.bat files to point to the latest Java versions for the path to the Java executable file (jdk1.3.1_13 on Windows and j2sdk1.4.2_05 on Linux).

3 June 2004 - Version 2.6.3

Client applets require Java 1.1 or later

Built the applets with Java 1.1, so the VolanoChat, MyVolanoChat, and WebVolanoChat applets now require support in the Web browser for Java version 1.1 or later. The Microsoft Virtual Machine with Java version 1.02 in Internet Explorer 3.0 is no longer supported. The Microsoft Virtual Machines with Java version 1.1 in Internet Explorer 4.0 or later are supported. The VolanoChat server still requires Java version 1.3 or later.

Note that Java 1.1 has been available since February 1997. The latest Java software for the desktop is version 1.4, available at java.com.

Fixed Java 1.5 hang (hard run) when applet is destroyed while in chat room

Removed the interrupt on the receive thread to avoid Bug ID 4983039, "java.nio.channels.ClosedChannelException reading font file," in the Sun Java Plug-in version 1.5 Beta 1.

Fixed super-wide private chat window when profile text is long

Put a cap on the maximum width of the status area so that very long profiles will not cause the private chat windows to open up very wide as well. Used the standard banner image width of 468 pixels for the preferred maximum width.

Fixed default internal applet properties and error checking
  • Made all internal defaults equal to exactly what's in the english.txt file except for the one property, text.menu.themes.names. That property is empty because there are no default themes defined internally in the applets.

  • Tested against the version 2.1 properties to make sure there are no upgrade problems, especially with the color and font themes.

  • Tested against an empty properties file, a file with all properties set to the empty string, a file with bad numbers, a file with bad URLs, and a file with bad color and font values. In all cases the applet still managed to function. Messages are printed to the Java Console for each error encountered in the properties file.

Fixed unnecessary image loading in BannerPlayer applet

The BannerPlayer applet would load its image an extra time when its chat window was closed with banner.cache set to false. Fixed the embedded applet to load the image only when needed.

Fixed unnecessary properties file loading for embedded applets

Fixed the applet stub, which by default embeds the BannerPlayer applet, so that it loads the embedded applet properties file only once per instance of the Java VM. Without this fix, the BannerPlayer.txt file was loaded each time a new chat room window with the BannerPlayer applet was opened. With this fix, the BannerPlayer.txt file is loaded just once per browser session no matter how many times a chat room window is opened.

Split profile text parameters in entrance alerts

Split up the profile text among the IP address, user name, and profile string in the entrance alerts by setting:

text.system.entrance=[%0] %2 %1: %3

where %0 is the date, %2 is the IP address (if available), %1 is the user name, and %3 is the user's profile text. Before, the IP address, user name, and profile text were all just one variable in the message template. This change allows more flexibility in rearranging or omitting each of the fields.

Upgraded the embedded Apache Tomcat servlet container

Upgraded Tomcat from version 4.1.29 to version 4.1.30.

Updated locations for Sun Java on Windows and Linux

Changed the startup.bat, startup.sh, and service.bat files to point to the latest Java versions for the path to the Java executable file.

Windows:    jdk1.3.1_09 ->   jdk1.3.1_11
  Linux:  j2sdk1.4.2_03 -> j2sdk1.4.2_04
Changed default flood control delays

Lowered the 5-second flood control delay values down to a default of one second.

Ship with empty license file

Added an empty license file (as conf/key.txt) to the product so that the IP address is printed when the trial version is started. Before, without the file, the server printed this message on startup:

Please download a trial license key from www.volano.com.
Unable to start server: java.io.FileNotFoundException:
  .\conf\key.txt (The system cannot find the file specified)

Now, with the default empty file, it prints a message like the following:

Please download a trial license key from www.volano.com.
Unable to start server: java.io.IOException: no license for 192.168.2.3:8000
Simplified ConfigServlet page

Removed the unnecessary steps listed on the ConfigServlet page (webapps/ROOT/vcclient/config.html). It's no longer necessary to change the host name of the links on the page nor to define the server applet.codebase property. The links now use an absolute path with no host specification, and the admin.codebase property is already properly defined in the server properties file.

1 May 2004 - Version 2.6.2

Updated Mac OS X Java location

Changed the Java path in the startup.sh file on Mac OS X from this:

java=/Library/Java/Home/bin/java

to this:

java=/usr/bin/java

1 March 2004 - Version 2.6.1

Upgraded Apache Tomcat to version 4.1.29

Upgraded to Apache Tomcat 4.1.29 from version 4.0.6 for the embedded servlet container to avoid a potential security vulnerability found by Debian in Tomcat version 4.0.3. Changed the Tomcat HTTP access log file to use the Combined Log Format instead of the Common Log Format.

Added member database script samples in PHP and Java

Wrote sample Java servlets and PHP scripts which access a relational MySQL database for the membership access, name, and document scripts. The scripts are linked for download from [5.7] Member Database Support.

Removed default DNS-based blacklist zones

Modified the DNS-based blacklists for dynamic IP address detection from this:

dnslist.dynamic=dynablock.wirehub.net:127.0.0.2 \
  blackholes.five-ten-sg.com:127.0.0.3 \
  relays.osirusoft.com:127.0.0.3 \
  no-more-funn.moensted.dk:127.0.0.3 \
  dnsbl.njabl.org:127.0.0.3 \
  spamguard.leadmon.net:127.0.0.2

to this empty setting:

dnslist.dynamic=

Most of the DNS-based blacklists were put out of operation by spammers, so their use simply causes a delay in ban requests due to DNS timeouts while checking the broken lists.

Added work-around for Sun Java Bug 4853457

Added the suggested work-around code to avoid Sun Java Bug 4853457, "REGRESSION: List setEnabled(true) does not redraw Items on Windows 2000."

Added a server property for case-insensitive nicknames

Added a server Boolean property that determines whether to ignore the case when checking if a user name is already taken in a chat room:

username.matchcase=true

The default value is true, meaning the names are case sensitive. A value of false tells the server to ignore case when checking whether a name is already in use in the chat room.

Prevented banning of an address in use by a monitor

Changed the server so that it will never ban an IP address which is in use by a monitor on an active connection. To prevent monitor addresses from being banned even when the address is not in use, enter the full IP address into the conf/hosts-allow.txt file.

Improved ban logging

Changed the VolanoChat server to put the monitor's IP address and nickname in the ban log file, instead of just null, when a reserved member name is not being used by the monitor.

Updated startup scripts

Updated the startup scripts to Java version 1.3.1_09 and added better comments regarding what to change if you're not using that exact version. The latest scripts are:

startup.sh - a Bourne Shell script for FreeBSD, Linux, Mac OS X, Solaris, and Cygwin Bash Shell under Windows.

startup.bat - a Windows batch file for Windows 2000, Windows XP, and Windows Server 2003.

Converted applet property files to ASCII-encoded Unicode

Used the native2ascii program in the Java 2 SDK to encode the applet property files in US-ASCII with Unicode escape sequences for character code points greater than 127. This change ensures that the files work correctly when loaded into any operating system. The files in their original native ISO-8859-1 character coding are provided under the VolanoChat subdirectory "webapps/ROOT/vcclient/iso-8859-1".

Updated Links applet menu

Removed the reference to the obsolete Web Standards Project Browser Upgrade Campaign that was in the VolanoChat and MyVolanoChat Links menu.

Added empty bean info classes

Added the following empty Java class files to the applet code base to avoid extraneous (but harmless) "404 Not Found" error messages in the log files of the Web server delivering the VolanoChat applets:

vbBeanInfo.class
mbBeanInfo.class
bBeanInfo.class
VolanoChatBeanInfo.class
MyVolanoChatBeanInfo.class
WebVolanoChatBeanInfo.class
VolanoChat$COMClassObject.class
MyVolanoChat$COMClassObject.class
WebVolanoChat$COMClassObject.class
Added -server Java option for Mac OS X

Added the -server option to the Apple Mac OS X Java virtual machine. With this option, the Java VM sets better runtime parameters for a Java server process on Mac OS X even though it still invokes the HotSpot Client VM.

15 August 2003 - Version 2.5.1

Disabled right and middle click in BannerPlayer

Disabled the right and middle mouse buttons in the BannerPlayer applet so only a left mouse button click causes the associated Web page to be displayed. Some advertising companies complained to customers that enabling the right mouse button to display advertising Web pages was somehow cheating.

Use only logical font names

Modified the applets to display only logical font names by default in the font options menu. Obtaining the list of physical fonts on Mac OS X could cause the applets to crash with the following error if there were inconsistent fonts installed on the operating system:

java.lang.NullPointerException
    at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames
        (SunGraphicsEnvironment.java:327)
    at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames
        (SunGraphicsEnvironment.java:359)
    at apple.awt.CToolkit.getFontList(CToolkit.java:901)
    at COM.volano.vag.<init>(DashoA5383)
Set default minimum size for applet text areas and fields

The default minimum size for text areas and text fields on Mac OS X is zero (or very small). In chat room windows where no banner is present, such as the WebVolanoChat private chat window, the default size was far too small to be useful. Added sizes to the text field and text area rows and columns so that they're sized correctly even when empty on Mac OS X.

Added property to block initiation of private chat

Added a new applet property called send.private.disable with a default value of false. When true, this property disables the initiation of private chat sessions from the applet. Otherwise, it allows the initiation of private chat sessions as before.

Fixed bug where auditorium visitors could send messages to moderator

If a visitor entered an event auditorium using the same name as one of the moderators or guests, the visitor's questions were delivered directly to the moderator's chat message area instead of being added to the list of questions. The message was not sent to anyone else in the auditorium, but it appeared to the moderator as if it had been broadcast. Fixed the bug so that messages from such visitors are added to the list of questions.

Fixed bug where whisper disconnected applets

Fixed a bug where a whisper message sent using the VolanoChatPro Client API would disconnect visitors using the VolanoChat, MyVolanoChat, or WebVolanoChat applets.

Added member name to access log

Added the member name to the remote user field (%u) of the Combined Log Format used as the format for the VolanoChat server access log:

%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"
Allow for a 0.0.0.0 wildcard server socket

Create the chat server socket so that it listens on all TCP/IP interfaces of the machine when the server.host server property is either undefined, empty, or has a value of 0.0.0.0, as in the following three examples:

# server.host=       # Value is undefined (commented out)
server.host=         # Value is the empty string
server.host=0.0.0.0  # Value is a zero IPv4 address

When using server sockets of this type on a multi-homed host (such as one using IP-based virtual hosts for Web hosting), the primary address of the system must be one of the addresses found in the VolanoChat license key file. The primary address is the one that is returned when looking up the address of the system's host name, such as with the following command on Linux:

host `hostname`
Allow removal of Room Filter field and label

Added a new applet property called filter.enable with a default value of false. When true, this property displays the Room Filter label and text field as in earlier versions. Otherwise, the Room Filter label and text field are removed in the VolanoChat applet.

Fixed Proxy Servlet for HTTP 1.0 clients

Rewrote the Proxy Servlet to respond correctly to HTTP version 1.0 clients by letting the servlet container set most of the HTTP response headers (except for Content-Type and Location, which are unknown to the container). The Proxy Servlet no longer attempts to be transparent between the actual client and remote server.

Improved the error handling with better log messages and more informative responses to the requesting client. For example, the proxy servlet now passes error pages from the remote server back to the original client rather than allowing the servlet container to generate its own error page.

Any cookies set by the proxy servlet on behalf of the remote server are now set to expire at the end of the current browser session rather than being set to expire after one year as in earlier versions.

Improved the accuracy of the internal HTTP trace.

Apache Tomcat version 4.0.6

Upgraded the built-in Apache Tomcat servlet container to version 4.0.6 from version 4.0.3.

04 November 2002 - Version 2.5.0

Security enhancements

Optional client authentication

The server can use an optional challenge and response protocol with each connecting client as an attempt to verify that the client is a VolanoChat applet delivered from the machine running the server. The authentication is enabled by setting:

client.authentication=true

in the server properties file conf/properties.txt and is enabled by default. With authentication, people have a harder time using automated robots to come in and cause trouble, and it helps make sure there is a real person on the other end of the connection. A message is displayed during the authentication, defined by the applet property:

text.button.authenticating=Access granted, authenticating client...

When enabled, the client authentication requires the Microsoft virtual machine version 1.1 or later (in Internet Explorer 4.0 or later), the Apple Java virtual machine version 1.1.8 or later, or the Sun Java 2 Plug-in version 1.3 or later. See the [3.1] System Requirements page for details concerning Web browser support and client authentication. The applets fail gracefully with the older Netscape version 2.0 through 4.8 browsers and with Internet Explorer 3.0 by displaying the Unsupported Java Version page defined by the applet property:

page.java.version=java.html

Flood control

Added request-level flood control properties that allow the server administrator to define the delay required after each type of client request. On the client side, the properties can force the VolanoChat applets to pace themselves when they are used by scripting tools to automatically flood the chat rooms. On the server side, the properties can push the TCP/IP network's flow control all the way back to any clients attempting to flood the server.

The new server and applet properties are listed below with their default values as the delay time in milliseconds.

delay.access=0
delay.authenticate=0
delay.beep=5000
delay.chat=5000
delay.enter.private=5000
delay.enter.room=5000
delay.exit.private=0
delay.exit.room=0
delay.kick=0
delay.ping=0
delay.room.list=0
delay.user.list=0

On the client side the values are the time, in milliseconds, that the applet waits after sending a request of that type before sending any other request. On the server side the values are the time, in milliseconds, that the server waits after receiving a request of that type before receiving any other request on the same connection. The delays should be defined small enough so that they aren't noticeable to those using the VolanoChat applets normally.

The client and server side should have the same values. The delays on the server side makes sure potential non-Volano clients are still limited in their ability to flood the server, with the flow control being pushed back to the actual client through the TCP/IP network. The delays on the client side make sure that such TCP/IP flow control is never activated for connections with VolanoChat applets.

Flood control feedback

Although people can no longer flood the VolanoChat server, previous to this change the applet made it appear as if they could flood by accepting messages and displaying them locally as fast as possible. That made people think they were still flooding, so they kept trying over and over again. To correct that appearance, we added feedback all the way to the chat message text field when people are chatting faster than the VolanoChat server is configured to accept messages. When someone is sending in messages faster than the configured rate, the text color changes to that defined by:

color.foreground.text.editable.inactive=#RRGGBB

and for each theme there's the additional color:

theme.n.color.foreground.text.editable.inactive=#RRGGBB

When there are a certain number of outstanding unconfirmed chat messages, the text color changes and the applet does not accept the Enter key until the number of unconfirmed chat messages reaches the limit again. The limit is defined by the following applet property, with a default of allowing no outstanding unconfirmed messages:

unconfirmed.chat=0

DNS-based blacklist support

Added support for two types of DNS-based blacklists (DNSBLs): one for denying access to externally open proxy servers, and the other for detecting dynamically assigned Internet Protocol (IP) addresses, such as those used for most dial-up accounts. The list of blacklists defined by dnslist.denied is checked for each connecting client. If the host address is found in one of the blacklists, the client is denied access. The list of blacklists defined by dnslist.dynamic is checked when a monitor bans an address from the server. If the host address is on one of the blacklists, it is determined to be a dynamic IP address, and the dynamic and network block settings for the ban control apply.

The DNS blacklists are separated by white space and in the format zone:response, where the zone part is required and the :response part is optional. If no response is specified for a blacklist, any response from the DNS query indicates that the address is on the list. Otherwise, only the specific response specified indicates the address is on the list.

The blacklists defined by dnslist.denied are checked each time someone connects to your VolanoChat server. Since each DNS lookup may take a few seconds, you want to keep this list to a minimum, since it can add a delay to the time it takes each visitor to connect. The blacklists defined by dnslist.dynamic, on the other hand, are used only when a monitor bans a visitor.

Many of these blacklists have recently shut down due to denial of service attacks by spammers, so you may want to switch these settings to empty until suitable replacements are found:

dnslist.denied=
dnslist.dynamic=

Enhanced banning control and logging

You can separately control the duration that static IP addresses, dynamic IP addresses, and dynamic address network ranges are blocked from the VolanoChat server when a monitor bans an address. The server uses the DNS-based blacklists defined by dnslist.dynamic to determine whether an IP address is static or dynamic. The following two properties define the duration, in minutes, that a static or dynamic IP address is banned:

ban.static.duration=1440
ban.dynamic.duration=60

A value of -1 means to ban forever (until the server is restarted).

If no DNS-based blacklists are defined for detecting dynamic IP addresses, all addresses are assumed to be static. If an address is determined to be a dynamic IP address, the containing network block is also banned from the server. The network mask used to determine the network block is defined by ban.netblock.ipv4mask, while the duration of the network block ban, in minutes, is defined by ban.netblock.duration.

ban.netblock.duration=60
ban.netblock.ipv4mask=255.255.0.0

Each banned address is logged to the file defined by the following two properties:

log.banned.prefix=banned-
log.banned.suffix=.log

The format of each banned log entry is defined by the following Java format string. The default string below is defined for easy import into the host access control files.

format.banned={1}\={2,choice,0\#Static|1\#Dynamic|2\#Netblock} \
    address banned at {0} as {4} in {3} by {5}

For example, the formatted strings end up looking like the following:

216.192.12.38=Dynamic address banned at [19/Jul/2002:09:41:37 PDT]
    as BadChatter in Truth or Dare! by Nitzerebb
216.0.0.0=Netblock address banned at [19/Jul/2002:09:41:37 PDT]
    as BadChatter in Truth or Dare! by Nitzerebb
80.116.108.202=Static address banned at [19/Jul/2002:14:25:33 PDT]
    as bambola in Adult Chat Room by lucid dreams

Multiple connection blocking

Added a server property for disallowing connections from multiple clients with the same IP address:

duplicate.addresses=true

By default, clients with duplicate addresses are allowed.

Added an applet property defining the Duplicate Host Address page that is displayed when someone tries to connect with a duplicate host address:

page.access.duplicate=duplicate.html

Improved monitoring interface

Added a new menu to the public chat room window with Remove, Kick and Ban menu items. When one of the menu items is selected, a dialog box is displayed where monitors can choose the name and address to remove, kick, or ban. The Remove dialog displays the list of each user in the room. The Kick and Ban dialogs display the list of users who recently entered the room, with the most recent visitor at the top. The number of recent names and addresses to display in the Kick and Ban dialogs is defined by the applet property:

recent.user.limit=50

The text for the Monitor menu and its menu items is defined by the following applet properties, shown below with their defaults in the monitor.txt file. The internal defaults for these menu items are empty strings so that the server administrator can choose which of these Remove, Kick or Ban menu items to display to monitors.

text.menu.monitor=Monitor
text.menu.monitor.remove=Remove...
text.menu.monitor.kick=Kick...
text.menu.monitor.ban=Ban...

The text for the Remove, Kick, and Ban dialog boxes is defined by the following applet properties:

text.monitor.title.remove=Remove From Room
text.monitor.title.kick=Kick From Server
text.monitor.title.ban=Ban From Server
text.monitor.label.remove=Select the name to remove:
text.monitor.label.kick=Select the address to disconnect:
text.monitor.label.ban=Select the address to ban:
text.monitor.okay=OK
text.monitor.cancel=Cancel

With this new interface, monitors no longer need first to select the name of a visitor in the chat room to be able to kick or ban the visitor later. The applet itself keeps track of the names and addresses of everyone who enters the room. Monitors can simply select from the list of recent visitors when they need to kick or ban an address.

With this change, the following applet properties were removed:

text.menu.people.remove=Remove %0
text.menu.people.kick=Kick %0
text.menu.people.ban=Ban %0

Kick and ban check all connection addresses

Changed the kick and ban functions to disconnect all connections with a given IP address instead of just the connection of the person being kicked or banned. This makes sure people cannot use pre-established connections from different applet instances on the same machine to re-enter chat rooms even after their address is kicked or banned. However, it also means that when one person connected through a firewall router or SOCKS proxy gets disconnected, all other people connected through the same router or proxy will also be disconnected.

The default format of the COM.volano.Status output has been modified to include the number of unique IP addresses connected to the server in addition to the total number of connections. By default, the count of unique hosts is shown in parenthesis next to the total connection count, and is assigned variable number 2 in the following new server property format string:

format.status.resources={0,number,0} {1,number,0} ({2,number,0})

The other status format strings have been modified to accommodate the change:

format.status={0} {1} {2} {3,number,0} {4,number,0} {5,number,0} \
              {6,number,0} {7,number,0} {8,number,0}
format.status.memory={0,number,0}KB/{1,number,0}KB {2,number,0%}

Immediate IP addresses

Changed the server to send IP addresses directly to monitors and administrators rather than requiring them to request the address information by selecting the names one by one. The following properties were modified to include a variable for the IP address (%1). Normal visitors do not receive the IP address, so the %1 substitution variable is filled in with the empty string.

text.status.noprofile=%1 %0 has no profile.
text.status.profile=%1 %0: %2

Option to disable private chat

Added an applet menu option to disable all incoming private chat requests. The option on the main applet window affects all rooms, while the option in the chat room window affects only that room. For the WebVolanoChat applet, which does not have menus, the default value takes effect. The default for the option is defined by the applet property:

accept.private.default=true

The menu item text for enabling or disabling private chat requests is defined by the applet property:

text.menu.accept.private=Accept Private Chats

No horizontal scroll bar

Modified the applets to break unconditionally any long words that would force the chat message text area to slide over to the right with a horizontal scroll bar.

Persistent selections for People menu

Changed the People menu to keep the last selected name in its menu items so you can still ignore a name even after the person has left the room.

Cleaned referring URLs

Added code to clean all referring Web addresses of white space before checking them against the referrer access control lists. Otherwise, people could put two links separated by a space, one approved and one not, to get their own links into the status area when their dynamic room is selected.

Removed non-breaking spaces in user names

Substitute the non-breaking space character (hexadecimal "A0") with a normal space in user names in the VolanoChat, MyVolanoChat, and WebVolanoChat applets. This change prevents non-members from taking member names followed by a non-breaking space, like taking the name "john " when "john" is a member name.

Changed default maximum character lengths

Changed the default chat message text lengths from 1,000 characters down to 200 characters, since that's roughly the number of characters required to fill half the chat message text area at its default size on Windows.

length.chattext=200
length.profile=200
length.roomname=100
length.username=20

Advertising control

Long-running commercials

Improved the support for embedded applets in the VolanoChat and MyVolanoChat applets, including support for the IBM HotMedia applet for playing long-running and interactive commercials in the chat rooms. HotMedia has its own authoring tools or can be integrated with Adobe Premiere, Macromedia Dreamweaver, Macromedia Dreamweaver Ultradev, and NetObjects Fusion. See my newsgroup posting for our complete HotMedia test results using an earlier HotMedia version 3.5.17. The latest version of HotMedia includes support for sound in the Sun Java 2 Plug-in.

Geo-tracking advertisements

Changed the ProxyServlet to add the following HTTP request headers to all HTTP GET requests going to the remote Web server:

X-Forwarded-For: aaa.bbb.ccc.ddd
Client-IP: aaa.bbb.ccc.ddd

These headers indicate the actual requesting client's IP address. The additional headers are required by some ad server software and services when the request is sent through a proxy.

Additional text line below profile

Added a text label for a second line of linked text below the profile area at the bottom of the main window, chat room window, and private chat window. The label and link are defined by the follow two applet properties, set to empty strings by default:

label.text=
label.link=

Customizable link prefixes

Added a new applet property defining the list of prefixes used to detect and link text in the status area when displaying profile text and referrer links.

link.prefix=http:// ftp:// news: mailto:

The property can be used to restrict links to certain Web locations, as in this example restricting links to Volano's Web sites:

link.prefix=http://www.volano.com/ http://www.volano.net/

Disabling profile and referrer links

Added an applet property to disable the automatic linking of URLs in the profile text of the applets by setting the applet property:

link.profile.disable=true

Added an applet property to disable the links to the referring Web site which created the selected dynamic room by setting the applet property:

link.referrer.disable=true

The default value for both properties is false.

Profile and referrer link filters

Added applet properties defining URL templates for profile and referrer links, as in the following examples::

link.profile.url=http://www.volano.com/redirect.cgi?location=%0
link.referrer.url=http://www.volano.com/redirect.cgi?location=%0

With the properties above, a link in a profile to Yahoo, for example, would become:

http://www.volano.com/redirect.cgi?location=http://www.yahoo.com/

The redirect script can determine whether to redirect to the requested Web site or to some other page. The default values go directly to the URL defined by the linked text as in VolanoChat 2.1:

link.profile.url=%0
link.referrer.url=%0

A value of empty text for these properties makes the corresponding URLs appear to be links, but nothing happens when they are clicked.

ProxyServlet cookie fix

Sun changed the meaning of the HttpURLConnection.setFollowRedirects method in Java version 1.3. Sun Java Bug 4637447, "HttpURLConnection's setFollowRedirects(false) doesn't work for the instance," documents the problem. Fixed the ProxyServlet to use the new setInstanceFollowRedirects method so that all the ad server cookies are set correctly.

Administration enhancements

Log rotation

Added automatic daily rotation of the access, error, public room access, private room access, banning, servlet runner, servlet request, and Velocity template engine log files. The location of the log files and the suffix and prefix of the log file names are defined by the new log.* server properties:

log.directory=logs

log.access.prefix=access-
log.access.suffix=.log
log.error.prefix=error-
log.error.suffix=.log
log.public.prefix=
log.public.suffix=.log
log.private.prefix=
log.private.suffix=.log
log.banned.prefix=banned-
log.banned.suffix=.log
log.servlet.prefix=servlet-
log.servlet.suffix=.log
log.http.prefix=http-
log.http.suffix=.log
log.velocity.prefix=velocity-
log.velocity.suffix=.log

Each of these log files can be disabled by setting its prefix to the empty string. The following obsolete properties have been removed, replaced by the new properties listed above:

log.access=access.log
log.error=error.log
log.public=
log.private=

Improved access control

The following server property is removed:

server.access=access.txt

It is replaced by the following four access control files:

access.hosts.allow=conf/hosts-allow.txt
access.hosts.deny=conf/hosts-deny.txt
access.referrers.allow=conf/referrers-allow.txt
access.referrers.deny=conf/referrers-deny.txt

Each access control file is a Java properties file where the key is the IP address or referring URL and the value is any comment, ignored by the VolanoChat server. The access control follows the following rules:

  1. A zero in the right elements of an IP address is a wildcard match.
  2. The list of denied hosts is composed of both the deny access control file and the list of hosts currently banned by monitors.
  3. The file with the most specific match wins, with ties being allowed access. This allows you to prevent certain hosts from being banned by putting their full IP addresses into the allowed hosts file.

This change fixes the ordering problems of previous releases, where server administrators were unable to keep the referrer access control mostly closed while keeping the host access control mostly open (or vice verse).

For example, we run our demo server with the following access control:

conf/hosts-allow.txt
    0.0.0.0=Allow all hosts by default
    207.170.216.210=router.seattle.volano.com
    216.102.197.168=router.sf.volano.com

conf/hosts-deny.txt
    empty

conf/referrers-allow.txt
    http\://www.volano.com/=Allow only Volano's Web site

conf/referrers-deny.txt
    http\:=Deny all Web referrers by default
    file\:=No access using local file
    ftp\:=No access through FTP

Adding the full IP addresses of Volano's offices into the allowed hosts file prevents these addresses from being banned, since a tie in the lookup goes to allowing access.

Note that because the colon character (":") is a key-value separator in Java property files, you need to escape the character by preceding it with a backslash. Normally, the equals character ("=") is used to separate keys from their values in property files. You may also omit the values altogether and simply list keys, like this:

0.0.0.0
207.170.216.210
216.102.197.168

or this:

http\://www.volano.com/chat.html
http\://www.volano.net/chat.html
http\://volano.com/chat.html
http\://volano.net/chat.html

Also note that the lookup of referring URLs in the referrer access control files is case insensitive.

Reduced failed requests

Modified the server to avoid recording an error status code for connections encountering a socket exception, since most of these exceptions are due to a reset from the client when the server sends it a message before being notified the connection was closed. Reporting these connections as having ended successfully gives a more accurate picture of the number of successful and failed requests in Analog statistical reports. For example, below is a list of 404 errors in our VolanoChat demo server on Friday, May 3, 2002, with 4,763 total connections:

java.net.SocketException: Connection reset by peer     328  81.2%
java.net.SocketException: Connection timed out          41  10.1%
java.net.SocketException: No route to host              13   3.2%
java.lang.InterruptedException: operation interrupted   11   2.7%
java.net.SocketException: Broken pipe                   11   2.7%
                                                       --- ------
                                                       404  99.9%

Over 80 percent of these errors are due to the connection being reset by the client. Analog reports the following statistics for the same day:

Successful requests: 4,053
Failed requests: 710

reqs:  %reqs: status code
----: ------: -----------
4053: 85.09%: 200 OK
  16:  0.34%: 400 Bad request
   1:  0.02%: 401 Authentication required
  71:  1.49%: 403 Access forbidden
  53:  1.11%: 406 Document not acceptable to client
 157:  3.30%: 408 Request timeout
   4:  0.08%: 409 Request conflicts with state of resource
 397:  8.34%: 500 Internal server error
  11:  0.23%: 505 HTTP version not supported

The server still records socket exceptions in the error log file, but sets the connection status to 200 (OK), since most of these connections were successful but simply encountered a reset when closing. In the example of May 3, the change moves 393 of the total 397 "Internal server error" requests from the failed requests category over to successful requests in the Analog report.

Also added code to catch an interrupted exception and log it only if the connection is still open when the error occurs. Otherwise, some connections closed by monitors were reported as errors.

Easier license key

Changed the license key to be a human-readable text properties file instead of a binary file. The separate server.host and server.port properties are required only when the VolanoChat server is on a multi-homed host and running on a secondary (not the primary) IP address of the host. The location of the server license key is defined by the server property:

server.key=conf/key.txt

New startup scripts

Added a new sample startup script for Windows, Linux, Mac OS X, and Solaris. The new script has an internal loop so it no longer require the rather heavy COM.volano.KeepAlive program for automatic restarts. The startup scripts specify Java version 1.3 and the Sun HotSpot Server VM where appropriate, set the file descriptor limit to 1,024, and set the Java stack size to 96 kilobytes.

startup.bat
startup.sh

New HTML error and help pages

Rewrote all of the Web pages displayed by the VolanoChat applets so that they're valid XHTML 1.0 and CSS and have clearer instructions for those Web site visitors having problems or needing help. Added comments inside some of the applet's Web pages indicating the changes that need to be made so people behind caching proxy servers can still enter the VolanoChat server immediately after an upgrade.

Applet changes

Color and font themes

Added the following applet properties for defining a default color theme based on the foreground and background colors of each component type in the applet user interface. The default colors are shown below.

color.background=#A0B8C8
color.background.button=#FFFFCC
color.background.list=#DCDCDC
color.background.text=#DCDCDC
color.background.text.editable=#FFFFFF

color.foreground=#000000
color.foreground.button=#000000
color.foreground.list=#000000
color.foreground.text=#000000
color.foreground.text.editable=#000000
color.foreground.text.editable.inactive=#FF0000
color.foreground.text.link=#0000FF

font.default=SansSerif-13

Themes menu

Added a Themes menu for the end user to select the color and font themes in the VolanoChat and MyVolanoChat applets. The text of the themes menu is defined by the following properties, shown with sample text:

text.menu.themes.title=Themes
text.menu.themes.names=Plum | Desert | Marine | Pumpkin | Lime | - \
    | High Contrast Black | High Contrast Black (large) \
    | High Contrast White | High Contrast White (large)
text.menu.themes.default=Standard

The themes are selected by index with the default font, background colors, and foreground colors used for any missing definitions. For example:

# Plum
theme.1.color.background=#CC99CC
theme.1.color.background.button=#EEEEEE
theme.1.color.background.list=#FFCCFF
theme.1.color.background.text=#FFCCFF

theme.1.color.foreground.text.editable.inactive=#996699
theme.1.color.foreground.text.link=#330033

Improved font options

Changed the font options to avoid changing the font of the applet window menus and menu items. Modified the VolanoChat main window font options to change the fonts on itself in addition to all chat room windows.

Room name filter

Changed the room name field on the main VolanoChat window into a room name filter, allowing users to enter a text string and get the list of only those room names containing the string. The string compare is case insensitive. This change is especially useful for sites with hundreds of rooms in the VolanoChat server.

The new applet properties for the user interface changes are listed below:

text.main.filter=Room filter:
text.main.getrooms=Get Rooms

text.status.focus.filter=Filter for list of room names.
text.status.focus.getrooms=Get list of room names matching filter.

With this change, the following applet properties were removed:

text.main.roomname=Room name:
text.main.refresh=Refresh Rooms
text.menu.refresh=Refresh Rooms

text.status.focus.roomname=Your room selection.
text.status.focus.refresh=Refresh the list of rooms.

The following applet properties were modified for this change, with the first two properties changed to include the currently selected room name:

text.status.enter=Press Enter Room to enter %0.
text.status.entername=Enter a name to join %0.
text.status.nosuchroom=Room no longer exists. Press Get Rooms.
text.status.selectroom=Select a room to enter.

Fixed initial keyboard focus

Fixed the initial keyboard focus on the main VolanoChat applet window and the VolanoChat and MyVolanoChat room windows. The initial focus is in the user name field on the main window and the chat message text field of the room windows.

Fixed jumbled text with Java Plug-in 1.4 on Windows 2000

Changed the applets to work around Sun Java Bug 4652358, "Using value of 'line.separator' for line separator in TextArea fails," in the Java 2 Plug-in version 1.4 on Windows 2000.

Added profile area to private chat windows

Added a text label to display the other person's profile in private chat sessions.

Changed limit.public=0 to mean zero public chat rooms

In previous VolanoChat versions, a value of -1 or zero for the limit.public applet property allowed visitors into an unlimited number of chat rooms. In this and newer versions only a value of -1 means unlimited, while a value of zero now means that the visitor can enter no rooms to chat. Also modified the default to a limit of five public rooms:

limit.public=5

WebVolanoChat private room identity

Added both user names to the window title of WebVolanoChat private chat rooms instead of just one name.

Other changes

The banner property defaults were modified to display only the 60-pixel-height banner, without a navigation bar below it:

banner.height=60

The default logo area size in the main VolanoChat applet window was modified to include an extra 20 pixels to correct for the 20 pixels cropped off its height by the Microsoft Virtual Machine in Internet Explorer:

logo.height=220

The version number in the default VolanoChat applet window title is updated:

text.main.title=VolanoChat 2.5

A sample link menu is added, providing links to pages where visitors can upgrade their Web browser and Java support:

text.menu.links.locations=http://www.webstandards.org/upgrade/ \
    | http://java.sun.com/getjava/
text.menu.links.names=Browser Upgrades | Get Java
text.menu.links.title=Links

Made a minor change in the text of the following two properties:

text.status.privatelimit=You are limited to %0 private chat sessions.
text.status.publiclimit=You are limited to %0 chat rooms.

Internal changes

Server requires Java 1.3

The VolanoChat server now requires Java version 1.3 or later. See the [3.1] System Requirements page for details.

Windows Service support

Added new support for running the VolanoChat server under Java 1.3 or later as a Windows 2000 or XP Service.

Apache Tomcat

Replaced the embedded Sun JSDK 2.0 servlet runner with Apache Tomcat 4.0 in the VolanoChat server. The server properties:

servlet.port=8080
servlet.minprocessors=5
servlet.maxprocessors=20

replace the earlier servlet runner configuration file (httpd.txt).

The Tomcat HTTP request access logging is enabled and defined by the properties:

log.http.prefix=http-
log.http.suffix=.log

preEmptive DashO-Pro obfuscator

Replaced the 4thpass SourceGuard 2.0 obfuscator with preEmptive Solutions DashO-Pro 2.3 for greater applet size reductions. Redesigned the protocol for faster message processing and less bandwidth overhead for each message.


Previous Next Up FAQ XHTML 1.0 Table of Contents

2014-04-02 — The Java 8 Plug-in released on March 18, 2014, blocks the VOLANO chat applets from connecting to the chat server. More…

The VOLANO® chat software for the Java™ platform lets you build on-line communities and add real-time social networking to your Web site. More…

John Neffenger <john@status6.com>
More…

A PROJECT OF STATUS:6®