View Single Post
Old 05-24-2008, 04:02 AM  
Yil
Too much time...
 
Join Date: May 2005
Posts: 1,194
Default

Code:
v6.5.0 Release Notes:

*** INCOMPATIBILITY WARNING ***

This version of ioFTPD introduces a large number of changes to the UserFile
structure in memory and the associated UserFile on disk.  I have kept the
existing shared memory interfaces byte compatible with previous releases, but
added new function identifiers (DC_NEW_USERFILE_*) so newer shared memory
applications can access the new fields in the UserFiles.  This should mean all
existing 3rd party compiled .exe files will still work although they will be
limited to using 10 sections.  ioGUI2 using shared memory, for instance,
appears to be working fine, however I still believe it is better to use the
.itcl interface of ioGUI2 (and this is the default) since you can connect
remotely that way and you get accurate idle times, etc.

WARNING: nxShareDB as a user module manipulates UserFiles directly and as such
doesn't stand a chance of working and will likely corrupt your user database.
Wait for a new version before upgrading to v6.5 if you use this!

TCL based scripts usually use the iTCL commands to open/close/lock/etc
UserFiles and the ascii2bin and bin2ascii functions to parse them.  Since
these functions have been updated I don't believe TCL based scripts should
have any issues, but I've been wrong before so report any problems.


*** SCRIPT CONFLICTS ***

There are a number of new built-in site commands.  You can choose to use the
new ioFTPD versions by removing the your reference to the 3rd party script
under FTP_Custom_Commands, or you can use the new "^" prefix to disable the
ioFTPD internal version and continue using the external script.  You should
pick one or the other as running both is probably a bad idea!  See the
detailed ChangeLog below for details on the ^ prefix.

* site who is now a built-in command.  This conflicts with the venerable
  SiteWho.exe addon, nxTool's site who, ioB's site who, and a bunch of
  similar scripts.  See below for configuration options.

* site open/close are now built-in commands.  This conflicts with nxTool's
  open/close.  See below for configuration options.

* site purge/readd are now built-in commands, and site deluser has changed.
  This conflicts with ioDELUSER.


---------


*** File Modifications:

1) Files in \system:
   Changed: ioFTPD.[exe,pdb] - Version 6.5.0.0
   Changed: tcl85t.[dll,pdb] - Version 8.5.2.2
   Changed: ioFTPD.ini - summary of changes by section...
    [Devices]              : *telnet reference removed*
    [Services]             : *telnet reference removed*
    [Sections]             : *comments changed*
    [FTP_Custom_Commands]  : *comments changed*
    [FTP_SITE_Permissions] : open, close, purge, re-add, who, swho
                           : *alphabetical now*
    [Change_Permissions]   : Expires, LimitPerIp, MaxDownloads, MaxUploads,
                             Opaque, showjobs (deleted)
    [FTP]                  : Close_Exempt, Who_Hidden_Users, Who_Hidden_Paths_#
    [Events]               : *comments changed* OnClosedLogin, OnClosedKick,
                             OnDeletedLogin, OnDeletedKick, OnExpiredLogin,
                             OnExpiredKick, OnUnknownLogin,
                             OnTelnetLogIn (deleted)
    [Telnet_Service]       : *deleted*
    [Telnet]               : *deleted*
    [Telnet_Binaries]      : *deleted*
    [Telnet_Binary_Permissions]  : *deleted*
    [Telnet_Command_Permissions] : *deleted*

2) Replace the lib\ directory entirely with the new tcl v8.5 version which
   should have 2 new directories tlc8 and tcl8.5.

3) Files in \text\ftp:
   Added   : ClientInfo.[Common, List]
   Changed : ClientInfo.[Download, Idle, Login, Upload]
   Changed : ClientList.[Download, Header, Idle, Login, Upload]
   Added   : ClientList.[Footer, List]
   Added   : DeletedKick
   Added   : ExpiredKick
   Deleted : Free
   Added   : ServerClosed
   Added   : ServerStatus
   Changed : UserInfo
   Changed : UserList.[Body, Header]
   Added   : UserList.Footer
   Added   : Who.[Download, Footer, Header, Idle, List, Upload]

4) Files in \etc:
   Changed : Hosts.Rules

5) Files in \doc:
   Changed : itcl.txt
   Changed : cookies.txt

6) Replace the entire source\include directory with the new one.


*** New Features:

7) The number of sections the server supports has been raised from 10 to 25.
   The [Sections] documentation in ioFTPD.ini has been updated with much
   more detailed examples.

