Modifications to use the new mmlimitrate(3) API
[mmondor.git] / mmsoftware / mmmail / ChangeLog
1 $Id: ChangeLog,v 1.32 2003/10/23 01:01:27 mmondor Exp $
2
3
4
5 Release: mmmail 0.0.24 devl
6 Date   : July 11, 2003
7 By     : Matthew Mondor
8
9 * New features
10   - mailbox-specific statistic counters maintained with mmstat(3) are now
11     unified under mmmail|* rather than separated into mmsmtpd|* and mmpop3d|*.
12   - domain-specific statistic counters are now also maintained which total
13     the number of in/out messages and bytes for all mailboxes of the domain.
14     This is very useful to know how much one can charge for a domain, and/or
15     to generate pie graphics of distribution of bandwidth among the domains.
16   - Added STATFAIL_LOGIN and STATFAIL_PASSWORD configuration file options to
17     mmpop3d(8) which allow to easily detect failed logins.
18   - Added mmpop3d|total|logins mmstat(3) key
19 * Performance enhancements
20   - The configuration file parser was rewritten to be more efficient and
21     to hold cleaner code than the previous one which was migrated from
22     one of my first C programs many years ago :) The configuration files
23     format is now more flexible as well, although the current files will
24     parse properly without modifications still.
25   - mmhash(3) is now used by the command parser for more speed. Any such
26     speed improvement is always welcome when using userspace threads.
27 * Bug fixes
28   - mmstatd(8) and the mmstat(3) library had a bugfix.
29   - The message rate sanity checking host-based cache nodes expireing thread
30     would be awakened unnecessarily too fast, considering FLOOD_EXPIRES as a
31     number of seconds rather than as a number of minutes.
32 * Other
33   - A minor code cleanup was done
34
35
36
37 Release: mmmail 0.0.23 devl
38 Date   : July 1, 2003
39 By     : Matthew Mondor
40
41 * Bug fixes
42   - The IP-address based connection rate and DNS cache expire thread used to
43     sometimes waste CPU cycles looping more often that it should, sleeping for
44     0 seconds between loops. Fixed.
45   - The same was happening to the message rate host-based cache expire thread,
46     which also was fixed.
47   - mmstatd(8) had a bugfix and was upgraded to 0.0.8
48 * Important
49   - The mmstat(3) key names were modified to be '|' separated rather than
50     '.' separated. Although I have been trying to avoid such a change which
51     obviously requires fixing alot of scripts I am using, it was proven with
52     time that the '.' character was too widely used and that '|' was ideal
53     as a replacement. It is not hard to use a script to use the mmstat(8)
54     reset command and convert all old entries to the new type if necessary.
55     As a result, filenames which comport '.' characters for which counters
56     are maintained are much better to handle and to isolate. The same applies
57     to IP addresses. 
58   - The maximum key name length now was bumped from 128 to 256 bytes. As
59     a result, a special log file synchronization will be required as was
60     the case for mmstatd 0.0.7 upgrade (and mmmail 0.0.22 upgrade). This also
61     requires mmstat clients using the mmstat(3) API to be recompiled.
62 * New features
63   - Per-mailbox message/bytes statistics are now being maintained via mmstat(3)
64     in mmsmtpd for incomming messages.
65   - Per-user/box logins/message/bytes/delete statistics are now being
66     maintained via mmstat(3) by mmpop3d.
67
68
69
70 Release: mmmail 0.0.22 devl
71 Date   : June 19, 2003
72 By     : Matthew Mondor
73
74 * Important
75   - Important changes to mmstat(3) and mmstatd(8) were made which require a
76     database synchronization procedure to be performed before upgrading.
77     See mmstatd/ChangeLog for details.
78   - The GROUPS directive in mmsmtpd.conf(5), mmpop3d.conf(5) and
79     mmstatd.conf(5) now expect groups to be comma-separated instead of
80     space-separated. The quotes then of course also become optional if
81     multiple groups are specified. This was made because mmreadcfg(3) library
82     is also used by other of my projects for which comma-separated groups
83     were also required.
84 * Various
85   - Fixed ALIGN_CEIL alignment macros which used to always add bytes even
86     if the value was already aligned properly. As a result a few bytes of
87     memory were often wasted.
88   - Interface of various lower layer functions and macros were improved, and
89     mmftpd was migrated to use the new ones.
90   - When an alias points to an invalid address, an error is now logged about
91     it for the administrator to notice and delete the alias.
92   - mmstatd will now perform much better when used with a large number of
93     keys, and will now retain the real time of the operation if it had to
94     be killed before it can incorporate the recovery logs and sync.
95   - mmsmtpd now uses mmhash(3) for it's FLOOD_PROTECTION cache which enhances
96     performance when many hosts are in the cache, and yields cleaner code.
97     As the number of RCPTs allowed per post is generally small, it still uses
98     linked lists for those with the old 64-bit hash for faster comparition,
99     but sequencial searching is still performed when checking against
100     duplicates. This will change if I ever obtain a request about someone who
101     needs to use enough RCPTs in a post to use a hash table for performance.
102   - mmhash(3) is now used by mmserver(3) as well, which should enhance 
103     connection validity and DNS hostname cache performance.
104 * Bug fixes
105   - The SQL SELECT statement in mmpop3d's auth_pass() function was erroneous
106     and often caused POP3 authentication problems. Fixed.
107
108
109
110 Release: mmmail 0.0.21 devl
111 Date   : January 9, 2003
112 By     : Matthew Mondor
113
114 * Bug fixes (thanks to Jeroen Oostendorp for reporting)
115   - HELO would not accept IP addresses. It now will.
116   - The first matching entry in the aliases list would immediately map
117     an address, even if there existed closer matches. The new algorithm
118     will only map the address to the best match. (See important changes
119     section for more details).
120   - The RESOLVE_MX_HELO configuration file keyword was changed to RESOLVE_HELO
121     and it's behavior changed accordingly, to resolve hostname's A record
122     rather than the MX one. It was erroneous to expect SMTP clients to have
123     valid MX records.
124   - The check_nofrom() function, used to check for a match within the
125     nofrom database table, would only match on a hostname basis if resolving
126     client hostnames was enabled and the address could resolve successfully.
127     It now will also always check if the IP address also matches no matter
128     what.
129 * Important changes
130   - When desired, it is important for frontend scripts to be able to generate
131     required password hashes. This has not been easy with the previous method,
132     which did not even use standard base64 encoding but a custom one on the
133     MD5 result. Calling external binaries such as mmpasswd is not ideal.
134     Moreover, I wanted to get rid of the mhash library dependancy.
135     The solution was simple: password hashes now consist of standard
136     crypt(3) generated strings. Both MD5 and DES modes are supported.
137     However, mmpasswd will only generate MD5 ones with crypt(3).
138     This also allows administrators to easily migrate from real system
139     users, as this is the way system user password hashes are stored.
140     An attempt was made to provide a utility to easily convert old hashes to
141     new ones; This however is impossible due to a bug in the previous method
142     which caused the last few bytes of the MD5 results to be lost during the
143     base64 conversion.
144     A recommendation is to generate random passwords for the users, notify
145     them via email and then activate the new version using the new passwords
146     say, a week afterwards. This password format will then remain unchanged
147     for next versions.
148     It is important that people upgrading from 0.0.20 or older execute the
149     provided MySQL script upgrade-0.0.21.sql. Also, the user_passwd field of
150     the user table will need to be updated using the new mmpasswd results for
151     each user password.
152   - The alias table was modified because of the new best matching algorithm
153     which could be slower with large tables. To cope against this, an alias
154     column was added (the upgrade-0.0.21.sql script will also add it). This
155     means that you will have to add the new domains after upgrading, and alter
156     the patterns to no longer hold the domain.
157 * Real asynchroneous functions support
158   - The Pth library has limits in that only one process is used for all
159     threads. The various pth_*() functions, and special care has to be taken
160     to prevent locking the whole process when a single thread needs to
161     perform operations, because of the non-preemptive nature of Pth.
162     Another side effect of using Pth is that SMP systems gain no performance
163     over single CPU systems. Moreover, some functions which can take a while
164     can lock the whole process when no pth_*() wrapper function exists to
165     do it. An obvious example is hostname resolving, which can lock the whole
166     process for long periods on slow networks.
167   - A solution was worked out to allow threads to execute real asynchroneous
168     functions without blocking the main process (and therefore allowing other
169     threads to remain responsive), and to even take advantage of
170     multi-processor systems where available.
171   - The technique uses an AmigaOS-like device task/thread which works over the
172     Pth thread-safe message passing mechanism, to serve the various
173     asynchroneous functions like a daemon would. This device internally uses
174     a pool of real asynchroneous processes to which it dispatches the requests
175     in a distributed manner via unix datagram sockets.
176   - The new ASYNC_PROCESSES configuration file option was added as a result,
177     which allows to specify the number of slave asynchroneous processes to run.
178   - This facility is currently used by mmmail to generate password hashes and
179     to resolve hostnames and MX records (when enabled).
180 * Miscelaneous new features
181   - If the daemons are compiled with -DNODETACH, the main process will not
182     fork(). Useful for debugging.
183   - If compiled with -DNODROPPRIVS, daemons will make sure they are not
184     started by the superuser to accept running, but will then not attempt
185     to perform any modifications on the current permissions. Useful for
186     non-privileged users.
187   - mmstatd can now be specified configuration file to use at startup
188     via command-line argument.
189   - mmstat library will now first check for MMSTATCONF environment variable
190     for the configuration file to use instead of the default
191     "/etc/mmstatd.conf". This can be useful to non-privileged users who want
192     to run mmstatd.
193     The default is to only accept to be started by the superuser and then
194     drop privileges.
195   - mmstat user client utility now supports hreport for more human readable
196     results (although less verbose).
197   - Configuration file option DELAY_ON_ERROR was added to allow to pause
198     at every user command error. Thanks to Jeroen Oostendorp for the idea.
199   - mmstat facility now allows wildcard pattern matching for UPDATE, RESET
200     and DELETE operations which operates atomically on all matching keys
201     for that uid.
202   - STATFAIL_EOF was added to mmsmtpd.conf which allows to maintain statistics
203     via the mmstat service about clients which disconnect improperly.
204 * Other
205   - Optimized the command matching loop by using fast packed hashes
206   - Other optimizations were performed by moving some variables in
207     closer scope, usually resulting in compilers using registers for
208     appropriate variables. This is especially useful for GCC which
209     ignores register directives.
210   - Significant code cleanups
211   - Several environment variables can now be set to modify the behavior
212     of the install.sh script (eg: change installation prefix, default
213     group/user, etc).
214   - The memory pool allocation system was optimized even more, now keeping
215     statistics on the average number of pages in use, so that it scales
216     better. Previously used pages are now privileged as well, which causes
217     unix kernels to allow processes using it to perform more efficiently,
218     as well as the underlaying allocator.
219   - Better synchronization with mmstat service, now using persistant keys
220     and has possibility to delete old temporary keys at startup using
221     wildcard matching.
222
223
224
225 Release: mmmail 0.0.20 devl
226 Date   : November 8, 2002
227 By     : Matthew Mondor
228
229 * New features
230   - The new STATFAIL_ADDRESS, STATFAIL_FLOOD, STATFAIL_FULL and
231     STATFAIL_TIMEOUT boolean confguration file options were added, which
232     allow the administrator to view statistics using the mmstat(8) utility,
233     optionally taking action on abnormal functional issues.
234     See mmsmtpd.conf(5) man page for more information.
235   - Added new CHROOT_DIR configuration parameter to optionally allow the
236     server to run enclosed into a chroot(2) jail.
237   - When starting the server it is now possible to specify the configuration
238     file to read. This allows to start several copies using different
239     configurations.
240 * Bug fixes
241   - When multiple groups feature was introduced in 0.0.16 devl, mmmail stopped
242     setting the initial group using setgid(2), assuming that setgroups(2)
243     would. This was not the case, and mmmail would then remain part of the
244     wheel group. It will now set the real and effective primary group, the
245     secondary groups, and then the real and effective user. The first group
246     of the GROUPS configuration file parameter is used for the primary group.
247     Although mmmail does not access files, this bug did not hurt it, but
248     let's not leave anything out considering security.
249   - The pop3d needed to replace any "\n.\n" to "\n..\n" while sending out
250     to of course avoid the client to consider the message completed when it
251     is not the case. This is now done. As a result it cannot send the
252     whole message using a single fdbrwrite() call, it has to perform several
253     ones as needed.
254   - Removed the annoying LOOP: debugging which used to flood syslog.
255 * Other
256   - mmsmtpd now has less overhead when creating new client contexts
257   - Now uses getnameinfo(3) instead of gethostbyaddr(3) to resolve hostnames
258     if RESOLVE_HOSTS is TRUE. This is more suitable with threads, since
259     gethostbyaddr(3) uses static data and required a mutex to be thread-safe.
260
261
262
263 Release: mmmail 0.0.19 devl
264 Date   : October 28, 2002
265 By     : Matthew Mondor
266
267 * Important bug fix
268   - omission of an unlinknode() in the new rate limit feature was fixed.
269     The daemons could lock in a loop taking 100% CPU time. Fixed.
270
271
272
273 Release: mmmail 0.0.18 devl
274 Date   : October 26, 2002
275 By     : Matthew Mondor
276
277 * New features
278   - Anti-DoS connection rate limit feature was added in mmserver library,
279     consequently new CONNECTION_RATE and CONNECTION_PERIOD configuration
280     file options were added. These are on a per-IP address basis.
281   - The bytes statistic counters were bumped to 64-bit.
282 * Bug fixes
283   - Yet again a build/install script bug; Permissions would not be applied
284     properly to newly installed files, the problem started to occur when
285     automatic directory creation was added. This was now fixed. Users should
286     consider upgrading as fast as possible, or to make sure that their 
287     configuration files in /etc/ have safe permissions.
288     See the following man pages: mmsmtpd.conf(5), mmpop3d.conf(5).
289     The install script will force safe permissions on the configuration files
290     while preserving them if they already exist.
291   - The staff group would not be created by install.sh if it did not exist.
292     Thanks to Jeroen Oostendorp for reporting this.
293   - The bandwidth shaping system was not accurate enough, as it used to
294     throttle by 4096 bytes blocks, requireing too much CPU time in syscalls
295     for high limits. It was rewritten using a new design which now only sleeps
296     if required after the maximum number of bytes allowed into a second were
297     transfered. So it now uses a second's worth of data resolution rather than
298     a 4096 bytes resolution. Some parts of mmfd library internals and API
299     were modified as a result (See mmfd(3) man page for details). Another
300     side effect is that it takes far less CPU time with high limits.
301     Thanks to Darren Price for the extensive testing and reports,
302     to Eric Weisenhaus and agrajag for reporting these earlier.
303   - There existed a potential race condition when hostname resolving was
304     enabled, which could cause a memory leak. This was fixed.
305     Thanks to Jeroen Oostendorp for reporting it.
306 * Other
307   - When mmmail needs to write out blocks of data it no longer uses mmfd(3)
308     library fdbwrite() buffering call but fdbrwrite() instead to save CPU
309     cycles and avoid buffer size splits.
310   - Some source code auditing and cleaning was made, several optimizations
311     were performed, some buffers were aligned to favorize word-copy/move 
312     operations as opposed to single-byte moves, in mmstring library).
313   - I thank everyone who are testing this software, and am again requesting
314     that it be evaluated, as I intend to eventually release mmmail v1 stable.
315     Support for more features will mostly be added into future mmmail devl
316     software, for an eventual mmmail v2. The current design drafts for it
317     can be found at http://mmondor.gobot.ca/software.html under the mmmail
318     TODO entry. For mmmail v1 release to happen, it has to be free of any
319     issues, it is therefore important to report any bug, to mmondor@gobot.ca.
320     It also would be nice if I could release with it a list of systems it is
321     known to work on, so if betatesters find some time to describe their setup
322     to me via email it would be appreciated. I yet have to test it again on
323     ultrasparc with Linux and Solaris for instance.
324
325
326
327 Release: mmmail 0.0.17 devl
328 Date   : October 11, 2002
329 By     : Matthew Mondor
330
331 * Bug fixes
332   - The build scripts did not behave as expected on systems which are using
333     bash for /bin/sh. Some script sections needed modifications to work
334     on both. Now seems to build fine on linux systems.
335   - Various new GCC versions warning issues were fixed.
336   - When installing, some directories were assumed to exist, they will
337     now be created when missing.
338   - A bug in mm_memmov() was fixed.
339   - Some systems, including linux, required libresolv to be linked with
340     the daemons. Fixed.
341
342
343
344 Release: mmmail 0.0.16 devl
345 Date   : October 6, 2002
346 By     : Matthew Mondor
347
348 * New features
349   - Now uses mmstatd(8) for persistant statistics storage and volatile who
350     database. This includes mmstat(8) administration facility.
351     This daemon also comports crash recovery using internal logging.
352     See mmstatd(8) man page for more information.
353   - Processes may now be part of several groups.
354   - It is now possible to set global maximum download and upload limits for
355     the whole server.
356   - Improved installation/upgrade make.sh and install.sh scripts, and use
357     of /bin/sh rather than make because of GNU/BSD make inconsistencies.
358   - mmmail(8), mmsmtpd(8), mmpop3d(8), mmsmtpd.conf(5), mmpop3d.conf(5),
359     mmpasswd(8), mmstatd(8), mmstat(8), mmstat(3), mmstatd.conf(5)
360     man pages were written.
361 * Bug Fixes
362   - Hostname sections starting with alpha characters only used to be accepted,
363     it now will accept alpha-numeric instead for the starting hostname section
364     character.
365   - The "Received:" headers were wrong about the "for" part. The previous
366     way do_data() worked prevented modifying the message header for each
367     RCPT, which was required. do_data() was now rewritten around mmfd(3)
368     fdbreadbuf() and "for" should be adequate as it's a re-implementation.
369     Thanks to Jeroen Oostendorp for reminding me of this bug.
370   - On various systems, including OpenBSD, the NetBSD-style __RCSID and
371     __COPYRIGHT, although useful, caused problems. They were now replaced
372     by custom macros, which should fix compiling issues.
373     Thanks to Dinos Costanti for reporting the issue.
374 * Other
375   - The code used to be compatible with older C compilers, it now was converted
376     to ANSI C. Use of __P() macro is no longer made.
377   - mmsmtpd now reads in messages faster than it used to, do_data() was
378     re-written in a way to avoid two previous memory copying passes on the
379     whole message. It now uses mmfd(3)'s new fdbreadbuf() function. Previously
380     it would call fdbgets() on a buffer, copy the string into a linked list,
381     using strdup(3), and after message reception another buffer would be
382     created by copying all lines from the list sequencially again.
383     These two passes can now be avoided, as fdbreadbuf() causes fdbgets() to
384     write it's lines directly into a single buffer. Of course we still can't
385     avoid the buffer copy/translation pass which occurs to produce the mysql
386     query, however.
387   - Some mmlist node manipulation functions were replaced by macros.
388     mmlist(3) now privileges pre-allocated nodes when inserting them back
389     in the free nodes queue, making a better useage of memory.
390
391
392
393 Release: mmmail 0.0.15 devl
394 Date   : July 27, 2002
395 By     : Matthew Mondor
396
397 * Bug fixes
398   - Fixed bandwidth shaping library, recent versions would totally ignore
399     bandwidth rate specified, because of erroneous 0 initialization.
400     Also fixed a bug where bandwidth would always be lower than requested.
401     Thanks to Eric Weisenhaus, Darren Price and agrajag for reporting these.
402   - Configuration option LOG_LEVEL would not accept values below 1
403   - Fixed mm_strnicmp() which would sometimes cause various problems
404   - Sometimes fdbgets() status would not be logged in case of error,
405     occuring during mail receipt, not disclosing why 520 Error was sent.
406   - The 520 Error sent when an error occurs receiving mail data was changed
407     to a 452 code error.
408   - Added LOG_LEVEL 4 for extreme verbosity (message DATA lines are logged).
409
410
411
412 Release: mmmail 0.0.14 devl
413 Date   : June 4, 2002
414 By     : Matthew Mondor
415
416 * Bug fixes
417   - The FROM:<> string was compared case-sensitively (thanks to Jeroen
418     Oostendorp)
419   - Various optimizations
420   - A pretty serious bug was fixed (which only affected glibc-based systems),
421     where syslog() would potentially be called with user supplied parts,
422     including fmt sequences. Thanks to BenoĆ®t Roussel for providing me with
423     a very detailed security advisory and to Guillaume Pelat for discovering
424     the problem.
425
426
427
428 Release: mmmail 0.0.13 devl
429 Date   : May 19, 2002
430 By     : Matthew Mondor
431
432 * Config file support
433   - Servers now reads /etc/mmsmtpd.conf and /etc/mmpop3d.conf which obsolete
434     previous mmversion.h pre-compilation issues. This also permits to leave
435     the daemon executables to be readable by other users, as passwords get
436     read from the config files. Of course configuration files should remain
437     only accessible by root.
438   - Defaults are set, configuration file is parsed, then command line
439     arguments parsed which may override some of the configuration file
440     settings.
441   - Syslog facility can now be specified.
442 * Bug fixes
443   - When the mysql server was down, and mmsql lib's mmsql_glock() was called
444     by the daemons, 100% CPU time would be used in an endless loop. The loop
445     boundaries and rate are now controlled properly.
446   - When a mail box is full, mmsmtpd now issues a 402 message instead of the
447     previous 502 code, which would prevent some MTAs from retrying later on.
448   - When too many DATA lines were sent through mmsmtpd for a message, it
449     would previously not output the proper error message properly, instead
450     two messages were being sent, the error one, and the successful one,
451     confusing most smtp clients.
452   - Thanks to Jeroen Oostendorp for beta testing throughly mmmail 0.0.12
453     and noticing the three above bugs which were fixed in 0.0.13. He also
454     made the MAIL FROM:<> and hops checking support suggestions.
455   - The process ID file was not created.
456   - Detected and fixed misuse of snprintf(), of which the returned value
457     should not be trusted.
458 * Support for MAIL FROM:<> added
459   - These used to be considered illegal, it now is possible for the admin
460     to allow them (crond and some intranet MTAs seem to use it).
461   - Only clients connecting from allowed list of hosts/addresses can use it,
462     the new nofrom MySQL table has been added for this purpose.
463   - * and ? pattern matching is allowed, and addresses or hosts can be used.
464 * Implemented maximum hops checking support
465   - New configuration file option can be set to limit the number of maximum
466     hops in a message in order to accept it. This helps filtering invalid
467     emails and spam.
468 * Install/Upgrade shortcut
469   - A make.sh script was now written which allows to compile and then install
470     or upgrade mmmail faster.
471   - Written scripts/upgrade.sql to allow easy transition from mmmail 0.0.12
472     or older to mmmail 0.0.13, without deleting the current database info,
473     since new tables and fields were introduced.
474 * Useful debug logging
475   - When using level 3 verbosity logging, replies will also be logged via
476     syslog to specified facility. This is especially useful for beta-testers
477     and debugging.
478 * (finally) Implemented aliasing
479   - Thanks to Ryan Werber, Daniel DeMaggio and Jeroen Oostendorp for
480     suggestions and ideas.
481   - Allows to setup aliases based on * and ? pattern matching, the new
482     MySQL table alias has been created for this purpose.
483 * Implemented message flood (mail bombing) protection
484   - Thanks to Daniel DeMaggio and Jeroen Oostendorp for the idea.
485   - FLOOD_PROTECTION boolean, FLOOD_CACHE size, FLOOD_MESSAGES and
486     FLOOD_EXPIRES configuration file options added.
487   - This is based on a per client host basis, addresses/hostnames are
488     cached with statistics in a hash table.
489 * Added various fields along the SQL tables
490   - Allows automatic scripts to identify/inactivate/delete unused boxes
491     or users using new datetime fields.
492   - Statistics on the number of logins for a user are now stored.
493   - Added an admin field to the user box, so that it becomes possible for
494     a frontend to allow an administrator to create users and mailboxes
495     for them. This however in the future should be restructured to be on
496     a per-host basis instead. Thanks to Christoph Dworzak and Daniel DeMaggio
497     for providing the idea.
498   - Added a user active boolean field to the user SQL table to permit easily
499     disabling access temporarily to a user without having to take out his
500     mail boxes or user entry from the database.
501 * Introduced a 64-bit hash function
502   - Internally used to improve various table lookups (already supplied
503     RCPTs and the FLOOD_PROTECTION cache for instance)
504   - Hash function was tested against duplicates with /usr/share/dict/words
505     and find / inputs with success
506 * Server too busy messages introduced
507   - When the maximum number of IP addresses have been reached, or when too
508     many connections from the same address occurs, a protocol-friendly message
509     is now sent before closing the connections. Some clients have been
510     confused with previous behavior.
511 * Multiple interfaces support
512   - Adminstrator may now specify several IP addresses to bind() to, as well
513     as a server hostname for each, using LISTEN_IPS and SERVER_NAMES config
514     file parameters.
515 * Now using getpwnam() and getgrnam() for more configurability
516   - Used to read /etc/passwd and /etc/group directly.
517
518
519
520 Release: mmmail 0.0.12 devl
521 Date   : April 22, 2002
522 By     : Matthew Mondor
523
524 * Fixed a nasty bug
525   - As the mmfd library was lately fully redesigned some daemon code would
526     not properly use the status results when a connection was unexpectedly
527     lost.
528   - This rendered easy to crash the daemon flooding with alot of connections
529     not exiting using standard QUIT command.
530 * Better disconnection logging
531   - The the general status/reason of the disconnection is now also logged
532     with the statistics via syslog.
533 * Compilation issues resolved
534   - Fixed a conflict which occurred between the BSD and linux usleep()
535     function not using the same argument type (unsigned long vs useconds_t)
536   - mmpasswd would not compile properly on linux
537
538
539
540 Release: mmmail 0.0.11 devl
541 Date   : April 17, 2002
542 By     : Matthew Mondor
543
544 * Implemented bandwidth management support
545   - mmfd library finally supports bandwidth shaping as well as buffering,
546     mmmail daemons now also take adventage of this, administrator may
547     optionally decide the speeds limits in KB/s for both reading and writing
548     data from with each client.
549 * Implemented transfer statistics
550   - Detailed statistics on the number of bytes transfered in both directions,
551     with number of RCPT/messages received/sent and DELE commands are now
552     logged via syslog at logout.
553 * More descriptive logging on DoS attempts
554   - When a connection is rejected because the maximum number of IP addresses
555     is reached, or that maximum number of connections for an IP address
556     is exceeded, mmserver library now reports the offending IP address and
557     reason via syslog.
558
559
560
561 Release: mmmail 0.0.10 devl
562 Date   : March 24, 2002
563 By     : Matthew Mondor
564
565 * Moved to CVS with unified libraries
566   - Less prone to some bugs caused by inconsistencies among code modules
567 * More efficient memory management
568   - mmlist's buffering capabilities now used by mmmail suite daemons
569 * More efficient I/O
570   - New mmfd library provides fast buffering around fds increasing execution
571     speed considerably, mmsmtpd used to read in messages slowly especially
572 * Bugfixes
573   - Some SMTP clients sending mixed-case hostnames at HELO would be refused
574     access, fixed.
575   - Under some circumstances it would theoretically be possible to crash
576     mmpop3d (a loop could possibly read outside of it's heap) although
577     I could not observe the effects, auditing the code after CVS transition
578     made me discover it.
579   - Some memory would not be freed immediately after mmsmtpd processed a
580     message.
581   - French accents and the like would be stripped out of messages by mmsmtpd,
582     fixed (mmfd.c).
583   - Will no longer refuse to start if lingering sockets with TIME_WAIT exist
584
585
586
587 Release: mmmail 0.0.8a devl
588 Date   : January 14, 2002
589 By     : Matthew Mondor
590
591 * Backported
592   - This release consist of an update to mmmail 0.0.8, with only part of
593     the changes of 0.0.9 (mmsmtpd on 0.0.9 seems to segfault, and I couldn't
594     find time to debug it, and needed to update my production servers to work
595     as soon as possible).
596   - The changes fixes the wrong connection IDs in logging, and the fdgets()
597     modification was applied as well as the LIST Out of range problem patch.
598
599
600
601 Release: mmmail 0.0.9 devl
602 Date   : January 6, 2002
603 By     : Matthew Mondor
604
605 * Fixed wrong connection IDs
606   - If more than one connection at once were originating from the same IP
607     address, the connection ID would remain the same. Fixed. This is essencial
608     to properly associates commands executed by each connection together.
609 * Modified mmfd.c's fdgets() function
610   - The line input function would cause telnet control sequences to be
611     inserted in the command string, as non-printable characters. They are now
612     ignored. This would cause some commands issued by rare clients to not be
613     recognized.
614 * Debugged LIST
615   - The LIST POP3 command when called with a message number parameter would
616     often fail with an out of range error. Fixed.
617 * Performance enhancements
618   - mmmail now uses the new mmlist and mmstr libraries just like mmftpd for
619     internal buffering preventing malloc() and free() from being called too
620     often. Moreover, general performance of linked lists related code should
621     be enhanced.
622   - The administrator can set the new BUFFERS variable in the mmversion.h
623     files to higher values for servers under more load for more buffering.
624
625
626
627 Release: mmmail 0.0.8 devl
628 Date   : November 26, 2001
629 By     : Matthew Mondor
630
631 * Fixed some of the error limits code, thanks to Ryan Werber for reporting
632   - Some commands such as RECV used to increase the errors number variable
633     which caused a POP3 client to fail finishing fetching all messages from
634     a box with many messages. Fixed.
635
636
637
638 Release: mmmail 0.0.7 devl
639 Date   : November 24, 2001
640 By     : Matthew Mondor
641
642 * Fixed broken TOP POP3 command, thanks to Tyler Mitchell for reporting it
643   - When rewriting many parts of the POP3 daemon for mmmail 0.0.6 version,
644     a bug was introduced which caused TOP command to always return invalid
645     range errors. Fixed.
646   - Moreover, TOP since the first mmmail version never worked as expected by
647     most users, where TOP <msg> 0 would display the message header lines, and
648     any higher number would be lines counted after that header. Fixed.
649   - As an anti-dos feature using TOP on the same message twice was not
650     permitted unless RSET was used. Now behaves normally.
651   - As POP3 protocol does not provide a help system, TOP command now mentions
652     that PAGE could also be used on it's result line.
653
654
655
656 Release: mmmail 0.0.6 devl
657 Date   : November 21, 2001
658 By     : Matthew Mondor
659
660 * mmmail and mmmail-pth were fusionned
661   - As alot of work as been performed on the pth daemon lately, and a single
662     edition is preferable to maintain, mmmail officially uses pth library
663     as of this edition. I mostly run it on netbsd personally and the pth
664     editions run awesome on it. I also run a linux server with it in a
665     production environment, so I consider it stable and efficient enough.
666 * Not using regex(7) anymore
667   - In order to make the command interpreter much faster, unvulnerable to
668     possible regex related bugs, and to make it more portable (yes, I have
669     noticed that besides POSIX pthreads, POSIX regex have problems on some
670     systems and required different regex pattern strings), I am now parsing
671     the commands myself. SMTP and POP3 commands are very simple to parse.
672     Moreover, jump tables are now used instead of switch/case. This permits
673     general better performance when using libpth especially, since it only
674     provides non-preemptive scheduling, among all threads, using a single
675     process's CPU time.
676 * UID and GID now internally evaluated from names
677   - The UID and GID to run as are now specified to the daemons as names as
678     found in /etc/passwd and /etc/group. The daemons now perform necessary
679     convertions to numerical values.
680 * Better permissions sanity checking when run from inetd
681   - Will now refuse to run if it can't make sure it runs as required user
682     and group
683 * HELO may optionally be required
684   - Will prevent the use of MAIL before HELO was used, if the admin wants
685 * Less strict on MAIL and RCPT format
686   - Some SMTP clients and servers used to not fully respect the strict RFC
687     MAIL FROM:<address@host> and RCPT TO:<address@host> forms, adding spaces
688     or omitting < >. mmsmtpd will now work with those.
689 * Customizable logging level
690   - The admin may now setup wanted logging level for each daemon.
691 * mmtcpfwd-like connection ID logging
692   - When connection/disconnection logging is wanted, now uses connection IDs
693     which permit to effectively link the events together.
694 * Implemented unstandard POP3 PAGE command
695   - As TOP often is not powerful enough to properly allow reading messages
696     via a telnet client for instance, PAGE <msg> <page> <lines> was
697     implemented, where <msg> consists of the message to be read, <page> of
698     the page number to be displayed, and <lines> the number of lines per page
699     of the terminal (with a maximum limit of 60).
700 * README was updated
701   - As many changes were performed in both daemons, although I personally
702     tested them a bit, next release should be a stable one, once this one
703     has been more tested on production systems.
704
705
706
707 Release: mmmail pth-0.0.5 devl
708 Date   : October 2, 2001
709 By     : Matthew Mondor
710
711 * mmsql_glock() and mmsql_gunlock() used to be implemented around flock()
712   - This required mmsmtpd/mmpop3d daemons to share a common filesystem
713     as /tmp/mmail-mmsql.lock file was used.
714   - Now uses MySQL's special GET_LOCK() and RELEASE_LOCK() functions.
715   - The daemons should now be able to run on two different hosts
716 * Fixed a small memory leak in mmpop3d
717   - mhash allocates data for the hash, which has to be freed although
718     it's documentation never mentionned it, when I noticed the leak and
719     re-read the auth code I found logic that mhash_end() couldn't free
720     the hash which we need to use afterwards, adding a free() fixed it.
721 * Note: The pth library version with which mmmail-pth was thoughly tested
722   consists of libpth14 (v1.4). I noticed that on linux, pth seems tricky.
723   These daemons run fine on NetBSD with libpth12-14, although it only seemed
724   to work fine on linux with libpth14. It used to segfault with libpth13 on
725   linux.
726
727
728
729 Release: mmmail pth-0.0.4 devl
730 Date   : September 28, 2001
731 By     : Matthew Mondor
732
733 * Fixed a bug which occured at times around strncpy() which implementation
734   varies from clib to clib.
735   - Unexpected mail box full issues were fixed
736
737
738
739 Release: mmmail pth-0.0.3 devl
740 Date   : Aug 12, 2001
741 By     : Matthew Mondor
742
743 * Portability issues
744   - As using POSIX threads cause portability issues among implementations,
745     this one was fixed to use the GNU portable pth thread library.
746     It is not really made to fully replace the other implementation using
747     POSIX threads, I also may merge them together eventually but are only
748     two concurrent versions at present time.
749
750
751
752 Release: mmmail 0.0.3 devl
753 Date   : July 9, 2001
754 By     : Matthew Mondor
755
756 * Data integrity enhancement
757   - mmsql_glock() and mmsql_gunlock() implemented in between mmsmtpd
758     and mmpop3d to prevent mailbox corruption which could happen if
759     they were both writing and deleting messages at once. This never
760     happened but as two SQL commands are required for mail insertion
761     or deletion, it is better to make sure that nothing can interfere
762     between them.
763 * Revision
764   - Removed all // comments and replaced them by /* */ ones to follow
765     standard C conventions
766   - Updated the README file
767 * Security enhancement
768   - The daemons no longer return to the client the strings they send
769     when they are unrecognized or invalid commands.
770
771
772
773 Release: mmmail 0.0.2 devl
774 Date   : June 3, 2001
775 By     : Matthew Mondor
776
777 * Bugfix
778   - Now uses mysql_ping() regularly to re-establish connection
779     with the MySQL server if it was lost, very useful for remote
780     server connections though TCP/IP.
781
782
783
784 Release: mmmail 0.0.1 devl
785 Date   : May 29, 2001
786 By     : Matthew Mondor
787
788 * Initial development release
789