[packaging] 2 commits - Kolab_Filter-0.1.4/COPYING Kolab_Filter-0.1.4/doc Kolab_Filter-0.1.4/lib Kolab_Filter-0.1.4/locale Kolab_Filter-0.1.4/script Kolab_Filter-0.1.4/test Kolab_Filter-0.1.7/COPYING Kolab_Filter-0.1.7/doc Kolab_Filter-0.1.7/lib Kolab_Filter-0.1.7/locale Kolab_Filter-0.1.7/po Kolab_Filter-0.1.7/script Kolab_Filter-0.1.7/test package.xml

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Thu Dec 9 18:53:28 CET 2010


 Kolab_Filter-0.1.4/COPYING                                                         |  504 ----
 Kolab_Filter-0.1.4/doc/Horde/Kolab/Filter/kolabfilter.1                            |  169 -
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Base.php                                 |  308 --
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Content.php                              |  457 ---
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Incoming.php                             |  289 --
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Outlook.php                              |  273 --
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Response.php                             |  172 -
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport.php                            |  295 --
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php                 |  261 --
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php                    |  106 
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/drop.php                       |  126 -
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/echo.php                       |  129 -
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lda.php                        |   36 
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lmtp.php                       |   46 
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/smtp.php                       |   45 
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/stdout.php                     |  126 -
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Resource.php                                    | 1082 ---------
 Kolab_Filter-0.1.4/lib/Horde/Kolab/Test/Filter.php                                 |  278 --
 Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabfilter.php                       |   30 
 Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabmailboxfilter.php                |   30 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/AllTests.php                            |   64 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ContentTest.php                         |  166 -
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/FilterTest.php                          |   62 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/IncomingTest.php                        |   89 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/LoadTest.php                            |  118 -
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ResourceTest.php                        |  125 -
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty.eml                      |    5 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty2.ret                     |    9 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.eml                     |   14 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.ret                     |   17 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged_trans.ret               |   17 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml         |   39 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml      |   29 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/privileged.ret                 |   17 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml           |  202 -
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.eml                     |  105 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.ret                     |  109 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple2.ret                    |  109 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple_out.ret                 |  108 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/test.eml                       |   61 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.eml                       |   10 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.ret                       |   13 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.eml                   |   14 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.ret                   |   17 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.eml                 |   10 
 Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.ret                 |   13 
 Kolab_Filter-0.1.7/COPYING                                                         |  504 ++++
 Kolab_Filter-0.1.7/doc/Horde/Kolab/Filter/kolabfilter.1                            |  168 +
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Base.php                                 |  310 ++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Content.php                              |  461 +++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Incoming.php                             |  304 ++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Outlook.php                              |  274 ++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Response.php                             |  172 +
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport.php                            |  295 ++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php                 |  261 ++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php                    |  106 
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/drop.php                       |  126 +
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/echo.php                       |  129 +
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lda.php                        |   36 
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lmtp.php                       |   46 
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/smtp.php                       |   45 
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/stdout.php                     |  126 +
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Resource.php                                    | 1164 ++++++++++
 Kolab_Filter-0.1.7/lib/Horde/Kolab/Test/Filter.php                                 |  289 ++
 Kolab_Filter-0.1.7/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo                        |binary
 Kolab_Filter-0.1.7/locale/fr_FR/LC_MESSAGES/Kolab_Filter.mo                        |binary
 Kolab_Filter-0.1.7/po/Kolab_Filter.pot                                             |  109 
 Kolab_Filter-0.1.7/po/de_DE.po                                                     |  109 
 Kolab_Filter-0.1.7/po/fr_FR.po                                                     |   61 
 Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabfilter.php                       |   30 
 Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabmailboxfilter.php                |   30 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/AllTests.php                            |   64 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ContentTest.php                         |  166 +
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/FilterTest.php                          |   62 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/IncomingTest.php                        |   89 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/LoadTest.php                            |  118 +
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ResourceTest.php                        |  228 +
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml |   33 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty.eml                      |    5 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty2.ret                     |    9 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.eml                     |   14 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.ret                     |   17 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged_trans.ret               |   17 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml         |   39 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.ret         |   70 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml      |   29 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/privileged.ret                 |   17 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml           |  202 +
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.ret           |  206 +
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation2.eml          |   86 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.eml                     |  105 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.ret                     |  109 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple2.ret                    |  109 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple_out.ret                 |  108 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/test.eml                       |   61 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.eml                       |   10 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.ret                       |   13 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.eml                   |   14 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.ret                   |   17 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.eml                 |   10 
 Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.ret                 |   13 
 dev/null                                                                           |binary
 package.xml                                                                        |  186 +
 103 files changed, 7337 insertions(+), 6348 deletions(-)

New commits:
commit 15571f3fbd05ca1c526d4cac328312fbf63fad2c
Merge: 38bbfe5... 92fb513...
Author: vanmeeuwen at kolabsys.com <vanmeeuwen at kolabsys.com>
Date:   Thu Dec 9 18:53:10 2010 +0100

    Merge commit 'upstream/0.1.7'



commit 92fb5133a039778e44cd82d2287cf54dd9ea06ac
Author: vanmeeuwen at kolabsys.com <vanmeeuwen at kolabsys.com>
Date:   Thu Dec 9 18:53:10 2010 +0100

    Imported Upstream version 0.1.7

diff --git a/Kolab_Filter-0.1.4/COPYING b/Kolab_Filter-0.1.4/COPYING
deleted file mode 100644
index d1c6b98..0000000
--- a/Kolab_Filter-0.1.4/COPYING
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/Kolab_Filter-0.1.4/doc/Horde/Kolab/Filter/kolabfilter.1 b/Kolab_Filter-0.1.4/doc/Horde/Kolab/Filter/kolabfilter.1
deleted file mode 100644
index 3d1d2b5..0000000
--- a/Kolab_Filter-0.1.4/doc/Horde/Kolab/Filter/kolabfilter.1
+++ /dev/null
@@ -1,169 +0,0 @@
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.35
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sh \" Subsection heading
-.br
-.if t .Sp
-.ne 5
-.PP
-\fB\\$1\fR
-.PP
-..
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  | will give a
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
-.tr \(*W-|\(bv\*(Tr
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.if \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.\"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.hy 0
-.if n .na
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "KOLABFILTER 1"
-.TH KOLABFILTER 1 "2009-02-23" "Kolab_Filter-0.1.4" "User Contributed PHP Documentation"
-.SH "NAME"
-kolabfilter, kolabmailboxfilter \- Kolab filters
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-\&\fBkolabfilter\fR \fB\-\-sender\fR=\fIsender\fR \fB\-\-recipient\fR=\fIrecipient\fR \fB\-\-host\fR=\fIhost\fR \fB\-\-client\fR=\fIclient\fR \fB\-\-user\fR=\fIuser\fR \fB\-\-config\fR=\fIconfig\fR
-.PP
-\&\fBkolabmailboxfilter\fR \fB\-\-sender\fR=\fIsender\fR \fB\-\-recipient\fR=\fIrecipient\fR \fB\-\-host\fR=\fIhost\fR \fB\-\-client\fR=\fIclient\fR \fB\-\-user\fR=\fIuser\fR \fB\-\-config\fR=\fIconfig\fR
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBkolabfilter\fR is a filter for outgoing mail on a Kolab Server. It rewrites headers and handles
-Outlook issues.
-.PP
-\&\fBkolabmailboxfilter\fR is a filter for incoming mail on a Kolab Server. It checks the messages for iCal
-data and handles automatic invitations.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-s\fR \fIsender\fR|\fB\-\-sender\fR=\fIsender\fR" 8
-.IX Item "-s sender|--sender=sender"
-The message sender.
-.IP "\fB\-r\fR \fIrecipient\fR|\fB\-\-recipient\fR=\fIrecipient\fR" 8
-.IX Item "-r recipient|--recipient=recipient"
-A message recipient (can be repeated).
-.IP "\fB\-H\fR \fIhost\fR|\fB\-\-host\fR=\fIhost\fR" 8
-.IX Item "-H host|--host=host"
-The host running this script.
-.IP "\fB\-c\fR \fIclient\fR|\fB\-\-client\fR=\fIclient\fR" 8
-.IX Item "-c client|--client=client"
-The client sending the message.
-.IP "\fB\-u\fR \fIuser\fR|\fB\-\-user\fR=\fIuser\fR" 8
-.IX Item "-u user|--user=user"
-\&\s-1ID\s0 of the currently authenticated user.
-.IP "\fB\-C\fR \fIconfig\fR|\fB\-\-config\fR=\fIconfig\fR" 8
-.IX Item "-C config|--config=config"
-Path to the configuration file for this filter.
-.SH "COPYRIGHT AND AUTHORS"
-.IX Header "COPYRIGHT AND AUTHORS"
-Copyright 2004\-2009 Klarälvdalens Datakonsult \s-1AB\s0
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Base.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Base.php
deleted file mode 100644
index 6a2ddb0..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Base.php
+++ /dev/null
@@ -1,308 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Base.php,v 1.6.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/** Load the required PEAR libraries */
-require_once 'PEAR.php';
-
-/** Console_Getopt */
-require_once 'Console/Getopt.php';
-
-/** Load the required Horde libraries */
-require_once 'Horde.php';
-
-/** Load the Filter libraries */
-require_once dirname(__FILE__) . '/Response.php';
-
-/** Load the argument parsing library */
-require_once 'Horde/Argv/Option.php';
-require_once 'Horde/Argv/OptionContainer.php';
-require_once 'Horde/Argv/HelpFormatter.php';
-require_once 'Horde/Argv/IndentedHelpFormatter.php';
-require_once 'Horde/Argv/Values.php';
-require_once 'Horde/Argv/Parser.php';
-
-/**
- * A basic definition for a PHP based postfix filter.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Base.php,v 1.6.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Base
-{
-    /**
-     * The message ID.
-     *
-     * @var string
-     */
-    var $_id = '';
-
-    /**
-     * A temporary buffer file for storing the message.
-     *
-     * @var string
-     */
-    var $_tmpfile;
-
-    /**
-     * The file handle for the temporary file.
-     *
-     * @var int
-     */
-    var $_tmpfh;
-
-    /**
-     * The message sender.
-     *
-     * @var string
-     */
-    var $_sender;
-
-    /**
-     * The message recipients.
-     *
-     * @var array
-     */
-    var $_recipients = array();
-
-    /**
-     * The client host trying to send the message.
-     *
-     * @var string
-     */
-    var $_client_address;
-
-    /**
-     * The client host trying to send the message.
-     *
-     * @var string
-     */
-    var $_fqhostname;
-
-    /**
-     * The authenticated username of the sender.
-     *
-     * @var string
-     */
-    var $_sasl_username;
-
-    /**
-     * Initialize the class.
-     */
-    function init()
-    {
-        /* Parse our arguments */
-        $result = $this->_parseArgs();
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-    }
-
-    /**
-     * Handle the message.
-     *
-     * @param int    $inh  The file handle pointing to the message.
-     * @param string $transport  The name of the transport driver.
-     */
-    function parse($inh = STDIN, $transport = null)
-    {
-        /* Setup the temporary storage */
-        $result = $this->_initTmp();
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-
-        Horde::logMessage(sprintf("%s starting up (sender=%s, recipients=%s, client_address=%s)", 
-                                  get_class($this), $this->_sender, 
-                                  join(', ',$this->_recipients), 
-                                  $this->_client_address),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        $result = $this->_parse($inh, $transport);
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-
-        Horde::logMessage(sprintf("%s successfully completed (sender=%s, recipients=%s, client_address=%s, id=%s)", 
-                                  get_class($this), $this->_sender, 
-                                  join(', ',$this->_recipients), 
-                                  $this->_client_address, $this->_id),
-                          __FILE__, __LINE__, PEAR_LOG_INFO);
-    }
-
-    /**
-     * Creates a buffer for temporary storage of the message.
-     *
-     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
-     */
-    function _initTmp()
-    {
-        global $conf;
-
-        if (isset($conf['kolab']['filter']['tempdir'])) {
-            $tmpdir = $conf['kolab']['filter']['tempdir'];
-        } else {
-            $tmpdir = Horde::getTempDir();
-        }
-
-        /* Temp file for storing the message */
-        $this->_tmpfile = @tempnam($tmpdir, 'IN.' . get_class($this) . '.');
-        $this->_tmpfh = @fopen($this->_tmpfile, "w");
-        if( !$this->_tmpfh ) {
-            $msg = $php_errormsg;
-            return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
-                                            $this->_tmpfile, $msg),
-                                    OUT_LOG | EX_IOERR);
-        }
-
-        register_shutdown_function(array($this, '_cleanupTmp'));
-    }
-
-    /**
-     * A shutdown function for removing the temporary file.
-     */
-    function _cleanupTmp() {
-        if (@file_exists($this->_tmpfile)) {
-            @unlink($this->_tmpfile);
-        }
-    }
-
-    /**
-     * Parse the command line arguments provided to the filter and
-     * setup the class.
-     *
-     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
-     */
-    function _parseArgs()
-    {
-        global $conf;
-
-        /* Get command line options. */
-        $p = new Horde_Kolab_Filter_Argv_Parser(
-            array('optionList' =>
-                  array(
-                      new Horde_Argv_Option('-s',
-                                            '--sender',
-                                            array('help' => 'The message sender.',
-                                                  'type' => 'string',
-                                                  'nargs' => 1)),
-                      new Horde_Argv_Option('-r',
-                                            '--recipient',
-                                            array('help' => 'A message recipient.',
-                                                  'action' => 'append',
-                                                  'type' => 'string')),
-                      new Horde_Argv_Option('-H',
-                                            '--host',
-                                            array('help' => 'The host running this script.')),
-                      new Horde_Argv_Option('-c',
-                                            '--client',
-                                            array('help' => 'The client sending the message.')),
-                      new Horde_Argv_Option('-u',
-                                            '--user',
-                                            array('help' => 'ID of the currently authenticated user.',
-                                                  'default' => '')),
-                      new Horde_Argv_Option('-C',
-                                            '--config',
-                                            array('help' => 'Path to the configuration file for this filter.'))
-                  )));
-
-        try {
-            list($values, $args) = $p->parseArgs();
-        } catch (InvalidArgumentException $e) {
-            $msg = $e->getMessage() . "\n\n" . $p->getUsage();
-            return PEAR::raiseError($msg, OUT_STDOUT | EX_USAGE);
-        }
-
-        if (!empty($values['config']) && file_exists($values['config'])) {
-            require_once $values['config'];
-        }
-
-        if (empty($values['recipient'])) {
-            $msg = 'Please provide one or more recipients.' 
-                . "\n\n" . $p->getUsage();
-            return PEAR::raiseError($msg, OUT_STDOUT | EX_USAGE);
-        }
-
-        $this->_sender = strtolower($values['sender']);
-        $this->_recipients = array_map('strtolower', $values['recipient']);
-        $this->_client_address = $values['client'];
-        $this->_fqhostname = strtolower($values['host']);
-        $this->_sasl_username = strtolower($values['user']);
-
-        Horde::logMessage(sprintf("Arguments: %s", print_r($values, true)),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        if (!empty($conf['kolab']['filter']['locale_path'])
-            && !empty($conf['kolab']['filter']['locale'])) {
-            require_once 'Horde/NLS.php';
-            NLS::setTextdomain('Kolab_Filter', $conf['kolab']['filter']['locale_path'], NLS::getCharset());
-            setlocale(LC_ALL, $conf['kolab']['filter']['locale']);
-        }
-
-        /* This is used as the default domain for unqualified adresses */
-        global $_SERVER;
-        if (!array_key_exists('SERVER_NAME', $_SERVER)) {
-            $_SERVER['SERVER_NAME'] = $conf['kolab']['filter']['email_domain'];
-        }
-
-        if (!array_key_exists('REMOTE_ADDR', $_SERVER)) {
-            $_SERVER['REMOTE_ADDR'] = $conf['kolab']['imap']['server'];
-        }
-
-        if (!array_key_exists('REMOTE_HOST', $_SERVER)) {
-            $_SERVER['REMOTE_HOST'] = $conf['kolab']['imap']['server'];
-        }
-
-        /* Always display all possible problems */
-        ini_set('error_reporting', E_ALL);
-        ini_set('track_errors', '1');
-
-        /* Setup error logging */
-        if (isset($conf['kolab']['filter']['error_log'])) {
-            ini_set('log_errors', '1');
-            ini_set('error_log', $conf['kolab']['filter']['error_log']);
-        }
-
-        /* Print PHP messages to StdOut if we are debugging */
-        if (isset($conf['kolab']['filter']['debug'])
-            && $conf['kolab']['filter']['debug']) {
-            ini_set('display_errors', '1');
-        }
-
-        /* Provide basic syslog debugging if nothing has been
-         * specified
-         */
-        if (!isset($conf['log'])) {
-            $conf['log']['enabled']          = true;
-            $conf['log']['priority']         = PEAR_LOG_DEBUG;
-            $conf['log']['type']             = 'syslog';
-            $conf['log']['name']             = LOG_MAIL;
-            $conf['log']['ident']            = 'kolabfilter';
-            $conf['log']['params']           = array();
-        }
-    }
-}
-
-class Horde_Kolab_Filter_Argv_Parser extends Horde_Argv_Parser 
-{
-    public function parserError($msg)
-    {
-        throw new InvalidArgumentException(sprintf("%s: error: %s\n", $this->getProgName(), $msg));
-    }
-
-    public function parserExit($status = 0, $msg = null)
-    {
-        throw new InvalidArgumentException(sprintf("%s: error: %s\n", $this->getProgName(), $msg));
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Content.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Content.php
deleted file mode 100644
index d8c9430..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Content.php
+++ /dev/null
@@ -1,457 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php,v 1.4.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/** Load the basic filter definition */
-require_once dirname(__FILE__) . '/Base.php';
-
-/** Load the Transport library */
-require_once dirname(__FILE__) . '/Transport.php';
-
-define('RM_STATE_READING_HEADER', 1 );
-define('RM_STATE_READING_FROM',   2 );
-define('RM_STATE_READING_SUBJECT',3 );
-define('RM_STATE_READING_SENDER', 4 );
-define('RM_STATE_READING_BODY',   5 );
-
-/**
- * A Kolab Server filter for outgoing mails.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php,v 1.4.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Content extends Horde_Kolab_Filter_Base
-{
-    /**
-     * Handle the message.
-     *
-     * @param int    $inh  The file handle pointing to the message.
-     * @param string $transport  The name of the transport driver.
-     *
-     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
-     */
-    function _parse($inh, $transport)
-    {
-        global $conf;
-
-        $result = $this->init();
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-
-        if (isset($conf['kolab']['filter']['verify_from_header'])) {
-            $verify_from_header = $conf['kolab']['filter']['verify_from_header'];
-        } else {
-            $verify_from_header = false;
-        }
-
-        if (isset($conf['kolab']['filter']['allow_sender_header'])) {
-            $allow_sender_header = $conf['kolab']['filter']['allow_sender_header'];
-        } else {
-            $allow_sender_header = false;
-        }
-
-        if (isset($conf['kolab']['filter']['allow_outlook_ical_forward'])) {
-            $allow_outlook_ical_forward = $conf['kolab']['filter']['allow_outlook_ical_forward'];
-        } else {
-            $allow_outlook_ical_forward = true;
-        }
-
-        if (empty($transport)) {
-            $transport = 'smtp';
-        }
-
-        $ical = false;
-        $from = false;
-        $subject = false;
-        $senderok = true;
-        $rewrittenfrom = false;
-        $state = RM_STATE_READING_HEADER;
-
-        while (!feof($inh) && $state != RM_STATE_READING_BODY) {
-
-            $buffer = fgets($inh, 8192);
-            $line = rtrim($buffer, "\r\n");
-
-            if ($line == '') {
-                /* Done with headers */
-                $state = RM_STATE_READING_BODY;
-                if ($from && $verify_from_header) {
-                    $rc = $this->_verify_sender($this->_sasl_username, $this->_sender, 
-                                                $from, $this->_client_address);
-                    if (is_a($rc, 'PEAR_Error')) {
-                        return $rc;
-                    } else if ($rc === true) {
-                        /* All OK, do nothing */
-                    } else if ($rc === false) {
-                        /* Reject! */
-                        $senderok = false;
-                    } else if (is_string($rc)) {
-                        /* Rewrite from */
-                        if (strpos($from, $rc) === false) {
-                            Horde::logMessage(sprintf("Rewriting '%s' to '%s'",
-                                                      $from, $rc), 
-                                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                            $rewrittenfrom = "From: $rc\r\n";
-                        }
-                    }
-                }
-            } else {
-                if ($line[0] != ' ' && $line[0] != "\t") {
-                    $state = RM_STATE_READING_HEADER;
-                }
-                switch( $state ) {
-                case RM_STATE_READING_HEADER:
-                    if ($allow_sender_header &&
-                        eregi('^Sender: (.*)', $line, $regs)) {
-                        $from = $regs[1];
-                        $state = RM_STATE_READING_SENDER;
-                    } else if (!$from && eregi('^From: (.*)', $line, $regs)) {
-                        $from = $regs[1];
-                        $state = RM_STATE_READING_FROM;
-                    } else if (eregi('^Subject: (.*)', $line, $regs)) {
-                        $subject = $regs[1];
-                        $state = RM_STATE_READING_SUBJECT;
-                    } else if (eregi('^Content-Type: text/calendar', $line)) {
-                        Horde::logMessage("Found iCal data in message",
-                                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                        $ical = true;
-                    } else if (eregi('^Message-ID: (.*)', $line, $regs)) {
-                        $this->_id = $regs[1];
-                    }
-                    break;
-                case RM_STATE_READING_FROM:
-                    $from .= $line;
-                    break;
-                case RM_STATE_READING_SENDER:
-                    $from .= $line;
-                    break;
-                case RM_STATE_READING_SUBJECT:
-                    $subject .= $line;
-                    break;
-                }
-            }
-            if (@fwrite($this->_tmpfh, $buffer) === false) {
-                $msg = $php_errormsg;
-                return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
-                                                $this->_tmpfile, $msg),
-                                        OUT_LOG | EX_IOERR);
-            }
-        }
-        while (!feof($inh)) {
-            $buffer = fread($inh, 8192);
-            if (@fwrite($this->_tmpfh, $buffer) === false) {
-                $msg = $php_errormsg;
-                return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
-                                                $this->_tmpfile, $msg),
-                                        OUT_LOG | EX_IOERR);
-            }
-        }
-
-        if (@fclose($this->_tmpfh) === false) {
-            $msg = $php_errormsg;
-            return PEAR::raiseError(sprintf("Error: Failed closing %s: %s",
-                                            $this->_tmpfile, $msg),
-                                    OUT_LOG | EX_IOERR);
-        }
-
-        if (!$senderok) {
-            if ($ical && $allow_outlook_ical_forward ) {
-                require_once(dirname(__FILE__) . '/Outlook.php');
-                $rc = Kolab_Filter_Outlook::embedICal($this->_fqhostname,
-                                                      $this->_sender,
-                                                      $this->_recipients,
-                                                      $from, $subject,
-                                                      $this->_tmpfile);
-                if (is_a($rc, 'PEAR_Error')) {
-                    return $rc;
-                } else if ($rc === true) {
-                    return;
-                }
-            } else {
-                return PEAR::raiseError(sprintf("Invalid From: header. %s looks like a forged sender",
-                                                $from),
-                                        OUT_LOG | OUT_STDOUT | EX_NOPERM);
-            }
-        }
-
-        $result = $this->_deliver($rewrittenfrom, $transport);
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-    }
-
-    /**
-     * Deliver the message.
-     *
-     * @param string $transport  The name of the transport driver.
-     *
-     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
-     */
-    function _deliver($rewrittenfrom, $transport)
-    {
-        global $conf;
-
-        if (isset($conf['kolab']['filter']['smtp_host'])) {
-            $host = $conf['kolab']['filter']['smtp_host'];
-        } else {
-            $host = 'localhost';
-        }
-        if (isset($conf['kolab']['filter']['smtp_port'])) {
-            $port = $conf['kolab']['filter']['smtp_port'];
-        } else {
-            $port = 10025;
-        }
-
-        $transport = &Horde_Kolab_Filter_Transport::factory($transport, 
-                                               array('host' => $host, 
-                                                     'port' => $port));
-
-        $tmpf = @fopen($this->_tmpfile, 'r');
-        if (!$tmpf) {
-            $msg = $php_errormsg;
-            return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
-                                            $this->_tmpfile, $msg),
-                                    OUT_LOG | EX_IOERR);
-        }
-
-        $result = $transport->start($this->_sender, $this->_recipients);
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-
-        $state = RM_STATE_READING_HEADER;
-        while (!feof($tmpf) && $state != RM_STATE_READING_BODY) {
-            $buffer = fgets($tmpf, 8192);
-            if ($rewrittenfrom) {
-                if (eregi( '^From: (.*)', $buffer)) {
-                    $result = $transport->data($rewrittenfrom);
-                    if (is_a($result, 'PEAR_Error')) {
-                        return $result;
-                    }
-                    $state = RM_STATE_READING_FROM;
-                    continue;
-                } else if ($state == RM_STATE_READING_FROM &&
-                           ($buffer[0] == ' ' || $buffer[0] == "\t")) {
-                    /* Folded From header, ignore */
-                    continue;
-                }
-            }
-            if (rtrim($buffer, "\r\n") == '') {
-                $state = RM_STATE_READING_BODY;
-            } else if ($buffer[0] != ' ' && $buffer[0] != "\t")  {
-                $state = RM_STATE_READING_HEADER;
-            }
-            $result = $transport->data($buffer);
-            if (is_a($result, 'PEAR_Error')) {
-                return $result;
-            }
-        }
-        while (!feof($tmpf)) {
-            $buffer = fread($tmpf, 8192);
-            $len = strlen($buffer);
-
-            /* We can't tolerate that the buffer breaks the data
-             * between \r and \n, so we try to avoid that. The limit
-             * of 100 reads is to battle abuse
-             */
-            while ($buffer{$len-1} == "\r" && $len < 8192 + 100) {
-                $buffer .= fread($tmpf,1);
-                $len++;
-            }
-            $result = $transport->data($buffer);
-            if (is_a($result, 'PEAR_Error')) {
-                return $result;
-            }
-        }
-        return $transport->end();
-    }
-
-    /**
-     * Check that the From header is not trying to impersonate a valid
-     * user that is not $sasluser.
-     *
-     * @param string $sasluser    The current, authenticated user.
-     * @param string $sender      Sender address
-     * @param string $fromhdr     From header
-     * @param string $client_addr Client IP
-     *
-     * @return mixed A PEAR_Error in case of an error, true if From
-     *               can be accepted, false if From must be rejected,
-     *               or a string with a corrected From header that
-     *               makes From acceptable
-     */
-    function _verify_sender($sasluser, $sender, $fromhdr, $client_addr) {
-
-        global $conf;
-
-        if (isset($conf['kolab']['filter']['email_domain'])) {
-            $domains = $conf['kolab']['filter']['email_domain'];
-        } else {
-            $domains = 'localhost';
-        }
-
-        if (!is_array($domains)) {
-            $domains = array($domains);
-        }
-
-        if (isset($conf['kolab']['filter']['local_addr'])) {
-            $local_addr = $conf['kolab']['filter']['local_addr'];
-        } else {
-            $local_addr = '127.0.0.1';
-        }
-
-        if (empty($client_addr)) {
-            $client_addr = $local_addr;
-        }
-
-        if (isset($conf['kolab']['filter']['verify_subdomains'])) {
-            $verify_subdomains = $conf['kolab']['filter']['verify_subdomains'];
-        } else {
-            $verify_subdomains = true;
-        }
-
-        if (isset($conf['kolab']['filter']['reject_forged_from_header'])) {
-            $reject_forged_from_header = $conf['kolab']['filter']['reject_forged_from_header'];
-        } else {
-            $reject_forged_from_header = false;
-        }
-
-        if (isset($conf['kolab']['filter']['kolabhosts'])) {
-            $kolabhosts = $conf['kolab']['filter']['kolabhosts'];
-        } else {
-            $kolabhosts = 'localhost';
-        }
-
-        if (isset($conf['kolab']['filter']['privileged_networks'])) {
-            $privnetworks = $conf['kolab']['filter']['privileged_networks'];
-        } else {
-            $privnetworks = '127.0.0.0/8';
-        }
-
-        /* Allow anything from localhost and
-         * fellow Kolab-hosts 
-         */
-        if ($client_addr == $local_addr) {
-            return true;
-        }
-
-        $kolabhosts = split(',', $kolabhosts);
-        $kolabhosts = array_map('gethostbyname', $kolabhosts );
-
-        $privnetworks = split(',', $privnetworks);
-
-        if (array_search($client_addr, $kolabhosts) !== false) {
-            return true;
-        }
-
-        foreach ($privnetworks as $network) {
-
-            $iplong = ip2long($client_addr);
-            $cidr = explode("/", $network);
-            $netiplong = ip2long($cidr[0]);
-            if (count($cidr) == 2) {
-                $iplong = $iplong & (0xffffffff << 32 - $cidr[1]);
-                $netiplong = $netiplong & (0xffffffff << 32 - $cidr[1]);
-            }
-
-            if ($iplong == $netiplong) {
-                return true;
-            }
-        }
-
-        if ($sasluser) {
-            /* Load the Server library */
-            require_once 'Horde/Kolab/Server.php';
-
-            $server = &Horde_Kolab_Server::singleton();
-            if (is_a($server, 'PEAR_Error')) {
-                $server->code = OUT_LOG | EX_SOFTWARE;
-                return $server;
-            }
-
-            $allowed_addrs = $server->addrsForIdOrMail($sasluser);
-            if (is_a($allowed_addrs, 'PEAR_Error')) {
-                $allowed_addrs->code = OUT_LOG | EX_NOUSER;
-                return $allowed_addrs;
-            }
-        } else {
-            $allowed_addrs = false;
-        }
-
-        if ($sasluser) {
-            if (isset($conf['kolab']['filter']['untrusted_subject_insert'])) {
-                $fmt = $conf['kolab']['filter']['untrusted_subject_insert'];
-            } else {
-                $fmt = _("(UNTRUSTED, sender is <%s>)");
-            }
-        } else {
-            if (isset($conf['kolab']['filter']['unauthenticated_subject_insert'])) {
-                $fmt = $conf['kolab']['filter']['unauthenticated_subject_insert'];
-            } else {
-                $fmt = _("(UNTRUSTED, sender <%s> is not authenticated)");
-            }
-        }
-        $untrusted = sprintf($fmt, $sender);
-
-        $adrs = imap_rfc822_parse_adrlist($fromhdr, $domains[0]);
-
-        foreach ($adrs as $adr) {
-            $from = $adr->mailbox . '@' . $adr->host;
-            $fromdom = $adr->host;
-
-            if ($sasluser) {
-                if (!in_array(strtolower($from), $allowed_addrs)) {
-                    Horde::logMessage(sprintf("%s is not an allowed From address for %s", 
-                                              $from, $sasluser), __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                    return false;
-                }
-            } else {
-                foreach ($domains as $domain) {
-                    if (strtolower($fromdom) == $domain 
-                        || ($verify_subdomains
-                            && substr($fromdom, -strlen($domain)-1) == ".$domain")) {
-                        if ($reject_forged_from_header) {
-                            Horde::logMessage(sprintf("%s is not an allowed From address for unauthenticated users.", 
-                                                      $from), __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                            return false;
-                        } else {
-                            /* Rewrite */
-                            Horde::logMessage(sprintf("%s is not an allowed From address for unauthenticated users, rewriting.", 
-                                                      $from), __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                            if (strpos( $fromhdr, $untrusted )===false) {
-                                if (property_exists($adr, 'personal')) {
-                                    $name = str_replace(array("\\", '"'), 
-                                                        array("\\\\",'\"'), 
-                                                        $adr->personal);
-                                } else {
-                                    $name = '';
-                                }
-                                $new_from = '"' . $name . ' ' . $untrusted . '" <' . $from . '>';
-                                return '=?utf-8?B?' . base64_encode($new_from) . '?=';
-                            } else {
-                                return true;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        /* All seems OK */
-        return true;
-    }
-}
-
-?>
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Incoming.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Incoming.php
deleted file mode 100644
index 3a5ce83..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Incoming.php
+++ /dev/null
@@ -1,289 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Incoming.php,v 1.6.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/** Load the basic filter definition */
-require_once dirname(__FILE__) . '/Base.php';
-
-/** Load the Transport library */
-require_once dirname(__FILE__) . '/Transport.php';
-
-/**
- * A Kolab Server filter for incoming mails that are parsed for iCal
- * contents.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Incoming.php,v 1.6.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Incoming extends Horde_Kolab_Filter_Base
-{
-
-    /**
-     * An array of headers to be added to the message
-     *
-     * @var array
-     */
-    var $_add_headers;
-
-    /**
-     * Handle the message.
-     *
-     * @param int    $inh        The file handle pointing to the message.
-     * @param string $transport  The name of the transport driver.
-     *
-     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
-     */
-    function _parse($inh, $transport)
-    {
-        global $conf;
-
-        $result = $this->init();
-        if (is_a($result, 'PEAR_Error')) {
-            return $result;
-        }
-
-        if (empty($transport)) {
-            if (isset($conf['kolab']['filter']['delivery_backend'])) {
-                $transport = $conf['kolab']['filter']['delivery_backend'];
-            } else {
-                $transport = 'lmtp';
-            }
-        }
-
-        $ical = false;
-        $add_headers = array();
-        $headers_done = false;
-
-        /* High speed section START */
-        $headers_done = false;
-        while (!feof($inh) && !$headers_done) {
-            $buffer = fgets($inh, 8192);
-            $line = rtrim( $buffer, "\r\n");
-            if ($line == '') {
-                /* Done with headers */
-                $headers_done = true;
-            } else if (eregi('^Content-Type: text/calendar', $line)) {
-                Horde::logMessage("Found iCal data in message", 
-                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                $ical = true;
-            } else if (eregi('^Message-ID: (.*)', $line, $regs)) {
-                $this->_id = $regs[1];
-            }
-            if (@fwrite($this->_tmpfh, $buffer) === false) {
-                $msg = $php_errormsg;
-                return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
-                                                $this->_tmpfile, $msg),
-                                        OUT_LOG | EX_IOERR);
-            }
-        }
-
-        if ($ical) {
-            /* iCal already identified. So let's just pipe the rest of
-             * the message through.
-             */
-            while (!feof($inh)) {
-                $buffer = fread($inh, 8192);
-                if (@fwrite($this->_tmpfh, $buffer) === false) {
-                    $msg = $php_errormsg;
-                    return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
-                                                    $this->_tmpfile, $msg),
-                                            OUT_LOG | EX_IOERR);
-                }
-            }
-        } else {
-            /* No ical yet? Let's try to identify the string
-             * "text/calendar". It's likely that we have a mime
-             * multipart message including iCal then.
-             */
-            while (!feof($inh)) {
-                $buffer = fread($inh, 8192);
-                if (@fwrite($this->_tmpfh, $buffer) === false) {
-                    $msg = $php_errormsg;
-                    return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
-                                                    $this->_tmpfile, $msg),
-                                            OUT_LOG | EX_IOERR);
-                }
-                if (strpos($buffer, 'text/calendar')) {
-                    $ical = true;
-                }
-            }
-        }
-        /* High speed section END */
-
-        if (@fclose($this->_tmpfh) === false) {
-            $msg = $php_errormsg;
-            return PEAR::raiseError(sprintf("Error: Failed closing %s: %s",
-                                            $this->_tmpfile, $msg),
-                                    OUT_LOG | EX_IOERR);
-        }
-
-        if ($ical) {
-            require_once 'Horde/Kolab/Resource.php';
-            $newrecips = array();
-            foreach ($this->_recipients as $recip) {
-                Horde::logMessage(sprintf("Calling resmgr_filter(%s, %s, %s, %s)",
-                                          $this->_fqhostname, $this->_sender,
-                                          $recip, $this->_tmpfile), __FILE__, __LINE__,
-                                  PEAR_LOG_DEBUG);
-                $r = &new Kolab_Resource();
-                $rc = $r->handleMessage($this->_fqhostname, $this->_sender,
-                                        $recip, $this->_tmpfile);
-                if (is_a($rc, 'PEAR_Error')) {
-                    return $rc;
-                } else if ($rc === true) {
-                    $newrecips[] = $recip;
-                }
-            }
-            $this->_recipients = $newrecips;
-            $this->_add_headers[] = 'X-Kolab-Scheduling-Message: TRUE';
-        } else {
-            $this->_add_headers[] = 'X-Kolab-Scheduling-Message: FALSE';
-        }
-
-        /* Check if we still have recipients */
-        if (empty($this->_recipients)) {
-            Horde::logMessage("No recipients left.", 
-                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-            return;
-        } else {
-            $result = $this->_deliver($transport);
-            if (is_a($result, 'PEAR_Error')) {
-                return $result;
-            }
-        }
-
-        Horde::logMessage("Filter_Incoming successfully completed.", 
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-    }
-
-    /**
-     * Deliver the message.
-     *
-     * @param string $transport  The name of the transport driver.
-     *
-     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
-     */
-    function _deliver($transport)
-    {
-        global $conf;
-
-        if (isset($conf['kolab']['filter']['lmtp_host'])) {
-            $host = $conf['kolab']['filter']['lmtp_host'];
-        } else {
-            $host = 'localhost';
-        }
-        if (isset($conf['kolab']['filter']['lmtp_port'])) {
-            $port = $conf['kolab']['filter']['lmtp_port'];
-        } else {
-            $port = 2003;
-        }
-
-        /* Load the LDAP library */
-        require_once 'Horde/Kolab/Server.php';
-
-        $server = &Horde_Kolab_Server::singleton();
-        if (is_a($server, 'PEAR_Error')) {
-            $server->code = OUT_LOG | EX_SOFTWARE;
-            return $server;
-        }
-
-        $hosts = array();
-        foreach ($this->_recipients as $recipient) {
-            $dn = $server->uidForIdOrMail($recipient);
-            if (is_a($dn, 'PEAR_Error')) {
-                return $dn;
-            }
-            if (!$dn) {
-                Horde::logMessage(sprintf('User %s does not exist!', $recipient), 
-                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
-            }
-            $user = $server->fetch($dn, KOLAB_OBJECT_USER);
-            if (is_a($user, 'PEAR_Error')) {
-                $user->code = OUT_LOG | EX_NOUSER;
-                return $user;
-            }
-            $imapserver = $user->get(KOLAB_ATTR_IMAPHOST);
-            if (is_a($imapserver, 'PEAR_Error')) {
-                $imapserver->code = OUT_LOG | EX_NOUSER;
-                return $imapserver;
-            }
-            if (!empty($imapserver)) {
-                $uhost = $imapserver;
-            } else {
-                $uhost = $host;
-            }
-            $hosts[$uhost][] = $recipient;
-        }
-
-        foreach (array_keys($hosts) as $imap_host) {
-            $params =  array('host' => $imap_host, 'port' => $port);
-            if ($imap_host != $host) {
-                $params['user'] = $conf['kolab']['filter']['lmtp_user'];
-                $params['pass'] = $conf['kolab']['filter']['lmtp_pass'];
-            }
-            $transport = &Horde_Kolab_Filter_Transport::factory($transport, $params);
-
-            $tmpf = @fopen($this->_tmpfile, 'r');
-            if (!$tmpf) {
-                $msg = $php_errormsg;
-                return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
-                                                $this->_tmpfile, $msg),
-                                        OUT_LOG | EX_IOERR);
-            }
-
-            $result = $transport->start($this->_sender, $hosts[$imap_host]);
-            if (is_a($result, 'PEAR_Error')) {
-                return $result;
-            }
-
-            $headers_done = false;
-            while (!feof($tmpf) && !$headers_done) {
-                $buffer = fgets($tmpf, 8192);
-                if (!$headers_done && rtrim($buffer, "\r\n") == '') {
-                    $headers_done = true;
-                    foreach ($this->_add_headers as $h) {
-                        $result = $transport->data("$h\r\n");
-                        if (is_a($result, 'PEAR_Error')) {
-                            return $result;
-                        }
-                    }
-                }
-                $result = $transport->data($buffer);
-                if (is_a($result, 'PEAR_Error')) {
-                    return $result;
-                }
-            }
-
-            while (!feof($tmpf)) {
-                $buffer = fread($tmpf, 8192);
-                $len = strlen($buffer);
-
-                /* We can't tolerate that the buffer breaks the data
-                 * between \r and \n, so we try to avoid that. The limit
-                 * of 100 reads is to battle abuse
-                 */
-                while ($buffer{$len-1} == "\r" && $len < 8192 + 100) {
-                    $buffer .= fread($tmpf, 1);
-                    $len++;
-                }
-                $result = $transport->data($buffer);
-                if (is_a($result, 'PEAR_Error')) {
-                    return $result;
-                }
-            }
-            return $transport->end();
-        }
-    }
-}
-?>
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Outlook.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Outlook.php
deleted file mode 100644
index 66e5790..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Outlook.php
+++ /dev/null
@@ -1,273 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Outlook.php,v 1.3.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/* Load the iCal handling */
-require_once 'Horde/iCalendar.php';
-
-/* Load MIME handlers */
-require_once 'Horde/MIME.php';
-require_once 'Horde/MIME/Message.php';
-require_once 'Horde/MIME/Headers.php';
-require_once 'Horde/MIME/Part.php';
-require_once 'Horde/MIME/Structure.php';
-
-/**
- * Provides Mail rewriting for malformed Outlook messages
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Outlook.php,v 1.3.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Kolab_Filter_Outlook
-{
-
-    /**
-     * Returns a parsed MIME message
-     *
-     * @param string $text   The text of the message
-     *
-     * @return array An array with the MIME parsed headers and body.
-     */
-    function _mimeParse(&$text)
-    {
-        /* Taken from Horde's MIME/Structure.php */
-        require_once 'Mail/mimeDecode.php';
-
-        /* Set up the options for the mimeDecode class. */
-        $decode_args = array();
-        $decode_args['include_bodies'] = true;
-        $decode_args['decode_bodies'] = false;
-        $decode_args['decode_headers'] = false;
-
-        $mimeDecode = &new Mail_mimeDecode($text, MIME_PART_EOL);
-        if (!($structure = $mimeDecode->decode($decode_args))) {
-            return false;
-        }
-
-        /* Put the object into imap_parsestructure() form. */
-        MIME_Structure::_convertMimeDecodeData($structure);
-
-        return array($structure->headers, $ret = &MIME_Structure::parse($structure));
-    }
-
-    /**
-     * Add a header entry.
-     *
-     * @param string        $name        The name of the header entry.
-     * @param MIME_Headers  $msg_header  A link to the MIME header handler.
-     * @param array         $headerarray The list of current headers.
-     */
-    function _copyHeader($name, &$msg_headers, &$headerarray)
-    {
-        $lname = strtolower($name);
-        if (array_key_exists($lname, $headerarray)) {
-            if (is_array($headerarray[$lname])) {
-                foreach ($headerarray[$lname] as $h) {
-                    $msg_headers->addHeader($name, $h);	
-                }
-            } else {
-                $msg_headers->addHeader($name, $headerarray[$lname]);
-            }
-        }
-    }
-
-    /**
-     * Yet another problem: Outlook seems to remove the organizer from
-     * the iCal when forwarding -- we put the original sender back in
-     * as organizer.
-     *
-     * @param string        $icaltext  The ical message.
-     * @param MIME_Headers  $from      The message sender.
-     */
-    function _addOrganizer(&$icaltxt, $from)
-    {
-        global $conf;
-
-        if (isset($conf['kolab']['filter']['email_domain'])) {
-            $email_domain = $conf['kolab']['filter']['email_domain'];
-        } else {
-            $email_domain = 'localhost';
-        }
-
-        $iCal = &new Horde_iCalendar();
-        $iCal->parsevCalendar($icaltxt);
-        $vevent =& $iCal->findComponent('VEVENT');
-        if ($vevent) {
-            if (!$vevent->organizerName()) {
-                $adrs = imap_rfc822_parse_adrlist($from, $email_domain);
-                if (count($adrs) > 0) {
-                    $org_email = 'mailto:'.$adrs[0]->mailbox.'@'.$adrs[0]->host;
-                    $org_name  = $adrs[0]->personal;
-                    if ($org_name) {
-                        $vevent->setAttribute('ORGANIZER', $org_email, 
-                                              array( 'CN' => $org_name), false);
-                    } else {
-                        $vevent->setAttribute('ORGANIZER', $org_email, 
-					    array(), false);
-                    }
-                    Horde::logMessage(sprintf("Adding missing organizer '%s <%s>' to iCal.",
-                                              $org_name, $org_email), 
-                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                    $icaltxt = $iCal->exportvCalendar();
-                }
-            }
-        }
-    }
-
-    /**
-     * Yet another Outlook problem: Some versions of Outlook seems to be incapable
-     * of handling non-ascii characters properly in text/calendar parts of
-     * a multi-part/mixed mail which we use for forwarding.
-     * As a solution, we encode common characters as humanreadable
-     * two-letter ascii.
-     *
-     * @param string  $text  The message text.
-     *
-     * @return string The text with umlauts replaced.
-     */
-    function _recodeToAscii( $text ) {
-        $text = str_replace( ('æ'), 'ae', $text );
-        $text = str_replace( ('ø'), 'oe', $text );
-        $text = str_replace( ('Ã¥'), 'aa', $text );
-        $text = str_replace( ('ä'), 'ae', $text );
-        $text = str_replace( ('ö'), 'oe', $text );
-        $text = str_replace( ('ü'), 'ue', $text );
-        $text = str_replace( ('ß'), 'ss', $text );
-
-        $text = str_replace( ('Æ'), 'Ae', $text );
-        $text = str_replace( ('Ø'), 'Oe', $text );
-        $text = str_replace( ('Ã…'), 'Aa', $text );
-        $text = str_replace( ('Ä'), 'Ae', $text );
-        $text = str_replace( ('Ö'), 'Oe', $text );
-        $text = str_replace( ('Ü'), 'Ue', $text );
-
-        return $text;
-    }
-
-    /**
-     * Clean up iCal messages from Outlook.
-     *
-     * @param string  $fqhostname  The name of this host.
-     * @param string  $sender      The mail address of the sender.
-     * @param array   $recipients  The recipients of the message.
-     * @param string  $origfrom    The mail address of the original sender.
-     * @param string  $subject     The mail subject.
-     * @param string  $tmpfname    Path to the temporary message store.
-     *
-     * @return boolena|PEAR_Error True if the message was successfully rewritten.
-     */
-    function embedICal($fqhostname, $sender, $recipients, $origfrom, $subject, $tmpfname) 
-    {
-        Horde::logMessage(sprintf("Encapsulating iCal message forwarded by %s", $sender), 
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        $forwardtext = "This is an invitation forwarded by outlook and\n".
-            "was rectified by the Kolab server.\n".
-            "The invitation was originally sent by\n%s.\n\n".
-            "Diese Einladung wurde von Outlook weitergeleitet\n".
-            "und vom Kolab-Server in gute Form gebracht.\n".
-            "Die Einladung wurde ursprünglich von\n%s geschickt.\n";
-
-        // Read in message text
-        $requestText = '';
-        $handle = @fopen($tmpfname, "r");
-        if ($handle === false) {
-            $msg = $php_errormsg;
-            return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
-                                            $tmpfname, $msg),
-                                    OUT_LOG | EX_IOERR);
-        }
-        while (!feof($handle)) {
-            $requestText .= fread($handle, 8192);
-        }
-        fclose($handle);
-
-        // Parse existing message
-        list( $headers, $mime) = Kolab_Filter_Outlook::_mimeParse($requestText);
-        $parts = $mime->contentTypeMap();
-        if (count($parts) != 1 || $parts[1] != 'text/calendar') {
-            Horde::logMessage("Message does not contain exactly one toplevel text/calendar part, passing through.", 
-                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-            return false;
-        }
-        $basepart = $mime->getBasePart();
-
-        // Construct new MIME message with original message attached
-        $toppart = &new MIME_Message();
-        $dorigfrom = Mail_mimeDecode::_decodeHeader($origfrom);
-        $textpart = &new MIME_Part('text/plain', sprintf($forwardtext,$dorigfrom,$dorigfrom), 'UTF-8' );
-        $ical_txt = $basepart->transferDecode();
-        Kolab_Filter_Outlook::_addOrganizer($ical_txt, $dorigfrom);
-        $msgpart = &new MIME_Part($basepart->getType(), Kolab_Filter_Outlook::_recodeToAscii($ical_txt), 
-                                  $basepart->getCharset() );
-
-        $toppart->addPart($textpart);
-        $toppart->addPart($msgpart);
-
-        // Build the reply headers.
-        $msg_headers = &new MIME_Headers();
-        Kolab_Filter_Outlook::_copyHeader( 'Received', $msg_headers, $headers );
-        //$msg_headers->addReceivedHeader();
-        $msg_headers->addMessageIdHeader();
-        Kolab_Filter_Outlook::_copyHeader( 'Date', $msg_headers, $headers );
-        Kolab_Filter_Outlook::_copyHeader( 'Resent-Date', $msg_headers, $headers );
-        Kolab_Filter_Outlook::_copyHeader( 'Subject', $msg_headers, $headers );
-        $msg_headers->addHeader('From', $sender);
-        $msg_headers->addHeader('To', join(', ', $recipients));
-        $msg_headers->addHeader('X-Kolab-Forwarded', 'TRUE');
-        $msg_headers->addMIMEHeaders($toppart);
-        Kolab_Filter_Outlook::_copyHeader( 'Content-Transfer-Encoding', $msg_headers, $headers );
-
-        if (is_object($msg_headers)) {
-            $headerArray = $toppart->encode($msg_headers->toArray(), $toppart->getCharset());
-        } else {
-            $headerArray = $toppart->encode($msg_headers, $toppart->getCharset());
-        }
-
-        global $conf;
-
-        /**
-         * FIXME: Another hack for the testing mode. Should probably use the
-         * Kolab_Filter_Transport class in the _inject method.
-         */
-        if (empty($conf['kolab']['filter']['testing'])) {
-            return Kolab_Filter_Outlook::_inject($toppart, $recipients, $headerArray);
-        } else {
-            return true;
-        }
-    }
-
-    function _inject(&$toppart, $recipients, $headerArray)
-    {
-        // Inject message back into postfix
-        require_once 'Mail.php';
-        $mailer = &Mail::factory('SMTP', array('auth' => false, 'port' => 10026 ));
-
-        $msg = $toppart->toString();
-        /* Make sure the message has a trailing newline. */
-        if (substr($msg, -1) != "\n") {
-            $msg .= "\n";
-        }
-
-        $result = $mailer->send($recipients, $headerArray, $msg);
-        if (is_a($result, 'PEAR_Error')) {
-            $append = sprintf(", original code %s", $result->getCode());
-            $result->message = $result->getMessage() . $append;
-            $result->code = OUT_LOG | OUT_STDOUT | EX_TEMPFAIL;
-            return $result;
-        }
-
-        return true;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Response.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Response.php
deleted file mode 100644
index 2d74c1c..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Response.php
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Response.php,v 1.3.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/* Require the PEAR library for PEAR errors */
-require_once 'PEAR.php';
-
-/* Some output constants */
-define( 'OUT_STDOUT', 128 );
-define( 'OUT_LOG', 256 );
-
-/* Failure constants from postfix src/global/sys_exits.h */
-define('EX_USAGE', 64);       /* command line usage error */
-define('EX_DATAERR', 65);     /* data format error */
-define('EX_NOINPUT', 66);     /* cannot open input */
-define('EX_NOUSER', 67);      /* user unknown */
-define('EX_NOHOST', 68);      /* host name unknown */
-define('EX_UNAVAILABLE', 69); /* service unavailable */
-define('EX_SOFTWARE', 70);    /* internal software error */
-define('EX_OSERR', 71);       /* system resource error */
-define('EX_OSFILE', 72);      /* critical OS file missing */
-define('EX_CANTCREAT', 73);   /* can't create user output file */
-define('EX_IOERR', 74);       /* input/output error */
-define('EX_TEMPFAIL', 75);    /* temporary failure */
-define('EX_PROTOCOL', 76);    /* remote error in protocol */
-define('EX_NOPERM', 77);      /* permission denied */
-define('EX_CONFIG', 78);      /* local configuration error */
-
-/**
- * Provides error handling for the Kolab server filter scripts.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Response.php,v 1.3.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Response
-{
-
-    /**
-     * Constructor.
-     */
-    function Horde_Kolab_Filter_Response()
-    {
-        /* Set a custom PHP error handler to catch any coding errors */
-        set_error_handler(array($this, '_fatal'));
-    }
-
-    /**
-     * Handle the results of the message transport.
-     *
-     * @param mixed $result The reponse of the transport.
-     */
-    function handle($result)
-    {
-        /* No error? Be happy and exit clean */
-        if (!is_a($result, 'PEAR_Error')) {
-            exit(0);
-        }
-
-        $msg = $result->getMessage();
-        $code = $result->getCode();
-
-        if ($code & OUT_STDOUT) {
-            fwrite(STDOUT, $msg);
-        }
-        if  ($code & OUT_LOG || empty($code)) {
-            $this->_log($result);
-        }
-
-        // FIXME: Add a userinfo handler in case there were multiple
-        // combined errors
-
-        /* If we have an error code we want to return it to the
-         * calling application and exit here
-         */
-        if ($code) {
-            /* Return the first seven bits as error code to postfix */
-            exit($code & 127);
-        }
-    }
-
-    /**
-     * An alternative PHP error handler so that we don't drop silent
-     * on fatal errors.
-     *
-     * @param int    $errno    The error number.
-     * @param string $errmsg   The error message.
-     * @param string $filename The file where the error occured.
-     * @param int    $linenum  The line where the error occured.
-     * @param mixed  $vars     ?
-     *
-     * @return boolean Always false.
-     */
-    function _fatal($errno, $errmsg, $filename, $linenum, $vars)
-    {
-        /* Ignore strict errors for now since even PEAR will raise
-         * strict notices 
-         */
-        if ($errno == E_STRICT) {
-            return false;
-        }
-
-        $fatal = array(E_ERROR,
-                       E_PARSE,
-                       E_CORE_ERROR,
-                       E_COMPILE_ERROR,
-                       E_USER_ERROR);
-
-        if (in_array($errno, $fatal)) {
-            $code = OUT_STDOUT | OUT_LOG | EX_UNAVAILABLE;
-            $msg = 'CRITICAL: You hit a fatal bug in kolab-filter. Please inform the Kolab developers at https://www.intevation.de/roundup/kolab/. The error was: ' . $errmsg;
-        } else {
-            $code = 0;
-            $msg = 'PHP Error: ' . $errmsg;
-        }
-
-        $error = &new PEAR_Error($msg, $code);
-        $this->handle($error);
-
-        return false;
-    }
-
-    /**
-     * Log an error.
-     *
-     * @param PEAR_error $result The reponse of the transport.
-     */
-    function _log($result)
-    {
-        global $conf;
-
-        $msg = $result->getMessage() . '; Code: ' . $result->getCode();
-
-        /* Log all errors */
-        $file = __FILE__;
-        $line = __LINE__;
-
-        $frames = $result->getBacktrace();
-        if (count($frames) > 1) {
-            $frame = $frames[1];
-        } else if (count($frames) == 1) {
-            $frame = $frames[0];
-        }
-        if (isset($frame['file'])) {
-            $file = $frame['file'];
-        }
-        if (isset($frame['line'])) {
-            $line = $frame['line'];
-        }
-
-        /* In debugging mode the errors get delivered to the screen
-         * without a time stamp (mainly because of unit testing) 
-         */
-        if (!isset($conf['kolab']['filter']['debug'])
-            || !$conf['kolab']['filter']['debug']) {
-            Horde::logMessage($msg, $file, $line, PEAR_LOG_ERR);
-        } else {
-            $msg .= ' (Line ' . $frame['line'] . ' in ' . basename($frame['file']) . ")\n";
-            fwrite(STDOUT, $msg);
-        }
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport.php
deleted file mode 100644
index cbd16db..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport.php
+++ /dev/null
@@ -1,295 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Provides a delivery mechanism for a mail message.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport 
-{
-    /**
-     * The connection parameters for the transport.
-     *
-     * @var array
-     */
-    var $_params;
-
-    /**
-     * The transport class delivering the message.
-     *
-     * @var mixed
-     */
-    var $_transport;
-
-    /**
-     * Internal marker to indicate if we received a new line.
-     *
-     * @var boolean
-     */
-    var $_got_newline;
-
-    /**
-     * Constructor.
-     */
-    function Horde_Kolab_Filter_Transport($params)
-    {
-        $this->_params = $params;
-        $this->_transport = false;
-    }
-
-    /**
-     * Attempts to return a concrete Horde_Kolab_Filter_Transport instance based on $driver.
-     *
-     * @param string $driver The type of the concrete Horde_Kolab_Filter_Transport
-     *                       subclass to return.  The class name is
-     *                       based on the Horde_Kolab_Filter_Transport driver
-     *                       ($driver).  The code is dynamically
-     *                       included.
-     *
-     * @param array $params  A hash containing any additional
-     *                       configuration or connection parameters a
-     *                       subclass might need.
-     *
-     * @return Horde_Kolab_Filter_Transport|boolean The newly created concrete
-     *                                 Horde_Kolab_Filter_Transport instance, or
-     *                                 false on an error.
-     */
-    function &factory($driver, $params = array())
-    {
-        $class = 'Horde_Kolab_Filter_Transport_' . $driver;
-        if (!class_exists($class)) {
-            include dirname(__FILE__) . '/Transport/' . $driver . '.php';
-        }
-        if (class_exists($class)) {
-            $transport = &new $class($params);
-            return $transport;
-        }
-        return PEAR::raiseError(sprintf('No such class \"%s\"', $class),
-                                OUT_LOG | EX_SOFTWARE);
-    }
-
-    /**
-     * Create the transport class.
-     */
-    function createTransport() {
-        $this->_transport = $this->_createTransport();
-    }
-
-    /**
-     * Starts transporting the message.
-     *
-     * @param string $sender The message sender.
-     * @param array $recips  The recipients of the message.
-     *
-     * @return boolean|PEAR_Error True on success, a PEAR_Error otherwise.
-     */
-    function start($sender, $recips)
-    {
-        $this->createTransport();
-
-        $myclass = get_class($this->_transport);
-        $this->_got_newline = true;
-
-        $result = $this->_transport->connect();
-        if (is_a($result, 'PEAR_Error')) {
-            $result->code = OUT_LOG | EX_UNAVAILABLE;
-            return $result;
-        }
-
-        if (isset($this->_params['user']) && isset($this->_params['pass']) ) {
-            $this->_transport->auth($this->_params['user'], $this->_params['pass'], 'PLAIN');
-        }
-
-        $result = $this->_transport->mailFrom($sender);
-        if (is_a($result, 'PEAR_Error')) {
-            $resp = $this->_transport->getResponse();
-            $error = PEAR::raiseError(sprintf('Failed to set sender: %s, code=%s',
-                                              $resp[1], $resp[0]), $resp[0]);
-            return $this->rewriteCode($error);
-        }
-
-        if (!is_array($recips)) {
-            $recips = array($recips);
-        }
-
-        $reciperrors = array();
-        foreach ($recips as $recip) {
-            $result = $this->_transport->rcptTo($recip);
-            if (is_a($result, 'PEAR_Error')) {
-                $resp = $this->_transport->getResponse();
-                $reciperrors[] = PEAR::raiseError(sprintf('Failed to set recipient: %s, code=%s',
-                                                          $resp[1], $resp[0]), $resp[0]);
-            }
-        }
-
-        if (count($reciperrors) == count($recips)) {
-            /* OK, all failed, just give up */
-            if (count($reciperrors) == 1) {
-                /* Only one failure, just return that */
-                return $reciperrors[0];
-            }
-            /* Multiple errors */
-            $error = $this->createErrorObject($reciperrors,
-                                              'Delivery to all recipients failed!');
-            return $this->rewriteCode($error);
-        }
-
-        $result = $this->_transport->_put('DATA');
-        if (is_a($result, 'PEAR_Error')) {
-            $resp = $this->_transport->getResponse();
-            $error = PEAR::raiseError(sprintf('Failed to send DATA: %s, code=%s',
-                                              $resp[1], $resp[0]), $resp[0]);
-            return $this->rewriteCode($error);
-        }
-
-        $result = $this->_transport->_parseResponse(354);
-        if (is_a($result, 'PEAR_Error')) {
-            return $this->rewriteCode($result);
-        }
-
-        if (!empty($reciperrors)) {
-            return $this->createErrorObject($reciperrors,
-                                            'Delivery to some recipients failed!');
-        }
-        return true;
-    }
-
-    /**
-     * Encapsulate multiple errors in one.
-     *
-     * @param array  $reciperrors  The errors.
-     * @param string $msg          A combined error message.
-     *
-     * @return PEAR_Error The combined error.
-     */
-    function createErrorObject($reciperrors, $msg = null)
-    {
-        /* Return the lowest errorcode to not bounce more
-         * than we have to
-         */
-        if ($msg == null) {
-            $msg = 'Delivery to recipients failed.';
-        }
-
-        $code = 1000;
-
-        foreach ($reciperrors as $err) {
-            if ($err->code < $code) {
-                $code = $err->code;
-            }
-        }
-        return new PEAR_Error($msg, $code, null, null, $reciperrors);  
-    }
-
-    /**
-     * Modified implementation from Net_SMTP that supports dotstuffing
-     * even when getting the mail line-by line.
-     *
-     * @param string $data   Mail message data.
-     */
-    function quotedataline(&$data)
-    {
-        /*
-         * Change Unix (\n) and Mac (\r) linefeeds into Internet-standard CRLF
-         * (\r\n) linefeeds.
-         */
-        $data = preg_replace(array('/(?<!\r)\n/','/\r(?!\n)/'), "\r\n", $data);
-
-        /*
-         * Because a single leading period (.) signifies an end to the data,
-         * legitimate leading periods need to be "doubled" (e.g. '..').
-         */
-        if ($this->_got_newline && !empty($data) && $data[0] == '.') {
-            $data = '.'.$data;
-        }
-
-        $data = str_replace("\n.", "\n..", $data);
-        $len = strlen($data);
-        if ($len > 0) {
-            $this->_got_newline = ( $data[$len-1] == "\n" );
-        }
-    }
-
-    /**
-     * Send message data.
-     *
-     * @param string $data The text of the message.
-     *
-     * @return boolean|PEAR_Error True on success.
-     */
-    function data($data) {
-        $this->quotedataline($data);
-        $result = $this->_transport->_send($data);
-        if (is_a($result, 'PEAR_Error')) {
-            $resp = $this->_transport->getResponse();
-            $error = PEAR::raiseError(sprintf('Failed to send message data: %s, code=%s',
-                                              $resp[1], $resp[0]), $resp[0]);
-            return $this->rewriteCode($error);
-        }
-        return true;
-    }
-
-    /**
-     * Finish sending data.
-     *
-     * @return boolean|PEAR_Error True on success.
-     */
-    function end() 
-    {
-        if ($this->_got_newline) {          
-            $dot = ".\r\n";
-        } else {
-            $dot = "\r\n.\r\n";
-        }
-
-        $result = $this->_transport->_send($dot);
-        if (is_a($result, 'PEAR_Error')) {
-            $resp = $this->_transport->getResponse();
-            $error = PEAR::raiseError(sprintf('Failed to send message end: %s, code=%s',
-                                              $resp[1], $resp[0]), $resp[0]);
-            return $this->rewriteCode($error);
-        }
-        $result = $this->_transport->_parseResponse(250);
-        if (is_a($result, 'PEAR_Error')) {
-            return $this->rewriteCode($result);
-        }
-        $this->_transport->disconnect();
-        $this->_transport = false;
-        return true;
-    }
-
-    /**
-     * Rewrite the code to something postfix can understand.
-     *
-     * @param PEAR_error $result The reponse of the transport.
-     *
-     * @return PEAR_error An error with a rewritten error code.
-     */
-    function rewriteCode($result) 
-    {
-        if ($result->getCode() < 500) {
-            $code = EX_TEMPFAIL;
-        } else {
-            $code = EX_UNAVAILABLE;
-        }
-        $append = sprintf(', original code %s', $result->getCode());
-        $result->message = $result->getMessage() . $append;
-        $result->code = OUT_LOG | OUT_STDOUT | $code;
-        return $result;
-    }
-
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php
deleted file mode 100644
index 9751533..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php
+++ /dev/null
@@ -1,261 +0,0 @@
-<?PHP
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Defines a transport mechanism for delivering mails to the dovecot
- * IMAP server.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Intevation GmbH
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Sascha Wilde <wilde at intevation.de>
- * @package Kolab_Filter
- */
-class Dovecot_LDA
-{
-    /**
-     * The mail sender.
-     *
-     * @var string
-     */
-    var $_envelopeSender;
-
-    /**
-     * The mail recipient.
-     *
-     * @var string
-     */
-    var $_envelopeTo = array();
-
-    /**
-     * Transport status.
-     *
-     * @var int
-     */
-    var $_status;
-
-    /**
-     * The data that should be sent.
-     *
-     * @var array
-     */
-    var $_data;
-
-    /**
-     * File handle for delivery.
-     *
-     * @var int
-     */
-    var $_deliver_fh;
-
-    function Dovecot_LDA()
-    {
-        $this->_envelopeTo = false;
-        $this->_status = 220;
-    }
-
-    /**
-     * Pretends to connect to Dovecot which is not necessary.
-     *
-     * @return boolean|PEAR_Error Always true.
-     */
-    function connect()
-    {
-        global $conf;
-
-        if (!isset($conf['kolab']['filter']['dovecot_deliver'])) {
-            return PEAR::raiseError('Path to the dovecot delivery tool missing!');
-        }
-        return true;
-    }
-
-    /**
-     * Pretends to disconnect from Dovecot which is not necessary.
-     *
-     * @return boolean Always true.
-     */
-    function disconnect()
-    {
-        return true;
-    }
-
-
-    /**
-     * Set the mail sender.
-     *
-     * @return boolean Always true.
-     */
-    function mailFrom($sender)
-    {
-        $this->_envelopeSender = $sender;
-        $this->_status = 250;
-        return true;
-    }
-
-    /**
-     * Add a mail recipient.
-     *
-     * @return boolean Always true.
-     */
-    function rcptTo($rcpt)
-    {
-        $this->_envelopeTo[] = $rcpt;
-        $this->_status = 250;
-        return true;
-    }
-
-    /**
-     * Receive commands.
-     *
-     * @param string $cmd The command.
-     *
-     * @return boolean|PEAR_Error True if the command succeeded.
-     */
-    function _put($cmd)
-    {
-        if ($cmd == "DATA") {
-            $this->_status = 354;
-        } else {
-            $this->_status = 500;
-            return PEAR::raiseError('Dovecot LDA Backend received an unknown command.');
-        }
-        return true;
-    }
-
-    /**
-     * Check the current response code.
-     *
-     * @param string $code The response to parse.
-     *
-     * @return boolean|PEAR_Error True if the current status matches
-     * the expectation.
-     */
-    function _parseResponse($code)
-    {
-        if ($code) {
-            if ($this->_status == $code) {
-                return true;
-            } else {
-                return PEAR::raiseError(sprintf("Dovecot LDA status is %s though %s was expected!.",
-                                                $this->_status, $code));
-            }
-        } else {
-            return $this->status;
-        }
-    }
-
-    /**
-     * Send actual mail data.
-     *
-     * @param string $data The data to write.
-     *
-     * @return boolean|PEAR_Error True if successful.
-     */
-    function _send($data)
-    {
-        $errors = array();
-        if ($data == ".\r\n" or $data == "\r\n.\r\n") {
-            foreach ($this->_envelopeTo as $recipient) {
-                $result = $this->_start_deliver($recipient);
-                if (is_a($result, 'PEAR_Error')) {
-                    $errors[] = $result;
-                    continue;
-                }
-
-                $result = $this->_deliver();
-                if (is_a($result, 'PEAR_Error')) {
-                    $errors[] = $result;
-                    continue;
-                }
-
-                $result = $this->_stop_deliver();
-                if (is_a($result, 'PEAR_Error')) {
-                    $errors[] = $result;
-                    continue;
-                }
-            }
-            if (empty($errors)) {
-                $this->_status = 250;
-            } else {
-                $this->_status = 500;
-                $msg = '';
-                foreach ($errors as $error) {
-                    $msg[] = $error->getMessage();
-                }
-                return PEAR::raiseError(sprintf("Dovecot delivery failed: %s",
-                                                join(', ', $msg)));
-            }
-        } else {
-            $this->_data[] = $data;
-        }
-        return true;
-    }
-
-
-    /**
-     * Start the delivery process for a recipient.
-     *
-     * @param string $recipient The recipient of the message.
-     *
-     * @return boolean|PEAR_Error True if successful.
-     */
-    function _start_deliver($recipient)
-    {
-        global $conf;
-
-        Horde::logMessage(sprintf("Starting Dovecot delivery process with UID %d, GID %d (sender=%s, recipient=%s) ...",
-                                  getmyuid(), getmygid(),
-                                  $this->_envelopeSender, $recipient),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        $deliver = $conf['kolab']['filter']['dovecot_deliver'];
-
-        $this->_deliver_fh = popen($deliver . ' -f ' . $this->_envelopeSender .
-                                   ' -d ' . $recipient, "w");
-        if ($this->_deliver_fh === false) {
-            return PEAR::raiseError('Failed to connect to the dovecot delivery tool!');
-        }
-        return true;
-    }
-
-    /**
-     * End the delivery process for a recipient.
-     *
-     * @return boolean|PEAR_Error True if successful.
-     */
-    function _stop_deliver()
-    {
-        Horde::logMessage("Stoping Dovecot delivery process ...",
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-        $retval = pclose($this->_deliver_fh);
-        Horde::logMessage(sprintf("... return value was %d\n", $retval),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-        if ($retval != 0) {
-            return PEAR::raiseError('Dovecot LDA Backend delivery process signaled an error.');
-        }
-        return true;
-    }
-
-    /**
-     * Write data to the deliver process.
-     *
-     * @return boolean|PEAR_Error True if successful.
-     */
-    function _deliver()
-    {
-        foreach ($this->_data as $line) {
-            if (!fwrite($this->_deliver_fh, $line)) {
-                return PEAR::raiseError('Dovecot LDA Backend failed writing to the deliver process.');
-            }
-        }
-        return true;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php
deleted file mode 100644
index b9a654a..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php,v 1.3.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/* Require the base class */
-require_once 'Net/LMTP.php';
-
-/**
- * Extended LMTP class with support for TLS.
- *
- * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Net_LMTP_TLS extends Net_LMTP {
-
-    /**
-     * Attempt to do LMTP authentication.
-     *
-     * @param string The userid to authenticate as.
-     * @param string The password to authenticate with.
-     * @param string The requested authentication method.  If none is
-     *               specified, the best supported method will be used.
-     *
-     * @return mixed Returns a PEAR_Error with an error message on any
-     *               kind of failure, or true on success.
-     * @access public
-     */
-    function auth($uid, $pwd , $method = '')
-    {
-        if (version_compare(PHP_VERSION, '5.1.0', '>=')) {
-            if (!isset($this->_esmtp['STARTTLS'])) {
-                return PEAR::raiseError('LMTP server does not support authentication');
-            }
-            if (PEAR::isError($result = $this->_put('STARTTLS'))) {
-                return $result;
-            }
-            if (PEAR::isError($result = $this->_parseResponse(220))) {
-                return $result;
-            }
-            if (PEAR::isError($result = $this->_socket->enableCrypto(true, STREAM_CRYPTO_METHOD_TLS_CLIENT))) {
-                return $result;
-            }
-            elseif ($result !== true) {
-                return PEAR::raiseError('STARTTLS failed');
-            }
-
-            /* Send LHLO again to recieve the AUTH string from the
-             * LMTP server. */
-            $this->_negotiate();
-            if (empty($this->_esmtp['AUTH'])) {
-                return PEAR::raiseError('LMTP server does not support authentication');
-            }
-        }
-
-        /*
-         * If no method has been specified, get the name of the best supported
-         * method advertised by the LMTP server.
-         */
-        if (empty($method) || $method === true ) {
-            if (PEAR::isError($method = $this->_getBestAuthMethod())) {
-                /* Return the PEAR_Error object from _getBestAuthMethod(). */
-                return $method;
-            } 
-        } else {
-            $method = strtoupper($method);
-        }
-
-        switch ($method) {
-            case 'DIGEST-MD5':
-                $result = $this->_authDigest_MD5($uid, $pwd);
-                break;
-            case 'CRAM-MD5':
-                $result = $this->_authCRAM_MD5($uid, $pwd);
-                break;
-            case 'LOGIN':
-                $result = $this->_authLogin($uid, $pwd);
-                break;
-            case 'PLAIN':
-                $result = $this->_authPlain($uid, $pwd);
-                break;
-            default : 
-                $result = new PEAR_Error("$method is not a supported authentication method");
-                break;
-        }
-
-        /* If an error was encountered, return the PEAR_Error object. */
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        /* RFC-2554 requires us to re-negotiate ESMTP after an AUTH. */
-        if (PEAR::isError($error = $this->_negotiate())) {
-            return $error;
-        }
-
-        return true;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/drop.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/drop.php
deleted file mode 100644
index e0fed9a..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/drop.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/drop.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Drops a mail instead of delivering it.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/drop.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport_drop extends Horde_Kolab_Filter_Transport 
-{
-    /**
-     * Create the transport handler.
-     *
-     * @return DropWrapper Provides a null class as transport.
-     */
-    function &_createTransport()
-    {
-        $transport = &new DropWrapper();
-        return $transport;
-    }
-}
-
-/**
- * Defines a wrapper that provides functionality comparable to the
- * Net/*MTP.php classes.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/drop.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class DropWrapper
-{
-    /**
-     * Pretends to connect.
-     *
-     * @return boolean Always true.
-     */
-    function connect()
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to disconnect.
-     *
-     * @return boolean Always true.
-     */
-    function disconnect()
-    {
-        return true;
-    }
-
-    /**
-     * Set the sender.
-     *
-     * @return boolean Always true.
-     */
-    function mailFrom($sender)
-    {
-        return true;
-    }
-
-    /**
-     * Set the recipient.
-     *
-     * @return boolean Always true.
-     */
-    function rcptTo($recipient)
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to send commands.
-     *
-     * @param string $cmd The command.
-     *
-     * @return boolean Always true.
-     */
-    function _put($cmd)
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to handle responses.
-     *
-     * @param string $code The response to parse.
-     *
-     * @return boolean Always true.
-     */
-    function _parseResponse($code)
-    {
-        return true;
-    }
-
-    /**
-     * Write data.
-     *
-     * @param string $data The data to write.
-     *
-     * @return boolean Always true.
-     */
-    function _send($data)
-    {
-        return true;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/echo.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/echo.php
deleted file mode 100644
index 3f9b66c..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/echo.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/echo.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Echos a mail for debugging.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/echo.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport_echo extends Horde_Kolab_Filter_Transport 
-{
-    /**
-     * Create the transport handler.
-     *
-     * @return StdOutWrapper Wraps STDOUT as transport
-     */
-    function &_createTransport()
-    {
-        $transport = &new EchoWrapper();
-        return $transport;
-    }
-}
-
-/**
- * Defines an echo wrapper that provides functionality comparable to 
- * the Net/*MTP.php classes.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/echo.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class EchoWrapper
-{
-    /**
-     * Pretends to connect to STDOUT.
-     *
-     * @return boolean Always true.
-     */
-    function connect()
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to disconnect from STDOUT.
-     *
-     * @return boolean Always true.
-     */
-    function disconnect()
-    {
-        return true;
-    }
-
-    /**
-     * Set the sender.
-     *
-     * @return mixed Result from writing the sender to STDOUT.
-     */
-    function mailFrom($sender)
-    {
-        echo sprintf("Mail from sender: %s\r\n", $sender);
-        return true;
-    }
-
-    /**
-     * Set the recipient.
-     *
-     * @return mixed Result from writing the recipient to STDOUT.
-     */
-    function rcptTo($recipient)
-    {
-        echo sprintf("Mail to recipient: %s\r\n", $recipient);
-        return true;
-    }
-
-    /**
-     * Pretends to send commands to STDOUT.
-     *
-     * @param string $cmd The command.
-     *
-     * @return boolean Always true.
-     */
-    function _put($cmd)
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to handle STDOUT responses.
-     *
-     * @param string $code The response to parse.
-     *
-     * @return boolean Always true.
-     */
-    function _parseResponse($code)
-    {
-        return true;
-    }
-
-    /**
-     * Echo data.
-     *
-     * @param string $data The data to write.
-     *
-     * @return mixed Result from writing data to STDOUT.
-     */
-    function _send($data)
-    {
-        echo $data;
-        return true;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lda.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lda.php
deleted file mode 100644
index 66f1256..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lda.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lda.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Provides DovecotLDA delivery.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lda.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Intevation GmbH
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Sascha Wilde <wilde at intevation.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport_lda extends Horde_Kolab_Filter_Transport 
-{
-    /**
-     * Create the transport handler.
-     *
-     * @return DovecotLDA The LDA handler.
-     */
-    function &_createTransport() 
-    {
-        require_once dirname(__FILE__) . '/DovecotLDA.php';
-
-        $transport = &new Dovecot_LDA();
-
-        return $transport;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lmtp.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lmtp.php
deleted file mode 100644
index b5dc94b..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/lmtp.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lmtp.php,v 1.3.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Provides LMTP for delivering a mail.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lmtp.php,v 1.3.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport_lmtp extends Horde_Kolab_Filter_Transport 
-{
-    /**
-     * Create the transport handler.
-     *
-     * @return Net_LMTP The LMTP handler.
-     */
-    function &_createTransport() 
-    {
-        require_once dirname(__FILE__) . '/LMTPTLS.php';
-
-        if (!isset($this->_params['host'])) {
-            $this->_params['host'] = '127.0.0.1';
-        }
-
-        if (!isset($this->_params['port'])) {
-            $this->_params['port'] = 2003;
-        }
-
-        $transport = &new Net_LMTP_TLS($this->_params['host'],
-                                       $this->_params['port']);
-
-        return $transport;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/smtp.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/smtp.php
deleted file mode 100644
index eff902e..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/smtp.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/smtp.php,v 1.3.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Provides SMTP for delivering mail.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/smtp.php,v 1.3.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport_smtp extends Horde_Kolab_Filter_Transport 
-{
-    /**
-     * Create the transport handler.
-     *
-     * @return Net_SMTP The SMTP handler.
-     */
-    function &_createTransport() 
-    {
-        require_once 'Net/SMTP.php';
-
-        if (!isset($this->_params['host'])) {
-            $this->_params['host'] = '127.0.0.1';
-        }
-
-        if (!isset($this->_params['port'])) {
-            $this->_params['port'] = 25;
-        }
-
-        $transport = &new Net_SMTP($this->_params['host'],
-                                   $this->_params['port']);
-        return $transport;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/stdout.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/stdout.php
deleted file mode 100644
index 40ed169..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Filter/Transport/stdout.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-/**
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/stdout.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * @package Kolab_Filter
- */
-
-/**
- * Delivers a mail to STDOUT for debugging.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/stdout.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class Horde_Kolab_Filter_Transport_stdout extends Horde_Kolab_Filter_Transport 
-{
-    /**
-     * Create the transport handler.
-     *
-     * @return StdOutWrapper Wraps STDOUT as transport
-     */
-    function &_createTransport()
-    {
-        $transport = &new StdOutWrapper();
-        return $transport;
-    }
-}
-
-/**
- * Defines a STDOUT wrapper that provides functionality comparable to 
- * the Net/*MTP.php classes.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/stdout.php,v 1.4.2.1 2009/02/20 22:37:15 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Kolab_Filter
- */
-class StdOutWrapper
-{
-    /**
-     * Pretends to connect to STDOUT.
-     *
-     * @return boolean Always true.
-     */
-    function connect()
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to disconnect from STDOUT.
-     *
-     * @return boolean Always true.
-     */
-    function disconnect()
-    {
-        return true;
-    }
-
-    /**
-     * Set the sender.
-     *
-     * @return mixed Result from writing the sender to STDOUT.
-     */
-    function mailFrom($sender)
-    {
-        return fwrite(STDOUT, sprintf("Mail from sender: %s\n", $sender));
-    }
-
-    /**
-     * Set the recipient.
-     *
-     * @return mixed Result from writing the recipient to STDOUT.
-     */
-    function rcptTo($recipient)
-    {
-        return fwrite(STDOUT, sprintf("Mail to recipient: %s\n", $recipient));
-    }
-
-    /**
-     * Pretends to send commands to STDOUT.
-     *
-     * @param string $cmd The command.
-     *
-     * @return boolean Always true.
-     */
-    function _put($cmd)
-    {
-        return true;
-    }
-
-    /**
-     * Pretends to handle STDOUT responses.
-     *
-     * @param string $code The response to parse.
-     *
-     * @return boolean Always true.
-     */
-    function _parseResponse($code)
-    {
-        return true;
-    }
-
-    /**
-     * Write data to STDOUT.
-     *
-     * @param string $data The data to write.
-     *
-     * @return mixed Result from writing data to STDOUT.
-     */
-    function _send($data)
-    {
-        return fwrite(STDOUT, $data);
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Resource.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Resource.php
deleted file mode 100644
index e8aa841..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Resource.php
+++ /dev/null
@@ -1,1082 +0,0 @@
-<?php
-/**
- * Resource management for the Kolab server.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php,v 1.15.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * PHP version 4
- *
- * @category Kolab
- * @package  Kolab_Filter
- * @author   Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author   Gunnar Wrobel <wrobel at pardus.de>
- * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
- * @link     http://pear.horde.org/index.php?package=Kolab_Server
- */
-
-/** Load the iCal handling */
-require_once 'Horde/iCalendar.php';
-
-/** Load MIME handlers */
-require_once 'Horde/MIME.php';
-require_once 'Horde/MIME/Message.php';
-require_once 'Horde/MIME/Headers.php';
-require_once 'Horde/MIME/Part.php';
-require_once 'Horde/MIME/Structure.php';
-
-require_once 'Horde/String.php';
-String::setDefaultCharset('utf-8');
-
-// What actions we can take when receiving an event request
-define('RM_ACT_ALWAYS_ACCEPT',              'ACT_ALWAYS_ACCEPT');
-define('RM_ACT_REJECT_IF_CONFLICTS',        'ACT_REJECT_IF_CONFLICTS');
-define('RM_ACT_MANUAL_IF_CONFLICTS',        'ACT_MANUAL_IF_CONFLICTS');
-define('RM_ACT_MANUAL',                     'ACT_MANUAL');
-define('RM_ACT_ALWAYS_REJECT',              'ACT_ALWAYS_REJECT');
-
-// What possible ITIP notification we can send
-define('RM_ITIP_DECLINE',                   1);
-define('RM_ITIP_ACCEPT',                    2);
-define('RM_ITIP_TENTATIVE',                 3);
-
-/**
- * Provides Kolab resource handling
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php,v 1.15.2.2 2009/02/24 11:17:39 wrobel Exp $
- *
- * Copyright 2004-2009 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @package Kolab_Filter
- * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- */
-class Kolab_Resource
-{
-
-    /**
-     * Returns the resource policy applying for the given sender
-     *
-     * @param string $sender   The sender address
-     * @param string $resource The resource
-     *
-     * @return array|PEAR_Error An array with "cn", "home server" and the policy.
-     */
-    function _getResourceData($sender, $resource)
-    {
-        require_once 'Horde/Kolab/Server.php';
-        $db = &Horde_Kolab_Server::singleton();
-        if (is_a($db, 'PEAR_Error')) {
-            $db->code = OUT_LOG | EX_SOFTWARE;
-            return $db;
-        }
-
-        $dn = $db->uidForMail($resource, KOLAB_SERVER_RESULT_MANY);
-        if (is_a($dn, 'PEAR_Error')) {
-            $dn->code = OUT_LOG | EX_NOUSER;
-            return $dn;
-        }
-        if (is_array($dn && count($dn) > 1)) {
-            Horde::logMessage(sprintf("%s objects returned for %s",
-                                      $count($dn), $resource),
-                              __FILE__, __LINE__, PEAR_LOG_WARNING);
-            return false;
-        }
-        $user = $db->fetch($dn, KOLAB_OBJECT_USER);
-
-        $cn      = $user->get(KOLAB_ATTR_CN);
-        $id      = $user->get(KOLAB_ATTR_MAIL);
-        $hs      = $user->get(KOLAB_ATTR_HOMESERVER);
-        if (is_a($hs, 'PEAR_Error')) {
-            return $hs;
-        }
-        $hs      = strtolower($hs);
-        $actions = $user->get(KOLAB_ATTR_IPOLICY);
-        if (is_a($actions, 'PEAR_Error')) {
-            $actions->code = OUT_LOG | EX_UNAVAILABLE;
-            return $actions;
-        }
-
-        $policies = array();
-        $defaultpolicy = false;
-        foreach ($actions as $action) {
-            if (ereg('(.*):(.*)', $action, $regs)) {
-                $policies[strtolower($regs[1])] = $regs[2];
-            } else {
-                $defaultpolicy = $action;
-            }
-        }
-        // Find sender's policy
-        if (array_key_exists($sender, $policies)) {
-            // We have an exact match, stop processing
-            $action = $policies[$sender];
-        } else {
-            $action = false;
-            $dn = $db->uidForMailOrAlias($sender);
-            if (is_a($dn, 'PEAR_Error')) {
-                $dn->code = OUT_LOG | EX_NOUSER;
-                return $dn;
-            }
-            if ($dn) {
-                // Sender is local, check for groups
-                foreach ($policies as $gid => $policy) {
-                    if ($db->memberOfGroupAddress($dn, $gid)) {
-                        // User is member of group
-                        if (!$action) {
-                            $action = $policy;
-                        } else {
-                            $action = min($action, $policy);
-                        }
-                    }
-                }
-            }
-            if (!$action && $defaultpolicy) {
-                $action = $defaultpolicy;
-            }
-        }
-        return array('cn' => $cn, 'id' => $id,
-                     'homeserver' => $hs, 'action' => $action);
-    }
-
-    function &_getICal($filename)
-    {
-        $requestText = '';
-        $handle = fopen($filename, 'r');
-        while (!feof($handle)) {
-            $requestText .= fread($handle, 8192);
-        }
-
-        $mime = &MIME_Structure::parseTextMIMEMessage($requestText);
-
-        $parts = $mime->contentTypeMap();
-        foreach ($parts as $mimeid => $conttype) {
-            if ($conttype == 'text/calendar') {
-                $part = $mime->getPart($mimeid);
-
-                $iCalendar = &new Horde_iCalendar();
-                $iCalendar->parsevCalendar($part->transferDecode());
-
-                return $iCalendar;
-            }
-        }
-        // No iCal found
-        return false;
-    }
-
-    function _imapConnect($id)
-    {
-        global $conf;
-
-        // Handle virtual domains
-        list($user, $domain) = split('@', $id);
-        if (empty($domain)) {
-            $domain = $conf['kolab']['filter']['email_domain'];
-        }
-        $calendar_user = $conf['kolab']['filter']['calendar_id'] . '@' . $domain;
-
-        /* Load the authentication libraries */
-        require_once "Horde/Auth.php";
-        require_once 'Horde/Secret.php';
-
-        $auth = &Auth::singleton(isset($conf['auth']['driver'])?$conf['auth']['driver']:'kolab');
-        $authenticated = $auth->authenticate($calendar_user,
-                                             array('password' => $conf['kolab']['filter']['calendar_pass']),
-                                             false);
-
-        if (is_a($authenticated, 'PEAR_Error')) {
-            $authenticated->code = OUT_LOG | EX_UNAVAILABLE;
-            return $authenticated;
-        }
-        if (!$authenticated) {
-            return PEAR::raiseError(sprintf('Failed to authenticate as calendar user: %s',
-                                            $auth->getLogoutReasonString()),
-                                    OUT_LOG | EX_UNAVAILABLE);
-        }
-        @session_start();
-        $_SESSION['__auth'] = array(
-            'authenticated' => true,
-            'userId' => $calendar_user,
-            'timestamp' => time(),
-            'credentials' => Secret::write(Secret::getKey('auth'),
-                                           serialize(array('password' => $conf['kolab']['filter']['calendar_pass']))),
-            'remote_addr' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null,
-        );
-
-        /* Kolab IMAP handling */
-        require_once 'Horde/Kolab/Storage/List.php';
-        $list = &Kolab_List::singleton();
-        $default = $list->getForeignDefault($id, 'event');
-        if (!$default) {
-            $default = &new Kolab_Folder();
-            $default->setList($list);
-            $default->setName($conf['kolab']['filter']['calendar_store']);
-            //FIXME: The calendar user needs access here
-            $attributes = array('default' => true,
-                                'type' => 'event',
-                                'owner' => $id);
-            $result = $default->save($attributes);
-            if (is_a($result, 'PEAR_Error')) {
-                $result->code = OUT_LOG | EX_UNAVAILABLE;
-                return $result;
-            }
-        }
-        return $default;
-    }
-
-    function _objectFromItip(&$itip)
-    {
-        $object = array();
-        $object['uid'] = $itip->getAttributeDefault('UID', '');
-
-        $org_params = $itip->getAttribute('ORGANIZER', true);
-        if (!is_a( $org_params, 'PEAR_Error')) {
-            if (!empty($org_params[0]['CN'])) {
-                $object['organizer']['display-name'] = $org_params[0]['CN'];
-            }
-            $orgemail = $itip->getAttributeDefault('ORGANIZER', '');
-            if (eregi('mailto:(.*)', $orgemail, $regs )) {
-                $orgemail = $regs[1];
-            }
-            $object['organizer']['smtp-address'] = $orgemail;
-        }
-        $object['summary'] = $itip->getAttributeDefault('SUMMARY', '');
-        $object['location'] = $itip->getAttributeDefault('LOCATION', '');
-        $object['body'] = $itip->getAttributeDefault('DESCRIPTION', '');
-        $object['start-date'] = $itip->getAttributeDefault('DTSTART', '');
-        $object['end-date'] = $itip->getAttributeDefault('DTEND', '');
-        if ($itip->getAttributeDefault('TRANSP', 'OPAQUE') == 'TRANSPARENT') {
-            $object['show-time-as'] = $itip->getAttributeDefault('DTEND', '');
-        }
-
-        $attendees = $itip->getAttribute('ATTENDEE');
-        if (!is_a( $attendees, 'PEAR_Error')) {
-            $attendees_params = $itip->getAttribute('ATTENDEE', true);
-            if (!is_array($attendees)) {
-                $attendees = array($attendees);
-            }
-            if (!is_array($attendees_params)) {
-                $attendees_params = array($attendees_params);
-            }
-
-            $object['attendee'] = array();
-            for ($i = 0; $i < count($attendees); $i++) {
-                $attendee = array();
-                if (isset($attendees_params[$i]['CN'])) {
-                    $attendee['display-name'] = $attendees_params[$i]['CN'];
-                }
-
-                $attendeeemail = $attendees[$i];
-                if (eregi('mailto:(.*)', $attendeeemail, $regs)) {
-                    $attendeeemail = $regs[1];
-                }
-                $attendee['smtp-address'] = $attendeeemail;
-
-                if( $attendees_params[$i]['RSVP'] == 'FALSE' ) {
-                    $attendee['request-response'] = false;
-                } else {
-                    $attendee['request-response'] = true;
-                }
-
-                if (isset($attendees_params[$i]['ROLE'])) {
-                    $attendee['role'] = $attendees_params[$i]['ROLE'];
-                }
-                $object['attendee'][] = $attendee;
-            }
-        }
-
-        // Alarm
-        $valarm = $itip->findComponent('VALARM');
-        if ($valarm) {
-            $trigger = $valarm->getAttribute('TRIGGER');
-            if (!is_a($trigger, 'PEAR_Error')) {
-                $p = $valarm->getAttribute('TRIGGER', true);
-                if ($trigger < 0) {
-                    // All OK, enter the alarm into the XML
-                    // NOTE: The Kolab XML format seems underspecified
-                    // wrt. alarms currently...
-                    $object['alarm'] = -$trigger / 60;
-                }
-            } else {
-                Horde::logMessage('No TRIGGER in VALARM. ' . $trigger->getMessage(),
-                                  __FILE__, __LINE__, PEAR_LOG_ERR);
-            }
-        }
-
-        // Recurrence
-        $rrule_str = $itip->getAttribute('RRULE');
-        if (!is_a($rrule_str, 'PEAR_Error')) {
-            require_once 'Horde/Date/Recurrence.php';
-            $recurrence = &new Horde_Date_Recurrence(time());
-            $recurrence->fromRRule20($rrule_str);
-            $object['recurrence'] = $recurrence->toHash();
-        }
-
-        Horde::logMessage(sprintf('Assembled event object: %s',
-                                  print_r($object, true)),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        return $object;
-    }
-
-    function handleMessage($fqhostname, $sender, $resource, $tmpfname)
-    {
-        global $conf;
-
-        $rdata = $this->_getResourceData($sender, $resource);
-        if (is_a($rdata, 'PEAR_Error')) {
-            return $rdata;
-        } else if ($rdata === false) {
-            /* No data, probably not a local user */
-            return true;
-        } else if ($rdata['homeserver'] && $rdata['homeserver'] != $fqhostname) {
-            /* Not the users homeserver, ignore */
-            return true;
-        }
-
-        $cn = $rdata['cn'];
-        $id = $rdata['id'];
-        if (isset($rdata['action'])) {
-            $action = $rdata['action'];
-        } else {
-            // Manual is the only safe default!
-            $action = RM_ACT_MANUAL;
-        }
-        Horde::logMessage(sprintf('Action for %s is %s',
-                                  $sender, $action),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        // Get out as early as possible if manual
-        if ($action == RM_ACT_MANUAL) {
-            Horde::logMessage(sprintf('Passing through message to %s', $id),
-                              __FILE__, __LINE__, PEAR_LOG_INFO);
-            return true;
-        }
-
-        /* Get the iCalendar data (i.e. the iTip request) */
-        $iCalendar = &$this->_getICal($tmpfname);
-        if ($iCalendar === false) {
-            // No iCal in mail
-            Horde::logMessage(sprintf('Could not parse iCalendar data, passing through to %s', $id),
-                              __FILE__, __LINE__, PEAR_LOG_INFO);
-            return true;
-        }
-        // Get the event details out of the iTip request
-        $itip = &$iCalendar->findComponent('VEVENT');
-        if ($itip === false) {
-            Horde::logMessage(sprintf('No VEVENT found in iCalendar data, passing through to %s', $id),
-                              __FILE__, __LINE__, PEAR_LOG_INFO);
-            return true;
-        }
-
-        // What is the request's method? i.e. should we create a new event/cancel an
-        // existing event, etc.
-        $method = strtoupper($iCalendar->getAttributeDefault('METHOD',
-                                                             $itip->getAttributeDefault('METHOD', 'REQUEST')));
-
-        // What resource are we managing?
-        Horde::logMessage(sprintf('Processing %s method for %s', $method, $id),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        // This is assumed to be constant across event creation/modification/deletipn
-        $uid = $itip->getAttributeDefault('UID', '');
-        Horde::logMessage(sprintf('Event has UID %s', $uid),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        // Who is the organiser?
-        $organiser = preg_replace('/^mailto:\s*/i', '', $itip->getAttributeDefault('ORGANIZER', ''));
-        Horde::logMessage(sprintf('Request made by %s', $organiser),
-                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        // What is the events summary?
-        $summary = $itip->getAttributeDefault('SUMMARY', '');
-
-        $dtstart = $this->convert2epoch($itip->getAttributeDefault('DTSTART', 0));
-        $dtend = $this->convert2epoch($itip->getAttributeDefault('DTEND', 0));
-
-        Horde::logMessage(sprintf('Event starts on <%s> %s and ends on <%s> %s.',
-                                  $dtstart, $this->iCalDate2Kolab($dtstart), $dtend, $this->iCalDate2Kolab($dtend)),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        if ($action == RM_ACT_ALWAYS_REJECT) {
-            if ($method == 'REQUEST') {
-                Horde::logMessage(sprintf('Rejecting %s method', $method),
-                                  __FILE__, __LINE__, PEAR_LOG_INFO);
-                $this->sendITipReply($cn, $resource, $itip, RM_ITIP_DECLINE,
-                                     $organiser, $uid, $is_update);
-                return false;
-            } else {
-                Horde::logMessage(sprintf('Passing through %s method for ACT_ALWAYS_REJECT policy', $method),
-                                  __FILE__, __LINE__, PEAR_LOG_INFO);
-                return true;
-            }
-        }
-
-        $is_update = false;
-        $ignore = array();
-
-        $folder = $this->_imapConnect($id);
-        if (is_a($folder, 'PEAR_Error')) {
-            return $folder;
-        }
-        if (!$folder->exists()) {
-            return PEAR::raiseError('Error, could not open calendar folder!',
-                                    OUT_LOG | EX_TEMPFAIL);
-        }
-
-        $data = $folder->getData();
-        if (is_a($data, 'PEAR_Error')) {
-            $result->code = OUT_LOG | EX_UNAVAILABLE;
-            return $data;
-        }
-
-        switch ($method) {
-        case 'REQUEST':
-            if ($action == RM_ACT_MANUAL) {
-                Horde::logMessage(sprintf('Passing through %s method', $method),
-                                  __FILE__, __LINE__, PEAR_LOG_INFO);
-                break;
-            }
-
-            if ($data->objectUidExists($uid)) {
-                $old_uid = $uid;
-                $ignore[] = $uid;
-                $is_update = true;
-            } else {
-                $old_uid = null;
-            }
-
-            /** Generate the Kolab object */
-            $object = $this->_objectFromItip($itip);
-
-            $outofperiod=0;
-
-            // Don't even bother checking free/busy info if RM_ACT_ALWAYS_ACCEPT
-            // is specified
-            if ($action != RM_ACT_ALWAYS_ACCEPT) {
-
-                /**
-                 * FIXME: This is a temporary injection point for providing a mock
-                 * free/busy setup. It would be better to implement a suite of
-                 * different free/busy drivers.
-                 */
-                if (isset($GLOBALS['KOLAB_FILTER_TESTING'])) {
-                    $vfb = $GLOBALS['KOLAB_FILTER_TESTING'];
-                } else {
-                    $vfb = &$this->internalGetFreeBusy($resource);
-                    if (is_a($vfb, 'PEAR_Error')) {
-                        return $vfb;
-                    }
-                }
-
-                $vfbstart = $vfb->getAttributeDefault('DTSTART', 0);
-                $vfbend = $vfb->getAttributeDefault('DTEND', 0);
-                Horde::logMessage(sprintf('Free/busy info starts on <%s> %s and ends on <%s> %s',
-                                          $vfbstart, $this->iCalDate2Kolab($vfbstart), $vfbend, $this->iCalDate2Kolab($vfbend)),
-                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-                if ($vfbstart && $dtstart > $this->convert2epoch ($vfbend)) {
-                    $outofperiod=1;
-                } else {
-                    // Check whether we are busy or not
-                    $busyperiods = $vfb->getBusyPeriods();
-                    Horde::logMessage(sprintf('Busyperiods: %s',
-                                              print_r($busyperiods, true)),
-                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                    $extraparams = $vfb->getExtraParams();
-                    Horde::logMessage(sprintf('Extraparams: %s',
-                                              print_r($extraparams, true)),
-                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                    $conflict = false;
-                    if (!empty($object['recurrence'])) {
-                        $recurrence = &new Horde_Date_Recurrence(time());
-                        $recurrence->fromHash($object['recurrence']);
-                        $duration = $dtend - $dtstart;
-                        $events = array();
-                        $next_start = $vfbstart;
-                        while ($next = $recurrence->nextActiveRecurrence($next_start)) {
-                            $next_start = $next->timestamp();
-                            if ($next_start < $vfbend) {
-                                $events[$next_start] = $next_start + $duration;
-                            } else {
-                                break;
-                            }
-                        }
-                    } else {
-                        $events = array($dtstart => $dtend);
-                    }
-                    
-                    foreach ($events as $dtstart => $dtend) {
-                        foreach ($busyperiods as $busyfrom => $busyto) {
-                            if (empty($busyfrom) && empty($busyto)) {
-                                continue;
-                            }
-                            Horde::logMessage(sprintf('Busy period from %s to %s',
-                                                      strftime('%a, %d %b %Y %H:%M:%S %z', $busyfrom),
-                                                      strftime('%a, %d %b %Y %H:%M:%S %z', $busyto)
-                                              ),
-                                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                            if ((isset($extraparams[$busyfrom]['X-UID'])
-                                 && in_array(base64_decode($extraparams[$busyfrom]['X-UID']), $ignore))
-                                || (isset($extraparams[$busyfrom]['X-SID'])
-                                    && in_array(base64_decode($extraparams[$busyfrom]['X-SID']), $ignore))) {
-                                // Ignore
-                                continue;
-                            }
-                            if (($busyfrom >= $dtstart && $busyfrom < $dtend) || ($dtstart >= $busyfrom && $dtstart < $busyto)) {
-                                Horde::logMessage('Request overlaps',
-                                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                                $conflict = true;
-                                break;
-                            }
-                        }
-                        if ($conflict) {
-                            break;
-                        }
-                    }
-                }
-
-                if ($conflict) {
-                    if ($action == RM_ACT_MANUAL_IF_CONFLICTS) {
-                        //sendITipReply(RM_ITIP_TENTATIVE);
-                        Horde::logMessage('Conflict detected; Passing mail through',
-                                          __FILE__, __LINE__, PEAR_LOG_INFO);
-                        return true;
-                    } else if ($action == RM_ACT_REJECT_IF_CONFLICTS) {
-                        Horde::logMessage('Conflict detected; rejecting',
-                                          __FILE__, __LINE__, PEAR_LOG_INFO);
-                        $this->sendITipReply($cn, $id, $itip, RM_ITIP_DECLINE,
-                                             $organiser, $uid, $is_update);
-                        return false;
-                    }
-                }
-            }
-
-            // At this point there was either no conflict or RM_ACT_ALWAYS_ACCEPT
-            // was specified; either way we add the new event & send an 'ACCEPT'
-            // iTip reply
-
-            Horde::logMessage(sprintf('Adding event %s', $uid),
-                              __FILE__, __LINE__, PEAR_LOG_INFO);
-
-            $result = $data->save($object, $old_uid);
-            if (is_a($result, 'PEAR_Error')) {
-                $result->code = OUT_LOG | EX_UNAVAILABLE;
-                return $result;
-            }
-
-            // Update our status within the iTip request and send the reply
-            $itip->setAttribute('STATUS', 'CONFIRMED', array(), false);
-            $attendees = $itip->getAttribute('ATTENDEE');
-            if (!is_array($attendees)) {
-                $attendees = array($attendees);
-            }
-            $attparams = $itip->getAttribute('ATTENDEE', true);
-            foreach ($attendees as $i => $attendee) {
-                $attendee = preg_replace('/^mailto:\s*/i', '', $attendee);
-                if ($attendee != $resource) {
-                    continue;
-                }
-
-                $attparams[$i]['PARTSTAT'] = 'ACCEPTED';
-                if (array_key_exists('RSVP', $attparams[$i])) {
-                    unset($attparams[$i]['RSVP']);
-                }
-            }
-
-            // Re-add all the attendees to the event, using our updates status info
-            $firstatt = array_pop($attendees);
-            $firstattparams = array_pop($attparams);
-            $itip->setAttribute('ATTENDEE', $firstatt, $firstattparams, false);
-            foreach ($attendees as $i => $attendee) {
-                $itip->setAttribute('ATTENDEE', $attendee, $attparams[$i]);
-            }
-
-            if ($outofperiod) {
-                $this->sendITipReply($cn, $resource, $itip, RM_ITIP_TENTATIVE,
-                                     $organiser, $uid, $is_update);
-                Horde::logMessage('No freebusy information available',
-                                  __FILE__, __LINE__, PEAR_LOG_NOTICE);
-            } else {
-                $this->sendITipReply($cn, $resource, $itip, RM_ITIP_ACCEPT,
-                                     $organiser, $uid, $is_update);
-            }
-            return false;
-
-        case 'CANCEL':
-            Horde::logMessage(sprintf('Removing event %s', $uid),
-                              __FILE__, __LINE__, PEAR_LOG_INFO);
-
-            /* Ensure that $summary is single byte here, else we get
-             * problems with sprintf()
-             */
-            $summary = String::convertCharset($summary, 'utf-8', 'iso-8859-1');
-
-            if (!$data->objectUidExists($uid)) {
-                Horde::logMessage(sprintf('Canceled event %s is not present in %s\'s calendar',
-                                          $uid, $resource),
-                                  __FILE__, __LINE__, PEAR_LOG_WARNING);
-                $body = sprintf(_("The following event that was canceled is not present in %s's calendar:"), $resource) . "\n\n" . $summary;
-                $subject = sprintf(_("Error processing \"%s\""), $summary);
-            } else {
-                /**
-                 * Delete the messages from IMAP
-                 * Delete any old events that we updated
-                 */
-                Horde::logMessage(sprintf('Deleting %s because of cancel',
-                                          $uid),
-                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-                $result = $data->delete($uid);
-                if (is_a($result, 'PEAR_Error')) {
-                    Horde::logMessage(sprintf('Deleting %s failed with %s',
-                                              $uid, $result->getMessage()),
-                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
-                }
-
-                $body = _("The following event has been successfully removed:") . "\n\n" . $summary;
-                $subject = sprintf(_("%s has been cancelled"), $summary);
-            }
-
-            /* Switch back to utf-8 */
-            $body = String::convertCharset($body, 'iso-8859-1');
-            $subject = String::convertCharset($subject, 'iso-8859-1');
-
-            Horde::logMessage(sprintf('Sending confirmation of cancelation to %s', $organiser),
-                              __FILE__, __LINE__, PEAR_LOG_WARNING);
-
-            $body = &new MIME_Part('text/plain', String::wrap($body, 76, "\n", 'utf-8'), 'utf-8');
-            $mime = &MIME_Message::convertMimePart($body);
-            $mime->setTransferEncoding('quoted-printable');
-            $mime->transferEncodeContents();
-
-            // Build the reply headers.
-            $msg_headers = &new MIME_Headers();
-            $msg_headers->addReceivedHeader();
-            $msg_headers->addMessageIdHeader();
-            $msg_headers->addHeader('Date', date('r'));
-            $msg_headers->addHeader('From', $resource);
-            $msg_headers->addHeader('To', $organiser);
-            $msg_headers->addHeader('Subject', $subject);
-            $msg_headers->addMIMEHeaders($mime);
-
-            // Send the reply.
-            static $mailer;
-
-            if (!isset($mailer)) {
-                require_once 'Mail.php';
-                $mailer = &Mail::factory('SMTP', array('auth' => false));
-            }
-
-            $msg = $mime->toString();
-            if (is_object($msg_headers)) {
-                $headerArray = $mime->encode($msg_headers->toArray(), 'UTF-8');
-            } else {
-                $headerArray = $mime->encode($msg_headers, 'UTF-8');
-            }
-
-            /* Make sure the message has a trailing newline. */
-            if (substr($msg, -1) != "\n") {
-                $msg .= "\n";
-            }
-
-            $status = $mailer->send(MIME::encodeAddress($organiser), $headerArray, $msg);
-
-            //$status = $mime->send($organiser, $msg_headers);
-            if (is_a($status, 'PEAR_Error')) {
-                return PEAR::raiseError('Unable to send cancellation reply: ' . $status->getMessage(),
-                                        OUT_LOG | EX_TEMPFAIL);
-            } else {
-                Horde::logMessage('Successfully sent cancellation reply',
-                                  __FILE__, __LINE__, PEAR_LOG_INFO);
-            }
-
-            return false;;
-
-        default:
-            // We either don't currently handle these iTip methods, or they do not
-            // apply to what we're trying to accomplish here
-            Horde::logMessage(sprintf('Ignoring %s method and passing message through to %s',
-                                      $method, $resource),
-                              __FILE__, __LINE__, PEAR_LOG_INFO);
-            return true;
-        }
-
-        // Pass the message through to the group's mailbox
-        Horde::logMessage(sprintf('Passing through %s method to %s',
-                                  $method, $resource),
-                          __FILE__, __LINE__, PEAR_LOG_INFO);
-        return true;
-    }
-
-    /**
-     * Helper function to assemble a free/busy uri.
-     *
-     * @param array $parsed  The set of parameters that may influence the URI.
-     *
-     * @return mixed The assembled URI or false.
-     */
-    function assembleUri($parsed)
-    {
-        if (!is_array($parsed)) {
-            return false;
-        }
-
-        $uri = empty($parsed['scheme']) ? '' :
-            $parsed['scheme'] . ':' . ((strtolower($parsed['scheme']) == 'mailto') ? '' : '//');
-
-        $uri .= empty($parsed['user']) ? '' :
-            ($parsed['user']) . (empty($parsed['pass']) ? '' :
-                                 ':'.($parsed['pass'])) . '@';
-
-        $uri .= empty($parsed['host']) ? '' : $parsed['host'];
-        $uri .= empty($parsed['port']) ? '' : ':' . $parsed['port'];
-        $uri .= empty($parsed['path']) ? '' : $parsed['path'];
-        $uri .= empty($parsed['query']) ? '' : '?' . $parsed['query'];
-        $uri .= empty($parsed['anchor']) ? '' : '#' . $parsed['anchor'];
-
-        return $uri;
-    }
-
-    /**
-     * Retrieve Free/Busy information for the specified resource via
-     * the given URL.
-     *
-     * @param string $resource  The name of the resource.
-     *
-     * @return Horde_iCalendar_vfreebusy|PEAR_Error The free/busy information.
-     */
-    function &internalGetFreeBusy($email)
-    {
-        global $conf;
-
-        $server = Horde_Kolab_Server::singleton();
-        $uid = $server->uidForMailAddress($email);
-        if (is_a($uid, 'PEAR_Error')) {
-            $uid->code = OUT_LOG | EX_UNAVAILABLE;
-            return $uid;
-        }
-
-        $user_object = $server->fetch($uid);
-        if (is_a($user_object, 'PEAR_Error')) {
-            $user_object->code = OUT_LOG | EX_UNAVAILABLE;
-            return $user_object;
-        }
-
-        $server = $user_object->getServer('freebusy');
-        if (is_a($server, 'PEAR_Error')) {
-            $server->code = OUT_LOG | EX_UNAVAILABLE;
-            return $server;
-        }
-
-        $fb_url = sprintf('%s/%s.xfb', $server, $email);
-
-        Horde::logMessage(sprintf('URL = %s', $fb_url), __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        $parsed = parse_url($fb_url);
-
-        list($user, $domain) = split('@', $email);
-        if (empty($domain)) {
-            $domain = $conf['kolab']['filter']['email_domain'];
-        }
-
-        $options['method'] = 'GET';
-        $options['timeout'] = 5;
-        $options['allowRedirects'] = true;
-
-        if (!empty($GLOBALS['conf']['http']['proxy']['proxy_host'])) {
-            $options = array_merge($options, $GLOBALS['conf']['http']['proxy']);
-        }
-
-        require_once 'HTTP/Request.php';
-        $http = new HTTP_Request($fb_url, $options);
-        $http->setBasicAuth($conf['kolab']['filter']['calendar_id'] . '@' . $domain,
-                            $conf['kolab']['filter']['calendar_pass']);
-        @$http->sendRequest();
-        if ($http->getResponseCode() != 200) {
-            return PEAR::raiseError(sprintf('Unable to retrieve free/busy information for %s',
-                                            $email), 
-                                    OUT_LOG | EX_UNAVAILABLE);
-        }
-        $vfb_text = $http->getResponseBody();
-
-        $iCal = new Horde_iCalendar;
-        $iCal->parsevCalendar($vfb_text);
-
-        $vfb = &$iCal->findComponent('VFREEBUSY');
-
-        if ($vfb === false) {
-            return PEAR::raiseError(sprintf('Invalid or no free/busy information available for %s',
-                                            $resource),
-                                    OUT_LOG | EX_UNAVAILABLE);
-        }
-        $vfb->simplify();
-
-        return $vfb;
-    }
-
-    /**
-     * Send an automated reply.
-     *
-     * @param string  $cn                     Common name to be used in the iTip
-     *                                        response.
-     * @param string  $resource               Resource we send the reply for.
-     * @param string  $Horde_iCalendar_vevent The iTip information.
-     * @param int     $type                   Type of response.
-     * @param string  $organiser              The event organiser.
-     * @param string  $uid                    The UID of the event.
-     * @param boolean $is_update              Is this an event update?
-     */
-    function sendITipReply($cn, $resource, $itip, $type = RM_ITIP_ACCEPT,
-                           $organiser, $uid, $is_update)
-    {
-        Horde::logMessage(sprintf('sendITipReply(%s, %s, %s, %s)',
-                                  $cn, $resource, get_class($itip), $type),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        // Build the reply.
-        $vCal = &new Horde_iCalendar();
-        $vCal->setAttribute('PRODID', '-//kolab.org//NONSGML Kolab Server 2//EN');
-        $vCal->setAttribute('METHOD', 'REPLY');
-
-        $summary = _('No summary available');
-
-        $itip_reply =& Horde_iCalendar::newComponent('VEVENT', $vCal);
-        $itip_reply->setAttribute('UID', $uid);
-        if (!is_a($itip->getAttribute('SUMMARY'), 'PEAR_error')) {
-            $itip_reply->setAttribute('SUMMARY', $itip->getAttribute('SUMMARY'));
-            $summary = $itip->getAttribute('SUMMARY');
-        }
-        if (!is_a($itip->getAttribute('DESCRIPTION'), 'PEAR_error')) {
-            $itip_reply->setAttribute('DESCRIPTION', $itip->getAttribute('DESCRIPTION'));
-        }
-        if (!is_a($itip->getAttribute('LOCATION'), 'PEAR_error')) {
-            $itip_reply->setAttribute('LOCATION', $itip->getAttribute('LOCATION'));
-        }
-        $itip_reply->setAttribute('DTSTART', $itip->getAttribute('DTSTART'), array_pop($itip->getAttribute('DTSTART', true)));
-        if (!is_a($itip->getAttribute('DTEND'), 'PEAR_error')) {
-            $itip_reply->setAttribute('DTEND', $itip->getAttribute('DTEND'), array_pop($itip->getAttribute('DTEND', true)));
-        } else {
-            $itip_reply->setAttribute('DURATION', $itip->getAttribute('DURATION'), array_pop($itip->getAttribute('DURATION', true)));
-        }
-        if (!is_a($itip->getAttribute('SEQUENCE'), 'PEAR_error')) {
-            $itip_reply->setAttribute('SEQUENCE', $itip->getAttribute('SEQUENCE'));
-        } else {
-            $itip_reply->setAttribute('SEQUENCE', 0);
-        }
-        $itip_reply->setAttribute('ORGANIZER', $itip->getAttribute('ORGANIZER'), array_pop($itip->getAttribute('ORGANIZER', true)));
-
-        // Let's try and remove this code and just create
-        // the ATTENDEE stuff in the reply from scratch
-        //     $attendees = $itip->getAttribute( 'ATTENDEE' );
-        //     if( !is_array( $attendees ) ) {
-        //       $attendees = array( $attendees );
-        //     }
-        //     $params = $itip->getAttribute( 'ATTENDEE', true );
-        //     for( $i = 0; $i < count($attendees); $i++ ) {
-        //       $attendee = preg_replace('/^mailto:\s*/i', '', $attendees[$i]);
-        //       if ($attendee != $resource) {
-        // 	continue;
-        //       }
-        //       $params = $params[$i];
-        //       break;
-        //     }
-
-        $params = array();
-        $params['CN'] = $cn;
-        switch ($type) {
-        case RM_ITIP_DECLINE:
-            Horde::logMessage(sprintf('Sending DECLINE iTip reply to %s',
-                                      $organiser),
-                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-            $message = $is_update
-                ? sprintf(_("%s has declined the update to the following event:"), $resource) . "\n\n" . $summary
-                : sprintf(_("%s has declined the invitation to the following event:"), $resource) . "\n\n" . $summary;
-            $subject = _("Declined: ") . $summary;
-            $params['PARTSTAT'] = 'DECLINED';
-            break;
-
-        case RM_ITIP_ACCEPT:
-            Horde::logMessage(sprintf('Sending ACCEPT iTip reply to %s', $organiser),
-                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-            $message = $is_update
-                ? sprintf(_("%s has accepted the update to the following event:"), $resource) . "\n\n" . $summary
-                : sprintf(_("%s has accepted the invitation to the following event:"), $resource) . "\n\n" . $summary;
-            $subject = _("Accepted: ") . $summary;
-            $params['PARTSTAT'] = 'ACCEPTED';
-            break;
-
-        case RM_ITIP_TENTATIVE:
-            Horde::logMessage(sprintf('Sending TENTATIVE iTip reply to %s', $organiser),
-                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-            $message = $is_update
-                ? sprintf(_("%s has tentatively accepted the update to the following event:"), $resource) . "\n\n" . $summary
-                : sprintf(_("%s has tentatively accepted the invitation to the following event:"), $resource) . "\n\n" . $summary;
-            $subject = _("Tentative: ") . $summary;
-            $params['PARTSTAT'] = 'TENTATIVE';
-            break;
-
-        default:
-            Horde::logMessage(sprintf('Unknown iTip method (%s passed to sendITipReply())', $type),
-                              __FILE__, __LINE__, PEAR_LOG_ERR);
-        }
-
-        $itip_reply->setAttribute('ATTENDEE', 'MAILTO:' . $resource, $params);
-        $vCal->addComponent($itip_reply);
-
-        $ics = &new MIME_Part('text/calendar', $vCal->exportvCalendar(), 'UTF-8' );
-        //$ics->setName('event-reply.ics');
-        $ics->setContentTypeParameter('method', 'REPLY');
-
-        //$mime->addPart($body);
-        //$mime->addPart($ics);
-        // The following was ::convertMimePart($mime). This was removed so that we
-        // send out single-part MIME replies that have the iTip file as the body,
-        // with the correct mime-type header set, etc. The reason we want to do this
-        // is so that Outlook interprets the messages as it does Outlook-generated
-        // responses, i.e. double-clicking a reply will automatically update your
-        // meetings, showing different status icons in the UI, etc.
-        $mime = &MIME_Message::convertMimePart($ics);
-        $mime->setCharset('UTF-8');
-        $mime->setTransferEncoding('quoted-printable');
-        $mime->transferEncodeContents();
-
-        // Build the reply headers.
-        $msg_headers = &new MIME_Headers();
-        $msg_headers->addReceivedHeader();
-        $msg_headers->addMessageIdHeader();
-        $msg_headers->addHeader('Date', date('r'));
-        $msg_headers->addHeader('From', "$cn <$resource>");
-        $msg_headers->addHeader('To', $organiser);
-        $msg_headers->addHeader('Subject', $subject);
-        $msg_headers->addMIMEHeaders($mime);
-
-        // Send the reply.
-        static $mailer;
-
-        if (!isset($mailer)) {
-            require_once 'Mail.php';
-            $mailer = &Mail::factory('SMTP', array('auth' => false));
-        }
-
-        $msg = $mime->toString();
-        if (is_object($msg_headers)) {
-            $headerArray = $mime->encode($msg_headers->toArray(), $mime->getCharset());
-        } else {
-            $headerArray = $mime->encode($msg_headers, $mime->getCharset());
-        }
-
-        /* Make sure the message has a trailing newline. */
-        if (substr($msg, -1) != "\n") {
-            $msg .= "\n";
-        }
-
-        $status = $mailer->send(MIME::encodeAddress($organiser), $headerArray, $msg);
-
-        //$status = $mime->send($organiser, $msg_headers);
-        if (is_a($status, 'PEAR_Error')) {
-            Horde::logMessage('Unable to send iTip reply: %s' . $status->getMessage(),
-                              __FILE__, __LINE__, PEAR_LOG_ERR);
-        } else {
-            Horde::logMessage('Successfully sent iTip reply',
-                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
-        }
-    }
-
-
-    /**
-     * Clear information from a date array.
-     *
-     * @param array $ical_date  The array to clear.
-     *
-     * @return array The cleaned array.
-     */
-    function cleanArray($ical_date)
-    {
-        if (array_key_exists('hour', $ical_date)) {
-            $temp['hour']   = array_key_exists('hour', $ical_date) ? $ical_date['hour'] :  '00';
-            $temp['minute']   = array_key_exists('minute', $ical_date) ? $ical_date['minute'] :  '00';
-            $temp['second']   = array_key_exists('second', $ical_date) ? $ical_date['second'] :  '00';
-            $temp['zone']   = array_key_exists('zone', $ical_date) ? $ical_date['zone'] :  'UTC';
-        } else {
-            $temp['DATE'] = '1';
-        }
-        $temp['year']   = array_key_exists('year', $ical_date) ? $ical_date['year'] :  '0000';
-        $temp['month']   = array_key_exists('month', $ical_date) ? $ical_date['month'] :  '00';
-        $temp['mday']   = array_key_exists('mday', $ical_date) ? $ical_date['mday'] :  '00';
-
-        return $temp;
-    }
-
-    /**
-     * Conveert iCal dates to Kolab format.
-     *
-     * An all day event must have a dd--mm-yyyy notation and not a
-     * yyyy-dd-mmT00:00:00z notation Otherwise the event is shown as a
-     * 2-day event --> do not try to convert everything to epoch first
-     *
-     * @param array  $ical_date  The array to convert.
-     * @param string $type       The type of the date to convert.
-     *
-     * @return string The converted date.
-     */
-    function iCalDate2Kolab($ical_date, $type= ' ')
-    {
-        Horde::logMessage(sprintf('Converting to kolab format %s',
-                                  print_r($ical_date, true)),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        // $ical_date should be a timestamp
-        if (is_array($ical_date)) {
-            // going to create date again
-            $temp = $this->cleanArray($ical_date);
-            if (array_key_exists('DATE', $temp)) {
-                if ($type == 'ENDDATE') {
-                    // substract a day (86400 seconds) using epochs to take number of days per month into account
-                    $epoch= $this->convert2epoch($temp) - 86400;
-                    $date = gmstrftime('%Y-%m-%d', $epoch);
-                } else {
-                    $date= sprintf('%04d-%02d-%02d', $temp['year'], $temp['month'], $temp['mday']);
-                }
-            } else {
-                $time = sprintf('%02d:%02d:%02d', $temp['hour'], $temp['minute'], $temp['second']);
-                if ($temp['zone'] == 'UTC') {
-                    $time .= 'Z';
-                }
-                $date = sprintf('%04d-%02d-%02d', $temp['year'], $temp['month'], $temp['mday']) . 'T' . $time;
-            }
-        }  else {
-            $date = gmstrftime('%Y-%m-%dT%H:%M:%SZ', $ical_date);
-        }
-        Horde::logMessage(sprintf('To <%s>', $date),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-        return $date;
-    }
-
-    /**
-     * Convert a date to an epoch.
-     *
-     * @param array  $values  The array to convert.
-     *
-     * @return int Time.
-     */
-    function convert2epoch($values)
-    {
-        Horde::logMessage(sprintf('Converting to epoch %s',
-                                  print_r($values, true)),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-
-        if (is_array($values)) {
-            $temp = $this->cleanArray($values);
-            $epoch = gmmktime($temp['hour'], $temp['minute'], $temp['second'],
-                              $temp['month'], $temp['mday'], $temp['year']);
-        } else {
-            $epoch=$values;
-        }
-
-        Horde::logMessage(sprintf('Converted <%s>', $epoch),
-                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
-        return $epoch;
-    }
-}
diff --git a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Test/Filter.php b/Kolab_Filter-0.1.4/lib/Horde/Kolab/Test/Filter.php
deleted file mode 100644
index f80d3ad..0000000
--- a/Kolab_Filter-0.1.4/lib/Horde/Kolab/Test/Filter.php
+++ /dev/null
@@ -1,278 +0,0 @@
-<?php
-/**
- * Base for PHPUnit scenarios.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Test/Filter.php,v 1.1.2.1 2009/02/24 11:17:40 wrobel Exp $
- *
- * PHP version 5
- *
- * @category Kolab
- * @package  Kolab_Test
- * @author   Gunnar Wrobel <wrobel at pardus.de>
- * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
- * @link     http://pear.horde.org/index.php?package=Kolab_Storage
- */
-
-/**
- *  We need the unit test framework
- */
-require_once 'Horde/Kolab/Test/Storage.php';
-
-/**
- * Base for PHPUnit scenarios.
- *
- * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Test/Filter.php,v 1.1.2.1 2009/02/24 11:17:40 wrobel Exp $
- *
- * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @category Kolab
- * @package  Kolab_Test
- * @author   Gunnar Wrobel <wrobel at pardus.de>
- * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
- * @link     http://pear.horde.org/index.php?package=Kolab_Storage
- */
-class Horde_Kolab_Test_Filter extends Horde_Kolab_Test_Storage
-{
-    /**
-     * Set up testing.
-     */
-    protected function setUp()
-    {
-        $result = $this->prepareBasicSetup();
-
-        $this->server  = &$result['server'];
-        $this->storage = &$result['storage'];
-        $this->auth    = &$result['auth'];
-
-        global $conf;
-
-        $conf['kolab']['imap']['server'] = 'localhost';
-        $conf['kolab']['imap']['port']   = 0;
-        $conf['kolab']['imap']['allow_special_users'] = true;
-        $conf['kolab']['filter']['reject_forged_from_header'] = false;
-        $conf['kolab']['filter']['email_domain'] = 'example.org';
-        $conf['kolab']['filter']['privileged_networks'] = '127.0.0.1,192.168.0.0/16';
-        $conf['kolab']['filter']['verify_from_header'] = true;
-        $conf['kolab']['filter']['calendar_id'] = 'calendar';
-        $conf['kolab']['filter']['calendar_pass'] = 'calendar';
-        $conf['kolab']['filter']['lmtp_host'] = 'imap.example.org';
-	$conf['kolab']['filter']['testing'] = true;
-
-        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
-        $this->assertNoError($result);
-
-        $folder = $this->storage->getNewFolder();
-        $folder->setName('Kalender');
-        $result = $folder->save(array('type' => 'event',
-                                      'default' => true));
-        $this->assertNoError($result);
-    }
-
-    /**
-     * Handle a "given" step.
-     *
-     * @param array  &$world    Joined "world" of variables.
-     * @param string $action    The description of the step.
-     * @param array  $arguments Additional arguments to the step.
-     *
-     * @return mixed The outcome of the step.
-     */
-    public function runGiven(&$world, $action, $arguments)
-    {
-        switch($action) {
-        default:
-            return parent::runGiven($world, $action, $arguments);
-        }
-    }
-
-    /**
-     * Handle a "when" step.
-     *
-     * @param array  &$world    Joined "world" of variables.
-     * @param string $action    The description of the step.
-     * @param array  $arguments Additional arguments to the step.
-     *
-     * @return mixed The outcome of the step.
-     */
-    public function runWhen(&$world, $action, $arguments)
-    {
-        switch($action) {
-        default:
-            return parent::runWhen($world, $action, $arguments);
-        }
-    }
-
-    /**
-     * Handle a "then" step.
-     *
-     * @param array  &$world    Joined "world" of variables.
-     * @param string $action    The description of the step.
-     * @param array  $arguments Additional arguments to the step.
-     *
-     * @return mixed The outcome of the step.
-     */
-    public function runThen(&$world, $action, $arguments)
-    {
-        switch($action) {
-        default:
-            return parent::runThen($world, $action, $arguments);
-        }
-    }
-
-    /**
-     * Fill a Kolab Server with test users.
-     *
-     * @param Kolab_Server &$server The server to populate.
-     *
-     * @return Horde_Kolab_Server The empty server.
-     */
-    public function prepareUsers(&$server)
-    {
-        parent::prepareUsers(&$server);
-        $result = $server->add($this->provideFilterUserOne());
-        $this->assertNoError($result);
-        $result = $server->add($this->provideFilterUserTwo());
-        $this->assertNoError($result);
-        $result = $server->add($this->provideFilterUserThree());
-        $this->assertNoError($result);
-        $result = $server->add($this->provideFilterCalendarUser());
-        $this->assertNoError($result);
-    }
-
-    /**
-     * Return a test user.
-     *
-     * @return array The test user.
-     */
-    public function provideFilterUserOne()
-    {
-        return array('givenName' => 'Me',
-                     'sn' => 'Me',
-                     'type' => KOLAB_OBJECT_USER,
-                     'mail' => 'me at example.org',
-                     'uid' => 'me',
-                     'userPassword' => 'me',
-                     'kolabHomeServer' => 'home.example.org',
-                     'kolabImapServer' => 'imap.example.org',
-                     'kolabFreeBusyServer' => 'https://fb.example.org/freebusy',
-                     KOLAB_ATTR_IPOLICY => array('ACT_REJECT_IF_CONFLICTS'),
-                     'alias' => array('me.me at example.org', 'MEME at example.org'),
-                );
-    }
-
-    /**
-     * Return a test user.
-     *
-     * @return array The test user.
-     */
-    public function provideFilterUserTwo()
-    {
-        return array('givenName' => 'You',
-                     'sn' => 'You',
-                     'type' => KOLAB_OBJECT_USER,
-                     'mail' => 'you at example.org',
-                     'uid' => 'you',
-                     'userPassword' => 'you',
-                     'kolabHomeServer' => 'home.example.org',
-                     'kolabImapServer' => 'home.example.org',
-                     'kolabFreeBusyServer' => 'https://fb.example.org/freebusy',
-                     'alias' => array('you.you at example.org'),
-                     KOLAB_ATTR_KOLABDELEGATE => 'wrobel at example.org',);
-    }
-
-    /**
-     * Return a test user.
-     *
-     * @return array The test user.
-     */
-    public function provideFilterUserThree()
-    {
-        return array('givenName' => 'Else',
-                     'sn' => 'Else',
-                     'type' => KOLAB_OBJECT_USER,
-                     'mail' => 'else at example.org',
-                     'uid' => 'else',
-                     'userPassword' => 'else',
-                     'kolabHomeServer' => 'home.example.org',
-                     'kolabImapServer' => 'home.example.org',
-                     'kolabFreeBusyServer' => 'https://fb.example.org/freebusy',
-                     KOLAB_ATTR_KOLABDELEGATE => 'me at example.org',);
-    }
-
-    /**
-     * Return the calendar user.
-     *
-     * @return array The calendar user.
-     */
-    public function provideFilterCalendarUser()
-    {
-        return array('cn' => 'calendar',
-                     'sn' => 'calendar',
-                     'givenName' => '',
-                     'type' => KOLAB_OBJECT_USER,
-                     'mail' => 'calendar at example.org',
-                     'uid' => 'calendar at home.example.org',
-                     'userPassword' => 'calendar',
-                     'kolabHomeServer' => 'home.example.org',
-                     'kolabImapServer' => 'imap.example.org',
-                );
-    }
-
-    public function sendFixture($infile, $outfile, $user, $client, $from, $to,
-                                $host, $params = array())
-    {
-        $_SERVER['argv'] = array($_SERVER['argv'][0],
-                                 '--sender=' . $from,
-                                 '--recipient=' . $to,
-                                 '--user=' . $user,
-                                 '--host=' . $host,
-                                 '--client=' . $client);
-
-        $in = file_get_contents($infile, 'r');
-
-        $tmpfile = Util::getTempFile('KolabFilterTest');
-        $tmpfh = @fopen($tmpfile, 'w');
-        if (empty($params['unmodified_content'])) {
-            @fwrite($tmpfh, sprintf($in, $from, $to));
-        } else {
-            @fwrite($tmpfh, $in);
-        }
-        @fclose($tmpfh);
-
-        $inh = @fopen($tmpfile, 'r');
-
-        /* Setup the class */
-        if (empty($params['incoming'])) {
-            require_once 'Horde/Kolab/Filter/Content.php';
-            $parser = &new Horde_Kolab_Filter_Content();
-        } else {
-            require_once 'Horde/Kolab/Filter/Incoming.php';
-            $parser = &new Horde_Kolab_Filter_Incoming();
-        }
-
-        ob_start();
-
-        /* Parse the mail */
-        $result = $parser->parse($inh, 'echo');
-        if (empty($params['error'])) {
-            $this->assertNoError($result);
-            $this->assertTrue(empty($result));
-
-            $output = ob_get_contents();
-            ob_end_clean();
-
-            $out = file_get_contents($outfile);
-            if (empty($params['unmodified_content'])) {
-                $this->assertEquals(sprintf($out, $from, $to), $output);
-            } else {
-                $this->assertEquals($out, $output);
-            }
-        } else {
-            $this->assertError($result, $params['error']);
-        }
-
-    }
-}
diff --git a/Kolab_Filter-0.1.4/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo b/Kolab_Filter-0.1.4/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo
deleted file mode 100644
index a78791b..0000000
Binary files a/Kolab_Filter-0.1.4/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo and /dev/null differ
diff --git a/Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabfilter.php b/Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabfilter.php
deleted file mode 100644
index 86f12d3..0000000
--- a/Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabfilter.php
+++ /dev/null
@@ -1,30 +0,0 @@
-#!@php_bin@
-<?php
-/**
- *  A filter for outgoing mail on a Kolab Server. It rewrites headers
- *  and handles Outlook issues.
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * $Horde: framework/Kolab_Filter/script/Horde/Kolab/Filter/kolabfilter.php,v 1.3.2.1 2009/02/20 22:37:16 wrobel Exp $
- *
- * @package Kolab
- */
-
-/** Kolab filter library */
-require_once 'Horde/Kolab/Filter/Content.php';
-require_once 'Horde/Kolab/Filter/Response.php';
-
-/* Parse the mail */
-$parser = &new Horde_Kolab_Filter_Content();
-$response = &new Horde_Kolab_Filter_Response();
-
-$result = $parser->parse();
-if (is_a($result, 'PEAR_Error')) {
-    $response->handle($result);
-}
-exit(0);
-?>
diff --git a/Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabmailboxfilter.php b/Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabmailboxfilter.php
deleted file mode 100644
index 143213a..0000000
--- a/Kolab_Filter-0.1.4/script/Horde/Kolab/Filter/kolabmailboxfilter.php
+++ /dev/null
@@ -1,30 +0,0 @@
-#!@php_bin@
-<?php
-/**
- *  A filter for incoming mail on a Kolab Server. It checks the
- *  messages for iCal data and handles automatic invitations.
- *
- * Copyright 2004-2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * $Horde: framework/Kolab_Filter/script/Horde/Kolab/Filter/kolabmailboxfilter.php,v 1.3.2.1 2009/02/20 22:37:16 wrobel Exp $
- *
- * @package Kolab
- */
-
-/** Kolab filter library */
-require_once 'Horde/Kolab/Filter/Incoming.php';
-require_once 'Horde/Kolab/Filter/Response.php';
-
-/* Parse the mail */
-$parser = &new Horde_Kolab_Filter_Incoming();
-$response = &new Horde_Kolab_Filter_Response();
-
-$result = $parser->parse();
-if (is_a($result, 'PEAR_Error')) {
-    $response->handle($result);
-}
-exit(0);
-?>
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/AllTests.php b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/AllTests.php
deleted file mode 100644
index 7ecdac0..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/AllTests.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * All tests for the Horde_Kolab_Filter:: package.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/AllTests.php,v 1.2.2.1 2009/02/20 22:37:17 wrobel Exp $
- *
- * @package Horde_Kolab_Filter
- */
-
-/**
- * Define the main method 
- */
-if (!defined('PHPUnit_MAIN_METHOD')) {
-    define('PHPUnit_MAIN_METHOD', 'Horde_Kolab_Filter_AllTests::main');
-}
-
-require_once 'PHPUnit/Framework/TestSuite.php';
-require_once 'PHPUnit/TextUI/TestRunner.php';
-
-/**
- * Combine the tests for this package.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/AllTests.php,v 1.2.2.1 2009/02/20 22:37:17 wrobel Exp $
- *
- * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @package Horde_Kolab_Filter
- */
-class Horde_Kolab_Filter_AllTests {
-
-    public static function main()
-    {
-        PHPUnit_TextUI_TestRunner::run(self::suite());
-    }
-
-    public static function suite()
-    {
-        $suite = new PHPUnit_Framework_TestSuite('Horde Framework - Horde_Kolab_Filter');
-
-        $basedir = dirname(__FILE__);
-        $baseregexp = preg_quote($basedir . DIRECTORY_SEPARATOR, '/');
-
-        foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($basedir)) as $file) {
-            if ($file->isFile() && preg_match('/Test.php$/', $file->getFilename())) {
-                $pathname = $file->getPathname();
-                require $pathname;
-
-                $class = str_replace(DIRECTORY_SEPARATOR, '_',
-                                     preg_replace("/^$baseregexp(.*)\.php/", '\\1', $pathname));
-                $suite->addTestSuite('Horde_Kolab_Filter_' . $class);
-            }
-        }
-
-        return $suite;
-    }
-
-}
-
-if (PHPUnit_MAIN_METHOD == 'Horde_Kolab_Filter_AllTests::main') {
-    Horde_Kolab_Filter_AllTests::main();
-}
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ContentTest.php b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ContentTest.php
deleted file mode 100644
index ed28f7c..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ContentTest.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-/**
- * Test the content filter class within the Kolab filter implementation.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ContentTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * @package Horde_Kolab_Filter
- */
-
-/**
- *  We need the unit test framework 
- */
-require_once 'Horde/Kolab/Test/Filter.php';
-
-require_once 'Horde.php';
-require_once 'Horde/Kolab/Filter/Content.php';
-
-/**
- * Test the content filter.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ContentTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Horde_Kolab_Filter
- */
-class Horde_Kolab_Filter_ContentTest extends Horde_Kolab_Test_Filter
-{
-
-    /**
-     * Test sending messages through the content filter.
-     *
-     * @dataProvider addressCombinations
-     */
-    public function testContentHandler($infile, $outfile, $user, $client, $from,
-                                       $to, $host, $params = array())
-    {
-        $this->sendFixture($infile, $outfile, $user, $client, $from, $to,
-                           $host, $params);
-    }
-
-    /**
-     * Provides various test situations for the Kolab content filter.
-     */
-    public function addressCombinations()
-    {
-        return array(
-            /**
-             * Test a simple message
-             */
-            array(dirname(__FILE__) . '/fixtures/vacation.eml',
-                  dirname(__FILE__) . '/fixtures/vacation.ret',
-                  '', '', 'me at example.org', 'you at example.net', 'example.org',
-                  array('unmodified_content' => true)),
-            /**
-             * Test a simple message
-             */
-            array(dirname(__FILE__) . '/fixtures/tiny.eml',
-                  dirname(__FILE__) . '/fixtures/tiny.ret',
-                  '', '', 'me at example.org', 'you at example.org', 'example.org',
-                  array('unmodified_content' => true)),
-            /**
-             * Test a simple message
-             */
-            array(dirname(__FILE__) . '/fixtures/simple.eml',
-                  dirname(__FILE__) . '/fixtures/simple_out.ret',
-                  '', '', 'me at example.org', 'you at example.org', 'example.org',
-                  array('unmodified_content' => true)),
-            /**
-             * Test sending from a remote server without authenticating. This
-             * will be considered forging the sender.
-             */
-            array(dirname(__FILE__) . '/fixtures/forged.eml',
-                  dirname(__FILE__) . '/fixtures/forged.ret',
-                  '', '10.0.0.1', 'me at example.org', 'you at example.org', 'example.org',
-                  array('unmodified_content' => true)),
-            /**
-             * Test sending from a remote server without authenticating but
-             * within the priviledged network. This will not be considered
-             * forging the sender.
-             */
-            array(dirname(__FILE__) . '/fixtures/forged.eml',
-                  dirname(__FILE__) . '/fixtures/privileged.ret',
-                  '', '192.168.178.1', 'me at example.org', 'you at example.org', 'example.org',
-                  array('unmodified_content' => true)),
-            /**
-             * Test authenticated sending of a message from a remote client.
-             */
-            array(dirname(__FILE__) . '/fixtures/validation.eml',
-                  dirname(__FILE__) . '/fixtures/validation.ret',
-                  'me at example.org', 'remote.example.org', 'me at example.org', 'you at example.org', 'example.org'),
-            /**
-             * Test authenticated sending of a message from a remote client
-             * using an alias.
-             */
-            array(dirname(__FILE__) . '/fixtures/validation.eml',
-                  dirname(__FILE__) . '/fixtures/validation.ret',
-                  'me at example.org', 'remote.example.org', 'me.me at example.org', 'you at example.org', 'example.org'),
-            /**
-             * Test authenticated sending of a message from a remote client
-             * using an alias with capitals (MEME at example.org).
-             */
-            array(dirname(__FILE__) . '/fixtures/validation.eml',
-                  dirname(__FILE__) . '/fixtures/validation.ret',
-                  'me at example.org', 'remote.example.org', 'meme at example.org', 'you at example.org', 'example.org'),
-            /**
-             * Test authenticated sending of a message from a remote client
-             * as delegate
-             */
-            array(dirname(__FILE__) . '/fixtures/validation.eml',
-                  dirname(__FILE__) . '/fixtures/validation.ret',
-                  'me at example.org', 'remote.example.org', 'else at example.org', 'you at example.org', 'example.org'),
-            /**
-             * Test authenticated sending of a message from a remote client
-             * with an address that is not allowed.
-             */
-            array(dirname(__FILE__) . '/fixtures/validation.eml',
-                  dirname(__FILE__) . '/fixtures/validation.ret',
-                  'me at example.org', 'remote.example.org', 'else3 at example.org', 'you at example.org', 'example.org',
-                  array('error' =>'Invalid From: header. else3 at example.org looks like a forged sender')),
-            /**
-             * Test forwarding an invitation
-             */
-            array(dirname(__FILE__) . '/fixtures/invitation_forward.eml',
-                  dirname(__FILE__) . '/fixtures/null.ret',
-                  'me at example.org', '10.0.2.1', 'me at example.org', 'you at example.org', 'example.org'),
-        );
-    }
-
-    /**
-     * Test rejecting a forged from header.
-     */
-    public function testRejectingForgedFromHeader()
-    {
-        global $conf;
-
-        $conf['kolab']['filter']['reject_forged_from_header'] = true;
-
-        $this->sendFixture(dirname(__FILE__) . '/fixtures/forged.eml',
-                           dirname(__FILE__) . '/fixtures/forged.ret',
-                           '', '10.0.0.1', 'me at example.org', 'you at example.org', 'example.org',
-                           array('error' =>'Invalid From: header. me at example.org looks like a forged sender',
-                                 'unmodified_content' => true));
-    }
-
-    /**
-     * Test translated forged from headers.
-     */
-    public function testTranslatedForgedFromHeader()
-    {
-        global $conf;
-
-        $conf['kolab']['filter']['locale_path'] = dirname(__FILE__) . '/../../../../locale';
-        $conf['kolab']['filter']['locale'] = 'de_DE';
-
-        $this->sendFixture(dirname(__FILE__) . '/fixtures/forged.eml',
-                           dirname(__FILE__) . '/fixtures/forged_trans.ret',
-                           '', '10.0.0.1', 'me at example.org', 'you at example.org', 'example.org',
-                           array('unmodified_content' => true));
-    }
-
-}
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/FilterTest.php b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/FilterTest.php
deleted file mode 100644
index 706c71f..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/FilterTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Test the base filter class within the Kolab filter implementation.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/FilterTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * @package Horde_Kolab_Filter
- */
-
-/**
- *  We need the unit test framework 
- */
-require_once 'PHPUnit/Framework.php';
-require_once 'PHPUnit/Extensions/OutputTestCase.php';
-
-require_once 'Horde.php';
-require_once 'Horde/Kolab/Filter/Incoming.php';
-
-/**
- * Test the filter class.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/FilterTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Horde_Kolab_Filter
- */
-class Horde_Kolab_Filter_FilterTest extends PHPUnit_Framework_TestCase
-{
-
-    /**
-     * Set up testing.
-     */
-    protected function setUp()
-    {
-        $GLOBALS['conf']['log']['enabled']          = false;
-
-        $_SERVER['SERVER_NAME'] = 'localhost';
-        $_SERVER['REMOTE_ADDR'] = 'ADDR';
-        $_SERVER['REMOTE_HOST'] = 'HOST';
-    }
-
-
-    /**
-     * Test incorrect usage of the Filter
-     */
-    public function testIncorrectUsage()
-    {
-        $_SERVER['argv'] = array($_SERVER['argv'][0]);
-        $parser   = &new Horde_Kolab_Filter_Incoming();
-        $inh = fopen(dirname(__FILE__) . '/fixtures/tiny.eml', 'r');
-        $result = $parser->parse($inh, 'echo');
-
-        $this->assertTrue(is_a($result, 'PEAR_Error'));
-
-        $this->assertContains('Please provide one or more recipients.', $result->getMessage());
-    }
-}
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/IncomingTest.php b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/IncomingTest.php
deleted file mode 100644
index adde778..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/IncomingTest.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/**
- * Test the incoming filter class within the Kolab filter implementation.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/IncomingTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * @package Horde_Kolab_Filter
- */
-
-/**
- *  We need the base class
- */
-require_once 'Horde/Kolab/Test/Filter.php';
-
-/**
- *  We need the unit test framework 
- */
-require_once 'PHPUnit/Extensions/OutputTestCase.php';
-
-require_once 'Horde.php';
-require_once 'Horde/Kolab/Filter/Incoming.php';
-
-/**
- * Test the incoming filter.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/IncomingTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Horde_Kolab_Filter
- */
-class Horde_Kolab_Filter_IncomingTest extends Horde_Kolab_Test_Filter
-{
-
-/*     /\** */
-/*      * Set up testing. */
-/*      *\/ */
-/*     protected function setUp() */
-/*     { */
-/*         global $conf; */
-
-/*         $conf = array(); */
-
-/*         $test = new Horde_Kolab_Test(); */
-/*         $test->prepareBasicSetup(); */
-
-/*         $conf['log']['enabled']          = false; */
-
-/*         $conf['kolab']['filter']['debug'] = true; */
-
-/*         $conf['kolab']['imap']['server'] = 'localhost'; */
-/*         $conf['kolab']['imap']['port']   = 0; */
-
-/*         $_SERVER['SERVER_NAME'] = 'localhost'; */
-/*     } */
-
-
-    /**
-     * Test receiving the simple.eml message.
-     */
-    public function testSimpleIn()
-    {
-        $params = array('unmodified_content' => true,
-                        'incoming' => true);
-
-        $this->sendFixture(dirname(__FILE__) . '/fixtures/simple.eml',
-                           dirname(__FILE__) . '/fixtures/simple2.ret',
-                           '', '', 'wrobel at example.org', 'me at example.org',
-                           'home.example.org', $params);
-    }
-
-    /**
-     * Test handling the line end with incoming messages.
-     */
-    public function testIncomingLineEnd()
-    {
-        $params = array('unmodified_content' => true,
-                        'incoming' => true);
-
-        $this->sendFixture(dirname(__FILE__) . '/fixtures/empty.eml',
-                           dirname(__FILE__) . '/fixtures/empty2.ret',
-                           '', '127.0.0.1', 'wrobel at example.org', 'me at example.org',
-                           'home.example.org', $params);
-    }
-}
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/LoadTest.php b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/LoadTest.php
deleted file mode 100644
index aa20da8..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/LoadTest.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * Test the incoming filter class for its load behaviour..
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/LoadTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * @package Horde_Kolab_Filter
- */
-
-/**
- *  We need the unit test framework 
- */
-require_once 'PHPUnit/Framework.php';
-require_once 'PHPUnit/Extensions/PerformanceTestCase.php';
-
-require_once 'Horde.php';
-require_once 'Horde/Kolab/Filter/Incoming.php';
-
-/**
- * Test the incoming filter load.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/LoadTest.php,v 1.6.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Horde_Kolab_Filter
- */
-class Horde_Kolab_Filter_LoadTest extends PHPUnit_Extensions_PerformanceTestCase
-{
-
-    /**
-     * Set up testing.
-     */
-    protected function setUp()
-    {
-        global $conf;
-
-        $conf = array();
-        $conf['log']['enabled']          = false;
-
-        $conf['kolab']['filter']['debug'] = true;
-
-        $conf['kolab']['server'] = array(
-            'driver' => 'test',
-            'params' => array(
-                'cn=me' => array(
-                    'dn' => 'cn=me',
-                    'data' => array(
-                        'objectClass' => array('kolabInetOrgPerson'),
-                        'mail' => array('me at example.com'),
-                        'kolabImapHost' => array('localhost'),
-                        'uid' => array('me'),
-                    )
-                ),
-                'cn=you' => array(
-                    'dn' => 'cn=you',
-                    'data' => array(
-                        'objectClass' => array('kolabInetOrgPerson'),
-                        'mail' => array('you at example.com'),
-                        'kolabImapHost' => array('localhost'),
-                        'uid' => array('you'),
-                    )
-                ),
-            )
-        );
-        $conf['kolab']['imap']['server'] = 'localhost';
-        $conf['kolab']['imap']['port']   = 0;
-        $conf['kolab']['imap']['allow_special_users'] = true;
-
-        $_SERVER['SERVER_NAME'] = 'localhost';
-   }
-
-
-    /**
-     * Test the time the script takes in handling some messages.
-     */
-    public function testLoad()
-    {
-        $this->setMaxRunningTime(3);
-
-        $tmpdir = Horde::getTempDir();
-        $tmpfile = @tempnam($tmpdir, 'BIG.eml.');
-        $tmpfh = @fopen($tmpfile, "w");
-        $head = file_get_contents(dirname(__FILE__) . '/fixtures/tiny.eml');
-        $body = '';
-        for ($i = 0; $i < 50000;$i++) {
-            $body .= md5(microtime());
-            if (($i % 2) == 0) {
-                $body .= "\n";
-            }
-        }
-        @fwrite($tmpfh, $head);
-        @fwrite($tmpfh, $body);
-        @fclose($tmpfh);
-
-        $_SERVER['argv'] = array($_SERVER['argv'][0], '--sender=me at example.com', '--recipient=you at example.com', '--user=', '--host=example.com');
-
-        for ($i = 0; $i < 10; $i++) {
-
-            $parser = &new Horde_Kolab_Filter_Incoming();
-            $inh = fopen(dirname(__FILE__) . '/fixtures/tiny.eml', 'r');
-            $parser->parse($inh, 'drop');
-
-            $parser = &new Horde_Kolab_Filter_Incoming();
-            $inh = fopen(dirname(__FILE__) . '/fixtures/simple.eml', 'r');
-            $parser->parse($inh, 'drop');
-
-            $parser = &new Horde_Kolab_Filter_Incoming();
-            $inh = fopen($tmpfile, 'r');
-            $parser->parse($inh, 'drop');
-
-        }
-    }
-}
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ResourceTest.php b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ResourceTest.php
deleted file mode 100644
index bb43122..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/ResourceTest.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/**
- * Test resource handling within the Kolab filter implementation.
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ResourceTest.php,v 1.4.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * @package Horde_Kolab_Filter
- */
-
-/**
- *  We need the base class
- */
-require_once 'Horde/Kolab/Test/Filter.php';
-
-require_once 'Horde.php';
-require_once 'Horde/Kolab/Resource.php';
-require_once 'Horde/Kolab/Filter/Incoming.php';
-require_once 'Horde/iCalendar.php';
-require_once 'Horde/iCalendar/vfreebusy.php';
-
-/**
- * Test resource handling
- *
- * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ResourceTest.php,v 1.4.2.2 2009/02/24 11:17:40 wrobel Exp $
- *
- * Copyright 2008 Klarälvdalens Datakonsult AB
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- *
- * @author  Gunnar Wrobel <wrobel at pardus.de>
- * @package Horde_Kolab_Filter
- */
-class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
-{
-
-    /**
-     * Test retrieval of the resource information
-     */
-    public function testGetResourceData()
-    {
-        $r = &new Kolab_Resource();
-        $d = $r->_getResourceData('test at example.org', 'wrobel at example.org');
-        $this->assertNoError($d);
-        $this->assertEquals('wrobel at example.org', $d['id']);
-        $this->assertEquals('home.example.org', $d['homeserver']);
-        $this->assertEquals('ACT_REJECT_IF_CONFLICTS', $d['action']);
-        $this->assertEquals('Gunnar Wrobel', $d['cn']);
-    }
-
-    /**
-     * Test manual actions
-     */
-    public function testManual()
-    {
-        $r = &new Kolab_Resource();
-        $this->assertTrue($r->handleMessage('otherhost', 'test at example.org', 'wrobel at example.org', null));
-        $r = &new Kolab_Resource();
-        $this->assertTrue($r->handleMessage('localhost', 'test at example.org', 'wrobel at example.org', null));
-    }
-
-
-    /**
-     * Test invitation.
-     */
-    public function testRecurrenceInvitation()
-    {
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
-
-        $params = array('unmodified_content' => true,
-                        'incoming' => true);
-
-        $this->sendFixture(dirname(__FILE__) . '/fixtures/recur_invitation.eml',
-                           dirname(__FILE__) . '/fixtures/null.ret',
-                           '', '', 'test at example.org', 'wrobel at example.org',
-                           'home.example.org', $params);
-
-        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
-        $this->assertNoError($result);
-
-        $folder = $this->storage->getFolder('INBOX/Kalender');
-        $data = $folder->getData();
-        $events = $data->getObjects();
-        $this->assertEquals(1222419600, $events[0]['start-date']);
-
-        $result = $data->deleteAll();
-        $this->assertNoError($result);
-    }
-
-    /**
-     * Test an that contains a long string.
-     */
-    public function testLongStringInvitation()
-    {
-        require_once 'Horde/iCalendar/vfreebusy.php';
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
-
-        $params = array('unmodified_content' => true,
-                        'incoming' => true);
-
-        $this->sendFixture(dirname(__FILE__) . '/fixtures/longstring_invitation.eml',
-                           dirname(__FILE__) . '/fixtures/null.ret',
-                           '', '', 'test at example.org', 'wrobel at example.org',
-                           'home.example.org', $params);
-
-        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
-        $this->assertNoError($result);
-
-        $folder = $this->storage->getFolder('INBOX/Kalender');
-        $data = $folder->getData();
-        $events = $data->getObjects();
-        $summaries = array();
-        foreach ($events as $event) {
-            $summaries[] = $event['summary'];
-        }
-        $this->assertContains('invitationtest2', $summaries);
-
-        $result = $data->deleteAll();
-        $this->assertNoError($result);
-    }
-}
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty.eml
deleted file mode 100644
index 7b36d3e..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty.eml
+++ /dev/null
@@ -1,5 +0,0 @@
-From: me at example.com
-To:me at example.com
-Subject: xx
-
-xx
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty2.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty2.ret
deleted file mode 100644
index 1aea922..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/empty2.ret
+++ /dev/null
@@ -1,9 +0,0 @@
-Mail from sender: wrobel at example.org
-Mail to recipient: me at example.org
-From: me at example.com
-To:me at example.com
-Subject: xx
-X-Kolab-Scheduling-Message: FALSE
-
-xx
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.eml
deleted file mode 100644
index 93f69a7..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.eml
+++ /dev/null
@@ -1,14 +0,0 @@
-Return-Path: <me at example.org>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: me at example.org
-To: "You" <you at example.org>
-Subject: Me to You
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.ret
deleted file mode 100644
index a79769f..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged.ret
+++ /dev/null
@@ -1,17 +0,0 @@
-Mail from sender: me at example.org
-Mail to recipient: you at example.org
-Return-Path: <me at example.org>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: =?utf-8?B?IiAoVU5UUlVTVEVELCBzZW5kZXIgPG1lQGV4YW1wbGUub3JnPiBpcyBub3QgYXV0aGVudGljYXRlZCkiIDxtZUBleGFtcGxlLm9yZz4=?=
-To: "You" <you at example.org>
-Subject: Me to You
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged_trans.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged_trans.ret
deleted file mode 100644
index a79769f..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/forged_trans.ret
+++ /dev/null
@@ -1,17 +0,0 @@
-Mail from sender: me at example.org
-Mail to recipient: you at example.org
-Return-Path: <me at example.org>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: =?utf-8?B?IiAoVU5UUlVTVEVELCBzZW5kZXIgPG1lQGV4YW1wbGUub3JnPiBpcyBub3QgYXV0aGVudGljYXRlZCkiIDxtZUBleGFtcGxlLm9yZz4=?=
-To: "You" <you at example.org>
-Subject: Me to You
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml
deleted file mode 100644
index 2d27198..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml
+++ /dev/null
@@ -1,39 +0,0 @@
-From: User1 <somebody at example.org>
-Sender: User2 <%1$s>
-To: User3 <%2$s>
-Subject: kolab/issue3192
-Date: Mon, 23 Feb 2009 15:16:14 +0100
-Message-ID: <000001c995c1$49c4a2a0$140ba8c0 at invalid>
-MIME-Version: 1.0
-Content-Type: text/calendar; method=REQUEST;
-	charset="utf-8"
-Content-Transfer-Encoding: 7bit
-X-Mailer: Microsoft Office Outlook 11
-Thread-Index: AcmVuGgcYR9Pp2HUSHalFjSgcQETAwAAAq8gAAIyVwA=
-X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
-
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:REQUEST
-BEGIN:VEVENT
-ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:%(user3)s
-DTSTART:20090223T140000Z
-DTEND:20090223T150000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:libkcal-910600374.601
-DTSTAMP:20090223T131221Z
-DESCRIPTION:Zeit: Montag\, 23. Februar 2009 15:00-16:00 (GMT+01:00)
-  Amsterdam\, Berlin\, Bern\, Rom\, Stockholm\,
-  Wien.\n\n*~*~*~*~*~*~*~*~*~*\n\n\n\n>_____________________________________
- ________\n>Von: 	User1  \n>Gesendet:	Montag\, 23. Februar 2009
-  14:12\n>An:	User1\; %(user2)s\n>Betreff:	kolab/issue3192\n>Zeit:
- 	Montag\, 23. Februar 2009 15:00-16:00 (GMT+01:00) Amsterdam\, Berlin\,
-  Bern\, Rom\, Stockholm\, Wien.\n>Ort:	\n>\n>\n
-SUMMARY:WG: kolab/issue3192
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml
deleted file mode 100644
index 5272bea..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml
+++ /dev/null
@@ -1,29 +0,0 @@
-To: wrobel at example.org
-From: test at example.org
-Subject: Invitation kolab/issue3236
-Date: Fri, 21 Nov 2008 19:25:35 +0100
-MIME-Version: 1.0
-Content-Type: text/calendar;
-  method=request;
-  charset="utf-8"
-Content-Transfer-Encoding: 7bit
-
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:REQUEST
-BEGIN:VEVENT
-ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:wrobel at example.org
-ORGANIZER:MAILTO:test at example.org
-DTSTART:20081122T190000Z
-DTEND:20081122T193000Z
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E0080000000020D533ED0E4CC9010000000000000000100
- 00000094C5C0A65E8CC4DB1AEC47FD1255FCD
-DTSTAMP:20081121T182534Z
-DESCRIPTION:Zeit: Samstag\, 22. November 2008 20:00-20:30 (GMT+01:00)
-  Amsterdam\, Berlin\, Bern\, Rom\, Stockholm\,
-  Wien.\\n\\n*~*~*~*~*~*~*~*~*~*\\n\\n\\n
-SUMMARY:invitationtest2
-END:VEVENT
-END:VCALENDAR
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/null.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/null.ret
deleted file mode 100644
index e69de29..0000000
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/privileged.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/privileged.ret
deleted file mode 100644
index c6be908..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/privileged.ret
+++ /dev/null
@@ -1,17 +0,0 @@
-Mail from sender: me at example.org
-Mail to recipient: you at example.org
-Return-Path: <me at example.org>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: me at example.org
-To: "You" <you at example.org>
-Subject: Me to You
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml
deleted file mode 100644
index 53cbf43..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml
+++ /dev/null
@@ -1,202 +0,0 @@
-Received: from localhost (example.org [127.0.0.1])
-	by example.org (Postfix) with ESMTP id 4E36AC2E001A
-	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
-X-Virus-Scanned: by amavisd-new at example.org
-X-Spam-Flag: NO
-X-Spam-Score: 3.704
-X-Spam-Level: ***
-X-Spam-Status: No, score=3.704 tagged_above=3 required=6.3 tests=[AWL=-1.351,
-	HTML_IMAGE_ONLY_32=2.353, HTML_MESSAGE=0.001, MIME_BASE64_TEXT=2.701]
-Received: from example.org ([127.0.0.1])
-	by localhost (example.org [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id 151vjdIDehPR for <wrobel at example.org>;
-	Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
-Received: from localhost (example.org [127.0.0.1])
-	by example.org (Postfix) with ESMTP id 030C5C2E001C
-	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
-Received: from ug-out-1516.google.com (ug-out-1516.google.com [66.249.92.165])
-	by example.org (Postfix) with ESMTP id D88AAC2E001A
-	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:07 +0200 (CEST)
-Received: by ug-out-1516.google.com with SMTP id 34so6700uge.3
-        for <wrobel at example.org>; Fri, 26 Sep 2008 01:54:07 -0700 (PDT)
-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
-        d=google.com; s=beta;
-        h=domainkey-signature:mime-version:reply-to:sender:auto-submitted
-         :received:message-id:date:subject:from:to:content-type;
-        bh=NIbM6hZNgbcIAu3CGNdscvaw1JuMHR0cmVT+UvW5YdU=;
-        b=sGwxgD6sW0IDPFRSJcK9zvMtsS4jqziu+eF+p2fb7RsxCPFjU5FJFKbwhZQdVvA6I/
-         rzueuvNP0EqBhfsdLVyA==
-DomainKey-Signature: a=rsa-sha1; c=nofws;
-        d=google.com; s=beta;
-        h=mime-version:reply-to:sender:auto-submitted:message-id:date:subject
-         :from:to:content-type;
-        b=oo9wYH7lmDU5KDHTT4tpQ+BRlw/FYHBN2zt/an5FPuXE+dNM05UBVi8h87ig2c5Tvl
-         p53+hzDD2DoB/SlhqInA==
-MIME-Version: 1.0
-Reply-To: Gunnar Wrobel <test at example.org>
-Sender: Google Kalender <calendar-notification at google.com>
-Auto-Submitted: auto-generated
-Received: by 10.210.130.14 with SMTP id c14mr120659ebd.11.1222419247313; Fri, 
-	26 Sep 2008 01:54:07 -0700 (PDT)
-Message-ID: <0015174c3d6200b58f0457c8a9b5 at google.com>
-Date: Fri, 26 Sep 2008 01:54:07 -0700
-Subject: =?ISO-8859-1?B?W0VpbmxhZHVuZ10gdHJnIEAgVORnbGljaCB1bSAxMTowMCAocmVzQGRldi5wYXJkdXMu?=
-	=?ISO-8859-1?B?ZGUp?=
-From: Gunnar Wrobel <test at example.org>
-To: "wrobel at example.org" <wrobel at example.org>
-Content-Type: multipart/mixed; boundary=0015174c3d6200b57b0457c8a97d
-
---0015174c3d6200b57b0457c8a97d
-Content-Type: multipart/alternative; boundary=0015174c3d6200b5720457c8a97b
-
---0015174c3d6200b5720457c8a97b
-Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes
-Content-Transfer-Encoding: base64
-
-cmVzQGRldi5wYXJkdXMuZGUsIFNpZSB3dXJkZW4gZWluZ2VsYWRlbiB6dQ0KDQpUaXRlbDogdHJn
-DQpaZWl0OiBU5GdsaWNoIHVtIDExOjAwIChaZWl0em9uZTogUm9tKQ0KS2FsZW5kZXI6IHJlc0Bk
-ZXYucGFyZHVzLmRlDQoNClNpZSBr9m5uZW4gZGllc2VuIFRlcm1pbiBhbnplaWdlbiB1bnRlciAg
-DQpodHRwOi8vd3d3Lmdvb2dsZS5jb20vY2FsZW5kYXIvZXZlbnQ/YWN0aW9uPVZJRVcmZWlkPWJX
-czJiVzR6YUdGdWNEUTJhVGt3T0dWbGIyNHlaMmR1ZFdzZ2NtVnpRR1JsZGk1d1lYSmtkWE11WkdV
-JnRvaz1NaklqWjNkeWIySmxiRUJuYjI5bmJHVnRZV2xzTG1OdmJUQTNaVGc1Tm1aaFpqZGxZVEE0
-WmpjM1pqYzBNMk16T0dSak5ETXlaVGc0WkRFeU0yVXpNV1EmY3R6PUV1cm9wZSUyRlJvbWUmaGw9
-ZGUNCg0KDQoNCkRpZXNlIEUtTWFpbCB3dXJkZSBhbiByZXNAZGV2LnBhcmR1cy5kZSBnZXNlbmRl
-dCwgZGEgU2llIGVpbiBUZWlsbmVobWVyICANCmRpZXNlcyBUZXJtaW5zIHNpbmQuDQoNCkxlaG5l
-biBTaWUgZGllc2VuIFRlcm1pbiBhYiwgdW0ga2VpbmUgd2VpdGVyZW4gTmFjaHJpY2h0ZW4genUg
-ZGllc2VtIFRlcm1pbiAgDQp6dSBlcmhhbHRlbi4gU2llIGsmb3VtbDtubmVuIHNpY2ggYWx0ZXJu
-YXRpdiBmJnV1bWw7ciBlaW4gR29vZ2xlLUtvbnRvICANCnVudGVyIGh0dHA6Ly93d3cuZ29vZ2xl
-LmNvbS9jYWxlbmRhci8gYW5tZWxkZW4gdW5kIElocmUgIA0KQmVuYWNocmljaHRpZ3VuZ3NlaW5z
-dGVsbHVuZ2VuIGYmdXVtbDtyIElocmVuIGdlc2FtdGVuIEthbGVuZGVyIHN0ZXVlcm4uDQo=
---0015174c3d6200b5720457c8a97b
-Content-Type: text/html; charset=ISO-8859-1
-Content-Transfer-Encoding: 7bit
-
-<div style="padding:10px 7px; font-size:12px; line-height:1.4 font-family:Arial,Sans-serif; text-align:center;"><div><a href="http://www.google.com/calendar/"><img style="border-width:0" src="http://www.google.com/calendar/images/blue_beta_de.gif" alt="Google Kalender"></a></div>
-<div style="width:370px; background:#D2E6D2; border-style:solid;       border-color:#ccc; border-width:1px 1px 0 1px; padding:15px 15px 5px 15px;       margin:0 auto"><p style="margin:0;color:#0">wrobel at example.org,
-Sie wurden eingeladen zu</p>
-<h2 style="margin:5px 0; font-size:18px; line-height:1.4;color:#0">trg</h2>
-<p style="margin:0 0 .5em;"><span style="color:#0">T&auml;glich um 11:00</span>
-<br>
-<span style="color:#676;">(Zeitzone:
-Rom)</span>
-<br>
-<span style="color:#0"></span>
-<br>
-<span style="color:#0">Kalender:
-wrobel at example.org</span></p>
-<p style="margin:0 0 1em;color:#0; white-space:pre-wrap !important; white-space:-moz-pre-wrap !important; white-space:-pre-wrap !important; white-space:-o-pre-wrap !important; white-space:pre; word-wrap:break-word;"><a href="http://www.google.com/calendar/event?action=VIEW&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Weitere Termindetails&raquo;</a></p>
-<div style="margin:.5em 0 0; text-align:center;color:#0"><strong>Nehmen Sie teil?</strong></div>
-<div style="margin:4px 0 0; text-align:center;"><span style="background:#fff; border:1px solid #676;              padding:3px 5px; line-height:1.5;"><a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=1&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Ja</a>
-|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=3&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Vielleicht</a>
-|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=2&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Nein</a></span></div></div>
-<div><img src="http://www.google.com/calendar/images/envelope.gif" style="background:#D2E6D2; width:420px height:95px" alt=""></div><p style="margin:-15px 0 0;">&nbsp;</p>
-<p style="color:#676;">Diese E-Mail wurde an wrobel at example.org gesendet, da Sie ein Teilnehmer dieses Termins sind.</p><p style="color:#676;">Lehnen Sie diesen Termin ab, um keine weiteren Nachrichten zu diesem Termin zu erhalten. Sie k&ouml;nnen sich alternativ f&uuml;r ein Google-Konto unter http://www.google.com/calendar/ anmelden und Ihre Benachrichtigungseinstellungen f&uuml;r Ihren gesamten Kalender steuern.</p></div>
---0015174c3d6200b5720457c8a97b
-Content-Type: text/calendar; charset=ISO-8859-1; method=REQUEST
-Content-Transfer-Encoding: 7bit
-
-BEGIN:VCALENDAR
-PRODID:-//Google Inc//Google Calendar 70.9054//EN
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-BEGIN:VTIMEZONE
-TZID:Europe/Rome
-X-LIC-LOCATION:Europe/Rome
-BEGIN:DAYLIGHT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-TZNAME:CEST
-DTSTART:19700329T020000
-RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
-END:DAYLIGHT
-BEGIN:STANDARD
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-TZNAME:CET
-DTSTART:19701025T030000
-RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTART;TZID=Europe/Rome:20080926T110000
-DTEND;TZID=Europe/Rome:20080926T120000
-RRULE:FREQ=DAILY;WKST=SU
-DTSTAMP:20080926T085407Z
-ORGANIZER;CN=Gunnar Wrobel:mailto:test at example.org
-UID:mk6mn3hanp46i908eeon2ggnuk at google.com
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
- TRUE;CN=wrobel at example.org;X-NUM-GUESTS=0:mailto:wrobel at example.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
- ;CN=Gunnar Wrobel;X-NUM-GUESTS=0:mailto:test at example.org
-CLASS:PRIVATE
-CREATED:20080926T085406Z
-DESCRIPTION:Zeigen Sie Ihren Termin unter http://www.google.com/calendar/ev
- ent?action=VIEW&eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXM
- uZGU&tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOG
- RjNDMyZTg4ZDEyM2UzMWQ&ctz=Europe%2FRome&hl=de an.
-LAST-MODIFIED:20080926T085406Z
-LOCATION:
-SEQUENCE:0
-STATUS:CONFIRMED
-SUMMARY:trg
-TRANSP:OPAQUE
-END:VEVENT
-END:VCALENDAR
-
---0015174c3d6200b5720457c8a97b--
---0015174c3d6200b57b0457c8a97d
-Content-Type: application/ics; name="invite.ics"
-Content-Disposition: attachment; filename="invite.ics"
-Content-Transfer-Encoding: 7bit
-
-BEGIN:VCALENDAR
-PRODID:-//Google Inc//Google Calendar 70.9054//EN
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-BEGIN:VTIMEZONE
-TZID:Europe/Rome
-X-LIC-LOCATION:Europe/Rome
-BEGIN:DAYLIGHT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-TZNAME:CEST
-DTSTART:19700329T020000
-RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
-END:DAYLIGHT
-BEGIN:STANDARD
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-TZNAME:CET
-DTSTART:19701025T030000
-RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTART;TZID=Europe/Rome:20080926T110000
-DTEND;TZID=Europe/Rome:20080926T120000
-RRULE:FREQ=DAILY;WKST=SU
-DTSTAMP:20080926T085407Z
-ORGANIZER;CN=Gunnar Wrobel:mailto:test at example.org
-UID:mk6mn3hanp46i908eeon2ggnuk at google.com
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
- TRUE;CN=wrobel at example.org;X-NUM-GUESTS=0:mailto:wrobel at example.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
- ;CN=Gunnar Wrobel;X-NUM-GUESTS=0:mailto:test at example.org
-CLASS:PRIVATE
-CREATED:20080926T085406Z
-DESCRIPTION:Zeigen Sie Ihren Termin unter http://www.google.com/calendar/ev
- ent?action=VIEW&eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXM
- uZGU&tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOG
- RjNDMyZTg4ZDEyM2UzMWQ&ctz=Europe%2FRome&hl=de an.
-LAST-MODIFIED:20080926T085406Z
-LOCATION:
-SEQUENCE:0
-STATUS:CONFIRMED
-SUMMARY:trg
-TRANSP:OPAQUE
-END:VEVENT
-END:VCALENDAR
-
---0015174c3d6200b57b0457c8a97d--
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.eml
deleted file mode 100644
index eeeb852..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.eml
+++ /dev/null
@@ -1,105 +0,0 @@
-Return-Path: <jramirezme at kof.org.mx>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-X-Sieve: CMU Sieve 2.3
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	by demo.example.org (Postfix) with ESMTP id 395055FC0128
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
-X-Quarantine-ID: <pcNZVfHFgssC>
-X-Virus-Scanned: by amavisd-new at demo.example.org
-X-Spam-Flag: YES
-X-Spam-Score: 15.576
-X-Spam-Level: ***************
-X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
-	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
-	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
-	SUBJECT_FUZZY_PENIS=3.099]
-Received: from demo.example.org ([127.0.0.1])
-	by localhost (demo.example.org [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.org>;
-	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	by demo.example.org (Postfix) with ESMTP id ABE8E5FC012A
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from town.windham.me.us (unknown [85.192.14.1])
-	by demo.example.org (Postfix) with SMTP id D10375FC0128
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
-Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.org.mx)
-     by demo.example.org with esmtp (CEYPNSAEHHT CYXPCJ)
-     id UNrWB0-GRSpeC-lz
-     for wrobel at demo.example.org; Sat, 10 Nov 2007 22:45:12 +0300
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: "Meredith F. Dick" <Meredith at kof.org.mx>
-To: "Marta Z. Rodrigues" <wrobel at demo.example.org>
-Subject: ***SPAM*** Don't you think it's time you stopped being a loser
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-MIME-Version: 1.0
-Content-Type: multipart/alternative;
-        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
-X-Priority: 3
-X-MSMail-Priority: Normal
-X-Mailer: Microsoft Outlook Express 6.00.2900.2869
-X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/plain;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-request=2E Horn was a fan favorite, standing up for theA recent poll by M=
-ontreal based newspaper Le Devoir, on
-Mel Karmazin spoke on behalf of both XM and Sirius=2E
-
-
-Do you believe in magic? We suppose you're likely to say "no"=2E=20
-We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
-ed!=20
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle!=20
-It's fabulous!
-
-So, hurry up, work a miracle in your life with this wonder-medicine!
-
-
-competiton has a poor track record of keeping down costsas head of the pu=
-ppet government in China=2EParti Qubcois leader slams radio host on homop=
-hobiacontrols=2E XM and Sirius can be said to compete with
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/html;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
-<HTML><HEAD>
-<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
->
-<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
-<STYLE type=3D"text/css">
-=2Estyle2 {font-size: 10px; color: #616161;}
-=2Estyle7 {font-size: 14px; color: #FF2F2F;}
-body {background-color: #FFFFFF; color: #2B3235;}
-</STYLE>
-</HEAD>
-<BODY><span class=3D"style2">=20
-<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
-by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
- of both XM and Sirius=2E</span>=20
-<br><br><br>
-<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
-<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
-t </span>MegaXXXX was introduced!</b><br>
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle! <br>
-<b>It's fabulous!</b><br><br>
-
-<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
-r life with this wonder-medicine!</b></a><br><br>
-<br><span class=3D"style2">competiton has a poor track record of keeping =
-down costsas head of the puppet government in China=2EParti Qubcois leade=
-r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
-compete with<br></span></BODY></HTML>
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210--
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.ret
deleted file mode 100644
index 57853ab..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple.ret
+++ /dev/null
@@ -1,109 +0,0 @@
-Mail from sender: me at example.com
-Mail to recipient: you at example.com
-Return-Path: <jramirezme at kof.com.mx>
-Received: from localhost (fqdn.example.com [127.0.0.1])
-	 by demo.example.com (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-X-Sieve: CMU Sieve 2.3
-Received: from localhost (fqdn.example.com [127.0.0.1])
-	by demo.example.com (Postfix) with ESMTP id 395055FC0128
-	for <wrobel at demo.example.com>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
-X-Quarantine-ID: <pcNZVfHFgssC>
-X-Virus-Scanned: by amavisd-new at demo.example.com
-X-Spam-Flag: YES
-X-Spam-Score: 15.576
-X-Spam-Level: ***************
-X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
-	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
-	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
-	SUBJECT_FUZZY_PENIS=3.099]
-Received: from demo.example.com ([127.0.0.1])
-	by localhost (demo.example.com [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.com>;
-	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from localhost (fqdn.example.com [127.0.0.1])
-	by demo.example.com (Postfix) with ESMTP id ABE8E5FC012A
-	for <wrobel at demo.example.com>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from town.windham.me.us (unknown [85.192.14.1])
-	by demo.example.com (Postfix) with SMTP id D10375FC0128
-	for <wrobel at demo.example.com>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
-Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.com.mx)
-     by demo.example.com with esmtp (CEYPNSAEHHT CYXPCJ)
-     id UNrWB0-GRSpeC-lz
-     for wrobel at demo.example.com; Sat, 10 Nov 2007 22:45:12 +0300
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: "Meredith F. Dick" <Meredith at kof.com.mx>
-To: "Marta Z. Rodrigues" <wrobel at demo.example.com>
-Subject: ***SPAM*** Don't you think it's time you stopped being a loser
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-MIME-Version: 1.0
-Content-Type: multipart/alternative;
-        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
-X-Priority: 3
-X-MSMail-Priority: Normal
-X-Mailer: Microsoft Outlook Express 6.00.2900.2869
-X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
-X-Kolab-Scheduling-Message: FALSE
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/plain;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-request=2E Horn was a fan favorite, standing up for theA recent poll by M=
-ontreal based newspaper Le Devoir, on
-Mel Karmazin spoke on behalf of both XM and Sirius=2E
-
-
-Do you believe in magic? We suppose you're likely to say "no"=2E=20
-We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
-ed!=20
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle!=20
-It's fabulous!
-
-So, hurry up, work a miracle in your life with this wonder-medicine!
-
-
-competiton has a poor track record of keeping down costsas head of the pu=
-ppet government in China=2EParti Qubcois leader slams radio host on homop=
-hobiacontrols=2E XM and Sirius can be said to compete with
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/html;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
-<HTML><HEAD>
-<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
->
-<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
-<STYLE type=3D"text/css">
-=2Estyle2 {font-size: 10px; color: #616161;}
-=2Estyle7 {font-size: 14px; color: #FF2F2F;}
-body {background-color: #FFFFFF; color: #2B3235;}
-</STYLE>
-</HEAD>
-<BODY><span class=3D"style2">=20
-<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
-by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
- of both XM and Sirius=2E</span>=20
-<br><br><br>
-<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
-<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
-t </span>MegaXXXX was introduced!</b><br>
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle! <br>
-<b>It's fabulous!</b><br><br>
-
-<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
-r life with this wonder-medicine!</b></a><br><br>
-<br><span class=3D"style2">competiton has a poor track record of keeping =
-down costsas head of the puppet government in China=2EParti Qubcois leade=
-r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
-compete with<br></span></BODY></HTML>
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210--
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple2.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple2.ret
deleted file mode 100644
index 3db6ec4..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple2.ret
+++ /dev/null
@@ -1,109 +0,0 @@
-Mail from sender: wrobel at example.org
-Mail to recipient: me at example.org
-Return-Path: <jramirezme at kof.org.mx>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-X-Sieve: CMU Sieve 2.3
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	by demo.example.org (Postfix) with ESMTP id 395055FC0128
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
-X-Quarantine-ID: <pcNZVfHFgssC>
-X-Virus-Scanned: by amavisd-new at demo.example.org
-X-Spam-Flag: YES
-X-Spam-Score: 15.576
-X-Spam-Level: ***************
-X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
-	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
-	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
-	SUBJECT_FUZZY_PENIS=3.099]
-Received: from demo.example.org ([127.0.0.1])
-	by localhost (demo.example.org [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.org>;
-	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	by demo.example.org (Postfix) with ESMTP id ABE8E5FC012A
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from town.windham.me.us (unknown [85.192.14.1])
-	by demo.example.org (Postfix) with SMTP id D10375FC0128
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
-Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.org.mx)
-     by demo.example.org with esmtp (CEYPNSAEHHT CYXPCJ)
-     id UNrWB0-GRSpeC-lz
-     for wrobel at demo.example.org; Sat, 10 Nov 2007 22:45:12 +0300
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: "Meredith F. Dick" <Meredith at kof.org.mx>
-To: "Marta Z. Rodrigues" <wrobel at demo.example.org>
-Subject: ***SPAM*** Don't you think it's time you stopped being a loser
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-MIME-Version: 1.0
-Content-Type: multipart/alternative;
-        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
-X-Priority: 3
-X-MSMail-Priority: Normal
-X-Mailer: Microsoft Outlook Express 6.00.2900.2869
-X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
-X-Kolab-Scheduling-Message: FALSE
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/plain;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-request=2E Horn was a fan favorite, standing up for theA recent poll by M=
-ontreal based newspaper Le Devoir, on
-Mel Karmazin spoke on behalf of both XM and Sirius=2E
-
-
-Do you believe in magic? We suppose you're likely to say "no"=2E=20
-We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
-ed!=20
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle!=20
-It's fabulous!
-
-So, hurry up, work a miracle in your life with this wonder-medicine!
-
-
-competiton has a poor track record of keeping down costsas head of the pu=
-ppet government in China=2EParti Qubcois leader slams radio host on homop=
-hobiacontrols=2E XM and Sirius can be said to compete with
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/html;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
-<HTML><HEAD>
-<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
->
-<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
-<STYLE type=3D"text/css">
-=2Estyle2 {font-size: 10px; color: #616161;}
-=2Estyle7 {font-size: 14px; color: #FF2F2F;}
-body {background-color: #FFFFFF; color: #2B3235;}
-</STYLE>
-</HEAD>
-<BODY><span class=3D"style2">=20
-<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
-by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
- of both XM and Sirius=2E</span>=20
-<br><br><br>
-<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
-<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
-t </span>MegaXXXX was introduced!</b><br>
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle! <br>
-<b>It's fabulous!</b><br><br>
-
-<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
-r life with this wonder-medicine!</b></a><br><br>
-<br><span class=3D"style2">competiton has a poor track record of keeping =
-down costsas head of the puppet government in China=2EParti Qubcois leade=
-r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
-compete with<br></span></BODY></HTML>
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210--
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple_out.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple_out.ret
deleted file mode 100644
index 00a044d..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/simple_out.ret
+++ /dev/null
@@ -1,108 +0,0 @@
-Mail from sender: me at example.org
-Mail to recipient: you at example.org
-Return-Path: <jramirezme at kof.org.mx>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-X-Sieve: CMU Sieve 2.3
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	by demo.example.org (Postfix) with ESMTP id 395055FC0128
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
-X-Quarantine-ID: <pcNZVfHFgssC>
-X-Virus-Scanned: by amavisd-new at demo.example.org
-X-Spam-Flag: YES
-X-Spam-Score: 15.576
-X-Spam-Level: ***************
-X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
-	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
-	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
-	SUBJECT_FUZZY_PENIS=3.099]
-Received: from demo.example.org ([127.0.0.1])
-	by localhost (demo.example.org [127.0.0.1]) (amavisd-new, port 10024)
-	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.org>;
-	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	by demo.example.org (Postfix) with ESMTP id ABE8E5FC012A
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
-Received: from town.windham.me.us (unknown [85.192.14.1])
-	by demo.example.org (Postfix) with SMTP id D10375FC0128
-	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
-Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.org.mx)
-     by demo.example.org with esmtp (CEYPNSAEHHT CYXPCJ)
-     id UNrWB0-GRSpeC-lz
-     for wrobel at demo.example.org; Sat, 10 Nov 2007 22:45:12 +0300
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: "Meredith F. Dick" <Meredith at kof.org.mx>
-To: "Marta Z. Rodrigues" <wrobel at demo.example.org>
-Subject: ***SPAM*** Don't you think it's time you stopped being a loser
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-MIME-Version: 1.0
-Content-Type: multipart/alternative;
-        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
-X-Priority: 3
-X-MSMail-Priority: Normal
-X-Mailer: Microsoft Outlook Express 6.00.2900.2869
-X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/plain;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-request=2E Horn was a fan favorite, standing up for theA recent poll by M=
-ontreal based newspaper Le Devoir, on
-Mel Karmazin spoke on behalf of both XM and Sirius=2E
-
-
-Do you believe in magic? We suppose you're likely to say "no"=2E=20
-We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
-ed!=20
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle!=20
-It's fabulous!
-
-So, hurry up, work a miracle in your life with this wonder-medicine!
-
-
-competiton has a poor track record of keeping down costsas head of the pu=
-ppet government in China=2EParti Qubcois leader slams radio host on homop=
-hobiacontrols=2E XM and Sirius can be said to compete with
-------=_NextPart_7455_1D89_01C823EB.5AA2E210
-Content-Type: text/html;
-        charset="us-ascii"
-Content-Transfer-Encoding: quoted-printable
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
-<HTML><HEAD>
-<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
->
-<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
-<STYLE type=3D"text/css">
-=2Estyle2 {font-size: 10px; color: #616161;}
-=2Estyle7 {font-size: 14px; color: #FF2F2F;}
-body {background-color: #FFFFFF; color: #2B3235;}
-</STYLE>
-</HEAD>
-<BODY><span class=3D"style2">=20
-<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
-by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
- of both XM and Sirius=2E</span>=20
-<br><br><br>
-<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
-<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
-t </span>MegaXXXX was introduced!</b><br>
-The effect this remedy produces on a male XXXXX cannot be called otherwis=
-e than a Miracle! <br>
-<b>It's fabulous!</b><br><br>
-
-<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
-r life with this wonder-medicine!</b></a><br><br>
-<br><span class=3D"style2">competiton has a poor track record of keeping =
-down costsas head of the puppet government in China=2EParti Qubcois leade=
-r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
-compete with<br></span></BODY></HTML>
-
-------=_NextPart_7455_1D89_01C823EB.5AA2E210--
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/test.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/test.eml
deleted file mode 100644
index b8d1024..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/test.eml
+++ /dev/null
@@ -1,61 +0,0 @@
-From: Test User <test at oberon.co.za>
-To: test2 at oberon.co.za
-Subject: a
-Date: Wed, 19 May 2004 10:38:41 +0200
-User-Agent: KMail/1.6.52
-MIME-Version: 1.0
-Content-Type: Multipart/Mixed;
-  boundary="Boundary-00=_R0xqAO2ZmkKUNMZ"
-Message-Id: <200405191038.41626.test at oberon.co.za>
-Status: R
-X-Status: NQ
-X-KMail-EncryptionState:  
-X-KMail-SignatureState:  
-X-KMail-MDN-Sent:  
-
---Boundary-00=_R0xqAO2ZmkKUNMZ
-Content-Type: text/plain;
-  charset="us-ascii";
-  boundary=""
-Content-Transfer-Encoding: 7bit
-Content-Disposition: inline
-
-Organizer: test at oberon.co.za
-Summary: a
-Start Date: 2004-05-19
-Start Time: 12:00
-End Date: 2004-05-19
-End Time: 14:00
-
---Boundary-00=_R0xqAO2ZmkKUNMZ
-Content-Type: text/calendar;
-  name="cal.ics";
-  method="request"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment
-
-BEGIN:VCALENDAR
-PRODID:-//K Desktop Environment//NONSGML libkcal 3.2//EN
-VERSION:2.0
-METHOD:REQUEST
-BEGIN:VEVENT
-DTSTAMP:20040519T083835Z
-ORGANIZER:MAILTO:test at oberon.co.za
-ATTENDEE;CN=Test2 User;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:mailto:test2 at oberon.co.za
-CREATED:20040519T083734Z
-UID:libkcal-67797385.1001
-SEQUENCE:1
-LAST-MODIFIED:20040519T083734Z
-SUMMARY:a
-CLASS:PUBLIC
-PRIORITY:3
-DTSTART:20040614T080000Z
-DTEND:20040614T100000Z
-TRANSP:OPAQUE
-END:VEVENT
-
-END:VCALENDAR
-
-
---Boundary-00=_R0xqAO2ZmkKUNMZ--
-
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.eml
deleted file mode 100644
index 2145947..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.eml
+++ /dev/null
@@ -1,10 +0,0 @@
-To: wrobel at pardus.example.org
-Subject: test
-From: Gunnar Wrobel <wrobel at kolab.example.org>
-Date: Tue, 27 Nov 2007 08:49:39 +0100
-Message-ID: <878x4k6sbw.fsf at kolab.example.org>
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.ret
deleted file mode 100644
index 170239d..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/tiny.ret
+++ /dev/null
@@ -1,13 +0,0 @@
-Mail from sender: me at example.org
-Mail to recipient: you at example.org
-To: wrobel at pardus.example.org
-Subject: test
-From: Gunnar Wrobel <wrobel at kolab.example.org>
-Date: Tue, 27 Nov 2007 08:49:39 +0100
-Message-ID: <878x4k6sbw.fsf at kolab.example.org>
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.eml
deleted file mode 100644
index 467a29b..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.eml
+++ /dev/null
@@ -1,14 +0,0 @@
-Return-Path: <me at example.org>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: me at example.org
-To: you at example.net
-Subject: Me to You
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-I'm on vacation
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.ret
deleted file mode 100644
index c68b789..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/vacation.ret
+++ /dev/null
@@ -1,17 +0,0 @@
-Mail from sender: me at example.org
-Mail to recipient: you at example.net
-Return-Path: <me at example.org>
-Received: from localhost (fqdn.example.org [127.0.0.1])
-	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
-	 Sat, 10 Nov 2007 20:44:52 +0100
-Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
-From: me at example.org
-To: you at example.net
-Subject: Me to You
-Date: Sat, 10 Nov 2007 22:45:12 +0300
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-I'm on vacation
-.
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.eml b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.eml
deleted file mode 100644
index d25cb06..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.eml
+++ /dev/null
@@ -1,10 +0,0 @@
-To: %2$s
-Subject: test
-From: %1$s
-Date: Tue, 27 Nov 2007 08:49:39 +0100
-Message-ID: <878x4k6sbw.fsf at kolab.example.com>
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
diff --git a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.ret b/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.ret
deleted file mode 100644
index 5635227..0000000
--- a/Kolab_Filter-0.1.4/test/Horde/Kolab/Filter/fixtures/validation.ret
+++ /dev/null
@@ -1,13 +0,0 @@
-Mail from sender: %1$s
-Mail to recipient: %2$s
-To: %2$s
-Subject: test
-From: %1$s
-Date: Tue, 27 Nov 2007 08:49:39 +0100
-Message-ID: <878x4k6sbw.fsf at kolab.example.com>
-User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-
-test
-.
diff --git a/Kolab_Filter-0.1.7/COPYING b/Kolab_Filter-0.1.7/COPYING
new file mode 100644
index 0000000..d1c6b98
--- /dev/null
+++ b/Kolab_Filter-0.1.7/COPYING
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/Kolab_Filter-0.1.7/doc/Horde/Kolab/Filter/kolabfilter.1 b/Kolab_Filter-0.1.7/doc/Horde/Kolab/Filter/kolabfilter.1
new file mode 100644
index 0000000..611659e
--- /dev/null
+++ b/Kolab_Filter-0.1.7/doc/Horde/Kolab/Filter/kolabfilter.1
@@ -0,0 +1,168 @@
+.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.08)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.el \{\
+.    de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "KOLABFILTER 1"
+.TH KOLABFILTER 1 "2009-02-23" "Kolab_Filter-0.1.4" "User Contributed PHP Documentation"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+kolabfilter, kolabmailboxfilter \- Kolab filters
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fBkolabfilter\fR \fB\-\-sender\fR=\fIsender\fR \fB\-\-recipient\fR=\fIrecipient\fR \fB\-\-host\fR=\fIhost\fR \fB\-\-client\fR=\fIclient\fR \fB\-\-user\fR=\fIuser\fR \fB\-\-config\fR=\fIconfig\fR
+.PP
+\&\fBkolabmailboxfilter\fR \fB\-\-sender\fR=\fIsender\fR \fB\-\-recipient\fR=\fIrecipient\fR \fB\-\-host\fR=\fIhost\fR \fB\-\-client\fR=\fIclient\fR \fB\-\-user\fR=\fIuser\fR \fB\-\-config\fR=\fIconfig\fR
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBkolabfilter\fR is a filter for outgoing mail on a Kolab Server. It rewrites headers and handles
+Outlook issues.
+.PP
+\&\fBkolabmailboxfilter\fR is a filter for incoming mail on a Kolab Server. It checks the messages for iCal
+data and handles automatic invitations.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+.IP "\fB\-s\fR \fIsender\fR|\fB\-\-sender\fR=\fIsender\fR" 8
+.IX Item "-s sender|--sender=sender"
+The message sender.
+.IP "\fB\-r\fR \fIrecipient\fR|\fB\-\-recipient\fR=\fIrecipient\fR" 8
+.IX Item "-r recipient|--recipient=recipient"
+A message recipient (can be repeated).
+.IP "\fB\-H\fR \fIhost\fR|\fB\-\-host\fR=\fIhost\fR" 8
+.IX Item "-H host|--host=host"
+The host running this script.
+.IP "\fB\-c\fR \fIclient\fR|\fB\-\-client\fR=\fIclient\fR" 8
+.IX Item "-c client|--client=client"
+The client sending the message.
+.IP "\fB\-u\fR \fIuser\fR|\fB\-\-user\fR=\fIuser\fR" 8
+.IX Item "-u user|--user=user"
+\&\s-1ID\s0 of the currently authenticated user.
+.IP "\fB\-C\fR \fIconfig\fR|\fB\-\-config\fR=\fIconfig\fR" 8
+.IX Item "-C config|--config=config"
+Path to the configuration file for this filter.
+.SH "COPYRIGHT AND AUTHORS"
+.IX Header "COPYRIGHT AND AUTHORS"
+Copyright 2004\-2009 Klarälvdalens Datakonsult \s-1AB\s0
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Base.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Base.php
new file mode 100644
index 0000000..45dba6e
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Base.php
@@ -0,0 +1,310 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Base.php,v 1.6.2.5 2009-11-07 20:55:59 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/** Load the required PEAR libraries */
+require_once 'PEAR.php';
+
+/** Console_Getopt */
+require_once 'Console/Getopt.php';
+
+/** Load the required Horde libraries */
+require_once 'Horde.php';
+
+/** Load the Filter libraries */
+require_once dirname(__FILE__) . '/Response.php';
+
+/** Load the argument parsing library */
+require_once 'Horde/Argv/Option.php';
+require_once 'Horde/Argv/OptionContainer.php';
+require_once 'Horde/Argv/HelpFormatter.php';
+require_once 'Horde/Argv/IndentedHelpFormatter.php';
+require_once 'Horde/Argv/Values.php';
+require_once 'Horde/Argv/Parser.php';
+
+/**
+ * A basic definition for a PHP based postfix filter.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Base.php,v 1.6.2.5 2009-11-07 20:55:59 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Base
+{
+    /**
+     * The message ID.
+     *
+     * @var string
+     */
+    var $_id = '';
+
+    /**
+     * A temporary buffer file for storing the message.
+     *
+     * @var string
+     */
+    var $_tmpfile;
+
+    /**
+     * The file handle for the temporary file.
+     *
+     * @var int
+     */
+    var $_tmpfh;
+
+    /**
+     * The message sender.
+     *
+     * @var string
+     */
+    var $_sender;
+
+    /**
+     * The message recipients.
+     *
+     * @var array
+     */
+    var $_recipients = array();
+
+    /**
+     * The client host trying to send the message.
+     *
+     * @var string
+     */
+    var $_client_address;
+
+    /**
+     * The client host trying to send the message.
+     *
+     * @var string
+     */
+    var $_fqhostname;
+
+    /**
+     * The authenticated username of the sender.
+     *
+     * @var string
+     */
+    var $_sasl_username;
+
+    /**
+     * Initialize the class.
+     */
+    function init()
+    {
+        /* Parse our arguments */
+        $result = $this->_parseArgs();
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+    }
+
+    /**
+     * Handle the message.
+     *
+     * @param int    $inh  The file handle pointing to the message.
+     * @param string $transport  The name of the transport driver.
+     */
+    function parse($inh = STDIN, $transport = null)
+    {
+        /* Setup the temporary storage */
+        $result = $this->_initTmp();
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        Horde::logMessage(sprintf("%s starting up (sender=%s, recipients=%s, client_address=%s)", 
+                                  get_class($this), $this->_sender, 
+                                  join(', ',$this->_recipients), 
+                                  $this->_client_address),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        $result = $this->_parse($inh, $transport);
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        Horde::logMessage(sprintf("%s successfully completed (sender=%s, recipients=%s, client_address=%s, id=%s)", 
+                                  get_class($this), $this->_sender, 
+                                  join(', ',$this->_recipients), 
+                                  $this->_client_address, $this->_id),
+                          __FILE__, __LINE__, PEAR_LOG_INFO);
+    }
+
+    /**
+     * Creates a buffer for temporary storage of the message.
+     *
+     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
+     */
+    function _initTmp()
+    {
+        global $conf;
+
+        if (isset($conf['kolab']['filter']['tempdir'])) {
+            $tmpdir = $conf['kolab']['filter']['tempdir'];
+        } else {
+            $tmpdir = Horde::getTempDir();
+        }
+
+        /* Temp file for storing the message */
+        $this->_tmpfile = @tempnam($tmpdir, 'IN.' . get_class($this) . '.');
+        $this->_tmpfh = @fopen($this->_tmpfile, "w");
+        if( !$this->_tmpfh ) {
+            $msg = $php_errormsg;
+            return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
+                                            $this->_tmpfile, $msg),
+                                    OUT_LOG | EX_IOERR);
+        }
+
+        register_shutdown_function(array($this, '_cleanupTmp'));
+    }
+
+    /**
+     * A shutdown function for removing the temporary file.
+     */
+    function _cleanupTmp() {
+        if (@file_exists($this->_tmpfile)) {
+            @unlink($this->_tmpfile);
+        }
+    }
+
+    /**
+     * Parse the command line arguments provided to the filter and
+     * setup the class.
+     *
+     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
+     */
+    function _parseArgs()
+    {
+        global $conf;
+
+        /* Get command line options. */
+        $p = new Horde_Kolab_Filter_Argv_Parser(
+            array('optionList' =>
+                  array(
+                      new Horde_Argv_Option('-s',
+                                            '--sender',
+                                            array('help' => 'The message sender.',
+                                                  'type' => 'string',
+                                                  'nargs' => 1)),
+                      new Horde_Argv_Option('-r',
+                                            '--recipient',
+                                            array('help' => 'A message recipient.',
+                                                  'action' => 'append',
+                                                  'type' => 'string')),
+                      new Horde_Argv_Option('-H',
+                                            '--host',
+                                            array('help' => 'The host running this script.')),
+                      new Horde_Argv_Option('-c',
+                                            '--client',
+                                            array('help' => 'The client sending the message.')),
+                      new Horde_Argv_Option('-u',
+                                            '--user',
+                                            array('help' => 'ID of the currently authenticated user.',
+                                                  'default' => '')),
+                      new Horde_Argv_Option('-C',
+                                            '--config',
+                                            array('help' => 'Path to the configuration file for this filter.'))
+                  )));
+
+        try {
+            list($values, $args) = $p->parseArgs();
+        } catch (InvalidArgumentException $e) {
+            $msg = $e->getMessage() . "\n\n" . $p->getUsage();
+            return PEAR::raiseError($msg, OUT_STDOUT | EX_USAGE);
+        }
+
+        if (!empty($values['config']) && file_exists($values['config'])) {
+            require_once $values['config'];
+        }
+
+        if (empty($values['recipient'])) {
+            $msg = 'Please provide one or more recipients.' 
+                . "\n\n" . $p->getUsage();
+            return PEAR::raiseError($msg, OUT_STDOUT | EX_USAGE);
+        }
+
+        $this->_sender = strtolower($values['sender']);
+        $this->_recipients = array_map('strtolower', $values['recipient']);
+        $this->_client_address = $values['client'];
+        $this->_fqhostname = strtolower($values['host']);
+        $this->_sasl_username = strtolower($values['user']);
+
+        Horde::logMessage(sprintf("Arguments: %s", print_r($values, true)),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        require_once 'Horde/NLS.php';
+        NLS::setCharset('utf-8');
+
+        if (!empty($conf['kolab']['filter']['locale_path'])
+            && !empty($conf['kolab']['filter']['locale'])) {
+            NLS::setTextdomain('Kolab_Filter', $conf['kolab']['filter']['locale_path'], NLS::getCharset());
+            setlocale(LC_ALL, $conf['kolab']['filter']['locale']);
+        }
+
+        /* This is used as the default domain for unqualified adresses */
+        global $_SERVER;
+        if (!array_key_exists('SERVER_NAME', $_SERVER)) {
+            $_SERVER['SERVER_NAME'] = $conf['kolab']['imap']['server'];
+        }
+
+        if (!array_key_exists('REMOTE_ADDR', $_SERVER)) {
+            $_SERVER['REMOTE_ADDR'] = $conf['kolab']['imap']['server'];
+        }
+
+        if (!array_key_exists('REMOTE_HOST', $_SERVER)) {
+            $_SERVER['REMOTE_HOST'] = $conf['kolab']['imap']['server'];
+        }
+
+        /* Always display all possible problems */
+        ini_set('error_reporting', E_ALL);
+        ini_set('track_errors', '1');
+
+        /* Setup error logging */
+        if (isset($conf['kolab']['filter']['error_log'])) {
+            ini_set('log_errors', '1');
+            ini_set('error_log', $conf['kolab']['filter']['error_log']);
+        }
+
+        /* Print PHP messages to StdOut if we are debugging */
+        if (isset($conf['kolab']['filter']['debug'])
+            && $conf['kolab']['filter']['debug']) {
+            ini_set('display_errors', '1');
+        }
+
+        /* Provide basic syslog debugging if nothing has been
+         * specified
+         */
+        if (!isset($conf['log'])) {
+            $conf['log']['enabled']          = true;
+            $conf['log']['priority']         = PEAR_LOG_DEBUG;
+            $conf['log']['type']             = 'syslog';
+            $conf['log']['name']             = LOG_MAIL;
+            $conf['log']['ident']            = 'kolabfilter';
+            $conf['log']['params']           = array();
+        }
+    }
+}
+
+class Horde_Kolab_Filter_Argv_Parser extends Horde_Argv_Parser 
+{
+    public function parserError($msg)
+    {
+        throw new InvalidArgumentException(sprintf("%s: error: %s\n", $this->getProgName(), $msg));
+    }
+
+    public function parserExit($status = 0, $msg = null)
+    {
+        throw new InvalidArgumentException(sprintf("%s: error: %s\n", $this->getProgName(), $msg));
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Content.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Content.php
new file mode 100644
index 0000000..0b20aa5
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Content.php
@@ -0,0 +1,461 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php,v 1.4.2.7 2009-11-16 21:05:49 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/** Load the basic filter definition */
+require_once dirname(__FILE__) . '/Base.php';
+
+/** Load the Transport library */
+require_once dirname(__FILE__) . '/Transport.php';
+
+define('RM_STATE_READING_HEADER', 1 );
+define('RM_STATE_READING_FROM',   2 );
+define('RM_STATE_READING_SUBJECT',3 );
+define('RM_STATE_READING_SENDER', 4 );
+define('RM_STATE_READING_BODY',   5 );
+
+/**
+ * A Kolab Server filter for outgoing mails.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php,v 1.4.2.7 2009-11-16 21:05:49 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Content extends Horde_Kolab_Filter_Base
+{
+    /**
+     * Handle the message.
+     *
+     * @param int    $inh  The file handle pointing to the message.
+     * @param string $transport  The name of the transport driver.
+     *
+     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
+     */
+    function _parse($inh, $transport)
+    {
+        global $conf;
+
+        $result = $this->init();
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        if (isset($conf['kolab']['filter']['verify_from_header'])) {
+            $verify_from_header = $conf['kolab']['filter']['verify_from_header'];
+        } else {
+            $verify_from_header = false;
+        }
+
+        if (isset($conf['kolab']['filter']['allow_sender_header'])) {
+            $allow_sender_header = $conf['kolab']['filter']['allow_sender_header'];
+        } else {
+            $allow_sender_header = false;
+        }
+
+        if (isset($conf['kolab']['filter']['allow_outlook_ical_forward'])) {
+            $allow_outlook_ical_forward = $conf['kolab']['filter']['allow_outlook_ical_forward'];
+        } else {
+            $allow_outlook_ical_forward = true;
+        }
+
+        if (empty($transport)) {
+            $transport = 'smtp';
+        }
+
+        $ical = false;
+        $from = false;
+        $subject = false;
+        $senderok = true;
+        $rewrittenfrom = false;
+        $state = RM_STATE_READING_HEADER;
+
+        while (!feof($inh) && $state != RM_STATE_READING_BODY) {
+
+            $buffer = fgets($inh, 8192);
+            $line = rtrim($buffer, "\r\n");
+
+            if ($line == '') {
+                /* Done with headers */
+                $state = RM_STATE_READING_BODY;
+                if ($from && $verify_from_header) {
+                    $rc = $this->_verify_sender($this->_sasl_username, $this->_sender, 
+                                                $from, $this->_client_address);
+                    if (is_a($rc, 'PEAR_Error')) {
+                        return $rc;
+                    } else if ($rc === true) {
+                        /* All OK, do nothing */
+                    } else if ($rc === false) {
+                        /* Reject! */
+                        $senderok = false;
+                    } else if (is_string($rc)) {
+                        /* Rewrite from */
+                        if (strpos($from, $rc) === false) {
+                            Horde::logMessage(sprintf("Rewriting '%s' to '%s'",
+                                                      $from, $rc), 
+                                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                            $rewrittenfrom = "From: $rc\r\n";
+                        }
+                    }
+                }
+            } else {
+                if ($line[0] != ' ' && $line[0] != "\t") {
+                    $state = RM_STATE_READING_HEADER;
+                }
+                switch( $state ) {
+                case RM_STATE_READING_HEADER:
+                    if ($allow_sender_header &&
+                        eregi('^Sender: (.*)', $line, $regs)) {
+                        $from = $regs[1];
+                        $state = RM_STATE_READING_SENDER;
+                    } else if (!$from && eregi('^From: (.*)', $line, $regs)) {
+                        $from = $regs[1];
+                        $state = RM_STATE_READING_FROM;
+                    } else if (eregi('^Subject: (.*)', $line, $regs)) {
+                        $subject = $regs[1];
+                        $state = RM_STATE_READING_SUBJECT;
+                    } else if (eregi('^Content-Type: text/calendar', $line)) {
+                        Horde::logMessage("Found iCal data in message",
+                                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                        $ical = true;
+                    } else if (eregi('^Message-ID: (.*)', $line, $regs)) {
+                        $this->_id = $regs[1];
+                    }
+                    break;
+                case RM_STATE_READING_FROM:
+                    $from .= $line;
+                    break;
+                case RM_STATE_READING_SENDER:
+                    $from .= $line;
+                    break;
+                case RM_STATE_READING_SUBJECT:
+                    $subject .= $line;
+                    break;
+                }
+            }
+            if (@fwrite($this->_tmpfh, $buffer) === false) {
+                $msg = $php_errormsg;
+                return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
+                                                $this->_tmpfile, $msg),
+                                        OUT_LOG | EX_IOERR);
+            }
+        }
+        while (!feof($inh)) {
+            $buffer = fread($inh, 8192);
+            if (@fwrite($this->_tmpfh, $buffer) === false) {
+                $msg = $php_errormsg;
+                return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
+                                                $this->_tmpfile, $msg),
+                                        OUT_LOG | EX_IOERR);
+            }
+        }
+
+        if (@fclose($this->_tmpfh) === false) {
+            $msg = $php_errormsg;
+            return PEAR::raiseError(sprintf("Error: Failed closing %s: %s",
+                                            $this->_tmpfile, $msg),
+                                    OUT_LOG | EX_IOERR);
+        }
+
+        if (!$senderok) {
+            if ($ical && $allow_outlook_ical_forward ) {
+                require_once(dirname(__FILE__) . '/Outlook.php');
+                $rc = Kolab_Filter_Outlook::embedICal($this->_fqhostname,
+                                                      $this->_sender,
+                                                      $this->_recipients,
+                                                      $from, $subject,
+                                                      $this->_tmpfile,
+                                                      $transport);
+                if (is_a($rc, 'PEAR_Error')) {
+                    return $rc;
+                } else if ($rc === true) {
+                    return;
+                }
+            } else {
+                return PEAR::raiseError(sprintf("Invalid From: header. %s looks like a forged sender",
+                                                $from),
+                                        OUT_LOG | OUT_STDOUT | EX_NOPERM);
+            }
+        }
+
+        $result = $this->_deliver($rewrittenfrom, $transport);
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+    }
+
+    /**
+     * Deliver the message.
+     *
+     * @param string $transport  The name of the transport driver.
+     *
+     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
+     */
+    function _deliver($rewrittenfrom, $transport)
+    {
+        global $conf;
+
+        if (isset($conf['kolab']['filter']['smtp_host'])) {
+            $host = $conf['kolab']['filter']['smtp_host'];
+        } else {
+            $host = 'localhost';
+        }
+        if (isset($conf['kolab']['filter']['smtp_port'])) {
+            $port = $conf['kolab']['filter']['smtp_port'];
+        } else {
+            $port = 10025;
+        }
+
+        $transport = &Horde_Kolab_Filter_Transport::factory($transport, 
+                                               array('host' => $host, 
+                                                     'port' => $port));
+
+        $tmpf = @fopen($this->_tmpfile, 'r');
+        if (!$tmpf) {
+            $msg = $php_errormsg;
+            return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
+                                            $this->_tmpfile, $msg),
+                                    OUT_LOG | EX_IOERR);
+        }
+
+        $result = $transport->start($this->_sender, $this->_recipients);
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        $state = RM_STATE_READING_HEADER;
+        while (!feof($tmpf) && $state != RM_STATE_READING_BODY) {
+            $buffer = fgets($tmpf, 8192);
+            if ($rewrittenfrom) {
+                if (eregi( '^From: (.*)', $buffer)) {
+                    $result = $transport->data($rewrittenfrom);
+                    if (is_a($result, 'PEAR_Error')) {
+                        return $result;
+                    }
+                    $state = RM_STATE_READING_FROM;
+                    continue;
+                } else if ($state == RM_STATE_READING_FROM &&
+                           ($buffer[0] == ' ' || $buffer[0] == "\t")) {
+                    /* Folded From header, ignore */
+                    continue;
+                }
+            }
+            if (rtrim($buffer, "\r\n") == '') {
+                $state = RM_STATE_READING_BODY;
+            } else if ($buffer[0] != ' ' && $buffer[0] != "\t")  {
+                $state = RM_STATE_READING_HEADER;
+            }
+            $result = $transport->data($buffer);
+            if (is_a($result, 'PEAR_Error')) {
+                return $result;
+            }
+        }
+        while (!feof($tmpf)) {
+            $buffer = fread($tmpf, 8192);
+            $len = strlen($buffer);
+
+            /* We can't tolerate that the buffer breaks the data
+             * between \r and \n, so we try to avoid that. The limit
+             * of 100 reads is to battle abuse
+             */
+            while ($buffer{$len-1} == "\r" && $len < 8192 + 100) {
+                $buffer .= fread($tmpf,1);
+                $len++;
+            }
+            $result = $transport->data($buffer);
+            if (is_a($result, 'PEAR_Error')) {
+                return $result;
+            }
+        }
+        return $transport->end();
+    }
+
+    /**
+     * Check that the From header is not trying to impersonate a valid
+     * user that is not $sasluser.
+     *
+     * @param string $sasluser    The current, authenticated user.
+     * @param string $sender      Sender address
+     * @param string $fromhdr     From header
+     * @param string $client_addr Client IP
+     *
+     * @return mixed A PEAR_Error in case of an error, true if From
+     *               can be accepted, false if From must be rejected,
+     *               or a string with a corrected From header that
+     *               makes From acceptable
+     */
+    function _verify_sender($sasluser, $sender, $fromhdr, $client_addr) {
+
+        global $conf;
+
+        if (isset($conf['kolab']['filter']['email_domain'])) {
+            $domains = $conf['kolab']['filter']['email_domain'];
+        } else {
+            $domains = 'localhost';
+        }
+
+        if (!is_array($domains)) {
+            $domains = array($domains);
+        }
+
+        if (isset($conf['kolab']['filter']['local_addr'])) {
+            $local_addr = $conf['kolab']['filter']['local_addr'];
+        } else {
+            $local_addr = '127.0.0.1';
+        }
+
+        if (empty($client_addr)) {
+            $client_addr = $local_addr;
+        }
+
+        if (isset($conf['kolab']['filter']['verify_subdomains'])) {
+            $verify_subdomains = $conf['kolab']['filter']['verify_subdomains'];
+        } else {
+            $verify_subdomains = true;
+        }
+
+        if (isset($conf['kolab']['filter']['reject_forged_from_header'])) {
+            $reject_forged_from_header = $conf['kolab']['filter']['reject_forged_from_header'];
+        } else {
+            $reject_forged_from_header = false;
+        }
+
+        if (isset($conf['kolab']['filter']['kolabhosts'])) {
+            $kolabhosts = $conf['kolab']['filter']['kolabhosts'];
+        } else {
+            $kolabhosts = 'localhost';
+        }
+
+        if (isset($conf['kolab']['filter']['privileged_networks'])) {
+            $privnetworks = $conf['kolab']['filter']['privileged_networks'];
+        } else {
+            $privnetworks = '127.0.0.0/8';
+        }
+
+        /* Allow anything from localhost and
+         * fellow Kolab-hosts 
+         */
+        if ($client_addr == $local_addr) {
+            return true;
+        }
+
+        $kolabhosts = split(',', $kolabhosts);
+        $kolabhosts = array_map('gethostbyname', $kolabhosts );
+
+        $privnetworks = split(',', $privnetworks);
+
+        if (array_search($client_addr, $kolabhosts) !== false) {
+            return true;
+        }
+
+        foreach ($privnetworks as $network) {
+
+            $iplong = ip2long($client_addr);
+            $cidr = explode("/", $network);
+            $netiplong = ip2long($cidr[0]);
+            if (count($cidr) == 2) {
+                $iplong = $iplong & (0xffffffff << 32 - $cidr[1]);
+                $netiplong = $netiplong & (0xffffffff << 32 - $cidr[1]);
+            }
+
+            if ($iplong == $netiplong) {
+                return true;
+            }
+        }
+
+        if ($sasluser) {
+            /* Load the Server library */
+            require_once 'Horde/Kolab/Server.php';
+
+            $server = &Horde_Kolab_Server::singleton();
+            if (is_a($server, 'PEAR_Error')) {
+                $server->code = OUT_LOG | EX_TEMPFAIL;
+                return $server;
+            }
+
+            $allowed_addrs = $server->addrsForIdOrMail($sasluser);
+            if (is_a($allowed_addrs, 'PEAR_Error')) {
+                $allowed_addrs->code = OUT_LOG | EX_NOUSER;
+                return $allowed_addrs;
+            }
+        } else {
+            $allowed_addrs = false;
+        }
+
+        if ($sasluser) {
+            if (isset($conf['kolab']['filter']['untrusted_subject_insert'])) {
+                $fmt = $conf['kolab']['filter']['untrusted_subject_insert'];
+            } else {
+                $fmt = _("(UNTRUSTED, sender is <%s>)");
+            }
+        } else {
+            if (isset($conf['kolab']['filter']['unauthenticated_subject_insert'])) {
+                $fmt = $conf['kolab']['filter']['unauthenticated_subject_insert'];
+            } else {
+                $fmt = _("(UNTRUSTED, sender <%s> is not authenticated)");
+            }
+        }
+        $untrusted = sprintf($fmt, $sender);
+
+        $adrs = imap_rfc822_parse_adrlist($fromhdr, $domains[0]);
+
+        foreach ($adrs as $adr) {
+            $from = $adr->mailbox . '@' . $adr->host;
+            $fromdom = $adr->host;
+
+            if ($sasluser) {
+                if (!in_array(strtolower($from), $allowed_addrs)) {
+                    Horde::logMessage(sprintf("%s is not an allowed From address for %s", 
+                                              $from, $sasluser), __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                    return false;
+                }
+            } else {
+                foreach ($domains as $domain) {
+                    if (strtolower($fromdom) == $domain 
+                        || ($verify_subdomains
+                            && substr($fromdom, -strlen($domain)-1) == ".$domain")) {
+                        if ($reject_forged_from_header) {
+                            Horde::logMessage(sprintf("%s is not an allowed From address for unauthenticated users.", 
+                                                      $from), __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                            return false;
+                        } else {
+                            require_once 'Horde/String.php';
+                            require_once 'Horde/MIME.php';
+
+                            /* Rewrite */
+                            Horde::logMessage(sprintf("%s is not an allowed From address for unauthenticated users, rewriting.", 
+                                                      $from), __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                            if (strpos( $fromhdr, $untrusted )===false) {
+                                if (property_exists($adr, 'personal')) {
+                                    $name = str_replace(array("\\", '"'), 
+                                                        array("\\\\",'\"'), 
+                                                        MIME::decode($adr->personal, 'utf-8'));
+                                } else {
+                                    $name = '';
+                                }
+                                $new_from = '"' . MIME::encode($name . ' ' . $untrusted) . '"';
+                                return  $new_from . ' <' . $from . '>';
+                            } else {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        /* All seems OK */
+        return true;
+    }
+}
+
+?>
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Incoming.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Incoming.php
new file mode 100644
index 0000000..24b880c
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Incoming.php
@@ -0,0 +1,304 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Incoming.php,v 1.6.2.4 2009-11-16 19:59:30 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/** Load the basic filter definition */
+require_once dirname(__FILE__) . '/Base.php';
+
+/** Load the Transport library */
+require_once dirname(__FILE__) . '/Transport.php';
+
+/**
+ * A Kolab Server filter for incoming mails that are parsed for iCal
+ * contents.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Incoming.php,v 1.6.2.4 2009-11-16 19:59:30 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Incoming extends Horde_Kolab_Filter_Base
+{
+
+    /**
+     * An array of headers to be added to the message
+     *
+     * @var array
+     */
+    var $_add_headers;
+
+    /**
+     * Handle the message.
+     *
+     * @param int    $inh        The file handle pointing to the message.
+     * @param string $transport  The name of the transport driver.
+     *
+     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
+     */
+    function _parse($inh, $transport)
+    {
+        global $conf;
+
+        $result = $this->init();
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        if (empty($transport)) {
+            if (isset($conf['kolab']['filter']['delivery_backend'])) {
+                $transport = $conf['kolab']['filter']['delivery_backend'];
+            } else {
+                $transport = 'lmtp';
+            }
+        }
+
+        $ical = false;
+        $add_headers = array();
+        $headers_done = false;
+
+        /* High speed section START */
+        $headers_done = false;
+        while (!feof($inh) && !$headers_done) {
+            $buffer = fgets($inh, 8192);
+            $line = rtrim( $buffer, "\r\n");
+            if ($line == '') {
+                /* Done with headers */
+                $headers_done = true;
+            } else if (eregi('^Content-Type: text/calendar', $line)) {
+                Horde::logMessage("Found iCal data in message", 
+                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                $ical = true;
+            } else if (eregi('^Message-ID: (.*)', $line, $regs)) {
+                $this->_id = $regs[1];
+            }
+            if (@fwrite($this->_tmpfh, $buffer) === false) {
+                $msg = $php_errormsg;
+                return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
+                                                $this->_tmpfile, $msg),
+                                        OUT_LOG | EX_IOERR);
+            }
+        }
+
+        if ($ical) {
+            /* iCal already identified. So let's just pipe the rest of
+             * the message through.
+             */
+            while (!feof($inh)) {
+                $buffer = fread($inh, 8192);
+                if (@fwrite($this->_tmpfh, $buffer) === false) {
+                    $msg = $php_errormsg;
+                    return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
+                                                    $this->_tmpfile, $msg),
+                                            OUT_LOG | EX_IOERR);
+                }
+            }
+        } else {
+            /* No ical yet? Let's try to identify the string
+             * "text/calendar". It's likely that we have a mime
+             * multipart message including iCal then.
+             */
+            while (!feof($inh)) {
+                $buffer = fread($inh, 8192);
+                if (@fwrite($this->_tmpfh, $buffer) === false) {
+                    $msg = $php_errormsg;
+                    return PEAR::raiseError(sprintf("Error: Could not write to %s: %s",
+                                                    $this->_tmpfile, $msg),
+                                            OUT_LOG | EX_IOERR);
+                }
+                if (strpos($buffer, 'text/calendar')) {
+                    $ical = true;
+                }
+            }
+        }
+        /* High speed section END */
+
+        if (@fclose($this->_tmpfh) === false) {
+            $msg = $php_errormsg;
+            return PEAR::raiseError(sprintf("Error: Failed closing %s: %s",
+                                            $this->_tmpfile, $msg),
+                                    OUT_LOG | EX_IOERR);
+        }
+
+        if ($ical) {
+            require_once 'Horde/Kolab/Resource.php';
+            $newrecips = array();
+            foreach ($this->_recipients as $recip) {
+                if (strpos($recip, '+')) {
+                    list($local, $rest)  = explode('+', $recip, 2);
+                    list($rest, $domain) = explode('@', $recip, 2);
+                    $resource = $local . '@' . $domain;
+                } else {
+                    $resource = $recip;
+                }
+                Horde::logMessage(sprintf("Calling resmgr_filter(%s, %s, %s, %s)",
+                                          $this->_fqhostname, $this->_sender,
+                                          $resource, $this->_tmpfile), __FILE__, __LINE__,
+                                  PEAR_LOG_DEBUG);
+                $r = &new Kolab_Resource();
+                $rc = $r->handleMessage($this->_fqhostname, $this->_sender,
+                                        $resource, $this->_tmpfile);
+                $r->cleanup();
+                if (is_a($rc, 'PEAR_Error')) {
+                    return $rc;
+                } else if ($rc === true) {
+                    $newrecips[] = $resource;
+                }
+            }
+            $this->_recipients = $newrecips;
+            $this->_add_headers[] = 'X-Kolab-Scheduling-Message: TRUE';
+        } else {
+            $this->_add_headers[] = 'X-Kolab-Scheduling-Message: FALSE';
+        }
+
+        /* Check if we still have recipients */
+        if (empty($this->_recipients)) {
+            Horde::logMessage("No recipients left.", 
+                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+            return;
+        } else {
+            $result = $this->_deliver($transport);
+            if (is_a($result, 'PEAR_Error')) {
+                return $result;
+            }
+        }
+
+        Horde::logMessage("Filter_Incoming successfully completed.", 
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+    }
+
+    /**
+     * Deliver the message.
+     *
+     * @param string $transport  The name of the transport driver.
+     *
+     * @return mixed A PEAR_Error in case of an error, nothing otherwise.
+     */
+    function _deliver($transport)
+    {
+        global $conf;
+
+        if (isset($conf['kolab']['filter']['lmtp_host'])) {
+            $host = $conf['kolab']['filter']['lmtp_host'];
+        } else {
+            $host = 'localhost';
+        }
+        if (isset($conf['kolab']['filter']['lmtp_port'])) {
+            $port = $conf['kolab']['filter']['lmtp_port'];
+        } else {
+            $port = 2003;
+        }
+
+        /* Load the LDAP library */
+        require_once 'Horde/Kolab/Server.php';
+
+        $server = &Horde_Kolab_Server::singleton();
+        if (is_a($server, 'PEAR_Error')) {
+            $server->code = OUT_LOG | EX_TEMPFAIL;
+            return $server;
+        }
+
+        $hosts = array();
+        foreach ($this->_recipients as $recipient) {
+            if (strpos($recipient, '+')) {
+                list($local, $rest)  = explode('+', $recipient, 2);
+                list($rest, $domain) = explode('@', $recipient, 2);
+                $real_recipient = $local . '@' . $domain;
+            } else {
+                $real_recipient = $recipient;
+            }
+            $dn = $server->uidForIdOrMail($real_recipient);
+            if (is_a($dn, 'PEAR_Error')) {
+                return $dn;
+            }
+            if (!$dn) {
+                Horde::logMessage(sprintf('User %s does not exist!', $real_recipient), 
+                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
+            }
+            $user = $server->fetch($dn, KOLAB_OBJECT_USER);
+            if (is_a($user, 'PEAR_Error')) {
+                $user->code = OUT_LOG | EX_TEMPFAIL;
+                return $user;
+            }
+            $imapserver = $user->get(KOLAB_ATTR_IMAPHOST);
+            if (is_a($imapserver, 'PEAR_Error')) {
+                $imapserver->code = OUT_LOG | EX_TEMPFAIL;
+                return $imapserver;
+            }
+            if (!empty($imapserver)) {
+                $uhost = $imapserver;
+            } else {
+                $uhost = $host;
+            }
+            $hosts[$uhost][] = $recipient;
+        }
+
+        foreach (array_keys($hosts) as $imap_host) {
+            $params =  array('host' => $imap_host, 'port' => $port);
+            if ($imap_host != $host) {
+                $params['user'] = $conf['kolab']['filter']['lmtp_user'];
+                $params['pass'] = $conf['kolab']['filter']['lmtp_pass'];
+            }
+            $transport = &Horde_Kolab_Filter_Transport::factory($transport, $params);
+
+            $tmpf = @fopen($this->_tmpfile, 'r');
+            if (!$tmpf) {
+                $msg = $php_errormsg;
+                return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
+                                                $this->_tmpfile, $msg),
+                                        OUT_LOG | EX_IOERR);
+            }
+
+            $result = $transport->start($this->_sender, $hosts[$imap_host]);
+            if (is_a($result, 'PEAR_Error')) {
+                return $result;
+            }
+
+            $headers_done = false;
+            while (!feof($tmpf) && !$headers_done) {
+                $buffer = fgets($tmpf, 8192);
+                if (!$headers_done && rtrim($buffer, "\r\n") == '') {
+                    $headers_done = true;
+                    foreach ($this->_add_headers as $h) {
+                        $result = $transport->data("$h\r\n");
+                        if (is_a($result, 'PEAR_Error')) {
+                            return $result;
+                        }
+                    }
+                }
+                $result = $transport->data($buffer);
+                if (is_a($result, 'PEAR_Error')) {
+                    return $result;
+                }
+            }
+
+            while (!feof($tmpf)) {
+                $buffer = fread($tmpf, 8192);
+                $len = strlen($buffer);
+
+                /* We can't tolerate that the buffer breaks the data
+                 * between \r and \n, so we try to avoid that. The limit
+                 * of 100 reads is to battle abuse
+                 */
+                while ($buffer{$len-1} == "\r" && $len < 8192 + 100) {
+                    $buffer .= fread($tmpf, 1);
+                    $len++;
+                }
+                $result = $transport->data($buffer);
+                if (is_a($result, 'PEAR_Error')) {
+                    return $result;
+                }
+            }
+            return $transport->end();
+        }
+    }
+}
+?>
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Outlook.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Outlook.php
new file mode 100644
index 0000000..190b4d7
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Outlook.php
@@ -0,0 +1,274 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Outlook.php,v 1.3.2.4 2009-03-06 08:43:13 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/* Load the iCal handling */
+require_once 'Horde/iCalendar.php';
+
+/* Load MIME handlers */
+require_once 'Horde/MIME.php';
+require_once 'Horde/MIME/Message.php';
+require_once 'Horde/MIME/Headers.php';
+require_once 'Horde/MIME/Part.php';
+require_once 'Horde/MIME/Structure.php';
+
+/**
+ * Provides Mail rewriting for malformed Outlook messages
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Outlook.php,v 1.3.2.4 2009-03-06 08:43:13 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Kolab_Filter_Outlook
+{
+
+    /**
+     * Returns a parsed MIME message
+     *
+     * @param string $text   The text of the message
+     *
+     * @return array An array with the MIME parsed headers and body.
+     */
+    function _mimeParse(&$text)
+    {
+        /* Taken from Horde's MIME/Structure.php */
+        require_once 'Mail/mimeDecode.php';
+
+        /* Set up the options for the mimeDecode class. */
+        $decode_args = array();
+        $decode_args['include_bodies'] = true;
+        $decode_args['decode_bodies'] = false;
+        $decode_args['decode_headers'] = false;
+
+        $mimeDecode = &new Mail_mimeDecode($text, MIME_PART_EOL);
+        if (!($structure = $mimeDecode->decode($decode_args))) {
+            return false;
+        }
+
+        /* Put the object into imap_parsestructure() form. */
+        MIME_Structure::_convertMimeDecodeData($structure);
+
+        return array($structure->headers, $ret = &MIME_Structure::parse($structure));
+    }
+
+    /**
+     * Add a header entry.
+     *
+     * @param string        $name        The name of the header entry.
+     * @param MIME_Headers  $msg_header  A link to the MIME header handler.
+     * @param array         $headerarray The list of current headers.
+     */
+    function _copyHeader($name, &$msg_headers, &$headerarray)
+    {
+        $lname = strtolower($name);
+        if (array_key_exists($lname, $headerarray)) {
+            if (is_array($headerarray[$lname])) {
+                foreach ($headerarray[$lname] as $h) {
+                    $msg_headers->addHeader($name, $h);	
+                }
+            } else {
+                $msg_headers->addHeader($name, $headerarray[$lname]);
+            }
+        }
+    }
+
+    /**
+     * Yet another problem: Outlook seems to remove the organizer from
+     * the iCal when forwarding -- we put the original sender back in
+     * as organizer.
+     *
+     * @param string        $icaltext  The ical message.
+     * @param MIME_Headers  $from      The message sender.
+     */
+    function _addOrganizer(&$icaltxt, $from)
+    {
+        global $conf;
+
+        if (isset($conf['kolab']['filter']['email_domain'])) {
+            $email_domain = $conf['kolab']['filter']['email_domain'];
+        } else {
+            $email_domain = 'localhost';
+        }
+
+        $iCal = &new Horde_iCalendar();
+        $iCal->parsevCalendar($icaltxt);
+        $vevent =& $iCal->findComponent('VEVENT');
+        if ($vevent) {
+            $organizer = $vevent->getAttribute('ORGANIZER', true);
+            if (is_a($organizer, 'PEAR_Error')) {
+                $adrs = imap_rfc822_parse_adrlist($from, $email_domain);
+                if (count($adrs) > 0) {
+                    $org_email = 'mailto:'.$adrs[0]->mailbox.'@'.$adrs[0]->host;
+                    $org_name  = $adrs[0]->personal;
+                    if ($org_name) {
+                        $vevent->setAttribute('ORGANIZER', $org_email, 
+                                              array( 'CN' => $org_name), false);
+                    } else {
+                        $vevent->setAttribute('ORGANIZER', $org_email, 
+					    array(), false);
+                    }
+                    Horde::logMessage(sprintf("Adding missing organizer '%s <%s>' to iCal.",
+                                              $org_name, $org_email), 
+                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                    $icaltxt = $iCal->exportvCalendar();
+                }
+            }
+        }
+    }
+
+    /**
+     * Yet another Outlook problem: Some versions of Outlook seems to be incapable
+     * of handling non-ascii characters properly in text/calendar parts of
+     * a multi-part/mixed mail which we use for forwarding.
+     * As a solution, we encode common characters as humanreadable
+     * two-letter ascii.
+     *
+     * @param string  $text  The message text.
+     *
+     * @return string The text with umlauts replaced.
+     */
+    function _recodeToAscii( $text ) {
+        $text = str_replace( ('æ'), 'ae', $text );
+        $text = str_replace( ('ø'), 'oe', $text );
+        $text = str_replace( ('Ã¥'), 'aa', $text );
+        $text = str_replace( ('ä'), 'ae', $text );
+        $text = str_replace( ('ö'), 'oe', $text );
+        $text = str_replace( ('ü'), 'ue', $text );
+        $text = str_replace( ('ß'), 'ss', $text );
+
+        $text = str_replace( ('Æ'), 'Ae', $text );
+        $text = str_replace( ('Ø'), 'Oe', $text );
+        $text = str_replace( ('Ã…'), 'Aa', $text );
+        $text = str_replace( ('Ä'), 'Ae', $text );
+        $text = str_replace( ('Ö'), 'Oe', $text );
+        $text = str_replace( ('Ü'), 'Ue', $text );
+
+        return $text;
+    }
+
+    /**
+     * Clean up iCal messages from Outlook.
+     *
+     * @param string  $fqhostname  The name of this host.
+     * @param string  $sender      The mail address of the sender.
+     * @param array   $recipients  The recipients of the message.
+     * @param string  $origfrom    The mail address of the original sender.
+     * @param string  $subject     The mail subject.
+     * @param string  $tmpfname    Path to the temporary message store.
+     *
+     * @return boolena|PEAR_Error True if the message was successfully rewritten.
+     */
+    function embedICal($fqhostname, $sender, $recipients, $origfrom, $subject,
+		       $tmpfname, $transport)
+    {
+        Horde::logMessage(sprintf("Encapsulating iCal message forwarded by %s", $sender), 
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        $forwardtext = "This is an invitation forwarded by outlook and\n".
+            "was rectified by the Kolab server.\n".
+            "The invitation was originally sent by\n%s.\n\n".
+            "Diese Einladung wurde von Outlook weitergeleitet\n".
+            "und vom Kolab-Server in gute Form gebracht.\n".
+            "Die Einladung wurde ursprünglich von\n%s geschickt.\n";
+
+        // Read in message text
+        $requestText = '';
+        $handle = @fopen($tmpfname, "r");
+        if ($handle === false) {
+            $msg = $php_errormsg;
+            return PEAR::raiseError(sprintf("Error: Could not open %s for writing: %s",
+                                            $tmpfname, $msg),
+                                    OUT_LOG | EX_IOERR);
+        }
+        while (!feof($handle)) {
+            $requestText .= fread($handle, 8192);
+        }
+        fclose($handle);
+
+        // Parse existing message
+        list( $headers, $mime) = Kolab_Filter_Outlook::_mimeParse($requestText);
+        $parts = $mime->contentTypeMap();
+        if (count($parts) != 1 || $parts[1] != 'text/calendar') {
+            Horde::logMessage("Message does not contain exactly one toplevel text/calendar part, passing through.", 
+                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+            return false;
+        }
+        $basepart = $mime->getBasePart();
+
+        // Construct new MIME message with original message attached
+        $toppart = &new MIME_Message();
+        $dorigfrom = Mail_mimeDecode::_decodeHeader($origfrom);
+        $textpart = &new MIME_Part('text/plain', sprintf($forwardtext,$dorigfrom,$dorigfrom), 'UTF-8' );
+        $ical_txt = $basepart->transferDecode();
+        Kolab_Filter_Outlook::_addOrganizer($ical_txt, $dorigfrom);
+        $msgpart = &new MIME_Part($basepart->getType(), Kolab_Filter_Outlook::_recodeToAscii($ical_txt), 
+                                  $basepart->getCharset() );
+
+        $toppart->addPart($textpart);
+        $toppart->addPart($msgpart);
+
+        // Build the reply headers.
+        $msg_headers = &new MIME_Headers();
+        Kolab_Filter_Outlook::_copyHeader( 'Received', $msg_headers, $headers );
+        //$msg_headers->addReceivedHeader();
+        $msg_headers->addMessageIdHeader();
+        Kolab_Filter_Outlook::_copyHeader( 'Date', $msg_headers, $headers );
+        Kolab_Filter_Outlook::_copyHeader( 'Resent-Date', $msg_headers, $headers );
+        Kolab_Filter_Outlook::_copyHeader( 'Subject', $msg_headers, $headers );
+        $msg_headers->addHeader('From', $sender);
+        $msg_headers->addHeader('To', join(', ', $recipients));
+        $msg_headers->addHeader('X-Kolab-Forwarded', 'TRUE');
+        $msg_headers->addMIMEHeaders($toppart);
+        Kolab_Filter_Outlook::_copyHeader( 'Content-Transfer-Encoding', $msg_headers, $headers );
+
+        if (is_object($msg_headers)) {
+            $headerArray = $toppart->encode($msg_headers->toArray(), $toppart->getCharset());
+        } else {
+            $headerArray = $toppart->encode($msg_headers, $toppart->getCharset());
+        }
+
+        return Kolab_Filter_Outlook::_inject($toppart, $recipients, $msg_headers, $sender, $transport);
+    }
+
+    function _inject(&$toppart, $recipients, $msg_headers, $sender, $transport)
+    {
+        global $conf;
+
+        if (isset($conf['kolab']['filter']['smtp_host'])) {
+            $host = $conf['kolab']['filter']['smtp_host'];
+        } else {
+            $host = 'localhost';
+        }
+        if (isset($conf['kolab']['filter']['smtp_port'])) {
+            $port = $conf['kolab']['filter']['smtp_port'];
+        } else {
+            $port = 10025;
+        }
+
+        $transport = &Horde_Kolab_Filter_Transport::factory($transport, 
+                                               array('host' => $host, 
+                                                     'port' => $port));
+
+        $result = $transport->start($sender, $recipients);
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        $result = $transport->data($msg_headers->toString() . $toppart->toString());
+        if (is_a($result, 'PEAR_Error')) {
+            return $result;
+        }
+
+        return $transport->end();
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Response.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Response.php
new file mode 100644
index 0000000..1ce2c78
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Response.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Response.php,v 1.3.2.2 2009-02-24 11:17:39 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/* Require the PEAR library for PEAR errors */
+require_once 'PEAR.php';
+
+/* Some output constants */
+define( 'OUT_STDOUT', 128 );
+define( 'OUT_LOG', 256 );
+
+/* Failure constants from postfix src/global/sys_exits.h */
+define('EX_USAGE', 64);       /* command line usage error */
+define('EX_DATAERR', 65);     /* data format error */
+define('EX_NOINPUT', 66);     /* cannot open input */
+define('EX_NOUSER', 67);      /* user unknown */
+define('EX_NOHOST', 68);      /* host name unknown */
+define('EX_UNAVAILABLE', 69); /* service unavailable */
+define('EX_SOFTWARE', 70);    /* internal software error */
+define('EX_OSERR', 71);       /* system resource error */
+define('EX_OSFILE', 72);      /* critical OS file missing */
+define('EX_CANTCREAT', 73);   /* can't create user output file */
+define('EX_IOERR', 74);       /* input/output error */
+define('EX_TEMPFAIL', 75);    /* temporary failure */
+define('EX_PROTOCOL', 76);    /* remote error in protocol */
+define('EX_NOPERM', 77);      /* permission denied */
+define('EX_CONFIG', 78);      /* local configuration error */
+
+/**
+ * Provides error handling for the Kolab server filter scripts.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Response.php,v 1.3.2.2 2009-02-24 11:17:39 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Response
+{
+
+    /**
+     * Constructor.
+     */
+    function Horde_Kolab_Filter_Response()
+    {
+        /* Set a custom PHP error handler to catch any coding errors */
+        set_error_handler(array($this, '_fatal'));
+    }
+
+    /**
+     * Handle the results of the message transport.
+     *
+     * @param mixed $result The reponse of the transport.
+     */
+    function handle($result)
+    {
+        /* No error? Be happy and exit clean */
+        if (!is_a($result, 'PEAR_Error')) {
+            exit(0);
+        }
+
+        $msg = $result->getMessage();
+        $code = $result->getCode();
+
+        if ($code & OUT_STDOUT) {
+            fwrite(STDOUT, $msg);
+        }
+        if  ($code & OUT_LOG || empty($code)) {
+            $this->_log($result);
+        }
+
+        // FIXME: Add a userinfo handler in case there were multiple
+        // combined errors
+
+        /* If we have an error code we want to return it to the
+         * calling application and exit here
+         */
+        if ($code) {
+            /* Return the first seven bits as error code to postfix */
+            exit($code & 127);
+        }
+    }
+
+    /**
+     * An alternative PHP error handler so that we don't drop silent
+     * on fatal errors.
+     *
+     * @param int    $errno    The error number.
+     * @param string $errmsg   The error message.
+     * @param string $filename The file where the error occured.
+     * @param int    $linenum  The line where the error occured.
+     * @param mixed  $vars     ?
+     *
+     * @return boolean Always false.
+     */
+    function _fatal($errno, $errmsg, $filename, $linenum, $vars)
+    {
+        /* Ignore strict errors for now since even PEAR will raise
+         * strict notices 
+         */
+        if ($errno == E_STRICT) {
+            return false;
+        }
+
+        $fatal = array(E_ERROR,
+                       E_PARSE,
+                       E_CORE_ERROR,
+                       E_COMPILE_ERROR,
+                       E_USER_ERROR);
+
+        if (in_array($errno, $fatal)) {
+            $code = OUT_STDOUT | OUT_LOG | EX_UNAVAILABLE;
+            $msg = 'CRITICAL: You hit a fatal bug in kolab-filter. Please inform the Kolab developers at https://www.intevation.de/roundup/kolab/. The error was: ' . $errmsg;
+        } else {
+            $code = 0;
+            $msg = 'PHP Error: ' . $errmsg;
+        }
+
+        $error = &new PEAR_Error($msg, $code);
+        $this->handle($error);
+
+        return false;
+    }
+
+    /**
+     * Log an error.
+     *
+     * @param PEAR_error $result The reponse of the transport.
+     */
+    function _log($result)
+    {
+        global $conf;
+
+        $msg = $result->getMessage() . '; Code: ' . $result->getCode();
+
+        /* Log all errors */
+        $file = __FILE__;
+        $line = __LINE__;
+
+        $frames = $result->getBacktrace();
+        if (count($frames) > 1) {
+            $frame = $frames[1];
+        } else if (count($frames) == 1) {
+            $frame = $frames[0];
+        }
+        if (isset($frame['file'])) {
+            $file = $frame['file'];
+        }
+        if (isset($frame['line'])) {
+            $line = $frame['line'];
+        }
+
+        /* In debugging mode the errors get delivered to the screen
+         * without a time stamp (mainly because of unit testing) 
+         */
+        if (!isset($conf['kolab']['filter']['debug'])
+            || !$conf['kolab']['filter']['debug']) {
+            Horde::logMessage($msg, $file, $line, PEAR_LOG_ERR);
+        } else {
+            $msg .= ' (Line ' . $frame['line'] . ' in ' . basename($frame['file']) . ")\n";
+            fwrite(STDOUT, $msg);
+        }
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport.php
new file mode 100644
index 0000000..bdaca52
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport.php
@@ -0,0 +1,295 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport.php,v 1.4.2.2 2009-11-16 12:29:37 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Provides a delivery mechanism for a mail message.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport.php,v 1.4.2.2 2009-11-16 12:29:37 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport 
+{
+    /**
+     * The connection parameters for the transport.
+     *
+     * @var array
+     */
+    var $_params;
+
+    /**
+     * The transport class delivering the message.
+     *
+     * @var mixed
+     */
+    var $_transport;
+
+    /**
+     * Internal marker to indicate if we received a new line.
+     *
+     * @var boolean
+     */
+    var $_got_newline;
+
+    /**
+     * Constructor.
+     */
+    function Horde_Kolab_Filter_Transport($params)
+    {
+        $this->_params = $params;
+        $this->_transport = false;
+    }
+
+    /**
+     * Attempts to return a concrete Horde_Kolab_Filter_Transport instance based on $driver.
+     *
+     * @param string $driver The type of the concrete Horde_Kolab_Filter_Transport
+     *                       subclass to return.  The class name is
+     *                       based on the Horde_Kolab_Filter_Transport driver
+     *                       ($driver).  The code is dynamically
+     *                       included.
+     *
+     * @param array $params  A hash containing any additional
+     *                       configuration or connection parameters a
+     *                       subclass might need.
+     *
+     * @return Horde_Kolab_Filter_Transport|boolean The newly created concrete
+     *                                 Horde_Kolab_Filter_Transport instance, or
+     *                                 false on an error.
+     */
+    function &factory($driver, $params = array())
+    {
+        $class = 'Horde_Kolab_Filter_Transport_' . $driver;
+        if (!class_exists($class)) {
+            include dirname(__FILE__) . '/Transport/' . $driver . '.php';
+        }
+        if (class_exists($class)) {
+            $transport = &new $class($params);
+            return $transport;
+        }
+        return PEAR::raiseError(sprintf('No such class \"%s\"', $class),
+                                OUT_LOG | EX_SOFTWARE);
+    }
+
+    /**
+     * Create the transport class.
+     */
+    function createTransport() {
+        $this->_transport = $this->_createTransport();
+    }
+
+    /**
+     * Starts transporting the message.
+     *
+     * @param string $sender The message sender.
+     * @param array $recips  The recipients of the message.
+     *
+     * @return boolean|PEAR_Error True on success, a PEAR_Error otherwise.
+     */
+    function start($sender, $recips)
+    {
+        $this->createTransport();
+
+        $myclass = get_class($this->_transport);
+        $this->_got_newline = true;
+
+        $result = $this->_transport->connect();
+        if (is_a($result, 'PEAR_Error')) {
+            $result->code = OUT_LOG | EX_UNAVAILABLE;
+            return $result;
+        }
+
+        if (isset($this->_params['user']) && isset($this->_params['pass']) ) {
+            $this->_transport->auth($this->_params['user'], $this->_params['pass'], 'PLAIN');
+        }
+
+        $result = $this->_transport->mailFrom($sender);
+        if (is_a($result, 'PEAR_Error')) {
+            $resp = $this->_transport->getResponse();
+            $error = PEAR::raiseError(sprintf('Failed to set sender: %s, code=%s',
+                                              $resp[1], $resp[0]), $resp[0]);
+            return $this->rewriteCode($error);
+        }
+
+        if (!is_array($recips)) {
+            $recips = array($recips);
+        }
+
+        $reciperrors = array();
+        foreach ($recips as $recip) {
+            $result = $this->_transport->rcptTo($recip);
+            if (is_a($result, 'PEAR_Error')) {
+                $resp = $this->_transport->getResponse();
+                $reciperrors[] = PEAR::raiseError(sprintf('Failed to set recipient: %s, code=%s',
+                                                          $resp[1], $resp[0]), $resp[0]);
+            }
+        }
+
+        if (count($reciperrors) == count($recips)) {
+            /* OK, all failed, just give up */
+            if (count($reciperrors) == 1) {
+                /* Only one failure, just return that */
+                return $this->rewriteCode($reciperrors[0]);
+            }
+            /* Multiple errors */
+            $error = $this->createErrorObject($reciperrors,
+                                              'Delivery to all recipients failed!');
+            return $this->rewriteCode($error);
+        }
+
+        $result = $this->_transport->_put('DATA');
+        if (is_a($result, 'PEAR_Error')) {
+            $resp = $this->_transport->getResponse();
+            $error = PEAR::raiseError(sprintf('Failed to send DATA: %s, code=%s',
+                                              $resp[1], $resp[0]), $resp[0]);
+            return $this->rewriteCode($error);
+        }
+
+        $result = $this->_transport->_parseResponse(354);
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->rewriteCode($result);
+        }
+
+        if (!empty($reciperrors)) {
+            return $this->createErrorObject($reciperrors,
+                                            'Delivery to some recipients failed!');
+        }
+        return true;
+    }
+
+    /**
+     * Encapsulate multiple errors in one.
+     *
+     * @param array  $reciperrors  The errors.
+     * @param string $msg          A combined error message.
+     *
+     * @return PEAR_Error The combined error.
+     */
+    function createErrorObject($reciperrors, $msg = null)
+    {
+        /* Return the lowest errorcode to not bounce more
+         * than we have to
+         */
+        if ($msg == null) {
+            $msg = 'Delivery to recipients failed.';
+        }
+
+        $code = 1000;
+
+        foreach ($reciperrors as $err) {
+            if ($err->code < $code) {
+                $code = $err->code;
+            }
+        }
+        return new PEAR_Error($msg, $code, null, null, $reciperrors);  
+    }
+
+    /**
+     * Modified implementation from Net_SMTP that supports dotstuffing
+     * even when getting the mail line-by line.
+     *
+     * @param string $data   Mail message data.
+     */
+    function quotedataline(&$data)
+    {
+        /*
+         * Change Unix (\n) and Mac (\r) linefeeds into Internet-standard CRLF
+         * (\r\n) linefeeds.
+         */
+        $data = preg_replace(array('/(?<!\r)\n/','/\r(?!\n)/'), "\r\n", $data);
+
+        /*
+         * Because a single leading period (.) signifies an end to the data,
+         * legitimate leading periods need to be "doubled" (e.g. '..').
+         */
+        if ($this->_got_newline && !empty($data) && $data[0] == '.') {
+            $data = '.'.$data;
+        }
+
+        $data = str_replace("\n.", "\n..", $data);
+        $len = strlen($data);
+        if ($len > 0) {
+            $this->_got_newline = ( $data[$len-1] == "\n" );
+        }
+    }
+
+    /**
+     * Send message data.
+     *
+     * @param string $data The text of the message.
+     *
+     * @return boolean|PEAR_Error True on success.
+     */
+    function data($data) {
+        $this->quotedataline($data);
+        $result = $this->_transport->_send($data);
+        if (is_a($result, 'PEAR_Error')) {
+            $resp = $this->_transport->getResponse();
+            $error = PEAR::raiseError(sprintf('Failed to send message data: %s, code=%s',
+                                              $resp[1], $resp[0]), $resp[0]);
+            return $this->rewriteCode($error);
+        }
+        return true;
+    }
+
+    /**
+     * Finish sending data.
+     *
+     * @return boolean|PEAR_Error True on success.
+     */
+    function end() 
+    {
+        if ($this->_got_newline) {          
+            $dot = ".\r\n";
+        } else {
+            $dot = "\r\n.\r\n";
+        }
+
+        $result = $this->_transport->_send($dot);
+        if (is_a($result, 'PEAR_Error')) {
+            $resp = $this->_transport->getResponse();
+            $error = PEAR::raiseError(sprintf('Failed to send message end: %s, code=%s',
+                                              $resp[1], $resp[0]), $resp[0]);
+            return $this->rewriteCode($error);
+        }
+        $result = $this->_transport->_parseResponse(250);
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->rewriteCode($result);
+        }
+        $this->_transport->disconnect();
+        $this->_transport = false;
+        return true;
+    }
+
+    /**
+     * Rewrite the code to something postfix can understand.
+     *
+     * @param PEAR_error $result The reponse of the transport.
+     *
+     * @return PEAR_error An error with a rewritten error code.
+     */
+    function rewriteCode($result) 
+    {
+        if ($result->getCode() < 500) {
+            $code = EX_TEMPFAIL;
+        } else {
+            $code = EX_UNAVAILABLE;
+        }
+        $append = sprintf(', original code %s', $result->getCode());
+        $result->message = $result->getMessage() . $append;
+        $result->code = OUT_LOG | OUT_STDOUT | $code;
+        return $result;
+    }
+
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php
new file mode 100644
index 0000000..7f6f808
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php
@@ -0,0 +1,261 @@
+<?PHP
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Defines a transport mechanism for delivering mails to the dovecot
+ * IMAP server.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/DovecotLDA.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Intevation GmbH
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Sascha Wilde <wilde at intevation.de>
+ * @package Kolab_Filter
+ */
+class Dovecot_LDA
+{
+    /**
+     * The mail sender.
+     *
+     * @var string
+     */
+    var $_envelopeSender;
+
+    /**
+     * The mail recipient.
+     *
+     * @var string
+     */
+    var $_envelopeTo = array();
+
+    /**
+     * Transport status.
+     *
+     * @var int
+     */
+    var $_status;
+
+    /**
+     * The data that should be sent.
+     *
+     * @var array
+     */
+    var $_data;
+
+    /**
+     * File handle for delivery.
+     *
+     * @var int
+     */
+    var $_deliver_fh;
+
+    function Dovecot_LDA()
+    {
+        $this->_envelopeTo = false;
+        $this->_status = 220;
+    }
+
+    /**
+     * Pretends to connect to Dovecot which is not necessary.
+     *
+     * @return boolean|PEAR_Error Always true.
+     */
+    function connect()
+    {
+        global $conf;
+
+        if (!isset($conf['kolab']['filter']['dovecot_deliver'])) {
+            return PEAR::raiseError('Path to the dovecot delivery tool missing!');
+        }
+        return true;
+    }
+
+    /**
+     * Pretends to disconnect from Dovecot which is not necessary.
+     *
+     * @return boolean Always true.
+     */
+    function disconnect()
+    {
+        return true;
+    }
+
+
+    /**
+     * Set the mail sender.
+     *
+     * @return boolean Always true.
+     */
+    function mailFrom($sender)
+    {
+        $this->_envelopeSender = $sender;
+        $this->_status = 250;
+        return true;
+    }
+
+    /**
+     * Add a mail recipient.
+     *
+     * @return boolean Always true.
+     */
+    function rcptTo($rcpt)
+    {
+        $this->_envelopeTo[] = $rcpt;
+        $this->_status = 250;
+        return true;
+    }
+
+    /**
+     * Receive commands.
+     *
+     * @param string $cmd The command.
+     *
+     * @return boolean|PEAR_Error True if the command succeeded.
+     */
+    function _put($cmd)
+    {
+        if ($cmd == "DATA") {
+            $this->_status = 354;
+        } else {
+            $this->_status = 500;
+            return PEAR::raiseError('Dovecot LDA Backend received an unknown command.');
+        }
+        return true;
+    }
+
+    /**
+     * Check the current response code.
+     *
+     * @param string $code The response to parse.
+     *
+     * @return boolean|PEAR_Error True if the current status matches
+     * the expectation.
+     */
+    function _parseResponse($code)
+    {
+        if ($code) {
+            if ($this->_status == $code) {
+                return true;
+            } else {
+                return PEAR::raiseError(sprintf("Dovecot LDA status is %s though %s was expected!.",
+                                                $this->_status, $code));
+            }
+        } else {
+            return $this->status;
+        }
+    }
+
+    /**
+     * Send actual mail data.
+     *
+     * @param string $data The data to write.
+     *
+     * @return boolean|PEAR_Error True if successful.
+     */
+    function _send($data)
+    {
+        $errors = array();
+        if ($data == ".\r\n" or $data == "\r\n.\r\n") {
+            foreach ($this->_envelopeTo as $recipient) {
+                $result = $this->_start_deliver($recipient);
+                if (is_a($result, 'PEAR_Error')) {
+                    $errors[] = $result;
+                    continue;
+                }
+
+                $result = $this->_deliver();
+                if (is_a($result, 'PEAR_Error')) {
+                    $errors[] = $result;
+                    continue;
+                }
+
+                $result = $this->_stop_deliver();
+                if (is_a($result, 'PEAR_Error')) {
+                    $errors[] = $result;
+                    continue;
+                }
+            }
+            if (empty($errors)) {
+                $this->_status = 250;
+            } else {
+                $this->_status = 500;
+                $msg = '';
+                foreach ($errors as $error) {
+                    $msg[] = $error->getMessage();
+                }
+                return PEAR::raiseError(sprintf("Dovecot delivery failed: %s",
+                                                join(', ', $msg)));
+            }
+        } else {
+            $this->_data[] = $data;
+        }
+        return true;
+    }
+
+
+    /**
+     * Start the delivery process for a recipient.
+     *
+     * @param string $recipient The recipient of the message.
+     *
+     * @return boolean|PEAR_Error True if successful.
+     */
+    function _start_deliver($recipient)
+    {
+        global $conf;
+
+        Horde::logMessage(sprintf("Starting Dovecot delivery process with UID %d, GID %d (sender=%s, recipient=%s) ...",
+                                  getmyuid(), getmygid(),
+                                  $this->_envelopeSender, $recipient),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        $deliver = $conf['kolab']['filter']['dovecot_deliver'];
+
+        $this->_deliver_fh = popen($deliver . ' -f ' . $this->_envelopeSender .
+                                   ' -d ' . $recipient, "w");
+        if ($this->_deliver_fh === false) {
+            return PEAR::raiseError('Failed to connect to the dovecot delivery tool!');
+        }
+        return true;
+    }
+
+    /**
+     * End the delivery process for a recipient.
+     *
+     * @return boolean|PEAR_Error True if successful.
+     */
+    function _stop_deliver()
+    {
+        Horde::logMessage("Stoping Dovecot delivery process ...",
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        $retval = pclose($this->_deliver_fh);
+        Horde::logMessage(sprintf("... return value was %d\n", $retval),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        if ($retval != 0) {
+            return PEAR::raiseError('Dovecot LDA Backend delivery process signaled an error.');
+        }
+        return true;
+    }
+
+    /**
+     * Write data to the deliver process.
+     *
+     * @return boolean|PEAR_Error True if successful.
+     */
+    function _deliver()
+    {
+        foreach ($this->_data as $line) {
+            if (!fwrite($this->_deliver_fh, $line)) {
+                return PEAR::raiseError('Dovecot LDA Backend failed writing to the deliver process.');
+            }
+        }
+        return true;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php
new file mode 100644
index 0000000..e43ad32
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/LMTPTLS.php,v 1.3.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/* Require the base class */
+require_once 'Net/LMTP.php';
+
+/**
+ * Extended LMTP class with support for TLS.
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Net_LMTP_TLS extends Net_LMTP {
+
+    /**
+     * Attempt to do LMTP authentication.
+     *
+     * @param string The userid to authenticate as.
+     * @param string The password to authenticate with.
+     * @param string The requested authentication method.  If none is
+     *               specified, the best supported method will be used.
+     *
+     * @return mixed Returns a PEAR_Error with an error message on any
+     *               kind of failure, or true on success.
+     * @access public
+     */
+    function auth($uid, $pwd , $method = '')
+    {
+        if (version_compare(PHP_VERSION, '5.1.0', '>=')) {
+            if (!isset($this->_esmtp['STARTTLS'])) {
+                return PEAR::raiseError('LMTP server does not support authentication');
+            }
+            if (PEAR::isError($result = $this->_put('STARTTLS'))) {
+                return $result;
+            }
+            if (PEAR::isError($result = $this->_parseResponse(220))) {
+                return $result;
+            }
+            if (PEAR::isError($result = $this->_socket->enableCrypto(true, STREAM_CRYPTO_METHOD_TLS_CLIENT))) {
+                return $result;
+            }
+            elseif ($result !== true) {
+                return PEAR::raiseError('STARTTLS failed');
+            }
+
+            /* Send LHLO again to recieve the AUTH string from the
+             * LMTP server. */
+            $this->_negotiate();
+            if (empty($this->_esmtp['AUTH'])) {
+                return PEAR::raiseError('LMTP server does not support authentication');
+            }
+        }
+
+        /*
+         * If no method has been specified, get the name of the best supported
+         * method advertised by the LMTP server.
+         */
+        if (empty($method) || $method === true ) {
+            if (PEAR::isError($method = $this->_getBestAuthMethod())) {
+                /* Return the PEAR_Error object from _getBestAuthMethod(). */
+                return $method;
+            } 
+        } else {
+            $method = strtoupper($method);
+        }
+
+        switch ($method) {
+            case 'DIGEST-MD5':
+                $result = $this->_authDigest_MD5($uid, $pwd);
+                break;
+            case 'CRAM-MD5':
+                $result = $this->_authCRAM_MD5($uid, $pwd);
+                break;
+            case 'LOGIN':
+                $result = $this->_authLogin($uid, $pwd);
+                break;
+            case 'PLAIN':
+                $result = $this->_authPlain($uid, $pwd);
+                break;
+            default : 
+                $result = new PEAR_Error("$method is not a supported authentication method");
+                break;
+        }
+
+        /* If an error was encountered, return the PEAR_Error object. */
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        /* RFC-2554 requires us to re-negotiate ESMTP after an AUTH. */
+        if (PEAR::isError($error = $this->_negotiate())) {
+            return $error;
+        }
+
+        return true;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/drop.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/drop.php
new file mode 100644
index 0000000..a8a8ff7
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/drop.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/drop.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Drops a mail instead of delivering it.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/drop.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport_drop extends Horde_Kolab_Filter_Transport 
+{
+    /**
+     * Create the transport handler.
+     *
+     * @return DropWrapper Provides a null class as transport.
+     */
+    function &_createTransport()
+    {
+        $transport = &new DropWrapper();
+        return $transport;
+    }
+}
+
+/**
+ * Defines a wrapper that provides functionality comparable to the
+ * Net/*MTP.php classes.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/drop.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class DropWrapper
+{
+    /**
+     * Pretends to connect.
+     *
+     * @return boolean Always true.
+     */
+    function connect()
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to disconnect.
+     *
+     * @return boolean Always true.
+     */
+    function disconnect()
+    {
+        return true;
+    }
+
+    /**
+     * Set the sender.
+     *
+     * @return boolean Always true.
+     */
+    function mailFrom($sender)
+    {
+        return true;
+    }
+
+    /**
+     * Set the recipient.
+     *
+     * @return boolean Always true.
+     */
+    function rcptTo($recipient)
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to send commands.
+     *
+     * @param string $cmd The command.
+     *
+     * @return boolean Always true.
+     */
+    function _put($cmd)
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to handle responses.
+     *
+     * @param string $code The response to parse.
+     *
+     * @return boolean Always true.
+     */
+    function _parseResponse($code)
+    {
+        return true;
+    }
+
+    /**
+     * Write data.
+     *
+     * @param string $data The data to write.
+     *
+     * @return boolean Always true.
+     */
+    function _send($data)
+    {
+        return true;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/echo.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/echo.php
new file mode 100644
index 0000000..9ad7c92
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/echo.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/echo.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Echos a mail for debugging.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/echo.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport_echo extends Horde_Kolab_Filter_Transport 
+{
+    /**
+     * Create the transport handler.
+     *
+     * @return StdOutWrapper Wraps STDOUT as transport
+     */
+    function &_createTransport()
+    {
+        $transport = &new EchoWrapper();
+        return $transport;
+    }
+}
+
+/**
+ * Defines an echo wrapper that provides functionality comparable to 
+ * the Net/*MTP.php classes.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/echo.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class EchoWrapper
+{
+    /**
+     * Pretends to connect to STDOUT.
+     *
+     * @return boolean Always true.
+     */
+    function connect()
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to disconnect from STDOUT.
+     *
+     * @return boolean Always true.
+     */
+    function disconnect()
+    {
+        return true;
+    }
+
+    /**
+     * Set the sender.
+     *
+     * @return mixed Result from writing the sender to STDOUT.
+     */
+    function mailFrom($sender)
+    {
+        echo sprintf("Mail from sender: %s\r\n", $sender);
+        return true;
+    }
+
+    /**
+     * Set the recipient.
+     *
+     * @return mixed Result from writing the recipient to STDOUT.
+     */
+    function rcptTo($recipient)
+    {
+        echo sprintf("Mail to recipient: %s\r\n", $recipient);
+        return true;
+    }
+
+    /**
+     * Pretends to send commands to STDOUT.
+     *
+     * @param string $cmd The command.
+     *
+     * @return boolean Always true.
+     */
+    function _put($cmd)
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to handle STDOUT responses.
+     *
+     * @param string $code The response to parse.
+     *
+     * @return boolean Always true.
+     */
+    function _parseResponse($code)
+    {
+        return true;
+    }
+
+    /**
+     * Echo data.
+     *
+     * @param string $data The data to write.
+     *
+     * @return mixed Result from writing data to STDOUT.
+     */
+    function _send($data)
+    {
+        echo $data;
+        return true;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lda.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lda.php
new file mode 100644
index 0000000..d95d088
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lda.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lda.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Provides DovecotLDA delivery.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lda.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Intevation GmbH
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Sascha Wilde <wilde at intevation.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport_lda extends Horde_Kolab_Filter_Transport 
+{
+    /**
+     * Create the transport handler.
+     *
+     * @return DovecotLDA The LDA handler.
+     */
+    function &_createTransport() 
+    {
+        require_once dirname(__FILE__) . '/DovecotLDA.php';
+
+        $transport = &new Dovecot_LDA();
+
+        return $transport;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lmtp.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lmtp.php
new file mode 100644
index 0000000..89e0b64
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/lmtp.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lmtp.php,v 1.3.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Provides LMTP for delivering a mail.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/lmtp.php,v 1.3.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport_lmtp extends Horde_Kolab_Filter_Transport 
+{
+    /**
+     * Create the transport handler.
+     *
+     * @return Net_LMTP The LMTP handler.
+     */
+    function &_createTransport() 
+    {
+        require_once dirname(__FILE__) . '/LMTPTLS.php';
+
+        if (!isset($this->_params['host'])) {
+            $this->_params['host'] = '127.0.0.1';
+        }
+
+        if (!isset($this->_params['port'])) {
+            $this->_params['port'] = 2003;
+        }
+
+        $transport = &new Net_LMTP_TLS($this->_params['host'],
+                                       $this->_params['port']);
+
+        return $transport;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/smtp.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/smtp.php
new file mode 100644
index 0000000..83e208d
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/smtp.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/smtp.php,v 1.3.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Provides SMTP for delivering mail.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/smtp.php,v 1.3.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport_smtp extends Horde_Kolab_Filter_Transport 
+{
+    /**
+     * Create the transport handler.
+     *
+     * @return Net_SMTP The SMTP handler.
+     */
+    function &_createTransport() 
+    {
+        require_once 'Net/SMTP.php';
+
+        if (!isset($this->_params['host'])) {
+            $this->_params['host'] = '127.0.0.1';
+        }
+
+        if (!isset($this->_params['port'])) {
+            $this->_params['port'] = 25;
+        }
+
+        $transport = &new Net_SMTP($this->_params['host'],
+                                   $this->_params['port']);
+        return $transport;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/stdout.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/stdout.php
new file mode 100644
index 0000000..6b4a416
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Filter/Transport/stdout.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/stdout.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * @package Kolab_Filter
+ */
+
+/**
+ * Delivers a mail to STDOUT for debugging.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/stdout.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class Horde_Kolab_Filter_Transport_stdout extends Horde_Kolab_Filter_Transport 
+{
+    /**
+     * Create the transport handler.
+     *
+     * @return StdOutWrapper Wraps STDOUT as transport
+     */
+    function &_createTransport()
+    {
+        $transport = &new StdOutWrapper();
+        return $transport;
+    }
+}
+
+/**
+ * Defines a STDOUT wrapper that provides functionality comparable to 
+ * the Net/*MTP.php classes.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Transport/stdout.php,v 1.4.2.1 2009-02-20 22:37:15 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Kolab_Filter
+ */
+class StdOutWrapper
+{
+    /**
+     * Pretends to connect to STDOUT.
+     *
+     * @return boolean Always true.
+     */
+    function connect()
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to disconnect from STDOUT.
+     *
+     * @return boolean Always true.
+     */
+    function disconnect()
+    {
+        return true;
+    }
+
+    /**
+     * Set the sender.
+     *
+     * @return mixed Result from writing the sender to STDOUT.
+     */
+    function mailFrom($sender)
+    {
+        return fwrite(STDOUT, sprintf("Mail from sender: %s\n", $sender));
+    }
+
+    /**
+     * Set the recipient.
+     *
+     * @return mixed Result from writing the recipient to STDOUT.
+     */
+    function rcptTo($recipient)
+    {
+        return fwrite(STDOUT, sprintf("Mail to recipient: %s\n", $recipient));
+    }
+
+    /**
+     * Pretends to send commands to STDOUT.
+     *
+     * @param string $cmd The command.
+     *
+     * @return boolean Always true.
+     */
+    function _put($cmd)
+    {
+        return true;
+    }
+
+    /**
+     * Pretends to handle STDOUT responses.
+     *
+     * @param string $code The response to parse.
+     *
+     * @return boolean Always true.
+     */
+    function _parseResponse($code)
+    {
+        return true;
+    }
+
+    /**
+     * Write data to STDOUT.
+     *
+     * @param string $data The data to write.
+     *
+     * @return mixed Result from writing data to STDOUT.
+     */
+    function _send($data)
+    {
+        return fwrite(STDOUT, $data);
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Resource.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Resource.php
new file mode 100644
index 0000000..4436618
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Resource.php
@@ -0,0 +1,1164 @@
+<?php
+/**
+ * Resource management for the Kolab server.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php,v 1.15.2.10 2009-11-16 19:26:34 wrobel Exp $
+ *
+ * PHP version 4
+ *
+ * @category Kolab
+ * @package  Kolab_Filter
+ * @author   Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author   Gunnar Wrobel <wrobel at pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Server
+ */
+
+/** Load the iCal handling */
+require_once 'Horde/iCalendar.php';
+
+/** Load MIME handlers */
+require_once 'Horde/MIME.php';
+require_once 'Horde/MIME/Message.php';
+require_once 'Horde/MIME/Headers.php';
+require_once 'Horde/MIME/Part.php';
+require_once 'Horde/MIME/Structure.php';
+
+require_once 'Horde/String.php';
+String::setDefaultCharset('utf-8');
+
+// What actions we can take when receiving an event request
+define('RM_ACT_ALWAYS_ACCEPT',              'ACT_ALWAYS_ACCEPT');
+define('RM_ACT_REJECT_IF_CONFLICTS',        'ACT_REJECT_IF_CONFLICTS');
+define('RM_ACT_MANUAL_IF_CONFLICTS',        'ACT_MANUAL_IF_CONFLICTS');
+define('RM_ACT_MANUAL',                     'ACT_MANUAL');
+define('RM_ACT_ALWAYS_REJECT',              'ACT_ALWAYS_REJECT');
+
+// What possible ITIP notification we can send
+define('RM_ITIP_DECLINE',                   1);
+define('RM_ITIP_ACCEPT',                    2);
+define('RM_ITIP_TENTATIVE',                 3);
+
+/**
+ * Provides Kolab resource handling
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php,v 1.15.2.10 2009-11-16 19:26:34 wrobel Exp $
+ *
+ * Copyright 2004-2009 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @package Kolab_Filter
+ * @author  Steffen Hansen <steffen at klaralvdalens-datakonsult.se>
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ */
+class Kolab_Resource
+{
+
+    /**
+     * Returns the resource policy applying for the given sender
+     *
+     * @param string $sender   The sender address
+     * @param string $resource The resource
+     *
+     * @return array|PEAR_Error An array with "cn", "home server" and the policy.
+     */
+    function _getResourceData($sender, $resource)
+    {
+        require_once 'Horde/Kolab/Server.php';
+        $db = &Horde_Kolab_Server::singleton();
+        if (is_a($db, 'PEAR_Error')) {
+            $db->code = OUT_LOG | EX_SOFTWARE;
+            return $db;
+        }
+
+        $dn = $db->uidForMail($resource, KOLAB_SERVER_RESULT_MANY);
+        if (is_a($dn, 'PEAR_Error')) {
+            $dn->code = OUT_LOG | EX_NOUSER;
+            return $dn;
+        }
+        if (is_array($dn && count($dn) > 1)) {
+            Horde::logMessage(sprintf("%s objects returned for %s",
+                                      $count($dn), $resource),
+                              __FILE__, __LINE__, PEAR_LOG_WARNING);
+            return false;
+        }
+        $user = $db->fetch($dn, KOLAB_OBJECT_USER);
+
+        $cn      = $user->get(KOLAB_ATTR_CN);
+        $id      = $user->get(KOLAB_ATTR_MAIL);
+        $hs      = $user->get(KOLAB_ATTR_HOMESERVER);
+        if (is_a($hs, 'PEAR_Error')) {
+            return $hs;
+        }
+        $hs      = strtolower($hs);
+        $actions = $user->get(KOLAB_ATTR_IPOLICY);
+        if (is_a($actions, 'PEAR_Error')) {
+            $actions->code = OUT_LOG | EX_UNAVAILABLE;
+            return $actions;
+        }
+        if ($actions === false) {
+            $actions = array(RM_ACT_MANUAL);
+        }
+
+        $policies = array();
+        $defaultpolicy = false;
+        foreach ($actions as $action) {
+            if (ereg('(.*):(.*)', $action, $regs)) {
+                $policies[strtolower($regs[1])] = $regs[2];
+            } else {
+                $defaultpolicy = $action;
+            }
+        }
+        // Find sender's policy
+        if (array_key_exists($sender, $policies)) {
+            // We have an exact match, stop processing
+            $action = $policies[$sender];
+        } else {
+            $action = false;
+            $dn = $db->uidForMailOrAlias($sender);
+            if (is_a($dn, 'PEAR_Error')) {
+                $dn->code = OUT_LOG | EX_NOUSER;
+                return $dn;
+            }
+            if ($dn) {
+                // Sender is local, check for groups
+                foreach ($policies as $gid => $policy) {
+                    if ($db->memberOfGroupAddress($dn, $gid)) {
+                        // User is member of group
+                        if (!$action) {
+                            $action = $policy;
+                        } else {
+                            $action = min($action, $policy);
+                        }
+                    }
+                }
+            }
+            if (!$action && $defaultpolicy) {
+                $action = $defaultpolicy;
+            }
+        }
+        return array('cn' => $cn, 'id' => $id,
+                     'homeserver' => $hs, 'action' => $action);
+    }
+
+    function &_getICal($filename)
+    {
+        $requestText = '';
+        $handle = fopen($filename, 'r');
+        while (!feof($handle)) {
+            $requestText .= fread($handle, 8192);
+        }
+
+        $mime = &MIME_Structure::parseTextMIMEMessage($requestText);
+
+        $parts = $mime->contentTypeMap();
+        foreach ($parts as $mimeid => $conttype) {
+            if ($conttype == 'text/calendar') {
+                $part = $mime->getPart($mimeid);
+
+                $iCalendar = &new Horde_iCalendar();
+                $iCalendar->parsevCalendar($part->transferDecode());
+
+                return $iCalendar;
+            }
+        }
+        // No iCal found
+        return false;
+    }
+
+    function _imapConnect($id)
+    {
+        global $conf;
+
+        // Handle virtual domains
+        list($user, $domain) = split('@', $id);
+        if (empty($domain)) {
+            $domain = $conf['kolab']['filter']['email_domain'];
+        }
+        $calendar_user = $conf['kolab']['filter']['calendar_id'] . '@' . $domain;
+
+        /* Load the authentication libraries */
+        require_once "Horde/Auth.php";
+        require_once 'Horde/Secret.php';
+
+        $auth = &Auth::singleton(isset($conf['auth']['driver'])?$conf['auth']['driver']:'kolab');
+        $authenticated = $auth->authenticate($calendar_user,
+                                             array('password' => $conf['kolab']['filter']['calendar_pass']),
+                                             false);
+
+        if (is_a($authenticated, 'PEAR_Error')) {
+            $authenticated->code = OUT_LOG | EX_UNAVAILABLE;
+            return $authenticated;
+        }
+        if (!$authenticated) {
+            return PEAR::raiseError(sprintf('Failed to authenticate as calendar user: %s',
+                                            $auth->getLogoutReasonString()),
+                                    OUT_LOG | EX_UNAVAILABLE);
+        }
+        @session_start();
+        $_SESSION['__auth'] = array(
+            'authenticated' => true,
+            'userId' => $calendar_user,
+            'timestamp' => time(),
+            'credentials' => Secret::write(Secret::getKey('auth'),
+                                           serialize(array('password' => $conf['kolab']['filter']['calendar_pass']))),
+            'remote_addr' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null,
+        );
+
+        /* Kolab IMAP handling */
+        require_once 'Horde/Kolab/Storage/List.php';
+        $list = &Kolab_List::singleton();
+        $default = $list->getForeignDefault($id, 'event');
+        if (!$default) {
+            $default = &new Kolab_Folder();
+            $default->setList($list);
+            $default->setName($conf['kolab']['filter']['calendar_store']);
+            //FIXME: The calendar user needs access here
+            $attributes = array('default' => true,
+                                'type' => 'event',
+                                'owner' => $id);
+            $result = $default->save($attributes);
+            if (is_a($result, 'PEAR_Error')) {
+                $result->code = OUT_LOG | EX_UNAVAILABLE;
+                return $result;
+            }
+        }
+        return $default;
+    }
+
+    function _objectFromItip(&$itip)
+    {
+        $object = array();
+        $object['uid'] = $itip->getAttributeDefault('UID', '');
+
+        $org_params = $itip->getAttribute('ORGANIZER', true);
+        if (!is_a( $org_params, 'PEAR_Error')) {
+            if (!empty($org_params[0]['CN'])) {
+                $object['organizer']['display-name'] = $org_params[0]['CN'];
+            }
+            $orgemail = $itip->getAttributeDefault('ORGANIZER', '');
+            if (eregi('mailto:(.*)', $orgemail, $regs )) {
+                $orgemail = $regs[1];
+            }
+            $object['organizer']['smtp-address'] = $orgemail;
+        }
+        $object['summary'] = $itip->getAttributeDefault('SUMMARY', '');
+        $object['location'] = $itip->getAttributeDefault('LOCATION', '');
+        $object['body'] = $itip->getAttributeDefault('DESCRIPTION', '');
+        $dtend = $itip->getAttributeDefault('DTEND', '');
+        if (is_array($dtend)) {
+            $object['_is_all_day'] = true;
+        }
+        $object['start-date'] = $this->convert2epoch($itip->getAttributeDefault('DTSTART', ''));
+        $object['end-date'] = $this->convert2epoch($dtend);
+
+        $attendees = $itip->getAttribute('ATTENDEE');
+        if (!is_a( $attendees, 'PEAR_Error')) {
+            $attendees_params = $itip->getAttribute('ATTENDEE', true);
+            if (!is_array($attendees)) {
+                $attendees = array($attendees);
+            }
+            if (!is_array($attendees_params)) {
+                $attendees_params = array($attendees_params);
+            }
+
+            $object['attendee'] = array();
+            for ($i = 0; $i < count($attendees); $i++) {
+                $attendee = array();
+                if (isset($attendees_params[$i]['CN'])) {
+                    $attendee['display-name'] = $attendees_params[$i]['CN'];
+                }
+
+                $attendeeemail = $attendees[$i];
+                if (eregi('mailto:(.*)', $attendeeemail, $regs)) {
+                    $attendeeemail = $regs[1];
+                }
+                $attendee['smtp-address'] = $attendeeemail;
+
+                if( $attendees_params[$i]['RSVP'] == 'FALSE' ) {
+                    $attendee['request-response'] = false;
+                } else {
+                    $attendee['request-response'] = true;
+                }
+
+                if (isset($attendees_params[$i]['ROLE'])) {
+                    $attendee['role'] = $attendees_params[$i]['ROLE'];
+                }
+
+                if (isset($attendees_params[$i]['PARTSTAT'])) {
+                    $status = strtolower($attendees_params[$i]['PARTSTAT']);
+                    switch ($status) {
+                    case 'needs-action':
+                    case 'delegated':
+                        $attendee['status'] = 'none';
+                        break;
+                    default:
+                        $attendee['status'] = $status;
+                        break;
+                    }
+                }
+
+                $object['attendee'][] = $attendee;
+            }
+        }
+
+        // Alarm
+        $valarm = $itip->findComponent('VALARM');
+        if ($valarm) {
+            $trigger = $valarm->getAttribute('TRIGGER');
+            if (!is_a($trigger, 'PEAR_Error')) {
+                $p = $valarm->getAttribute('TRIGGER', true);
+                if ($trigger < 0) {
+                    // All OK, enter the alarm into the XML
+                    // NOTE: The Kolab XML format seems underspecified
+                    // wrt. alarms currently...
+                    $object['alarm'] = -$trigger / 60;
+                }
+            } else {
+                Horde::logMessage('No TRIGGER in VALARM. ' . $trigger->getMessage(),
+                                  __FILE__, __LINE__, PEAR_LOG_ERR);
+            }
+        }
+
+        // Recurrence
+        $rrule_str = $itip->getAttribute('RRULE');
+        if (!is_a($rrule_str, 'PEAR_Error')) {
+            require_once 'Horde/Date/Recurrence.php';
+            $recurrence = &new Horde_Date_Recurrence(time());
+            $recurrence->fromRRule20($rrule_str);
+            $object['recurrence'] = $recurrence->toHash();
+        }
+
+        Horde::logMessage(sprintf('Assembled event object: %s',
+                                  print_r($object, true)),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        return $object;
+    }
+
+    function handleMessage($fqhostname, $sender, $resource, $tmpfname)
+    {
+        global $conf;
+
+        $rdata = $this->_getResourceData($sender, $resource);
+        if (is_a($rdata, 'PEAR_Error')) {
+            return $rdata;
+        } else if ($rdata === false) {
+            /* No data, probably not a local user */
+            return true;
+        } else if ($rdata['homeserver'] && $rdata['homeserver'] != $fqhostname) {
+            /* Not the users homeserver, ignore */
+            return true;
+        }
+
+        $cn = $rdata['cn'];
+        $id = $rdata['id'];
+        if (isset($rdata['action'])) {
+            $action = $rdata['action'];
+        } else {
+            // Manual is the only safe default!
+            $action = RM_ACT_MANUAL;
+        }
+        Horde::logMessage(sprintf('Action for %s is %s',
+                                  $sender, $action),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        // Get out as early as possible if manual
+        if ($action == RM_ACT_MANUAL) {
+            Horde::logMessage(sprintf('Passing through message to %s', $id),
+                              __FILE__, __LINE__, PEAR_LOG_INFO);
+            return true;
+        }
+
+        /* Get the iCalendar data (i.e. the iTip request) */
+        $iCalendar = &$this->_getICal($tmpfname);
+        if ($iCalendar === false) {
+            // No iCal in mail
+            Horde::logMessage(sprintf('Could not parse iCalendar data, passing through to %s', $id),
+                              __FILE__, __LINE__, PEAR_LOG_INFO);
+            return true;
+        }
+        // Get the event details out of the iTip request
+        $itip = &$iCalendar->findComponent('VEVENT');
+        if ($itip === false) {
+            Horde::logMessage(sprintf('No VEVENT found in iCalendar data, passing through to %s', $id),
+                              __FILE__, __LINE__, PEAR_LOG_INFO);
+            return true;
+        }
+
+        // What is the request's method? i.e. should we create a new event/cancel an
+        // existing event, etc.
+        $method = strtoupper($iCalendar->getAttributeDefault('METHOD',
+                                                             $itip->getAttributeDefault('METHOD', 'REQUEST')));
+
+        // What resource are we managing?
+        Horde::logMessage(sprintf('Processing %s method for %s', $method, $id),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        // This is assumed to be constant across event creation/modification/deletipn
+        $uid = $itip->getAttributeDefault('UID', '');
+        Horde::logMessage(sprintf('Event has UID %s', $uid),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        // Who is the organiser?
+        $organiser = preg_replace('/^mailto:\s*/i', '', $itip->getAttributeDefault('ORGANIZER', ''));
+        Horde::logMessage(sprintf('Request made by %s', $organiser),
+                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        // What is the events summary?
+        $summary = $itip->getAttributeDefault('SUMMARY', '');
+
+        $dtstart = $this->convert2epoch($itip->getAttributeDefault('DTSTART', 0));
+        $dtend = $this->convert2epoch($itip->getAttributeDefault('DTEND', 0));
+
+        Horde::logMessage(sprintf('Event starts on <%s> %s and ends on <%s> %s.',
+                                  $dtstart, $this->iCalDate2Kolab($dtstart), $dtend, $this->iCalDate2Kolab($dtend)),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        if ($action == RM_ACT_ALWAYS_REJECT) {
+            if ($method == 'REQUEST') {
+                Horde::logMessage(sprintf('Rejecting %s method', $method),
+                                  __FILE__, __LINE__, PEAR_LOG_INFO);
+                $this->sendITipReply($cn, $resource, $itip, RM_ITIP_DECLINE,
+                                     $organiser, $uid, $is_update);
+                return false;
+            } else {
+                Horde::logMessage(sprintf('Passing through %s method for ACT_ALWAYS_REJECT policy', $method),
+                                  __FILE__, __LINE__, PEAR_LOG_INFO);
+                return true;
+            }
+        }
+
+        $is_update  = false;
+        $imap_error = false;
+        $ignore     = array();
+
+        $folder = $this->_imapConnect($id);
+        if (is_a($folder, 'PEAR_Error')) {
+            $imap_error = &$folder;
+        }
+        if (!is_a($imap_error, 'PEAR_Error') && !$folder->exists()) {
+            $imap_error = &PEAR::raiseError('Error, could not open calendar folder!',
+                                    OUT_LOG | EX_TEMPFAIL);
+        }
+
+        if (!is_a($imap_error, 'PEAR_Error')) {
+            $data = $folder->getData();
+            if (is_a($data, 'PEAR_Error')) {
+                $imap_error = &$data;
+            }
+        }
+
+        if (is_a($imap_error, 'PEAR_Error')) {
+            Horde::logMessage(sprintf('Failed accessing IMAP calendar: %s',
+                                      $folder->getMessage()),
+                              __FILE__, __LINE__, PEAR_LOG_ERR);
+            if ($action == RM_ACT_MANUAL_IF_CONFLICTS) {
+                return true;
+            }
+        }
+
+        switch ($method) {
+        case 'REQUEST':
+            if ($action == RM_ACT_MANUAL) {
+                Horde::logMessage(sprintf('Passing through %s method', $method),
+                                  __FILE__, __LINE__, PEAR_LOG_INFO);
+                break;
+            }
+
+            if (is_a($imap_error, 'PEAR_Error') || !$data->objectUidExists($uid)) {
+                $old_uid = null;
+            } else {
+                $old_uid = $uid;
+                $ignore[] = $uid;
+                $is_update = true;
+            }
+
+            /** Generate the Kolab object */
+            $object = $this->_objectFromItip($itip);
+
+            $outofperiod=0;
+
+            // Don't even bother checking free/busy info if RM_ACT_ALWAYS_ACCEPT
+            // is specified
+            if ($action != RM_ACT_ALWAYS_ACCEPT) {
+
+                /**
+                 * FIXME: This is a temporary injection point for providing a mock
+                 * free/busy setup. It would be better to implement a suite of
+                 * different free/busy drivers.
+                 */
+                if (isset($GLOBALS['KOLAB_FILTER_TESTING'])) {
+                    $vfb = $GLOBALS['KOLAB_FILTER_TESTING'];
+                } else {
+                    $vfb = &$this->internalGetFreeBusy($resource);
+                    if (is_a($vfb, 'PEAR_Error')) {
+                        return $vfb;
+                    }
+                }
+
+                $vfbstart = $vfb->getAttributeDefault('DTSTART', 0);
+                $vfbend = $vfb->getAttributeDefault('DTEND', 0);
+                Horde::logMessage(sprintf('Free/busy info starts on <%s> %s and ends on <%s> %s',
+                                          $vfbstart, $this->iCalDate2Kolab($vfbstart), $vfbend, $this->iCalDate2Kolab($vfbend)),
+                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+                if ($vfbstart && $dtstart > $this->convert2epoch ($vfbend)) {
+                    $outofperiod=1;
+                } else {
+                    // Check whether we are busy or not
+                    $busyperiods = $vfb->getBusyPeriods();
+                    Horde::logMessage(sprintf('Busyperiods: %s',
+                                              print_r($busyperiods, true)),
+                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                    $extraparams = $vfb->getExtraParams();
+                    Horde::logMessage(sprintf('Extraparams: %s',
+                                              print_r($extraparams, true)),
+                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                    $conflict = false;
+                    if (!empty($object['recurrence'])) {
+                        $recurrence = &new Horde_Date_Recurrence(time());
+                        $recurrence->fromHash($object['recurrence']);
+                        $duration = $dtend - $dtstart;
+                        $events = array();
+                        $next_start = $vfbstart;
+                        $next = $recurrence->nextActiveRecurrence($vfbstart);
+                        while ($next !== false && $next->compareDate($vfbend) <= 0) {
+                            $next_ts = $next->timestamp();
+                            $events[$next_ts] = $next_ts + $duration;
+                            $next = $recurrence->nextActiveRecurrence(array('year' => $next->year,
+                                                                            'month' => $next->month,
+                                                                            'mday' => $next->mday + 1,
+                                                                            'hour' => $next->hour,
+                                                                            'min' => $next->min,
+                                                                            'sec' => $next->sec));
+                        }
+                    } else {
+                        $events = array($dtstart => $dtend);
+                    }
+
+                    foreach ($events as $dtstart => $dtend) {
+                        foreach ($busyperiods as $busyfrom => $busyto) {
+                            if (empty($busyfrom) && empty($busyto)) {
+                                continue;
+                            }
+                            Horde::logMessage(sprintf('Busy period from %s to %s',
+                                                      strftime('%a, %d %b %Y %H:%M:%S %z', $busyfrom),
+                                                      strftime('%a, %d %b %Y %H:%M:%S %z', $busyto)
+                                              ),
+                                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                            if ((isset($extraparams[$busyfrom]['X-UID'])
+                                 && in_array(base64_decode($extraparams[$busyfrom]['X-UID']), $ignore))
+                                || (isset($extraparams[$busyfrom]['X-SID'])
+                                    && in_array(base64_decode($extraparams[$busyfrom]['X-SID']), $ignore))) {
+                                // Ignore
+                                continue;
+                            }
+                            if (($busyfrom >= $dtstart && $busyfrom < $dtend) || ($dtstart >= $busyfrom && $dtstart < $busyto)) {
+                                Horde::logMessage('Request overlaps',
+                                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                                $conflict = true;
+                                break;
+                            }
+                        }
+                        if ($conflict) {
+                            break;
+                        }
+                    }
+
+                    if ($conflict) {
+                        if ($action == RM_ACT_MANUAL_IF_CONFLICTS) {
+                            //sendITipReply(RM_ITIP_TENTATIVE);
+                            Horde::logMessage('Conflict detected; Passing mail through',
+                                              __FILE__, __LINE__, PEAR_LOG_INFO);
+                            return true;
+                        } else if ($action == RM_ACT_REJECT_IF_CONFLICTS) {
+                            Horde::logMessage('Conflict detected; rejecting',
+                                              __FILE__, __LINE__, PEAR_LOG_INFO);
+                            $this->sendITipReply($cn, $id, $itip, RM_ITIP_DECLINE,
+                                                 $organiser, $uid, $is_update);
+                            return false;
+                        }
+                    }
+                }
+            }
+
+            if (is_a($imap_error, 'PEAR_Error')) {
+                Horde::logMessage('Could not access users calendar; rejecting',
+                                  __FILE__, __LINE__, PEAR_LOG_INFO);
+                $this->sendITipReply($cn, $id, $itip, RM_ITIP_DECLINE,
+                                     $organiser, $uid, $is_update);
+                return false;
+            }
+
+            // At this point there was either no conflict or RM_ACT_ALWAYS_ACCEPT
+            // was specified; either way we add the new event & send an 'ACCEPT'
+            // iTip reply
+
+            Horde::logMessage(sprintf('Adding event %s', $uid),
+                              __FILE__, __LINE__, PEAR_LOG_INFO);
+
+            if (!empty($conf['kolab']['filter']['simple_locks'])) {
+                if (!empty($conf['kolab']['filter']['simple_locks_timeout'])) {
+                    $timeout = $conf['kolab']['filter']['simple_locks_timeout'];
+                } else {
+                    $timeout = 60;
+                }
+                if (!empty($conf['kolab']['filter']['simple_locks_dir'])) {
+                    $lockdir = $conf['kolab']['filter']['simple_locks_dir'];
+                } else {
+                    $lockdir = Horde::getTempDir() . '/Kolab_Filter_locks';
+                    if (!is_dir($lockdir)) {
+                        mkdir($lockdir, 0700);
+                    }
+                }
+                if (is_dir($lockdir)) {
+                    $lockfile = $lockdir . '/' . $resource . '.lock';
+                    $counter = 0;
+                    while ($counter < $timeout && @file_get_contents($lockfile) == 'LOCKED') {
+                        sleep(1);
+                        $counter++;
+                    }
+                    if ($counter == $timeout) {
+                        Horde::logMessage(sprintf('Lock timeout of %s seconds exceeded. Rejecting invitation.', $timeout),
+                                          __FILE__, __LINE__, PEAR_LOG_ERR);
+                        $this->sendITipReply($cn, $id, $itip, RM_ITIP_DECLINE,
+                                             $organiser, $uid, $is_update);
+                        return false;
+                    }
+                    $result = file_put_contents($lockfile, 'LOCKED');
+                    if ($result === false) {
+                        Horde::logMessage(sprintf('Failed creating lock file %s.', $lockfile),
+                                          __FILE__, __LINE__, PEAR_LOG_ERR);
+                    } else {
+                        $this->lockfile = $lockfile;
+                    }
+                } else {
+                    Horde::logMessage(sprintf('The lock directory %s is missing. Disabled locking.', $lockdir),
+                                      __FILE__, __LINE__, PEAR_LOG_ERR);
+                }
+            }
+
+            $result = $data->save($object, $old_uid);
+            if (is_a($result, 'PEAR_Error')) {
+                $result->code = OUT_LOG | EX_UNAVAILABLE;
+                return $result;
+            }
+
+            // Update our status within the iTip request and send the reply
+            $itip->setAttribute('STATUS', 'CONFIRMED', array(), false);
+            $attendees = $itip->getAttribute('ATTENDEE');
+            if (!is_array($attendees)) {
+                $attendees = array($attendees);
+            }
+            $attparams = $itip->getAttribute('ATTENDEE', true);
+            foreach ($attendees as $i => $attendee) {
+                $attendee = preg_replace('/^mailto:\s*/i', '', $attendee);
+                if ($attendee != $resource) {
+                    continue;
+                }
+
+                $attparams[$i]['PARTSTAT'] = 'ACCEPTED';
+                if (array_key_exists('RSVP', $attparams[$i])) {
+                    unset($attparams[$i]['RSVP']);
+                }
+            }
+
+            // Re-add all the attendees to the event, using our updates status info
+            $firstatt = array_pop($attendees);
+            $firstattparams = array_pop($attparams);
+            $itip->setAttribute('ATTENDEE', $firstatt, $firstattparams, false);
+            foreach ($attendees as $i => $attendee) {
+                $itip->setAttribute('ATTENDEE', $attendee, $attparams[$i]);
+            }
+
+            if ($outofperiod) {
+                $this->sendITipReply($cn, $resource, $itip, RM_ITIP_TENTATIVE,
+                                     $organiser, $uid, $is_update);
+                Horde::logMessage('No freebusy information available',
+                                  __FILE__, __LINE__, PEAR_LOG_NOTICE);
+            } else {
+                $this->sendITipReply($cn, $resource, $itip, RM_ITIP_ACCEPT,
+                                     $organiser, $uid, $is_update);
+            }
+            return false;
+
+        case 'CANCEL':
+            Horde::logMessage(sprintf('Removing event %s', $uid),
+                              __FILE__, __LINE__, PEAR_LOG_INFO);
+
+            if (is_a($imap_error, 'PEAR_Error')) {
+                $body = sprintf(_("Unable to access %s's calendar:"), $resource) . "\n\n" . $summary;
+                $subject = sprintf(_("Error processing \"%s\""), $summary);
+            } else if (!$data->objectUidExists($uid)) {
+                Horde::logMessage(sprintf('Canceled event %s is not present in %s\'s calendar',
+                                          $uid, $resource),
+                                  __FILE__, __LINE__, PEAR_LOG_WARNING);
+                $body = sprintf(_("The following event that was canceled is not present in %s's calendar:"), $resource) . "\n\n" . $summary;
+                $subject = sprintf(_("Error processing \"%s\""), $summary);
+            } else {
+                /**
+                 * Delete the messages from IMAP
+                 * Delete any old events that we updated
+                 */
+                Horde::logMessage(sprintf('Deleting %s because of cancel',
+                                          $uid),
+                                  __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+                $result = $data->delete($uid);
+                if (is_a($result, 'PEAR_Error')) {
+                    Horde::logMessage(sprintf('Deleting %s failed with %s',
+                                              $uid, $result->getMessage()),
+                                      __FILE__, __LINE__, PEAR_LOG_DEBUG);
+                }
+
+                $body = _("The following event has been successfully removed:") . "\n\n" . $summary;
+                $subject = sprintf(_("%s has been cancelled"), $summary);
+            }
+
+            Horde::logMessage(sprintf('Sending confirmation of cancelation to %s', $organiser),
+                              __FILE__, __LINE__, PEAR_LOG_WARNING);
+
+            $body = &new MIME_Part('text/plain', String::wrap($body, 76, "\n", 'utf-8'), 'utf-8');
+            $mime = &MIME_Message::convertMimePart($body);
+            $mime->setTransferEncoding('quoted-printable');
+            $mime->transferEncodeContents();
+
+            // Build the reply headers.
+            $msg_headers = &new MIME_Headers();
+            $msg_headers->addHeader('Date', date('r'));
+            $msg_headers->addHeader('From', $resource);
+            $msg_headers->addHeader('To', $organiser);
+            $msg_headers->addHeader('Subject', $subject);
+            $msg_headers->addMIMEHeaders($mime);
+
+            // Send the reply.
+            static $mailer;
+
+            if (!isset($mailer)) {
+                require_once 'Mail.php';
+                $mailer = &Mail::factory('SMTP', array('auth' => false));
+            }
+
+            $msg = $mime->toString();
+            if (is_object($msg_headers)) {
+                $headerArray = $mime->encode($msg_headers->toArray(), 'UTF-8');
+            } else {
+                $headerArray = $mime->encode($msg_headers, 'UTF-8');
+            }
+
+            /* Make sure the message has a trailing newline. */
+            if (substr($msg, -1) != "\n") {
+                $msg .= "\n";
+            }
+
+            $status = $mailer->send(MIME::encodeAddress($organiser), $headerArray, $msg);
+
+            //$status = $mime->send($organiser, $msg_headers);
+            if (is_a($status, 'PEAR_Error')) {
+                return PEAR::raiseError('Unable to send cancellation reply: ' . $status->getMessage(),
+                                        OUT_LOG | EX_TEMPFAIL);
+            } else {
+                Horde::logMessage('Successfully sent cancellation reply',
+                                  __FILE__, __LINE__, PEAR_LOG_INFO);
+            }
+
+            return false;;
+
+        default:
+            // We either don't currently handle these iTip methods, or they do not
+            // apply to what we're trying to accomplish here
+            Horde::logMessage(sprintf('Ignoring %s method and passing message through to %s',
+                                      $method, $resource),
+                              __FILE__, __LINE__, PEAR_LOG_INFO);
+            return true;
+        }
+    }
+
+    /**
+     * Helper function to clean up after handling an invitation
+     *
+     * @return NULL
+     */
+    function cleanup()
+    {
+        if (!empty($this->lockfile)) {
+            @unlink($this->lockfile);
+            if (file_exists($this->lockfile)) {
+                Horde::logMessage(sprintf('Failed removing the lockfile %s.', $lockfile),
+                                  __FILE__, __LINE__, PEAR_LOG_ERR);
+            }
+            $this->lockfile = null;
+        }
+    }
+
+    /**
+     * Helper function to assemble a free/busy uri.
+     *
+     * @param array $parsed  The set of parameters that may influence the URI.
+     *
+     * @return mixed The assembled URI or false.
+     */
+    function assembleUri($parsed)
+    {
+        if (!is_array($parsed)) {
+            return false;
+        }
+
+        $uri = empty($parsed['scheme']) ? '' :
+            $parsed['scheme'] . ':' . ((strtolower($parsed['scheme']) == 'mailto') ? '' : '//');
+
+        $uri .= empty($parsed['user']) ? '' :
+            ($parsed['user']) . (empty($parsed['pass']) ? '' :
+                                 ':'.($parsed['pass'])) . '@';
+
+        $uri .= empty($parsed['host']) ? '' : $parsed['host'];
+        $uri .= empty($parsed['port']) ? '' : ':' . $parsed['port'];
+        $uri .= empty($parsed['path']) ? '' : $parsed['path'];
+        $uri .= empty($parsed['query']) ? '' : '?' . $parsed['query'];
+        $uri .= empty($parsed['anchor']) ? '' : '#' . $parsed['anchor'];
+
+        return $uri;
+    }
+
+    /**
+     * Retrieve Free/Busy information for the specified resource via
+     * the given URL.
+     *
+     * @param string $resource  The name of the resource.
+     *
+     * @return Horde_iCalendar_vfreebusy|PEAR_Error The free/busy information.
+     */
+    function &internalGetFreeBusy($email)
+    {
+        global $conf;
+
+        $server = Horde_Kolab_Server::singleton();
+        $uid = $server->uidForMailAddress($email);
+        if (is_a($uid, 'PEAR_Error')) {
+            $uid->code = OUT_LOG | EX_UNAVAILABLE;
+            return $uid;
+        }
+
+        $user_object = $server->fetch($uid);
+        if (is_a($user_object, 'PEAR_Error')) {
+            $user_object->code = OUT_LOG | EX_UNAVAILABLE;
+            return $user_object;
+        }
+
+        $server = $user_object->getServer('freebusy');
+        if (is_a($server, 'PEAR_Error')) {
+            $server->code = OUT_LOG | EX_UNAVAILABLE;
+            return $server;
+        }
+
+        $fb_url = sprintf('%s/%s.xfb', $server, $email);
+
+        Horde::logMessage(sprintf('URL = %s', $fb_url), __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        $parsed = parse_url($fb_url);
+
+        list($user, $domain) = split('@', $email);
+        if (empty($domain)) {
+            $domain = $conf['kolab']['filter']['email_domain'];
+        }
+
+        $options['method'] = 'GET';
+        $options['timeout'] = 5;
+        $options['allowRedirects'] = true;
+
+        if (!empty($GLOBALS['conf']['http']['proxy']['proxy_host'])) {
+            $options = array_merge($options, $GLOBALS['conf']['http']['proxy']);
+        }
+
+        require_once 'HTTP/Request.php';
+        $http = new HTTP_Request($fb_url, $options);
+        $http->setBasicAuth($conf['kolab']['filter']['calendar_id'] . '@' . $domain,
+                            $conf['kolab']['filter']['calendar_pass']);
+        @$http->sendRequest();
+        if ($http->getResponseCode() != 200) {
+            return PEAR::raiseError(sprintf('Unable to retrieve free/busy information for %s',
+                                            $email),
+                                    OUT_LOG | EX_UNAVAILABLE);
+        }
+        $vfb_text = $http->getResponseBody();
+
+        $iCal = new Horde_iCalendar;
+        $iCal->parsevCalendar($vfb_text);
+
+        $vfb = &$iCal->findComponent('VFREEBUSY');
+
+        if ($vfb === false) {
+            return PEAR::raiseError(sprintf('Invalid or no free/busy information available for %s',
+                                            $resource),
+                                    OUT_LOG | EX_UNAVAILABLE);
+        }
+        $vfb->simplify();
+
+        return $vfb;
+    }
+
+    /**
+     * Send an automated reply.
+     *
+     * @param string  $cn                     Common name to be used in the iTip
+     *                                        response.
+     * @param string  $resource               Resource we send the reply for.
+     * @param string  $Horde_iCalendar_vevent The iTip information.
+     * @param int     $type                   Type of response.
+     * @param string  $organiser              The event organiser.
+     * @param string  $uid                    The UID of the event.
+     * @param boolean $is_update              Is this an event update?
+     */
+    function sendITipReply($cn, $resource, $itip, $type = RM_ITIP_ACCEPT,
+                           $organiser, $uid, $is_update)
+    {
+        Horde::logMessage(sprintf('sendITipReply(%s, %s, %s, %s)',
+                                  $cn, $resource, get_class($itip), $type),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        // Build the reply.
+        $vCal = &new Horde_iCalendar();
+        $vCal->setAttribute('PRODID', '-//kolab.org//NONSGML Kolab Server 2//EN');
+        $vCal->setAttribute('METHOD', 'REPLY');
+
+        $summary = _('No summary available');
+
+        $itip_reply =& Horde_iCalendar::newComponent('VEVENT', $vCal);
+        $itip_reply->setAttribute('UID', $uid);
+        if (!is_a($itip->getAttribute('SUMMARY'), 'PEAR_error')) {
+            $itip_reply->setAttribute('SUMMARY', $itip->getAttribute('SUMMARY'));
+            $summary = $itip->getAttribute('SUMMARY');
+        }
+        if (!is_a($itip->getAttribute('DESCRIPTION'), 'PEAR_error')) {
+            $itip_reply->setAttribute('DESCRIPTION', $itip->getAttribute('DESCRIPTION'));
+        }
+        if (!is_a($itip->getAttribute('LOCATION'), 'PEAR_error')) {
+            $itip_reply->setAttribute('LOCATION', $itip->getAttribute('LOCATION'));
+        }
+        $itip_reply->setAttribute('DTSTART', $itip->getAttribute('DTSTART'), array_pop($itip->getAttribute('DTSTART', true)));
+        if (!is_a($itip->getAttribute('DTEND'), 'PEAR_error')) {
+            $itip_reply->setAttribute('DTEND', $itip->getAttribute('DTEND'), array_pop($itip->getAttribute('DTEND', true)));
+        } else {
+            $itip_reply->setAttribute('DURATION', $itip->getAttribute('DURATION'), array_pop($itip->getAttribute('DURATION', true)));
+        }
+        if (!is_a($itip->getAttribute('SEQUENCE'), 'PEAR_error')) {
+            $itip_reply->setAttribute('SEQUENCE', $itip->getAttribute('SEQUENCE'));
+        } else {
+            $itip_reply->setAttribute('SEQUENCE', 0);
+        }
+        $itip_reply->setAttribute('ORGANIZER', $itip->getAttribute('ORGANIZER'), array_pop($itip->getAttribute('ORGANIZER', true)));
+
+        // Let's try and remove this code and just create
+        // the ATTENDEE stuff in the reply from scratch
+        //     $attendees = $itip->getAttribute( 'ATTENDEE' );
+        //     if( !is_array( $attendees ) ) {
+        //       $attendees = array( $attendees );
+        //     }
+        //     $params = $itip->getAttribute( 'ATTENDEE', true );
+        //     for( $i = 0; $i < count($attendees); $i++ ) {
+        //       $attendee = preg_replace('/^mailto:\s*/i', '', $attendees[$i]);
+        //       if ($attendee != $resource) {
+        //	continue;
+        //       }
+        //       $params = $params[$i];
+        //       break;
+        //     }
+
+        $params = array();
+        $params['CN'] = $cn;
+        switch ($type) {
+        case RM_ITIP_DECLINE:
+            Horde::logMessage(sprintf('Sending DECLINE iTip reply to %s',
+                                      $organiser),
+                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+            $message = $is_update
+                ? sprintf(_("%s has declined the update to the following event:"), $resource) . "\n\n" . $summary
+                : sprintf(_("%s has declined the invitation to the following event:"), $resource) . "\n\n" . $summary;
+            $subject = _("Declined: ") . $summary;
+            $params['PARTSTAT'] = 'DECLINED';
+            break;
+
+        case RM_ITIP_ACCEPT:
+            Horde::logMessage(sprintf('Sending ACCEPT iTip reply to %s', $organiser),
+                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+            $message = $is_update
+                ? sprintf(_("%s has accepted the update to the following event:"), $resource) . "\n\n" . $summary
+                : sprintf(_("%s has accepted the invitation to the following event:"), $resource) . "\n\n" . $summary;
+            $subject = _("Accepted: ") . $summary;
+            $params['PARTSTAT'] = 'ACCEPTED';
+            break;
+
+        case RM_ITIP_TENTATIVE:
+            Horde::logMessage(sprintf('Sending TENTATIVE iTip reply to %s', $organiser),
+                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+            $message = $is_update
+                ? sprintf(_("%s has tentatively accepted the update to the following event:"), $resource) . "\n\n" . $summary
+                : sprintf(_("%s has tentatively accepted the invitation to the following event:"), $resource) . "\n\n" . $summary;
+            $subject = _("Tentative: ") . $summary;
+            $params['PARTSTAT'] = 'TENTATIVE';
+            break;
+
+        default:
+            Horde::logMessage(sprintf('Unknown iTip method (%s passed to sendITipReply())', $type),
+                              __FILE__, __LINE__, PEAR_LOG_ERR);
+        }
+
+        $itip_reply->setAttribute('ATTENDEE', 'MAILTO:' . $resource, $params);
+        $vCal->addComponent($itip_reply);
+
+        $ics = &new MIME_Part('text/calendar', $vCal->exportvCalendar(), 'UTF-8' );
+        //$ics->setName('event-reply.ics');
+        $ics->setContentTypeParameter('method', 'REPLY');
+
+        //$mime->addPart($body);
+        //$mime->addPart($ics);
+        // The following was ::convertMimePart($mime). This was removed so that we
+        // send out single-part MIME replies that have the iTip file as the body,
+        // with the correct mime-type header set, etc. The reason we want to do this
+        // is so that Outlook interprets the messages as it does Outlook-generated
+        // responses, i.e. double-clicking a reply will automatically update your
+        // meetings, showing different status icons in the UI, etc.
+        $mime = &MIME_Message::convertMimePart($ics);
+        $mime->setCharset('UTF-8');
+        $mime->setTransferEncoding('quoted-printable');
+        $mime->transferEncodeContents();
+
+        // Build the reply headers.
+        $msg_headers = &new MIME_Headers();
+        $msg_headers->addHeader('Date', date('r'));
+        $msg_headers->addHeader('From', "$cn <$resource>");
+        $msg_headers->addHeader('To', $organiser);
+        $msg_headers->addHeader('Subject', $subject);
+        $msg_headers->addMIMEHeaders($mime);
+
+        // Send the reply.
+        static $mailer;
+
+        if (!isset($mailer)) {
+            require_once 'Mail.php';
+            $mailer = &Mail::factory('SMTP', array('auth' => false));
+        }
+
+        $msg = $mime->toString();
+        if (is_object($msg_headers)) {
+            $headerArray = $mime->encode($msg_headers->toArray(), $mime->getCharset());
+        } else {
+            $headerArray = $mime->encode($msg_headers, $mime->getCharset());
+        }
+
+        /* Make sure the message has a trailing newline. */
+        if (substr($msg, -1) != "\n") {
+            $msg .= "\n";
+        }
+
+        $status = $mailer->send(MIME::encodeAddress($organiser), $headerArray, $msg);
+
+        //$status = $mime->send($organiser, $msg_headers);
+        if (is_a($status, 'PEAR_Error')) {
+            Horde::logMessage('Unable to send iTip reply: %s' . $status->getMessage(),
+                              __FILE__, __LINE__, PEAR_LOG_ERR);
+        } else {
+            Horde::logMessage('Successfully sent iTip reply',
+                              __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        }
+    }
+
+
+    /**
+     * Clear information from a date array.
+     *
+     * @param array $ical_date  The array to clear.
+     *
+     * @return array The cleaned array.
+     */
+    function cleanArray($ical_date)
+    {
+        if (array_key_exists('hour', $ical_date)) {
+            $temp['hour']   = array_key_exists('hour', $ical_date) ? $ical_date['hour'] :  '00';
+            $temp['minute']   = array_key_exists('minute', $ical_date) ? $ical_date['minute'] :  '00';
+            $temp['second']   = array_key_exists('second', $ical_date) ? $ical_date['second'] :  '00';
+            $temp['zone']   = array_key_exists('zone', $ical_date) ? $ical_date['zone'] :  'UTC';
+        } else {
+            $temp['DATE'] = '1';
+        }
+        $temp['year']   = array_key_exists('year', $ical_date) ? $ical_date['year'] :  '0000';
+        $temp['month']   = array_key_exists('month', $ical_date) ? $ical_date['month'] :  '00';
+        $temp['mday']   = array_key_exists('mday', $ical_date) ? $ical_date['mday'] :  '00';
+
+        return $temp;
+    }
+
+    /**
+     * Conveert iCal dates to Kolab format.
+     *
+     * An all day event must have a dd--mm-yyyy notation and not a
+     * yyyy-dd-mmT00:00:00z notation Otherwise the event is shown as a
+     * 2-day event --> do not try to convert everything to epoch first
+     *
+     * @param array  $ical_date  The array to convert.
+     * @param string $type       The type of the date to convert.
+     *
+     * @return string The converted date.
+     */
+    function iCalDate2Kolab($ical_date, $type= ' ')
+    {
+        Horde::logMessage(sprintf('Converting to kolab format %s',
+                                  print_r($ical_date, true)),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        // $ical_date should be a timestamp
+        if (is_array($ical_date)) {
+            // going to create date again
+            $temp = $this->cleanArray($ical_date);
+            if (array_key_exists('DATE', $temp)) {
+                if ($type == 'ENDDATE') {
+                    // substract a day (86400 seconds) using epochs to take number of days per month into account
+                    $epoch= $this->convert2epoch($temp) - 86400;
+                    $date = gmstrftime('%Y-%m-%d', $epoch);
+                } else {
+                    $date= sprintf('%04d-%02d-%02d', $temp['year'], $temp['month'], $temp['mday']);
+                }
+            } else {
+                $time = sprintf('%02d:%02d:%02d', $temp['hour'], $temp['minute'], $temp['second']);
+                if ($temp['zone'] == 'UTC') {
+                    $time .= 'Z';
+                }
+                $date = sprintf('%04d-%02d-%02d', $temp['year'], $temp['month'], $temp['mday']) . 'T' . $time;
+            }
+        }  else {
+            $date = gmstrftime('%Y-%m-%dT%H:%M:%SZ', $ical_date);
+        }
+        Horde::logMessage(sprintf('To <%s>', $date),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        return $date;
+    }
+
+    /**
+     * Convert a date to an epoch.
+     *
+     * @param array  $values  The array to convert.
+     *
+     * @return int Time.
+     */
+    function convert2epoch($values)
+    {
+        Horde::logMessage(sprintf('Converting to epoch %s',
+                                  print_r($values, true)),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+        if (is_array($values)) {
+            $temp = $this->cleanArray($values);
+            $epoch = gmmktime($temp['hour'], $temp['minute'], $temp['second'],
+                              $temp['month'], $temp['mday'], $temp['year']);
+        } else {
+            $epoch=$values;
+        }
+
+        Horde::logMessage(sprintf('Converted <%s>', $epoch),
+                          __FILE__, __LINE__, PEAR_LOG_DEBUG);
+        return $epoch;
+    }
+}
diff --git a/Kolab_Filter-0.1.7/lib/Horde/Kolab/Test/Filter.php b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Test/Filter.php
new file mode 100644
index 0000000..05f2ee0
--- /dev/null
+++ b/Kolab_Filter-0.1.7/lib/Horde/Kolab/Test/Filter.php
@@ -0,0 +1,289 @@
+<?php
+/**
+ * Base for PHPUnit scenarios.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Test/Filter.php,v 1.1.2.3 2009-03-06 08:43:15 wrobel Exp $
+ *
+ * PHP version 5
+ *
+ * @category Kolab
+ * @package  Kolab_Test
+ * @author   Gunnar Wrobel <wrobel at pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+
+/**
+ *  We need the unit test framework
+ */
+require_once 'Horde/Kolab/Test/Storage.php';
+
+/**
+ * Base for PHPUnit scenarios.
+ *
+ * $Horde: framework/Kolab_Filter/lib/Horde/Kolab/Test/Filter.php,v 1.1.2.3 2009-03-06 08:43:15 wrobel Exp $
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @category Kolab
+ * @package  Kolab_Test
+ * @author   Gunnar Wrobel <wrobel at pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Kolab_Storage
+ */
+class Horde_Kolab_Test_Filter extends Horde_Kolab_Test_Storage
+{
+    /**
+     * Set up testing.
+     */
+    protected function setUp()
+    {
+        $result = $this->prepareBasicSetup();
+
+        $this->server  = &$result['server'];
+        $this->storage = &$result['storage'];
+        $this->auth    = &$result['auth'];
+
+        global $conf;
+
+        $conf['kolab']['imap']['server'] = 'localhost';
+        $conf['kolab']['imap']['port']   = 0;
+        $conf['kolab']['imap']['allow_special_users'] = true;
+        $conf['kolab']['filter']['reject_forged_from_header'] = false;
+        $conf['kolab']['filter']['email_domain'] = 'example.org';
+        $conf['kolab']['filter']['privileged_networks'] = '127.0.0.1,192.168.0.0/16';
+        $conf['kolab']['filter']['verify_from_header'] = true;
+        $conf['kolab']['filter']['calendar_id'] = 'calendar';
+        $conf['kolab']['filter']['calendar_pass'] = 'calendar';
+        $conf['kolab']['filter']['lmtp_host'] = 'imap.example.org';
+        $conf['kolab']['filter']['simple_locks'] = true;
+        $conf['kolab']['filter']['simple_locks_timeout'] = 3;
+
+        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
+        $this->assertNoError($result);
+
+        $folder = $this->storage->getNewFolder();
+        $folder->setName('Kalender');
+        $result = $folder->save(array('type' => 'event',
+                                      'default' => true));
+        $this->assertNoError($result);
+    }
+
+    /**
+     * Handle a "given" step.
+     *
+     * @param array  &$world    Joined "world" of variables.
+     * @param string $action    The description of the step.
+     * @param array  $arguments Additional arguments to the step.
+     *
+     * @return mixed The outcome of the step.
+     */
+    public function runGiven(&$world, $action, $arguments)
+    {
+        switch($action) {
+        default:
+            return parent::runGiven($world, $action, $arguments);
+        }
+    }
+
+    /**
+     * Handle a "when" step.
+     *
+     * @param array  &$world    Joined "world" of variables.
+     * @param string $action    The description of the step.
+     * @param array  $arguments Additional arguments to the step.
+     *
+     * @return mixed The outcome of the step.
+     */
+    public function runWhen(&$world, $action, $arguments)
+    {
+        switch($action) {
+        default:
+            return parent::runWhen($world, $action, $arguments);
+        }
+    }
+
+    /**
+     * Handle a "then" step.
+     *
+     * @param array  &$world    Joined "world" of variables.
+     * @param string $action    The description of the step.
+     * @param array  $arguments Additional arguments to the step.
+     *
+     * @return mixed The outcome of the step.
+     */
+    public function runThen(&$world, $action, $arguments)
+    {
+        switch($action) {
+        default:
+            return parent::runThen($world, $action, $arguments);
+        }
+    }
+
+    /**
+     * Fill a Kolab Server with test users.
+     *
+     * @param Kolab_Server &$server The server to populate.
+     *
+     * @return Horde_Kolab_Server The empty server.
+     */
+    public function prepareUsers(&$server)
+    {
+        parent::prepareUsers(&$server);
+        $result = $server->add($this->provideFilterUserOne());
+        $this->assertNoError($result);
+        $result = $server->add($this->provideFilterUserTwo());
+        $this->assertNoError($result);
+        $result = $server->add($this->provideFilterUserThree());
+        $this->assertNoError($result);
+        $result = $server->add($this->provideFilterCalendarUser());
+        $this->assertNoError($result);
+    }
+
+    /**
+     * Return a test user.
+     *
+     * @return array The test user.
+     */
+    public function provideFilterUserOne()
+    {
+        return array('givenName' => 'Me',
+                     'sn' => 'Me',
+                     'type' => KOLAB_OBJECT_USER,
+                     'mail' => 'me at example.org',
+                     'uid' => 'me',
+                     'userPassword' => 'me',
+                     'kolabHomeServer' => 'home.example.org',
+                     'kolabImapServer' => 'imap.example.org',
+                     'kolabFreeBusyServer' => 'https://fb.example.org/freebusy',
+                     KOLAB_ATTR_IPOLICY => array('ACT_REJECT_IF_CONFLICTS'),
+                     'alias' => array('me.me at example.org', 'MEME at example.org'),
+                );
+    }
+
+    /**
+     * Return a test user.
+     *
+     * @return array The test user.
+     */
+    public function provideFilterUserTwo()
+    {
+        return array('givenName' => 'You',
+                     'sn' => 'You',
+                     'type' => KOLAB_OBJECT_USER,
+                     'mail' => 'you at example.org',
+                     'uid' => 'you',
+                     'userPassword' => 'you',
+                     'kolabHomeServer' => 'home.example.org',
+                     'kolabImapServer' => 'home.example.org',
+                     'kolabFreeBusyServer' => 'https://fb.example.org/freebusy',
+                     'alias' => array('you.you at example.org'),
+                     KOLAB_ATTR_KOLABDELEGATE => 'wrobel at example.org',);
+    }
+
+    /**
+     * Return a test user.
+     *
+     * @return array The test user.
+     */
+    public function provideFilterUserThree()
+    {
+        return array('givenName' => 'Else',
+                     'sn' => 'Else',
+                     'type' => KOLAB_OBJECT_USER,
+                     'mail' => 'else at example.org',
+                     'uid' => 'else',
+                     'userPassword' => 'else',
+                     'kolabHomeServer' => 'imap.example.org',
+                     'kolabImapServer' => 'imap.example.org',
+                     'kolabFreeBusyServer' => 'https://fb.example.org/freebusy',
+                     KOLAB_ATTR_KOLABDELEGATE => 'me at example.org',);
+    }
+
+    /**
+     * Return the calendar user.
+     *
+     * @return array The calendar user.
+     */
+    public function provideFilterCalendarUser()
+    {
+        return array('cn' => 'calendar',
+                     'sn' => 'calendar',
+                     'givenName' => '',
+                     'type' => KOLAB_OBJECT_USER,
+                     'mail' => 'calendar at example.org',
+                     'uid' => 'calendar at home.example.org',
+                     'userPassword' => 'calendar',
+                     'kolabHomeServer' => 'home.example.org',
+                     'kolabImapServer' => 'imap.example.org',
+                );
+    }
+
+    public function sendFixture($infile, $outfile, $user, $client, $from, $to,
+                                $host, $params = array())
+    {
+        $_SERVER['argv'] = array($_SERVER['argv'][0],
+                                 '--sender=' . $from,
+                                 '--recipient=' . $to,
+                                 '--user=' . $user,
+                                 '--host=' . $host,
+                                 '--client=' . $client);
+
+        $in = file_get_contents($infile, 'r');
+
+        $tmpfile = Util::getTempFile('KolabFilterTest');
+        $tmpfh = @fopen($tmpfile, 'w');
+        if (empty($params['unmodified_content'])) {
+            @fwrite($tmpfh, sprintf($in, $from, $to));
+        } else {
+            @fwrite($tmpfh, $in);
+        }
+        @fclose($tmpfh);
+
+        $inh = @fopen($tmpfile, 'r');
+
+        /* Setup the class */
+        if (empty($params['incoming'])) {
+            require_once 'Horde/Kolab/Filter/Content.php';
+            $parser = &new Horde_Kolab_Filter_Content();
+        } else {
+            require_once 'Horde/Kolab/Filter/Incoming.php';
+            $parser = &new Horde_Kolab_Filter_Incoming();
+        }
+
+        ob_start();
+
+        /* Parse the mail */
+        $result = $parser->parse($inh, 'echo');
+        if (empty($params['error'])) {
+            $this->assertNoError($result);
+            $this->assertTrue(empty($result));
+
+            $output = ob_get_contents();
+            ob_end_clean();
+
+            $out = file_get_contents($outfile);
+
+            $output = preg_replace('/^--+=.*$/m', '----', $output);
+            $out    = preg_replace('/^--+=.*$/m', '----', $out);
+            $output = preg_replace('/^Message-ID.*$/m', '----', $output);
+            $out    = preg_replace('/^Message-ID.*$/m', '----', $out);
+            $output = preg_replace('/boundary=.*$/m', '----', $output);
+            $out    = preg_replace('/boundary=.*$/m', '----', $out);
+            $output = preg_replace('/\s/', '', $output);
+            $out    = preg_replace('/\s/', '', $out);
+
+            if (empty($params['unmodified_content'])) {
+                $this->assertEquals(sprintf($out, $from, $to), $output);
+            } else {
+                $this->assertEquals($out, $output);
+            }
+        } else {
+            $this->assertError($result, $params['error']);
+        }
+
+    }
+}
diff --git a/Kolab_Filter-0.1.7/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo b/Kolab_Filter-0.1.7/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo
new file mode 100644
index 0000000..a78791b
Binary files /dev/null and b/Kolab_Filter-0.1.7/locale/de_DE/LC_MESSAGES/Kolab_Filter.mo differ
diff --git a/Kolab_Filter-0.1.7/locale/fr_FR/LC_MESSAGES/Kolab_Filter.mo b/Kolab_Filter-0.1.7/locale/fr_FR/LC_MESSAGES/Kolab_Filter.mo
new file mode 100644
index 0000000..4e99bed
Binary files /dev/null and b/Kolab_Filter-0.1.7/locale/fr_FR/LC_MESSAGES/Kolab_Filter.mo differ
diff --git a/Kolab_Filter-0.1.7/po/Kolab_Filter.pot b/Kolab_Filter-0.1.7/po/Kolab_Filter.pot
new file mode 100644
index 0000000..070ff2c
--- /dev/null
+++ b/Kolab_Filter-0.1.7/po/Kolab_Filter.pot
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Horde Project
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: dev at lists.horde.org\n"
+"POT-Creation-Date: 2008-12-14 17:09+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:887
+#: lib/Horde/Kolab/Resource.php:887
+#, php-format
+msgid "%s has accepted the invitation to the following event:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:886
+#: lib/Horde/Kolab/Resource.php:886
+#, php-format
+msgid "%s has accepted the update to the following event:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:621
+#: lib/Horde/Kolab/Resource.php:621
+#, php-format
+msgid "%s has been cancelled"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:877
+#: lib/Horde/Kolab/Resource.php:877
+#, php-format
+msgid "%s has declined the invitation to the following event:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:876
+#: lib/Horde/Kolab/Resource.php:876
+#, php-format
+msgid "%s has declined the update to the following event:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:897
+#: lib/Horde/Kolab/Resource.php:897
+#, php-format
+msgid "%s has tentatively accepted the invitation to the following event:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:896
+#: lib/Horde/Kolab/Resource.php:896
+#, php-format
+msgid "%s has tentatively accepted the update to the following event:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php:403
+#: lib/Horde/Kolab/Filter/Content.php:403
+#, php-format
+msgid "(UNTRUSTED, sender <%s> is not authenticated)"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php:397
+#: lib/Horde/Kolab/Filter/Content.php:397
+#, php-format
+msgid "(UNTRUSTED, sender is <%s>)"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:888
+#: lib/Horde/Kolab/Resource.php:888
+msgid "Accepted: "
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:878
+#: lib/Horde/Kolab/Resource.php:878
+msgid "Declined: "
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:603
+#: lib/Horde/Kolab/Resource.php:603
+#, php-format
+msgid "Error processing \"%s\""
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:825
+#: lib/Horde/Kolab/Resource.php:825
+msgid "No summary available"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:898
+#: lib/Horde/Kolab/Resource.php:898
+msgid "Tentative: "
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:620
+#: lib/Horde/Kolab/Resource.php:620
+msgid "The following event has been successfully removed:"
+msgstr ""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:602
+#: lib/Horde/Kolab/Resource.php:602
+#, php-format
+msgid "The following event that was canceled is not present in %s's calendar:"
+msgstr ""
diff --git a/Kolab_Filter-0.1.7/po/de_DE.po b/Kolab_Filter-0.1.7/po/de_DE.po
new file mode 100644
index 0000000..e643372
--- /dev/null
+++ b/Kolab_Filter-0.1.7/po/de_DE.po
@@ -0,0 +1,109 @@
+# German translations for Kolab_Filter package
+# German messages for Kolab_Filter.
+# Copyright (C) 2008 KDAB
+# This file is distributed under the same license as the Kolab_Filter package.
+# Gunnar Wrobel <p at rdus.de>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Kolab_Filter\n"
+"Report-Msgid-Bugs-To: p at rdus.de\n"
+"POT-Creation-Date: 2008-12-14 17:09+0100\n"
+"PO-Revision-Date: 2008-12-14 17:58+0100\n"
+"Last-Translator:  <p at rdus.de>\n"
+"Language-Team: German\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:887
+#: lib/Horde/Kolab/Resource.php:887
+#, php-format
+msgid "%s has accepted the invitation to the following event:"
+msgstr "%s hat die Einladung für folgenden Termin akzeptiert:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:886
+#: lib/Horde/Kolab/Resource.php:886
+#, php-format
+msgid "%s has accepted the update to the following event:"
+msgstr "%s hat die Aktualisierung für folgenden Termin akzeptiert:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:621
+#: lib/Horde/Kolab/Resource.php:621
+#, php-format
+msgid "%s has been cancelled"
+msgstr "%s wurde storniert."
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:877
+#: lib/Horde/Kolab/Resource.php:877
+#, php-format
+msgid "%s has declined the invitation to the following event:"
+msgstr "%s hat die Einladung für folgenden Termin abgelehnt:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:876
+#: lib/Horde/Kolab/Resource.php:876
+#, php-format
+msgid "%s has declined the update to the following event:"
+msgstr "%s hat die Aktualisierung für folgenden Termin abgelehnt:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:897
+#: lib/Horde/Kolab/Resource.php:897
+#, php-format
+msgid "%s has tentatively accepted the invitation to the following event:"
+msgstr "%s hat die Einladung für folgenden Termin unter Vorbehalt akzeptiert:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:896
+#: lib/Horde/Kolab/Resource.php:896
+#, php-format
+msgid "%s has tentatively accepted the update to the following event:"
+msgstr "%s hat die Aktualisierung für folgenden Termin unter Vorbehalt akzeptiert:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php:403
+#: lib/Horde/Kolab/Filter/Content.php:403
+#, php-format
+msgid "(UNTRUSTED, sender <%s> is not authenticated)"
+msgstr "(NICHT VERTRAUENSWÃœRDIG, der Absender <%s> ist nicht authentifiziert)"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Filter/Content.php:397
+#: lib/Horde/Kolab/Filter/Content.php:397
+#, php-format
+msgid "(UNTRUSTED, sender is <%s>)"
+msgstr "(NICHT VERTRAUENSWÃœRDIG, der Absender ist <%s>)"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:888
+#: lib/Horde/Kolab/Resource.php:888
+msgid "Accepted: "
+msgstr "Akzeptiert: "
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:878
+#: lib/Horde/Kolab/Resource.php:878
+msgid "Declined: "
+msgstr "Abgelehnt: "
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:603
+#: lib/Horde/Kolab/Resource.php:603
+#, php-format
+msgid "Error processing \"%s\""
+msgstr "Fehler beim Verarbeiten von \"%s\""
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:825
+#: lib/Horde/Kolab/Resource.php:825
+msgid "No summary available"
+msgstr "Keine Zusammenfassung verfügbar"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:898
+#: lib/Horde/Kolab/Resource.php:898
+msgid "Tentative: "
+msgstr "Unter Vorbehalt: "
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:620
+#: lib/Horde/Kolab/Resource.php:620
+msgid "The following event has been successfully removed:"
+msgstr "Der folgende Termin wurde erfolgreich gelöscht:"
+
+#: framework/Kolab_Filter/lib/Horde/Kolab/Resource.php:602
+#: lib/Horde/Kolab/Resource.php:602
+#, php-format
+msgid "The following event that was canceled is not present in %s's calendar:"
+msgstr "Es wurde versucht den folgenden Termin zu löschen, aber dieser ist im Kalender von %s nicht vorhanden:"
diff --git a/Kolab_Filter-0.1.7/po/fr_FR.po b/Kolab_Filter-0.1.7/po/fr_FR.po
new file mode 100644
index 0000000..e6c3d42
--- /dev/null
+++ b/Kolab_Filter-0.1.7/po/fr_FR.po
@@ -0,0 +1,61 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Kolab_Filter\n"
+"Report-Msgid-Bugs-To: p at rdus.de\n"
+"POT-Creation-Date: 2008-12-14 17:09+0100\n"
+"PO-Revision-Date: 2009-03-17 11:44+0100\n"
+"Last-Translator: Mathieu Parent <math.parent at gmail.com>\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);"
+
+msgid "%s has accepted the invitation to the following event:"
+msgstr "%s a accepté l'invitation pour l'évenement suivant :"
+
+msgid "%s has accepted the update to the following event:"
+msgstr "%s a accepté la mise à jour de l'évenement suivant :"
+
+msgid "%s has been cancelled"
+msgstr "%s a été annulé."
+
+msgid "%s has declined the invitation to the following event:"
+msgstr "%s a refusé l'invitation pour l'évenement suivant :"
+
+msgid "%s has declined the update to the following event:"
+msgstr "%s a refusé la mise à jour de l'évenement suivant :"
+
+msgid "%s has tentatively accepted the invitation to the following event:"
+msgstr "%s a provisoirement accepté l'invitation pour l'évenement suivant :"
+
+msgid "%s has tentatively accepted the update to the following event:"
+msgstr "%s a provisoirement accepté la mise à jour pour l'évenement suivant :"
+
+msgid "(UNTRUSTED, sender <%s> is not authenticated)"
+msgstr "(SUSPECT, l'expéditeur <%s> n'est pas authentifié)"
+
+msgid "(UNTRUSTED, sender is <%s>)"
+msgstr "(SUSPECT, l'expéditeur est <%s>)"
+
+msgid "Accepted: "
+msgstr "Accepté : "
+
+msgid "Declined: "
+msgstr "Refusé : "
+
+msgid "Error processing \"%s\""
+msgstr "Erreur lors du traitement de \"%s\""
+
+msgid "No summary available"
+msgstr "Résumé non disponible"
+
+msgid "Tentative: "
+msgstr "Tentative : "
+
+msgid "The following event has been successfully removed:"
+msgstr "L'évenement suivant a été enlevé avec succès :"
+
+msgid "The following event that was canceled is not present in %s's calendar:"
+msgstr ""
+"L'évenement suivant qui a été annulé n'est pas présent dans l'agenda de %s :"
diff --git a/Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabfilter.php b/Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabfilter.php
new file mode 100644
index 0000000..6ba698d
--- /dev/null
+++ b/Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabfilter.php
@@ -0,0 +1,30 @@
+#!@php_bin@
+<?php
+/**
+ *  A filter for outgoing mail on a Kolab Server. It rewrites headers
+ *  and handles Outlook issues.
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * $Horde: framework/Kolab_Filter/script/Horde/Kolab/Filter/kolabfilter.php,v 1.3.2.1 2009-02-20 22:37:16 wrobel Exp $
+ *
+ * @package Kolab
+ */
+
+/** Kolab filter library */
+require_once 'Horde/Kolab/Filter/Content.php';
+require_once 'Horde/Kolab/Filter/Response.php';
+
+/* Parse the mail */
+$parser = &new Horde_Kolab_Filter_Content();
+$response = &new Horde_Kolab_Filter_Response();
+
+$result = $parser->parse();
+if (is_a($result, 'PEAR_Error')) {
+    $response->handle($result);
+}
+exit(0);
+?>
diff --git a/Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabmailboxfilter.php b/Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabmailboxfilter.php
new file mode 100644
index 0000000..1cf36b6
--- /dev/null
+++ b/Kolab_Filter-0.1.7/script/Horde/Kolab/Filter/kolabmailboxfilter.php
@@ -0,0 +1,30 @@
+#!@php_bin@
+<?php
+/**
+ *  A filter for incoming mail on a Kolab Server. It checks the
+ *  messages for iCal data and handles automatic invitations.
+ *
+ * Copyright 2004-2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * $Horde: framework/Kolab_Filter/script/Horde/Kolab/Filter/kolabmailboxfilter.php,v 1.3.2.1 2009-02-20 22:37:16 wrobel Exp $
+ *
+ * @package Kolab
+ */
+
+/** Kolab filter library */
+require_once 'Horde/Kolab/Filter/Incoming.php';
+require_once 'Horde/Kolab/Filter/Response.php';
+
+/* Parse the mail */
+$parser = &new Horde_Kolab_Filter_Incoming();
+$response = &new Horde_Kolab_Filter_Response();
+
+$result = $parser->parse();
+if (is_a($result, 'PEAR_Error')) {
+    $response->handle($result);
+}
+exit(0);
+?>
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/AllTests.php b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/AllTests.php
new file mode 100644
index 0000000..6843190
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/AllTests.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * All tests for the Horde_Kolab_Filter:: package.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/AllTests.php,v 1.2.2.1 2009-02-20 22:37:17 wrobel Exp $
+ *
+ * @package Horde_Kolab_Filter
+ */
+
+/**
+ * Define the main method 
+ */
+if (!defined('PHPUnit_MAIN_METHOD')) {
+    define('PHPUnit_MAIN_METHOD', 'Horde_Kolab_Filter_AllTests::main');
+}
+
+require_once 'PHPUnit/Framework/TestSuite.php';
+require_once 'PHPUnit/TextUI/TestRunner.php';
+
+/**
+ * Combine the tests for this package.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/AllTests.php,v 1.2.2.1 2009-02-20 22:37:17 wrobel Exp $
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @package Horde_Kolab_Filter
+ */
+class Horde_Kolab_Filter_AllTests {
+
+    public static function main()
+    {
+        PHPUnit_TextUI_TestRunner::run(self::suite());
+    }
+
+    public static function suite()
+    {
+        $suite = new PHPUnit_Framework_TestSuite('Horde Framework - Horde_Kolab_Filter');
+
+        $basedir = dirname(__FILE__);
+        $baseregexp = preg_quote($basedir . DIRECTORY_SEPARATOR, '/');
+
+        foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($basedir)) as $file) {
+            if ($file->isFile() && preg_match('/Test.php$/', $file->getFilename())) {
+                $pathname = $file->getPathname();
+                require $pathname;
+
+                $class = str_replace(DIRECTORY_SEPARATOR, '_',
+                                     preg_replace("/^$baseregexp(.*)\.php/", '\\1', $pathname));
+                $suite->addTestSuite('Horde_Kolab_Filter_' . $class);
+            }
+        }
+
+        return $suite;
+    }
+
+}
+
+if (PHPUnit_MAIN_METHOD == 'Horde_Kolab_Filter_AllTests::main') {
+    Horde_Kolab_Filter_AllTests::main();
+}
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ContentTest.php b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ContentTest.php
new file mode 100644
index 0000000..de9a5e1
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ContentTest.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * Test the content filter class within the Kolab filter implementation.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ContentTest.php,v 1.6.2.3 2009-03-05 10:08:54 wrobel Exp $
+ *
+ * @package Horde_Kolab_Filter
+ */
+
+/**
+ *  We need the unit test framework 
+ */
+require_once 'Horde/Kolab/Test/Filter.php';
+
+require_once 'Horde.php';
+require_once 'Horde/Kolab/Filter/Content.php';
+
+/**
+ * Test the content filter.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ContentTest.php,v 1.6.2.3 2009-03-05 10:08:54 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Horde_Kolab_Filter
+ */
+class Horde_Kolab_Filter_ContentTest extends Horde_Kolab_Test_Filter
+{
+
+    /**
+     * Test sending messages through the content filter.
+     *
+     * @dataProvider addressCombinations
+     */
+    public function testContentHandler($infile, $outfile, $user, $client, $from,
+                                       $to, $host, $params = array())
+    {
+        $this->sendFixture($infile, $outfile, $user, $client, $from, $to,
+                           $host, $params);
+    }
+
+    /**
+     * Provides various test situations for the Kolab content filter.
+     */
+    public function addressCombinations()
+    {
+        return array(
+            /**
+             * Test a simple message
+             */
+            array(dirname(__FILE__) . '/fixtures/vacation.eml',
+                  dirname(__FILE__) . '/fixtures/vacation.ret',
+                  '', '', 'me at example.org', 'you at example.net', 'example.org',
+                  array('unmodified_content' => true)),
+            /**
+             * Test a simple message
+             */
+            array(dirname(__FILE__) . '/fixtures/tiny.eml',
+                  dirname(__FILE__) . '/fixtures/tiny.ret',
+                  '', '', 'me at example.org', 'you at example.org', 'example.org',
+                  array('unmodified_content' => true)),
+            /**
+             * Test a simple message
+             */
+            array(dirname(__FILE__) . '/fixtures/simple.eml',
+                  dirname(__FILE__) . '/fixtures/simple_out.ret',
+                  '', '', 'me at example.org', 'you at example.org', 'example.org',
+                  array('unmodified_content' => true)),
+            /**
+             * Test sending from a remote server without authenticating. This
+             * will be considered forging the sender.
+             */
+            array(dirname(__FILE__) . '/fixtures/forged.eml',
+                  dirname(__FILE__) . '/fixtures/forged.ret',
+                  '', '10.0.0.1', 'me at example.org', 'you at example.org', 'example.org',
+                  array('unmodified_content' => true)),
+            /**
+             * Test sending from a remote server without authenticating but
+             * within the priviledged network. This will not be considered
+             * forging the sender.
+             */
+            array(dirname(__FILE__) . '/fixtures/forged.eml',
+                  dirname(__FILE__) . '/fixtures/privileged.ret',
+                  '', '192.168.178.1', 'me at example.org', 'you at example.org', 'example.org',
+                  array('unmodified_content' => true)),
+            /**
+             * Test authenticated sending of a message from a remote client.
+             */
+            array(dirname(__FILE__) . '/fixtures/validation.eml',
+                  dirname(__FILE__) . '/fixtures/validation.ret',
+                  'me at example.org', 'remote.example.org', 'me at example.org', 'you at example.org', 'example.org'),
+            /**
+             * Test authenticated sending of a message from a remote client
+             * using an alias.
+             */
+            array(dirname(__FILE__) . '/fixtures/validation.eml',
+                  dirname(__FILE__) . '/fixtures/validation.ret',
+                  'me at example.org', 'remote.example.org', 'me.me at example.org', 'you at example.org', 'example.org'),
+            /**
+             * Test authenticated sending of a message from a remote client
+             * using an alias with capitals (MEME at example.org).
+             */
+            array(dirname(__FILE__) . '/fixtures/validation.eml',
+                  dirname(__FILE__) . '/fixtures/validation.ret',
+                  'me at example.org', 'remote.example.org', 'meme at example.org', 'you at example.org', 'example.org'),
+            /**
+             * Test authenticated sending of a message from a remote client
+             * as delegate
+             */
+            array(dirname(__FILE__) . '/fixtures/validation.eml',
+                  dirname(__FILE__) . '/fixtures/validation.ret',
+                  'me at example.org', 'remote.example.org', 'else at example.org', 'you at example.org', 'example.org'),
+            /**
+             * Test authenticated sending of a message from a remote client
+             * with an address that is not allowed.
+             */
+            array(dirname(__FILE__) . '/fixtures/validation.eml',
+                  dirname(__FILE__) . '/fixtures/validation.ret',
+                  'me at example.org', 'remote.example.org', 'else3 at example.org', 'you at example.org', 'example.org',
+                  array('error' =>'Invalid From: header. else3 at example.org looks like a forged sender')),
+            /**
+             * Test forwarding an invitation
+             */
+            array(dirname(__FILE__) . '/fixtures/invitation_forward.eml',
+                  dirname(__FILE__) . '/fixtures/invitation_forward.ret',
+                  'me at example.org', '10.0.2.1', 'me at example.org', 'you at example.org', 'example.org'),
+        );
+    }
+
+    /**
+     * Test rejecting a forged from header.
+     */
+    public function testRejectingForgedFromHeader()
+    {
+        global $conf;
+
+        $conf['kolab']['filter']['reject_forged_from_header'] = true;
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/forged.eml',
+                           dirname(__FILE__) . '/fixtures/forged.ret',
+                           '', '10.0.0.1', 'me at example.org', 'you at example.org', 'example.org',
+                           array('error' =>'Invalid From: header. me at example.org looks like a forged sender',
+                                 'unmodified_content' => true));
+    }
+
+    /**
+     * Test translated forged from headers.
+     */
+    public function testTranslatedForgedFromHeader()
+    {
+        global $conf;
+
+        $conf['kolab']['filter']['locale_path'] = dirname(__FILE__) . '/../../../../locale';
+        $conf['kolab']['filter']['locale'] = 'de_DE';
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/forged.eml',
+                           dirname(__FILE__) . '/fixtures/forged_trans.ret',
+                           '', '10.0.0.1', 'me at example.org', 'you at example.org', 'example.org',
+                           array('unmodified_content' => true));
+    }
+
+}
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/FilterTest.php b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/FilterTest.php
new file mode 100644
index 0000000..b38eb8d
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/FilterTest.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Test the base filter class within the Kolab filter implementation.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/FilterTest.php,v 1.6.2.2 2009-02-24 11:17:40 wrobel Exp $
+ *
+ * @package Horde_Kolab_Filter
+ */
+
+/**
+ *  We need the unit test framework 
+ */
+require_once 'PHPUnit/Framework.php';
+require_once 'PHPUnit/Extensions/OutputTestCase.php';
+
+require_once 'Horde.php';
+require_once 'Horde/Kolab/Filter/Incoming.php';
+
+/**
+ * Test the filter class.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/FilterTest.php,v 1.6.2.2 2009-02-24 11:17:40 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Horde_Kolab_Filter
+ */
+class Horde_Kolab_Filter_FilterTest extends PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Set up testing.
+     */
+    protected function setUp()
+    {
+        $GLOBALS['conf']['log']['enabled']          = false;
+
+        $_SERVER['SERVER_NAME'] = 'localhost';
+        $_SERVER['REMOTE_ADDR'] = 'ADDR';
+        $_SERVER['REMOTE_HOST'] = 'HOST';
+    }
+
+
+    /**
+     * Test incorrect usage of the Filter
+     */
+    public function testIncorrectUsage()
+    {
+        $_SERVER['argv'] = array($_SERVER['argv'][0]);
+        $parser   = &new Horde_Kolab_Filter_Incoming();
+        $inh = fopen(dirname(__FILE__) . '/fixtures/tiny.eml', 'r');
+        $result = $parser->parse($inh, 'echo');
+
+        $this->assertTrue(is_a($result, 'PEAR_Error'));
+
+        $this->assertContains('Please provide one or more recipients.', $result->getMessage());
+    }
+}
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/IncomingTest.php b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/IncomingTest.php
new file mode 100644
index 0000000..8f4d1b2
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/IncomingTest.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Test the incoming filter class within the Kolab filter implementation.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/IncomingTest.php,v 1.6.2.2 2009-02-24 11:17:40 wrobel Exp $
+ *
+ * @package Horde_Kolab_Filter
+ */
+
+/**
+ *  We need the base class
+ */
+require_once 'Horde/Kolab/Test/Filter.php';
+
+/**
+ *  We need the unit test framework 
+ */
+require_once 'PHPUnit/Extensions/OutputTestCase.php';
+
+require_once 'Horde.php';
+require_once 'Horde/Kolab/Filter/Incoming.php';
+
+/**
+ * Test the incoming filter.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/IncomingTest.php,v 1.6.2.2 2009-02-24 11:17:40 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Horde_Kolab_Filter
+ */
+class Horde_Kolab_Filter_IncomingTest extends Horde_Kolab_Test_Filter
+{
+
+/*     /\** */
+/*      * Set up testing. */
+/*      *\/ */
+/*     protected function setUp() */
+/*     { */
+/*         global $conf; */
+
+/*         $conf = array(); */
+
+/*         $test = new Horde_Kolab_Test(); */
+/*         $test->prepareBasicSetup(); */
+
+/*         $conf['log']['enabled']          = false; */
+
+/*         $conf['kolab']['filter']['debug'] = true; */
+
+/*         $conf['kolab']['imap']['server'] = 'localhost'; */
+/*         $conf['kolab']['imap']['port']   = 0; */
+
+/*         $_SERVER['SERVER_NAME'] = 'localhost'; */
+/*     } */
+
+
+    /**
+     * Test receiving the simple.eml message.
+     */
+    public function testSimpleIn()
+    {
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/simple.eml',
+                           dirname(__FILE__) . '/fixtures/simple2.ret',
+                           '', '', 'wrobel at example.org', 'me at example.org',
+                           'home.example.org', $params);
+    }
+
+    /**
+     * Test handling the line end with incoming messages.
+     */
+    public function testIncomingLineEnd()
+    {
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/empty.eml',
+                           dirname(__FILE__) . '/fixtures/empty2.ret',
+                           '', '127.0.0.1', 'wrobel at example.org', 'me at example.org',
+                           'home.example.org', $params);
+    }
+}
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/LoadTest.php b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/LoadTest.php
new file mode 100644
index 0000000..afeb4e2
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/LoadTest.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Test the incoming filter class for its load behaviour..
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/LoadTest.php,v 1.6.2.2 2009-02-24 11:17:40 wrobel Exp $
+ *
+ * @package Horde_Kolab_Filter
+ */
+
+/**
+ *  We need the unit test framework 
+ */
+require_once 'PHPUnit/Framework.php';
+require_once 'PHPUnit/Extensions/PerformanceTestCase.php';
+
+require_once 'Horde.php';
+require_once 'Horde/Kolab/Filter/Incoming.php';
+
+/**
+ * Test the incoming filter load.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/LoadTest.php,v 1.6.2.2 2009-02-24 11:17:40 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Horde_Kolab_Filter
+ */
+class Horde_Kolab_Filter_LoadTest extends PHPUnit_Extensions_PerformanceTestCase
+{
+
+    /**
+     * Set up testing.
+     */
+    protected function setUp()
+    {
+        global $conf;
+
+        $conf = array();
+        $conf['log']['enabled']          = false;
+
+        $conf['kolab']['filter']['debug'] = true;
+
+        $conf['kolab']['server'] = array(
+            'driver' => 'test',
+            'params' => array(
+                'cn=me' => array(
+                    'dn' => 'cn=me',
+                    'data' => array(
+                        'objectClass' => array('kolabInetOrgPerson'),
+                        'mail' => array('me at example.com'),
+                        'kolabImapHost' => array('localhost'),
+                        'uid' => array('me'),
+                    )
+                ),
+                'cn=you' => array(
+                    'dn' => 'cn=you',
+                    'data' => array(
+                        'objectClass' => array('kolabInetOrgPerson'),
+                        'mail' => array('you at example.com'),
+                        'kolabImapHost' => array('localhost'),
+                        'uid' => array('you'),
+                    )
+                ),
+            )
+        );
+        $conf['kolab']['imap']['server'] = 'localhost';
+        $conf['kolab']['imap']['port']   = 0;
+        $conf['kolab']['imap']['allow_special_users'] = true;
+
+        $_SERVER['SERVER_NAME'] = 'localhost';
+   }
+
+
+    /**
+     * Test the time the script takes in handling some messages.
+     */
+    public function testLoad()
+    {
+        $this->setMaxRunningTime(3);
+
+        $tmpdir = Horde::getTempDir();
+        $tmpfile = @tempnam($tmpdir, 'BIG.eml.');
+        $tmpfh = @fopen($tmpfile, "w");
+        $head = file_get_contents(dirname(__FILE__) . '/fixtures/tiny.eml');
+        $body = '';
+        for ($i = 0; $i < 50000;$i++) {
+            $body .= md5(microtime());
+            if (($i % 2) == 0) {
+                $body .= "\n";
+            }
+        }
+        @fwrite($tmpfh, $head);
+        @fwrite($tmpfh, $body);
+        @fclose($tmpfh);
+
+        $_SERVER['argv'] = array($_SERVER['argv'][0], '--sender=me at example.com', '--recipient=you at example.com', '--user=', '--host=example.com');
+
+        for ($i = 0; $i < 10; $i++) {
+
+            $parser = &new Horde_Kolab_Filter_Incoming();
+            $inh = fopen(dirname(__FILE__) . '/fixtures/tiny.eml', 'r');
+            $parser->parse($inh, 'drop');
+
+            $parser = &new Horde_Kolab_Filter_Incoming();
+            $inh = fopen(dirname(__FILE__) . '/fixtures/simple.eml', 'r');
+            $parser->parse($inh, 'drop');
+
+            $parser = &new Horde_Kolab_Filter_Incoming();
+            $inh = fopen($tmpfile, 'r');
+            $parser->parse($inh, 'drop');
+
+        }
+    }
+}
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ResourceTest.php b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ResourceTest.php
new file mode 100644
index 0000000..7f26880
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/ResourceTest.php
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Test resource handling within the Kolab filter implementation.
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ResourceTest.php,v 1.4.2.5 2009-11-16 17:23:06 wrobel Exp $
+ *
+ * @package Horde_Kolab_Filter
+ */
+
+/**
+ *  We need the base class
+ */
+require_once 'Horde/Kolab/Test/Filter.php';
+
+require_once 'Horde.php';
+require_once 'Horde/Kolab/Resource.php';
+require_once 'Horde/Kolab/Filter/Incoming.php';
+require_once 'Horde/iCalendar.php';
+require_once 'Horde/iCalendar/vfreebusy.php';
+
+/**
+ * Test resource handling
+ *
+ * $Horde: framework/Kolab_Filter/test/Horde/Kolab/Filter/ResourceTest.php,v 1.4.2.5 2009-11-16 17:23:06 wrobel Exp $
+ *
+ * Copyright 2008 Klarälvdalens Datakonsult AB
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ *
+ * @author  Gunnar Wrobel <wrobel at pardus.de>
+ * @package Horde_Kolab_Filter
+ */
+class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
+{
+
+    /**
+     * Test retrieval of the resource information
+     */
+    public function testGetResourceData()
+    {
+        $r = &new Kolab_Resource();
+        $d = $r->_getResourceData('test at example.org', 'wrobel at example.org');
+        $this->assertNoError($d);
+        $this->assertEquals('wrobel at example.org', $d['id']);
+        $this->assertEquals('home.example.org', $d['homeserver']);
+        $this->assertEquals('ACT_REJECT_IF_CONFLICTS', $d['action']);
+        $this->assertEquals('Gunnar Wrobel', $d['cn']);
+    }
+
+    /**
+     * Test manual actions
+     */
+    public function testManual()
+    {
+        $r = &new Kolab_Resource();
+        $this->assertTrue($r->handleMessage('otherhost', 'test at example.org', 'wrobel at example.org', null));
+        $r = &new Kolab_Resource();
+        $this->assertTrue($r->handleMessage('localhost', 'test at example.org', 'wrobel at example.org', null));
+    }
+
+
+    /**
+     * Test invitation.
+     */
+    public function testRecurrenceInvitation()
+    {
+        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/recur_invitation.eml',
+                           dirname(__FILE__) . '/fixtures/null.ret',
+                           '', '', 'test at example.org', 'wrobel at example.org',
+                           'home.example.org', $params);
+
+        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
+        $this->assertNoError($result);
+
+        $folder = $this->storage->getFolder('INBOX/Kalender');
+        $data = $folder->getData();
+        $events = $data->getObjects();
+        $this->assertEquals(1222419600, $events[0]['start-date']);
+
+        $result = $data->deleteAll();
+        $this->assertNoError($result);
+    }
+
+    /**
+     * Test an that contains a long string.
+     */
+    public function testLongStringInvitation()
+    {
+        require_once 'Horde/iCalendar/vfreebusy.php';
+        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/longstring_invitation.eml',
+                           dirname(__FILE__) . '/fixtures/null.ret',
+                           '', '', 'test at example.org', 'wrobel at example.org',
+                           'home.example.org', $params);
+
+        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
+        $this->assertNoError($result);
+
+        $folder = $this->storage->getFolder('INBOX/Kalender');
+        $data = $folder->getData();
+        $events = $data->getObjects();
+        $summaries = array();
+        foreach ($events as $event) {
+            $summaries[] = $event['summary'];
+        }
+        $this->assertContains('invitationtest2', $summaries);
+
+        $result = $data->deleteAll();
+        $this->assertNoError($result);
+    }
+
+    /**
+     * Test invitation when no default has been given.
+     */
+    public function testRecurrenceNodefault()
+    {
+        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/recur_invitation.eml',
+                           dirname(__FILE__) . '/fixtures/recur_invitation.ret',
+                           '', '', 'wrobel at example.org', 'else at example.org', 
+                           'home.example.org', $params);
+    }
+
+    /**
+     * Test an issue with recurring invitations.
+     *
+     * https://issues.kolab.org/issue3868
+     */
+    public function testIssue3868()
+    {
+        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20090901T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20091101T000000Z'));
+
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/recur_invitation2.eml',
+                           dirname(__FILE__) . '/fixtures/null.ret',
+                           '', '', 'test at example.org', 'wrobel at example.org',
+                           'home.example.org', $params);
+
+        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
+        $this->assertNoError($result);
+
+        $folder = $this->storage->getFolder('INBOX/Kalender');
+        $data = $folder->getData();
+        $events = $data->getObjects();
+        $this->assertEquals(1251950400, $events[0]['start-date']);
+
+        $result = $data->deleteAll();
+        $this->assertNoError($result);
+    }
+
+    /**
+     * Test that the attendee status gets transferred.
+     */
+    public function testAttendeeStatusInvitation()
+    {
+        require_once 'Horde/iCalendar/vfreebusy.php';
+        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+
+        $params = array('unmodified_content' => true,
+                        'incoming' => true);
+
+        $this->sendFixture(dirname(__FILE__) . '/fixtures/attendee_status_invitation.eml',
+                           dirname(__FILE__) . '/fixtures/null.ret',
+                           '', '', 'test at example.org', 'wrobel at example.org',
+                           'home.example.org', $params);
+
+        $result = $this->auth->authenticate('wrobel', array('password' => 'none'));
+        $this->assertNoError($result);
+
+        $folder = $this->storage->getFolder('INBOX/Kalender');
+        $data = $folder->getData();
+        $events = $data->getObjects();
+        $summaries = array();
+        foreach ($events as $event) {
+            foreach ($event['attendee'] as $attendee) {
+                switch ($attendee['smtp-address']) {
+                case 'needs at example.org':
+                    $this->assertEquals('none', $attendee['status']);
+                    break;
+                case 'accepted at example.org':
+                    $this->assertEquals('accepted', $attendee['status']);
+                    break;
+                case 'declined at example.org':
+                    $this->assertEquals('declined', $attendee['status']);
+                    break;
+                case 'tentative at example.org':
+                    $this->assertEquals('tentative', $attendee['status']);
+                    break;
+                case 'delegated at example.org':
+                    $this->assertEquals('none', $attendee['status']);
+                    break;
+                default:
+                    $this->fail('Unexpected attendee!');
+                    break;
+                }
+            }
+        }
+        $result = $data->deleteAll();
+        $this->assertNoError($result);
+    }
+
+}
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml
new file mode 100644
index 0000000..b85d166
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml
@@ -0,0 +1,33 @@
+To: wrobel at example.org
+From: test at example.org
+Subject: Invitation kolab/issue3236
+Date: Fri, 21 Nov 2008 19:25:35 +0100
+MIME-Version: 1.0
+Content-Type: text/calendar;
+  method=request;
+  charset="utf-8"
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:MAILTO:needs at example.org
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE:MAILTO:accepted at example.org
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=DECLINED;RSVP=TRUE:MAILTO:declined at example.org
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;RSVP=TRUE:MAILTO:tentative at example.org
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=DELEGATED;RSVP=TRUE:MAILTO:delegated at example.org
+ORGANIZER:MAILTO:test at example.org
+DTSTART:20081122T190000Z
+DTEND:20081122T193000Z
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E0080000000020D533ED0E4CC9010000000000000000100
+ 00000094C5C0A65E8CC4DB1AEC47FD1255FCD
+DTSTAMP:20081121T182534Z
+DESCRIPTION:Zeit: Samstag\, 22. November 2008 20:00-20:30 (GMT+01:00)
+  Amsterdam\, Berlin\, Bern\, Rom\, Stockholm\,
+  Wien.\\n\\n*~*~*~*~*~*~*~*~*~*\\n\\n\\n
+SUMMARY:invitationtest2
+END:VEVENT
+END:VCALENDAR
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty.eml
new file mode 100644
index 0000000..7b36d3e
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty.eml
@@ -0,0 +1,5 @@
+From: me at example.com
+To:me at example.com
+Subject: xx
+
+xx
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty2.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty2.ret
new file mode 100644
index 0000000..1aea922
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/empty2.ret
@@ -0,0 +1,9 @@
+Mail from sender: wrobel at example.org
+Mail to recipient: me at example.org
+From: me at example.com
+To:me at example.com
+Subject: xx
+X-Kolab-Scheduling-Message: FALSE
+
+xx
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.eml
new file mode 100644
index 0000000..93f69a7
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.eml
@@ -0,0 +1,14 @@
+Return-Path: <me at example.org>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: me at example.org
+To: "You" <you at example.org>
+Subject: Me to You
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.ret
new file mode 100644
index 0000000..74fafa8
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged.ret
@@ -0,0 +1,17 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.org
+Return-Path: <me at example.org>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: =?utf-8?B?IiAoVU5UUlVTVEVELCBzZW5kZXIgPG1lQGV4YW1wbGUub3JnPiBpcyBub3QgYXV0aGVudGljYXRlZCki?=<me at example.org>
+To: "You" <you at example.org>
+Subject: Me to You
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged_trans.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged_trans.ret
new file mode 100644
index 0000000..74fafa8
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/forged_trans.ret
@@ -0,0 +1,17 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.org
+Return-Path: <me at example.org>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: =?utf-8?B?IiAoVU5UUlVTVEVELCBzZW5kZXIgPG1lQGV4YW1wbGUub3JnPiBpcyBub3QgYXV0aGVudGljYXRlZCki?=<me at example.org>
+To: "You" <you at example.org>
+Subject: Me to You
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml
new file mode 100644
index 0000000..2d27198
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.eml
@@ -0,0 +1,39 @@
+From: User1 <somebody at example.org>
+Sender: User2 <%1$s>
+To: User3 <%2$s>
+Subject: kolab/issue3192
+Date: Mon, 23 Feb 2009 15:16:14 +0100
+Message-ID: <000001c995c1$49c4a2a0$140ba8c0 at invalid>
+MIME-Version: 1.0
+Content-Type: text/calendar; method=REQUEST;
+	charset="utf-8"
+Content-Transfer-Encoding: 7bit
+X-Mailer: Microsoft Office Outlook 11
+Thread-Index: AcmVuGgcYR9Pp2HUSHalFjSgcQETAwAAAq8gAAIyVwA=
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2670
+
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:%(user3)s
+DTSTART:20090223T140000Z
+DTEND:20090223T150000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:libkcal-910600374.601
+DTSTAMP:20090223T131221Z
+DESCRIPTION:Zeit: Montag\, 23. Februar 2009 15:00-16:00 (GMT+01:00)
+  Amsterdam\, Berlin\, Bern\, Rom\, Stockholm\,
+  Wien.\n\n*~*~*~*~*~*~*~*~*~*\n\n\n\n>_____________________________________
+ ________\n>Von: 	User1  \n>Gesendet:	Montag\, 23. Februar 2009
+  14:12\n>An:	User1\; %(user2)s\n>Betreff:	kolab/issue3192\n>Zeit:
+ 	Montag\, 23. Februar 2009 15:00-16:00 (GMT+01:00) Amsterdam\, Berlin\,
+  Bern\, Rom\, Stockholm\, Wien.\n>Ort:	\n>\n>\n
+SUMMARY:WG: kolab/issue3192
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.ret
new file mode 100644
index 0000000..75b3ac9
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/invitation_forward.ret
@@ -0,0 +1,70 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.org
+Message-ID: <20090305182508.176740qk2m2y26uc at localhost>
+Date: Mon, 23 Feb 2009 15:16:14 +0100
+Subject: kolab/issue3192
+From: me at example.org
+To: you at example.org
+X-Kolab-Forwarded: TRUE
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="=_4onv0mx6b56o"
+Content-Transfer-Encoding: 7bit
+
+This message is in MIME format.
+
+--=_5mtbys0ziy04
+Content-Type: text/plain;
+ charset=UTF-8
+Content-Disposition: inline
+Content-Transfer-Encoding: quoted-printable
+
+This is an invitation forwarded by outlook and
+was rectified by the Kolab server.
+The invitation was originally sent by
+User1 <somebody at example.org>.
+
+Diese Einladung wurde von Outlook weitergeleitet
+und vom Kolab-Server in gute Form gebracht.
+Die Einladung wurde urspr=C3=BCnglich von
+User1 <somebody at example.org> geschickt.
+--=_5mtbys0ziy04
+Content-Type: text/calendar;
+ charset=utf-8
+Content-Disposition: inline
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+METHOD:REQUEST
+BEGIN:VEVENT
+ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:user3)s
+DTSTART:20090223T140000Z
+DTEND:20090223T150000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:libkcal-910600374.601
+DTSTAMP:20090223T131221Z
+DESCRIPTION:Zeit:
+  Montag\, 23. Februar 2009 15:00-16:00 (GMT+01:00) Amsterdam\, Berlin\,
+  Bern\, Rom\, Stockholm\,
+  Wien.\n\n*~*~*~*~*~*~*~*~*~*\n\n\n\n>_____________________________________
+ ________\n>Von:
+  	User1  \n>Gesendet:
+ 	Montag\, 23. Februar 2009 14:12\n>An:
+ 	User1\;
+  user2)s\n>Betreff:
+ 	kolab/issue3192\n>Zeit:
+ 	Montag\, 23. Februar 2009 15:00-16:00 (GMT+01:00) Amsterdam\, Berlin\,
+  Bern\, Rom\, Stockholm\, Wien.\n>Ort:	\n>\n>\n
+SUMMARY:WG: kolab/issue3192
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+ORGANIZER;CN=User1:mailto:somebody at example.org
+END:VEVENT
+END:VCALENDAR
+
+--=_5mtbys0ziy04--
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml
new file mode 100644
index 0000000..5272bea
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml
@@ -0,0 +1,29 @@
+To: wrobel at example.org
+From: test at example.org
+Subject: Invitation kolab/issue3236
+Date: Fri, 21 Nov 2008 19:25:35 +0100
+MIME-Version: 1.0
+Content-Type: text/calendar;
+  method=request;
+  charset="utf-8"
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:wrobel at example.org
+ORGANIZER:MAILTO:test at example.org
+DTSTART:20081122T190000Z
+DTEND:20081122T193000Z
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E0080000000020D533ED0E4CC9010000000000000000100
+ 00000094C5C0A65E8CC4DB1AEC47FD1255FCD
+DTSTAMP:20081121T182534Z
+DESCRIPTION:Zeit: Samstag\, 22. November 2008 20:00-20:30 (GMT+01:00)
+  Amsterdam\, Berlin\, Bern\, Rom\, Stockholm\,
+  Wien.\\n\\n*~*~*~*~*~*~*~*~*~*\\n\\n\\n
+SUMMARY:invitationtest2
+END:VEVENT
+END:VCALENDAR
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/null.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/null.ret
new file mode 100644
index 0000000..e69de29
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/privileged.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/privileged.ret
new file mode 100644
index 0000000..c6be908
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/privileged.ret
@@ -0,0 +1,17 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.org
+Return-Path: <me at example.org>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: me at example.org
+To: "You" <you at example.org>
+Subject: Me to You
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml
new file mode 100644
index 0000000..53cbf43
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.eml
@@ -0,0 +1,202 @@
+Received: from localhost (example.org [127.0.0.1])
+	by example.org (Postfix) with ESMTP id 4E36AC2E001A
+	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
+X-Virus-Scanned: by amavisd-new at example.org
+X-Spam-Flag: NO
+X-Spam-Score: 3.704
+X-Spam-Level: ***
+X-Spam-Status: No, score=3.704 tagged_above=3 required=6.3 tests=[AWL=-1.351,
+	HTML_IMAGE_ONLY_32=2.353, HTML_MESSAGE=0.001, MIME_BASE64_TEXT=2.701]
+Received: from example.org ([127.0.0.1])
+	by localhost (example.org [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 151vjdIDehPR for <wrobel at example.org>;
+	Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
+Received: from localhost (example.org [127.0.0.1])
+	by example.org (Postfix) with ESMTP id 030C5C2E001C
+	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
+Received: from ug-out-1516.google.com (ug-out-1516.google.com [66.249.92.165])
+	by example.org (Postfix) with ESMTP id D88AAC2E001A
+	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:07 +0200 (CEST)
+Received: by ug-out-1516.google.com with SMTP id 34so6700uge.3
+        for <wrobel at example.org>; Fri, 26 Sep 2008 01:54:07 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+        d=google.com; s=beta;
+        h=domainkey-signature:mime-version:reply-to:sender:auto-submitted
+         :received:message-id:date:subject:from:to:content-type;
+        bh=NIbM6hZNgbcIAu3CGNdscvaw1JuMHR0cmVT+UvW5YdU=;
+        b=sGwxgD6sW0IDPFRSJcK9zvMtsS4jqziu+eF+p2fb7RsxCPFjU5FJFKbwhZQdVvA6I/
+         rzueuvNP0EqBhfsdLVyA==
+DomainKey-Signature: a=rsa-sha1; c=nofws;
+        d=google.com; s=beta;
+        h=mime-version:reply-to:sender:auto-submitted:message-id:date:subject
+         :from:to:content-type;
+        b=oo9wYH7lmDU5KDHTT4tpQ+BRlw/FYHBN2zt/an5FPuXE+dNM05UBVi8h87ig2c5Tvl
+         p53+hzDD2DoB/SlhqInA==
+MIME-Version: 1.0
+Reply-To: Gunnar Wrobel <test at example.org>
+Sender: Google Kalender <calendar-notification at google.com>
+Auto-Submitted: auto-generated
+Received: by 10.210.130.14 with SMTP id c14mr120659ebd.11.1222419247313; Fri, 
+	26 Sep 2008 01:54:07 -0700 (PDT)
+Message-ID: <0015174c3d6200b58f0457c8a9b5 at google.com>
+Date: Fri, 26 Sep 2008 01:54:07 -0700
+Subject: =?ISO-8859-1?B?W0VpbmxhZHVuZ10gdHJnIEAgVORnbGljaCB1bSAxMTowMCAocmVzQGRldi5wYXJkdXMu?=
+	=?ISO-8859-1?B?ZGUp?=
+From: Gunnar Wrobel <test at example.org>
+To: "wrobel at example.org" <wrobel at example.org>
+Content-Type: multipart/mixed; boundary=0015174c3d6200b57b0457c8a97d
+
+--0015174c3d6200b57b0457c8a97d
+Content-Type: multipart/alternative; boundary=0015174c3d6200b5720457c8a97b
+
+--0015174c3d6200b5720457c8a97b
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes
+Content-Transfer-Encoding: base64
+
+cmVzQGRldi5wYXJkdXMuZGUsIFNpZSB3dXJkZW4gZWluZ2VsYWRlbiB6dQ0KDQpUaXRlbDogdHJn
+DQpaZWl0OiBU5GdsaWNoIHVtIDExOjAwIChaZWl0em9uZTogUm9tKQ0KS2FsZW5kZXI6IHJlc0Bk
+ZXYucGFyZHVzLmRlDQoNClNpZSBr9m5uZW4gZGllc2VuIFRlcm1pbiBhbnplaWdlbiB1bnRlciAg
+DQpodHRwOi8vd3d3Lmdvb2dsZS5jb20vY2FsZW5kYXIvZXZlbnQ/YWN0aW9uPVZJRVcmZWlkPWJX
+czJiVzR6YUdGdWNEUTJhVGt3T0dWbGIyNHlaMmR1ZFdzZ2NtVnpRR1JsZGk1d1lYSmtkWE11WkdV
+JnRvaz1NaklqWjNkeWIySmxiRUJuYjI5bmJHVnRZV2xzTG1OdmJUQTNaVGc1Tm1aaFpqZGxZVEE0
+WmpjM1pqYzBNMk16T0dSak5ETXlaVGc0WkRFeU0yVXpNV1EmY3R6PUV1cm9wZSUyRlJvbWUmaGw9
+ZGUNCg0KDQoNCkRpZXNlIEUtTWFpbCB3dXJkZSBhbiByZXNAZGV2LnBhcmR1cy5kZSBnZXNlbmRl
+dCwgZGEgU2llIGVpbiBUZWlsbmVobWVyICANCmRpZXNlcyBUZXJtaW5zIHNpbmQuDQoNCkxlaG5l
+biBTaWUgZGllc2VuIFRlcm1pbiBhYiwgdW0ga2VpbmUgd2VpdGVyZW4gTmFjaHJpY2h0ZW4genUg
+ZGllc2VtIFRlcm1pbiAgDQp6dSBlcmhhbHRlbi4gU2llIGsmb3VtbDtubmVuIHNpY2ggYWx0ZXJu
+YXRpdiBmJnV1bWw7ciBlaW4gR29vZ2xlLUtvbnRvICANCnVudGVyIGh0dHA6Ly93d3cuZ29vZ2xl
+LmNvbS9jYWxlbmRhci8gYW5tZWxkZW4gdW5kIElocmUgIA0KQmVuYWNocmljaHRpZ3VuZ3NlaW5z
+dGVsbHVuZ2VuIGYmdXVtbDtyIElocmVuIGdlc2FtdGVuIEthbGVuZGVyIHN0ZXVlcm4uDQo=
+--0015174c3d6200b5720457c8a97b
+Content-Type: text/html; charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+
+<div style="padding:10px 7px; font-size:12px; line-height:1.4 font-family:Arial,Sans-serif; text-align:center;"><div><a href="http://www.google.com/calendar/"><img style="border-width:0" src="http://www.google.com/calendar/images/blue_beta_de.gif" alt="Google Kalender"></a></div>
+<div style="width:370px; background:#D2E6D2; border-style:solid;       border-color:#ccc; border-width:1px 1px 0 1px; padding:15px 15px 5px 15px;       margin:0 auto"><p style="margin:0;color:#0">wrobel at example.org,
+Sie wurden eingeladen zu</p>
+<h2 style="margin:5px 0; font-size:18px; line-height:1.4;color:#0">trg</h2>
+<p style="margin:0 0 .5em;"><span style="color:#0">T&auml;glich um 11:00</span>
+<br>
+<span style="color:#676;">(Zeitzone:
+Rom)</span>
+<br>
+<span style="color:#0"></span>
+<br>
+<span style="color:#0">Kalender:
+wrobel at example.org</span></p>
+<p style="margin:0 0 1em;color:#0; white-space:pre-wrap !important; white-space:-moz-pre-wrap !important; white-space:-pre-wrap !important; white-space:-o-pre-wrap !important; white-space:pre; word-wrap:break-word;"><a href="http://www.google.com/calendar/event?action=VIEW&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Weitere Termindetails&raquo;</a></p>
+<div style="margin:.5em 0 0; text-align:center;color:#0"><strong>Nehmen Sie teil?</strong></div>
+<div style="margin:4px 0 0; text-align:center;"><span style="background:#fff; border:1px solid #676;              padding:3px 5px; line-height:1.5;"><a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=1&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Ja</a>
+|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=3&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Vielleicht</a>
+|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=2&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Nein</a></span></div></div>
+<div><img src="http://www.google.com/calendar/images/envelope.gif" style="background:#D2E6D2; width:420px height:95px" alt=""></div><p style="margin:-15px 0 0;">&nbsp;</p>
+<p style="color:#676;">Diese E-Mail wurde an wrobel at example.org gesendet, da Sie ein Teilnehmer dieses Termins sind.</p><p style="color:#676;">Lehnen Sie diesen Termin ab, um keine weiteren Nachrichten zu diesem Termin zu erhalten. Sie k&ouml;nnen sich alternativ f&uuml;r ein Google-Konto unter http://www.google.com/calendar/ anmelden und Ihre Benachrichtigungseinstellungen f&uuml;r Ihren gesamten Kalender steuern.</p></div>
+--0015174c3d6200b5720457c8a97b
+Content-Type: text/calendar; charset=ISO-8859-1; method=REQUEST
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Europe/Rome
+X-LIC-LOCATION:Europe/Rome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Rome:20080926T110000
+DTEND;TZID=Europe/Rome:20080926T120000
+RRULE:FREQ=DAILY;WKST=SU
+DTSTAMP:20080926T085407Z
+ORGANIZER;CN=Gunnar Wrobel:mailto:test at example.org
+UID:mk6mn3hanp46i908eeon2ggnuk at google.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;CN=wrobel at example.org;X-NUM-GUESTS=0:mailto:wrobel at example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;CN=Gunnar Wrobel;X-NUM-GUESTS=0:mailto:test at example.org
+CLASS:PRIVATE
+CREATED:20080926T085406Z
+DESCRIPTION:Zeigen Sie Ihren Termin unter http://www.google.com/calendar/ev
+ ent?action=VIEW&eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXM
+ uZGU&tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOG
+ RjNDMyZTg4ZDEyM2UzMWQ&ctz=Europe%2FRome&hl=de an.
+LAST-MODIFIED:20080926T085406Z
+LOCATION:
+SEQUENCE:0
+STATUS:CONFIRMED
+SUMMARY:trg
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+
+--0015174c3d6200b5720457c8a97b--
+--0015174c3d6200b57b0457c8a97d
+Content-Type: application/ics; name="invite.ics"
+Content-Disposition: attachment; filename="invite.ics"
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Europe/Rome
+X-LIC-LOCATION:Europe/Rome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Rome:20080926T110000
+DTEND;TZID=Europe/Rome:20080926T120000
+RRULE:FREQ=DAILY;WKST=SU
+DTSTAMP:20080926T085407Z
+ORGANIZER;CN=Gunnar Wrobel:mailto:test at example.org
+UID:mk6mn3hanp46i908eeon2ggnuk at google.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;CN=wrobel at example.org;X-NUM-GUESTS=0:mailto:wrobel at example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;CN=Gunnar Wrobel;X-NUM-GUESTS=0:mailto:test at example.org
+CLASS:PRIVATE
+CREATED:20080926T085406Z
+DESCRIPTION:Zeigen Sie Ihren Termin unter http://www.google.com/calendar/ev
+ ent?action=VIEW&eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXM
+ uZGU&tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOG
+ RjNDMyZTg4ZDEyM2UzMWQ&ctz=Europe%2FRome&hl=de an.
+LAST-MODIFIED:20080926T085406Z
+LOCATION:
+SEQUENCE:0
+STATUS:CONFIRMED
+SUMMARY:trg
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+
+--0015174c3d6200b57b0457c8a97d--
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.ret
new file mode 100644
index 0000000..8705248
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation.ret
@@ -0,0 +1,206 @@
+Mail from sender: wrobel at example.org
+Mail to recipient: else at example.org
+Received: from localhost (example.org [127.0.0.1])
+	by example.org (Postfix) with ESMTP id 4E36AC2E001A
+	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
+X-Virus-Scanned: by amavisd-new at example.org
+X-Spam-Flag: NO
+X-Spam-Score: 3.704
+X-Spam-Level: ***
+X-Spam-Status: No, score=3.704 tagged_above=3 required=6.3 tests=[AWL=-1.351,
+	HTML_IMAGE_ONLY_32=2.353, HTML_MESSAGE=0.001, MIME_BASE64_TEXT=2.701]
+Received: from example.org ([127.0.0.1])
+	by localhost (example.org [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id 151vjdIDehPR for <wrobel at example.org>;
+	Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
+Received: from localhost (example.org [127.0.0.1])
+	by example.org (Postfix) with ESMTP id 030C5C2E001C
+	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:08 +0200 (CEST)
+Received: from ug-out-1516.google.com (ug-out-1516.google.com [66.249.92.165])
+	by example.org (Postfix) with ESMTP id D88AAC2E001A
+	for <wrobel at example.org>; Fri, 26 Sep 2008 10:54:07 +0200 (CEST)
+Received: by ug-out-1516.google.com with SMTP id 34so6700uge.3
+        for <wrobel at example.org>; Fri, 26 Sep 2008 01:54:07 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+        d=google.com; s=beta;
+        h=domainkey-signature:mime-version:reply-to:sender:auto-submitted
+         :received:message-id:date:subject:from:to:content-type;
+        bh=NIbM6hZNgbcIAu3CGNdscvaw1JuMHR0cmVT+UvW5YdU=;
+        b=sGwxgD6sW0IDPFRSJcK9zvMtsS4jqziu+eF+p2fb7RsxCPFjU5FJFKbwhZQdVvA6I/
+         rzueuvNP0EqBhfsdLVyA==
+DomainKey-Signature: a=rsa-sha1; c=nofws;
+        d=google.com; s=beta;
+        h=mime-version:reply-to:sender:auto-submitted:message-id:date:subject
+         :from:to:content-type;
+        b=oo9wYH7lmDU5KDHTT4tpQ+BRlw/FYHBN2zt/an5FPuXE+dNM05UBVi8h87ig2c5Tvl
+         p53+hzDD2DoB/SlhqInA==
+MIME-Version: 1.0
+Reply-To: Gunnar Wrobel <test at example.org>
+Sender: Google Kalender <calendar-notification at google.com>
+Auto-Submitted: auto-generated
+Received: by 10.210.130.14 with SMTP id c14mr120659ebd.11.1222419247313; Fri, 
+	26 Sep 2008 01:54:07 -0700 (PDT)
+Message-ID: <0015174c3d6200b58f0457c8a9b5 at google.com>
+Date: Fri, 26 Sep 2008 01:54:07 -0700
+Subject: =?ISO-8859-1?B?W0VpbmxhZHVuZ10gdHJnIEAgVORnbGljaCB1bSAxMTowMCAocmVzQGRldi5wYXJkdXMu?=
+	=?ISO-8859-1?B?ZGUp?=
+From: Gunnar Wrobel <test at example.org>
+To: "wrobel at example.org" <wrobel at example.org>
+Content-Type: multipart/mixed; boundary=0015174c3d6200b57b0457c8a97d
+X-Kolab-Scheduling-Message: TRUE
+
+--0015174c3d6200b57b0457c8a97d
+Content-Type: multipart/alternative; boundary=0015174c3d6200b5720457c8a97b
+
+--0015174c3d6200b5720457c8a97b
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes
+Content-Transfer-Encoding: base64
+
+cmVzQGRldi5wYXJkdXMuZGUsIFNpZSB3dXJkZW4gZWluZ2VsYWRlbiB6dQ0KDQpUaXRlbDogdHJn
+DQpaZWl0OiBU5GdsaWNoIHVtIDExOjAwIChaZWl0em9uZTogUm9tKQ0KS2FsZW5kZXI6IHJlc0Bk
+ZXYucGFyZHVzLmRlDQoNClNpZSBr9m5uZW4gZGllc2VuIFRlcm1pbiBhbnplaWdlbiB1bnRlciAg
+DQpodHRwOi8vd3d3Lmdvb2dsZS5jb20vY2FsZW5kYXIvZXZlbnQ/YWN0aW9uPVZJRVcmZWlkPWJX
+czJiVzR6YUdGdWNEUTJhVGt3T0dWbGIyNHlaMmR1ZFdzZ2NtVnpRR1JsZGk1d1lYSmtkWE11WkdV
+JnRvaz1NaklqWjNkeWIySmxiRUJuYjI5bmJHVnRZV2xzTG1OdmJUQTNaVGc1Tm1aaFpqZGxZVEE0
+WmpjM1pqYzBNMk16T0dSak5ETXlaVGc0WkRFeU0yVXpNV1EmY3R6PUV1cm9wZSUyRlJvbWUmaGw9
+ZGUNCg0KDQoNCkRpZXNlIEUtTWFpbCB3dXJkZSBhbiByZXNAZGV2LnBhcmR1cy5kZSBnZXNlbmRl
+dCwgZGEgU2llIGVpbiBUZWlsbmVobWVyICANCmRpZXNlcyBUZXJtaW5zIHNpbmQuDQoNCkxlaG5l
+biBTaWUgZGllc2VuIFRlcm1pbiBhYiwgdW0ga2VpbmUgd2VpdGVyZW4gTmFjaHJpY2h0ZW4genUg
+ZGllc2VtIFRlcm1pbiAgDQp6dSBlcmhhbHRlbi4gU2llIGsmb3VtbDtubmVuIHNpY2ggYWx0ZXJu
+YXRpdiBmJnV1bWw7ciBlaW4gR29vZ2xlLUtvbnRvICANCnVudGVyIGh0dHA6Ly93d3cuZ29vZ2xl
+LmNvbS9jYWxlbmRhci8gYW5tZWxkZW4gdW5kIElocmUgIA0KQmVuYWNocmljaHRpZ3VuZ3NlaW5z
+dGVsbHVuZ2VuIGYmdXVtbDtyIElocmVuIGdlc2FtdGVuIEthbGVuZGVyIHN0ZXVlcm4uDQo=
+--0015174c3d6200b5720457c8a97b
+Content-Type: text/html; charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+
+<div style="padding:10px 7px; font-size:12px; line-height:1.4 font-family:Arial,Sans-serif; text-align:center;"><div><a href="http://www.google.com/calendar/"><img style="border-width:0" src="http://www.google.com/calendar/images/blue_beta_de.gif" alt="Google Kalender"></a></div>
+<div style="width:370px; background:#D2E6D2; border-style:solid;       border-color:#ccc; border-width:1px 1px 0 1px; padding:15px 15px 5px 15px;       margin:0 auto"><p style="margin:0;color:#0">wrobel at example.org,
+Sie wurden eingeladen zu</p>
+<h2 style="margin:5px 0; font-size:18px; line-height:1.4;color:#0">trg</h2>
+<p style="margin:0 0 .5em;"><span style="color:#0">T&auml;glich um 11:00</span>
+<br>
+<span style="color:#676;">(Zeitzone:
+Rom)</span>
+<br>
+<span style="color:#0"></span>
+<br>
+<span style="color:#0">Kalender:
+wrobel at example.org</span></p>
+<p style="margin:0 0 1em;color:#0; white-space:pre-wrap !important; white-space:-moz-pre-wrap !important; white-space:-pre-wrap !important; white-space:-o-pre-wrap !important; white-space:pre; word-wrap:break-word;"><a href="http://www.google.com/calendar/event?action=VIEW&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Weitere Termindetails&raquo;</a></p>
+<div style="margin:.5em 0 0; text-align:center;color:#0"><strong>Nehmen Sie teil?</strong></div>
+<div style="margin:4px 0 0; text-align:center;"><span style="background:#fff; border:1px solid #676;              padding:3px 5px; line-height:1.5;"><a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=1&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Ja</a>
+|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=3&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Vielleicht</a>
+|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXMuZGU&amp;rst=2&amp;tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOGRjNDMyZTg4ZDEyM2UzMWQ&amp;ctz=Europe%2FRome&amp;hl=de">Nein</a></span></div></div>
+<div><img src="http://www.google.com/calendar/images/envelope.gif" style="background:#D2E6D2; width:420px height:95px" alt=""></div><p style="margin:-15px 0 0;">&nbsp;</p>
+<p style="color:#676;">Diese E-Mail wurde an wrobel at example.org gesendet, da Sie ein Teilnehmer dieses Termins sind.</p><p style="color:#676;">Lehnen Sie diesen Termin ab, um keine weiteren Nachrichten zu diesem Termin zu erhalten. Sie k&ouml;nnen sich alternativ f&uuml;r ein Google-Konto unter http://www.google.com/calendar/ anmelden und Ihre Benachrichtigungseinstellungen f&uuml;r Ihren gesamten Kalender steuern.</p></div>
+--0015174c3d6200b5720457c8a97b
+Content-Type: text/calendar; charset=ISO-8859-1; method=REQUEST
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Europe/Rome
+X-LIC-LOCATION:Europe/Rome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Rome:20080926T110000
+DTEND;TZID=Europe/Rome:20080926T120000
+RRULE:FREQ=DAILY;WKST=SU
+DTSTAMP:20080926T085407Z
+ORGANIZER;CN=Gunnar Wrobel:mailto:test at example.org
+UID:mk6mn3hanp46i908eeon2ggnuk at google.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;CN=wrobel at example.org;X-NUM-GUESTS=0:mailto:wrobel at example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;CN=Gunnar Wrobel;X-NUM-GUESTS=0:mailto:test at example.org
+CLASS:PRIVATE
+CREATED:20080926T085406Z
+DESCRIPTION:Zeigen Sie Ihren Termin unter http://www.google.com/calendar/ev
+ ent?action=VIEW&eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXM
+ uZGU&tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOG
+ RjNDMyZTg4ZDEyM2UzMWQ&ctz=Europe%2FRome&hl=de an.
+LAST-MODIFIED:20080926T085406Z
+LOCATION:
+SEQUENCE:0
+STATUS:CONFIRMED
+SUMMARY:trg
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+
+--0015174c3d6200b5720457c8a97b--
+--0015174c3d6200b57b0457c8a97d
+Content-Type: application/ics; name="invite.ics"
+Content-Disposition: attachment; filename="invite.ics"
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Europe/Rome
+X-LIC-LOCATION:Europe/Rome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Rome:20080926T110000
+DTEND;TZID=Europe/Rome:20080926T120000
+RRULE:FREQ=DAILY;WKST=SU
+DTSTAMP:20080926T085407Z
+ORGANIZER;CN=Gunnar Wrobel:mailto:test at example.org
+UID:mk6mn3hanp46i908eeon2ggnuk at google.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;CN=wrobel at example.org;X-NUM-GUESTS=0:mailto:wrobel at example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;CN=Gunnar Wrobel;X-NUM-GUESTS=0:mailto:test at example.org
+CLASS:PRIVATE
+CREATED:20080926T085406Z
+DESCRIPTION:Zeigen Sie Ihren Termin unter http://www.google.com/calendar/ev
+ ent?action=VIEW&eid=bWs2bW4zaGFucDQ2aTkwOGVlb24yZ2dudWsgcmVzQGRldi5wYXJkdXM
+ uZGU&tok=MjIjZ3dyb2JlbEBnb29nbGVtYWlsLmNvbTA3ZTg5NmZhZjdlYTA4Zjc3Zjc0M2MzOG
+ RjNDMyZTg4ZDEyM2UzMWQ&ctz=Europe%2FRome&hl=de an.
+LAST-MODIFIED:20080926T085406Z
+LOCATION:
+SEQUENCE:0
+STATUS:CONFIRMED
+SUMMARY:trg
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+
+--0015174c3d6200b57b0457c8a97d--
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation2.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation2.eml
new file mode 100644
index 0000000..3e5f8be
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/recur_invitation2.eml
@@ -0,0 +1,86 @@
+Received: from localhost (example.com [127.0.0.1])
+	(Authenticated sender: 1 at example.com)
+	by example.com (Postfix) with ESMTP id D47689B1C0
+	for <3 at example.com>; Tue, 22 Sep 2009 15:36:22 +0200 (CEST)
+Message-ID: 	<20090922153619.71582t7kl56avveo at example.com>
+Date: Tue, 22 Sep 2009 15:36:19 +0200
+From: 1 1 <1 at example.com>
+To: 3 at example.com
+Subject: 5
+User-Agent: Kronolith H3 (2.3)
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+	boundary="=_2qehldvr5f40"
+Content-Transfer-Encoding: 7bit
+
+This message is in MIME format.
+
+--=_2qehldvr5f40
+Content-Type: text/plain;
+	charset=UTF-8
+Content-Disposition: inline
+Content-Transfer-Encoding: quoted-printable
+
+5 (am 03.09.2009 um 06:00)
+
+Ort: 5
+
+Teilnehmer: 3 at example.com
+
+Im Anhang befindet sich eine iCalendar-Datei mit mehr Informationen zu diese=
+m Termin. Wenn Ihr E-Mail-Programm iTip-Anfragen beherrscht, k=C3=B6nnen Sie=
+ diese Datei dazu benutzen, Ihre lokale Version des Termins zu aktualisieren=
+.
+
+Falls Ihr E-Mail-Programm keine iTip-Anfragen unterst=C3=BCtzt, k=C3=B6nnen =
+Sie einen der folgenden Links verwenden, um den Termin zu best=C3=A4tigen od=
+er abzulehnen.
+
+Um den Termin zu best=C3=A4tigen:
+https://example.com/client/kronolith/attend.php=
+?c=3D1%40example.com&e=3Dcee9e56161efb8b8831059=
+b2bc506e4e&u=3D3%40example.com&a=3Daccept
+
+Um den Termin unter Vorbehalt zu best=C3=A4tigen:
+https://example.com/client/kronolith/attend.php=
+?c=3D1%40example.com&e=3Dcee9e56161efb8b8831059=
+b2bc506e4e&u=3D3%40example.com&a=3Dtentative
+
+Um den Termin abzulehnen:
+https://example.com/client/kronolith/attend.php=
+?c=3D1%40example.com&e=3Dcee9e56161efb8b8831059=
+b2bc506e4e&u=3D3%40example.com&a=3Ddecline
+--=_2qehldvr5f40
+Content-Type: text/calendar;
+	charset=UTF-8;
+	name="event-invitation.ics";
+	METHOD="REQUEST"
+Content-Disposition: inline;
+	filename="event-invitation.ics"
+Content-Transfer-Encoding: 7bit
+
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REQUEST
+X-WR-CALNAME:Kalender
+PRODID:-//The Horde Project//Horde_iCalendar Library//EN
+BEGIN:VEVENT
+DTSTART:20090903T040000Z
+DTEND:20090903T050000Z
+DTSTAMP:20090922T133615Z
+UID:cee9e56161efb8b8831059b2bc506e4e
+CREATED:20090922T133619Z
+LAST-MODIFIED:20090922T133619Z
+SUMMARY:5
+ORGANIZER;CN=1 1:mailto:1 at example.com
+LOCATION:5
+CLASS:PUBLIC
+STATUS:CONFIRMED
+TRANSP:OPAQUE
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:mailto:3 at exam
+ ple.com
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=1TH
+END:VEVENT
+END:VCALENDAR
+
+--=_2qehldvr5f40--
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.eml
new file mode 100644
index 0000000..eeeb852
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.eml
@@ -0,0 +1,105 @@
+Return-Path: <jramirezme at kof.org.mx>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+X-Sieve: CMU Sieve 2.3
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	by demo.example.org (Postfix) with ESMTP id 395055FC0128
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
+X-Quarantine-ID: <pcNZVfHFgssC>
+X-Virus-Scanned: by amavisd-new at demo.example.org
+X-Spam-Flag: YES
+X-Spam-Score: 15.576
+X-Spam-Level: ***************
+X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
+	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
+	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
+	SUBJECT_FUZZY_PENIS=3.099]
+Received: from demo.example.org ([127.0.0.1])
+	by localhost (demo.example.org [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.org>;
+	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	by demo.example.org (Postfix) with ESMTP id ABE8E5FC012A
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from town.windham.me.us (unknown [85.192.14.1])
+	by demo.example.org (Postfix) with SMTP id D10375FC0128
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
+Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.org.mx)
+     by demo.example.org with esmtp (CEYPNSAEHHT CYXPCJ)
+     id UNrWB0-GRSpeC-lz
+     for wrobel at demo.example.org; Sat, 10 Nov 2007 22:45:12 +0300
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: "Meredith F. Dick" <Meredith at kof.org.mx>
+To: "Marta Z. Rodrigues" <wrobel at demo.example.org>
+Subject: ***SPAM*** Don't you think it's time you stopped being a loser
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2900.2869
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/plain;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+request=2E Horn was a fan favorite, standing up for theA recent poll by M=
+ontreal based newspaper Le Devoir, on
+Mel Karmazin spoke on behalf of both XM and Sirius=2E
+
+
+Do you believe in magic? We suppose you're likely to say "no"=2E=20
+We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
+ed!=20
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle!=20
+It's fabulous!
+
+So, hurry up, work a miracle in your life with this wonder-medicine!
+
+
+competiton has a poor track record of keeping down costsas head of the pu=
+ppet government in China=2EParti Qubcois leader slams radio host on homop=
+hobiacontrols=2E XM and Sirius can be said to compete with
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/html;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
+>
+<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
+<STYLE type=3D"text/css">
+=2Estyle2 {font-size: 10px; color: #616161;}
+=2Estyle7 {font-size: 14px; color: #FF2F2F;}
+body {background-color: #FFFFFF; color: #2B3235;}
+</STYLE>
+</HEAD>
+<BODY><span class=3D"style2">=20
+<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
+by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
+ of both XM and Sirius=2E</span>=20
+<br><br><br>
+<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
+<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
+t </span>MegaXXXX was introduced!</b><br>
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle! <br>
+<b>It's fabulous!</b><br><br>
+
+<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
+r life with this wonder-medicine!</b></a><br><br>
+<br><span class=3D"style2">competiton has a poor track record of keeping =
+down costsas head of the puppet government in China=2EParti Qubcois leade=
+r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
+compete with<br></span></BODY></HTML>
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210--
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.ret
new file mode 100644
index 0000000..57853ab
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple.ret
@@ -0,0 +1,109 @@
+Mail from sender: me at example.com
+Mail to recipient: you at example.com
+Return-Path: <jramirezme at kof.com.mx>
+Received: from localhost (fqdn.example.com [127.0.0.1])
+	 by demo.example.com (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+X-Sieve: CMU Sieve 2.3
+Received: from localhost (fqdn.example.com [127.0.0.1])
+	by demo.example.com (Postfix) with ESMTP id 395055FC0128
+	for <wrobel at demo.example.com>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
+X-Quarantine-ID: <pcNZVfHFgssC>
+X-Virus-Scanned: by amavisd-new at demo.example.com
+X-Spam-Flag: YES
+X-Spam-Score: 15.576
+X-Spam-Level: ***************
+X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
+	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
+	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
+	SUBJECT_FUZZY_PENIS=3.099]
+Received: from demo.example.com ([127.0.0.1])
+	by localhost (demo.example.com [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.com>;
+	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from localhost (fqdn.example.com [127.0.0.1])
+	by demo.example.com (Postfix) with ESMTP id ABE8E5FC012A
+	for <wrobel at demo.example.com>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from town.windham.me.us (unknown [85.192.14.1])
+	by demo.example.com (Postfix) with SMTP id D10375FC0128
+	for <wrobel at demo.example.com>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
+Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.com.mx)
+     by demo.example.com with esmtp (CEYPNSAEHHT CYXPCJ)
+     id UNrWB0-GRSpeC-lz
+     for wrobel at demo.example.com; Sat, 10 Nov 2007 22:45:12 +0300
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: "Meredith F. Dick" <Meredith at kof.com.mx>
+To: "Marta Z. Rodrigues" <wrobel at demo.example.com>
+Subject: ***SPAM*** Don't you think it's time you stopped being a loser
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2900.2869
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
+X-Kolab-Scheduling-Message: FALSE
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/plain;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+request=2E Horn was a fan favorite, standing up for theA recent poll by M=
+ontreal based newspaper Le Devoir, on
+Mel Karmazin spoke on behalf of both XM and Sirius=2E
+
+
+Do you believe in magic? We suppose you're likely to say "no"=2E=20
+We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
+ed!=20
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle!=20
+It's fabulous!
+
+So, hurry up, work a miracle in your life with this wonder-medicine!
+
+
+competiton has a poor track record of keeping down costsas head of the pu=
+ppet government in China=2EParti Qubcois leader slams radio host on homop=
+hobiacontrols=2E XM and Sirius can be said to compete with
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/html;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
+>
+<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
+<STYLE type=3D"text/css">
+=2Estyle2 {font-size: 10px; color: #616161;}
+=2Estyle7 {font-size: 14px; color: #FF2F2F;}
+body {background-color: #FFFFFF; color: #2B3235;}
+</STYLE>
+</HEAD>
+<BODY><span class=3D"style2">=20
+<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
+by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
+ of both XM and Sirius=2E</span>=20
+<br><br><br>
+<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
+<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
+t </span>MegaXXXX was introduced!</b><br>
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle! <br>
+<b>It's fabulous!</b><br><br>
+
+<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
+r life with this wonder-medicine!</b></a><br><br>
+<br><span class=3D"style2">competiton has a poor track record of keeping =
+down costsas head of the puppet government in China=2EParti Qubcois leade=
+r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
+compete with<br></span></BODY></HTML>
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210--
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple2.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple2.ret
new file mode 100644
index 0000000..3db6ec4
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple2.ret
@@ -0,0 +1,109 @@
+Mail from sender: wrobel at example.org
+Mail to recipient: me at example.org
+Return-Path: <jramirezme at kof.org.mx>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+X-Sieve: CMU Sieve 2.3
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	by demo.example.org (Postfix) with ESMTP id 395055FC0128
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
+X-Quarantine-ID: <pcNZVfHFgssC>
+X-Virus-Scanned: by amavisd-new at demo.example.org
+X-Spam-Flag: YES
+X-Spam-Score: 15.576
+X-Spam-Level: ***************
+X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
+	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
+	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
+	SUBJECT_FUZZY_PENIS=3.099]
+Received: from demo.example.org ([127.0.0.1])
+	by localhost (demo.example.org [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.org>;
+	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	by demo.example.org (Postfix) with ESMTP id ABE8E5FC012A
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from town.windham.me.us (unknown [85.192.14.1])
+	by demo.example.org (Postfix) with SMTP id D10375FC0128
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
+Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.org.mx)
+     by demo.example.org with esmtp (CEYPNSAEHHT CYXPCJ)
+     id UNrWB0-GRSpeC-lz
+     for wrobel at demo.example.org; Sat, 10 Nov 2007 22:45:12 +0300
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: "Meredith F. Dick" <Meredith at kof.org.mx>
+To: "Marta Z. Rodrigues" <wrobel at demo.example.org>
+Subject: ***SPAM*** Don't you think it's time you stopped being a loser
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2900.2869
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
+X-Kolab-Scheduling-Message: FALSE
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/plain;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+request=2E Horn was a fan favorite, standing up for theA recent poll by M=
+ontreal based newspaper Le Devoir, on
+Mel Karmazin spoke on behalf of both XM and Sirius=2E
+
+
+Do you believe in magic? We suppose you're likely to say "no"=2E=20
+We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
+ed!=20
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle!=20
+It's fabulous!
+
+So, hurry up, work a miracle in your life with this wonder-medicine!
+
+
+competiton has a poor track record of keeping down costsas head of the pu=
+ppet government in China=2EParti Qubcois leader slams radio host on homop=
+hobiacontrols=2E XM and Sirius can be said to compete with
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/html;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
+>
+<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
+<STYLE type=3D"text/css">
+=2Estyle2 {font-size: 10px; color: #616161;}
+=2Estyle7 {font-size: 14px; color: #FF2F2F;}
+body {background-color: #FFFFFF; color: #2B3235;}
+</STYLE>
+</HEAD>
+<BODY><span class=3D"style2">=20
+<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
+by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
+ of both XM and Sirius=2E</span>=20
+<br><br><br>
+<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
+<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
+t </span>MegaXXXX was introduced!</b><br>
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle! <br>
+<b>It's fabulous!</b><br><br>
+
+<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
+r life with this wonder-medicine!</b></a><br><br>
+<br><span class=3D"style2">competiton has a poor track record of keeping =
+down costsas head of the puppet government in China=2EParti Qubcois leade=
+r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
+compete with<br></span></BODY></HTML>
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210--
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple_out.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple_out.ret
new file mode 100644
index 0000000..00a044d
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/simple_out.ret
@@ -0,0 +1,108 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.org
+Return-Path: <jramirezme at kof.org.mx>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+X-Sieve: CMU Sieve 2.3
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	by demo.example.org (Postfix) with ESMTP id 395055FC0128
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:52 +0100 (CET)
+X-Quarantine-ID: <pcNZVfHFgssC>
+X-Virus-Scanned: by amavisd-new at demo.example.org
+X-Spam-Flag: YES
+X-Spam-Score: 15.576
+X-Spam-Level: ***************
+X-Spam-Status: Yes, score=15.576 tagged_above=3 required=6.3
+	tests=[FRT_PENIS1=3.799, HTML_MESSAGE=0.001, PLING_QUERY=2.16,
+	RCVD_FORGED_WROTE=4.365, RCVD_FORGED_WROTE2=2.052, RDNS_NONE=0.1,
+	SUBJECT_FUZZY_PENIS=3.099]
+Received: from demo.example.org ([127.0.0.1])
+	by localhost (demo.example.org [127.0.0.1]) (amavisd-new, port 10024)
+	with ESMTP id pcNZVfHFgssC for <wrobel at demo.example.org>;
+	Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	by demo.example.org (Postfix) with ESMTP id ABE8E5FC012A
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:51 +0100 (CET)
+Received: from town.windham.me.us (unknown [85.192.14.1])
+	by demo.example.org (Postfix) with SMTP id D10375FC0128
+	for <wrobel at demo.example.org>; Sat, 10 Nov 2007 20:44:49 +0100 (CET)
+Received: from 192.85.78.105 (HELO ccfemsasmtp.kof.org.mx)
+     by demo.example.org with esmtp (CEYPNSAEHHT CYXPCJ)
+     id UNrWB0-GRSpeC-lz
+     for wrobel at demo.example.org; Sat, 10 Nov 2007 22:45:12 +0300
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: "Meredith F. Dick" <Meredith at kof.org.mx>
+To: "Marta Z. Rodrigues" <wrobel at demo.example.org>
+Subject: ***SPAM*** Don't you think it's time you stopped being a loser
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+        boundary="----=_NextPart_7455_1D89_01C823EB.5AA2E210"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2900.2869
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/plain;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+request=2E Horn was a fan favorite, standing up for theA recent poll by M=
+ontreal based newspaper Le Devoir, on
+Mel Karmazin spoke on behalf of both XM and Sirius=2E
+
+
+Do you believe in magic? We suppose you're likely to say "no"=2E=20
+We hadn't believed, either=2E=2E=2Euntil the moment MegaXXXX was introduc=
+ed!=20
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle!=20
+It's fabulous!
+
+So, hurry up, work a miracle in your life with this wonder-medicine!
+
+
+competiton has a poor track record of keeping down costsas head of the pu=
+ppet government in China=2EParti Qubcois leader slams radio host on homop=
+hobiacontrols=2E XM and Sirius can be said to compete with
+------=_NextPart_7455_1D89_01C823EB.5AA2E210
+Content-Type: text/html;
+        charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4=2E0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii"=
+>
+<META content=3D"MSHTML 6=2E00=2E2900=2E2869" name=3DGENERATOR>
+<STYLE type=3D"text/css">
+=2Estyle2 {font-size: 10px; color: #616161;}
+=2Estyle7 {font-size: 14px; color: #FF2F2F;}
+body {background-color: #FFFFFF; color: #2B3235;}
+</STYLE>
+</HEAD>
+<BODY><span class=3D"style2">=20
+<br>request=2E Horn was a fan favorite, standing up for theA recent poll =
+by Montreal based newspaper Le Devoir, on<br>Mel Karmazin spoke on behalf=
+ of both XM and Sirius=2E</span>=20
+<br><br><br>
+<b>Do you believe in magic? We suppose you're likely to say "no"=2E<br>
+<span class=3D"style7">We hadn't believed, either=2E=2E=2Euntil the momen=
+t </span>MegaXXXX was introduced!</b><br>
+The effect this remedy produces on a male XXXXX cannot be called otherwis=
+e than a Miracle! <br>
+<b>It's fabulous!</b><br><br>
+
+<a href=3D"http://scottjay=2Ecom/"><b>So, hurry up, work a miracle in you=
+r life with this wonder-medicine!</b></a><br><br>
+<br><span class=3D"style2">competiton has a poor track record of keeping =
+down costsas head of the puppet government in China=2EParti Qubcois leade=
+r slams radio host on homophobiacontrols=2E XM and Sirius can be said to =
+compete with<br></span></BODY></HTML>
+
+------=_NextPart_7455_1D89_01C823EB.5AA2E210--
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/test.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/test.eml
new file mode 100644
index 0000000..b8d1024
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/test.eml
@@ -0,0 +1,61 @@
+From: Test User <test at oberon.co.za>
+To: test2 at oberon.co.za
+Subject: a
+Date: Wed, 19 May 2004 10:38:41 +0200
+User-Agent: KMail/1.6.52
+MIME-Version: 1.0
+Content-Type: Multipart/Mixed;
+  boundary="Boundary-00=_R0xqAO2ZmkKUNMZ"
+Message-Id: <200405191038.41626.test at oberon.co.za>
+Status: R
+X-Status: NQ
+X-KMail-EncryptionState:  
+X-KMail-SignatureState:  
+X-KMail-MDN-Sent:  
+
+--Boundary-00=_R0xqAO2ZmkKUNMZ
+Content-Type: text/plain;
+  charset="us-ascii";
+  boundary=""
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+
+Organizer: test at oberon.co.za
+Summary: a
+Start Date: 2004-05-19
+Start Time: 12:00
+End Date: 2004-05-19
+End Time: 14:00
+
+--Boundary-00=_R0xqAO2ZmkKUNMZ
+Content-Type: text/calendar;
+  name="cal.ics";
+  method="request"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment
+
+BEGIN:VCALENDAR
+PRODID:-//K Desktop Environment//NONSGML libkcal 3.2//EN
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTAMP:20040519T083835Z
+ORGANIZER:MAILTO:test at oberon.co.za
+ATTENDEE;CN=Test2 User;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:mailto:test2 at oberon.co.za
+CREATED:20040519T083734Z
+UID:libkcal-67797385.1001
+SEQUENCE:1
+LAST-MODIFIED:20040519T083734Z
+SUMMARY:a
+CLASS:PUBLIC
+PRIORITY:3
+DTSTART:20040614T080000Z
+DTEND:20040614T100000Z
+TRANSP:OPAQUE
+END:VEVENT
+
+END:VCALENDAR
+
+
+--Boundary-00=_R0xqAO2ZmkKUNMZ--
+
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.eml
new file mode 100644
index 0000000..2145947
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.eml
@@ -0,0 +1,10 @@
+To: wrobel at pardus.example.org
+Subject: test
+From: Gunnar Wrobel <wrobel at kolab.example.org>
+Date: Tue, 27 Nov 2007 08:49:39 +0100
+Message-ID: <878x4k6sbw.fsf at kolab.example.org>
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.ret
new file mode 100644
index 0000000..170239d
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/tiny.ret
@@ -0,0 +1,13 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.org
+To: wrobel at pardus.example.org
+Subject: test
+From: Gunnar Wrobel <wrobel at kolab.example.org>
+Date: Tue, 27 Nov 2007 08:49:39 +0100
+Message-ID: <878x4k6sbw.fsf at kolab.example.org>
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.eml
new file mode 100644
index 0000000..467a29b
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.eml
@@ -0,0 +1,14 @@
+Return-Path: <me at example.org>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: me at example.org
+To: you at example.net
+Subject: Me to You
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+I'm on vacation
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.ret
new file mode 100644
index 0000000..c68b789
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/vacation.ret
@@ -0,0 +1,17 @@
+Mail from sender: me at example.org
+Mail to recipient: you at example.net
+Return-Path: <me at example.org>
+Received: from localhost (fqdn.example.org [127.0.0.1])
+	 by demo.example.org (Cyrus v2.3.9-openpkg) with LMTPA;
+	 Sat, 10 Nov 2007 20:44:52 +0100
+Message-ID: <1d2101c823d2$3555aa10$ac112c15 at Meredith>
+From: me at example.org
+To: you at example.net
+Subject: Me to You
+Date: Sat, 10 Nov 2007 22:45:12 +0300
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+I'm on vacation
+.
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.eml b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.eml
new file mode 100644
index 0000000..d25cb06
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.eml
@@ -0,0 +1,10 @@
+To: %2$s
+Subject: test
+From: %1$s
+Date: Tue, 27 Nov 2007 08:49:39 +0100
+Message-ID: <878x4k6sbw.fsf at kolab.example.com>
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
diff --git a/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.ret b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.ret
new file mode 100644
index 0000000..5635227
--- /dev/null
+++ b/Kolab_Filter-0.1.7/test/Horde/Kolab/Filter/fixtures/validation.ret
@@ -0,0 +1,13 @@
+Mail from sender: %1$s
+Mail to recipient: %2$s
+To: %2$s
+Subject: test
+From: %1$s
+Date: Tue, 27 Nov 2007 08:49:39 +0100
+Message-ID: <878x4k6sbw.fsf at kolab.example.com>
+User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.1.50 (x86_64-pc-linux-gnu)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+
+test
+.
diff --git a/package.xml b/package.xml
index 7c726c1..7d5169d 100644
--- a/package.xml
+++ b/package.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.6.2" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+<package packagerversion="1.7.2" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
  <name>Kolab_Filter</name>
  <channel>pear.horde.org</channel>
  <summary>Postfix filters for the Kolab server</summary>
@@ -24,10 +24,10 @@
   <email>jan at horde.org</email>
   <active>yes</active>
  </lead>
- <date>2009-02-24</date>
- <time>12:20:50</time>
+ <date>2009-11-16</date>
+ <time>22:24:28</time>
  <version>
-  <release>0.1.4</release>
+  <release>0.1.7</release>
   <api>0.1.0</api>
  </version>
  <stability>
@@ -35,55 +35,70 @@
   <api>alpha</api>
  </stability>
  <license uri="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</license>
- <notes>* Fixed log location for fatal errors (kolab/issue3426,
-  https://www.intevation.de/roundup/kolab/issue3426)
-* Fixed invalid function call in Content.php (kolab/issue3426,
-  https://www.intevation.de/roundup/kolab/issue3426)
-* Fixed unnecessary large test file (kolab/issue3299,
-  https://www.intevation.de/roundup/kolab/issue3299)
-* Extended testing.
-* Added man page (kolab/issue3364,
-  https://www.intevation.de/roundup/kolab/issue3364)
-* Added string translations (kolab/issue2499,
-  https://www.intevation.de/roundup/kolab/issue2499)
-* Fixed the Outlook iCal handler (kolab/issue3192,
-  https://www.intevation.de/roundup/kolab/issue3192)</notes>
+ <notes>* LDAP errors should be marked as temporary failures.
+* kolab/issue3464 (kolab-filter inserts double encoded utf-8 code
+  into From: header)
+* kolab/issue3616 (automatic replies to invitations contain
+  127.0.0.1 in Message-ID)
+* kolab/issue3364 (manpages for kolabfilter and kolabmailboxfilter)
+* kolab/issue3768 (Kolab server 2.2.2 resmgr doesn&apos;t copy attendee
+  status)
+* kolab/issue3767 (Kolab server 2.2.0 resmgr creates incorrect event
+  attendee status values)
+* kolab/issue3610 (Mail to unknown at something.example.com gets
+  accepted and yields kolabmailboxfilter exit 38)
+* kolab/issue2499 (Notification messages by the resource manager
+  should be localized)
+* kolab/issue2544 (Encoding problem in cancelled appointments)
+* Reverted the fix for kolab/issue2495 (The reply to an invitation
+  with umlauts of a group account doesn&apos;t display the umlauts.) It
+  should be covered by the fix for kolab/issue2499.
+* Added dutch translation. Submitted by Richard Bos
+  (ml at radoeka.nl).</notes>
  <contents>
   <dir name="/">
-   <file md5sum="cc30187fe2abc2860ba69f5fa11c7e59" name="doc/Horde/Kolab/Filter/kolabfilter.1" role="doc" />
-   <file md5sum="a04828e84263b0353b5ffc07ca9461df" name="lib/Horde/Kolab/Test/Filter.php" role="php" />
-   <file md5sum="f58645b33bc001e962df0b28b30329bd" name="lib/Horde/Kolab/Filter/Transport/drop.php" role="php" />
-   <file md5sum="3389d5e44b4e5e284ff9cea2f3f5e6da" name="lib/Horde/Kolab/Filter/Transport/DovecotLDA.php" role="php" />
-   <file md5sum="12f67f3b4a3d12c83a9a8109c591236c" name="lib/Horde/Kolab/Filter/Transport/echo.php" role="php" />
-   <file md5sum="add4027acc1170e641fb306ac8a3d8f6" name="lib/Horde/Kolab/Filter/Transport/lda.php" role="php" />
-   <file md5sum="6a20c01ed862d8f05b1ad300cb46a5de" name="lib/Horde/Kolab/Filter/Transport/lmtp.php" role="php" />
-   <file md5sum="26137eadce443da496095c3f41150fd5" name="lib/Horde/Kolab/Filter/Transport/LMTPTLS.php" role="php" />
-   <file md5sum="733773bb13cd1a14aa7b5a0ee7e78a46" name="lib/Horde/Kolab/Filter/Transport/smtp.php" role="php" />
-   <file md5sum="b22709a252503d254a42d054d7eb10a2" name="lib/Horde/Kolab/Filter/Transport/stdout.php" role="php" />
-   <file md5sum="9bbc4bc4d188ccc99365206efe83c628" name="lib/Horde/Kolab/Filter/Content.php" role="php" />
-   <file md5sum="37990654dd93f073d9ca016089e21319" name="lib/Horde/Kolab/Filter/Base.php" role="php" />
-   <file md5sum="9daa29422511640a4aaa5f3ad3473de5" name="lib/Horde/Kolab/Filter/Incoming.php" role="php" />
-   <file md5sum="7660583d45fba7a719e5d06a77be3123" name="lib/Horde/Kolab/Filter/Outlook.php" role="php" />
-   <file md5sum="7af6b65b9b2ce0342e90b7fdf07a6c82" name="lib/Horde/Kolab/Filter/Response.php" role="php" />
-   <file md5sum="e7603bb3fcab64ed965f8c56abaf95b9" name="lib/Horde/Kolab/Filter/Transport.php" role="php" />
-   <file md5sum="665f322954d9b8d98ec0f8ab69041e47" name="lib/Horde/Kolab/Resource.php" role="php" />
+   <file md5sum="052a41fdef95d760bc44b7f64fb8e880" name="doc/Horde/Kolab/Filter/kolabfilter.1" role="doc" />
+   <file md5sum="602193a43726c6d6b8931b91d4e599ae" name="lib/Horde/Kolab/Test/Filter.php" role="php" />
+   <file md5sum="8e3310732eac040e6c5554242e8e5fa1" name="lib/Horde/Kolab/Filter/Transport/drop.php" role="php" />
+   <file md5sum="246868f1b790361cfeed6922cd388dcd" name="lib/Horde/Kolab/Filter/Transport/DovecotLDA.php" role="php" />
+   <file md5sum="d30ccfd21885c7f845593d0006437306" name="lib/Horde/Kolab/Filter/Transport/echo.php" role="php" />
+   <file md5sum="92ad81e30a1797c22db1bb2c6884ebd3" name="lib/Horde/Kolab/Filter/Transport/lda.php" role="php" />
+   <file md5sum="f59900c537792e6071e8a186c57a4a9c" name="lib/Horde/Kolab/Filter/Transport/lmtp.php" role="php" />
+   <file md5sum="71475e326a5868433e794a61487adca4" name="lib/Horde/Kolab/Filter/Transport/LMTPTLS.php" role="php" />
+   <file md5sum="bb97b5d629eb5944dc1925d60233211b" name="lib/Horde/Kolab/Filter/Transport/smtp.php" role="php" />
+   <file md5sum="8dd600bee2f8cfb18497b844c745fb6d" name="lib/Horde/Kolab/Filter/Transport/stdout.php" role="php" />
+   <file md5sum="87a6996d414fda6bac4b330b4777851c" name="lib/Horde/Kolab/Filter/Content.php" role="php" />
+   <file md5sum="7ac091bc6e93641b6aaf1178835a78c9" name="lib/Horde/Kolab/Filter/Base.php" role="php" />
+   <file md5sum="50236db35a17ebb6f443a4c48ee717cd" name="lib/Horde/Kolab/Filter/Incoming.php" role="php" />
+   <file md5sum="9c7a06ac99c38f83044f4ccd6fefd997" name="lib/Horde/Kolab/Filter/Outlook.php" role="php" />
+   <file md5sum="0d1b7fa1d22fe3b4d8fedf51ac0c713a" name="lib/Horde/Kolab/Filter/Response.php" role="php" />
+   <file md5sum="9530dd964477bf3be666a417018e2701" name="lib/Horde/Kolab/Filter/Transport.php" role="php" />
+   <file md5sum="572d1733dcdd85125abb7dd8dc78f423" name="lib/Horde/Kolab/Resource.php" role="php" />
    <file baseinstalldir="/" md5sum="a04649dc07394bf7e36de8e66e39e0bc" name="locale/de_DE/LC_MESSAGES/Kolab_Filter.mo" role="data" />
-   <file baseinstalldir="/" md5sum="d5c12fda5a2d619bdbcbaa9b0374896d" name="script/Horde/Kolab/Filter/kolabfilter.php" role="script">
+   <file baseinstalldir="/" md5sum="ed6978095b81aef6ce0537214828b383" name="locale/fr_FR/LC_MESSAGES/Kolab_Filter.mo" role="data" />
+   <file baseinstalldir="/" md5sum="48a6d6162bc03fc11cfc99eb02eaab55" name="po/Kolab_Filter.pot" role="data" />
+   <file baseinstalldir="/" md5sum="f29779c282042c38887a5c0c780cb999" name="po/de_DE.po" role="data" />
+   <file baseinstalldir="/" md5sum="5ae85773a11b30bfd987c5e7c63d0d4c" name="po/fr_FR.po" role="data" />
+   <file baseinstalldir="/" md5sum="2c51123facef38b574f5df80f1ce2305" name="script/Horde/Kolab/Filter/kolabfilter.php" role="script">
     <replace from="@php_bin@" to="php_bin" type="pear-config" />
    </file>
-   <file baseinstalldir="/" md5sum="5612ff8f00eb51b7498a1d6b818be870" name="script/Horde/Kolab/Filter/kolabmailboxfilter.php" role="script">
+   <file baseinstalldir="/" md5sum="1dee67d9164f4daf98a2382a351007d5" name="script/Horde/Kolab/Filter/kolabmailboxfilter.php" role="script">
     <replace from="@php_bin@" to="php_bin" type="pear-config" />
    </file>
+   <file md5sum="84ea63cbc136b7b68d00148bad566fd8" name="test/Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml" role="test" />
    <file md5sum="ac0bba09a50305b9300bdbb5bafdfe1a" name="test/Horde/Kolab/Filter/fixtures/empty.eml" role="test" />
    <file md5sum="f531fdf4473cccb721f5bc2604caf9ad" name="test/Horde/Kolab/Filter/fixtures/empty2.ret" role="test" />
    <file md5sum="e9893edaf7e6f8ba999ab87f04e30e08" name="test/Horde/Kolab/Filter/fixtures/forged.eml" role="test" />
-   <file md5sum="91b6527ff27560cc17cd38de30ecc2e6" name="test/Horde/Kolab/Filter/fixtures/forged.ret" role="test" />
-   <file md5sum="91b6527ff27560cc17cd38de30ecc2e6" name="test/Horde/Kolab/Filter/fixtures/forged_trans.ret" role="test" />
+   <file md5sum="e1a301fd6db9605771c5c6b978fef859" name="test/Horde/Kolab/Filter/fixtures/forged.ret" role="test" />
+   <file md5sum="e1a301fd6db9605771c5c6b978fef859" name="test/Horde/Kolab/Filter/fixtures/forged_trans.ret" role="test" />
    <file md5sum="a057ae00b3db85374175f6cc2ec91156" name="test/Horde/Kolab/Filter/fixtures/invitation_forward.eml" role="test" />
+   <file md5sum="6355cc3f199b0ffc12e6db58abd7bfb9" name="test/Horde/Kolab/Filter/fixtures/invitation_forward.ret" role="test" />
    <file md5sum="9cd31394f99b2b08df9263b9588eeb23" name="test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml" role="test" />
    <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="test/Horde/Kolab/Filter/fixtures/null.ret" role="test" />
    <file md5sum="6e6a6856355da4df732c604f4c40009c" name="test/Horde/Kolab/Filter/fixtures/privileged.ret" role="test" />
    <file md5sum="8b177e9f8d050fd41bb047636ac27859" name="test/Horde/Kolab/Filter/fixtures/recur_invitation.eml" role="test" />
+   <file md5sum="e237c05e0fc2797f457c8c4167e4b174" name="test/Horde/Kolab/Filter/fixtures/recur_invitation2.eml" role="test" />
+   <file md5sum="1ce6cb772f4943caab5870e8455065a9" name="test/Horde/Kolab/Filter/fixtures/recur_invitation.ret" role="test" />
    <file md5sum="b9a57356f47551238e9d82cc1efc4b41" name="test/Horde/Kolab/Filter/fixtures/simple.eml" role="test" />
    <file md5sum="bdc99f67a23e958ec10c5b3c865029a9" name="test/Horde/Kolab/Filter/fixtures/simple.ret" role="test" />
    <file md5sum="a3224ffae8b641169973acffc9108b48" name="test/Horde/Kolab/Filter/fixtures/simple2.ret" role="test" />
@@ -95,12 +110,12 @@
    <file md5sum="34f97d1bedc888143175fbbcacbd5a3d" name="test/Horde/Kolab/Filter/fixtures/vacation.ret" role="test" />
    <file md5sum="a645d758ee073d6fa3493ce31802d50f" name="test/Horde/Kolab/Filter/fixtures/validation.eml" role="test" />
    <file md5sum="bf3397e22f1e04c9ecd110371e0f4dd9" name="test/Horde/Kolab/Filter/fixtures/validation.ret" role="test" />
-   <file md5sum="54eabf6b3031ee0055e2f243b23cc587" name="test/Horde/Kolab/Filter/AllTests.php" role="test" />
-   <file md5sum="401a754649c24d2a1bd6dc1ebac31819" name="test/Horde/Kolab/Filter/FilterTest.php" role="test" />
-   <file md5sum="6c10d87c00403170c4e3e360273a58a5" name="test/Horde/Kolab/Filter/ContentTest.php" role="test" />
-   <file md5sum="8ef5bf6da88310b74a0b088ff2852c59" name="test/Horde/Kolab/Filter/IncomingTest.php" role="test" />
-   <file md5sum="098fdc5c479326d8d24efdf187a42023" name="test/Horde/Kolab/Filter/LoadTest.php" role="test" />
-   <file md5sum="df7091eabd99954a83feeb3323b1ad09" name="test/Horde/Kolab/Filter/ResourceTest.php" role="test" />
+   <file md5sum="111ed75d1e624eeb85f241da72fe18b2" name="test/Horde/Kolab/Filter/AllTests.php" role="test" />
+   <file md5sum="43cb547b160184b5c7ed9d5b6d55ad33" name="test/Horde/Kolab/Filter/FilterTest.php" role="test" />
+   <file md5sum="ee05813d7297857bf64a05766f9fff3e" name="test/Horde/Kolab/Filter/ContentTest.php" role="test" />
+   <file md5sum="540b40bc372fe0e58abb9d727be51908" name="test/Horde/Kolab/Filter/IncomingTest.php" role="test" />
+   <file md5sum="c78ba92630b73a019f3871fae77814cc" name="test/Horde/Kolab/Filter/LoadTest.php" role="test" />
+   <file md5sum="c76673eb2ca36c39895564ac41880193" name="test/Horde/Kolab/Filter/ResourceTest.php" role="test" />
    <file md5sum="3f4ea54f3394faa88b3da3613a20a27f" name="COPYING" role="doc" />
   </dir>
  </contents>
@@ -180,16 +195,20 @@
    <install as="Horde/Kolab/Filter/IncomingTest.php" name="test/Horde/Kolab/Filter/IncomingTest.php" />
    <install as="Horde/Kolab/Filter/LoadTest.php" name="test/Horde/Kolab/Filter/LoadTest.php" />
    <install as="Horde/Kolab/Filter/ResourceTest.php" name="test/Horde/Kolab/Filter/ResourceTest.php" />
+   <install as="Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml" name="test/Horde/Kolab/Filter/fixtures/attendee_status_invitation.eml" />
    <install as="Horde/Kolab/Filter/fixtures/empty.eml" name="test/Horde/Kolab/Filter/fixtures/empty.eml" />
    <install as="Horde/Kolab/Filter/fixtures/empty2.ret" name="test/Horde/Kolab/Filter/fixtures/empty2.ret" />
    <install as="Horde/Kolab/Filter/fixtures/forged.eml" name="test/Horde/Kolab/Filter/fixtures/forged.eml" />
    <install as="Horde/Kolab/Filter/fixtures/forged.ret" name="test/Horde/Kolab/Filter/fixtures/forged.ret" />
    <install as="Horde/Kolab/Filter/fixtures/forged_trans.ret" name="test/Horde/Kolab/Filter/fixtures/forged_trans.ret" />
    <install as="Horde/Kolab/Filter/fixtures/invitation_forward.eml" name="test/Horde/Kolab/Filter/fixtures/invitation_forward.eml" />
+   <install as="Horde/Kolab/Filter/fixtures/invitation_forward.ret" name="test/Horde/Kolab/Filter/fixtures/invitation_forward.ret" />
    <install as="Horde/Kolab/Filter/fixtures/longstring_invitation.eml" name="test/Horde/Kolab/Filter/fixtures/longstring_invitation.eml" />
    <install as="Horde/Kolab/Filter/fixtures/null.ret" name="test/Horde/Kolab/Filter/fixtures/null.ret" />
    <install as="Horde/Kolab/Filter/fixtures/privileged.ret" name="test/Horde/Kolab/Filter/fixtures/privileged.ret" />
    <install as="Horde/Kolab/Filter/fixtures/recur_invitation.eml" name="test/Horde/Kolab/Filter/fixtures/recur_invitation.eml" />
+   <install as="Horde/Kolab/Filter/fixtures/recur_invitation2.eml" name="test/Horde/Kolab/Filter/fixtures/recur_invitation2.eml" />
+   <install as="Horde/Kolab/Filter/fixtures/recur_invitation.ret" name="test/Horde/Kolab/Filter/fixtures/recur_invitation.ret" />
    <install as="Horde/Kolab/Filter/fixtures/simple.eml" name="test/Horde/Kolab/Filter/fixtures/simple.eml" />
    <install as="Horde/Kolab/Filter/fixtures/simple.ret" name="test/Horde/Kolab/Filter/fixtures/simple.ret" />
    <install as="Horde/Kolab/Filter/fixtures/simple2.ret" name="test/Horde/Kolab/Filter/fixtures/simple2.ret" />
@@ -205,6 +224,85 @@
  </phprelease>
  <changelog>
   <release>
+   <date>2009-11-07</date>
+   <version>
+    <release>0.1.6</release>
+    <api>0.1.0</api>
+   </version>
+   <stability>
+    <release>alpha</release>
+    <api>alpha</api>
+   </stability>
+   <license uri="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</license>
+   <notes>* Added french translation. Submitted by Mathieu Parent
+  (mathieuparent at users.sourceforge.net).
+* kolab-filter inserts wrong/undecodeable utf-8 code into From: header
+  (kolab/issue3464, https://issues.kolab.org/issue3464)
+* Notification messages by the resource manager should be localized
+  (kolab/issue2499, https://issues.kolab.org/issue2499)
+* Whole-day events broken for resources (kolab/issue3558,
+  https://www.intevation.de/roundup/kolab/issue3558)
+* Umlauts broken in automatically accepted events (kolab/issue3568,
+  https://www.intevation.de/roundup/kolab/issue3568)
+* kolabmailboxfilter does not accept mail for
+  user+extension at example.com (kolab/issue3521,
+  https://www.intevation.de/roundup/kolab/issue3521)
+* php error when inviting outside of free/busy interval
+  (kolab/issue3560, https://www.intevation.de/roundup/kolab/issue3560)
+* Resmgr eats up all memory and dies on some recuring events
+  (https://issues.kolab.org/issue3868)</notes>
+  </release>
+  <release>
+   <date>2009-03-06</date>
+   <version>
+    <release>0.1.5</release>
+    <api>0.1.0</api>
+   </version>
+   <stability>
+    <release>alpha</release>
+    <api>alpha</api>
+   </stability>
+   <license uri="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</license>
+   <notes>* Resources with policy &quot;always accept&quot; do not work if domain != kolabhost
+  (kolab/issue3441, https://www.intevation.de/roundup/kolab/issue3441)
+* Resource booking fails if TRANSP:TRANSPARENT in the invitation
+  (kolab/issue1336, https://www.intevation.de/roundup/kolab/issue1336)
+* Implemented simple resource locking (kolab/issue1382,
+  https://www.intevation.de/roundup/kolab/issue1382)
+* Kolab_Filter dies when it should accept but has no Calender folder access
+  (kolab/issue3289, https://www.intevation.de/roundup/kolab/issue3289)
+* Delivery of invitations fails with no kolabInvitationPolicy is in ldap,
+  (kolab/issue3435, https://www.intevation.de/roundup/kolab/issue3435)
+* Ensure that the Outlook iCal handler adds the ORGANIZER of an
+  event and fix reinjection port for rewritten invitations
+  (kolab/issue3192, https://www.intevation.de/roundup/kolab/issue3192)</notes>
+  </release>
+  <release>
+   <date>2009-02-24</date>
+   <version>
+    <release>0.1.4</release>
+    <api>0.1.0</api>
+   </version>
+   <stability>
+    <release>alpha</release>
+    <api>alpha</api>
+   </stability>
+   <license uri="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</license>
+   <notes>* Fixed log location for fatal errors (kolab/issue3426,
+  https://www.intevation.de/roundup/kolab/issue3426)
+* Fixed invalid function call in Content.php (kolab/issue3426,
+  https://www.intevation.de/roundup/kolab/issue3426)
+* Fixed unnecessary large test file (kolab/issue3299,
+  https://www.intevation.de/roundup/kolab/issue3299)
+* Extended testing.
+* Added man page (kolab/issue3364,
+  https://www.intevation.de/roundup/kolab/issue3364)
+* Added string translations (kolab/issue2499,
+  https://www.intevation.de/roundup/kolab/issue2499)
+* Fixed the Outlook iCal handler (kolab/issue3192,
+  https://www.intevation.de/roundup/kolab/issue3192)</notes>
+  </release>
+  <release>
    <date>2008-12-12</date>
    <version>
     <release>0.1.3</release>




More information about the packaging-commits mailing list