8) New ioFTPD.ini [Events] feature.  You can now use "!" to indicate that a
   particular event should display a message file to the user much like you
   can do inside FTP_Custom_Commands, etc.  The [Events] documentation
   has changed to reflect this feature.

9) New [FTP_Custom_Commands] feature ("^").  You can now prefix events with
   "^" which turns on the override option which means that the server should
   not try to execute any built-in site command of the same name as the
   trigger.  The [FTP_Custom_Commands] documentation changed.

10) New [FTP_Pre-Command_Events] and [FTP_Post-Command_Events] feature.  You
    can now define pre/post events on site commands.  This includes built-in
    commands! Just prefix the name of the site command with '@' in
    FTP_Pre-Command_Events or FTP_Post-Command_Events.  The order for site
    command processing now looks like this.
    
     1) Validate access to command via FTP_SITE_Permissions.
     2) Process @cmd events in FTP_Pre-Command_Events and return failure on
        the first error encountered.
     3) Process matching events from FTP_Custom_Commands, until one returns
        an error in which case the command is considered to have failed so
        return failure.
     4) Run the internal site command of the same name if one exists and no
        event included the ^ prefix.  If the internal site command is executed
        and returns an error then return failure.
     5) Process all @cmd events in FTP_Post-Command_Events ignoring failures.

11) Site rename, delete, addip, deleteip, userinfo, kick and all site change
    commands have been modified to prevent pure group admins (G and not 1M
    flagged users) from performing any actions on 1M flagged users who
    happen to be in their group.

12) New type of cookie that's not only super, it's downright amazing! :)
    The new amazing %[IF] super cookie supports simple conditional logic!
    
    The first form: %[IF(cookie)(EQUAL)(string)(true-action)(false-action)]

    Here <cookie> is any text, mangled cookie and/or mangled supercookie
    whose textual output is compared to <string> and if a match then the
    mangled <true-action> is evaluated else the mangled <false-action>, if
    present, is evaluated.  Mangled in this context means a simple character
    replacement where the following changes are made to the string before
    processing.  {{'s are replace with {, }}'s with }, {}'s with []'s,
    << with <, >> with >, and <>'s with ()'s.  This is necessary because the
    cookie parser is pretty dumb and making it stateful isn't worth the
    hassle it would take.

    Example:
      %[IF(%{$VFS})(EQUAL)(<default>)()(| VFS      : %-60{$VFS} |)]
    Read this as if %[$VFS] evaluates to <default> then don't print anything,
    else pretty print a formatted VFS field.


    The second form: %[IF(super-cookie)(THEN)(true-action)(false-action)]

    Here <super-cookie> is a syntax mangled super cookie which evaluates
    to true if no error in parsing takes place and at least one character
    would have been printed, else it's false.
    
    Example:
      %[IF(%{sectionname<0>})(THEN)(| DAYUP: %7.0{dayup<bytes><mega><0>} |)]
    Read this as if a name can be found for section 0 (which means it has
    an entry in ioFTPD.ini) then print the number of megabytes the user
    uploaded into section 0 today.

    NOTE: with appropriate formatting you CAN enclose an %[IF] inside the
    true/false clause of another %[IF] although it looks ugly...  See the
    UserInfo file for examples of this.

13) New message super cookie (%[RemoveBlankLine]).  Because of the way the
    message parser works a line that contains only a %[IF] super cookie that
    evaluates to nothing will result in a prefixed (i.e. "200-") empty line.
    If this isn't desired use this super cookie at the end of the line and
    it will erase the prefix and return character thus eliminating the line.

14) Updated site command (site shutdown [cancel|now|<seconds>]).  If you issue
    "site shutdown now" or "site shutdown 0" the server responds as before and
    immediately begins terminating all connections and exits.  If, however,
    you don't specify any arguments (assumes default of 300), or you specify
    a number, the server will consider this the length, in seconds, of the
    grace period to allow for the orderly logging out of connected users.
    After the grace period expires the server will revert to terminating all
    connections and then exiting.  During the shutdown grace period non-M
    flagged users will be prevented from logging in and will be informed
    that the server is shutting down as the reason why.  All currently logged
    in non-M flagged users, except the user who initiated the shutdown command
    if you allow non-M users access to the command, will be logged out as soon
    as they try to enter a command after their current transfer, if any, is
    completed.  Once the user who initiated the shutdown is the only user left
    online the server will exit even if the grace period hasn't expired.  If
    the server doesn't immediately exit because it is waiting for someone to
    log off you can use the "site shutdown cancel" command to stop the
    shutdown sequence.

