Build 449.5: Info on update released October 10, 2001

SPECIAL NOTES ABOUT THIS UPDATE:

This AUP requires you to be aware of the following:

Changes, Fixes and Enhancements by Wildcat Component

WCCONFIG

- Added new HTTP PROXY PORT option to WCCONFIG COMPUTERS.  

  The current default of 80 was not changeable unless it was specified 
  in the redirect proxy URL request.  Now you can set the default HTTP 
  proxy port.
- New Mail Conference option:
     [ ] Allow Mail Snooping
  If checked, users will be allowed to read their private, direct
  personal mail in "snoop mode" which means the mail will not be marked
  received.  This option is only recommended for the email conference
  (conference 0) and it is primarily intended for POP3 mail clients who
  might read the mail via the WEB.
  NOTE: This option does not apply to ANSI/QWK/WCNAV clients. Users
  reading mail using these methods will not have mail snooping access.
- New File Area option:
     [ ] Allow Private Files
  This checkbox is a new feature to allow for files in a file area to
  be considered "private" and only accessible by the user id the file is
  assigned.
  This is only possible using wcBASIC or 3rd party applications, where users
  are uploading files into file areas and wish to make the file private for
  specific users.  This allows customers using WINSERVER as a "File
  Exchange System" with their user clients to avoid having to create a
  unique access profile and file area for each user.  One file area can
  be used for all users and, with the "Allow Private Files" logic in
  place, users will only be able to download the files they were
  assigned.  However, once again, how the Private Files are assigned
  are based on the customer's customization and program applications
  using wcBASIC or the SDK.
WCMAIL

- FIX: fixed potential bug when importing a news article with blank
  subject lines.
- FIX: fixed bug when reading newsgroup articles or email with tabs
  used for delimiters in various parts of the RFC message.
- FIX: Fixed a parsing problem when reading an email message with a
  badly formatted RFC "Content-type:" line.
- NEW: If an incoming email domain is unknown to Wildcat!, the spool
  *.d/x files will be moved to a new "orphan" folder under the
  spool\host directory.  This is opposed to the "bad\" folder which is
  used when there is an "error" situation during import.
- NEW: Added more logging during email import process to report certain
  situations.
- NEW: Added better logic for handling MIME mail with multi-parts
  as well as email with only HTML mail.
WCFTP

- FIX: Fixed a password buffer overrun bug with anonymous connections
  where long client IP domain names were used for the password.
- FIX: Fixed a memory leak when a file was denied download access.
- Changed/Added new FTP*.BBS files:
  OLD:
  ftphello.bbs         - was shown before user name prompt
  ftplogin.bbs         - was shown after user logged in
  NEW:
  We thought the old ftp*.bbs was worded backwards. So we renamed them
  to make more sense and added a few more optional FTP*.BBS files to
  support info display for anonymous vs. normal user accounts.
  ftpprelog.bbs        - show before user prompt (was old ftphello.bbs)
  ftphello.bbs         - show after login (for Non-ANONYMOUS users only)
  ftphelloAnony.bbs    - show after login (for ANONYMOUS users only)
  ftpAnonyPwd.bbs      - show before password prompt for ANONYMOUS users
  ftpNoAnony.bbs       - show if anonymous FTP is not allowed
- FTP Upload File Checker/Scanner (for 3rd party developers)
  Now wcFTP server has the ability to run a WCX program after a file has
  been uploaded.  If the following file, "ftpScanFile.wcc," exists in the
  \WC5 directory, it will be executed after the file is uploaded
  but before the file record is added to the file database.
  This allows the wcx program to set the FailedScan record flag and/or
  delete the temporary file.  If the file does not exist when the WCX
  returns to FTP, the file record will not be added to the database.
WCHTTP (WEB SERVER)

- Added new HTTP PROXY PORT: option to WCCONFIG COMPUTERS.  The current
  default is 80 was not changeable unless it was specified in the
  redirect proxy URL request.
- Added more alias urls:
   /file/node/filename.txt    download from local machine wcnode/nodeX
   /file/temp/filename.txt    download from server machine wcnode/tempX
- Added the ability to pass arguments in a HTTP POST request. Previously,
  this was being removed.
