\documentclass{article}
\usepackage{ulem}
\usepackage{graphicx}
\usepackage{hyperref}
\pagestyle{headings}
\begin{document}
\part{Backward Compatibility Breaking Horde Issues (aka Horde 4.0 TODO)}
\begin{itemize}
\item Switch to HTML 4.01 Transitional


\item Switch to <a href="https://wiki.horde.org/Project/HordePolicy">Horde\_Policy</a> for configuration


\item Fix cloning behavior (See Bug 1410).


\item Remove \texttt{\$foo = \&new Foo();} calls and replace with \texttt{\$foo = new Foo();} - The former is deprecated as of PHP 5 and causes errors when strict code checking is on.


\item Similarly, don't pass objects by reference ( function foo(\&\$bar) )


\item Move share edit form into framework package to make it extendable.


\item Convert all configuration files to XML format (or to a unified conf.yaml, or an annotated conf.php - either way, something the config interface can universally manage and generate)


\item Checkboxes in Horde\_Form that are marked as required should be required to be checked.


\item Use hash() instead of md5 or sha1 directly for speed (<a href="http://us.php.net/manual/en/function.hash.php\">http://us.php.net/manual/en/function.hash.php\textbackslash\{\}</a>) \textbf{(As of 1/14/2009, all md5() and sha1() calls in horde-git and horde-hatchery have been converted)}


\item Add a single function for changing the language (handle the bindTextDomain() call also)


\item Remove hack to fix app-specific Notification\_Listeners that output <p> instead of <li> (in Notification/Listener/status.php).


\item Filter all input through filter extension or library.


\item Use phone form fields, i.e. in Turba.


\item Use exceptions instead of PEAR\_Errors. \textbf{(100\% DONE in native IMP code)}


\item Clean up Horde::loadConfiguration() mess.


\item Set the cache expiration time when the entry is set.  This is done in 3.2 but the API should be modified to remove the \$lifetime argument from get() and exists().  When checking for cache data the check should only be that the data is not expired.  Garbage collection should automatically remove expired data.


\end{itemize}
>> However, it's useful to have a way to use expired data in the cache, or to have other kinds of "stampede protection" (have the first process that hits an expired entry touch() it before regenerating it, so that other processes don't *also* try and regenerate it - thus the stampede effect). --ChuckHagenbuch

\begin{itemize}
\item Fix Horde\_Cache\_file:: to accept mixed \$data, instead of just a string.
\begin{itemize}
\item But <a href="http://lists.horde.org/archives/dev/Week-of-Mon-20070305/021221.html">http://lists.horde.org/archives/dev/Week-of-Mon-20070305/021221.html</a>


\end{itemize}

\item Use file\_put\_contents() exclusively.


\item Refactor Horde\_iCalendar
\begin{itemize}
\item Users shouldn't have to deal with property names, formatting, escaping, versions, etc.


\item Make getType() return values consistent.


\item Consistent return types (array vs. timestamp) in \_parse*() methods.


\item Move date/time parsing methods to Horde\_Date::.


\end{itemize}