15) New message super cookie (%[ShutdownGrace]).  This returns the number of
    seconds until the server shuts down or 0 if it isn't shutting down.

16) New site command (site close [-kick|-new] <msg>).  This command is used
    to prevent non-exempt users (see Close_Exempt below) from logging into
    the server, and optionally to force already connected non-exempt users
    to be logged out.  If neither -kick or -new is specified then site close
    will default to gracefully logging users off as soon as they try to enter
    a command after their current transfer, if any, is completed.  The
    optional <msg> argument can be used to provide a reason for the closure.
    Before logging a user off gracefully the server will call the
    "OnClosedKick" event which, if used in the default configuration below,
    will display the time since the server closed along with the reason if
    one was specified.  If the -new argument is supplied then the server will
    only prevent logins from new non-exempt users and will not logoff existing
    users.  The -kick argument will immediately close the connections and
    terminate any transfers of non-exempt users and is therefore not
    considered graceful.  Non-exempt users trying to login to a closed server
    will see the results of the "OnClosedLogin" event, as well as having the
    login denied with the following error: "Server is closed".

17) New site command (site open).  This command returns to normal a previously
    closed server.

18) New ioFTPD.ini option (Close_Exempt under [FTP]).  This is a permission
    style expression which should match users who are allowed to login to
    a closed server.  Default is 1M flagged users, although adding "-sitebot"
    (if you use one) probably makes sense.

19) New ioFTPD.ini settings (close, open under [FTP_SITE_Permissions]).
    Both close and open are set to "1M", but this setting should match whoever
    is listed in Close_Exempt since anyone who closes a server who isn't
    exempt will get kicked off and be unable to open it again.

20) New message cookie (%[$ClosedOn]). Returns the time() the server was
    closed or 0 to indicate the server is open.

21) New message cookie (%[$ClosedMsg]). Returns the <msg> argument to site
    close if one was provided.  Only valid if $ClosedOn != 0.

22) New ioFTPD.ini event (OnClosedKick, OnClosedLogin under [Events]).
    OnClosedKick is run when a non-exempt user is about to be logged off
    gracefully because the server has been closed.  OnClosedLogin is run when
    a non-exempt user tries to login to a closed server.

    The suggested settings are:
       OnClosedKick   = !..\text\ftp\ServerClosed
       OnClosedLogin  = !..\text\ftp\ServerClosed

    The ServerClosed file just prints the time since the close command and
    optionally the reason for the server being closed.
      "Server closed <time since close> ago [for <reason>]

23) New server status updating feature (..\text\ftp\ServerStatus).  Because
    M flagged master accounts will never be kicked from a server or denied
    the ability to login even if the server is shutting down they have no
    way to know what is going on.  Similarly, exempt users on a closed server
    have no idea if they should be getting off.  Therefore the server will
    now attempt to display the ServerStatus message file whenever a user
    changes directories, finishes transferring a file, or issues a NOOP
    command IF the server status is closed or in shutdown mode.  By default
    the file is setup to display the appropriate line or lines based on the
    server's status with an extra blank line before and after if something
    was printed.

       *** SERVER IS SHUTTING DOWN *** -- <grace-left> seconds remaining

       *** Server CLOSED <time-since-close> ago -- Reason: <reason>

24) Updated site command (Site deluser <user> [<msg>]).  Deluser now works
    more like glftpd does in that site deluser must be followed by a site
    purge to actually delete an account.  Previously this command would delete
    the UserFile as soon as possible, but it now simply marks the account as
    deleted by recording the user who deleted it, the time it was deleted,
    and, as a new feature, it also takes an optional <msg/comment> argument
    will show show up when the user is viewed via site uinfo, or when the user
    is shown in a list via site users, site purge, site readd, etc.  Deleted
    users are prevented from logging in and you can configure how the system
    should respond to such events (see below).  For example you can choose to
    show a file (in which you can refer to the <msg> argument) or just return
    an error indicating the account has been deleted, or hide the deleted
    status altogether and just return the generic invalid password error reply
    as would previously have happened.  A currently logged in user who is
    deleted will be forced off at the next command after any active transfer
    completes.  Group memberships are maintained until the account it purged
    so group counters are not immediately updated.  If you site deluser on an
    account already marked for deletion only the <msg> field is updated.