- Added support for multiple uploaded files. To support this, we
  needed to come up with a method to determine the total file
  upload count and their true file names. The new mime extraction
  will now add unique name=value pairs for file uploads.
  Example: 3 files are uploaded:
     x.zip
     y.zip
     z.zip
   Typically, you will have the name=value pairs
     controlname1=x.zip
     controlname2=y.zip
     controlname3=z.zip
   where the controlnameX are defined by the HTML form developer.
   The problem is that in order to support multiple file uploads in a
   general receiver server-side wcx, you have to customize the applet in
   order to get the control names.
   This can be done generically.  Now the WIN Server mime extractor will
   INCLUDE new name=value pairs to above name=value pairs defined by
   the FORM developer as follows:
   mimefilecount=3
   mimefile1=controlname1
   controlname1=x.zip
   mimefile2=controlname2
   controlname2=y.zip
   mimefile3=controlname3
   controlname3=z.zip
   This allows for an independent method of supporting a general file
   receiver system where the server-side applet does not really need to
   know the control name.  The script can basically look for FileCount
   and if greater than 0, it can loop on "FileX" name to get the
   name of the control.  You can then use this control name to get the
   real file name.
   wcBASIC Example:
     // This example shows how to generically extract the file names
     // of multiple uploaded files.  HTTP POST request assumed which
     // means paramstr(1) is the file name of the posted cached MIME
     // file received by the WEB server.
     dim fields as string = ""
     if httpExtractMultipart(paramstr(1), TempPost+"upload.dat") then
        if GetParamsFromExtract(TempPost+"upload.dat",fields) then
            fields = HttpUnEscape(fields)
        end if
     end if
     dim fc as integer = GetParamInt(fields,"milefilecount",0)
     print "total files : ";fc
     for i = 1 to fc
       dim controlname as string
       dim filename as string
       controlname = GetParamstr(fields,"mimefile"+str(i))
       filename    = GetParamstr(fields,controlname)
       print controlname;"=";filename
     next
- Web Mail, fixed FRAME mode, new message creation "click" backto url
  which was displaying the frames inside the frames.
  Changes:
     html-create message.wcc/wcx
     http\template\message_ok.htm
- Minor correction in the web server logic for displaying optional
  errors response htm files.
  In general, the http\errors\ directory is where all error-related
  optional htm files should be located.  However, the following two
  files were hard-coded to be in the http\ directory:
    http\notfound.htm       - 404, url not found
    http\unauthorized.htm   - 401, unauthorized user login
  The new web server will now check the http\errors directory first
  before checking the http\ directory for the above files.
WCSRV.DLL

- Fixed bug in Thread Attach/Detach logic in WCSRV.DLL for situations
  were the dll is explicitly loaded.  This fix addresses the usage of
  Internet Rex with Wildcat!
WCCORE.DLL

- Fixed bug in the CORE engine where it was not honoring the current
  user Idle Timeout settings when displaying files via ANSI/TELNET mode.
  If there was a PAUSE in the display, the idle timeout logic was ignored.
WCSERVER

Added some improvements to the Wildcat Server.
- Wildcat! now creates a new index file for the File Database to allow
  for searching by file date.  This improves/speeds up the "New files
  since..." searching capabilities by reducing the need to search all
  file areas using the previous search method.
  Please run wcRepair and reindex the File Areas before you restart
  the Wildcat Server!  It will not proceed until you do.
- Startup
  Mail Packing events do not automatically start now upon server
  startup.  Previous versions did not initialize some internal timers
  which caused the mail event to immediately begin.
- Shutdown
  A new wc6 feature was moved to WC5 where it will show you all the
  "active connections", if any, when you try to shutdown the server and
  clients are still active.
  In addition, the server now will notify you if a mail packing process
  is currently active when you try to close down the server. It will
  give you the option to cancel or continue with the shutdown. This
  mostly benefits large mail systems. During shutdown, we want to make
  sure that everything is gracefully shutdown without abruptly stopping
  the mail packing processor. If you continue with the shutdown, it will
  wait a maximum of 1 minute to allow the mail packer to finish its work
  with the mail conference it is currently working on. When completed,
  the server will stop any further mail packing and continue with the
  shutdown.
- Open Mail Conference Cache:
  The Wildcat Server has an internal cache of holding 256 simultaneous
  open mail conferences. Mail Conferences idle more than 1 minute would
  then be closed but, during mail packing events, 256 conferences could
  be open at the same time.
  Now there is a new registry setting to fine tune the cache size to
  possibly help in the area of memory resources since 256 is pretty
  large (512 open files when you consider 2 files are open for each
  conference, the msg*.dat and the msg*.ix files).
  You can change the default value of 256 by defining a DWORD registry
  value called MaxOpenForumCache at the following registry key location
  (if the key wcServer is not defined, create it first):
      HKEY_CURRENT_USER\Software\Msi\Wildcat\WcServer
  A missing value or 0 will tell the Wildcat Server to use the default
  value of 256.