\item Clean up horrible Share reference workarounds (<a href="http://bugs.horde.org/ticket/?id=5086">http://bugs.horde.org/ticket/?id=5086</a>, <a href="http://bugs.horde.org/ticket/?id=5422\">http://bugs.horde.org/ticket/?id=5422\textbackslash\{\}</a>)


\item Make editors horde-wide configurable, maybe a preference


\item Store all date/time information as UTC and convert to user's timezone \textbf{(DONE only in Kronolith)}


\item Make sure that Horde\_Compress\_* use streams instead of requiring full files in memory. \textbf{(DONE for zip files, see <a href="http://bugs.horde.org/ticket/?id=7814">Bug \#7814</a>)}


\item \textbf{DONE}
\begin{itemize}
\item Encrypt deprecations in Horde\_Crypt\_pgp::. \textbf{(DONE)}


\item Use one place for clear text sendmail error messages.  \textbf{(DONE - Horde\_Mime\_Mail::sendmailError())}


\item rename files in imp/templates/prefs to more sensible defaults (e.g. draftsfolderselect.inc, not folderselect.inc) \textbf{(DONE)}


\item Remove IMP\_SpellChecker::. \textbf{(DONE)}


\item Don't let Horde\_Crypt\_pgp methods check for secure connection. \textbf{(DONE)}


\item Remove pref\_api BC files \textbf{(DONE)}


\item Remove pre-Horde\_Alarm reminder scripts and supporting classes \textbf{(DONE)}


\item Have some sort of Horde\_URL object used to create/work with URLs (will deprecate Util::addParameter(), Util::removeParameter()) \textbf{(DONE - Horde\_Url)}


\item In Browser::, change 'konqueror' to 'webkit' (or add both 'webkit' and 'safari'). \textbf{(DONE)}


\item Move browser RTE capability sniffing to Horde\_Editor drivers. \textbf{(DONE)}


\item Refactor Maintenance code to trigger it globally on login instead of each application needing to trigger it's own tasks. \textbf{(DONE via Horde\_LoginTasks:: rewrite)}


\item Remove IMP\_Serialize\_JSON:: and Kronolith\_Serialize\_JSON::. \textbf{(DONE)}


\item Remove Gollem\_Serialize\_JSON::. \textbf{(DONE)}


\item Remove alternate login/logout settings from IMP/Gollem. \textbf{(DONE)}


\item Refactor Horde\_Image: 100\% native Imagick driver (avoids having to keep the image data in instance variable in addition to the imagick object), Allow image objects to represent more than 1 image/page, Move the Exif reading code from Ansel\_ImageData into Horde\_Image. \textbf{(DONE)}


\end{itemize}

\end{itemize}
\section{IMAP stuff}
\begin{itemize}
\item Remove IMAP\_Tree::. \textbf{(DONE)}


\item Merge IMP\_Thread:: to IMAP\_Thread::. \textbf{(DONE)}


\item Refactor IMP\_IMAPClient::. \textbf{(NOT NEEDED - IMP\_IMAPClient has been removed)}


\item Refactor IMAP\_ACL::. \textbf{(DONE)}


\item Have IMAP\_Cache:: use SessionObjects instead of directly accessing the session.  \textbf{(NOT NEEDED - Cache code moved to Horde\_Imap\_Client)}


\item Remove IMP\_IMAP\_Search::. \textbf{(DONE)}


\item Remove Ingo\_IMAP\_Search::. \textbf{(DONE)}


\item Remove imap\_reopen() call in IMAP\_Search::.  \textbf{(NOT NEEDED - IMAP\_Search has gone away)}


\end{itemize}
\section{Framework Libraries}
\begin{itemize}
\item prefix all framework classes with Horde\_ (see <a href="http://www.php.net/manual/en/userlandnaming.php\">http://www.php.net/manual/en/userlandnaming.php\textbackslash\{\}</a>).


\item capitalization (Horde\_Xml\_Wbxml instead of XML\_WBXML)


\item lib/ organization, test/, etc. (document new package structure at <a href="https://wiki.horde.org/Doc/Dev/Libraries">Doc/Dev/Libraries</a>)


\item one framework structure, multiple packageName.xml files?


\item pear package names don't include Horde; horde is the channel - pear install horde/auth


\item use Horde\_Autoloader; never use include(\_once) or require(\_once)


\end{itemize}
\section{MIME issues}
\begin{itemize}
\item Remove deprecated code in MIME\_Headers:: \textbf{(DONE)}


\item Remove BC mime\_drivers code in MIME\_Viewer::, IMP\_Contents::, MIMP\_Contents::. \textbf{(DONE)}


\item Make MIME::\_rfc822encode() a public function. \textbf{(DONE)}


\item Make MIME\_Viewers responsible for retrieving part contents (so they can determine whether or not contents should be retrieved at all and/or cached). \textbf{(DONE)}


\item Don't link MIME icons to Viewers - show icons no matter what viewers are installed/enabled/etc \textbf{(NOT NEEDED - icons will always need to be configured in mime\_viewers.php; not sure how else this is supposed to work)}


\end{itemize}
\section{VFS}
\begin{itemize}
\item Clean up VFS\_sql to use '/' as the root of the VFS instead of ''.  This will make it behave like the other VFS backends without code to do the conversion.


\item Use/learn from <a href="http://www.php.net/\~helly/php/ext/spl/">http://www.php.net/\textbackslash\{\}\textasciitilde{}helly/php/ext/spl/</a>


\item Specifically DirectoryIterator, SPLFileInfo, SplFileObject, ...


\item Implement and enforce VFS permissions, at least in the backends which do not enforce permissions themselves ('sql' and in some cases 'file').


\end{itemize}
\section{JavaScript}
\begin{itemize}
\item Put core javascript into a package so it can be versioned/upgraded?


\item \textbf{DONE}
\begin{itemize}
\item Remove last traces of enter\_key\_trap.js \textbf{(DONE)}


\item Remove code like hideable.js that is encapsulated by Prototype (or whatever js toolkit 4.0 uses standard) \textbf{(DONE)}


\item Global Prototype/Scriptaculous libraries. \textbf{(DONE)}


\item Remove app-specific 'stripe.js' files. \textbf{(DONE)}


\item Remove app-specific 'open\_calendar.js' files and extra code in Horde's open\_calendar.js. \textbf{(DONE - Horde\_UI\_JsCalendar::)}


\item Replace horde's popup.js with IMP's version. \textbf{(DONE)}


\item Basically consolidate \_all\_ js present in multiple apps \textbf{(DONE)}


\item Remove print.js in favor of just window.print() \textbf{(DONE)}


\item IMP's spellchecker library could probably be globally available \textbf{(DONE - moved to Horde\_Ajax)}


\end{itemize}

\end{itemize}
\section{Templates}
\begin{itemize}
\item Replace all templates with a Horde\_View class, with a default of simple PHP templates


\item Introduce templates for ALL HTML generated in libraries


\item Figure out how to handle templates for framework packages


\item Default HTML Horde\_View should escape all output (htmlspecialchars)?


\item Some sort of simple tag system for user-editable content (maybe based on <a href="http://www.cheetahtemplate.org/">http://www.cheetahtemplate.org/</a> ?)


\item \textbf{DONE}
\begin{itemize}
\item Remove IMP\_Template, Ingo\_Template, and Gollem\_Template. \textbf{(DONE)}


\end{itemize}

\end{itemize}
\section{Bugs}
\begin{itemize}
\item Bug <a href="http://bugs.horde.org/ticket/?id=3271">3271</a> - more specifically, how to deal with addition of configspecial tags. Of course, this depends on what changes are made to Horde's configuration design.


\item \textbf{DONE}
\begin{itemize}
\item Bug <a href="http://bugs.horde.org/ticket/?id=4221">4221</a> (\textbf{DONE}).


\item Un-stall all tickets with Horde 4/IMP 5/etc. milestones (\textbf{DONE})


\end{itemize}

\end{itemize}
\section{Internationalization}
\begin{itemize}
\item Require UTF-8 support


\item Replace number\_format() with intl's <a href="https://wiki.horde.org/NumberFormatter">NumberFormatter</a>


\end{itemize}
\section{To discuss}
\begin{itemize}
\item <a href="https://wiki.horde.org/RemoveGlobals">RemoveGlobals</a>


\item <a href="https://wiki.horde.org/Project/HordeSpaces">Project/HordeSpaces</a>


\item Require PHP 5.3+ and use the intl extension (<a href="http://us3.php.net/intl\">http://us3.php.net/intl\textbackslash\{\}</a>)


\item <a href="https://wiki.horde.org/Horde4/Config">Horde4/Config</a>


\item Per-variable session locks? <a href="http://thwartedefforts.org/2006/11/11/race-conditions-with-ajax-and-php-sessions/">http://thwartedefforts.org/2006/11/11/race-conditions-with-ajax-and-php-sessions/</a>


\item Deal w/CSS namespace clashing issues in portals (see, e.g., <a href="http://bugs.horde.org/ticket/?id=5831\">http://bugs.horde.org/ticket/?id=5831\textbackslash\{\}</a>). Prefix all css rule names with the application name (.horde-header)? Or have separate CSS files for portal apps (better - prevents from loading entire CSS files when most isn't needed)


\item Figure out what to do re: gettext strings in framework packages (see, e.g., <a href="http://lists.horde.org/archives/dev/Week-of-Mon-20090706/024036.html">http://lists.horde.org/archives/dev/Week-of-Mon-20090706/024036.html</a> and <a href="http://lists.horde.org/archives/dev/Week-of-Mon-20090713/024066.html\">http://lists.horde.org/archives/dev/Week-of-Mon-20090713/024066.html\textbackslash\{\}</a>)


\item \textbf{DONE}
\begin{itemize}
\item Remove confusing mess of hooks and other ways of muddling logins (especially with IMP), and replace them \_all\_ with the preauthenticate and postauthenticate hooks + appropriate examples for things like vhosting. \textbf{(DONE)}


\item Clean up tobackend/frombackend hooks - either remove them, or name them better, or document when and where they need to be called. \textbf{(DONE; moved to single authusername hook and documented better)}


\item Get rid of 'realms' (replace with <a href="https://wiki.horde.org/Project/HordeSpaces">Project/HordeSpaces</a> where necessary). \textbf{(DONE; use authusername hook instead)}


\item Remove imp['uniquser'] ? \textbf{(DONE)}


\item Use 1 login screen for all apps (i.e. LoginController)? \textbf{(DONE)}


\end{itemize}

\end{itemize}
\end{document}