25) New UserFile field (DeletedOn). This is the unix style time() when the
    account was marked for deletion.  0 implies the account has not been
    marked/deleted.

26) New message cookie (%[$DeletedOn]). Returns the setting in the UserFile.

27) New UserFile field (DeletedBy). This is the UID of the user who deleted
    the account.  Field not valid unless DeletedOn != -1.

28) New message cookie (%[$DeletedBy]). Returns the setting in the UserFile.

29) New UserFile field (DeletedMsg). This is the optional <msg> argument
    provided to site deluser.  Field not valid unless DeletedOn != -1.

30) New message cookie (%[$DeletedMsg]). Returns the setting in the UserFile.

31) New ioFTPD.ini event (OnDeletedKick under [Events]).  This is shown to a
    user when they are being logged off gracefully because their account has
    been deleted.  Default is !..\text\ftp\DeletedKick which just contains a
    simple "Account has been deleted." message with some extra line padding.

32) New ioFTPD.ini event (OnDeletedLogin under [Events]).  If a user tries to
    login to a deleted account this event is called.  If not defined the user
    will see the error message "Account has been deleted".  If defined but
    returns an error it will print any text in the buffer, but the user will
    see the error message "Invalid Password". Therefore a simple way to
    achieve the old behavior of a deleted account returning the generic
    invalid password error is to just use the new !messagefile syntax and
    point to a non-existent file.  The event is run in the context of the
    deleted account and therefore you can refer to any UserFile cookies you
    want including the new DeletedMsg cookie which holds the <msg> argument
    passed to deluser so you can show it to the user if you want.  Default is
    a commented out undefined placeholder.

33) New site change command (site change <who> expires <arg>).  ioFTPD now
    supports temporary accounts.  To set an account to expire at a particular
    time use site change <who> expires with one of the following <args>:
      yyyy-mm-dd           : expires at the start of the identified day
      yyyymmdd[hh[mm[ss]]] : expires at the start of the identified day
                             or optionally at a specific time on that day
      +h*                  : expire h hours from now
      never                : account permanent and shouldn't expire

    Expired accounts are not automatically deleted, but will show up under
    site readd or site purge listings (see below) once they have expired and 
    will indicate that they are expired with the new text\ftp\UserList.Body
    file installed.  Expired accounts are prohibited from logging in, and
    already logged in users will be forced off the same as if the account had
    just been deleted.

34) New ioFTPD.ini settings (Expires under [Change_Permissions]).
    Default set to "G1M".

35) New UserFile field (ExpiresAt).  time() at which the account should
    expire.  0 implies a permanent account.

36) New message cookie (%[$ExpiresAt]).  Returns the time() at which the
    account should expired.  0 implies a permanent account.

37) New message super cookie (%[Expired]). Prints 1 if the account has
    expired, 0 if it hasn't expired but does have an expiration time, and
    prints nothing if the account is permanent.  Useful for %[IF] processing.

38) New ioFTPD event (OnExpiredKick under [Events]).  This is shown to a user
    when they are logged off because their account just expired.  Default
    is !..\text\ftp\ExpiredKick which just contains a simple "Account has
    expired." message with some extra line padding.

39) New ioFTPD.ini event (OnExpiredLogin under [Events]).  If a user tries to
    login to an expired account this event is called.  If not defined the
    user will see the error message "Account has expired".  If defined, but
    the event returns an error, the user will see the error message "Invalid
    Password".  The event is run in the context of the expired account.
    Default is a commented out undefined placeholder.

40) New site command (site purge [<user|*>]).  Site purge without any
    arguments lists the users who have been deleted and the accounts that have
    expired that are available for purging by you.  The "by you" is important
    because there are now rules on who can purge who beyond having been
    granted access to the command in the .ini file.  Master (M flagged)
    accounts can purge anyone, siteop (1 flagged) accounts can purge non-1M
    accounts, and pure group admins (G but not 1M) can only purge regular
    users in groups they admin.  With this system in place a siteop can site
    deluser another siteop, or a pure group admin another pure group admin in
    their group, and this will prevent those users from logging in, but it
    will take someone more superior to actually complete the account deletion.
    Site purge <user> will purge a particular user, and site purge * will
    purge all you have access to.

    NOTE: Make sure you update the ..\text\ftp files because site purge/readd
          only identify the reason the user matched (i.e. deleted or expired)
          because the new UserList.Body file makes use of %[IF].