- Added new wcserver startup registry options:
  DWORD values under
  HKEY_CURRENT_USER\Software\Msi\Wildcat\WcServer
   UseEventLogging
      0  off, no NT event or file logging
      1  on, use NT event if wcevtmsg.dll exist, otherwise
         use wildcat.evt file logging (old behavior)
      2  on, use file logging to wildcat.evt

   AlwaysAdjustFileTotals
      0  Only adjust files if File Areas have changed
      1  Always adjust file totals on startup.
WCSMTP

- MAPS RBL. Please note that MAPS RBL is now a subscription service.
  It is no longer a free service.  See the MAPS RBL home site for
  for information: http://www.mail-abuse.org.  The MAPS RBL proprietors 
  are claiming "free hobby mail services" can use the RBL blacklist
  database free of charge. However, this remains to be seen.
  Santronics' 3rd party promotion policy prohibits free marketing/solicitation 
  to paid services.  We will not send you to MAPS RBL unless there are 
  alternative resources. The last time this was done with a service vendor, 
  many of our customers were caught holding the bag when the service went out of 
  business or exhibited shoddy business practices with customers. We have 
  tried to contact the MAPS RBL proprietors for discount information and/or 
  alternative solutions.   We have not received a response (I guess they are 
  busy fighting lawsuits.) If we are going to be sending them customers, then 
  it is prudent WINSERVER customers get a discount in pricing. 

  In the meantime, for the WCSMTP MAPS RBL configuration, the default current 
  RBL host will continue to be the blackholes.mail-abuse.org address.  This will 
  remain the default until further notice.  
  
  Are there any alternatives?  We are working on it.  We are looking into 
  other alternatives to address the mail spamming problem, including developing
  our own RBL database for WINSERVER customers. For the time being, we are 
  aware of only one reliable, free "spam filtering" site. If you wish to check 
  incoming IPs against a "list of open relay sites" then use the following 
  address: inputs.orbz.org.   This is not the same as a "blacklist" of known 
  spammers, but rather a list of mail sites which are open for spammer 
  exploitation.
WCPOP3

- No Change
WCONLINE

- No Change
WCCUSTOM.EXE

- Custom Connector Wizard:  This new version supports bitmap
  images with long file names and spaces in the file name.
New Administrator Utilities

wcSetAdmin.exe

wcSetAdmin allows the sysop/administrator to change the administrator
account.  It will also allow you to create new user accounts, however,
that is not the design purpose.  Its purpose is to assist new customers
in assigning the administrator/sysop account with the Administrator or
SYSOP Security/Access Profile.
WcModemTest

wcModemTest is designed for assisting technical support personel with
modem problems.  Use it to test your modems on your PC.  Type
WcModemTest /? for help.
For example, if you have a modem on node 1, you can type:
           wcModemTest /node:1
to read the Wildcat! modem configuration for node 1 and open a dumb text
terminal allowing to talk to the modem using AT commands.
You can also bypass Wildcat! modem configuration using the /port switch
like so:
           wcModemTest /port:com#
where com# would be a valid com port on your PC.
New SDK/WCBASIC Enchancements

- WCTYPE.H changes:
  - Added the following:
    TFileArea.Options
        bit map options:
            faAllowPrivateFiles
    TFileRecord.PrivateUserId
        If the file is private for a particular user, PrivateUserId is
        assigned the user's id.
  - The following WCTYPE structure names were renamed:
    TNodeInfo ----> renamed to TwcNodeInfo
    TMenuItem ----> renamed to TwcMenuItem
    These were renamed due to BORLAND C++ and Delphi compiler conflicts.
- New wcBASIC Utility: wcDebugWin.exe
  wcDebugWin.exe is a new debug window utility for wcBASIC developers.
  wcBASIC has a new command PrintDebugWindow(string) which allows you to
  print strings to the debug window.  If the window is not up, the print
  is ignored. This is useful to view the operation of your wcx by
  dumping variables and information to the window during design and
  testing.
- New File Library SDK Features:
  New function for Fast New Files Searching.
     BOOL SearchFileRecByDateArea(Area,FileTime,TFileRec,Tid);
  New File Record search key: FileDateAreaKey
- Added new DOOR32.DLL functions:
  DWORD DoorReadPeek(void *data, DWORD size);
  DWORD DoorCharReady();
