phpQLAdmin 2.0 Change Log

phpQLAdmin 2.0.18c (May  5 2004)
	Bug fixes
	  - Add uidNumber, gidNumber and homeDirectory to a mail account IF we've
	    choosen to use 'posixAccount' when creating user(s).
	  - De-globalize the root DN in call to user_detail.php from user_details-forwards_from.inc.
	  - The 'attribute key' used for 'attribute independence' _must_ be lowercase
	    to work as a variable later.
	  - PQL_CONF_ to PQL_ATTR_ spelling error fixed.
	  - Attribute spelling error fixed in tables/user_details-basic.inc
	    ('ugidnumber' should be 'uidnumber').
	  - Predefine (empty) variables to get rid of errors.
	  - Correctly process the next page/form to display in user_add.php. This depend
	    largely on if we have an MX error or not.
	  - Don't set 'host' to 'default' (in tables/user_add-details.inc) if we're not
	    running in advanced mode. The host value will be figured out automaticly
	    (in user_add.php)...
	  - Rewrite the part that adds {User,Group}ID slightly. We use the
	    PQL_CONF_FORWARDINGACCOUNT_UIDNUMBER value if it's a mail account, and
	    generate a new value using pql_get_next_ugidnumber() if not.
	  - The 'userhost' value which is/was generated by user_add.php might be
	    an array containing the DNS entry and/or the QLC object(s). The DNS value
	    is by default used, othervise the first QLC object.
	  - If a define isn't set, the pql_get_define() will return an empty array with
	    all rootdn's. Catch this, and return NULL if the define is unset.
	  - To make sure we don't get 'Wrong datatype' in tables/user_add-additional.inc
	    when checking if the mailHost is a DNS entry, we only look in the QLC
	    array if there IS such an array.
	  - Suidperl should no longer be used as interpreter in suid perl scripts.
	  - For the autoAdd{HostName,RCPTHosts,Locals} stuff to work, the function
	    pql_control_update_domains() needs to know the root dn (to be able to find
	    the configuration value for the database suffix).
	  - Spelling error - s/user_generate_mailstore/user_generate_homedir/.
	  - Changing userNamePrefix managed to set the userNamePrefixLength instead.
	    + Faulty use of variables in include/attrib.usernameprefix.inc.
	  - In case the 'user reference value' isn't availible when putting togheter
	    the new users RDN, try to fallback to the 'uid' value. If that is also
	    unset, die with a message... Best I can do!
	  - De-internationalize the gecos attribute - it won't allow non-us characters!
	  - Spelling error: s@if/elseif@ in two places where I'm about to call
	    user_generate_{mailstore,homedir}(). This stoped the auto-generation of
	    {home,mail} directories to use the UID value - CN/SN overwrote the previous
	    set UID value.

	GUI layout change
	  - Require the pql_config.inc file to avoid PHP errors in the right frame
	    when choosing control.php or ezmlm.php.
	  - Don't show the radio input for 'user specified MX' if it's our only option.
	  - When we can't find the root dn for some reason, i MUST have more information.
	  - Make sure that the view is included in change/add locals/rcpthosts value(s)
	    so that we end up in the Locals/RCPTHosts view again.
 
	Misc changes	
	  - The file 'doc/INSTALL' was moved to '.' so that it's easily seen.
	  - It's important that the 'person' object class is used when creating users
	    if one's referencing users with the 'cn' attribute.
	  - Don't show the 'undefined variable' warnings if not running a CVS version.
	  - Don't add the 'deliveryMode: localdelivery' if we're running with newer QmailLDAP.
	  - If the file '.DEBUG_ME' exists in the root directory, don't create domain/users.
	    Instead, die with the LDIF that should have been added to the LDAP database.
	  - Get the knowledge on what object classess to use when creating user(s) ONCE
	    (from user_add.php instead of all over the place), and use this knowledge when
	    deciding what input field to show
	  - Only add the 'homeDirectory' attribute if we've choosen to use 'posixAccount'
	    when creating a user - qmailUser allows homeDirectory, but it's not needed
	    for mail accounts. Previous fix was wrong...

phpQLAdmin 2.0.18b Release (Apr  6 2004)
	Bug fixes
	  - New config option - PQL_CONF_USE_TLS (true/false) which have to be true
	    for ldap_start_tls() to take place.