41) New site command (site readd [<user>]).  Site readd without any arguments
    lists the users who have been deleted and the accounts that have expired
    that are available for re-adding by you.  The rules for re-adding are
    looser than those for purging.  All 1M flagged users can re-add anyone,
    and pure group admins can re-add members in their admin groups provided
    the target isn't a 1M flagged user.  Re-adding an expired account turns it
    into a regular account without any expiration date.

42) New ioFTPD.ini settings (purge, readd under [FTP_SITE_Permissions]).
    Both close and open are set to "G1M", but remember access to the command
    does not guarantee you can execute it against particular users.  See the
    rules above.

43) New site command (site who [up|down|idle|bw|<users>]).  Site who differs
    from site swho in that it is designed to be used by non siteops and
    therefore displays only non-sensitive data and can be configured to hide
    users entirely, and/or obscure matching paths with the text <hidden>.  It
    also obscures the last command for each connection so that site commands
    show up only as "site command" without any arguments, and the PORT and
    PASV arguments are hidden as well.  The PASS command is already obscured
    everywhere even with site swho.

    The following optional arguments are available:
      up      : just show uploaders
      down    : just show downloaders
      idle    : just show idlers
      bw      : just show header/footer for summary information
      <users> : a "site users" style list (.FLAG, =group, name*, !, etc) to 
                limit display to just matching users

44) New ioFTPD.ini option (Who_Hidden_users under [FTP]).  Users who match
    this expression will be hidden from site who listings.  Format is similar
    to site users, i.e. name, name*, =group, .FLAG, !something, etc

45) New ioFTPD.ini option (Who_Hidden_Paths_# under [FTP]).  Up to 20 path
    entries may be provided and matching virtual paths for CWD or file being
    transfered will be replaced with "<hidden>" it a match is found.

46) New ioFTPD.ini settings (who under [FTP_SITE_Permissions]).  Default set
    to "!A *" which is all non-anonymous users.

47) Updated site command (site swho [up|down|idle|bw|<users>|<cid>]).
    Previously this command took no arguments for a list of users, or one
    number which represented the connection-id to display more detail on.
    It now accepts the same optional arguments as site who to limit the
    list of users to display.  The new text\ftp\ClientInfo.* files used with
    "site swho <cid>" now display a lot of what "site uinfo" shows so you can
    see details on the account along with connection details and the current
    action.  The new text\ftp\ClientList.* files also display more information
    about what each user is doing and in a nicer format.

48) Modified ioFTPD.ini setting (swho under [FTP_SITE_Permissions]). Removed
    the "G" flag from default permissions for site swho because site who
    should be sufficient now.

49) Updated site command (site bans remove <IP|mask>).  Site bans remove
    now accepts a wildcard IP mask instead of only a fully qualified numeric
    IP address.  Thus "site bans remove *" will remove all active bans.

50) New ioFTPD.ini settings (NonLeech under [Change_Permissions]).
    Default set to "1M".  This was missing from previous releases.

51) New site change command (site change <who> MaxDownloads <arg>).  ioFTPD
    now allows you to control the number of simultaneous downloads a
    particular user may have active at any one time across all their logins.
    An <Arg> of -1 implies unlimited, 0 means the user can't download at all.
    For existing accounts that predate this field the value is set to the
    default of -1.  This only affects the number of downloads an account can
    have active at one time, and not the total number of allowed logins for
    that user.

52) New site change command (site change <who> MaxUploads <arg>).  ioFTPD
    now allows you to control the number of simultaneous uploads a
    particular user may have active at any one time across all their logins.
    An <Arg> of -1 implies unlimited, 0 means the user can't upload at all.
    For existing accounts that predate this field the value is set to the
    default of -1.  This only affects the number of uploads an account can
    have active at one time, and not the total number of allowed logins for
    that user.

53) New ioFTPD.ini settings (MaxDownloads, and MaxUploads under
    [Change_Permissions]).  Default set to "1M" for both.

54) New UserFile fields (MaxDownloads and MaxUploads).

55) New message cookies (%[$MaxDownloads], and %[$MaxUploads]). Returns the
    setting in the UserFile.

56) File Hosts.Rules changed to allow everything by default.  In particular
    it is important to update the connections_per_ip to be -1 to disable
    this feature because the previous limit of 4 connections per IP was just
    too low if you wish to allow mass downloading, or mass uploading while
    just allowing a single download per user.