- Added a new message field called ReadCount to record the number of
  times the message body/text is accessed by any mail client.
  The ReadCount is independent of any "Mail Received" recording for a
  particular user. However, having the ReadCount recording is
  particularly helpful or useful when:
    1) Getting a handle or the popularity of a particular message, and
    2) Getting an indication a message was read during mail snoop or
       preview mode which is now possible with the wildcat mail clients at
       the user level (not just the sysop level).
  The latter is very important. If the ReadCount is greater than zero for
  a private/direct email, then we know the message was already
  read/received by the recipient even though the message Received flag
  may not have been recorded. This can happen during POP3 mode or
  multi-device reading sessions. Without the Readcount, the system (or
  message sender or sysop) will not have any indication the message was
  actually read/received by the user.
  Developer Note: Wildcat Mail Clients accessing the message header will
  not increment the read count. It is only incremented when accessing the
  message text using the SDK function GetText() or when an unreceived
  message is finally marked received using the SDK function
  MarkMessageRead().
- Added output redirection to WCRUN.EXE.
  It is now possible to redirect output to a file using the redirection
  ">" character like so:
          wcrun -r reportmaker.wcx > report.log
  You will not see anything on the screen when output is redirected.
  PLEASE NOTE:
  1) Input redirection "<" is not supported.
  2) Output redirection is best used for non-interactive wcx
     applications, programs which do not wait for user input.
- The wcBASIC html-uploadprocess.wcc module was changed to fix a problem
  where it was not deleting the current internal file listing cache
  preventing an immediate or refreshed file listing to include the new
  file upload in the listing.  The user would not see the new listing
  until the user connection was broken.
- WCBASIC
- Updated disp\sysfile.bbs to support the new "Private File" feature
- Updated wcConfig to support the "Allow Private Files" in File Areas.
- Updated upload.wcc to support the "Private Files" prompt when uploaded
  a private file for a user.
- New field: TConfDesc.DefaultFromAddress.
- In wcBASIC, you can now access other sections in the extended user
  database in the same manner you could for the "profile" section of the
  extended user database.
  The "Extended User Database" is basically similar to a registry system
  where you have Sections, Keys in Sections and values for each key, like
  so:
       [profile]         <<<< section
       key1=value1
       key2=value2
       [anothersection]  <<<< section
       key1=value1
       key2=value2
  In Wildcat!, we normally use the extended user database to add
  additional information for user records.  wcBASIC offers easy access to
  the "profile" section using the User.Profile() and the SetUserProfile()
  commands.
  For example:
      SetUserProfile("fruit","apple")
      ...
      dim fruit as string = user.profile("fruit")
      print "your favorite fruit is: ";fruit
  The data is stored in the [profile] section of the extended user
  database.
  However, gaining access to the other sections required that you
  import the SDK functions GetUserVariable() and SetUserVariable()
  functions from the wcsrv.dll dynamic link library.
  This isn't necessary anymore with the new commands:
      User.Variable(section,key,defaultvalue)
      SetUserVariable(section,key,value)
  You would use these in the same manner as you did with profile,
  however now, you provide the name of the section as the first
  parameter to the commands.
  For example:
      SetUserVariable("MySection","Key1","Value1")
      ...
      print "key1 = "; User.Variable("MySection","Key1")
  Note: Whenever you update the extended user database, you must call
  UpdateUser() in order to commit the user data to disk.