phpQLAdmin 2.0.18 Release (Apr  4 2004)
	Bug fixes
	  - PHP parse errors fixed.
	    Closes bug 67
	  - Don't use the Control class for Bind9. It looks in the wrong place
	    Closes bug 10
	  - Variable name overloading fixed.
	  - URL decode the domain value when creating the Group DN (pql_user_add()
	    function).
	    Closes bug 57, 70
	  - Wrongfull use of '$ACI_SUPPORT_ENABLED' (should have been
	    '$GLOBALS["ACI_SUPPORT_ENABLED"]').
	  - Fix folding for non-opera. Closes bug 76
	  - Create an array with the URL encoded values for user, rootdn and domain.
	    This is used in every (?) place where there's a distinction between value
	    and URL value (basicly in every 'a href')...
	  - Ability to view, add and delete additional groups (adding the users 'uid'
	    to the groups 'memberUid' attribute).
	    + Only visible if running in advanced mode.
	    Closes bug 71
	  - Move the initialization of the java variable expandedDb from trailer to
	    head.
	    Closes bug 61
	  - When looking in the domain branch if 'ou=DNS' exists, we should do this
	    with the BRANCH dn, not the RESULTING (ou=DNS,BRANCH) dn!
	  - If pql_set_domain_value() is called with an array, it does not nessesarily
	    mean that the whole array contain the same attribute - there might be OTHER
	    attributes in there (which in turn is arrays).
	  - Only setup objectclasses in pql_set_domain_value() (i.e. retreive from object
	    the old values) if we don't already HAVE objectclasses. We might have that
	    if we're called with an array.
	  - Catch more URL encoding of the root, branch and user DN before redirecting
	    to domain info page. This was the cause (and still is - I've probably missed
	    some places) of most of the errors and faulty views.
	  - Make sure we IDNA encode (if IDNA is availible) any international domain names
	    before adding it to locals/rcpthosts.
	    + IDNA decode _all_ references to domain/host names where it's used as a
	      DNS or email value etc.
	  - Dissalow the '&' character(s) in paths to homedir/mailbox
	  - Rewrite of the dnszonetemplate.php page to correctly create a _complete_
	    zone file for specified domain. Contains ALL information that's in the
	    LDAP server.
	    Closes bug 131
	  - Quota problems fixed. If we choose to use 'Standard' quota for a user, we need
	    to get the default quota value from the QmailLDAP/Controls - take the first
	    value we find. But this is only possible if QmailLDAP/Controls (using the
	    'phpQLAdmin Configuration->Manage Controls DB' = Yes) so only show this option
	    if manage controls db is enabled. Also simplify the input of quotas. Previosly
	    (from before my time - I never bothered to change it) you have to tick in THREE
	    (one radio-, and two checkboxes) in addition to the values. SIMPLIFY! Should
	    now be more obvious.
	  - Fix for Konqueror - Can't use onChange, must use onClick instead. This means
	    that we have to catch what brower we're using, and set the correct variable
	    (currently I only have workarounds for Konqueror and Opera).
	  - Make sure we include rootdn and domaindn if SINGLE_USER.
	  - As of Qmail-LDAP v20030901, the mailQuota attribute have been split into TWO
	    attributes - mailQuotaSize and mailQuotaCount. Find out which is used in the
	    LDAP server, and create the quota value(s) appropriately.
	  - Only auto-generate UID when creating user if we're in that part of the add
	    process - page one - AND we're referencing users with uid.
	  - Huge documentation updates and cleanups.
	  - When trying to find out if a user is an administrator, there's the possibility
	    that there's something wrong with the database - the user might not be registered
	    properly in every BaseDN as a controls administrator - go look in EVERY BaseDN
	    (i.e. not just the first one) just to be safe we're getting the value...
	  - When showing user details, we can't IDNA decode the _whole_ email address, only
	    the domain name part - split the mail address in two (separated by '@' as usuall),
	    IDNA decode the domain name, and put the mail address back together.
	  - Don't add {uid,gid}Number if forwarding account - 'ldap{Uid,Gid}' in QmailLDAP/Controls
	    object must be correct though!
	  - When adding a user and we can't generate UID, we shouldn't go back and do
	    over. Just say "can't autogenerate".
	  - The function pql_control_update_domains() isn't suitable for REMOVING a QLC
	    locals value. Use pql_control_replace_attribute() instead. But first we must
	    get all existing values, removing the specified one from the array we send to
	    pql_control_replace_attribute().
	  - With toggles (ldapRebind and ldapCluster in the 'Control Details' pages), we
	    can't just check if the variable is set - it may contain 'Not set' which will
	    trigger the if(). Do 'if value is 1, then...' instead.
	  - Better support for newer QmailLDAP (and QmailLDAP/Controls) - version > 20030901,
	    regarding new/removed values (mailQuota -> mailQuotaSize and mailQuotaCount).
	    + Support the old format if it's still enabled in the LDAP server.
	  - Correct and rewrite the 'mailHost' attribute retreival trough the 'Add user'
	    pages. We can be called with either a QLC object, a DNS entry or user supplied.
	  - Allow user(s) to be put in the root of the branch/domain by adding that option
	    to the <select> (the 'Add user->user details' page).
	  - Show ALL mailinglists (in left-ezmlm) if we're "super-admin".
	  - The attributes 'externalScript{User,Domain}' is allowed to be empty. If we
	    have a value, and we remove it from the input field, then remove it from
	    the LDAP object as well.
	  - Better/correct support for 'virtual users'. A mail account is a very minimal
	    object. It doesn't need a lot of frills - see README.virtual.
	  - Remove the last (?) hardcoded references to attribute names. Use pql_get_define()
	    with a define set in include/pql_attributes.inc instead.

	GUI layout change
	  - Variable lenght icons with better looking font.
	    + Smaller text font in buttons.
	    + Allow for international characters in buttons.
	    + Relative (to the font string length) button width.
	    Closes bug 8
	  - ACI editor written - change, delete and add ACI entries for an object
	    through the point-and-click interface (web browser).
	  - Generate variable length buttons depending on number of characters.
	  - The add user page have been rewritten
	    + Super admin should always be able to create users, even if the limit of
	      max users have been reached!
	    + Show the homedirectory in the verification page if it's defined.
	    + Move all user add forms to separate files in tables/ to minimize loading
	      time and ease readability.
	  - Do not say 'No users defined' in the left frame - quite pointless actually,
	    that should be obvious if there's no users! :).
	  - 'Add sub unit' link (just above the 'Add user' link). This link should be
	    in the 'main tree branch' (ie, not within a sub unit tree branch).
	  - If there's no MX pointer(s), then don't offer the DNS entry choice when
	    adding user to database.
	  - Implemented pql_bind9_del_zone() which will, recursivly, delete a DNS zone
	    of choice (called with base DN where zone is and the zone name).
	  - Update wording in delete domain question notice.
	  - Allow for calling config_ldap.php with ONE specific LDAP config type and
	    only show that, instead of showing everything in one page.
	    + Slight restructuring and renaming of show config options.
	      -> phpQLAdmin config and LDAP server config in separate branches.
	    + Added separate showing of LDAP syntaxes, matching rules etc using the
	     'new' config_ldap.php page.
	  - Page to show LDAP connection and database status ala Sun ONE Directory
	    Server statistics page using the 'cn=Monitor' backend. This backend is not
	    complete in any way, but I show what's there...
	  - Move the 'Create DNS template zone file' to DNSzone file instead of the DNSInfo.
	  - If authentication failed (when logging in), include the user name value previosly
	    entered when requesting re-authentication. If this happen, focus on the password
	    field, not the username field.
	  - When chaning a users login shell, try to default to the users current shell.
	    If there is none, default to /bin/false as previosly.
	  - Fix the add/change/delete administrator for branch. This was quite broken, and
	    only worked occasionally. Now it seems to work every time, everywhere. There
	    are two places where this can be done - in the 'User details->User access'
	    page (where you give a user admin rights for specific branch(es), and in the 
	    'Domain details->Default domain values' (where you give a specific user access
	    to the current branch).
	  - Show user access to EZMLM mailinglists if that's used/defined. Duplicate
	    the code that shows branch admins. Reword the two to make it clear which
	    is which...
	  - Wherever a host-/domainname (be it ldap server, locals/rcpthosts information
	    and what not) is SHOWN (i.e. not in any URLs), IDNA decode it to show the
	    international character, not the IDNA code.
	  - _If_ we should autogenerate UID, HomeDirectory and/or MailDirectory, we must
	    do that earlier..
	    BUT:
	    + Only if we have the auto generation function(s)
	    + We have a default directory base for this domain
	  - Possibility to clear the $_SESSION array. This needs to be done if/when the
	    LDAP server configuration changes (we have updated the schemas, enabled/disabled
	    the Monitor backend etc, etc). Previosly we had to logout and then login again
	    for the update to be noticed by phpQLAdmin.
	  - Add an attribute for VAT number (for branches).
	  - More information about a branch/domain/company - VAT information and 'Miscellaneous'
	    which is a multiline field.
	  - Move "Automatically add hostname to domain for replication" and "Automatically
	    replicate domains to {locals,rcpthosts}" booleans from Configurations->Globals
	    to 'Configurations->[BRANCH]'. It's a branch variable, not a global phpQLAdmin
	    value...
	  - Highlight the current branch - all it's subbranches and users in the left user
	    frame - looks GREATE in a fully DOM compliant browser, not so bad in Opera!.
	  - UTF-8 encode values for attributes postalAddress, registeredAddress and
	    homePostalAddress.
	  - Hide the "Branch Details" behind the ADVANCED MODE.
	  - Fold and unfold attribute names and attribute OIDs simultaneous, not separate
	    in the 'LDAP Server Configuration->LDAP Object classes' page.
	  - Show (part of) the 'Documentation' branch even if not running in ADVANCED
	    mode and isn't allowed to create branches...
	  - Rearrange the top buttons in the 'Domain Details' page - put 'Registred Users'
	    and 'Change values of all users' _after_ the branch information and then after
	    that, the 'MX Information'.
	  - Support the creation of a 'Alias object' - a referral from one object
	    to another (real) one. Currently only works correctly within the same
	    server...
	  - When adding a user, show ALL QmailLDAP/Controls objects to choose from for the
	    mailHost value (not just the first one).
	  - When adding a user, and there's only one QmailLDAP/Controls object, AND there's
	    no DNS entry for the domain(s), THEN the QmailLDAP/Controls object is the default
	    (CHECKED).
	  - Add links to some Qmail and Qmail-LDAP sites in the left (user) frame.
	  - Allow replications of locals and/or rcpthosts to take place in the 'Control
	    Details->[HOST]->Locals and RCPT Hosts' page.
	  - Retreive (and show) the ldapCluster value in the base view of the 'Control
	    Details->[HOST]' page.
	  - When/if deleting a QmailLDAP/Controls object, we need to know what to do
	    with user(s) that might have this as their mail host. There's three options:
	    Ignore, delete and move. Move gives an option to WHERE to move the user(s).
	    Show all QmailLDAP/Controls objects in this database AND a 'user specified'
	    where the admin can override any value(s).
	  - If 'Manage EZMLM mailinglists' in the 'phpQLAdmin Configuration->Global configuration'
	    is true, we also need an option to set the path to the ezmlm-* commands...
	  - Have the 'Add user' link not only in subbranches, but also in the top domain
	    branch. This was always the case if there WAS no subbranches. These two locations
	    is used later when adding user(s) - if called with a subbranch, don't show the
	    'Put user in subbranch ...' selector. Only show that if we're called from the
	    top domain branch 'Add user' (provided that there ARE subbranches).
	  - Don't offer the KERBEROS password scheme if it's a mail account (no uid/gid
	    number) OR the object class(es) we've creating users with don't allow [ug]idNumber.

	Misc changes	
	  - Configurable lenght of characters/numbers that is autocreated (when auto-
	    creating a username - uid).
	  - With the resent definition international characters in the DNS system (and
	    availibility of this in the .se zone), we need to correctly decode and encode
	    domain- and hostnames (etc) with international characters. This is done with
	    the PHP-IDN module (also by yours truly).
	  - Offer to create a DNS zone in ldap when adding both default and additional
	    domain names.
	  - Move all button generation to a PQL function - pql_generate_button(). That
	    way it's easier to generate buttons without poluting the code to much with
	    mixed HTML/PHP code...
	  - Add missing (or faulty) CVS Id tags in some files.
	  - Change URL link to anthill (Bug Tracker) and list server (it's now run on
	    separate IP to avoid using port 23000).
	  - Only show the ACI button if ACI_SUPPORT_ENABLED is set.
	    + Instead of checking that the user_generate_aci() function exists every
	      time, we do that in the pql_config.inc file (at the bottom) and use the
	      global variable ACI_SUPPORT_ENABLED to check if to use ACIs.
	  - Shutup PHP errors by tripple-check (use isset()).
	  - Adding strings is done with dot, not plus.
	  - Dale Wiles have been working on removing the dependency for the PHP setting
	    'register_globals'. This means that all occurences of $GLOBALS (and all other
	    session variables set with session_register()) and values sent from one page
	    to the next in the URL needs to be referenced with $_SESSION and $_GET (or
	    $_REQUEST) respectivly. Also, $PHP_SELF needs to be changed to $_SERVER["PHP_SELF"].
	    + This is however not 100% complete, so please disable register_globals, and
	      report any/all bugs at the BTS (Bug Tracking System).
	  - When error occures, try to catch the most common once (those most occuring
	    on the mailinglist) and give a short description/remedy.
	  - Changed the mail account type name from "normal" to "mail".
	  - Allow the editing of UID and GID number(s).
	  - As of Qmail-LDAP v20030901, the mailQuota attribute have been split into TWO
	    attributes - mailQuotaSize and mailQuotaCount. phpQLAdmin needs to know which
	    quota attribute(s) to use when it stores the value into the database.
	    + Change the define PQL_GLOB_ATTR_QUOTA to PQL_GLOB_ATTR_QUOTA_VALUE to distinguish
	      it from the new defines
	    + Add the defines PQL_GLOB_ATTR_QUOTA_{SIZE,COUNT} for the new quota attributes
	    + Rename PQL_GLOB_ATTR_QUOTAWARNING to PQL_GLOB_ATTR_QUOTA_WARNING (added an
	      underscore) to make it conform with the other PQL_GLOB_ATTR_QUOTA_* defines.
	  - Retreive the domain/branch default quota, and use this (if it exists) when
	    creating the user.
	  - Simplifying defines (only have two now - PQL_ATTR_* and PQL_CONF_*).
	  - Fully support LDAP URI's as 'path to LDAP server'.
	    + Don't show the :port string if using LDAPi.
	    + URL decode the path (LDAPi require that the path is URL encoded).
	  - A semi-LDIF showing a fully loaded root DN added (demo/database-fredriksson.txt).
	  - More and better support for changing attribute names (if using a special LDAP
	    server which haven't the 'standard' attributes etc).
	  - Language update - hardcoded language removed in lot's of places.
	  - If we fail to add the user and we get error number 32 (No such object), we
	    try adding the ou=People container leading up to the user RDN. If THAT
	    succeeds, THEN we try readding the user object.
 
	API changes
	  - Rearrange functions and group them. Functions dealing with users in one
	    place in the file, functions dealing with domains in their etc...
	  - Functions have been removed, moved and/or changed name. This to simplify
	    the API.
	    + maybe_{decode,encode}		-> pql_maybe_{decode,encode}
	    + pql_replace_userattribute() 	-> pql_replace_attribute()
	    + pql_get_domains()			-> pql_domain_get()
	    + pql_get_user()			-> pql_user_get()
	    + pql_get_domain_value()		-> pql_domain_value()
	    + table_bgcolor()			-> pql_format_table
	    + format_error()			-> pql_format_error_span
	    + pql_errormsg()			-> pql_format_error_msg
	    + print_status_msg()		-> pql_format_status_msg
	    + check_hostaddress()		-> pql_check_hostaddress
	    + check_email()			-> pql_check_email
	    + non_internationalize()		-> pql_format_international
	    + pql_set_domain_value()		-> pql_domain_set_value()
	    + pql_domain_value()		-> pql_domain_get_value()
	    + pql_replace_admins()		-> pql_domain_replace_admins()
	    + pql_get_userquota()		-> pql_user_get_quota()
	    + pql_get_user_letter()		-> pql_user_get_letter()
	    + pql_get_user_number()		-> pql_user_get_number()
	    + pql_print_filesize()		-> pql_control_print_filesize()
	  - Functions removed:
	    + pql_search_attribute()
	    + attribute_verify_objectclass()
	  - Functions renamed and moved to pql_search file:
	    + Function pql_get_dn()
	    + pql_get_userattribute()		-> pql_get_attribute()
	    + pql_get_userentry()		-> pql_get_object()
	  - Functions renamed and moved to pql_units file:
	    + pql_get_subbranch()		-> pql_unit_get()
	  - Functions moved to pql_formating file:
	    + pql_create_ldif()			pql_complete_constant()
	    + pql_ldap_error()			pql_format_error_msg()
	    + pql_format_error_span()		pql_format_status_msg()
	    + pql_format_table()		pql_format_international()
	    + pql_maybe_encode()		pql_maybe_decode()
	    + pql_maybe_idna_encode()		pql_maybe_idna_decode()
	    + pql_parse_quota()			pql_ldap_mailquota
	    + printr()                		lc()
	  - Functions changed/splitted into multiple functions
	    + pql_replace_attribute()		+ pql_missing_objectclasses()
	  - Simplify the creation of the tree view - moved to separate functions.
	    Opera and non-opera, as well as 'top' and 'link' funcs. Should be much
	    more generic and most of all - higher code redability!
	  - Implemented pql_unit_exist() and pql_unit_add()
	  - pql_get_mx() now only takes one arg (the domainname to check). The
	    QmailLDAP/Controls connection is done within this function instead
	    of externaly (makes more sence - we might want to only check DNS).
	  - API change: pql_user_exist() now takes THREE arguments (added was
	    search base DN).
	  - Added option (default=NULL) to pql_bind9_get_zone() to get info about
	    a specific zone instead of getting ALL of them at once.
	  - Instead of dupliating code (creating a variable that contains a correct URL
	    value - urlencoded and ' allowed), I've created a pql_format_urls() function
	    which will/can do EVERYTHING that is needed when creating a value to be sent
	    as a URL.
	  - Added (additional) option to pql_get_rootdn() - source of call. I.e. where
	    we're called from (for the 'This is weird' message)...
	  - Rewrite pql_domain_get() - Look for either one of these:
	    + 'ou=People' (define PQL_CONF_REFERENCE_USERS_WITH) just below the root DN.
	    + User(s) just below the root DN
	    + Branches (define PQL_CONF_REFERENCE_DOMAINS_WITH) just below the root DN.
	  - Rewrite pql_get_next_uidnumber() so that it can be used both to get minimalUIDNumber
	    _and_ the new 'minimalGIDNumber' attribute. Call it pql_get_next_ugidnumber()
	    instead to indicate this.
	  - To use a TRUE/FALSE value in an if(), we need to make sure it's a BOOL.
	    I wrote a function pql_format_bool() to avoid code duplication that creates
	    the variable as a 'boolean', and setting the value to 1/0.
	  - The function pql_search() must have the option to do SUBTREE, ONELEVEL and
	    BASE searches for an attribute. Othervise we're not finding the correct
	    organizational unit for a branch.

	Schema changes:
	  - Add minimumGIDNumber (OID: 1.3.6.1.4.1.8767.3.2.3.6) for auto user generation.
	  - Create a new object class phpQLAdminInfo (OID: 1.3.6.1.4.1.8767.3.1.4) which
	    will host DOMAIN/Branch informations (such as VAT-Number etc) for the domain.
	  - Split phpQLAdminConfig object class into two - phpQLAdminConfig and
	    phpQLAdminGlobal. The first is for branch configuration and the other
	    is for global configuration (paths etc). phpQLAdminGlobal is a new
	    object class (OID: 1.3.6.1.4.1.8767.3.1.2).
	  - Move all the Apache webserver configuration attributes (web*) to separate
	    OID tree - 1.3.6.1.4.1.8767.3.2.5.*.
	  - Move userNamePrefixLength and vatNumber to the end of the 'Misc values' -
	    OID tree 1.3.6.1.4.1.8767.3.2.4.*.
	  - New webserver attribute 'webServerName' - OID: 1.3.6.1.4.1.8767.3.2.5.2.
	  - Renumber all webserver attributes. This because I wanted a 'webServerName'
	    just after the existing webServerIP.

phpQLAdmin 2.0.17 Release (Oct 30 2003)
	Bug fixes
	  - Missing inclusion of the domain and/or rootdn value in URLs.
	    Closes bug 47
	  - Spelling error (s/, /=>/) in use of pql_complete_constant(array()).
	  - URL decode the domain DN at the correct time in each of the attribute
	    change page (when building the message).
	  - Add the root DN value to the call for bind9_add.php.
	  - Misc PHP, HTML and URL code fixes. Includes 'remember variable
	    throughout the form and urlencode/-decode in the correct places and missing
	    values etc.
	    Closes bugs 49, 56 to 59, 63, 64
	  - Misc missing % in call to pql_complete_constant() fixed.
	  - Final touches of the Bind(9) editor. Should now be able to do everything
	    needed with a zone in LDAP.
	  - Only force the dcOrganizationNameForm objectclass if we're using 'dc'
	    (domain component) as the branch separator.
	  - Avoid future overloading of $value by replacing it with a truly uniq name in
	    include/pql_config.inc.
	    Closes bug 52.
	  - Fix user_add.php form errors (checks in wrong places).
	    Closes bug 65
	  - Make sure (!) that any '{crypt}' passwords really contain DES encrypted
	    passwords by using a salt to crypt().
	    Closes bug 66

	GUI layout change
	  - Say 'LDAP Server' instead of 'Host' in the left frame - more descriptive.
	  - Rudimentary support for webserver administration. Changes to the schema was
	    done!
	  - Support Opera (folding branches).
	  - Option to set the account expiration date. This uses the shadowExpire
	    attribute allowed in the shadowAccount (which require only the uid
	    attribute). Third party javascript (jscalendar) used to choose expiration
	    date for account. http://dynarch.com/mishoo/calendar/calendar.epl

	Misc changes
	  - Basic webserver editor with script to extract information and create a
	    part of the httpd.conf for Apache. See the bottom of the README file.
	  - Remove the remainder of the old idea of Bind(9) editor (separate frame to
	    the left).
	  - New, improved way to output icons -> arrays and for() loops. Uses new
	    function pql_generate_button() that simplified much.
	  - If surName is '_', don't show it in the left frame. This is for use with
	    account such as 'Information' etc wich isn't a (physical) person...

phpQLAdmin 2.0.16 Release (Aug 28 2003)
	Bug fixes
	  - Remove hardcoded references to attribute names. Use pql_get_define()
	    with a define set in include/pql_attributes.inc instead.
	    Close bug 26
	  - ACI support added.
	    Close bug 14
	  - PHP parse errors fixed.
	    Closes bugs 35, 39 and 40.
	  - Set PQL_CONF_REFERENCE_USERS_WITH to 'uid', don't get
	    the PQL_GLOB_ATTR_UID and THEN set PQL_CONF_REFERENCE_USERS_WITH.
	    Closes bug 41.
	  - Rewrite of the pql_get_rootdn() function which have been broken for
	    quite some time. It worked for some (like me), but in general it was
	    broken! The (new) solution is to go through each configured
	    namingContexts (root DN), doing a regexp match against the DN we
	    want to know the root DN for.
	  - Strip 'ou=' from the _attribute_ (not the DN) when adding the
	    PQL_GLOB_SUBTREE_{USERS,GROUPS} part of a new branch. This failed
	    miserably with OpenLDAP 2.1 (but it should have in 2.0 as well).
	  - Only retreive attributeTypes etc from the server (the maybe_encode()
	    function) if both attrib and linkid is set.
	  - Only add the accountStatus attribute if we have a suitable objectClass
	    choosen for this user/branch.
	  - Got wrong value from the _chmodown() - include/pql_ezmlm.inc. It's
	    called with a username to get info about, but we/I used the global
	    mailing list user value.
	  - When creating a domain/branch with a non-US character, only the entry
	    value was UTF-8 encoded, not the DN. This lead to a non UTF-8 encoded
	    DN and hence a mismatch between entry/dn attribute...

	GUI layout change
	  - Rewrite the layout (and part of the functionality) to better
	    be able to change, delete and add an SMTP route (layout according
	    to the rest of the system).
	    + We now have two MAIN views (or 'ways to present information'.
	      One from the controls frame-> qmail-remote -> smtproutes and
	      the other from the domain details -> Control options -> Add/Remove
	      domain from smtproutes) with two sub GUI's (change/add) each.
	    Close bug 36
	  - URL decode the domain/branch DN and offer to enter the default domain
	    name when creating/adding a domain/branch object.
	  - Ability to change the RDN of a user (ie, a 'modrdn'). Only availible
	    if LDAP version is equal (or higher for future use) to 3.
	  - Change "Control options" to "QmailLDAP/Controls Options" to distinguish
	    better from "Access Control Information" in the domain details page.
	  - Make sure we can have a ' in branch (also affects the user DN) by
	    removing \' which might come from a previous 'urlencode()' etc...
	  - If phpQLAdmin can't retreive givenName from the object, it will try
	    to get the commonName and split that into two (using space as delimiter).
	    The first word should be the firstname, and the second word is the
	    lastname. If that don't work either, try the gecos attribute...

	Misc changes
	  - Update of README.acl (using double quotes, not single
	    for 'by dn=...' ACL directive).
	    Closes bug 34
	  - Better working PQL_GLOB_HOST example with (included) demo database
	    in ./demo/*.ldif.
	  - Just after adding the domain/branch to the database but before anything
	    else, we need to update (all) QmailLDAP/Controls objects.
	  - Make sure we can have a ' in branch (also affects the user DN) by
	    removing \' which might come from a previous 'urlencode()' etc...
	  - Call include/config.inc:user_generate_{mailstore,homedir}() with an
	    additional parameter - type - which specifies if it's a domain/branch
	    or user object to create. This can be used to generate mail/home dir
	    differently depending on what type of object it is.
	  - Force loading of _ALL_ domains/branches if it's a super-admin.
	  - With the rewrite of the pql_get_rootdn() function, we can include
	    the root DN in more places which leads to better displaying of values.
	  - Sort and 'uniqify' locals/rcpthosts when updating a QmailLDAP/Controls
	    object.
	  - Updated qmailControl.schema, Now it works with OpenLDAP 2.x OIDs.
	    Thanx to Leonardo Fialho.
	  - Remove user from administrator/seeAlso attributes in all domains/branches
	    when removing user.
	  - Replace old RDN with new RDN in all administrator/seeAlso attributes
	    in all domains/branches when renaming DN.
	  - If a user is deleted, check all local mailinglists for subscription and
	    unsubscribe mail address(es).
	    + Only do list forwarding after a successfull modification (subscription,
	      unsubscription, list creation etc) if the function list_forward() exists.
	      It doesn't if we're deleting a user (and hence want to unsubscribe user
	      from ALL mailing lists).
	    + When calling unsubscribe(), the function is called with a listname
	      (can be numeric). Unfortunatly the variables was mixed up, so we ended
	      up getting the listpath from a list that don't exists. We only need to
	      values - listpath and domainname (the latter is used in the redirect
	      after success).
	  - Non-internationalize the home/branch directory when creating a domain/branch
	    or user object.

phpQLAdmin 2.0.15 Release (Jul 15 2003)
	Bug fixes
	  - Show the 'Registered users' in the user details page if
	    we're not using advanced mode. This circumvents the empty
	    (and non functioning links) pages.
	    Closes bug 7
	  - If we have a default password scheme configured for a domain
	    branch AND we're not running in advanced mode, don't show
	    the password scheme question.
	    Closes bug 6
	  - If we have the function ImageCreateFromPng(), then create
	    and output the image using PNG. If not, but we have
	    ImageCreateFromGif(), use GIF. If neither, try
	    ImageCreateFromJpeg() and output as JPEG.
	    Closes bug 11
	  - Get the root DN (namingContexts) even if it's a _multi_
	    leveled DN. Patch by Emmanouil G. Karatzas.
	    Closes bug 9
	  - Show the Actions (delete branch) button if we're running
	    in advanced mode.
	    Closes bug 15
	  - Correct the Domain information -> Registered users table
	    (showed 'No users in this branch!' even if there WAS users).
	    + Correct the links to the user(s) detail page (missing user
	      DN).
	    Closes bug 18
	  - Slightly change how pql_domain_exist() works. This makes it
	    easier to verify the existence of a domain deep down the tree.
	    + With this corrected, phpQLAdmin will not say that it couldn't
	      delete the branch even if it was removed from the database.
	    Closes bug 17
	  - The checkbox name="subonly" uses the $checked["trailers"]
	     value instead of $checked["subonly"] in ezmlm_add.php.
	  - The minimumUIDNumber attribute is a branch configuration
	    option, not a global one (hence the 's/_GLOB_/_CONF_/g'
	    change).
	  - When creating a user or domain, include the root dn when
	    redirecting to the corresponding details page. If it isn't
	    included, we won't see/get all the branch defaults we might
	    need.
	    Closes bug 20
	  - Implemented change of Bind9 zone values.
	    Closes bug 1
	  - URL encode namingContexts and domain DN in the left frame.
	    This so we can have strange characters (like '&') in the
	    branch name.
	    Closes bug 23
	  - The array '$ezmlm->mailing_lists_hostsindex' also contains
	    a COUNT value (which is NOT an array). This value is a
	    counter on how many lists/domains that exists in the system.
	    Don't try to do a foreach on this value, it will give an
	    error like 'Invalid argument supplied for foreach()'.
	    Closes bug 24
	  - Don't output the 'No users in this branch!' if there is no
	    users. We want the possibility to add users from this page.
	    Closes bug 28
	  - If we're modifying an additionalDomainName, we want to remove
	    the old value and add the new.
	    Closes bug 30
	  - In the domain details -> Control Options, show each domain that
	    is configured in the branch (default and additional) separately.
	    Allow for deleting these domain(s) from the QmailLDAP/Controls
	    object(s). This EVEN if automatic replication is configured.
	    Closes bug 19
	  - Only create UID, givenName, [ug]idNumber, gecos and homeDirectory
	    if we're referencing users with UID (as opposed to CN etc).
	  - When user-/sur- and/or lastname have been entered, and we're
	    running in advanced mode we should have figured out the mail
	    host. This was previosly done one page to late, so we never
	    got a suggestion on host...

	GUI layout change
	  - Possibility to set a value in the domain branch saying we
	    automatically would like to create username (uid) and/or
	    email address. This is done with two new attributes added
	    to the phpQLAdminBranch objectclass. The attributes oid is:
		autoCreateUsername	1.3.6.1.4.1.8767.3.2.1.14
		autoCreateMailAddress	1.3.6.1.4.1.8767.3.2.1.15
	    Closes bugs 3, 4 and 5
	  - Added the possibility to allow/disallow user from viewing/administrating
	    the QmailLDAP/Controls information by adding a new attribute
	    to the phpQLAdminBranch objectclass. The attribute OID is:
		controlsAdministrator	1.3.6.1.4.1.8767.3.2.1.16
	    Closes bug 13
	  - Disable the showing of the icons 'Delivery properties',
	    'Mailbox properties' and 'User access' if we don't run in
	    advanced mode.
	    Closes bug 12
	  - Allow for setting a new branch default - Automatic username
	    prefix. This option is only visible in the domain/branch
	    details page if 'Automaticly generate username' is set to
	    true. Required a new attribute to the phpQLAdminBranch
	    objectclass. The OID is:
		userNamePrefix          1.3.6.1.4.1.8767.3.2.4.13
	  - Duplicate the 'Defined in {rcpthosts,locals}' in the domain
	    details page. This new option is 'Defined in smtproutes'.
	    + To make this work, it is nessesary that the 'smtpRoutes'
	      (OID: 1.3.6.1.4.1.7006.1.2.1.35) attribute have a matching
	      rule of caseIgnoreIA5SubstringsMatch. What this means
	      in plain English is that the line:
		'SUBSTR caseIgnoreIA5SubstringsMatch'
	      is added to the attribute definition in qmailControl.schema
	      of your LDAP server. If this is not done, we won't be able
	      to do a regexp search of the attribute...
	    Closes bug 25
	  - 'Complete' redesign. Put {user,sur,last} name, password scheme
	    and password at the top of the page instead of at the bottom.
	    It's "more important". Put email address at the bottom (in
	    the 'Additional account properties' table).

	Misc changes
	  - Configurable define in config.inc which dictate what user
	    (system account) ezmlm mailinglists is owned by.
	  - Started a new language system taken from phpRecipeBook by
	    Todd Rogers <nazgul26@users.sourceforge.net>
		http://sourceforge.net/projects/phprecipebook

phpQLAdmin 2.0.14 Release (Jun 12 2003)
	Bug fixes
	  - Link to control_edit_attribute.php should include the MX host
	  - If we can't validate administrator, don't die with LDAP error,
	    return false (ie, admin is not valid).
	  - Maximum users for domain is just that 'FOR DOMAIN'! Not for
	    the whole three! I looked in the root dn/namingContexts for
	    this value, which is wrong!
	  - Don't force create a homedirectory if we're creating a 'Mail
	    account'. We re-use the mailMessageStore.
	    + We also force [ug]idNumber by re-using the forwarding account
	      numbers. That is, Mail and Forwarding accounts ALL use the
	      same uid and gid numbers. The reason for this is that Qmail
	      won't accept mails for a user if they don't have a uid/gid
	      number between a specific range (compile time). And we can't
	      add the uid/gid numbers if we don't have a homeDirectory
	      (schema enforced).
	  - When changing a QmailLDAP/Controls object, depending on where
	    we where called from (from the domain details - remove/add
	    rcpthost), redirect to original page (control_detail.php or
	    domain_detail.php depending).
	  - Only create the principal in the example create user script
	    if it is a {KERBEROS} password.
	  - If we're NOT running in advanced mode, and we're creating a
	    'Mail account' user, we should have the same values for homeDirectory
	    and mailMessageStore. This is done by using the user_generate_mailstore()
	    function instead of the (expected) user_generate_homedir().
	  * When trying to save:
	    a. Make sure we have a complete email address. If the 'email_domain'
	       is set (in the form), use that. Otherwise default to the defaultDomain
	    b. Check if we have a MX host value for this email address. If we
	       haven't, look in the LDAP database, looking for any (the first)
	       QmailLDAP/Controls object in which this domain exists in 'locals'.
	    c. If an MX (or QmailLDAP/Controls object) can't be found, show
	       an error message, and let the user/admin specify one manually.
	  - Fixing a security hole. If we where a branch admin, we could
	    give ourself (full) access to the system by specifying what
	    branch (DN) to have access to. In the user details page, the
	    'Give (more) admin rights' page did not filter out branches we
	    DON'T have access to. It shows ALL branches/DN's.
	  - The QmailLDAP/Controls DN is a GLOB(AL) option, not a branch
	    global option.
	  - Use email domain (from form) when constructing email address
	    when adding an alternative email address. DON'T use the
	    default domain!
	  - If user (logged in) isn't super-admin, don't allow
	    (ie show) 'remove user from admin list'.
	  - Some variable overload fixed ($value was used in pql_config.inc
	    and overwrote the one we WANTED to change in the *.php files).
	  - When changing common name (CN), givenName is NOT the same as
	    CN so update givenName with the firstname and SN with the
	    lastname.
	  - If mailHost is unset when saving (and not advanced mode),
	    we still want the question. This is done by checking the
	    existence of the value, and if not create an error text
	    (etc) which is shown togheter with the input question.
	    + If we DO have a MX or QmailLDAP/Controls object, use
	      it! Oups.

	GUI layout change
	  - Add/Change/Delete additional domain name(s) into the
	    branch/domain, not just the 'Default domain name'. Using
	    the new schema attribute 'additionalDomainName' (with OID
	    number 1.3.6.1.4.1.8767.3.2.4.8).
	    + If we have multiple domains for the domain/branch, put
	      a <select> menu for specifying main/primary email address.
	      Optionally allow for creating mailAlternateAddress with
	      (all) the other domains...
	  - Don't show the email address/alias options if we're creating
	    a Shell account - that's without mail etc.
	  - Use checkbox instead of radio button when adding an administrator
	    to a domain or when adding objectclass(es) to be used in branch.
	    + Sort by domain branch, not root DN. The root DN is irrelevant,
	      the branch(es) isn't!
	  - When adding/replacing a default domain name and/or a additional
	    domain name, output a checkbox for each QmailLDAP/Controls
	    object that exists in the database. Write domainname to
	    each of the hosts/objects. Differentiate between locals
	    and rcpthosts (two different questions/options). Allow for
	    writing to 'All hosts/objects'.
	  - Splitting out output logic to separate files in tables/.
	    That way it's easier to 'redesign' ONE table, without
	    much clutter...
	    + At the top of the page(es), show buttons (gif by
	      default, if that's not availible, an ugly two color
	      flat icon) which link to self, with option on what
	      type of frame to show.
	    + Default information to show if not running in
	      advanced mode is 'Branch Owner'.
	    + Remember what view we came from, so we end up with
	      the same view even after a modification of a value.
	  - Sort users in left.php by 'Lastname, Firstname'
	    (givenName and SN) instead of 'Firstname Lastname'
	    (CN).
	  - Sort locals and rcpthosts in the controls detail page.
	  - Allow manual replication of rcpthosts (just like locals).
	  - Allow for setting default password scheme in a branch.
	    This required a new attribute, defaultPasswordScheme
	    with the OID 1.3.6.1.4.1.8767.3.2.4.9
	  - Possibility to enter a already encrypted password when
	    creating a user. This password could (for example) come
	    from /etc/{passwd,shadow} etc.
	  - Allow to set/modify/delete the new ezmlmAdministrator
	    and maximumMailingLists attributes. These are intended
	    to control who can create/delete/modify mailinglists and
	    how many mailinglists that's allowed in a branch. ISP stuff.
	    + If we have used up all our 'mailinglist count quota',
	      we can't create more.

	Misc changes
	  - Replicate domain to RCPTHosts to host which have it
	    defined. Treat RCPTHosts the same way as Locals -
	    ability to replicate and update QmailLDAP/Controls
	    automaticly when adding/removing or changing a
	    domain/branch. This is done with the help of a
	    new attribute, autoAddRCPTHosts with OID number
	    1.3.6.1.4.1.8767.3.2.1.12.
	    + Differentiate between locals and rcpthosts when
	      doing manual replication (ie, when we've choosen
	      to replicate either locals or rcpthosts manually
	      for a specific QMailLDAP/Controls object).
	    + Add additional domain name(s) to QmailLDAP/Controls
	      object when doing manual replication.
	  - Don't check the passwords for exactly typed. We're
	    only given the option to input the password ONCE, so
	    there is no verification to be done. We're shown the
	    password as it is typed in, so we can verify with the
	    eye ourselfs :)
	    + If we're changing our own password (ie, the password
	      of the user logged in), we must update the global
	      password variable. Othervise we'll get a bind error.
	  - When validiating an administrator (pql_validate_administrator())
	    we search for objects with the 'administrator' attribute
	    set. Othervise (searching for objectclass=*) we'll get
	    the WHOLE tree. If it's a big DB, this will take a while...
	  - When we're getting domains (pql_get_domain_value()),
	    we must have the option to retreive ALL branches we have
	    access to - EVEN the root DN. This is not wanted in the
	    left frame (for example) so add an option (default zero),
	    that we can use to check if we should include the root
	    dn or not.
	  - Support for adding or removing a attribute value from a
	    object in the function pql_modify_userattribute(). This
	    is controlled depending on wether $oldvalue and/or $newvalue
	    is set or not.
	  - When adding/modifying the default domain and/or the additional
	    domain name, add/modify the corresponding QmailLDAP/Controls
	    object(s) as well.
	  - Not everyone might want to add the hostname to each and
	    every domain added to locals/rcpthosts (hostname.domain.tld)
	    so make this a config option. This required a new attribute,
	    autoAddHostName with OID 1.3.6.1.4.1.8767.3.2.1.12.
	    This is turned of by default and is a toggle/boolean.
	  - Possibility to have the DNS information under the domain
	    branch (subbranch ou=DNS). This is primarily for Bind9 SDB
	    LDAP driver (http://www.venaas.no/ldap/bind-sdb/ for driver
	    information).
	  - Allow for changing deliverymode (autoreply) even for ordinary
	    user(s).
	  - Full (?) international support. National characters allowed in
	    more (most?) attributes AS WELL AS in the (R)DN.
	  - Allow for having '%' in the username (uid attribute). This so
	    that we can replace '@' with '%' to get the same username as
	    email address - '@' is not allowed in username...

phpQLAdmin 2.0.13 Release (May 5 2003)
	Bug fixes
	  - Don't check the domainname when creating a new branch. If the
	    user want to create it in a certain way, let him/her!
	  - We're getting an array from the function pql_get_mx()! Use the
	    SECOND value. Now I know why I sometimes got TWO mailHost
	    attribute values. The first is a TRUE/FALSE value!!!
	  - Some missing define to global $config translations fixed.
	  - Don't force a reload of the Controls frame unless we
	    specificly ask to do it (ie, setting the rlnb variable).
	  - Before changing the gecos and the givenName, let's see
	    if it's in the object. If is, change it, othervise don't.
	    That way we get around the missing objectclass error if
	    it doesn't exist (and we don't have an objectclass for
	    them).

	GUI layout change
	  - Password scheme is separate from password, using a radio input
	    instead of <select>.
	  - Now the password really IS the password, not the principal (even
	    if we're backward compatible with the old behavior where you
	    specified the principal name into the password field).
	  - Create the userPassword attribute differently depending on what
	    scheme we're using.
	  - We know what base to use for adding branch, so don't use
	    'the first base DN found' - adding branches in DB with multiple
	    namingContexts.
	  - Show input fields for homedirectory (when creating a user) if
	    it's a normal OR system account. We need homedir to be able
	    to use IMAP/POP...
	    + Use this info when creating an account (all types exept
	      a forwarding account).
	  - Show a radio button on what to do with the users mailbox when
	    deleting a user - Delete, Archive or donate it to another user.
	    The actuall action is not yet implemented, just the frameworks.
	  - One size smaller on all font sizes in the left frame(s).
	  - Use radio input with availible password schemes to choose
	    from (when adding a password scheme to branch).

	Misc changes
	  - Added a cron script to (possibly) restart qmail if
	    locals/rcpthosts have been changed - restart_qmail.pl.
	  - Added the possibility to create a Debian GNU/Linux package
	    (I'm also the official Debian GNU/Linux maintainer).

phpQLAdmin 2.0.12 Release (May 3 2003)
	Bug fixes
	  - In attrib.deliverymode.inc, remove all backslashes in
	    mailReplyText (we got invalid syntax when doing ldap modify).
	  - Variable overload in controls manager fixed.
	  - Deletion of attribute in pql_set_domain_value() (re-)fixed.
	  - Java script error when changing domain/branch admin/contact fixed.

	GUI layout change
	  - User details page:
	    + Mail information contains a mailto HREF.
	    + Organise domains the user have access to by it's top DN
	      so that we can have a correct URL link to the domain's
	      details page.
	  - In the 'LDAP server configuration' page, show each MUST/MAY
	    attribute (and it's OID number) in a foldable list for each
	    of the attributes the LDAP server knows about.
	  - Allow for setting a limit on how many users allowed under
	    a domain branch
	  - Only show version information on the 'home' page if we're
	    running in advanced mode.
	  - Show the branch' RDN - in the future we should be able to
	    change (ie rename) it...

	Misc changes
	  - Removed functions pql_remove_userattribute(),
	    pql_replace_userattributes() and pql_add_userattribute().
	    + The exact same functionality is in function
	      pql_replace_userattribute() (with some slight
	      modifications)
	  - Slight rewrite of the pql_replace_userattribute() function
	    to allow for fixing of LDAP error 65 (Object class violation).
	    + If we're modifying a value and we're missing an objectclass
	      and the objectclass we find that REQUIRE (MAY) some
	      attributes which we're missing, ask user/admin to fill
	      in the missing attributes, THEN retry to add/modify the
	      object.

phpQLAdmin 2.0.11 Release (Apr 28 2003)
	Bug fixes
	  - Move the checking for { and } (password scheme) to standalone to
	    make absolutly sure it's invoked...
	  - If a configuration option in LDAP is empty (which means we will
	    use the default values), an attempt to DELETE one value resulted
	    in a failure. In that case, if we don't get anything from the LDAP
	    database, use the default values as old values, and remove the
	    attribute value of interest.
	  - Branches which is dc, o or ou organized is ok to have without dot.

	GUI layout change
	 - Possibility to modify the minimum [UG]ID number for user creation.
	   Attribute minimumUIDNumber (OID: 1.3.6.1.4.1.8767.3.2.3.5) have been
	   added to the phpQLAdminConfig objectclass to support this.
	 - Add the possibility to add user to the 'super admin list' (one that
	   have access to create branch) by giving the option to be admin of
	   the top-most DN.
	   + Check the top-most (namingContexts) DN's if user is admin of that.
	     If he/she is, show that DN in the access list (user details page).

	Misc changes
	  - Added a new type of account - shell. This is like the System account type,
	    but without mail stuff.

phpQLAdmin 2.0.10 Release (Apr 27 2003)
	Bug fixes
	  - Got multiple backends (namingContexts) to work properly
	    Include reference to the root dn wherever we're referencing
	    the domain DN.
	  - When showing what the user have access to (in the user details
	    page), DON'T (!) do it with the USER_DN as reference! That's
	    the user who have logged in!
	  - With new SYNTAX of bool values (came with the new schema) we
	    must set TRUE/FALSE in the db, not 1/0.
	  - Missing attribute definition for baseQuota (default domain/branch
	    quota) in the schema.
	  - When running in non-advanced mode, when creating a user both
	    userhost and host was set, which lead to incorrect creation of
	    the mailHost attribute.
	  - Fixing the search engine. Must have been broken for quite a while!
	  - Remove some variables so we don't clutter the global variable
	    name space!
	  - Allow branch and top DN (namingContexts) to contain space

	GUI layout change
	  - Show the user DN in the left frame and in user details
	    if in advanced mode. Also, if the users are using CN (ie, not
	    UID) in the RDN (but HAVE a UID attribute), don't show BOTH.
	    Filter out duplicates.
	  - Cleanup of the table/table row etc for 'Access to DN' (user
	    details page).
	    + If we have access, the URL should be named 'Give (more)
	      admin rights', else 'Give admin rights'.
	    + Possibility to remove access to domain/branch (trashcan).
	  - New structure/layout in the config_details page:
	    + Show each Top DN (namingContexts) as a separate
	      column (actually two - one small for edit/delete
	      icon, one for data).
	  - Possibility to edit/add/remove {user,domain} object
	    classes, password encryption schemes per domain/branch,
	    user/domain reference attribute etc, etc.
	    + This is the beginning of a user template configuration.
	  - If we have write access to ezmlm/controls in ONE domain
	    at least, then show frame (provided the global setting
	    for each is true). If not, don't show frame.
	  - When selecting what user should have access to what domain,
	    show users in a menu similar to the left frame (expandable
	    menu).
	  - Allow for changing the whoAreWe attribute (previos
	    PQL_GLOB_WHOAREWE constant).
	  - Larger text/passwd input fields (30 chars).
	  - JavaScript snippets to open a small window which explain
	    problems with getting the subschemaSubentry attribute from BASE.
	  - Support for managing a Bind9 DNSSEC server. New schema attribute
	    'useBind9' with OID: 1.3.6.1.4.1.8767.3.2.1.10.
	  - New page (LDAP server configuration) which shows what
	    attributes and objectclasses the LDAP server knows about
	    (OID and descriptions etc).
	  - Possibility to set/change the user/domain creation scripts.
	    new schema attributes:
		externalScriptUser	1.3.6.1.4.1.8767.3.2.2.13
		externalScriptDomain	1.3.6.1.4.1.8767.3.2.2.14
	  - Possibility to set the Kerberos realm, principal name, keytab
	    to use with unattended kadmin use etc. New attributes in
	    phpQLAdminConfig objectclass:
		These two is also availible in krb5-kdc.schema (from
		OpenLDAP.org) and have to be uncommented in the schema
		if the krb5-kdc schema isn't used...
		krb5RealmName		1.3.6.1.4.1.5322.10.1.12
		krb5PrincipalName	1.3.6.1.4.1.5322.10.1.1

		krb5AdminServer		1.3.6.1.4.1.8767.3.2.2.15
		krb5AdminKeytab		1.3.6.1.4.1.8767.3.2.2.16
		krb5AdminCommandPath	1.3.6.1.4.1.8767.3.2.2.17
	  - Prettify the message output after adding/removing user/domain
	    etc. Ie, one msg on one line.
	  - Move the search engine from home to separate page which is
	    linked from the left frame.
	  - Instead of showing the search engine on the 'home' page,
	    it is now located in it's own page, with a link belowed the
	    Home tree (left frame).
	  - Only show the 'home' page trailer if we're running in advanced
	    mode - a luser shouldn't see this, it's for the admin only...
	  - Use the WHOAREWE variable instead of the DESCRIPTION. It's
	    the same thing, but the first is configurable at runtime from
	    the config page.

	Misc changes
	  - Replace all previous defines (constant variables) for
	    the new global configuration variable $config. This is
	    an absolute necessity to get domain/branch separate
	    configuration.
	    + Separate config per domain/branch.
	    + Don't set default {user,domain} objectclass(es). This
	      is configured in the config_details page and is site
	      and domain/branch specific.
	    + If it's a GLOBal value, set the option in each of the
	      root/top DN's availible (namingContexts).
	  - If we find more than one object when we're looking for
	    user we're loggin in as (example: one in each namingContexts),
	    then try each DN with bind() -> Success is a keeper!
	  - Cleanup of pql_get_domain_value() and pql_setup_branch_objectclasses().
	    + Redundant (ie, never executed) code removed.
	  - Prefix defines with either 'PQL_CONF_', 'PQL_GLOB_' or 'PQL_LANG_'
	    depending on type of define -  Configuration, Global or Language
	    constant/variable/reference...
	  - When adding a user to the LDAP database, double check with the
	    LDAP server that we can add the user...
	  - Example code snippet to create a Kerberos principal added (with
	    the help of a keytab) in create_user.pl.
	  - Create homedirectory if it's defined in the create_user.pl script.

phpQLAdmin 2.0.9 Release (Mar 29 2003)
	Highlights
	Bug fixes
	  - When ordinary user logs in, we don't know the domain.
	    Try to find it by traversing the DN backwards, looking
	    for attribute 'defaultDomain'.
	  - Use isset() instead of is_array() to get rid of
	    "Undefined variable ..." when running with E_NOTICE in
	    PHP4 config (error_reporting define).
	    + Instead of using define(), we have our own version of
	      this - pql_define() - that first check if the constant
	      is defined, and if it isn't it defines it. This to get
	      rid of 'Constant ... already defined' info if running
	      with E_NOTICE (error_reporting define).
	  - Include the domain in calls to user_{edit,add}_attribute
	    so we can find the default domainname. We need this,
	    because we need some domain defaults when changing attributes.
	  - Gecos is needed to do PAM/NSS LDAP login (ie, system
	    account), so construct the attribute from the fullname.
	  - Make sure we only include the language (en) file once.
	  - Schema changes: 
	    + Replace each 'caseIgnoreIA5Match' to 'caseIgnoreMatch'
	      on each DirectoryString syntax (1.3.6.1.4.1.1466.115.121.1.15)
	    + Replace each 'caseIgnoreIA5Match' to 'caseExactIA5Match'
	      on each IA5 String syntax (1.3.6.1.4.1.1466.115.121.1.26).
	    + Replace each '1.3.6.1.4.1.1466.115.121.1.27' with 
	      '1.3.6.1.4.1.1466.115.121.1.7' on each booleanMatch attribute.
	      - Thanx to Patrik Nilsson for this bugreport.
	  - Allow for search/base DN with a space. This means that we
 	    separate our PQL_LDAP_HOST entries with the '+' character
	    instead!
	  - Do a v3 bind by default. Fall back to a v2 bind if that didn't
	    work.
	  - Falty calling of ldap_read() when we where checking for the
	    base DN of the LDAP server (namingContexts). If '' is used,
	    the LDAP server starts the read from 'dc=com' (might be a 
	    faulty configuration on my part, but it seems strange non the
	    less). The base DN should have been NULL, not ''!
	  - If we have more than one domain (ie, branch in the tree), then
	    everything was shown as supposed. But if we only had one
	    (I tried a db with 'o=Turbo Fredriksson' as base, and no other
	    branches etc under this DN) we didn't get the whole tree.

	GUI layout change
	  - Dissalow the ezmlm frame if ordinary user.

	Misc changes

phpQLAdmin 2.0.8 Release (Jan 31 2003)
	Highlights
	  - utf8_{encode,decode}() 'Personal details' ('outlook' values etc) to correctly
	    catch national (ie, non-english) characters.
	  - Write protect user's top domain/branch.
	  - After we've fetched any configuration from the LDAP database' topmost DN,
	    we check if the user's DN is in the administrator attribute. If it is, we
	    allow domain/branch creation (ie, show the 'Add domain branch' URL).
	  - Allow for 'ordinary' users to login. They will only see there own name, no
	    domains etc. Filter out the edit links for the user. They should not be
	    allowed to edit some 'sensitive' information (loginshell, uid, mailbox/home
	    directory etc).

	Bug fixes
	  - LDIF example and documentation (README*) cleanup.
	  - OpenLDAP ACL example to allow 'dynamic' administrator access
	  - Don't use 'if(defined("PQL_LDAP_*"))' - false equals defined
	  - Duplicate 'owner' attribute for 'administrator' (removed SYNTAX/EQUALITY)
	    in schema.
	  - Filter out 'auto\.' from groups to allow user creation in.
	  - Don't get the domains TWICE (once when we start using pql_get_domain_value()
	    which verifies that we have access to the domain(s) and one using
	    pql_get_domain_value() which does no access control etc).
	  - Missing = in "form ... name=..." (user_add.php).
	  - If pql_get_domain_value() is called with something to search for ($match),
	    we have to use 'ldap_search()', othervise we use ldap_read() which do a
	    search with scope = BASE (only the current object).
	  - When deleting a user, remove all administrator references from all
	    domains/branches that lists the useras well.

	GUI layout change
	  - Only show a 'dropdown menu' if we can choose from more than one domain
	  - Only show the configuration edit/set links if we're administrator of/in the
	    topmost DN.
	  - Allow to make user administrator on the topmost DN (ie, create
	    domains/branches) in the user_details page.

	Misc changes
	  - Some files filtered through dos2unix to get rid of ^M
	  - Since the topmost DN now contain the administrator attribute, we must filter
	    that out when fetching domains, othervise we'd end up with the topmost DN
	    in domain/branch listing in the navigation frame...
	  - New function pql_validate_administrator() which checks a given DN for
	    existence of the administrator attribute, and if that contains the given
	    (user) DN.

phpQLAdmin 2.0.7 Release (Jan 28 2003)
	Bug fixes
	  - Correct usage of PQL_VERIFY_DELETE. Should have been '!PQL_VERIFY_DELETE'.
	  - When we're to delete a domain/branch, we retreive all organizationUnits (or
	    whatever) under the branch we're to delete. We then go through all these
	    entries, deleting them. The problem was that the subbranch was included
	    in this, so we ended up trying to delete the subbranch twice.
	  - Value 'value' was used else where, use 'set' instead (the attribute change
	    files already used this) when modifying (add/del) a QmailLDAP locals/rcpthosts
	    value.
	  - Only use 'add' or 'delete' actions when modifying a QmailLDAP locals/rcpthosts
	    value (add and delete IS a modify).
	  - Lowercase all attribute checks (so that switch/case combo works properly).
	  - Better description on how to set PQL_LDAP_CONTROL_AUTOADDLOCALS properly.
	  - Don't use 'if(defined(PQL_LDAP*))'. It won't work if it's FALSE.

	GUI layout change
	  - Reference the Administrator/Contact person with 'cn', not RDN.
	  - Better/more human readable description on the 'Personal details'.
	  - Rudimentary ACL tests - use attribute 'test' (bool) to check if it's ok
	    to modify values/attributes on the specific DN's (base/root DN and in
	    each domain/branch DN that exists in db).
	  - When changing a QmailLDAP controls object, don't redirect to domain details
	    page, go to the host's control details page instead.
	  - When adding a locals/rcpthosts value to the QmailLDAP controls object, don't
	    give all the previous values to add/remove nor show option to increase the
	    count (adding more input fields etc).
	    If we're adding a value, one single value should be added! The delete option
	    is availible through it's own URL through the control_details page.

	Misc changes
	  - Functions pql_control_update_domains() and pql_get_domains() have change
	    somewhat. Send the full class initialization to functions, not just the
	    link ID.
	  - Different PQL_DOMAIN_INVALID dependening on PQL_LDAP_REFERENCE_DOMAINS_WITH.
	  - Filtered through dos2unix to get rid of ^M
	  - Function pql_control_update_domains() was rewritten to work with new
	    domain/branch/user reference system, and to allow for changing ALL QmailLDAP
	    server objects in one go and to get automatic locals update working (ie,
	    update locals when modifying defaultDomain for a branch, or when adding
	    a new domain/branch).
	  - Add homePostalAddress to 'Personal details' to manage.

phpQLAdmin 2.0.6 Release (Jan 24 2003)
	Bug fixes
	  - Calls to pql_email_exists(), pql_user_exist(), pql_get_mx() and
	    pql_modify_userattribute() was called with the wrong/wrong number
	    of parameter due to redesign of how domains/branches and users where
	    references but code within functions wasn't changed fully.
	  - Get the Administrator/SeeAlso values correctly.
	  - Add UID and GID number (along with homedirectory=/tmp) by using the
	    'posixAccount' objectclass when we create a Forwarding account.
	  - Include the domain to the 'subbranch' variable so we get the full path
	    to where the user should be created (got problems with/without ADVANCED
	    mode etc) in the user_add page.
	  - Include the domain/branch in the url when deleting a user (so we get
	    redirected correctly).
	  - Add forwardUIDNumber (PQL_LDAP_FORWARDINGACCOUNT_UIDNUMBER define)
	    to objectclass phpQLAdminConfig so we can have the same (configurable)
	    UID/GID number for forwarding accounts.
	  - Don't destroy the session if we can't bind. For some reason, every now
	    and then I'll get logged out for no apparent reason... This is a TODO.

	GUI layout change
	  - Test for 'required' objectclasses in the LDAP test page.
	  - Show the old Main address above the new as a reference, not INSIDE
	    the input box.

	Misc changes
	  - Link the administrator user to the user details page in the same
	    way we do with 'Contact person'.

phpQLAdmin 2.0.5 Release (Jan 23 2003)
	Bug fixes
	  - In same cases, when playing with the PQL_LDAP_EZMLM_USE and/or
	    PQL_LDAP_CONTROL_USE values, a frame was created when it wasn't
	    supposed to, and vise versa.
	  - In some cases (non advanced mode, creating 'Mail account' amongst
	    others, no default domainname in the branch object) will render
	    the mailHost value empty. Before we save, we test if the value is
	    set one last time. If it isn't, and we have no MX pointer, we get
	    a NEW MX value from the email address.
	    + I had code that did that at the top, so move that into a separate
	      function pql_get_mx() that we can call at will.
	  - Allow for deletion of the mail reply text.
	  - If there's only one host, show that (CORRECTLY) on the login page.
	  - Call pql_domain_exist() with only the branch name, not the DN.
	    + Had to rewrite it so that it adds 'dc=' (dc configurable with
	      PQL_LDAP_ATTR_DOMAIN define) as prefix to the branch in the
	      search for existing domain/branch. Search from each base DN.
	  - Call pql_domain_exist() with only the branch name, not the DN to
	    correctly find if the branch exists.
	  - Bug fixes in pql_set_domain_value() to get it working with saving
	    config in the base DN object. 
	    + Make sure the object contains the object class 'phpQLAdminBranch'
	      by doing a search, checking each object class, and if not found
	      in object, add the objectclass (and all previous objectclasses)
	      to the entry before doing a modify.
	  - Wrong SYNTAX in the BOOL phpQLAdminConfig attributes.
	    + OID numbers changed
	    + Objectclass name changed (from phpQLAdmin to phpQLAdminConfig)
	    + Removed attribute ldapHost. What's the point!?
	    + Add 'language' attribute
	    + Add 'branchReference' attribute
	  - Tripple check that we have an MX (userHost attribute) before creating
	    the user.
	  - Case insensitive search for {KERBEROS} when showing user details.
	  - To make sure we really check for a define, we don't do "if(PQL_DEFINE)"
	    but use "if(defined(PQL_DEFINE))" which is correct. If the define wasn't
	    defined at all (ie, uncommented not just set to true/false etc) we'd get
	    an error with the first string...
	  - ./manual is the PHP/Apache manual!?!?! Remove it!
	  - Delete all directories named CVS recursivly and all files named .cvsignore
	    when doing a release tarball.

	GUI layout change
	  - Only show following information if ADVANCED_MODE is set (in the
	    'Show configuration values' page):
	        Password encryption schemes
	        User objectclasses
	        Domain objectclasses
	        Reference users with
	        Reference domains with
	    + Move 'LDAP {host,base dn,control base dn}' etc to the top (more
	      important).
	  - Small function - pql_get_subbranch() - to get any
		'objectclass=organizationalUnit'
	    below our search DN's. If finding more than one, show a select box
	    when specifying MX for the new user with the sub branches and as
	    where to put the user.

	Misc changes
	  - A while ago I changed the way one specify LDAP server(s). There is
	    no separation (unfortunatly ?) between USER server and CONTROLS
	    server. We only have one host value. Therefor change all occurances
	    of USER_HOST_{USR,CTR} to just USER_HOST.
	  - Completly redesigned how LDAP objects (users, domains etc) are
	    referenced. 
	    To make sure that we don't mix similarly named users in different
	    RDN's, we reference them with there full RDN. This forced almost
	    all functions in the API to change how they are called. We don't
	    need the 'basedn', because there is none. Also, most of the time
	    the 'domain' variable was used to build the DN where we did searches
	    from. This is no longer needed, since the 'domain' is now the RDN
	    of the domain, instead of just a fraction of it.
	    + Find the base dn(s) in the LDAP server at class initialization
	      time with the private function _find_basedn(). This information
	      is then availible through the global class variable 'ldap_basedn'
	      which we have to cyckle through when needed.
	  - Removed all references to the search dn (USER_SEARCH_DN_USR and
	    GLOBALS["USER_SEARCH_DN_USR"])
	  - Renamed some functions
	  - Run files through 'dos2unix' to remove ^M
	  - Add the two 'new' objectclasses (dcOrganizationNameForm and
	    phpQLAdminBranch) in the PQL_LDAP_OBJECTCLASS_DOMAIN define. This
	    will let us make it configurable at runtime later...
	  - New function pql_get_subschema() that retreives specific entries
	    from the 'cn=Subschema' (or whatever is defined in the subschemaSubentry
	    at base ''). 
	    + Using the wrapper function pql_get_subschemas() we can get ALL
	      interesting values (ldapsyntaxes, matchingrules, attributetypes and
	      objectclasses) in one go.
	    + The intention of this is to be able to configure what attributes to
	      use when creating users and/or branches. To make sure each MUST is
	      fullfilled, we (phpQLAdmin) must know which MUST belong to which
	      object class (only the LDAP can tell us the truth, the whole truth
	      and nothing BUT the truth).
	  - When deleting the domain branch, don't check for PQL_LDAP_SUBTREE_GROUPS.
	    Search for a group with the gidNumber of the user and objectclass=posixGroup.
	    If found, just delete it. Also, search for sub branches (objectclass=organizationalUnit)
	    under the domain branch. If anyone found, find all objects and delete
	    them (including the organizationalUnits).
	    + Removed pql_get_group() since it's no longer needed.
	  - Changed how pql_get_mx() works. If we can't find an MX for the domain in
	    the DNS system, look for a qmailControls object that lists this domain
	    in their locals/rcpthosts attribute field.
	  - Allow for configuration changes to be saved in the LDAP database (in
	    the first Base DN). Ship with 'reasonable defaults', site specifics
	    is changed in the web interface and save in the base dn. This give us
	    the possibility to have different configuration for different LDAP
	    hosts.

phpQLAdmin 2.0.4 Release (Jan 14 2003)
	Bug fixes
	  - Got ezmlm mailing list management to work, stress tested it localy,
	    "works for me"... :)
	    + Part of the fix is to have two suidperl script that does a fiew
	      things the webserver/PHP don't have access to. We need to create
	      some directories as root and give away files/directories to the
	      mailing list user - usually 'alias'.
	  - Correctly export environment variables before executing external
	    script.
	  - Correctly get domain default values/administrator (missed some when
	    I changed to my own object class).
	  - Code cleanup. More debug options availible if changing the code.
	  - Fixed the search page so that it to can distinguish from DOMAIN
	    layout or ORGANIZATION layout... Never used the funtion until now :)

	GUI layout change
	  - Left justify the locals/rcpthosts tables in the mailserver control
	    details page.
	  - Allow for creating a script that initializes ldap* files on a new
	    mail server (example script included).
	  - Readd the choosing of the LDAP server in the first login page (only
	    availible if there's multiple servers defined though).

	EZMLM Mailinglist management
	  - Only build the ezmlm frame list tree if there is any lists, and if
	    there isn't any, show 'no lists' as indicator.
	  - Print status message at top of ezmlm details page if there is any.
	  - Add the 'add subscriber' link at the bottom of the 'show list information'
	    table even if there is no existing subscribers.

	Misc changes
	  - Working example of suidperl script 'create_domain.pl' (creates the
	    'baseMailDir/mailinglists' directory - needs to be done as root).
	  - Force usage of objectclass 'phpQLAdminBranch' and 'dcOrganizationNameForm'
	    when creating the domain/branch object.

phpQLAdmin 2.0.3 Release (Jan 13 2003)
	Bug fixes
	  - Documentation update
	  - Missed some include($include) line (prefix with './include/').
	  - Foundation for changing LDAP server(s). If we can't connect/bind
	    to the LDAP server, this must mean we changed server, and we need
	    to reauthenticate. 
	  - The 'Advance mode' checkbox should reload index2.php, not self,
	    and send it to _top.
	  - Fixed the 'are you sure you want to delete ...'. Isn't outputted
	    when PQL_VERIFY_DELETE is true, so I missed this :)
	  - Forgot to increase the created UID Number with one, so we ended up
	    with the same number as the highest one in the database.
	  - Don't build the email@domain TWICE, and the variable is called
	    '$mail', not '$email'!
	  - Make sure we only include the config file (include/config.inc)
	    ONCE (with a simple if() at the top).
	  - Correctly reference the LDAP branch as 'branch' or 'domain'
	    depending on what type of database layout we're using.
	  - If we couldn't bind to the LDAP server, destroy and unset the
	    session completly.
	  - Delete the users group object after we created the user object.

	EZMLM Mailinglist management
	  - EZMLM Manager class(es) removed. Re-implemented what I needed
	    in my own 'include/pql_ezmlm.inc'.
	  - Possibility to set path/command for ezmlm management (should be
	    possible to use scripts/commands that do remote administration).
	  - Search all 'baseMailDirs' for accessible domain (ie, domain tree
	    one have access to) for ezmlm lists. This gives that each domain
	    have lists in there own directory, instead of every single list
	    in something like /var/lists.

	GUI layout change
	  - 'Tablify' the home links (original/new maintainers etc).
	  - Show what user to modify in user_edit_attribute, so we don't
	    modify 'in the blind'.
	  - Show more information
	    + Allow change of LDAP server [y/n]
	    + Verify user/domain deletions [y/n]
	    + Objectclasses used to create users
	    + Domain/Users reference attribute (uid/cn, dc/ou etc)
	    + Domain/Branch owner (telephone number, Contact person etc) in
	      the domain details view.
		Uses the objectclass 'dcOrganizationNameForm' (schema file
		included)
	    + Personal details (telephone number, cell phone etc) in the
	      user details view.
		Uses the objectclass 'pilotPerson'.
	  - Add delete icon/func to each attribute view in the mail server
	    controls view.
	  - Separate form page to create new branch/domain.
	  - Only create the 'controls' and/or 'ezmlm' frames if either of
	    the PQL_LDAP_CONTROL_USE or PQL_LDAP_EZMLM_USE is enabled. It
	    looked funny when both where disabled...
	  - Slightly more information on the 'front page'.
	    - Version number is displayed in bold at the top
	    - Link to CHANGES and the new phpQLAdmin page

	Misc changes
	  - Replace/Modify 'gecos' and 'givenName' entries at the same time
	    we're modifying the 'cn' entry.
	  - Action to create and delete a mailserver. When adding a new
	    mailserver, if we clone an existing one, include all
	    {locals,rcpthosts,passwd} info in clone (configurable with
	    checkboxes).
	  - Enable execution of external add user/domain scripts. Two example
	    scripts is included.
	  - Reasonable zone file creation template included and correctly called.
	  - Use specific attributes to store domain/branch default values and
	    domain/branch administrator. Schema file (phpQLAdmin.schema included).
	    This will break an upgrade - read README.upgrade!!

phpQLAdmin 2.0.2 Release (Jan  4 2003)
	- Documentation update
	
phpQLAdmin 2.0.1 Release (Jan  3 2003)
	- More independent LDAP database layout. The admin interface
	  should not dictate how a database should look like (or vise
	  versa for that matter!). The admin interface should cope with
	  ANY layout possible. First attempt (it works with mine now :)
	- GUI layout change.
	  + Left frame in three sub frames - Users, Controls and Ezmlm,
	    each reloaded independently when changed.
	  + Sort MX on priority, not FQDN
	  + The nav button (left/right icon) only folds/unfolds the
	    level, nothing more!
	  + Add a 'delete user' at the bottom of the user details page,
	    so that we don't have to go through the domain details to
	    delete a user.
	- Configure domain defaults in the domain objects description
	  attribute.
		Example:
		dn: dc=bayour,dc=com
		objectClass: top
		objectClass: domain
		dc: bayour
		description: defaultDomain=bayour.com
		description: baseHomeDir=/afs/bayour.com/user/users/
		description: baseMailDir=/var/mail/users/
		description: administrator=uid=turbo,ou=People,dc=fredriksson,dc=com
		description: administrator=uid=khaan,ou=People,dc=bayour,dc=com
	  + Don't show the domain if person login in in isn't listed in the
	    object.
	  + Insert base values in the database for these when creating
	    a domain.
	  + Change these values on the domain details page.
	- Use authentication to access page(s) - session management.
	  This lead to the removal of the hard coded values for admin
	  DN and password. Access to database branches is through the
	  domain object and it's "description" field - administrator.
	  + Allow for 'Advanced mode' which gives more information. This so that
	    we can show simple (required) stuff for 'inexperienced administrators',
	    and all the nitty gritty to the pro.
	  + Log each login/logout in ./phpQLadmin.log.
	- Ezmlm mailing list management. Create and modify a ezmlm mailing list.
	  + Look for lists in baseMailDir/mailinglists for each domain
	  + Actual action is disabled by default. Set 'ezmlm->debug = 0' if you
	    want to test this. WARNING: HAVE NOT BEEN TESTED LIVE! It just _LOOKS_
	    correct!! I take no responsibility for lost mailing lists!
	- Controls management sorted on host (ie, multiple hosts is
	  manageable) in a tree like fashion.
	- Search for files in current dir 'require("./'. This so that
	  we can have multiple installations on same host, with
	  different configs etc.
	- Configure the LDAP host, port and base search DN in one go,
	  separated with semicolon (;). This saves us some variable
	  + This will allow choosing from a predefined set of LDAP
	    hosts at runtime (independent server choosing for user
	    and controls database).
	    This isn't quite working though. We most likely don't have
	    the same credentials on both servers.
	- Allow for selecting login shell when creating user (open /etc/shells
	  and output list to choose from).

phpQLAdmin 1.1 Release
	This is the latest version the original author released before
	development seized.

	+ added search option (many thanks to Alex A. Beeck)
	+ added the attributes qmailDotMode and deliveryProgramPath to
	  users options
	+ added option to test the ldap connection
	+ fixed various linking bugs in user_detail.php

phpQLAdmin 1.0 Release
	+ support for qmail-ldap/control patch, which allows to control
	  all qmail configuration stuff in a ldap database
	+ help system for control values, English only (many thanks to
	  Henning Brauer for permission to take these texts from 'life
	  with qmail-ldap', others are taken from the qmail man pages)
	+ support for non-salted MD5 and SHA password encryption
	+ showing configuration of phpQLAdmin
	+ better error reporting on failures
	+ fixed bug in adding domain: now supports subdomains as well
	+ fixed bug in navigation bar: user_detail.php was not correctly
	  linked (didn't affects to apache with activated multi views option)
	+ now refusing values equal 0 at setting quota
	+ various little bugs fixed 

	New available language support:
	+ added Japanese language support (many thanks to Swen Veckes) 
	+ added Portuguese language support (many thanks to Alex A. Beeck) 

phpQLAdmin 0.9beta (2nd) Release
	+ added Italian language file (many thanks to Luca Pescatore)
	+ tar.gz file fixed (all files are now in a subdirectory)

phpQLAdmin 0.9beta (1st) Release
	First public release