57) New site change command (site change <who> LimitPerIp <arg>).  ioFTPD
    now allows you to control the number of simultaneous logins an account
    may have active at any one time from a single IP address.  This check is
    performed at password verification time and is a per user setting.  The
    connections_per_ip setting in the Hosts.Rules file is across all users
    from a particular IP address and thus is a stronger guarantee.

58) New ioFTPD.ini settings (LimitPerIp under [Change_Permissions]).
    Default set to "1M" for both.

59) New UserFile field (LimitPerIp).  Max number of connections from a single
    IP address.

60) New message cookie (%[$LimitPerIp]). Returns the setting in the UserFile.

61) New site change command (site change <who> opaque <args>).  ioFTPD
    now allows you store up to 256 characters of extra data in a UserFile.
    The server does nothing with this field except preserve its contents in
    the UserFile in the hope that someone will find it useful.  To encourage
    compatibility the suggested format is TCL style quoted fields so it can
    be easily parsed.  

62) New ioFTPD.ini settings (opaque under [Change_Permissions]).  Default set
    to "1M" although it likely on scripts/sitebots will need access.

63) New message cookie (%[$Opaque]). Returns the setting in the UserFile.

64) New UserFile field (CreatorUid).  This is the UID of the creator of the
    account.  For existing accounts that predate this field the UID is -1.

65) New UserFile field (CreatorName).  This is the name of the creator of the
    account at the time of creation.  The reason this field exists is that
    the user who created this account may be deleted at some point and thus
    the server would be unable to lookup the creator's UID anymore.  For
    existing accounts that predate this field the name is left blank.

66) New message cookie (%[$Creator]). Returns the current name of the UID
    who created the account (the CreatorUid field) if it can be resolved.
    If it can't, but a name was cached in the CreatorName field then return
    that.  Finally return the string "<unknown>" which is the default
    behavior for accounts created before this field was introduced.

67) New UserFile field (CreatedOn).  This is the unix style time() when the
    account was created.  For existing accounts that predate this field the
    time is set to 0.

68) New message cookie (%[$CreatedOn]). Returns the setting in the UserFile.

69) New UserFile field (LogonLast).  This is the unix style time() when the
    account last successfully logged into the server.  For existing accounts
    that predate this field the value is set to 0 until the first login where
    it will be tracked normally from there on.

70) New message cookie (%[$LogonLast]). Returns the setting in the UserFile.

71) New UserFile field (LogonCount). This is a count of the total number of
    times this account has successfully logged into the server.  For existing
    accounts that predate this field the value is set to 0 and will increment
    normally from there on.

72) New message cookie (%[$LogonCount]). Returns the setting in the UserFile.

73) New UserFile field (LogonHost). This is the ident@hostname/IP of the
    last successful login to this account after Obscure_Host/IP have done
    their job.  For existing accounts that predate this field, or for newly
    created accounts, this value will be equal to "".

74) New message cookie (%[$LogonHost]). Returns the setting in the UserFile.

75) New message cookie ($VFS).  This returns the user's VFS file setting.  It
    was missing from previous versions.

76) New message cookie ($FTPLogins).  This returns the number of times the
    user is currently logged into the FTP service under this account.

77) New message super cookie (%[SharedCredits(suffix)(section)]).  This is
    very similar to the %[Credits] super cookie.  However if the section is
    setup to share credits with another section instead of using it's own,
    this will print "Shared (#N)" where N is the section whose credits are
    being used.

78) New message super cookie (%[SectionName(section)]).  This will print out
    the name/<alias> defined in ioFTPD.ini for the first entry whose stats
    section field matches the requested section number.  This is useful to
    print section names in server responses or UserInfo requests.

79) New message super cookie (%[HasFlag(flags)]).  This returns "1" if the
    UserFile contains at least one of the indicated flags else it prints
    nothing.  Only really useful for %[IF] processing.

80) New message super cookie (%[CallerHasFlag(flags)]).  This returns "1" if
    the user who called the command (rather than the current UserFile)
    contains at least one of the indicated flags else it prints nothing.
    Only really useful for %[IF] processing.  Currently this is limited to
    commands which load JUST a UserFile other than their own such as site
    readd, purge, uinfo, groupinfo, and users.  Site who/swho, etc load both
    a UserFile and Online statistics and are not currently supported.

81) New message super cookie (%[Duration(time1)(time2)(extra)(lastfield]).
    This command displays the time between time1 and time2 (defaults to 0
    if not specified) in y, w, d, h, m, s form.  The Extra field is additional
    text to print as part of the result after the duration is printed and
    can be "" if necessary.  If lastfield is specified this will stop the
    output after the indicated field has been printed.  Thus "d" will only
    print years, weeks, and days.

82) New message super cookie (%[WHO(VIRTUALDATAFILE)]).  This cookie shows
    just the filename (no path) of the currently active transfer for the user.