- New Core Engine functions
  -------------------------
  Function ValReal(string) as Real
    Converts a string to a real number. The existing Val() function
    returned an integer thus truncated a string which was a alpha-
    numeric real number.  Example:
      dim totalcost as real  = valreal("29.95")*100
  Function SubSt(src as string,tar as string,rep as string) as string
    Find the target string "tar" in src and replace all occurences with
    the string rep. case sensitive.  Note, this is function overload for
    the existing subst() function which uses a position and length
    parameter for the target. For developers who don't know what function
    overloads are, they are functions which have the same name but
    accept different parameters.
    Return the final string.
  Function GetCallTypeStr() as String
    Return the call type in a string format.  Good for display purposes.
  Function PrintDebugWindow(s as string) as boolean
    Print the string s in a special debug window (wcDebugWin.exe must be
    running). Ignored if the debug window is not active.  Good for
    debugging a wcx application during development.
  Function GetIpAddress(host as string) as Long
    Return the IP address for the host string. If host is blank, then
    the local machine IP is returned.
  Sub SetUserVariable(section as string, key as string, value as XXXX)
     This command will save the value as a key in section in the
     user's extended database.  This function is basically the same
     as SetUserProfile(key,value) with section="profile".
     Value can be the following type:
         value as boolean
         value as integer
         value as string
     To read the section and key, use the user record field called
     Variable as so:
         dim s as string  = User.Variable(section,key)
         dim i as integer = User.Variable(section,key)
         dim b as boolean = User.Variable(section,key)
  Replaced Functions/Modules
  All the templateXXXX functions in HTMLTEMPLATE.WCH were replace with
  core engine functions.  HTMLTEMPLATE.WCH is now deprecated (not required
  any more).  It is still provided for source compile compatibility but
  it does nothing since the functions are globally available.
  Obselete Modules: The following five (5) WCX modules distributed with
  wcEvent are no longer used:
        belloff.wcx
        bellon.wcx
        pageoff.wcx
        pageon.wcx
        system.wcx
  These 5 modules were removed and replaced with a single module called
  WcEventHelper.wcc.  The compiled wcEventHelper.wcx is now part of the
  default wildcat library allowing all customers to use it.
  How to use this module:
  In your wcEvent jobs, simple call wcEventHelp.wcx or call a
  batch file to run the following:
      wcrun -r wceventhelper options
  where the possible options are:
      bellon
      belloff
      pageon
      pageoff
  Examples:
  Turn off Page
     wcrun -r WcEventHelper PageOff
  Turn On Bell, Turn off Page
     wcrun -r WcEventHelper BellOn PageOff
  New Core Engine Libraries (see the wch file for usage)
  ======================================================
  StrLib.wch             Miscellaneous String functions
  WinRegistry.wch        Win32 registry functions
  datelib.wch            Miscellaneous Date/Lib functions
  wcodbc.wch             ODBC database functions
  Logfile.wch            functions for activity logging
  htmlutil.wch           functions for HTTP GET/POST request processing
  New Core Engine Modules
  =======================
  WcEventHelper          Module for WcEvent Events.
  wcBASIC compiler
  ----------------
  Compiler pragma directives:
    #pragma once                   compiles header file only once
    #pragma exclude                exclude module (non-library) from menus
  Conditional compilation directives:
    #define tag
    #undef tag
    #ifdef tag or #ifndef tag
    #else  or #elseif tag
    #endif
  Compiler pragmas are special commands normally found in native
  languages like c/c++.  They are used to set special compiler
  instructions.
  A small set of pragmas are defined for Wildcat:
  #pragma once
     This pragma is typically added to the top of header files
     to inform the compiler not to include it again.  There
     are times where you might have included a header file
     more than once indirectly thru another header file. This
     is not incorrect and is normally good practice to have
     a well modulized set of header files which automatically
     include what they required.
     However, without this pragma, you would get a compiler error
     saying "something was already defined".  For example, see
     wsockhlp.wch and winsock.wch header files. wsockhlp.wch
     includes winsock.wch.  If you included winsock.wch again
     in the main module, you would get a compiler error. With
     the #pragma once line added to winsock.wch, the compiler
     will not include it again.
  #pragma exclude
     Non-library modules are listed in the menu access list
     box allowing you to select the access for each module. However
     some modules are designed to be run from the WCC command line
     and there is no need to list them.  It doesn't hurt to have
     them there but it would be cleaner to "exclude" from the list.  This
     pragma will achieve this purpose. Use it for "stand-alone" modules.
  Conditional Directives:
  Now it is possible to create #define tags to perform conditional
  compilation.  To best understand the need for this, consider
  how you would attempt to do this now without conditional directives:
      const debugEnabled = FALSE
      if DebugEnabled then
         print "Debug version"
      else
         print "Non-Debug version"
      end if
  with conditional directives, you would do:
     #define DebugEnabled
     #ifdef DebugEnabled
         print "Debug version"
     #else
         print "Non-Debug version"
     #endif
  The difference?  In the first case, the entire program is compiled
  and in the second case, only the lines which satisfy the condition
  are compiled.  In other words, you will have a smaller program.
  This is a simple situation.  But you can also use compiler
  directives to support multiple different versions of your
  applications.  For example:
     #define VERSION1
     //#define VERSION2
     //#define VERSION3
     #ifdef version1
         print "compiling for version1"
     #elseif version2
         print "compiling for version2"
     #elseif version3
         print "compiling for version3"
     #else
         // Force compiler error using syntax error
         Version not defined!
     #endif
  With the above example, you can simple change the define statement
  to compile the parts of the code you want.
  Special Note:
  In c/c++ a #define tag could be used for substitution in the
  code, for example:
       #define tag  value
       printf("tag=%s",tag);
  Then whereever in the program the tag appears, it would be
  replaced with value.
  This is not the case in wcBASIC. You can not use #define to place
  values in the source code.
  However, you can accompish the same task by using the CONST keyword
  instead like so:
       const tag=value;
       print "tag=";tag
  The #define tag statement in wcBASIC is simply for usage with
  conditional directives (#ifdef, etc).
//