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).
//