83) If a user is thrown off for exceeding the ioFTPD.ini setting for
    Login_Attempts tries at logging in then an error message is generated to
    Error.log:
      "Host 'ident@obscured_ip' (obscured_hostname) had <Login_Attempts>
       failed login attempts - last user was '<username>'."
    Multiples of these with different usernames should indicate someone is up
    to no good.

84) The following login failure error messages are now rate limited.

      1) Host '%s@%s' (%s) did not match any of user '%s' allowed hosts.
      2) User '%s' tried to login with improper rights to service '%s'.
      3) User '%s' (%s@%s) tried to login with invalid password.
      4) Warning: Group file for group '%s' does not exist, or is corrupted.
      5) VFS file '%s' is invalid or missing.
      6) Ini entry 'Default_VFS' under 'Locations' is missing.
      7) User '%s' does not have access to root directory.
      8) Host '%s@%s' (%s) had %d failed login attempts - last user was '%s'.

    The rate limiting is similar to that used for connection rejections
    however the timer is shared between all 8 error messages.  It will,
    however, always print an error message type (1-8) from each IP that is
    different from the one last printed.  Thus lots of say type 3 messages
    until the user guesses his password might be suppressed and a long delay
    before the next would be printed won't suppress the #7 bad root dir error.

    I got tired of seeing lots of bad password, bad hostmask errors in my
    logfiles as users tried to connect over and over...

85) New ioFTPD.ini option (Log_Suppression_Increment under [Network]).  This
    is the number of minutes to increase the delay between each suppressed
    message up to Max_Log_Suppression. Default is 1 additional minute per.

86) New options to the iTCL change command (Expires, LimitPerIp, MaxDownloads,
    MaxUploads, NonLeech, Opaque).  All of these take the same arguments as
    the similarly named site change command described above.

87) iTCL waitobject changed.  The design of this just sucked.  It's broken
    for all but trivial uses of a simple fixed name lock that is never
    deleted.  I'll remind readers I had no part in this thing!!!  If you
    attempt to use a dynamically named lock and clean up after yourself
    it breaks.  In this example the number in parens is the internal
    reference count, and because there is no way to tell if open created the
    lock which gives it 2 references to start with, or just opened an
    existing lock which adds 1 reference you can see what happens...

    thread 1         thread 2
    --------         --------
    open "test"(2)
                     open "test"(3)
    close "test"(2)
    delete "test"(1)
                     close "test"(0)
                     delete "test"(DOH!)


    Even if open returned an indication of a new lock verses an existing
    lock or the reference count was always incremented twice the fact that
    the delete operation always removes the name from the list of known
    locks will cause problems as shown here:

    thread 1         thread 2       thread 3
    --------         --------       --------
    open "test"
                     open "test"
    close "test"
    delete "test"
                                    open "test" (DOH!)

    Therefore I have removed the delete operation and made the close operation
    do the work of both.  It closes the local reference to the lock, and if
    there are no other open references it deletes the lock as well.  This
    should solve the above problems.

88) New iTCL waitobject function (preserve).  Because the cleanup code run
    after a script exists automatically closes any local references to open
    locks that you haven't explicitly closed already by the script it is
    now impossible, with the above change, to have a lock that outlives the
    current script invocation.  To solve this the "preserve" operation simply
    increases the internal reference count by 1 which means it won't be
    deleted until you later call close twice on it.

89) New iTCL waitobject function (list).  Useful really only as a debugging
    tool this command will return a list of the names of all known TCL locks.

90) New ioFTPD.ini event (OnUnknownLogin under [Events]).  If the USER command
    entered by the user during login refers to an unknown user name then this
    event will be called.  If it returns true, which normally would indicate
    an error, the user lookup is performed again.  The addition of this event
    should allow the dynamic creation of new user accounts which may be useful
    if there are thousands of them stored in an Active Directory or other 3rd
    party database and waiting to import them until they have been referenced
    makes sense.  Also useful in conjunction with a shared user module that
    doesn't expect every account to use the server.  Default is undefined.

91) The shared memory interface now supports the following new identifiers
    DC_NEW_USERFILE_OPEN, DC_NEW_USERFILE_LOCK, DC_NEW_USERFILE_UNLOCK,
    and DC_NEW_USERFILE_CLOSE which work exactly like the DC_USERFILE_*
    identifiers do except they take the new version of the USERFILE structure.
 
92) The shared memory interface has changed the meanings of DC_USERFILE_OPEN,
    DC_USERFILE_LOCK, DC_USERFILE_UNLOCK, and DC_USERFILE_CLOSE which now
    have a context of USERFILE_OLD which is a structure that is byte
    compatible with previous versions of USERFILEs so this change only
    applies to users recompiling their code and not existing executables.

93) The text\ftp\UserInfo file, which is what site uinfo uses to display
    information about a user, has been totally reworked to take advantage
    of the new user fields and makes heavy user of the %[IF] super cookie
    to format the output and hide unimportant information and/or missing
    fields.  It is only setup, by default, to display section based info
    for up to 5 sections.  It won't show info on undefined sections so you
    should only see 1 if that is all you are using.  To support more than
    the default, just edit the file and either remove the %[IF] checking
    since you should know how many sections you are using, or continue to
    use the same style and copy/paste/edit the lines for more sections.

*** Functionality changes:

94) THE SERVER NO LONGER SUPPORTS THE TELNET SERVICE.
    Delete the following sections from the .ini file:
      ;OnTelnetLogIn in [Events]
      [Telnet_Service]
      [Telnet]
      [Telnet_Binaries]
      [Telnet_Binary_Permissions]
      [Telnet_Command_Permissions]
      Reference to telnet under *Devices* and *Services* comments. 

95) The %[include] message super cookie now processes cookies in the included
    file.

96) Deleted ioFTPD.ini setting (showjobs under [Change_Permissions]).  No
    such command.

97) The idle time in site who/swho/etc is now the internal idle timer as
    controlled by Idle_Ignore, etc and not the last time since a command was
    entered.

98) ioFTPD will no longer display the .message file upon entering directories,
    but will continue to display the .ioFTPD.message file which is hidden
    automatically in directory listings, deleted automatically when a
    directory is deleted, etc.  The .ioFTPD.message file is already used by
    most scripts.

99) ioFTPD will no longer process cookies in the .ioFTPD.message files which
    will result in such files no longer having their parsed form cached in
    the \cache directory.  This should be a benefit since they never included
    message cookies anyway.

100) Changed  %[Ratio(section)] super cookie so that if the user has a ratio
     of 0 it will print "leech" instead of "unlimited".

101) Changed %[time(format)(time)] cookie so that if time equals 0 it will
     print "<never>" instead of "Jan 1, 1970...".

102) site rehash now invalidates existing TCL interpreters so that the next
     TCL command will re-create the interpreter for the thread.  The benefit
     of this is you can now setup scripts to avoid reloading files already
     included which offers a significant performance improvement.  If you did
     this previously you would be unable to edit a configuration file or
     script and have the changes show up in existing TCL interpreters until
     the server was restarted.


*** Bug Fixes

103) System error messages are now forced to use US English instead of the
     user/system settings.  This probably makes sense because all the ioFTPD
     specific errors are in English already.  Asian languages and other wide
     character window's builds resulted in things that look like this when the
     unicode conversation failed for window's system error messages:
       426 Connection closed: xxx xxxx xxx x xx xxx x xxxx.

104) Minidumps now contain information open handle information to assist
     in finding the lockup problem.

105) Transfer speed updates only occurred when new data was received and only
     if at least 1 second had passed since the last update or start of the
     transfer request.  It will now update every 100ms which should allow
     fast transfers taking under a second to have a shot at updating the
     transfer speed instead of always reading 0.  The event driven update
     also failed to accurately reflect what was going on when a transfer
     stalled so if no data has been received within 10 seconds a 0 byte
     transfer of 1 ms length is faked so the stalled status can be seen.

106) Site chmod and site symlink would attempt to get information about the
     parent directory of their target and this would fail if the parent
     directory was an NTFS hidden directory that contained the target
     as a mountpoint.  This should now work.

107) The server was missing the ClientInfo.List and ClientList.List files
     which meant that site swho would completely hide a user who was actively
     transfering a directory listing.  Fixed with the new text\ftp files.

108) The tracking of all valid IP address to the server would remove a users
     entries and re-apply then each time a UserFile was closed.  This is
     a waste of time since most likely the UserFile was just updating
     statistics or credits or something.  The before and after hostmasks
     are now compared and if no change is detected then the IP address
     updating is not performed.
Yil is offline   Reply With Quote