2008-11-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1, first release candidate build.

2008-11-21 Harry Metske <metskem@apache.org>

        * 2.8.1-svn-16
        
        * JSPWIKI-407: applied zh_CN patch from Hubert Chang

2008-11-18  Harry Metske <metskem@apache.org>

        * 2.8.1-svn-15
         
        * JSPWIKI-415: Favorites not displayed properly when blank in userName, reported by Trevor Harrison
          Backport from 3.0 to 2.8 on request of Erik Bunn.
          Added 2 JUnit tests for InsertPage plugin
  
2008-11-15  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-14
         
        * Illegal characters removed from jspwiki-common.js causing the YUI 
        compressor to fail.
  
 2008-11-15  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-13
        
        * [JSPWIKI-428]: WeblogPlugin was not properly finding the page title
        due to misshapen regexp.
        
        * [JSPWIKI-407]: Added Italian translation of corepages, thanks to Luca
        Gilardoni. 

2008-11-13  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-12
        
        * [JSPWIKI-381] fixed a bug with periodicially refreshed sneak-preview
        while in section-edit mode. When section-edit was active,
        linefeeds were inserted at every sneak-prev refresh.
        
        * [JSPWIKI-384] Filter js-scripts from input fields and cookies.
        (xss vulnerability)
        

2008-11-06  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-11

        * Added doc/Translating.txt as a guide for people who want to create
        translations.  
        
        * Added ant "i18n-check" target as an interface
        to TranslationsCheck (no need to get geeky running a Java class).

2008-11-06  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.1-svn-10

        * [JSPWIKI-345]: Upgraded freshcookies-security to 0.60, which fixes an issue
        causing generic (non-class-specific) Principal entries in security policies
        to be ignored.

2008-11-06  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-9

        * [JSPWIKI-416]: French translation and corepages from Olivier Descout

2008-11-05  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * [JSPWIKI-407]: updated es translation; fixed some HTML entities left behind.
        
2008-11-03  Harry Metske <metskem@apache.org>

        * 2.8.1-svn-8
        
        * JSPWIKI-407: de translation by Florian, including the two timestamps in 
           ListLocksPlugin, found by Florian again. 
           	
2008-11-04  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-7
        
        * [JSPWIKI-411] LuceneSearchProvider no longer stops processing at startup
        if the indexing dies due to non-indexable content.

2008-11-04  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-6
        
        * JSPWIKI-381: Sneak-preview is now refreshed periodically as well as the
        section-list at the left of the screen. 
        
2008-11-03  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-5
        
        * JSPWIKI-408: Hide wide-content on left-menu and leftmenu-footer.
        
        * JSPWIKI-403: Pagination links now show a pointer cursor at hover.        

2008-11-03  Janne Jalkanen <jalkanen@apache.org>

        * Finnish localization updated (no version bump):

2008-11-03  Harry Metske <metskem@apache.org>

        * 2.8.1-svn-4
        
        * JSPWIKI-407: Unlocalized messages and times in user, group and attachment
           management, reported by Olivier Descout (Forbidden.html not fixed yet)	

        * Finnish localization updated.

2008-11-02  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-3
        
        * [JSPWIKI-288] Each heading now has an anchor link after it.
        Thanks to Christian Helmbold for the idea.
        
2008-10-31  Harry Metske <harry.metske@gmail.com>

        * 2.8.1-svn-2
        
        * [JSPWIKI-406] Renaming a page back to the old name
           destroys text changes of the page, thanks to Stefan Bohn.
        * changed two annoying log.error's to log.warn's 
        
2008-10-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-1
        
        * [JSPWIKI-348] OC4J compatibility, thanks to Lutz Tietze.
        
        * [JSPWIKI-389] Wrong mixed quotes in SecurityConfig.jsp corrected.
        
        * [JSPWIKI-138] rss.jsp now caches the produced XML in a custom
          cache, resulting in *very* fast operation.

2008-10-17  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-rc-2.

        * JSPWIKI-400: Chinese core pages were corrupted.

2008-10-14  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-21
        
        * [JSPWIKI-398] Pages with spaces in them caused erratic rename
        behaviour by renaming all the links on the page.

2008-10-14  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-20

        * [JSPWIKI-313] ShortURLConstructor was not creating URLs for the LOGIN
        context correctly. We now check for this context specifically.

2008-10-13  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-19

        * [JSPWiki-342] Resolved issue by removing outdated doc files.

        * [JSPWIKI-345] Added unit tests for testing single user policies. Confirmed bug
        and workaround but did not fix root cause (freshcookies-security bug).

2008-10-06  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-18

        * [JSPWIKI-395] One more xhtml issue in plain.jsp. Not what you'd expected ;-)
 
         
2008-10-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-17

        * [JSPWIKI-395] Few fixes to improve xhtml compliance.
        (txs to the wonderful tools of Andrew ;-)
        

2008-10-05  Harry Metske <harry.metske@gmail.com>

        * Updated LICENSE and NOTICE file quite a couple of resources (most of them Apache licensed)
        
        * a few minor updates to Compiling.txt, UPGRADING and ReleaseNotes

2008-10-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * Updated LICENSE and NOTICE file for javascript related resources. (no version step-up)

2008-10-01  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-16

        * [JSPWIKI-386] Custom LoginModules were not being configured correctly.
        Thanks to Peter Hormanns for reporting this.

2008-10-01  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-15
        
        * [JSPWIKI-327] Few more tweaks to stabilize the 'back' button handling after a search.
        
        
2008-09-30  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-14
        
        * [JSPWIKI-327] Going back to the search page now remembers the last search query.
        The query and selected pagination-page is stored in the #hash of the url.
        
        
2008-09-30  Janne Jalkanen <jalkanen@apache.org>

        * Oops, Dutch corepages had overwritten the English corepages,
        so restored both English ones and created a dir for Dutch.

2008-09-29  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-13
        
        * [JSPWIKI-385] Header lines are now cleared 'left' so that comment-boxes 
        can appear side by side with !!!header lines. 
        
        * [JSPWIKI-380] Fix backspace handling of the plain editor.

2008-09-29  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-12
        
        * [JSPWIKI-387] Fixed a number of quotes on Install.jsp.

2008-09-27  Harry Metske <harry.metske@gmail.com>

        * 2.8.0-beta-11
        
        * added Dutch corepages

2008-09-24  Juan Pablo Santos <juanpablo.santos@apache.org>

        * 2.8.0-beta-10
        
        * added spanish corepages
        
        * [JSPWIKI 343] Go through all built-in wikipages and make sure all of the 
        documentation in those is ok for 2.8.0. Applied only for en and es corepages.
        
2008-09-24  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-9
        
        * [JSPWIKI-368] Fixed issue with multiple preferences cookies
        appearing if the web app was installed to the root.  Thanks
        to Florian for finding this!

2008-09-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-8
        
        * [JSPWIKI-373] Fixed issue with sign button giving a fixed date.
        Unfortunately the format is fixed.  Thanks to Stefan Bohn for 
        a fix.

2008-09-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-7
        
        * [JSPWIKI-379] TranslateTag now properly does a deep
        clone of the WikiContext, so that you no longer can get
        ACLs instantiated just by previewing a page.
        
2008-09-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-6
        
        * [JSPWIKI-231] Brought Italian and Chinese translations up to
        par.
        
        * Added Chinese corepages, thanks to David Gao.

2008-09-18  Harry Metske <harry.metske@gmail.com>

        * 2.8.0-beta-5  JSPWIKI-231: update the latest de localisation, patch from Florian

2008-09-18  Harry Metske <harry.metske@gmail.com>

        * 2.8.0-beta-4  JSPWIKI-263: DOC change to the README file
        
2008-09-18  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-3
        
        * One lonely Javadoc tweak.

2008-09-18  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-2
        
        * Fixed the failing unit tests for PageRenamer.
        
2008-09-05  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-1

2008-09-03 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-37
        
        * [JSPWIKI-369] SneakPreview was broken when no SectionEdit was turned off.

        * [JSPWIKI-370] Remove 'vertical-align' css rule to prevent printing errors,
        as reported by Terry Steichen.
        
        * Few small fixes on the Accordion style.
 
2008-09-02  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * Updated spanish translation (CoreResources_es + default_es properties)
        
2008-08-31  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-36
        
        * [JSPWIKI-366]: changenote was lost in commenting previews. Also, FCK
        was not showing the changenote field.
        
2008-08-31  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-35
        
        * JSPWIKI-364:  Info tab presents null string to user (reported by Florian)
        
2008-08-31  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-34
        
        * Commenting now uses the changenote field properly (and we got rid
        of the "Comment by XXX" -functionality.  Therefore, "comment.by" i18n field
        is now unused.
        
        * Renaming now uses symbols instead of English text to put in the changenote
        field.
        
2008-08-30  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-33
        
        * JSPWIKI-231: update the latest de localisation patch from Florian
        and quite a few corrections to the nl localisation
        
        * Found during debugging that Lucene Indexer was using a bit 
        agressive interval of 1 second for Emptying index queue, lowered to 5 seconds
        Combined with a few textual corrections in WikiBackgroundThread 

2008-08-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-32
        
        * JSPWIKI-27: ReferenceManager was not serializing properly when there
        was no page metadata, therefore inadvertently loading old data whenever
        the wiki was restarted. 
        
        * JSPWIKI-333: Thanks to Florian's patch, this annoying language selection
        thing should now be fixed.
        
        * Fixed Finnish localization.
        
        * The suggestion box no longer keeps suggesting wikipages if you start
        inserting a plugin or a variable.
        
        * JSPWIKI-354: Fixed issue with fallback to default template not working.
        
2008-08-30 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-31
        
        * [JSPWIKI-346] Rename errors are now displayed inside a page-info in screen,
        above the rename section.  Some localization updates are needed.

        New resource:
            prefs.errorprefix.rename=Could not rename the page:&nbsp;

        And the CoreResources rename.* items are updated to remove the text
        "Click "back" on your browser and change the new name.".
        (done for default and .nl properties)

        * [JSPWIKI-289] The edit SuggestionMenu (plain editor only) now also allows 
        to enter a '/' to get a list of attachment links. Moreover, when you open a new link with 
        a '[', by default jspwiki displays the list of attachments of the current page.
 

2008-08-25 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-30 

        * [JSPWIKI-329] Pagination link for All-entries fixed. Added comments to
        InfoContent.jsp to clear-out obscure pagination counting logic.
 
        * [JSPWIKI-357], [JSPWIKI-358] Wrong section counting when a page contains a TOC.

        * [JSPWIKI-359] Popup when editing page from Quick Navigation Field should only
        appear when no pagename was entered in input field.
        

2008-08-24  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-29

        * Changed method signature for UserProfile.get/setUid() to use Strings rather
        than long integers. Test and XML/JDBC UserDatabase implementations changed
        also. This change was made for forward compatibility with JCR storage in  3.0. 

2008-08-24 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-28 

        * [JSPWIKI-355] Fixing section-editing bug reported by Harry.
        
        * Saving user-preferences was broken in PreferencesTab.jsp
        

2008-08-24  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-27
        
        * added my GPG key to KEYS
        
        * minor corrections/additions to UPGRADING
        
        * minor corrections/additions to the selenium readme.txt
        
        * added ${java.home}/../lib/tools.jar to path.tests, set jspwiki.login.throttling=false and some other comments in build.xml
        
        * added firefox-2 browser option (as extra comment) to build.properties
        
        * added new simple ViewPageSource selenium test
        
        * get rid of compile warning in WikiPage and WysiwygEditingRenderer and GroupManager
        
        * compile error in InputValidatorTest
        

2008-08-23 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-26 

        * [JSPWIKI-333] Fixed side-impact in GroupManager due to new 
        InputValidator constructor.  
        

2008-08-23 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-25  Template fixes (mainly section editing)

        * The Section-Editing user preference can now also be set via the
        default_jspwiki.properties. By default the preference is turned off.
        
                jspwiki.defaultprefs.template.sectionediting =on
        
        * Small fix to avoid section-editing [edit] link on table of contents titles.
        
        * [JSPWIKI-350] Section-Editing needs to be suppressed in a comment context.
        
        * The change-note input field is suppressed in a comment context as JSPWiki
        auto-generates the change-note for comments. Also added localization in Comment.jsp
        Added new resource to CoreResources.properties.
        
                comment.by=Comment by {0}
                
        * [JSPWIKI-329] Pagination links on the version history were still not correct
        when number of version equals a multiple of 20. Oops.
        
        * [JSPWIKI-309] Various updates of the OrderedList skin, including section editing.
      

2008-08-23 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-24

        * [JSPWIKI-333] Language selection/deselection was not working correctly
        for some error messages. Refactored the input-validator to use correct locale.


2008-08-20  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-23

        * Changed Stripes test jar to the released 1.5 version (congrats to Tim
        and the team).

2008-08-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-22
        
        * JSPWIKI-27: Managed to duplicate this pesky bug from way old times.
        Looks like this was caused by a misread of the OSCache javadocs -
        but I am not sure if the fix causes new problems.
        
        * JSPWIKI-353: Fixed wrong i18n key in PluginManager which showed
        up if the plugin threw an exception.
        
        * JSPWIKI-352: Fixed a long-standing bug with ACLs being leaked
        from one page to another if the InsertPageTag was used.
        
        * Added a KEYS file to the top-level dir.  It would be a good idea
        if all committers added their current GPG keys to it.
        
2008-08-18  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-21
        
        * [JSPWIKI-349] updated (German) corepages, credits to Florian again
        
2008-08-17  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-20
        
        * [JSPWIKI-340] updated (english) corepages and README, mostly editorial changes, 
           a brief summary :
        - Java 5.0 is now a requirement for compiling (instead 1.4.2)
        - Servlet API 2.2 is mentioned, is this still enough ? (I haven't checked)
        - Removed dead link to tjworld.net/help/kb/0001_iis6-Tomcat5-JK2.html#conConnector
        - Removed links to JSPWiki 2.2 ,  2.3 and 2.4 documentation

2008-08-16  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-19
        
        * JSPWIKI-315: Fixed issues with upper/lowercase filtering in 
        AttachmentManager
        
        * JSPWIKI-325: Patch from Harry to sort out plugin parameters and their 
        javadocs.
        
        * JSPWIKI-307: Pages with & in their names were not being parsed properly 
        in links.

2008-08-15  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-18
        
        * [JSPWIKI-339] added German core pages, many thanks to Florian again !

2008-08-14  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-17
        
        * [JSPWIKI-238] PageRenamer now correctly handles links containing blanks
          Added an additional JUnit test for this, there is stil one failing JUnit test however (attachment handling).
          PageRenamer still needs improvement.
        
2008-08-14  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-16

        * Fixed invalidateSession() method in WikiSession, which was not quite
        fully invalidating sessions.

2008-08-12 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-15

        * [JSPWIKI-334] IE6/IE7 javascript bug causes section editor to crash.
        JS is now running fine, but the Section Overview box still needs some CSS
        fixes. Ongoing.
        Note: Section Editing only works with the plain editor.
        
 
        * [JSPWIKI-337] Missing localization in WorkflowContent.jsp.

2008-08-12  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-14
        
        * [JSPWIKI-231] updated de translation, thanks to Florian
        
        * fix for  [JSPWIKI-300] required some extra changes to the JUnit test for the TableOfContents Plugin

2008-08-12 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-13

        * [JSPWIKI-329] Pagination link was still not correct for the block 21-40.
        Amazing catch from Harry and Florian - txs !
 
 
2008-08-12  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-12

        * Refactored TestEngine so that MockRountrips and other heavier sessions are
        lazily initialized. Also added a property to AuthenticationManager that allows
        login throttling to be switched off (for example, during unit tests). The
        effect of these two changes cuts unit test times [on my machine] from 25 minutes
        down to about 4.5.

        * Removed reference to Stripes MockServletContext in WebContainerAuthorizer.
        It should not have been there.

2008-08-11 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-11 - various smaller fixes in the default template

        * [JSPWIKI-302] Added the clone function to FCK.jsp. 
        Also added permission checking on the inclusion of the cloned-page.

        * [JSPWIKI-307] Redirection from UserPreferences.jsp doesn't work if "&" is included 
        in the original page name. 

        * [JSPWIKI-300] You can now also add a TableOfContents to your the LeftMenu (or Footer or ...) 
        Although a table of contents is only rendered once on a page; multiple invocations of 
        the plugin will now render an in-page link (#section-TOC) instead of a plain useless text.

        * [JSPWIKI-306] Rendering of rounded corners has been fixed. 
        However, the skin "PlainVanilla 1024x768" has been updated not to use the rounder-corners style anymore.
        This style is not considered part of core jspwiki. (will probably be removed in the future) 
        You can still use it for now (or reactivate it in the skin.js file of the skin)

        * Fixed the Left/Right orientation of Favorites block (with Left Menu) 
        for the Edit and Attachment Upload screens.

        * Made some final fixes and improvements to the SECTION editing feature. 
        It has now become a user-preference, which is by default off. (this preference is only 
        compatible with the plain editor) With section-editing on, you will get [edit] links 
        at each header which allows you to directly edit a particular section of a page. 
        In edting mode, a section overview box is shown in the left-menu allowing to switch 
        between various page section or look at the whole page.
        
        New localisation resources:
          javascript.sectionediting.label=Section Overview
          prefs.user.sectionediting=Section Editing
          prefs.user.sectionediting.text=Enable section editing via ...

        * Some minor improvements on the Accordion style to improve consistent look & feel. 
        Now also the accordion toggles show a blue +/- icon to indicate clickable regions. 
        Also added a %%leftAccordion and %%rightAccordion style, similar to book-tabs.

        * [JSPWIKI-329] the consistency and correctness of the pagination links has been improved
        in the Page Info screens. Now every block (also the first 1..20) show 20 items; 
        the link titles also match with the presented block. 
        The page size are now represented in kB, similar as attachment sizes.
        

2008-08-11 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-10

        * [JSPWIKI-333] Language cookie is now set to default browser setting 
        when initializing the Preferences. Previously this was not required as long as the  
        user preferences were not modified by the user. Don't know why this stopped working.
        

2008-08-11  Harry Metske <harry.metske@gmail.com>

		* no version bump
        
        * JSPWIKI-319: added extra checking on Attchment Change Notes

2008-08-10  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-9
        
        * JSPWIKI-320: removed all httpRequest.setCharacterEncoding() calls (except in WikiServletFilter)
        because they were called too late, reported by Clay Atkins
        
2008-08-06  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-8
        
        * JSPWIKI-316: fixed SecurityConfig.jsp so that it compiles, and added
        some sensible checks for the new JAAS scheme.

        * Fixed NPE in RSSImageLinkTag, which erroneously assumes that RSSGenerator
        is always available. However, it might not be if RSS feeds are disabled.
        
        * Fixed broken Ant 'war-tomcat' target.

2008-08-03  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-7

		* JSPWiki-231: added Italian localisation, thanks to Luca Gilardoni
		
		* changed the schemaLocation in web.xml, reported by Thomas van der Pol
        
2008-08-01  Harry Metske <harry.metske@gmail.com>

		* no version bump
        
        * JSPWIKI-321: remove unmappable chars from 4 sources (causing warnings during build)

        * JSPWIKI-312: small patch to build.xml, quotes around arguments of compressjs,
          reported by Florian Holeczek.

2008-07-31  Harry Metske <harry.metske@gmail.com>

		* no version bump
        
        * JSPWIKI-317: Fixed InvalidDiff in ExternalDiffProvider, thanks to Jan Spitalnik.

2008-07-31  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-6

        * JSPWIKI-326: Fixed NPE in ProfanityFilter.

2008-07-16  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-5
        
        * JSPWIKI-315: added extra checks to AttachmentServlet.
        
2008-07-10  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-4
        
        * Fixed a number of failing unit tests, and also included
        Creole tests.

2008-07-03  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-3

        * Added top-level text document UPGRADING which summarizes
        considerations for upgrading from 2.4 and 2.6. This needs more
        work, especially from the web-tier crew (Dirk et al).
        
        * Made most of the workflow package, except for the
        set/getAttributes methods in the Workflow class, serializable. In the 3.0
        timeframe, the rest of the package will be made serializable, too.
        
        * Added Ant target 'api-diff' which allows arbitrary diffing against
        previous JSPWiki.jar artifacts. It prints a nicely formatted HTML page
        describing public API differences. The report file is
        tests/reports/API-changes.html.
        
        * Upgraded Stripes jar (used in test cases) to 1.5-RC1.

2008-07-02  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-2.  Yes, the last version number was an 
        anxious mistake.  It's really 2.7 alpha, not 2.8 alpha.
        
        * JSPWIKI-61: Added patch from David Au to add FCK 2.6.1
        support.  Please see the following page to enable it:
        
        http://www.jspwiki.org/wiki/HowToManuallyIntegrateFCKEditor

2008-06-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-alpha-1

        * 2.7.0-svn-52
        
        * JSPWIKI-299: Deleting an attachment from a page which
        had been recently renamed caused an NPE.  Reported by Harry
        Metske.

2008-06-29  Janne Jalkanen <jalkanen@apache.org>

        * Moved all pages from wikipages under wikipages/en, and
        tweaked the build process accordingly.  Also created a basic
        Finnish translation of the CorePages.  The build process
        now creates jspwiki_corepages_en.zip and _fi.zip.

2008-06-19  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-51
        
        * JSPWIKI-231: Updated de i18n.
        
2008-06-25 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-50

        * [JSPWIKI-295] Sub tabs on the Admin.jsp didn't work because the
        corresponding tag ID's were containing dot's.
        
2008-06-22 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-49

        * [JSPWIKI-141] I18 properties also fixed in EditGroupContent.jsp
        
        * Included latest favicon.ico of Florian and Harry

2008-06-19  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-48
        
        * WikiWizard removed due to it being LGPL.  The following files
        were removed
           * webdocs/applets/wikiwizard.jar
           * webdocs/applets/WiWi-INF/
           * webdocs/scripts/jspwiki-wikiwizard.js
           * src/com/ecyrd/jspwiki/ui/admin/beans/WikiWizardAdminBean  
           
        * [JSPWIKI-231]: Updated de, zh_CN and nl.  Thanks to Florian
        Holeczek, Harry Metske and David Gao!
        
2008-06-19 Dirk Frederickx <dirk.frederickx@gmail.com>

        * No version bump

        * [JSPWIKI-295] Fixed Tabs in Admin.jsp

2008-06-19  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-47
        
        * Added support for the Universal Edit Button - 
        universaleditbutton.org.  About 3 mins before launch, even...

2008-06-17 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-46 

        * [JSPWIKI-293] added editor.plain.sneakpreview.title resource

        * [JSPWIKI-294] Faulty i18n in editor toolbar
        
        * [JSPWIKI-280] Scroll bar problem in IE7
        
2008-06-15  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-45
        
        * JSPWIKI-208: RSS images are now hidden if RSS is disabled.
        
        * Moved "info.rsspagefeed.title" key from default.properties
        to CoreResources and renamed to "rss.title".

        * Updated Finnish translation.
        
        * JSPWIKI-231: Updated Dutch and German translations.

2008-06-15 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-44 
        
        * Small fixes to plain.jsp to increase ie6 compatibilty.
        Hide the 'tab-completion' and 'smart typing pairs' from IE browsers.

        Added the i18n resource 
           editor.plain.toobar=Toolbar

        * Several IE7 fixes of the category and suggestion popup css.

        * Change the attachement icon to .gif (iso png), so it gets properly rendered on ie6.
        Added a transparent .ico file. (thanks Harry)

2008-06-14  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-43
        
        * JSPWIKI-145: jspwiki.applicationName is now cleaned to be a
        proper WikiName.  This is probably a good idea...
        
2008-06-14  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-42
        
        * JSPWIKI-185: There should be no more NPEs upon startup.  Improved
        logging as well as added a few null checks.
        
        * Fix: It was impossible to add new users due to an overzealous null check
        in XMLUserDatabase.
        
        * Improved our notification in case you have not yet installed JSPWiki.  Incidentally,
        we're using baseURL to check whether the install process is done, and because of this,
        setting baseURL becomes mandatory.
        
        * JSPWIKI-246: All new (and faster) IndexPlugin as the old one couldn't be
        converted to Apache.
        
        * Updated Finnish translation.
        
        * Added etc/ini/default_jspwiki.properties to hold all sorts of stuff that
        you normally want to enable in jspwiki.properties, but most people don't
        really want to touch.
        
        * JSPWIKI-57: Should resolve NotSerializableExceptions when container
        goes up or down.
        
        * JSPWIKI-292: Comment.jsp didn't compile.  Oops!  Thanks to Harry Metske
        for the patch.
        
2008-06-14 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-41  Many template fixes, added ajaxed edit preview, improved IE6/IE7 compat.
        
        * Fixed [JSPWIKI-275] Incoming and Outgoing link box doesn't work properly anymore. 
        
        * Several fixes of section edit: [JSPWIKI-235], [JSPWIKI-209]

        * [JSPWIKI-278] highlight search queries was handled badly when PRE sections 
        contained HTML elements.

        * [JSPWIKI-280] IE7 had the same scroll bar problem as previously with IE6.  
        Added IE7 specific CSS selector to support IE7. 

        * Fixed [JSPWIKI-259] IE rendering bug for nested collapsable boxes in IE7
        
        * [JSPWIKI-269] Improved handling of collapsible lists, even when a template 
        would not use TabbedSections. The handling of dynamic styles was refactored 
        to make them less intrusive.

        * Fixed [JSPWIKi-285]  Groups.jsp has unterminated string constant.
        Delete resource (not used anymore):
        #group.areyousure=....


        * An AJAX driven sneak-preview has been added to the plain editor. (by default off)
        The user can have immediate feedback of how the wiki-markup is rendered by means of 
        a preview box just below the editor textarea. The preview section is refreshed whenever 
        the user clicks outside the textarea.
        
        * The handling of the plain editor suggestion popup is now also working on IE. 
        Put the mouse inside a [wiki-link] to see the automatic expansion; 
        select a item of the suggestion list and click to insert the link in the editor textarea.
        This also works for attachement links. See [JSPWIKI-289] 

        Update i18n resources:
        #editor.plain.editassist=Edit Assist
        #editor.plain.editassist.title=Toggle Edit Assist buttons
        editor.plain.sneakpreview=Sneak Preview

        * The rendering of popup boxes for e.g. link-suggestion-box, %%tips, %%category. has been improved.

        * Frequently used icons merged in single 'strip' gifs to improve download speed.

        * Refactored 'jspwiki-common.js', which now only contains the core javascript. (8K compressed)
        The additional dynamic styles have been moved to 'jspwiki-commonstyles.js'. (12K compressed) 

        * Clean up of OrderList and Smart skin.   
        
        * Added a few default.nl.properties updates (eg [JSPWIKI-206])


2008-06-13  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-40
        
        * Removed TestHttpServletRequest, TestHttpServletResponse,
        TestHttpSession, TestFilterChain, TestFilterConfig,
        TestServletContext in favor of the much-superior Stripes
        mock objects. TestEngine was retrofitted with the Stripes
        mocks and all unit tests were also changed. In particular,
        take note of the TestEngine.newHttpRequest() factory method,
        which should be used to create test request objects.
        
        * Trimmed some unncessary web unit test classes that were
        left behind as crutches in case Selenium didn't work out. 
        
        * Upgraded Selenium-RC jars to 1.0-beta1. Selenium still
        does not work with FireFox 3, unfortunately. :(
        
2008-06-12  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-39
        
        * JSPWIKI-191: Favorites.jsp no longer leaks LeftMenu contents
        to unauthorized viewers in UserPreferences.jsp.  Thanks to
        Sergio Gelato.
        
        * JSPWIKI-253: VotePlugin and Vote.jsp are now gone, as they
        were pretty much useless.
        
        * JSPWIKI-206: A no-results search could also fail due to 
        missing permissions.  Updated default.properties / find.noresult
        i18n key to explain better.  Finnish and English updated.
        
2008-06-11  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-38
        
        * Web unit tests refactored (yet again) to use an embedded
        Jetty server. This replaces the need to use a separate Tomcat
        server, and *should* always work without any configuration of
        any kind. Please tests this via the Ant 'webtests' target!
        Note that this checkin introduces the TestContainer class, which
        with a little modification (later, please!) could easily be
        used as a stand-alone server. Refactorings are welcome; in
        the meantime, TestContainer should be considered volatile.
        Note also that the Rename Profile web unit tests for the
        container scenarios currently fails; all others run successfully.
        
        * Minor tightening of Map API for Serializer methods; the
        keys are now Strings rather than Serializable. This is a
        dev branch, remember!
        
        * Added Stripes jar in preparation for replacement of
        TestRequest/Response mock objects.

2008-06-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-37
        
        * JSPWIKI-290: ReferenceManager was not updating the page
        references correctly after a rename.  Fix by Harry Metske.
        
        * Fixed also a number of miscallaneous FindBugs issues.

2008-06-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-36
        
        * JSPWIKI-14: checkPermissions code in MetaWeblogHandler is now
        functional.
        
        * JSPWIKI-228: Added patch from Alexander Chow to fix a problem
        where multiple headings with the same text were producing illegal
        XML through duplicated ID attributes.
        
        * JSPWIKI-274: Was fixed already in svn-31.
        
        * JSPWIKI-286: Fixed a couple of typos in Finnish localization.
        
        * JSPWIKI-285: Group.jsp had a wrong quote char in English,
        Dutch and German translations.

2008-06-08  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-35
        
        * JSPWIKI-283: Ooops.  Copy != Cut.
        
2008-06-07  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-34
        
        * JSPWIKI-265: All referrer changes (according to unit tests anyway)
        work now.
        
        * JSPWIKI-30 should now also be resolved.
        
        * JSPWIKI-27: I have a suspicion that implementing WikiPage.equals()
        has caused some interesting issues with attributes being leaked from
        old versions.  Removed equals() for now.
        
        * Some JSPWikiMarkupParser speed optimizations by changing all
        StringBuffers to StringBuilders.

2008-06-07 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-33
        
        * Added favicon.ico, and updated the jspwiki.properties to support *.ico

2008-06-01  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-32

        * Password hashes were generated in platform native encoding
        instead of UTF-8.  Oops.
        
        * In general, there have been massive upgrades of Javadocs.

2008-05-31  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-31
        
        * Oops, wrong regexp: AttachmentServlet now *really* cleans up
        the filename.
        
        * Added some sanity checks to hopefully address an issue that
        Jim Willeke was having with the parser crashing at odd places. 

2008-05-29  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-30
        
        * AttachmentServlet now cleans the uploaded file name, since some
        browsers send the full path as well.
        
2008-05-22  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-29
        
        * Checked in three new features for UserProfile and the UserDatabase
        classes. First, profiles can now store arbitrary Serializable objects
        via a new method in UserProfile, getAttributes, that returns a
        Map<Serializable,Serializable> that can be directly manipulated.
        Arbitrary attributes such as user preferences can be added to the
        profile and be guaranteed to be persisted on save. Second, the
        UserProfile now has two methods setLockExpiry(Date)/getLockExpiry
        that allow callers to disable user profiles. These are NOT enforced
        in AuthenticationManager yet. Third, user profile now have a 'uid'
        field that stores a long value for uniquely identifying users.
        Existing profiles without UIDs are automatically upgraded when
        they are loaded by a findBy___() method. The default XML/JDBC
        UserDatabase implementations have been enhanced to support all
        of these new features. If you have custom UserDatabase
        implementations, you should take a look at the new code.
        
        * Miscellaneous and varied Java 5 enhancements (such as for-loops).

2008-05-22 Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.7.0-svn-28
        
        * [JSPWIKI-25].  Creating empty pages should not be possible (default
        behaviour). Can be changed by setting jspwiki.allowCreationOfEmptyPages
        to true in jspwiki.properties.
        
        * <i18n-create-template> target in build.xml was creating a wrong i18n 
        directory structure.

2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-27
        
        * [JSPWIKI-44].  AuthenticationManager now remembers the last logins
        and slows down repeated access attempts, to a maximum of 20 seconds.

2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-26

        * [JSPWIKI-236]: Fixed localization for the different login/edit
        help pages missing.    
        
        * [JSPWIKI-170]: Fixed a few places where the author was appearing
        as "unknown".
        
        Added new i18n key in CoreResources, updated English and Finnish:
        
           * common.unknownauthor
           
        * [JSPWIKI-151]: If sending a password succeeds, it is no longer reported
        as an error.
        
2008-05-18  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-25
        
        * Temporary remove hideable favorites menu as it is incompatible with FCK.
        Final fix to commit later.  The FCK-Editor is now again fully working.
        (Reported by Florian Holeczek)  JSPWIKI-209
        
        * Fixing various IE7 incompatibilities (jspwiki.css)
        Reported by Gavin Goldsmith. 
        

2008-05-14  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-24

        * [JSPWIKI-20] Passwords are now salted and hashed per RFC 2307.
        Every password is salted with a 8-byte random salt.

        * The sort-of-secret "share container user accounts with
        JDBCUserDatabase" option has been permanently removed, and
        will not be replaced. This was previously added to make it easier
        for users to add themselves to JDBC-based container realms.
        However, the switch to salted passwords precludes the continued
        use of this option. So it's gone and won't come back.

        * Added a new class CryptoUtil that allows admins to generate
        SSHA password hashes (and verify an existing password given
        a supplied hash) at the command line. See the Javadoc
        for com.ecyrd.jspwiki.util.CryptoUtil for details.

2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-23
        
        * [JSPWIKI-265] Referrers are now changed, though the
        functionality is still a bit broken in places.
        
2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-22
        
        * [JSPWIKI-260] ReferringPagesPlugin now creates the "more"
        link URL properly.  This also impacts the localization of
        the "referringpagesplugin.more" in PluginResources.
        
        * Moved plugin resources from etc/i18n/com/ecyrd/jspwiki/plugin 
        to etc/i18n/plugin.  Can't remember who suggested this.  Also
        cleaned build.xml to make sure the plugin files are created
        properly.  Can't remember who suggested this, neither can
        I seem to find the JIRA issue...
        
        * [JSPWIKI-224] TranslatorReader now is just a proxy to the
        JSPWikiMarkupParser.  It will be finally gone in 3.0.
        
        * [JSPWIKI-183] PageRenamer no longer chokes if attachments
        are turned off.  Reported by Luca Gilardoni.
        
        * [JSPWIKI-234] Added ISO8601 time formats to default patterns.
        
2008-05-10  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-21
        
        * Logincookies are now written with UTF-8 instead of platform
        default encoding.  This should fix issues with users with non-ASCII
        chars sometimes having the wrong UID when their session expires.

2008-05-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-20
        
        * [JSPWIKI-251]: Removed the old com.ecyrd.jspwiki.PageRenamer
        and replaced it with com.ecyrd.jspwiki.content.PageRenamer, which
        is fully Apache-licensed.
        
        Unfortunately, the new PageRenamer does not support changing
        referring pages yet, error messages are not localized properly,
        etc.  So this is a considerable functionality downgrade until
        we can get a better version made.  Patches gladly accepted!

2008-05-06  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-19
        
        * [JSPWIKI-50] Improved performance of RecentChangesPlugin by 
        adding better caching to the CachingAttachmentProvider.  Thanks
        to Harry Metske!

2008-05-05  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-18

        * [JSPWIKI-239] jspwiki.cookieAuthorization.expiry is now called
        jspwiki.cookieAuthentication.expiry, because that is correct.  Thanks
        to Florian!

        * 2.7.0-svn-17
        
        * Removed JUG UUID generation libraries to favour the Java
        built-in ones.
        
2008-04-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-16
        
        * Moved the rest of the PluginResources class into etc/i18n, as
        their old place was confusing people.
        
        * [JSPWIKI-243], [JSPWIKI-244], [JSPWIKI-242], [JSPWIKI-241] Fixed
        a number of issues with plugins not using the proper date/time from
        the locale/preferences.
        
        * [JSPWIKI-245] Removed PluginResources / common.dateformat, and
        created three new time/date format resources in CoreResources:
           * common.dateformat
           * common.timeformat
           * common.datetimeformat

        * 2.7.0-svn-15
        
        * [JSPWIKI-5] FileSystemProvider now properly mangles names of pages which
        start with a dot.  This is done in a fully backwards compatible manner,
        so no changes to the repo is needed.
        
        * [JSPWIKI-100] Added two new parameters to ReferringPagesPlugin,
        UnusedPagesPlugin, ReferredPagesPlugin, and UndefinedPagesPlugin:
        show and showLastModified.  Thanks to Harry Metske for the patch!

        * 2.7.0-svn-14
        
        * [JSPWIKI-165] Patch from Tomasz Szymko to help in nested bullet lists.
        
        * Also updated several files to the Apache license.

2008-04-15 Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.7.0-svn-13
        
        * [JSPWIKI-178] Patch from Jorge Ferrer to keep the order of search (WEB-INF
        then classpath then file system) of filters.xml.
        
        * [JSPWIKI-231] Updated es translation and applied patches from Florian 
        Holeczek (de translation) and Harry Metske (nl translation).
        
        * ProfanityFilter minor improvement: profanities are read from a file 
        instead of being hard-coded strings.

2008-04-13  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-12
        
        * [JSPWIKI-10] Patch from Harry Metske to make sure 
        VersioningFileProvider and AbstractFileProvider check for
        proper permissions.

2008-04-12  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-11
        
        * Improved restart time at the expense of more disk being
        used and the first startup taking a bit longer.
        
        * Acl implementation, permissions and our Principals now
        implement Serializable.  It could be used to improve startup
        time even further, but it will be useful for the future.
        
2008-04-10  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-10 - Javascript fixes for IE
        
        * [JSPWIKI-235] Bugfixes for Section edit handling in IE
        
        * Bugfixes for hide/show Favorites menu on mouse-click/hover.
        

2008-04-09  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-9
        
        * [JSPWIKI-233] Bugfix PreferencesTab.jsp

        * [JSPWIKI-232] Localization of (All) in the Edit Section dropdown.
        Also added localization to the language dropdown

        * [JSPWIKI-234] Added IS8601 date/time pattern to default prefs in JSPWiki.properties

        * Bugfix IE javascript crash on mouse-over handler

2008-04-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-8
        
        * [JSPWIKI-115]: Refactored VariableManager to use Reflection.
        Thanks to Stephen Solka.
        
        * [JSPWIKI-219]: Building now works if your username has a space.
        
        * [JSPWIKI-222]: Gone are the evil files which lurked into our
        distro file...  
        
        * Hacking attempts at manipulating the version parameter no longer 
        cause a slew of email to the admin...

2008-04-08  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-7
        
        * [JSPWIKI-56] Replaced MultiPartLibrary with Apache Commons
        FileUpload library, as MultiPartLibrary was LGPL.

2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-6
        
        * [JSPWIKI-233] Bugfix PreferencesTab.jsp
        
2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-5
        
        * [JSPWIKI-230] Make TimeZone configuration more user-friendly. Adjusted all jsp time-formatting
        to take timezone setting into account. 
        
2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * Commit related JIRA id's
        
2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-4
        
        * Refactored JS to support the Edit Suggestion box, so it's now fully based on mootools.
        The entries in the suggestion box are now clickable: the page or attachment link will be
        inserted in the textarea. Also the handling of the | bar inside a link has been improved.

        * [JSPWiki-200] The length of the entries in the Edit Suggestion are truncated to avoid
        overlap with the main body of the edit area.

        * The build script has been updated to use the YUI compressor. It now compresses both 
        javascript and css files. (this replaces the Dojo compressor, which only handled js)
 
        * In the UserPreferences you can now select the preferred language. 
        The default language is based on the user's browsers setting, but a dropdown allows you to 
        select any of the installed languages.
        The PreferencesTab.jsp has been refactored, with help of Juan Pablo Santos Rodriguez.
        All java handling has been moved to TemplateManager.java and Preferences.java.
        
        New i18n resources (already added for .en and .nl) 
            prefs.user.language=Select Language
            prefs.user.timezone.server=[SERVER]
            prefs.user.language.default=[DEFAULT]

        * Added an are-you-sure prompt to the UserPreferences.jsp when leaving the page without saving.

            javascript.prefs.areyousure=Without clicking the Save User Preferences button, \
                 your changes will be lost. Are you sure you want to exit this page?

        * [JSPWIKI-226] "View Page Source" now also displays 'non-latest' page versions

        * Suppress the 'ViewPageSource' in the more menu when the page doesn't exist yet.

        Added missing i18n resource
            actions.rawpage.title=View Page Source

        * Improved the implementation of the 'more menu' to resolve the intermediate screen glitch. 
        When javascript is off, the more menu will now be displayed at the top of the Favorites block,
        when javascript is on, the more menu becomes a mouse-hovered drop-down.
        

        * In the user-preferences, you can position the favorites menu Left or Right.
        Now it is also possible to make the Favorites menu hidden, allowing the body of the page
        to fith the full with of the screen. This should benefit narrow (mobile) devices.
        The favorites menu is still reachable via a mouse-hovered menu.

        Added i18n resources:
             javascript.favs.show="Click to show Favorites"
             javascript.favs.hide="Click to hide Favorites"

        * The javascript initialization parameters have been changed to XHTML META tabs 
        to reduce xss vulnerability. (commonheader.jsp)
        Now username's with embedded single quotes do not crash the js anymore.

        * [JSPWIKI-209] Section editing has been added. (feature original in the BrushedTemplate)
        When a page is editable, each section header gets an additional [edit] label.
        In edit mode, a section drop-down has been added which allows to filter the text-area to the
        section of interest.

        Added i18n resources:
              javascript.quick.edit=[Edit]
              javascript.quick.edit.title=Edit section: {0}
              edit.sections=Sections

        * [JSPWIKI-193] Flawed login.loginhelpmissing text in en, de, nl locales. 
        Fixed for .en, .nl, .de was already fixed. 


2008-03-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-3
        
        * [JSPWIKI-225] Added patch from Harry Metske to fix a problem
        with password not being shown during installation.
        
        * [JSPWIKI-227] Added patch from Harry Metske to fix problem
        with installation translation in English and Dutch.
        
        * [JSPWIKI-203] Counter plugin now supports both hiding results
        as well as "start" and "increment" options.  Patch mostly from
        Harry Metske.
        
2008-03-31  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-2

        * Changed Ant build script to use 1.5 sources and targets.

        * Re-factored the authentication subsystem to remove the need
        for JAAS configuration files. WEB-INF/jspwiki.jaas goes away,
        as does the need for PolicyLoader. Also, responsibilities for web
        authentication move to WikiServletFilter. Authentication is now
        configured via jspwiki.properties -- see that file for details.
        WikiSession API change: getLoginContext() vanishes.

        * The auth.login.*LoginModule classes are mildly re-factored to
        remove any need to have knowledge of how to (or why) to inject
        JSPWiki Role principals. Responsibility for injecting Roles moves
        to WikiSession. JSPWiki can use ANY LoginModule for custom
        authentication now.

        * To support the auth refactoring, we introduce several *temporary*
        new servlet mock objects for unit testing: TestFilterChain, TestFilterConfig,
        TestHttpServletResponse, and TestServletContext. These are "temporary" 
        because they will be replaced by Stripes mock objects later in the
        2.7 release cycle.

2008-03-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-1
        
        * Removed JDK 1.4 dependency in AdminBeanManager.
        
        * Switched copyright in Release.java to ASF.  Please use
        this file as your reference when changing the boilerplate.

2008-03-29  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2

2008-03-19  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-rc-4

        * Fixed failing Selenium web unit tests so that they run correctly,
        with two exceptions. See tests/etc/selenium/readme.txt; this file
        includes a few notes on how to write Selenium tests so that they
        will run automatically via the Ant "webtests" target.

2008-03-18  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.6.2-rc-3
        
        * [JSPWIKI-214].  Table with id asirra_KnobsTable had two unlocalized 
        strings, added to CoreResources.properties. Detected by Florian Holeczek. 
        
        * [JSPWIKI-215].  Added patches to en, nl, fi and es translations to fix
        a case where HTML markup was being shown.   Detected by Florian Holeczek.
        
        * [JSPWIKI-210].  Updated German localization (still thanks to Florian!)
        
2008-03-16  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-rc-2
        
        * Updated Dutch localization, courtesy of Harry Metske.
        
        * 2.6.2-rc-1
        
        * Updated Finnish localization.

2008-03-14  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.6.2-svn-7
        
        * [JSPWIKI-93] and [JSPWIKI-160]. Cleaned up corepages.   
        
        * i18n of Captcha.jsp & Install.jsp, added 50 new items to 
        CoreResources.properties. 
        
2008-03-13  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-svn-6
        
        * [JSPWIKI-162].  Attachments can no longer created if the parent
        page does not exist.
        
        * Fixes issue with renaming a non-existant page would destroy the Main
        page.
        
        * [JSPWIKI-188].  Added patch from Florian Holeczek to improve
        logging of MailUtil.
        
        * [JSPWIKI-189].  Added a patch from Florian to improve configurability
        of MailUtil.

2008-03-08  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-svn-5
        
        * Tweaks to Javadoc so that they build cleanly. No functionality changes.

2008-03-08  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-svn-4
        
        * [JSPWIKI-154].  Removed double entries from CoreResources and made
        sure everyone uses it.
        
        * [JSPWIKI-201].  Added simplified Chinese from David Gao.  Thanks!
        
        * [JSPWIKI-161].  Added TranslationCheck from Florian Holeczek.  Removed
        the MissingTranslations tool, as TranslationCheck does all it did.

2008-3-01  Dirk Frederickx <dirk.frederickx@gmail.com>

        * Minor stylesheet updates (no version bump)
        
        * Leading digits for ordered lists were cut off because padding value was too small.
        (detected by Florian Holeczek)
 
        * Long headings which break into two or more lines had insufficient line-height, so
        they were "squeezed into one another"  (detected by Florian Holeczek)
               

2008-2-24  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-svn-3
        
        * Reverted the JSP changes from my last commit so that existing 2.6 deployments
        don't need to reconfigure web.xml. That commit removed the fmt:setBundle tag
        because of the addition of a servlet config parameter in web.xml. The web.xml
        modifications remain, however, so that any new JSPs won't need to use setBundle.
        For 2.8, we will remove the setBundle tags entirely.

2008-2-24  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-svn-2

        * [JSPWIKI-195]: Superfluous WEB-INF/i18n directory created during war build.
        Also, several unneeded JARs were also being included.

        * Eliminated the need to hard-code <fmr:setBundle> tags in JSPs by setting
        the web.xml <comtext-param> javax.servlet.jsp.jstl.fmt.localizationContext
        so that it points to templates.default. Removed the setBundle tags from
        all JSPs.

2008-02-10  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-svn-1
        
        * [JSPWIKI-171]: Patch for FCK editor and comment problem from
        David Au.
        
        * [JSPWIKI-169]: Fix to allow mail sender from JNDI in addition
        to property file.  Thanks to Dave Wolf.
        
        * [JSPWIKI-177]: Completely overhauled German translation, thanks
        to Florian Holeczek.

2008-02-10  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1 release.

2008-02-03 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-rc-4

        * Dozens of localization fixes for nl [JSPWiki-176] Excellent review by Harry Metske. 
        Many Thanks!
        
2008-02-03 Dirk Frederickx (dirk.frederickx@gmail.com)

        * Small fixes on Dutch localization (nl)  No version update
        
        
2008-02-02 Dirk Frederickx (dirk.frederickx@gmail.com)

        * Added DUTCH localization (nl)
        

2008-02-02  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-rc-3
        
        * [JSPWIKI-123]: Added German date formats to jspwiki.properties, thanks
        to Florian Holeczek
        
        * [JSPWIKI-173]: Oops, we had a detection routine for illegal XML chars,
        but unfortunately it was outputting the same illegal chars to the as an
        error...

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1-rc-2

        * Changed default tests/etc/groupdatabase.xml and tests/etc/userdatabase.xml
        so that they use the platform-independent date formats for creation/modification
        datestamps. Also, fixed a bug in XMLUserDatabase that caused "old" date formats
        to not be converted on startup. Thanks to Harry Metske for reporting this issue.

        * Tiny tweak to Eclipse classpath so that class files are put in build/ and tests/build. 

2008-01-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-rc-1
        
        * [JSPWIKI-166]: Added a default mail sender to ward off an evil NPE.  
        I have a suspicion that things still don't work as documented, but 
        at least there is no NPE anymore.

2008-01-27 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-11

        * [JSPWiki-137] : Toggle workflow details now also works on FF
        
        * [JSPWiki-123] : The set of user-preference timeformats added to 
        jspwiki.properties.tmpl iso jspwiki.properties.

        
2008-01-26 Dirk Frederickx (dirk.frederickx@gmail.com)

        * [JSPWiki-147] : Slimbox labels were forgotten. (credit Tomasz Szymko)
        Added a new item to default.properties:

            javascript.slimbox.close=Close &#215;
            javascript.slimbox.close.title=Close [Esc]


2008-01-26  Janne Jalkanen <jalkanen@ecyrd.com>

        * [JSPWIKI-146]: We now properly catch the exceptions generated during
        download to avoid dumb error messages.
        
        * [JSPWIKI-102]: Added patch from Harry Metske to fix JNDI mail sending.
        
        * [JSPWIKI-153]: German translation was still talking about usernames
        upon password recovery.
        
        * [JSPWIKI-157]: CoreResources had strings which were not showing
        up properly, but had HTML entities.  Fixed en, fi, de and es.
        
        * Updated Finnish localization.

2008-01-26 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-10  -- various small i18n issues 

        * [JSPWiki-123] : The set of user-preference timeformats moved to the 
        jspwiki.properties, such that the administrator can easily choose timeformats,
        if needed even localize them.

        * [JSPWiki-137] Toggle details button is now working and i18n'ized in Workflow page
        Added a new item to default.properties:

            workflow.creatUserProfile=New user profile <strong>{2}</strong>

        * [JSPWiki-144] : LoginHelp links to LoginPageHelp in l10n variable
        Added LoginPageHelp to Core wiki pages (copied from jspwiki.org)

        * [JSPWiki-147] : Category title label was not i18N
        Added a new item to default.properties:

            javascript.category.title=Click to show category [{0}] ...

        * [JSPWiki-149] : Edit Group and Delete Group did not fit well in the gui.
        Refactored the EditGroupcontent.jsp and GroupContent.jsp to make the gui more consistent.
  
        * [JSPWIKI-163] Error message when creating a new group to be I18N
        Added a new item to CoreResources.properties:

            newgroup.exists=Group {0} already exists. Try another name.


2008-01-24  Juan Pablo Santos (juanpablo.santos@gmail.com)
        
        * Updated spanish translation with missing entry keys. Switched HTML
        entities to Latin1 equivalent.

2008-01-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-9
        
        * [JSPWIKI-142]: Typo in default.properties.  Thanks to Florian! (And
        probably the fastest bug fix in JSPWiki history...)
        
        * [JSPWIKI-59]: ReferringPagesPlugin would create the wrong "more..."
        link in fi and de localizations.  Fixed and upgraded en and es localizations.

2008-01-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-8

        * Oops, there was a JDK 1.5 dependency in AttachmentServlet.  Fixed,
        should again work on 1.4.
        
        * [JSPWIKI-136]: WorkflowContent.jsp had a couple of untranslated strings;
        updated English and Finnish translations.  Reported by Tomasz Szymko.
        
        * [JSPWIKI-135]: ConflictContent had an untranslated string.  Reported by
        Tomasz Szymko (whose name I am *so* going to misspell one day).
        
        * [JSPWIKI-133]: GroupContent.jsp had an untranslated string.  Reported by
        Tomasz Szymko.
        
        * [JSPWIKI-134]: EditGroupContent.jsp had a couple of untranslated strings.
        Reported by Tomasz Szymko.
        
        * [JSPWIKI-132]: FindContent had an untranslated string.  Reported by
        Tomasz Szymko.
        
        * [JSPWIKI-131]: Changed "authenticated" to "authorized" in all built-in
        localizations.  Thanks to Fabian Haupt for en, de and es.
        
        * [JSPWIKI-114]: Fixed issue with VariableManager not checking the parent
        page for variables in case the InsertPage plugin was used.  Thanks to
        Stephen Solka!
        
        * [JSPWIKI-118]: Fixed issue with FCK editor not saving all metadata.  Thanks
        to David Au for the fix!
        
        New i18n keys in i18n/templates/default.properties:
           * workflow.details
           * workflow.details.title
           * conflict.oops.title
           * find.tab.help
           

2008-01-12 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-7
        
        * [JSPWIKI-128] fixed various issues in the  printing style sheet.
        Validation of IE is pending.

        
2008-01-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-6
        
        * [JSPWIKI-95]: Links to anchors with blanks work now.  This introduces
        a tiny, very tiny compatibility issue with links to headings changing
        case in some cases.  Reported by Jügen Weber.
        
        * [JSPWIKI-125]: FilterManager now checks for version compatibility 
        of PageFilters by looking into the ini/jspwiki_module.xml.  This was a 
        surprisingly big change.  I would very much like to move to annotations
        in 3.0... Reported by Florian Holeczek.

        * [JSPWIKI-124]: Turns out that using de_DE as the language name
        is not a good idea, as it really works only when you define Deutsch (Deutschland)
        as your language - all other German-speaking folks would see Englisch...
        Reported by Goran Karlic.

        * added stress/MassiveRepositoryTest.

2008-01-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * Fixed a number of Eclipse warnings.  No version bump, no
        functionality change.

2008-01-05 Dirk Frederickx (dirk.frederickx@gmail.com)

        * No version bump - small fix of exception in Footer.jsp

2008-01-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-5

        * [JSPWIKI-108]: Fixed EditPageHelp.txt which had an extra pipe char.

        * [JSPWIKI-106]: Password recovery emails are now sent with UTF-8 encoding.

        * [JSPWIKI-113]: Patch from Harry Metske to make sure the JNDI factory is
        only checked once when sending email.

        * [JSPWIKI-119]: URI detector now detects properly ~ and % characters.

2008-01-03 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-4

        * Improving robustness of Wiki.getPageName(url) which was dying on unexpected url formats.


2008-01-02  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-3

        * [JSPWIKI-49] Fixed handling of the Editor choice as part of the user preferences.
        When restarting the browser, also the preferred editor setting is recovered.
        Still 2 properties exist to set the default Editor choice (both are kept for bw compat)
        You can choose either one.
          jspwiki.editor=plain
          jspwiki.defaultprefs.template.editor =plain    (=> preferred)

        * All WEBTESTs are now converted to Selenium. They run manually -- still need to verify
        the automatic run via ant.

        * The MORE dropdown is now also available during Login, UserPreferences and Find screens.
        This makes all common links (stored in MoreMenu) more easily accessible.

        * Minor JS refactorings on handling color for GraphBars and ZebraTables.

        * Minor JS refactorings to better support Category styles for IE.

        * Both JSPWiki logo's (shaded and not-shaded image) have been merged in a single .png
        to resolve image flicker at mouse-hover. (especially on ie)


2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1-cvs-2

        * [JSPWIKI-116] Under certain circumstances, calls to
        UserManager.getUserDatabase() are made before the user database is
        actually initialized, resulting in NPEs. To resolve, we simply replaced
        internal references to m_userDatabase with getUserDatabase(),
        which lazily initializes the database if it has not already happened.

2007-12-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-1

        * Added SpamFilter.isValidUserProfile() and corresponding checks
        to allow also user registrations to be spam-checked.

2007-12-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.0!  Woot!

        * Removed JSPWikiToCreoleTranslator (the class was empty and unused)
        in an effort to clean the code base a bit for release.

        * Added some warnings to CreoleFilter & CreoleToJSPWikiTranslator
        to make sure people understand they are experimental features.  Also
        removed WikiCreole from "new features" list.

        * Fixed a number of failing unit tests for Creole by removing a lot of
        line separator management code.  As far as I can tell, it was all
        unnecessary and by accident didn't fail only on Windows.

        * Improved javadocs, removing a number of Checkstyle errors.

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.0 RC5

        * Checked a new version of web.xml that I inadvertently missed
        in RC3. This resolves [JSPWIKI-92], for real this time. Sorry!

        * Resolved [JSPWIKI-33] by removing all external class dependencies
        in WikiBackgroundThread (other than JSPWiki.jar classes). Also
        changed the default webtests-teardown task in Ant so that web unit
        tests are taken down unless the 'webtests.keepup' property is set.

        * Replaced jug-lgpl with the Apache-licensed version [JSPWIKI-41].

        * The Ant war/test war tasks were not always properly excluding
        test-related jars, such as Selenium. This was causing webapps to
        fail to load in some cases. These jars have now been moved to tests/lib.

        * Adjusted the README file in lib to reflect reality.

2007-12-10  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.6.1 RC4

        * (I am really not sure if I am numbering right here, since
           I fixed a bug, should the revision number not be incremented
           as well, according to [JSPWIKI:VersioningProposal]?)

        * Fixed Bug in CreoleFilter: When you used the signature
          markup from creole (--~~~~), plugin syntax did not get properly
          translated back into creole markup, so even if you
          typed in <<Plugin>>, it was later displayed in the source
          as [{Plugin}]

        * Added some missing linebreaks in translation

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1 RC3

        * Fixed Ant script compatibility issue reported in [JSPWIKI-109].
        JSPWiki's 'war-tomcat'  and 'webtests' tasks now work correctly
        when running under Tomcat 5.5 *and* 6.0.

        * Fixed a compatibility bug that was preventing JSPWiki from
        starting in an older version of Resin [ JSPWIKI-92]. This issue surfaced
        three bugs: web.xml's <description> and <display-name> elements
        were in the wrong order; an unneeded SAX parser feature was being
        set in WebContainerAuthorizer; and (most egregiously) TabTag
        overrode a superclass method, setId(), when it should not have.
        TabTag's implementation has been "pulled up" to WikiTagBase, and it
        now delegates properly to the superclass. In addition, as a bonus,
        all "id" attributes for custom JSPWiki tags are now immunized from
        cross-site scripting injection.

2007-12-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.0 RC2

        * Changed versioning scheme

2007-12-16  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.6.2 RC1

        * [JSPWIKI-101]: Fixed, TOC plugin did not call filter

        * Improved MissingTranslations utility, now outputs sorted list
          of diff properties.

        * Added missing german translations

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1 RC1

        * Ripped-and-replaced web unit tests and replaced with Selenium.
        Selenium test directory structure replaced with a patched
        selenium-server-0.9.2.jar. Web tests are yet not at parity
        with old (failing) JWebUnit tests, they are pretty good for
        a start. Many thanks to Dirk to figuring out the minor patches
        we needed to get Selenium to work nicely with Mootools.

        * Removed all traces of JMeter, HttpUnit and JWebUnit
        (as much as I could find, anyway).

        * Re-based Selenium tests to tests/etc/selenium/tests.

        * If you want to try developing your own web tests, check out
        Selenium IDE, a FireFox plugin that records user actions
        and generates tests scripts.

2007-12-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.0 RC1

        * [JSPWIKI-55]: Added patch from David Au to fix pages
        with spaces.

        * [JSPWIKI-62]: Added patch from David Au to fix ShortURLConstructor
        and plain.jsp.

2007-12-10  Dirk Frederickx (dirk.frederickx@gmail.com)

        * Added selenium-core (selenium.core.version=0.8.3, selenium.core.revision=1879)
        with few patches for mootools compatibility.
        (see http://forum.mootools.net/viewtopic.php?id=1639)

        * Added first set of web unit tests based on Selenium.
        Read the tests/selenium-tests/readme.txt for more instructions how to
        run them manually. Automated testruns from ant still need to be setup.

2007-12-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.166

        * [JSPWIKI-78]: It's no longer possible to recover password
        based on user account name - you need the email address.  Props
        to Ounce Labs.

        * Contents of login.lostpw.help, login.lostpw.name have changed. Updated
        English and Finnish translations accordingly.

        * [JSPWIKI-65]: InsertTag now protects against a problematic XSS injection.
        Thanks to Ounce Labs.

2007-12-04  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.165

        * [JSPWiki-88] Fixed js bug to tab to group or profile in IE6


2007-12-01  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.164  : various xss vulnerablilities

        * Wrong Password Error Message May increase Credential Guess [JSPWIKI-85]

        * GROUP parameter validation [JSPWIKI-69]

        * Input Validation of editors pararmeter [JSPWki-67]

        * Resolve commonheader.jsp xss vulnerabilities wrt skins [JSPWIKI- 66]

        * Various wiki tags improvements [JSPWiki-63]

        * Author Tag and Asserted Username [JSPWiki-60]

2007-11-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.163

        * Rolled back fix to JSPWIKI-74, since a) it's not necessary,
        and b) it kills the performance of the save process.

        * [JSPWIKI-84]: Added note to the jspwiki.properties.

2007-11-??  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.5.162

        * Fixed [JSPWIKI-82]. We were failing to properly close JDBC connections
        in JDBCUserManager and JDBCGroupManager. Credit: Ounce Labs.

        * Fixed [JSPWIKI-74]. SpamFilter now uses SecureRandom.
        Credit: Ounce Labs.

2007-11-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * Same version, don't want to bump too many times in one day :)

        * [JSPWIKI-46]: it's no longer possible to do redirection on
        nextPage when uploading.  Thanks to Ounce for letting us know.

        * [JSPWIKI-53]: Added patch from Dave Wolf to turn a missing
        policy file -NPE to a proper exception (with explanations).

2007-11-25  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.161

        * IE wide images also fixed on PREVIEW mode;

        * Stack overflow on IE for login page fixed [JSPWiki-51]

        * %%collapse rendering was incorrect with larger default font-sizes.
        Adapted to height of the colllapse bullets. [JSPWiki-34]

        * Minor adjustment of the smart skin: alignment of search-box and
        header/footer widths.

2007-11-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.160

        * Applied patch from Harry Metske to slightly speed up PageTimeComparator.

        * [JSPWIKI-47]: SecurityConfig.jsp now ships off by default, but can
        be enabled by setting jspwiki-x.securityconfig.enable=true.  The page
        also has instructions on how to accomplish that, when you try to access
        it.

2007-11-22  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.159

        * IE fixes for fluid template with very wide images. (cont'd)
        Also fixes a bug introduced in v2.5.155 wrt image formatting.
        [JSPWiki-15, JSPWiki-52]

2007-11-22  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.158

        * Ant build script for webtests is now much smarter. Web tests now perform a
        "pre-flight" check to make sure preconditions are satisfied before launching.
         If you've wanted to run web tests before but "couldn't get them working."
         the new script should set things right.

2007-11-18  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.157

        * [JSPWIKI-21]: Password hash now uses UTF-8 instead of platform default.

        * Cleaned JSPWikiToCreoleTranslator to conform to coding rules

        * CommentedProperties was also storing with platform default encoding.  In
        most cases this would work, but it would create an unwelcome incompatibility
        between regular property files and these property files.  It now explicitly
        uses ISO-8859-1 encoding.

        * Fixed a couple of wrong entities in Spanish and Finnish translations.

        * [JSPWIKI-29]: Per-page RSS links should now be correct again.

2007-11-17  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.156

        * Removed the error prefix from the successfull LossPassword information message.  [JSPWIKI-26]

        * Small searchbox improvements: search icon now appears inside the search box;
        an empty search is really empty and does not search for the string 'Quick Navigation' anymore.

        * Fixed the search Highlight to cooperate well with AJAX based searches.

2007-11-16  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.155 - IE6 wide images

        * Fix funny indenting of collapsable list when %%collapse are nested [JSPWiki-34]

        * (finally) Fixing wide image support for ie6 in fluid templates. [JSPWiki-15]
        For IE6 browsers, a <div class="ieimage"> will be inserted around each image. This <div>
        gets a specific overflow-x:auto style, activating proper scrolling for this famous browser.

        * Added a correction to the fixed width template Vanilla-1024x768, to support wide images
        on ie6 here as well. [reported by Harry Metske]


2007-11-12  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * 2.5.154

        * Added support for JMeter (v. 2.3) tests in build.xml & webtests.xml,
        two new properties must be set up at your build.properties: tomcat.protocol
        and @jmeter.home@.

        * Added jmeter-tests.jmx with simple login and logout web tests and
        jmeter-init-workbench.jmx, which contains initial nodes to start recording
        new tests.

        * JWebUnit tests are no longer running when executing the <webtests> target.
        You can keep running them inside your IDE as normal JUnit test or uncomment
        the appropiate section in the <webtests> target.

2007-11-10  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.153

        * Form element focus was failing on preferences pages in IE [JSPWiki-24]

        * Added TitleBox to the template. When creating a page 'TitleBox', it's contents
        will be included at the top of the header of the wiki site.
        This allows you to put a title message or specific announcements or newsflashes
        on your site. [Suggested by Murray & Janne]

        * Added a new skin PlainVanilla 1024x768, which has a fixed width layout iso
        the fluid layouts used in the default PlainVanilla skin.
        This new skin allows to better support IE browsers when showing wide images.
        (IE has terrible float support)


2007-11-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.152

        * [JSPWIKI-19]: Fixed localization which was encoding HTML entities
        even though there was no need.

        * [JSPWIKI-12]: Fixed localization.

        * Added Murray's patch for WikiPageRenameEvent.

        * [JSPWIKI-28]: LinkParser was failing dismally with interwiki links.
        Added a new unit test to catch these, and rewrote LinkParser interwiki
        link parsing.

        * LuceneSearchProvider.getAttachmentContent() is now protected for
        subclassers.

        * ClassUtil is now a bit more verbose.

2007-11-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.151

        * [JSPWIKI-11]: It's now possible to set mail.smtp.starttls.enable
        also from the property file.  Previously it would always default
        to true, making it fail when there was a self-signed certificate
        at the other end.

        * Added an UTF-8 check to SpamFilter to catch bots which munge
        UTF-8 and cause major breakage...

        * Fixed some issues with the password recovery email localizations.

2007-11-3  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.150 - small template fixes

        * IE6 stuff: fixed the height of actionsTop

        * Smart skin: searchbox didn't show up, several style alignments with vanilla template

        * Finish, Spanish, German I18n : removed some obsolete <br /> tags [JSPWiki-17]

2007-11-1  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.149 - various ie6 fixes in css and javascript

        * The Accordion style now support dynamic content. Iow, accordion sections
        will dynamically grow/shrink with dynamic content such as collapsible lists or boxes.

        * The body of a page and the Info tab have gotten a css overflow:auto style. to support wide pages.
        When contents becomes too wide (eg wide tables) the pagecontent will overflow horizontally
        with scrollbars at the bottom of the page.
        Add small ie6 fix for wide preformatted {{{blocks}}}
        For ie6, specific proprietary overflow-x style is used.

        * Long values in table filter dropdowns are trimmed to maximum 32chars. This will reduce
        the occurance of wide tables in eg Page Info tab.

        * Added slimbox icon gifs for ie only.

        * IE6 Collapsible List is working again. (finally)

        * IE6 Layout of the Edit and More tabs is now properly aligned with the rest of the page border

        * Fixed the mouse-selection bug on the edit textarea, for ie6.

        * Improved editor toolbar handling for ie6, with better handling of selected text in the textarea.
        [BUGZILLA BUG 118]


2007-10-30  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.148 - ie6 fixes cont'd

        * Replacing several .png icons by .gif variants, which are better supported
        across browsers. The warning and error icons were swapped. (reported by Murray)

        * Added a small fix on wide pages with {{{blocks}}}

2007-10-29  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.147 - more IE6 fixes

         * Pages with wide preformatted {{{text blocks}}} where not overflowing correctly on ie6.
         [JSPWiki-2]

         * More updates on collapsible lists for ie6. More testing required.

         * Fixed the SearchBoxMenu to ensure proper width on ie6


 2007-10-27  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.146 - more IE6 fixes and small gui updates

         * Refactored collapsible lists in view of ie compatibility.
         * Improved layout consistentcy of the quick navigation action buttons
         * Resolved double loading of print.css. (commonheader.jsp)


2007-10-26  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.145 - many IE6 fixes and small gui updates

        * Heading rendered wrong in IE6, because IE doesn't like floats with margins.
        [JSPWIKI-4]
        * By default, the more-menu is hidden by default, to avoid bumpy screen rendering
        for slower page loads. [JSPWiki-9]
        * TabbedSections in IE6 had annoying additional spacing between tab and body

        * BUGZILLA 115: URL Constructor compatibility is fixed for Ajax enabled searches.

        * Align look n feel of collapsible lists, boxes and accordions.
        All hovered actions now get a consistent, neutral color, instead of the previous orange tint.
        (reported by Murray Altheim)

        * CollapsibleBox update: you can now click anywhere on the title of a collabsible box
        to open or close it. Previously, you had to hit the +/- collapse button.

        * The %%category now supports any url constructor type. (was failing on jspwiki.org)
        The look 'n feel of the category popup has been aligned with Tip-Style.
        (no more orange, but transparent dark grey)

        * The Redo/Undo buttons are moved to the top of the Edit.jsp form, because they function
        irrespective of the search functions.

        * TOC has become a floating element, such that commentboxes and toc's can nicely
        float next to each-other. Downside is that, when entering text right after a TOC, the text will
        float next to the toc. To prevent this, you can always enter a \\ (wiki linebreak) which
        will nicely push the contents under any float. (clear:both)  [JSPWiki-1]

        * added 2 new i18n resources
        javascript.slimbox.previous=&laquo;Previous
        javascript.slimbox.next=Next&raquo;

2007-10-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.144

        * SpamFilter now has the ability to check against all the
        tests by setting <strategy>score</strategy>.

2007-10-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.143

        * Some additional improvements to SpamFilter, which now
        keeps track of user sessions and stores some data in it
        (yes, I'm being a bit vague here on purpose).

        * 2.5.142

        * Combined edittime and addr fields into one hash value.

        * Also improved edit process slightly to catch bots.

        * SpamFilter now also matches against the IP address.

2007-09-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.141

        * Added Murray's patch to allow better extensibility for
        LuceneSearchProvider.

2007-09-23  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.140

        * Fixed issue with deploy/redeploy - removed a thrown exception
        in WatchDog, and made the AdminBeans properly unregister upon
        shutdown.

2007-09-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * Updated Finnish localization

2007-09-18  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * Fixed a pair of typos: use of tomcat.host & port instead of localhost:8080 in
        build.xml + cvs.root property pointing to cvs.jspwiki.org instead of
        grey.ecyrd.com and one more localized string at CoreResources.properties,
		    - markupparser.link.create = Create &#39;{0}&#39;

2007-09-16  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.139

        * [BUG 136]: Fixed several XSS vulnerabilities in plain.jsp,
        commonheader.jsp, GroupContent.jsp, EditGroupContent.jsp,
        InfoContent.jsp, NewGroupContent.jsp, VariableTag, UserProfileTag
        and MessagesTag.  Reported by Jason Kratzer.

        * Fixes a local path disclosure vulnerability in
        BasicAttachmentProvider.  Reported by Jason Kratzer.

        * Updated Finnish localization

        * Also fixed a number of instances of apostrophe (') use in
        localization files - better to use &#39; to avoid loads of nastiness
        with certain constructions.

2007-09-14  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * 2.5.138

        * Localized Referring Pages and Current Time plugins (again, strangely enough,
        the plugins' texts were already in the resource file.). Updated
        referringpagesplugin.more localized text, it was looking for two parameters and
        the plugin uses only one.

        * Localized also Forms Plugins, JSPWikiMarkupParser, PluginContent,
        TranslatorReader and PluginManager. New localized strings:
        + CoreResources.properties
		    # JSPWikiMarkupParser
		    - markupparser.error.invalidset = Invalid SET found: {0}
		    - markupparser.error.nointerwikiref = No InterWiki reference defined in
		    		properties for Wiki called '{0}'!
		    - markupparser.error.parserfailure = Parser failed: {0}
		    - markupparser.error.javascriptattempt = Attempt to output javascript!
		+ PluginResources.properties
			# Forms Plugins
		    - formclose.noneedtoshow = (no need to show close now)
		    - forminput.namemissing = Input element is missing parameter 'name'.
		    - forminput.noneedtoshow = (no need to show input field now)
		    - formopen.missingparam = The FormOpen element is missing the '{0}'
		    		parameter.
		    - formopen.postorgetonly = Method must be either 'post' or 'get'
		    - formopen.noneedtoshow = (no need to show form open now)
		    - formoutput.missingargument = Argument '{0}' required for Form plugin
		    - formselect.namemissing = Select element is missing parameter 'name'.
		    - formtextarea.noneedtoshow = (no need to show textarea field now)
		    - formtextarea.namemissing = Textarea element is missing parameter 'name'.

        * Web tests no longer require the servlet container to be running at
        http://localhost:8080/. Now you can set host & port at the build.properties
        file indicated in build.xml

2007-09-09  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.137

        * Few javascript fixes for improved URL constructor compatibility [ BUG 115 ]
        The generated links in the ajax search dropdown are now compatible with
        the selected URL constructor.

        * More IE fixes to improve rendering of floats. ( ref. IE6 peekaboo bug )


2007-09-08  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.136

        * D'oh, due to some debug code left in CookieAuthenticationLoginModule,
        it was expiring sessions in 30 seconds.

        * AdminUI now shows all known plugins and whether they are compatible
        with this version of JSPWiki.  WikiWizard also gains an AdminBean
        (though it doesn't do anything).

2007-09-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.135

        * [Bug 135]: Turned out to be a faulty quote in Finnish translation.

        * [Bug 134]: Ditto.

2007-09-03  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.134

        * Fixed the JSON-RPC url, to be independent on the url constructor

2007-09-02  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * 2.5.133

        * [Bug 133]: Release.isOlderOrEqual() was not comparing revisions
        properly and, in the end, Editors were not registering. Something
        similar was happening with Release.isNewerOrEqual(), fixed as well.

        * [Bug 122]: Partly fixed. Preferences for default template are now readed
        from jspwiki.properties instead of being hardcoded in
        com.ecyrd.jspwiki.preferences.Preferences. Cfr. with jspwiki.properties.tmpl
        lines 258 - 261.

        * Updated es_ES locales

2007-09-02  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.132

        * Fixed search menu for Smart skin. (improve compat. with IE)


2007-09-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.131

        * [Bug 131]: Added Harry Metske's patch to allow "excludeattachments"
        on UnusedPagesPlugin for those who need it.

        * Updated Finnish localization.

2007-09-01  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.130

        * Fixed missing html attrib in LostPassword tab

        * The Edit findSuggestionMenu has been moved into the Favorites,
        so it nicely accomodates with Left or Right position of the favorites block.

        * [ BUG 132 ] Collapsable lists and boxes now also are rendered in preview mode

        * [ BUG 123 ] Added a confirm box in case you click aways from the page without saving.
        When you leave the edit session without first saving your changees (eg clicking the
        Info tab, clicking any page link, etc.) a popup window asks you to confirm.

        javascript.edit.areyousure=Without clicking the Save button, your changes will be lost. \
            Are you sure you want to exit this page?

        * [ BUG 126 ] Remove 'spurious' css errors.

2007-08-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.129

        * Fixed a number of bugs in the SpamFilter, and added automatic
        bot detection according to idea from
        http://www.modernbluedesign.com/web-design-blog/fighting-spam-with-css/

        * SpamFilter captcha is now user-settable.  Possible options
        are "none" and "asirra".

        * 2.5.128

        * Added SearchManagerBean to the admin UI.  It's now possible
        to force a reindex of all pages, either from your MBean manager
        or the Admin UI.

2007-08-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.127

        * Login redirections were failing; fixed with some bubble gum.

2007-08-26  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.126

        * Performance optimizations: PagePermission constructor
        no longer uses String.split() but StringUtils.split().
        String.split() is a regexp function, and they're always
        expensive.

2007-08-26  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.125

        * Add UserBox.jsp

        * Spaces should not break action buttons such as 'Log In' or 'My Prefs'.
        (reported by Murray Altheim)

        * [Bug 120] : Fix unbalanced JSP single or double quote's. (eg on Websphere or BEA)

2007-08-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.124

        * [Bug 89]: Removed Test plugin (now that IfPlugin can do all the
        same things).

        * [Bug 32]: LuceneSearchProvider now also indexes the page
        with all the non-letters removed.

        * [Bug 121]: RSS.rdf is now only generated of pages to which
        the Anonymous user has access to.

2007-08-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.123

        * Added Murray's patch to allow static calling of IfPlugin.

2007-08-22  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.122

        * [Bug 113]: Error with 'join wiki now!' link creating new accounts

2007-08-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.121

        * [Bug 10]: Fixed.

        * Made findSuggestionMenu transparent since it sometimes blocks
        the view.  Also reduced fontsize a bit.

2007-08-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.120

        * [Bug 89]: Added support also for [{If var='xyssy' exists='true'}],
        requested by Dirk.

        * Localized WeblogEntryPlugin (strangely enough, the plugin text
        was already in the resource file.)

        * [Bug 39]: Fixed the login issue, but many things still remain.

        * Fixed issue with login email sending which was using a hard-coded
        URL.

2007-08-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.119

        * [Bug 89]: Added "exists" parameter to IfPlugin.

2007-08-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.118

        * [Bug 110]: WikiContext.checkAccess() was doing double encoding,
        and therefore pages with spaces would be returning wrong login
        URLs.  Reported by Alex Samad.

        * Fixed a bunch of failing unit tests - the change of "editpage"
        to "createpage" had for some reason slipped everyone's attention.

2007-08-17  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.5.117 - Page renaming caused a NullPointerException under some circumstances,
        filed as Bug 85. Fixed, seemed to be caused when renaming a non-existing page
        (cfr. with http://bugs.jspwiki.org/show_bug.cgi?id=85). Added some JUnit tests to
        check this.

2007-08-15  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.116 - More fixes for IE

        * More fixes for collapsable lists and the Greeting box.

        * Positioning of popup menu's now also correct on IE.

        * CSS-classes were added reflect anonymous, asserted, authenticed status.
        The SMART skin has user icons reflecting the login status.
        (suggested by Murray Altheim)


2007-08-12  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.115 - More IE fixes (more to come)

        * Collapsable lists were not working in the current STRICT DTD mode,
        due to a remarkable IE bug (ref. http://mt-olympus.com/emmett/bug_overflow_positionrelative.php )

        * The USER greeting box needed an fix, for IE.

        * Fixed the visibility of the Attachment Tab for IE

        * The handling of the user profile Creation (under login context) and
        user profile modifications (under Pref context) has been fixed.
        Errors during creation or update are now routed back to the correct contexts.


2007-08-06  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.114 - Few IE fixes

        * Some annoying IE layout issues fixed:
        TAB layouts and positioning of User greeting & login & prefs.
        There is still a major bug on the positioning of the popup menu's
        in IE  which makes the More menu and Navigation menu's not usable.
        Ongoing.

        * Checkboxes for Tab-completion and Smart-typing-pairs are not
        functional in IE, so now they are hidden in that browser. (BUG 103)

        * Added the LoginHelp page.

        * Ensure xhtml compliance when suppressing the PageActionsTop
        in 'login' and 'prefs' context

2007-08-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.113

        * Added "localheader.jsp", which is included from commonheader.jsp.
        The idea is that it is an "empty" header file which can be safely
        overridden in your local template without having to change
        commonheader.jsp

        * Updated Finnish localization.

2007-08-05  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.112 - Login/LostPassword/Register user fixes

        * Fixed 'show-all' search results in Find. Only display of blocks of 20 was working.

        * Renamed the css class 'editpage' to 'createpage'
        because that's actually what it is. (BUG 55)

        * Login/LostPassword/Register jsp's clean up and bugfixes:

        Handling of Lost/Reset Password is now properly covered by template jsps. (BUG 38)

        Still todo: the handling of Create/Modify User Profile (part of UserPreference and Login flow)
        need to be refactored. When creating a new user profile in the Login screens, the error handling
        get's processed by UserPrefs. Confusing.

        Some i18n resources where shifted to the right CoreResources or templates.default bundle.
        (this still needs to be done for all language specific resource files !!)

        # Login.jsp  (moved from template.default to CoreResources)
        login.error.capslock=Invalid login (please check your Caps Lock key)
        login.error.password=Not a valid login.
        login.error.noaccess=It seems you don't have access to that. Sorry.

        # moved from CoreResources to template.default  (NOTE: lostpwd changed to lostpw !)
        login.lostpw.reset.clickhere=Click here
        login.lostpw.reset.login={0} to log in once you retrieve your new password.

        * PageActionsTop.jsp was updated to hide the More menu from 'non-page' related contexts.
        The More menu will only be shown in view, edit, comment, diff, info, preview, upload & find

        * The SearchPageHelp was extended with some Lucene hints.

2007-08-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * Updated Finnish localization.

2007-08-05  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * i18nized some JSPs with hard-coded text. New localizable strings:

			- GroupTab.jsp (default.properties)
			grp.createdon
			grp.lastmodified
			grp.groupnames.title
			grp.newgroupname
			grp.savegroup
			grp.savenewgroup
			grp.cancel
			grp.deletegroup
			grp.deletegroup.confirm
			grp.formhelp
			grp.allgroups
			(grp.by removed due to proper use of MessageFormat)

			- NewGroupContent.jsp (default.properties)
			newgroup.creategroup

			- PreferencesContent.jsp (ProfileTab.jsp, default.properties)
			prefs.roles
			prefs.groups
			prefs.creationdate
			prefs.profile.lastmodified

			- UserProfileTag (coreresources.properties)
			userprofile.nogroups
			userprofile.noroles

        * Updated spanish (es_ES) translation.

2007-08-04  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.111

        * Closing final final XHTML compliancy issues (Closing BUG 9)

        * More menu is now extendable (BUG 20)
        A new page called 'MoreMenu' can now be used to extend the More menu
        with extra stuff, such a links to Recent Changes, Page Index,
        System Info, About, Site Map, etc. The behaviour is similar as for the LeftMenu.
        It is only functional when JS is turned on in your browser.
        Otherwise the more menu is an ordinary dropdown.

        * Fixed Favorites position (left/right) in Edit and Upload view

        * Removed font resizing stuff. No real add value. (and not working in IE anyway)

2007-08-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * "ant war" now compresses jspwiki-edit.js, jspwiki-common.js
        and jspwiki-prefs.js using the Rhino library.  This should bring
        in considerable savings to bandwidth and response.

2007-08-03  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.110

        * Added patch from Murray to provide property cascading from
        system properties.

        * Added patch from Murray to provide setting of AclManager
        (use jspwiki.aclManager=<class>).

2007-07-30  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.109 - internal cleanup of JSP's, few bugfixes (one for IE)

        * Added new <wiki:SetPagination> Tag to get rid of java hacking
        in InfoContent.jsp and AJAXSearch.jsp. Fixed a few bugs on pagination
        as well. Now pagination does show up properly at version=20.
        (reported by Milt Taylor)

        * New marker defined 'jslocalizedstrings' to cleanup commonheader.jsp.
        Some refinement is still needed, but it works for now.

        * Fixed IE crash in jspwiki-edit.js causing edit toolbars not to be
        rendered. (as reported by Milt Taylor)

        * Bugfix: Attachment upload was not working anymore (introduced in 2.5.107)


2007-07-30  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.108 - template changes & usability

        * The 'Edit' button is now back in its previous position. (after recent popularity poll ;-)
        The 'More' button now has a little down-icon as visual clue that it's actually a dropdown.
        The GoTo-Bottom triangle has been removed (reduce screen clutter, not used much anyway)
        The GoTo-Top button is still there.
        The 'Login', 'Logout' and 'My prefs' are put below Greeting, which is more natural.
        (with still 2 different approachs in the default and Smart skin)

        * New preference added to select Left/Rigth position the Favoristes menu.
        The position of the 'More' menu and 'Find/Recentchanges' dropdowns is now calculated on the fly.

        prefs.user.orientation=Favorites style
        prefs.user.orientation.left=Left
        prefs.user.orientation.right=Left

        * Smart and OrderedList skins are now aligned with latest GUI changes

        *  After setting new UserPreferences, you get now redirected back to the page you came from.
        (similar to login)

        * XHTML compliance improvements.
        Border settings have been removed from img elements. (RecentChangesPlugin,
        RSSCoffeeCupLinkTag, TranslatorReader)
        Replace all <u> in default.properties by <span class="accesskey">

        editor.plain.name=Your <span class='accesskey'>n</span>ame
        editor.plain.email=Homepage or e<span class='accesskey'>m</span>ail
        actions.edit=<span class='acceskey'>E</span>dit
        actions.editparent=<span class='acceskey'>E</span>dit parent page
        actions.prefs=My <span class='acceskey'>P</span>refs
        actions.prefs.title=Manage user preferences [ p ]

        * The attachment img viewers now alos supports capitalised extensions
        (eg both jpg and JPG can be reviewed)

        * Small refactorings on the Tabbed Sections. (simplified TabTag html)
        All content inside a tab, also the floated content, will nicely fit inside the tab.
        (ref bug 101)

2007-07-24  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * Updated spanish (es_ES) translation.

2007-07-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * Just updated Finnish translation and fixed some entity names
        in English translation.

2007-07-23  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.107

        * Many 'usability' improvements based on many many inputs from
        Claudia, Murray, Alex and Janne. Hope you like them :-)

        All screens now consistenty show 3 TABS (view, attach and info)
        The Edit action has become a 'pseudo' TAB positioned right next
        to the standard set of tabs, but visually different.
        For the time being, Add-Comment remains hidden in the More dropdown
        as it is less frequently used.
        The More action has been visually adjusted as a kind of 'button'.

        The Link tab and Diff tabs are incorporated in the Info screen as
        collapsable boxes, and are only shown depending on the context.
        This brings back all page info (links, version history) back under one
        single place.

        A new --USER-- bar is added with UserName, Login/Register, Prefs and Logout
        actions. These actions are not anylonger in the top pageactions sections.
        This USER bar is positioned at the top of the screen (PlainVanilla skin)
        or in the Favorites sections (SMART skin)

        The bottom page actions have been simplified to the max.
        When clicking the 'goto TOP' triangle, you are just one click away
        from all remaining actions and buttons. (this was the most easiest for now ;-)

        Pending stuff: allow configurable 'quick-links' to be added next to and
        inside the More... menu. Skins may not yet be up to date with all changes
        - expect some glitches here and there.

        * Added link to 'View source page' to the More menu. New i18n property:`
        actions.rawpage=View Page Source

        * Fixed the Diff dropdown selectors when no parameters (r1 and r2) are provided.

        * Editor/Posteditor improvements:
        Checkboxes were added to turn on/off the Tab Completion and
        Smart TypingPairs. Your settings are cookie-fied.
        Some new i18n keywords added:

        editor.plain.smartpairs= Smart Typing Pairs
        editor.plain.smartpairs.title= Auto pairing of () [] {} "" ''
        editor.plain.tabcompletion=Tab Completion (keyword+Tab)
        editor.plain.tabcompletion.title=Auto expansion of keyword to Wiki Markup

        All posteditor functions are now also undo-able.

        The Posteditor now correctly handles Shift+right-arrow in Firefox. (Bug 91)

        * Fixed Bug 86 Commentbox and Tabbedsection not playing well (reported by Alex Samad)


2007-07-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.106

        * Fixes an XSS vulnerability with evilly formed links.
        Reported by Igor Minar.

2007-07-18  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.105

        * AdminUI has now rudimentary user management - it's now
        possible to add, change and remove user accounts using the adminUI.
        AdminUI is reachable through admin/Admin.jsp.

2007-07-18  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.104

        * The "Home" link now get's the actual name of the home/front page
        (suggested by Claudua Frers)
        Remove the key='actions.home'  from i18n properties

        * Fixed floating issue between TabbedSections and CommentBoxes inside pages.
        (reported by Alex Samad)

        * More xhtml fixes on PreferncesTab and default.properties.

2007-07-18  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.103

        * [Bug 21]: Turned out to be a problem of self-referencing
        pages.

        * [Bug 85]: Added an extra check for this case.  It still throws
        an exception, but at least it's a lot more useful to debug.

        * [Bug 25]: Was related to Bug 21.  Added test cases and fixed.

        * Added IfPlugin; thanks to Scott A. Bybee who explained to me
        how useful conditional wikitext can be.

        * [Bug 87]: Login process now returns you to the same page
        where you chose to login.

2007-07-17  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * Updated Finnish localization.

2007-07-17  Dirk Frederickx (dirk.frederickx@gmail.com)

        * No version bump -- some small fixes only.

        * Few small IE6 tweaks: position of actionmenu popup,
        position of triangle icons for top and bottom link

        * Remaining xhtml issues (empty <td/> are not allowed) (BUG 9)
        All pages of xhtml compliant, excpet UserPreferences.

2007-07-17 Christoph Sauer (sauer@hs-heilbronn.de)

        * 2.5.102

        * Bug 13 fixed. Chuck found that by using WikiWizard 1.1.1 instead of 1.1,
          it would load properly. However, it would not import the text with JavaScript
          due to a new security mechanism built into Mac OS X. To remedy this problem,
          we added scriptable="true" to the applet tag and it should work now.

       *  Added missing german localisations. Added a class called MissingTranslations
          that helps diff the ressource property files. Adapt it to your localisation
          and run it directly in your IDE.

2007-07-14  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.101

        * Few more xhtml issues resolved.

        * Default Template is now fixed for IE6.

        * Edit Assist toolbar tips localized.
          New localisable items, since v2.5.100

            editor.plain.posteditor=Enter Keyword+Tab:
            editor.plain.posteditor.title=shift+enter for next next field
            editor.plain.editassist=Edit Assist
            editor.plain.editassist.title=Toggle Edit Assist buttons
            editor.plain.tbLink.title=link - Insert wiki link
            editor.plain.tbH1.title=h1 - Insert heading1
            editor.plain.tbH2.title=h2 - Insert heading2
            editor.plain.tbH3.title=h3 - Insert heading3
            editor.plain.tbHR.title=hr - Insert horizontal ruler
            editor.plain.tbBR.title=br - Insert line break
            editor.plain.tbPRE.title=pre - Insert preformatted block
            editor.plain.tbDL.title=dl - Insert definition list
            editor.plain.tbB.title=bold
            editor.plain.tbI.title=italiceditor.plain.tbMONO.title=mono - monospace
            editor.plain.tbSUP.title=sup - superscript
            editor.plain.tbSUB.title=sub - subscript
            editor.plain.tbSTRIKE.title=strike - strikethrough
            editor.plain.tbTOC.title=toc - Insert table of contents
            editor.plain.tbTAB.title=tab - Insert tabbed section
            editor.plain.tbTABLE.title=table - Insert table
            editor.plain.tbIMG.title=img - Insert image
            editor.plain.tbCODE.title=code - Insert code block
            editor.plain.tbQUOTE.title=quote - Insert quoted block
            editor.plain.tbSIGN.title=sign - Insert your signature

2007-07-14  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.100

        * Finalising xhtml fixes. I hope to close (BUG 9) really soon now.

        * The Frontpage variable can not be use cause it is not always set.
        Falling back to engine.getFrontPage() (BUG 82)

        * The Edit Assist and the resize bar are now also availble in the Add Comment page

        * The Edit Assist buttons have been improved. Pressing a button will replace the selected
        text properly, instead of just overwriting it. (EG, select a word and press the BOLD button
        to replace theword by __word__) Also the handling of newline has been improved as
        some markup should always appear at the start of a new line. (EG, headers, tables, ...)
        (ref also BUG 83)

        * Experimental, but looks promising ;-)  When JSPWiki rendered on a narrow screen, (eg 200x320px)
        page-tabs were overlapping with page-actions, and not usable anymore.
        Now, the tabs nicely shift below the page-actions when the screen is very small.
        This will help JSPWiki to be usable on mobile divices such as S60 or iPhone. (BUG 80)
        As always:: please test this on IE browsers and feedback. Testing was done FF, Safari, Opera and Camino ok.

        * The Smart and OrderList skin have now aligned with latest pageactions changes

2007-07-14  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.99

        * [Bug 77]: We were starting two FilterManagers - apps were
        registering to the other one, and events were fired with the
        other one... Heh.

        * Startup now outputs a lot more useful info about the environment
        (enabled by setting WikiEngine to DEBUG).

        * WebSphere Community Edition (WSCE 1.0) was crashing at startup,
        due to AuthenticationManager.hasCookieAuthentication() assuming
        non-null JAAS lists.

        * TestHttpServletRequest now returns a sane locale (so that no
        NPE's occur anymore in tests).

        * Updated Finnish localization up-to-date.

2007-07-14  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * Checked in spanish (es_ES) translation.

        * Added localization for validateNotNull at InputValidator, one new
        localizable string in CoreResources:

           - validate.cantbenull

2007-07-13  Christoph Sauer <sauer@hs-heilbronn.de>

        * checked in missing /com/ecyrd/jspwiki/plugin/PluginResources
          german translation. [Bug 74] closed.

2007-07-12  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.5.98

        * Added jspwiki.basicAttachmentProvider.disableCache property. It takes
          a regex that let you define for which filename patterns to disable the
          browser cache. See more on this in the jspwiki.properties.tmpl comment

        * Fixed Bug in CreolePageFilter: Two tables seperated by a blank line
          where rendered as one table

        * Checked in German localisation for CoreResources

2007-07-12  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.97

        * Changed "validate.unsafechars" i18n pattern to fix a fatal
        bug with it.  Also deleted "validate.invalidid", since it's no
        longer needed.

        * Updated Finnish localization (fi).

2007-07-11  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.96

        * Added a bunch of missing localizations, reported by Youheng Hu.
        New localizable strings in CoreResources are:

           - security.error.createprofilebeforelogin
           - security.error.blankpassword
           - security.error.passwordnomatch
           - security.error.illegalfullname
           - security.error.illegalloginname
           - security.user.loginname
           - security.user.fullname
           - security.user.email
           - validate.unsafechars
           - validate.invalidemail
           - validate.invalidid

        * WikiSession gains getLocale() method, which provides a cached
        locale object.

2007-07-10  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * [BUG 81] Added the _en resource bundles to the JAR build by copying
        the default bundles in build.xml.  No bump, no functionality change.

2007-07-09  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.95

        * Stabilising 2.5.94.

        * Remove editor type selector from CommentContent.jsp

        * Bugfix on tab switching in the Login and UserPreferences pages

        * Bugfix: the SIGN shortcut was not working in Edit Assist

        * Bugfix: typo in commonheader.jsp caused jspwiki-edit.js to be loaded twice

        * Bugfix: z-index adjusted for More.. menu to satisfy IE editors.

        * Fixed remaining xhtml issues. (BUG  9)


2007-07-08  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.94

        * Cookie handling has been refactored. JSPWikiUserPrefs is now JSON based.
        Also the height of the edit textarea is 'cookiefied', so jspwiki remembers
        your prefered height of the editor area. (BUG 67)
        The RecentSearches memory has been added to the JSPWikiUserPrefs and doesn't require
        an additional cookie. (less cookie dirt)

        * Replace all hardcoded references to 'Main' by 'wiki.frontPage'  (BUG 42)

        * Improved the loading of additional Javascript chunks. jspwiki-edit.js is now
        only loaded with plain.jsp, so no more interference with WikiWizard (BUG 78)

        * Major refactoring of the 'More...' dropdown menu. It now perfectly runs on Firefox,
        Opera, Camina, Safari and (i hope ;-) on IE. Plse test test test on IE6 and IE7 and report
        bugs. The new menu is also XHTML compliant.
        Many improvements have been done on the remaining XHTML compliancy issues.

        * The Editor type selector is now moved to the UserPreferences page, instead of the
        Edit.jsp. Changing the editor type during an edit session was dangerous,
        as changes to the page are not saved. Now you can set your preferred editor in MyPrefs.

        * The editor textarea has been boosted with Posteditor
        (see http://icebeat.bitacoras.com/mootools/posteditor/ for a demo)
        The textarea now supports the TAB key, smart 'typing pairs' (suchs as () [] {} )
        and has some fancy tab-completion of commonly used commands.
        Try entering toc+TAB to see the effect.
        The PostEditor is only functional on non-IE browsers, and if Javascript is on.

        * The Editor assist toolbar provides a set of buttons to assist newbies in entering
        wiki markup. Supports both non-IE as IE, only if Javascript is on.


2007-07-06  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.93

        * RESOURCE_HTTPHEADER didn't work if adding dates.

        * AdminBeanManager is now a bit more robust if a bean is already
        registered.  Thanks to Alex Samad for the patch.

2007-07-04  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.92

        * DiffProviders are now localized.  Unfortunately, this meant an API
        change, so WikiEngine.makeDiff() now takes a WikiContext as a parameter.
        I don't think many people were using it, though, so it's not a major
        issue.

        * New localizations in CoreResources-bundle:

            - diff.traditional.added
            - diff.traditional.changed
            - diff.traditional.removed
            - diff.traditional.oneline
            - diff.traditional.lines

2007-07-03  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.91

        * There have been loads and loads of fixes to Checkstyle warnings.

        * Added RESOURE_HTTPHEADER from Alex Samad.  Thanks!

2007-06-30  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.90

        * [Bug 71]: Login.jsp is now localized.  All localizers, please
        note that there are three new strings to localize in
        "templates.default" -bundle:

            - login.error.capslock
            - login.error.password
            - login.error.noaccess

        * In addition, there are further localization done in top-level
        JSPs.  New strings in CoreResources are:

            - security.error.noaccess.logged
            - security.error.noaccess
            - security.error.wrongip
            - rename.empty
            - rename.error.title
            - rename.error.reason
            - rename.identical
            - rename.exists
            - rename.unknownerror
            - lostpwd.newpassword.email
            - lostpwd.newpassword.subject
            - lostpwd.nouser
            - lostpwd.nomail
            - lostpwd.emailed
            - lostpwd.reset.title
            - lostpwd.reset.clickhere
            - lostpwd.reset.login
            - lostpwd.reset.unable
            - lostpwd.reset.blurb
            - lostpwd.reset.submit

        * Updated English and Finnish localizations (and fixed a couple of
        sillinesses in the Finnish localization)

2007-06-23  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.89

        * Cookie handling has been refactored. JSPWikiUserPrefs is now JSON based.
        Also the height of the edit textarea is 'cookiefied', so jspwiki remembers
        your prefered height of the editor area. (BUG 67)

        * Fixed handling of form focus() logic. JSPWiki now correctly puts the focus
        on the first visible form element. This also resolves a JS crash on IE.

        * Some improvement on XHTML compliance (BUG 9) Still some refactoring
        needed on dropdown menu to improve compliance.

        * Added UTF8 support to AJAXSearch.jsp

2007-06-18  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.88

        * [Bug 24]: BugReportHandler no longer talks about "bug
        reports", but pages.  Reported by Gregor Hagedorn.

2007-06-16  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.87

        * BUG 62 resolved: no sensitve info in LeftMenu during Login.

        * Fix some SkinName issue relate to the new preferences object.

        * BUG 52 resolved: Diff.jsp and PageInfo.jsp should not be indexed

        * TextArea resize bar image.

2007-06-16  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.86

        * [Bug 29], search path is now trim()med properly. Thanks
        to David Au.

        * A couple of fixes to warnings courtesy of Alex Samad.

        * [Bug 12], AM/PM are now correct in preferences.

        * Created new Preferences object, and refactored some old
        preferences code from commonheader.jsp into it.  This also
        means that instead of using ${prefTimeZone} you would use
        ${prefs["TimeZone"]} in your variables.  This is far more
        extensible and future-proof than before.  The HttpSession
        now gets a Preferences object under the name "prefs".  There
        are also some utility methods in the Preferences class which
        abstract this away.  (It's also a lot faster because we do
        not parse the cookie every single time.)

        * [Bug 63]: The default eclipse coding style file now
        has .xml suffix.

        * Checkstyle config under doc/eclipse also now gains a .xml
        suffix.

2007-06-14  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.85

        * Bug fix: Bug 58, BreadcrumbsTag.java does not compile under JDK 6

2007-06-13  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.84

        * Bug fix: Bug 8, Multiple spaces in page names are not cleaned

2007-06-11  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * Added Finnish localization.  No version bump, as there
        is no functionality change.

2007-06-11  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.83

        * Fixed blocking IE javascript bug.

2007-06-11  Christoph Sauer (sauer@hs-heilbronn.de)

        * 2.5.82

        * Added German localisation.

        * Added missing i18n tags in PageInfo and UserPreferences

2007-06-10  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.81

       * Fixed a couple of localization issues (diff tab
       was not localized properly).

2007-06-09  Dirk Frederickx (dirk.frederickx@gmail.com)

       * Several XHTML STRICT compliance issues fixed.

2007-06-09  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.80

       * Refactoring of SubmitOnce functionality, such that is doesn't harm
       when javascript is off. Wiki.SubmitOnce() prevents you from pressing
       submit buttons multiple times.
       Editing is now possible (and login etc.) while javascript is off.
       (ref. http://bugs.jspwiki.org/show_bug.cgi?id=3)

       * Added experimental GroupTab.

       * Info tab added to Upload.jsp

       * Minor missing i18n fixed. Small css fixes


2007-06-09  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.79

       * Fixed minor issue with default template saying "go" instead
       of "find".

       * First alpha release of JSPWiki 2.6.

2007-06-09  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.78

       * Even more little fixes to remove Checkstyle issues.

2007-06-09  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.77

       * Refactored EditorIteratorTag; Added editor changes
       to the UserPreferences.

2007-06-09  Dirk Frederickx (dirk.frederickx@gmail.com)

       * Info tab is back, now making use of the new tab url parameter.

       * Stylesheets of the Smart and OrderedList skins have been refactored.

       * Submit of the quick Navigation menu now defaults back to the
       advanced Search page. The same applies to clicking the looking-glass icon.

       * Upgraded to mootools v1.11

2007-06-05  Christoph Sauer (sauer@hs-heilbronn.de)

       * 2.5.76

       * JSPWiki now supports WikiCreole 1.0:
       Checked in CreoleToJSPWiki renderer plus CreolePageFilter.
       This will allow users to operate JSPWiki in WikiCreole mixed mode.
       see http://www.wikicreole.org for more infos about WikiCreole.

2007-06-03  Dirk Frederickx (dirk.frederickx@gmail.com)

       * Same version

       * Progress bar fixed to run on Safari or Opera as well.
       It uses now css style visibility:hidden iso display:none.

       * Minor css fixes.

2007-06-04  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.75

       * JSON interface now actually checks whether the user has
       permission to call the methods.  This was a relatively major
       security hole... :-)

       * Performance optimization to JSONSearch.

2007-06-03  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.74

       * Remaining patches from David to FCK editor support.

2007-06-03  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.73

       * In-page Upload Progress Bar has been added based on jsonrpc backend.
       (i'm not yet 100% sure on the cross browser compatibility - can anybody
       check this on ie win ?)  This replaces the Progress.Popup jsp.

       * Cookie handling fixed. Bug caused text-area size to be mixed up
       with font size.

       * New sort-icons added. Sortable tables have a better visibility now.

2007-06-02  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.72

       * D'oh, David's patch didn't make it completely to CVS.  Now
       it should be there.

2007-06-01  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.71

       * Added UserManager.JSONUserModule

       * Fixed Admin.jsp such that it can no longer be invoked
       accidentally (don't expect it to be available in initial alphas).
       Turn on "jspwiki-x.adminui.enable=true" to see how it works.

       * Added initial, non-functional user management tab in Admin.jsp.

       * Added new AjaxWiki object to jspwiki-common.js to simplify AJAX
       calls (mootools is nice, but their AJAX API is insanely complex).

       * Added Murray's patch to enable event monitoring.

       * Added David Au's patch to fix remaining issues in FCK integration.

       * fckconfig.js: Disabled 'Insert Flash' button.

       * FCK.jsp: Fixed issue where image attachments would not be displayed
       when accessing JSPWiki via https.

       * PluginContent.java: Fixed issue where plugin error messages were
       appearing in FCK's editor area.

       * WysiwygEditingRenderer.java: Fixed issue where pagenames were
       appearing in their URL-encoded format in the href.

       * XHtmlElementToWikiTranslator.java: Beautify the generated wiki markup
       by printing a newline character after a linebreak. Fixed issue when
       generating wiki links with spaces in the pagename.  Don't print a
       extraneous space after a link or an image anymore.

       * WysiwygEditingRendererTest.java: Added tests for pagenames with
       spaces.

       * HtmlStringToWikiTranslatorTest.java: Fixed several unit tests broken
       by this latest set of changes.


2007-05-30  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.70

       * Many, many little fixes to remove Checkstyle issues.

       * Removed the two-argument constructor from GroupPrincipal
       and its associated "wiki" field. This interacted in a
       very subtle way with LocalPolicy to prevent GroupPrincipal
       privilege grants from being processed correctly. We
       concluded that this "feature", while intended to be used
       with multi-wiki environments, was fatally broken from the
       start. This change is purely "under the covers" and users will
       not notice the difference or need to do anything special.

       * Minor tweaks to SessionMonitor and AuthorizationManager
       that should slightly reduce memory leak potential.

       * Introduced a new exception called DecisionRequiredException
       that denotes when an operation cannot complete because
       a person must make a decision. It is thrown by WikiEngine.saveText()
       and UserManager.setProfile().

2007-05-29  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.69

       * Renamed TEST plugin as Test to be more in line with
       Java class naming conventions.  Updated jspwiki_module.xml
       to still use TEST as an alias.

       * Tiny tweaks to some tests, who should now tell you
       what to do if they cannot connect to a database.

2007-05-29  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.68

       * Fixed a bug in the Ant script that were causing tests
       to refuse to run sometimes because of an (erroneous)
       Hypersonic error.

       * As of this build, we have eliminated the need to sign
       JSPWiki JARs for 95% of most users' deployments. The only
       case where you need to sign them, now, is when you wish
       to create a JVM-wide, consolidated security policy. We have
       retained an Ant target "signjar" for that purpose. If you
       are upgrading from an earlier version of JSPWiki and are
       using a customized policy, however, you MUST MUST MUST
       remove any "signedBy jspwiki" and "keystore" references,
       otherwise JSPWiki might act odd.

       * The container-specific/JVM-wide parts of the Java
       security policy have been moved to a new file,
       etc/jspwiki-container.policy. This is NOT bundled into
       the WAR because it isn't needed there in any event...

2007-05-28  Dirk Frederickx (dirk.frederickx@gmail.com)

       * SMART skin updated. Few bugfixes

2007-05-27  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.67

       * WeblogPlugin now considers ACLs - if the user does not have
       view permission on an entry, it's ignored on display.  Also
       refactored the WeblogPlugin slightly to be more legible.

       * 2.5.66

       * Added "url" parameter to TabTag to allow for Javascript-less
       tabs.

       * Removed WikiEventManager.WikiEventDelegate.m_client field, as
       it was not used anywhere.

       * UploadTemplate.jsp now uses the "url" parameter so that it's not
       possible to get broken URLs anymore (i.e. it looks just like a regular
       page view, but the URL says "Upload.jsp").  This would be pretty
       confusing to an user if you sent the wrong URL in email, and the
       recipient didn't e.g. have access to Upload.jsp, but did to Wiki.jsp...

       * Added doc/eclipse/jspwiki-checkstyle Checkstyle Eclipse preferences.

       * Added patch from Juan Pablo Santos Rodriques to add i18n targets
       to build.xml.

2007-05-26  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.65

       * Lots of little fixes for bugs FindBugs found.

2007-05-26  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.64 - 4th Brushed Template commit (still more to come)

       * Font size fixed. Various css enhancements. Skins not yet finished.

       * Enhanced Find page, including search scope (author, pagename, attachement),
       and on/off checkbox for find details. Find page is now ajax driven, but also
       functions properly when javascript is off.

       * Edit textarea is resizeable, with a cool drag effect.

       * GoToBottom and GoToTop links have icons instead of >> and <<

       * Refactoring of Collapse and CollapseBox. New icons (+ and -) are being used.

       * Bugfixes on Tips JSPWiki style

       * Test Plugin added, to enhance use of JSPWiki variables.
       EG you can now use [{TEST name="context" match="edit"  ...some body... }]
       for specific content in your leftmenu.
       More info at http://www.jspwiki.org/wiki/BrushedConditionalPlugin


2007-05-25  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.63

       * Fixed a couple of typos in default template (thanks to Frank Fischer).

       * Fixed a couple of typos in code (thanks to Murray Altheim).

       * Fixed HTML editor crashing when editing (thanks to David Au).

2007-05-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.62

       * Added CookieAuthenticationLoginModule.  This module stores
       an UID in the user's browser, and automatically logs the user
       in, if the cookie exists.  This can be a security hazard, so
       it is a good idea to disable it in jspwiki.jaas, if you are
       worried about local users being able to spoof identities.
       For this reason, it's by default disabled in jspwiki.jaas

       * Modified LoginContent.jsp to contain "Remember me?" checkbox.

2007-05-20  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.61

       * Fixed the last of the failing JWebUnit tests. Also added a new one
       that verifies that profile renaming operations correctly re-set group
       memberships and page ACLs.

2007-05-20  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.60

       * New, improved SpamFilter with Captcha recognition, if we
       suspect you to be a spammer.  Captcha system is currently based
       on Microsoft Research's Asirra, though we will probably want
       to make it pluggable.  I have to admit that this required
       far too much surgery in Edit.jsp to be nothing but a hack,
       but I have to get it off my hard drive.  In addition,
       commenting does not work, if spam is detected.

2007-05-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.59

       * Again, a number of CheckStyle issues fixed.

       * Switched to new HttpMultipartRequest library (2.00b9)

       * Added upload progress bar.  Unfortunately, it's still kinda
       kludgy, but we'll try to fix it.  The backend stuff works; it's just
       the UI which looks like a brick of legos built by a two-year old.

       * New package: com.ecyrd.jspwiki.ui.progress, which manages different
       kinds of progress systems.

2007-05-14  Dirk Frederickx (dirk.frederickx@gmail.com)

       * i18n default.properties included, inline with last BrushedTemplate commit

2007-05-11  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.58 - 3nd Brushed Template commit (still more to come)

       * Quick Navigation box has been refactored and now uses the new RPC-JSON in the backend.
       Search icon added.

       * Update of all Editors, including FCK and WikiWizard. (i18n alignment)
       you can now also use wysiwyg editors in the Comment.jsp. There is still a
       widht/heigh bug in the combination WikiWizard & FireFox (visible in Comment.jsp)

       * Font-size is based on the default browser settings. For FF this is pretty large.
       You can now adjust the font-size in the UserPreferences.

       * Many bugfixes: e.g cookie handling.


2007-05-13  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * Installed "FindBugs" and "Checkstyle", and found about 1500
       problems.  This update fixes a number of minor code style issues.
       No functionality changes, therefore no revision bump.


2007-05-11  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.57 - 2nd Brushed Template commit (more to come)

       * Remove Info tab from all screens, as it causes overload on the wiki server,
       but also to avoid confusion when similar screens are served from different URLs.
       The info page has back it own existence, with small optimalisations.

       * Mootools library upgraded to v1.1, just released

       * Added code prettifier from Google. (use %%prettify around code blocks)

       * Several smaller refactorings on jsp's and i18n default.properties
       The new more-info menu gets replaced by dropdown when browser has javascript on.

       * Bugfix on numberformat reported by Frank Fisher.
       See http://www.jspwiki.org/wiki/BugAttachmentAndInfoTabsAreBlank


2007-05-08  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.56

       * Tiny refactorings all over the place; removing unnecessary
       imports, renaming fields, removing compiler warnings,
       that sort of stuff.

       * Removed jmxri.jar and jmxtools.jar from the distro - since
       we require 1.5 anyway to compile, there's not much point in
       putting them in here.  Most J2EE containers already ship
       with a JMX implementation anyway.

2007-05-08  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.55

       * Tiny optimization for PageManager, improving the performance
       for pageExists(String,int), if CachingProvider is in use.
       This should help considerably in listing page histories.

2007-05-07  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.54

       * Several performance optimizations, including:

       * Added PermissionFactory, which caches the permissions using
       a WeakHashMap.  Creation of PagePermissions is relatively expensive
       due to permissions parsing, so this should help a lot.  All routines
       should be using the PermissionFactory.getPagePermission(), if possible.

       * Refactored AbstractCommand constructor so that it no longer uses
       String.replaceAll(), which is a very expensive operation due to
       regular expressions.  It's still expensive, but the biggest pain
       point is now resolved.

       * InfoTab just lists ReferringPages one deep - three-level deep nesting
       ended up using something like 30% of all CPU power on a moderately
       link-heavy page.

       * Bug fix: if the user updated his account (e.g. by requesting a new
       password) AND his account was created in the old days when
       XMLUserDatabase was using platform default formatting for dates,
       the dates were in different formats, causing XMLUserDatabase to
       behave irrationally.

       * ReferredPagesPlugin now allocates a bigger buffer for creating
       html to avoid allocation overhead.  Ditto for TabbedSectionTag.

2007-05-06  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.53

       * Changed the behavior of the UserDatabase and GroupDatabase classes
       so that the save/delete methods are atomic. Consequently, the
       commit() methods in these classes are deprecated and will be removed
       in a future release. The reason for this change is simple: the
       commit() methods made no sense and were never *not* used. Also, added
       a new method, rename(), that permits renaming of profile login names.
       References to commit() were removed from all classes, including
       test classes.

       * Recently added status flags for UserCheckTag were moved to
       UserProfileTag and renamed. The new property values are
       "canChangePassword" and "canChangeLoginName" and are used in
       ProfileTab.jsp to selectively display input fields. These
       properties also allow negation too (e.g., !canChangePassword).

       * UserManager receives final tweaks to allow profile renaming.
       Modified ProfileTab.jsp slightly to accommodate this new feature.

       * Minor de-stringification and anal-retentive i18n tweaks.

       * Fixed several failing web unit tests. A few still fail, though.

2007-05-05  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.52

       * Fixed TemplateManager.listSkins() so that it returns only
       directories, not everything.

       * Added SearchManager.JSONSearch.findPages(), though be warned that
       it can be really slow.  An API change to SearchProvider needs to be
       done before this can be fixed.

       * Reformatted ChangeLog to word wrap at column 80 to make it more
       readable...

       * A major commit of new Admin.jsp and AdminTemplate.jsp and all the
       related paraphernalia.  It's not yet complete, but the framework is
       getting there.  Due to the use of JMX, JSPWiki now requires JDK 1.5
       to compile (though it should happily continue to run under 1.4 as
       well).

2007-05-03  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.51 - Brushed Template incorporated.

       * Bulk commit of Brushed Template. Expect things to be broken :-)
       JSPWiki now has a tabbed-user interface, skins, slimbox attach-viewer,
       improved jspwiki-styles suchs as table-filters, accordions, tips,
       etc. etc...  Look 'n feel is still very ikea like.  Read the
       jspwiki.css to change color scheme.  Additional menu items are now
       visible via a "More...." dropdown.

       * Javascript is based on the mootools library.

       * Many JSPs are now driven by JSTL's EL. Not yet 100% completed.

       * Only plain editor has been updated. No work done yet on WikiWizard,
       FCK

       * The JSPWiki template has been tested on safari and FF.
       Feedback on IE 6.x and 7.x. is appreciated.

       * RecentChanges plugin now sets colspan correctly. (formatting of
       recent changes page)

       * Two skins added: Smart and OrderedList. These skins are not yet
       tested 100%.


2007-05-01  Andrew Jaquith <andrew AT freshcookies DOT org>

       * Enhancement: checked in back-end code that removes the restriction
       on changing login names and user names ("full names") after
       registration. To do this, UserManager emits a new WikiSecurityEvent
       called PROFILE_NAME_CHANGED that signals when the login name or user
       name changes. PageManager and GroupManager listen for this event,
       and will make all appropriate changes to page ACLs and groups that
       contain the old user name(s). The front-end changes (JSP tweaks)
       are nearly finished and will be checked in shortly.

       * Added a new method for AclManager, setPermissions(), that persists
       Acls. The DefaultAclManager (which extracts Acls from wiki page markup)
       implements setPermissions() by injecting the [{ALLOW ....}] markup
       into the wiki page.

       * Synchronized thread-sensitive methods in the AclImpl/AclEntryImpl
       class.

2007-04-28  Andrew Jaquith <andrew AT freshcookies DOT org>

       * Enhancement: user profile JSPs no longer request a distinct wiki
       name when a user registers. The wiki name is now computed automtically;
       it is the user name without any whitespace. This change should make
       registration even easier.  In the various user manager/database
       classes, UserProfile/DefaultUserProfile.setWikiName() is hereby
       deprecated and will be removed in a future release. However,
       getWikiName() remains, as does the UserDatabase method findByWikiName().
       The UserDatabase classes do not change their public APIs, and they
       still persist WikiNames so that they can be searched. However, when
       UserManager loads a profile from the UserDatabase, it always re-computes
       the wiki name.

       * Tweaked i18n resource file to remove references to "wiki names" in
       favor of just plain old "names." Typographically correct curly quotes
       were substituted wherever needed.

2007-04-23  Christoph Sauer <sauer AT hs-heilbronn DOT de>

      * 2.5.48 - Bugfix

      * Bugfix: NullPointer Exception on initReferenceManager, reason
        was that it indirectly uses the filterManager -> m_filterManager
        has to be initialized before.


2007-04-23  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.47 aka the JavaMail refactoring release

       * Enhancement: To increase security, MailUtil gains the ability to use
       container-managed JNDI JavaMail session factories, in addition to the
       standalone factory configured via jspwiki.properties. JNDI is now the
       preferred method of obtaining mail sessions, and will always be attempted
       first before falling back to the stand-alone method. See the JavaDocs
       for MailUtil. All of MailUtil's internal code, test properties
       and JavaDocs were also totally refactored. A sample JNDI block for JavaMail
       was added to web.xml; it is commented out by default.

       * Enhancement LostPassword.jsp now uses POST for form submission.

       * Enhancement: Profile registrations now automatically trigger an
       e-mail confirmation to the user, if an e-mail address was supplied.

       * Bug fix: page-save workflow does no longer sends rejection SimpleNotifications
       to users unless they have already authenticated when they save the page.
       Also, the submitter's authentication status is added as a Fact for the
       approver to consider.

       * WorkflowBuilder.buildApprovalWorkflow now interprets a null value for
       the rejectedMessageKey parameter as meaning "don't send a notification"
       upon rejection.

       * MailTest moved to the *.util package, which was where it belonged.

2007-04-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.46 - my birthday release!

       * PermissionTag now allows a list of permissions just like
       CheckRequestContextTag, as well as negative permissions.  Based
       on an idea by Dirk Frederickx (whose last name I will learn to
       spell one of these days).

2007-04-17  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.45

       * Checked in workflow support for user profile creation. Now, new profiles
       can be routed for approval before they become active. The name of the user,
       role or group that approves new profiles is contained in jspwiki.properties
       under the property jspwiki.approver.workflow.createUserProfile. If not
       supplied (the default), user profiles are created without requiring approval.

       * UserManager receives a proper unit test, at long last. We test with
       approval workflows turned on and off.

       * Minor bug fixes to the Fact and WorkflowBuilder classes.

2007-04-15  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.44

       * Found the b*****d. VariableManager makes an unsafe assumption
       that WikiContexts will always have an associated request and HttpSession.
       This isn't always true with a WikiContext passed along in a Workflow,
       which will come from an earlier point in, and from a potentiallly different,
       Http session. We now check explictly for the presence of the HttpSession
       before querying it for wiki variables.

2007-04-15  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.43

       * Many incremental changes to the workflow package to increase
       ease of use. A new WorkflowBuilder class includes a factory method
       for composing simple approval workflows. SaveWikiPageWorkflow and
       the workflow.impl package goes away, and instead the workflow code
       for saving pages moves to inner classes in PageManager (it is now
       much smaller because it uses WorkflowBuilder).

       * Unit tests for the page-save workflow now simulate PageFilter failures
       so that proper propagation of exceptions is verified. Should help Janne a lot.

       * Workflow.jsp receives minor UI tweaks, notably the replacement of submit
       buttons with a JavaScript-driven dropdown. The default.properties
       localization file receives properties in preparation for the new user profile
       workflow (not checked in yet, because it isn't debugged).

       * The UI for approving workflows currently contains a nasty, intermittent NPE
       that is resisting my best efforts to debug. It usually occurs when selecting
       the 'approve' option. It results in Decisions being removed from the workflow
       inbox, and the page does save correctly -- so it is essentially "cosmetic".
       However, it's ugly and we need to fix it. Assistance is most welcome.

       * If you are a US citizen, it is that time of year again. Many happy returns.

2007-04-09  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.42

       * Modified the PagePermission implies() algorithm so that the "rename"
       permission no longer implies "modify" (or "upload"). This will allow
       separation of uploading attachments from page edit/rename actions.
       Thanks to Tim Koop for the suggestion.

       * Added WikiContext.MESSAGE to support workflows and other processes
       that need to send a non-exception-related UI message in response
       to user events. Also added a top-level Message.jsp and template.
       Changed DisplayMessage.jsp slightly to use the <c:out> tag, which
       gives us protection against cross-site scripting.

       * Added 'throws WikiException' to all methods meant to be
       implemented by workflow subclases: notably Step.start(),
       Decision.decide(), Workflow.start()/restart(). Now, if these
       methods encounter exceptions they will abort the workflow and
       propagate the exceptions to callers.

       * Many tiny little Javadoc fixes.

       * Fixed failing PageRenamerTest.

2007-04-10  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.41

       * Added David Au's new set of patches for WYSIWYG editing.

       * WikiEngine.scanWikiLinks() no longer renders the page; it just
       parses it.  This should provide some speedup at startup.

       * Changed the default template resource bundle from
       webdocs/templates/DefaultResources.properties to
       etc/i18n/templates/default.properties (more logical).

       * Added class remapping ability.  See etc/ini/classmappings.xml
       and ClassUtil.java for further information.  This is not yet a complete
       feature, but it brings some simple AOP to JSPWiki.

       * Javascript is now localized.  The key-string mappings reside in
       templates/<template>.properties; and the correct method to call is
       "<key>".localize(args).  Thanks to Dirk Frederickx for the help!

2007-04-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * Added a number of unit tests to AllTests runs; they were not being
       properly included, so a number of them were not run during a regular
       unit test run...

2007-04-09  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.40

       * Fixed AuthorizationManager failure to add attachment
       when jspwiki.security=off. [BugAddAttachmentFailsWithContainerAuthentication]

       * Upgraded freshcookies-security lib to 0.54. This new version accepts
       a user-supplied charset for parsing security policy files.
       Previously, PolicyReader defaulted to the platform default encoding.

       * AuthorizationManager, when it initializes, supplies the default
       JSPWiki encoding to the updated freshcookies PolicyReader class.
       Many thanks to Harry Metske for identifying the need for this, based on his
       experiences using JSPWiki on a platform where EBCDIC is the default.
       (Which is probably a mainframe; yegads.)

       * Fixed bug that was causing Workflows to be added multiple times
       to the "history" queue; this was caused by recent changes to the
       WikiEventManager classes.

2007-04-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.39

        * Fixed bug in SessionsPlugin which threw an Exception
        at startup.  Reported by Harry Metske.

        * Greatly improved SpamFilter logging.  There's a new SpamLog
        which can be used to track all changes; accepts and rejects.

        * SpamFilter no longer adds Akismet-rejections to the temporary
        ban list.  Akismet is non-deterministic, so it's kinda annoying
        for users who just quite don't know why this is happening.

        * Fixed also some dumb bugs in the way SpamFilter was
        computing the delta.

2007-04-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.38

        * Added Note plugin from John Volkar.

        * Added PAGE_REQUESTED, PAGE_DELIVERED events fired by
        WikiJSPFilter.  Unfortunately, no such things are fired for
        attachments.  Note that attaching to these events is very noisy.
        Thanks to Murray Altheim.

        * Renamed TestHtmlStringToWikiTranslator to
        HtmlStringToWikiTranslatorTest to conform to other tests.

2007-03-31  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.37

        * Forward ported fixes from 2.4.102

        * Fixes issue with a number of plugins failing due to wrong
        initialization order.

        * Moved everything pre-2.4.0 to OldChangeLog.  Oh, the memories...

2007-03-29  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.36

        * Moved FilterManager initialisation in the wiki engine to the bottom,
          so that all object references to modules are already available to
          a page filters initialize method. This is important to register
          event listeners there.

        * Added a destroy method to the PageFilter interface. Destroy is
          called upon engine shutdown. You can use this to close global
          resources that you opened in the PageFilters initialize method.

2007-03-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.35

        * Refactored the XML-RPC implementation a bit to provide proper
        authentication/authorization.

        * Upgraded to Apache XML-RPC 2.0.1.

2007-03-24  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.34

        * Added Mikkel Troest's patch to AttachmentServlet to fix issues
        with uploading and file size.

        * Added DynamicAttachments and their generation.  You can now go
        and build attachments which do not exist in the repository, but
        are generated on-the-fly.  See the attachments package and related
        documentation.

        * Bug fix: [open bugs] would not be recognized as wikipage OpenBug.

        * Changed ETag generation to make it unique per page.

2007-03-19  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.33

        * Changed signature of sendMail in MailUtil from using WikiContext
        to use WikiEngine.  WikiContext was not needed. This enables us
        to use the mail util, even if no Wiki Context is available.

2007-03-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.32

        * Fixed a bunch of Eclipse warnings; hopefully no functionality
        changes.

        * Fixed BugInlineImagesCaseSensitive - inline image lists are now
        case insensitive (yay!).  Thanks to Harry Metske.

        * Fixed BugMultiWikiCreatesRSSFileInWrongPlace.  Thanks to Harry Metske
        again.   Now, if the rssFile property is set to an absolute path, it is
        used instead of a relative path to the wikiengine home.  This allows you
        to have separate paths for multi-wikis.

        * Fixed BugReferringPagesPluginLinksNonExistingPages, thanks to
        Candid Dauth.

        * Implemented IdeaRemoveDuplicatesFromSessionsPlugin from Harry Metske.

2007-03-19  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.31

        * Fixed Bug with LostPassword.jsp: If you set access priviledges for
          a wiki completely private (even view) then you where not able to restore
          the password since LostPassword.jsp required login.

2007-03-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.30

        * Fixed BugReferenceToRenamedPageNotCleared

        * Fixed BugTableHeaderNotXHMTLCompliant

        * Fixed BugInitializablePluginNotInitialized

        * API Change: The signature of PageFilter.initialize() now
        also includes the WikiEngine.  This was necessary, because otherwise
        the initialize() -method was essentially useless for most use
        cases.

        * Added ParserStagePlugin interface.  This allows a plugin to be
        executed even during parsing of the wiki page, not until the render
        stage.

        * Added David Au's patches to get the FCK support back up to speed
        again.

2007-03-17  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.29

        * Forward ported fixes from 2.4.100.

2007-02-28  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.28

        * Improved MailUtil: Added authentication support, so
          that you can use mail servers that require an account
          (the OpenRelay issue...). You now also can indicate
          a different smtp port. Changed LostPassword.jsp accordingly.

2007-02-25  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.27

        * Upgraded bundled log4j to 1.2.14; freshcookies-security to 0.51.

        * Fixed 2 failing RPCHandlerTest tests by counting changes relative
        to beginning of test, rather than absolute changes.

        * Changed all JSP taglib declarations to use JSP 2.0-compatible tags.
        Also upgraded jstl.jar and standard.jar to JSTL 1.1 versions. Note:
        if you are a template developer, you should change your taglib
        declarations as follows:

         New:
         <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
         <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

         Old:
         <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
         <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

2007-02-24  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.26

        * Major enhancement: replaced JSPWiki's dependency on the global,
        JVM-wide security policy with a "local policy" that is always
        read from WEB-INF/jspwiki.policy. If you have a JVM-wide policy,
        the local policy will supplement it. The practical upshot of this
        change is that the most common configuration challenge that most
        first-time admins face (why won't any pages display?) is gone,
        and gone forever. No more fiddling with the java.security.policy
        property! The syntax for the local policy is exactly the same
        as what it's always been; but now it Just Works instead of
        Mostly Works.

        * Fixed bug in WebContainerAuthorizer introduced by change to
        Java Servlet API 2.4. The parsing class now explictly includes
        namespaces in XPath searches. This was not something we needed
        to worry about with 2.3 (which used a DTD). The result of this
        problem was causing container-managed logins to fail.

        * Fixed failing unit tests WebContainerAuthorizer; web tests
        CommonCustomTests, CommonTests.

        * Minor enhancement to WikiSession now allows full use of non-JSPWiki
        supplied JAAS LoginModules in the JSPWiki-custom configuration. Previously,
        we considered a user to be authenticated only if a LoginModule had added
        Role.AUTHENTICATED to the Subject's principal set. This is clearly
        unreasonable for LoginModules that have no knowledge of JSPWiki, such
        as Sun's supplied modules or third-party modules used for LDAP
        authentication. Now, we consider a user authenticated if they are
        not anonymous and not asserted, and we lazily add Role.AUTHENTICATED
        in these cases, after login.

        * Bug fix: WikiEventManager refactoring in 2.5.24 caused duplicate
        listeners to be added in some cases. This has been fixed.

        * The security policy file has been simplified to remove redundant
        grants that don't vary across roles. It should be simpler to read
        and understand.

        * Did I mention that local security policies are a big deal?

2007-02-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.25

        * Added SisterSites.jsp to support the SisterSites standard.

2007-02-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.24

        * Forward ported features from 2.4.94, including the WatchDog,
        and the new, faster WikiEventManager.

2007-02-18  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.23

        * Added David Au's patches to re-enable FCK.  All you now need
        to do is to install FCK, and enable it in the ini/jspwiki_modules.xml.
        This also added a new mode for RenderingManager: WYSIWYG_EDITOR_MODE,
        which will not render plugins (except some), but keep them in plain
        text format.

        * web.xml now explicitly declares Java Servlet API 2.4.

        * Added AdminBeanIteratorTag

        * Bug fix: putting a plugin or a variable on the first line would
        cause a crash, if there were more than one paragraph on the page.
        Thanks to Terry Steichen for debugging.

        * There is now a rudimentary plugin-based administration interface
        in admin/Admin.jsp (and the corresponding template files).  It does not
        quite work yet, and it's definitely unstable, but it's been submitted
        to get some comments.  The idea is that you can declare in your
        jspwiki_module.xml an "adminBean" class, which then offers an
        administrative interface to your plugin.  As an example, a
        PlainEditorAdminBean is implemented (partly).

2007-02-05  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.22

        * Added variable mechanism in property files. You now
          can declare a variable as a regular property with
          prefix 'var.' and then use it with the '$' prefix
          in other property values within the property files cascade.

        * Factored out property reading from WikiEngine into a new
          class called PropertyReader, since it now represents a distinct
          concept. Added UnitTest for it.

2007-02-05  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.21

        * Added possibility to specify cascading properties
        in the context-mapping for multiple wiki setups. Added
        method to WikiEngine that will check for
        jspwiki.propertyfile.cascade.x context properties, where
        x is a number from 1 to n. Properties specified in those
        files will overwrite values specified in the default jspwiki.properties
        file or a properties file of a lower cascade.
        This is based on an idea by Olaf Kaus, see [JSPWiki:MultipleWikis]
        discussion.

2007-01-30  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.20

        * Minor tweak to the i18n properties file to add in some whitespace
        between words for several messages (DefaultResources.properties).

        * Corrected a SessionMonitor failure to correctly stash a WeakReference
        in the user's HttpSession, which was causing downstream ClassCastExceptions.
        Thanks to Marc Pateet for isolating the issues. I haven't tested this
        fix extensively, so please let me know if it fixes (or does not fix)
        the issue.

        * I continue to be flabbergasted at the speed at which my new dual-core
        MBP runs the 737 JUnit tests in the JSPWiki test suite: about 2min 45s,
        compared to 7min on my old machine. This has no place in a ChangeLog, I know.
        But still.

2007-01-29  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.19

        * Synchronized with 2.4.91

2007-01-08  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.18

        * Bug fix: fixed DefaultResources.properties trailing space in multi-line
        property that was causing Role and Group memberships on the Profile
        tab of UserPreferences to fail to display. If you were wondering why
        UserPrefs wasn't showing group memberships -- well, it's fixed now.

        * Bug fix: PageActions.jsp now links to UserPreferences as a JSP, not
        as a wiki page. Also gains a Workflow link for authenticated users.

        * Minor enhancement: WikiEngine gains an accessor for the DifferenceManager
        (getDifferenceManager). This is used by the workflow classes.

        * Minor enhancement: To support workflow, WikiContext gains new a context,
        WORKFLOW. It does not require special privileges to access. WikiCommand
        gains a corresponding WORKFLOW command.

        * Second major checkin of the workflow package. The API is mostly stable,
        but it should still be regarded as volatile. Workflow now includes
        a working user interface (Workflow.jsp). UI has a workflow "inbox" (for
        decisions a user has been asked to make) and an "outbox" (for workflows
        a user has started). Users must be authenticated to see their workflows.

        * 'SaveWikiPageWorkflow' is now operational. It provides moderation for
        saving wiki pages, and is turned off by default. See jspwiki.properties
        for configuration guidelines.

        * To test workflow, enable SaveWikiPageWorkflow via jspwiki.properties.
        Note: a cosmetic NullPointerException occurs in some cases after approving
        page saves; this does not prevent the actual page save. This will be
        fixed very soon. Other than this, approve/deny/abort features work nicely.

        * TestEngine gains accessors for the 'admin' and 'Janne' sessions.

2007-01-02  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.17

        * Happy New Year everyone!

        * This release adds a significant new package for modeling
        workflow operations (com.ecyrd.jspwiki.workflow). This package allows
        arbitrary combinations of "steps" to be modeled, with support for
        unlimited branching and support for human intervention. The core class
        is the Workflow class. Workflows are composed of Steps, which can be
        Tasks (which run uninterrupted) and Decisions (which require input
        from named Principals -- users, roles or groups). This initial checkin
        is well-tested and solid code, but the API should not be considered
        stable... yet. There are NO user-interface classes as yet.
        Additional front-end JSPs that provide a UI will follow in the coming weeks.

        * The initial sample Workflow subclass, checked in today, implements moderated
        page changes (SaveWikiPageWorkflow). It has an undocumented configuration
        interface, which I will detail more fully when the UI is closer to completion.

        * See the (very complete) JavaDoc for more details. I'm VERY psyched
        about this new capability, and once we get flesh out the interface you all
        will be too!

        * Enhancement: changed throws clause in I18NManager methods.

        * Enhancement: added new dir (etc/i18n) and a resource file called
        CoreResources.properties for message strings for the core JSPWiki packages
        (that is, not plugins, tags or JSPs).

        * Enhancement: added new event class, WorkflowEvent, to support workflow
        create/run/pause/restart/halt/complete events.

2007-01-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.16

        * If there was no default locale set, I18NManager.getBundle()
        would fail.

        * Attachment links with new character set work now.

        * Section titles are now returned back to 2.5.14 behaviour.

        * Some tiny i18n work on TableOfContents.

2006-12-31  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.15

        * English resource files had some &apos;'s in them.  Replaced
        with &#39;.  Turns out that &apos; is an entity in XML, but
        not in HTML - and therefore IE does not recognize it.  Fun,
        but for once IE is correct in their standards support.  Found
        by Harry Metske.

        * The LinkParser would not boot jspwiki.org content due to
        being too strict: ("[]") would cause a RuntimeException being
        thrown, which would not be caught until a very high level.
        Fixed LinkParser to use a new declared exception "ParseException".
        Reminder to self: RuntimeExceptions are evil.

        * This is a biggie: increased the number of allowed characters
        in a wikiname.  Now the list reads " ()&'*+,-=._", so yes,
        spaces are allowed now.  Added MarkupParser.wikifyLink() to
        keep compatibility with previous versions, and also enhanced
        CommandResolver to be able to figure out old-style links.
        Please be aware that this is not yet a final set of characters,
        so using this version may cause a legacy you might have to
        deal with it painfully later on.  Also, note that the code is
        largely untested right now, and many unit tests are failing
        right now, so consider this now "bleeding edge".  Please give
        feedback on what the proper set of characters should be.

2006-12-29  Janne Jalkanen <jalkanen@ecyrd.com>

        * v.2.5.14

        * Bug fix: 2.5.9 was breaking unit tests badly, thanks
        to a missing null check.

        * Bug fix: Any markup in the first paragraph would break
        paragraph detection in JSPWikiMarkupParser.parse().
        Reported by Murray Altheim.

        * Added patch from Murray to add the "target" attribute to
        the Image plugin.

        * CommentedPropertiesTest no longer requires JDK 1.5.  Thanks
        to Murray for spotting this!

2006-12-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.13

        * Added LinkParser class from Murray Altheim.  Thanks!
        Links now have a new, extended syntax.  You may add metadata
        to a link by adding a new bar: [text|link|attributes]. Only
        a subset of attributes is allowed, as described in LinkParser.
        This allows you to have things like link targets and link
        relations.

2006-12-26  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.12

        * Fixed bug with Login/LoginContent that was preventing
        page redirection upon login from working properly. The
        corresponding web unit tests now all work again, too.

        * Fixed minor bug in Ant Hsql database teardown task
        that would cause the test db to erroneously think the
        database didn't need starting, even if it did.

2006-12-23  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.11

        * Fixed failing auth unit tests and web unit tests.

        * Fixed compilation errors for *GroupContent JSPs.

2006-12-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.10

        * Mass commit of code from 2.4.87

2006-12-18  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.5.9

        * Bugfix in FilterManager: Filter Manager used
        getClass().getResourceAsStream( "/filters.xml" ) to locate filters.xml.
        To ensure that it reads it from WEB-INF like described in the
        documentation we have to use the same aproach like with jspwiki.properties:
        engine.getServletContext().getResourceAsStream( DEFAULT_XMLFILE );

2006-12-16  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.8

        * JSPWikiMarkupParser now exports parseToken() method, which
        can be used by subclasses to modify or change the default
        markup rendering.  There are a couple of caveats: first,
        don't forget to call super.parseToken() if you don't do
        anything; second, you might create a completely non-compatible
        version of JSPWiki with this method.  So be very, very careful.
        Note also that this is an experimental way yet, so I would
        very much like to hear feedback before we cement it to stone.

        * CreoleRenderer now correctly renders plugins and images.

2006-12-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.7

        * JSPWikiMarkupParser will now ignore whitespace between
        list bullet and list - makes no difference and produces more
        unambiguous code.

        * Added CreoleMarkupRenderer, which currently supports
        WikiCreole 0.2 syntax.  This is a highly experimental feature.
        You can't do much with it yet, since we're missing a backconverter.

        * JSPWikiMarkupParser now properly produces <p> tags for
        all paragraphs - UNLESS there is just a single paragraph, in
        which case old behaviour will follow.

        * Bug fix: DefaultResources.properties was still using some
        {0,date} strings instead of just strings.  Reported by Harry
        Metske.

2006-12-11  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.6

        * Merged in JSPWIKI_2_4_BRANCH changes up to 2.4.84.

2006-11-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.5

        * plain.jsp did not compile due to last-minute changes in
        package structure.  Reported by Juan Pablo Santos Rodriguez.

        * InternationalizationManager was not properly initialized.
        Reported also by Juan.

        * TableOfContents was using wrong resource bundle.  Reported
        by Juan.

        * LoginContent.jsp was failing, if someone localized the login
        button.  Reported by someone (remind me and I will fix this entry)

2006-11-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.4

        * Added rpc package, JSONRPCManager, and added preliminary
        support to get suggestions in plain.jsp over AJAX.  Yes,
        JSPWiki just gained AJAX support using JSON...

        * Moved AtomAPIServlet to rpc/atom under the assumption that
        nobody was using it anyway.

2006-11-21  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.5.3

        * Checked in WikiWizard 1.1:

          Major Improvements:
          - Now supports multiple file uploads
          - Speed up loading by putting config file init
            in extra thread
          - Highlighting of %% tags
          - "Mark Occurences" function similar to eclipse
          - Drag 'n Drop Interface for extension bar

          for details please take a look
          at /applets/WiWi-INF/ChangeLog.txt

2006-11-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.2

        * Synchronized with 2.4.81.

2006-11-12  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.1

        * Fixed LoginContent.jsp so that it compiles.

        * Fixed issue with PolicyLoader when the URI found had a "file:"
        in it.

        * Fixed some other issue which I can't remember right now because
        I drunk some very nice Tomintoul 27 years old single malt whiskey.

2006-11-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.0

        * Split off 2.4 to its own JSPWIKI_2_4_BRANCH stable development
        branch.  HEAD is now 2.6 development branch.

        * Mass commit of i18n code.  Almost everything is localized now,
        but unfortunately we only support English right now.

2006-11-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.78

        * A bunch of minor refactorings suggested by Aron Gombas,
        including:

        * Visibility of member variables in WikiContext have been checked -
        things were made more private, except m_request is now protected to
        help in subclassing.

        * JSPWikiMarkupParser also has visibility checked a bit to help
        in subclassing - the different link types are now protected,
        and a new factory method createAnchor() was added.

        * JSPWikiMarkupParser now checks WikiContext for overrides for
        most variables.

2006-11-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.77

        * Hopefully fixed login redirection issues when using
        container authentication.  If the user did not have permissions
        even after login, this would result in a constant series of
        redirections.

        * Added run_webtests.sh

2006-11-06  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.4.76

        * added fix from Chuck Smith so that WikiWizard.jsp now is valid XHTML:
          document.write() function in JavaScript is deprecated, instead
          document.addEventListener("DOMContentLoaded", changeWidth, null)
          is used now to modify the the DOM Tree after it is loaded.

2006-11-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.75

        * Added patch from Tomasz Szymko to fix previews when adding
        comments.  Thanks!

        * Added patch from Murray Altheim to provide timestamps in
        WikiEvents, and added a new SESSION_EXPIRED event as well.

        * Session monitor now fires SESSION_EXPIRED events.

2006-10-29  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.74

        * Improved startup a bit; now the log files should be better in
        case you have a problem in your jspwiki.properties.  It's still
        not perfect, but it's better.  The unfortunate side effect is
        that you'll start getting 404 errors instead of error messages
        when you are trying to access the site.

        * Got rid of jspInit() in all top-level JSP files.  This is a
        bit nicer and simpler all around.

2006-10-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.73

        * Patch from Neil Miller to fix PageManager which was not using
        proper getProperty().

        * AttachmentManager.listAttachments() now sorts the attachments.
        Suggested by Fabio Bonin.

        * If jspwiki.useCache was set to false, finding pages would
        not work with VersioningFileProvider, thanks to some really old
        optimization code that never got updated.  Removed optimization,
        hey presto!  It works!

        * Spam filter now includes change notes in its checks as well.

        * WikiEventSource is now gone, since it was not used for anything.
        Thanks to Murray for the heads-up!

2006-10-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.72

        * SpamFilter is now a lot smarter.  I enlisted a small guy
        called Herb, who has agreed to sit in the JAR file, and watch
        for any spam.  Log files are a bit better, too.

        * SpamFilter will now watch at consecutive modifications, and
        mark them as spam, if there are too many similar-looking
        modifications (no matter what IP they're from).

        * SpamFilter can now connect to Akismet (www.akismet.com).
        You need to get your own API key, though, and put it in the
        filters.xml config file.  Unfortunately we don't yet have
        the ability to mark "ham" and "spam".

        * ShortURLConstructor did not handle CONFLICT situations
        correctly.

2006-10-17  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.71

        * Small fix from Tomasz Szymko: jspwiki.css has information
        and error images reversed.

        * Comment.jsp did not compile.  Reported by a number of people.
        Ooops...

2006-10-13  Erik Bunn  <ebu@memecry.net>

        * 2.4.70

        * Minor mod to WeblogEntryPlugin: now accepts a 'page' parameter,
        like WeblogPlugin. Allows providing a 'new entry' link on some
        page other than the actual blog page; this may be useful e.g.
        for alternate views of a blog page.

2006-10-12  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.69

        * Added a couple of patches from Tomasz Szymko to fix a problem
        with messages from the AttachmentServlet, and a problem with
        EditLinkTag.

        * Added patch from Murray Altheim to fix a problem with
        TextUtil.replaceString() - it would be dying under certain
        circumstances.

        * Added patch from Murray to add "_bounds" parameter to the
        plugin invocation.  _bounds consists of an integer array (int[]),
        where element 0 is the start of the plugin position in the page,
        and element 1 the end.

        * Small fixes to LuceneSearchProvider.

2006-10-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.68

        * Hopefully fixed the "ACL not refreshed at startup" problem,
        reported by many people.

2006-10-08  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.67

        * Enhancement: JDBCUserDatabase will now use transactions, if the
        back-end database supports them. In addition, JDBCUserDatabase now
        nails up a single, long-running connection instead of continually
        opening and closing them. Log message verbosity expanded slightly.

        * Enhancement: GroupDatabase now has a relational database implementation
        called JDBCGroupDatabase. It supports transactions and is configured
        using a container-managed JNDI DataSource, exactly like JDBCUserDatabase.
        Unit tests and DDL setup/teardown scripts were upgraded for the
        new implementation. Sample scripts are included for PostgreSQL and
        Hypersonic.

2006-10-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * Fixed a bunch of javadoc warnings; not enough to warrant a
        version bump.

2006-10-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.66

        * Added small patch from Neil Miller to fix WikiEngine.getInstance()
        which was not properly passing its arguments.  Thanks!

        * Added patch from Murray Altheim which makes ReferenceManager and
        SearchManager to behave as EventListeners for page deletion.  Notably,
        AttachmentManager and RenderingManager do not yet fire or listen these
        events (needs fix).

        * Added PAGE_DELETED and PAGE_DELETE_REQUESTED from Murray.

        * Added patch to JSPWikiMarkupParser from Murray to make some of the
        attributes publically accessible and less magic.

        * Fixed ShortURLConstructor again for some contexts (FIND, DELETE & PREFS)

2006-10-01  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.65

        * Bug fix: fixed an issue with WikiContext that caused ACLs and policy settings to
        be ignored when accessing the default front page. This bug was introduced during
        the AAA mega-patch in July (2.4.25). Note: we still have an unrelated bug
        with ACLs not being applied the *first time* pages are loaded.

2006-10-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.64

        * WikiPage.clone() was not cloning everything; this should now be fixed.

        * Included patch from Neil Miller to make RenderingManager use the
        eventing system instead of PageFilters.  Thanks!

        * ShortURLConstructor now supports group functionality.

        * Fixed an annoying bug which appeared if saving failed for some reason
        (e.g. when SpamFilter would reject an edit): the cache would still
        contain the changed page metadata.  We now make a clone of the
        WikiPage before we attempt a save.

2006-10-01  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.63

        * WikiSession receives several under-the-hood changes to improve session
        stability. The technique used to detect session status changes now includes an
        explicit check for prior authentication; this should prevent sudden "downgrades"
        from authenticated status to asserted (cookies). User/login Principals and
        the status strings (anonymous/asserted/authenticated) are cached now, rather
        than dynamically calculated. WikiSession gains a new public method, isAsserted()
        that does what it says. Finally, WikiSession now takes responsibility
        for populating the JAAS Subject with user profile principals, rather than
        the various login modules.

        * AuthenticationManager now fires an event called LOGIN_INITIATED whenever
        the authentication status changes, signifying that the JAAS login stack
        executed (but without regard to whether it succeeded). WikiSession listens
        for this event and updates its cached principals. AuthenticationManager
        also now fires explicit events called LOGIN_ANONYMOUS and LOGIN_ASSERTED
        in addition to LOGIN_AUTHENTICATED.

        * In the name of code simplification, event support was removed from the
        Group class. It was redundant and made things more complicated. Consequently,
        GroupManager loses its GroupListener inner class, and WikiSecurityEvent gets
        rid of types GROUP_ADD_MEMBER, GROUP_REMOVE_MEMBER, GROUP_CLEAR_MEMBERS.
        If you really really need these let me know, but in the meantime the coarser-
        grained GROUP_ADD and GROUP_REMOVE will do what we need.

        * UserDatabaseLoginModule no longer populates WikiSession's Subject with
        user profile principals; this was moved to WikiSession. This should make
        pure, authentication-only login modules possible, such as for LDAP and Kerberos.
        Because authentication and user profile storage are better separated, it will
        prevent the need to subclass and hack XMLUserDatabase. WebContainerCallbackHandler
        no longer needs a UserDatabaseCallback as a result, so the callback was removed.

        * Bug fix: LoginForm now injects a WikiContext, but only if one does not already
        exist in the page context. This plugs the bug introduced in 2.4.60. Page redirection
        after login works for both container and custom authentication; the web unit
        tests now test for this condition explicitly. The fix has been tested with
        Tomcat and JBoss 4.

        * Fixed a bunch of failing auth tests.

2006-09-28  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.62

        * Fixed the fix for the login-redirection issue, patched in 2.4.60.
        "Regular" logins (those without a subsequent redirection) now work again.
        Thanks to the indefatigable Terry Steichen.

2006-09-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.61

        * Fixed a couple of failing tests (recent changes caused slight behaviour
        change)

        * Bug fix: the Wiki Event INITIALIZING is now fired after log4j is running -
        this stops about a zillion of errors in the container log file.

        * Slightly juggled with the built-in system filter priorities to make sure
        that they are executed in correct order.

        * Added a small fix to saveText() to check if it possibly fixes some problems
        with disappearing ACL lists or other metadata.  Our provider interface is
        desperately in the need of an overhaul...

2006-09-27  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.60

        * Fixed typo in SecurityConfig.jsp that caused group verification to
          report the number of "users" rather thank groups. Credit: Chuck Deal.

        * Fixed a series of related, minor bugs that caused JSPWiki to always
        redirect to the front page after login, even when instructed to redirect
        to another page. This fix also resulted in the removal of a redundant
        WikiContext creation in LoginForm. Thanks to Terry Steichen for figuring
        out where to look.

2006-09-24  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.59

        * XMLGroupDatabase and XMLUserDatabase now represent dates using
          a locale-independent, machine-independent format. To preserve backwards
          compatibility, JSPWiki will attempt to parse dates using the platform
          default format if parsing with the standard format fails. New records
          will always be saved in the standard format.

2006-09-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.58

        * Some internal reshuffling of Managers.

        * PluginManager and EditorManager now check if a module is
        compatible with JSPWiki.  You can state your own compatibility
        by declaring it in the jspwiki_module.xml file, as
        <minVersion>2.4</minVersion>, and/or
        <maxVersion>2.6.32</maxVersion>.

        * 2.4.57

        * Added change notes also to attachments

        * Attachment names are now also beautified (though just the
        page name part).  This should help the problem when RecentChanges
        plugin overflows.

        * Cleaned away a few compiler warnings

        * Improved some PluginManager javadocs

        * BasicAttachmentProvider has now more sanity checks and should
        no more throw wild NPEs at startup.

        * Fixed
        BugLuceneSearchProviderNotReadJspwiki.lucene.analyzerFromConfiguration
        Thanks to Ekkasit Takoungsakdakul for pointing this one out!
        (And I am very sorry I did not notice that bug report earlier.)

2006-09-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.56

        * Added patch from Kalle Kivimaa to fire the event with the
        proper principal at logout.  Thanks!

2006-09-15  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.55

        * Added patch from Joseph Schmigel to recognize IP
        addresses in sortable tables.  Thanks!

        * Added new icons from Murray Altheim so that we could
        get rid of all Creative Commons-licensed icons.  This was
        done so that JSPWiki 2.4 could be included on Debian.  Thanks
        heaps for the good work!

        * Reverted to previous behaviour with respect to WikiWizard:
        no longer closes applet and div with javascript, which should help
        in IE.

2006-09-12  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.54

        * Added patch from Murray Altheim to fix WikiEventManager
        javadocs, as well as made it return booleans on a couple
        of methods.  Thanks Murray!

2006-09-10  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.53

        * Removed FCK.jsp from the distribution (since we don't distribute
        FCK, it's sort of weird to have it there breaking things).

        * Bug fix: Comment.jsp now catches RedirectExceptions

        * Bug fix: BugReportHandler also catches RedirectExceptions and
        now gives a proper error report.

        * Limited change note length to 80 characters.

2006-09-09  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.52

        * UserManager now checks to make sure that a user can't
        specify as a wiki name somebody elses's full name or login
        name. This check is peformed for all other combinations of
        these three user profile fields also. This is a potentially
        serious security flaw, so all users should upgrade.

2006-09-08  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.51

        * Added patch from Malte Kiesel to fix a problem which caused
        overwriting of user profile.

        * Fixed WikiJSPFilter writing the wrong content length to the
        response (we're skipping setting the length for now).

2006-09-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.50

        * Test release to check whether we can solve some WebLogic
        issues.

        * Split WikiServletFilter to WikiServletFilter and WikiJSPFilter.
        The latter takes care of JSP stuff, the former of all other types
        of data.  WikiJSPFilter uses getWriter() extensively, while
        WikiServletFilter is for those instances that use
        getOutputStream().  Thanks to Marc Patteet for the help.

        * Renaming now also renames attachments (assuming that the
        attachments exist - if they don't, then there's no way to know
        which pages refer to them (bar going through all pages).

        * Changed web.xml to reflect the new filters.  Don't forget
        to update!

        * Added "print" style for jspwiki.css in commonheader.jsp.  This
        should fix problems with printing looking different from screen.
        Reported by Steve Lihn, fix from Dirk Frederickx

        * Fixed InfoContent.jsp for WebLogic.  By Marc Patteet.

2006-09-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.49

        * Witness the awesome p0w3r of unit testing.  Fixed the
        unit tests added in the morning so that we now hopefully
        are fixing BugStrangeRenameBehaviour.  Reported by Candid
        Dauth.

        * Bug fix: ReferenceManager was not removing all references
        to a page if it was renamed, resulting in "hanging" pages.

        * Added a bunch of new unit tests to check for page
        renaming problems.  At the moment most of them fail, suggesting
        that there is something wrong in PageRenamer...

2006-09-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.48

        * Bug fix: it was possible to gain user privileges simply
        by faking the cookie.  This is a serious problem and all
        people running 2.4.x are suggested to upgrade.  Thanks
        to Andrew for the fix.

        * SecurityVerifier no longer gets confused, if you state
        a property using "==" instead of "=".

2006-09-05  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.4.47

        * Added title and accesskey attribute to
          LinkTag, EditLinkTag and PageInfoTag. You can now set
          accesskeys to edit pages in the PageActions.jsp
          Use the title attribute to add a tooltip text to indicate
          the speedkey you used.

2006-09-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.46

        * Bug fix: PageLock was using acquisition time for both
        expiry and acquisition.  Fixes BugLockNotWorking.  Reported
        by Terry Steichen.

        * Added WikiContext.hasAdminPermission() as a convenience
        method.

        * Changed SpamFilter to check for AllPermission instead of
        a group called Admin - this is better because of i18n.

        * SpamFilter now checks also the changenote before saving.

        * Added the possibility to escape }}} within a preformatted
        section by using ~}}}.  Suggested by several people at
        WikiCreole.org...

2006-09-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.45

        * Bug fix: When SpamFilter rejected something, there would
        be no message shown in RejectedMessage.  Reported by
        Terry Steichen.

        * Removed plenty of documentation from the default wikipages
        package.  It was out of date, and better written up at
        doc.jspwiki.org anyway.

        * Removed doc/Templates.txt, which was no longer accurate.

2006-09-03  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.44

        * Both XMLUserDatabase and XMLGroupDatabase will now check
        if the database is up to date.  This allows propagation of
        databases across wikis (though it's rather flaky; there are
        concurrency issues).

2006-09-03  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.43

        * Bug fix: If the front page did not exist, would die with
        a NullPointerException, when accessed with the default URL
        (e.g. /Wiki.jsp, or /wiki/ without the page).
        Should fix BugBadDefaultConfig.

2006-09-02  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.4.42

        * Fixed Bug with WikiWizard.jsp and Weblogic reported by Marc Patteet

2006-09-02  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.41

        * LinkTag should no longer crash if WikiContext does not have
        a page attached.  Reported by Fabiano Bonin.

2006-08-30  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.40

        * Christoph Sauer joins in as a contributor (if only I got
        him to update the ChangeLog... ;)

        * WikiWizard is now included.  Hooray for WIKIWYG editing!

        * Small tweaks to the EditTemplate.

        * Changed "jspwiki.security=container" to "jspwiki.security=off".
        This should make it more clear to people.  The old setting
        will continue to work.

        * Added page info links back to attachments in RecentChanges.
        Unfortunate side effect of the new renderer...

2006-08-30  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.39 - The "Piko" release.  Rest in Peace.

        * Added SearchManagerTest to make sure that our search works.

        * Bug fix: LuceneSearchProvider was not indexing the WikiName
        of the page.

        * Bug fix: SearchManager now always indexes the latest version
        of the page (thanks heaps to John Volkar for finding this).

        * Disabled ContextualDiffProviderTest.testKnownProblemCases(),
        I have no idea how to fix those, and it was never running anyway.

        * Disabled JSPWikiMarkupParserTest.testSpanJavascript2() -
        it would need a lot more care to make it really run.

        * Fixed failing XMLRPC tests.

        * Upgraded to Lucene 2.0.0.

2006-08-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.38

        * WikiEvents are now fired at almost any occasion that seems suitable.
        Thanks to Murray Altheim for this mega-patch.  Some of the event
        classes were also reorganized (thanks to Andrew and Murray).

        * SpamFilter no longer counts admins as evil, if they make many
        changes/minute.

        * WikiServletFilter fails now gracefully if WikiEngine instatiation
        fails - should no longer emit dumb NullPointerExceptions.

        * FindContent.jsp now hopefully calculates previous- and next
        search sizes correctly.

        * Change Notes are now visible in page history as well.  Unfortunately,
        the visuals suck.  Anyone want to help to make them look better?  Just
        don't make them too wide...

        * Change Notes are now limited to 60 characters (totally arbitrary).

2006-08-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.37

        * Faced with physical threats at WikiSym, I added the "change note"
        feature.  Hope y'all are happy now :-D  (Well, okay, it does not
        work in the page info yet; I'm thinking what would be a good
        presentation so that the page does not get overly wide).

        * Bug fix: jspwiki.tld had the wrong attribute for RequestResourceTag.
        Reported by Marc ?.

2006-08-14  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.36

        * Bug fix: UserProfileTag was not printing groups.  Reported by
        Dirk Fredericx.

2006-08-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.35

        * Fixed BugPreformattedTextWithHtmlDoesnTWorkIfAllowHTMLTrue. Thanks to
        RealGagnon and an unknown submitter.

        * Fixed BugStyleDoublePercentProblem.  There are two new tokens:
        /% can also be used to stop a style, and ~<space> is a non-rendering
        space.

        * Fixed BugNullPointerExceptionWhenInsertingImagesWithoutAlignAttribute.
        Thanks to Candid Dauth for pointing it out.

        * Added patch from Laurent Courtin to fix
        BugTableOfContentsDoesnTWorkWithPageNotInAscii.  Thanks!

2006-08-12  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.34

        * Implemented RequestResourceTag (oops, it had been skipped for
        some reason).

2006-08-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.33

        * RecentChangesPlugin was missing a quote in the generation
        of author names.

2006-08-08  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.32

        * Fixed an astoundingly brain-damaged bug in WikiContext that caused
        all wiki contexts to use the default template in all cases, regardless
        of the setting in jspwiki.properties. This bug was introduced by the
        2.4.25 security mega-patch. The fix, of course, was three lines
        of code. Now that it's in, I'd like to put down my crack pipe
        long enough to thank Terry Steichen for spotting this.

2006-08-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.31

        * Bug fix: BugArbitraryHTMLMarkupInHeadingIsRenderedByTableOfContentPlugin,
        reported by Jerome Duprez.

        * Bug fix: BugCenteringImagesUsingImagePluginDoesNotWorkInFirefox,
        contributed by Alex Reid.

        * Bug fix: BugCanKeepPressingNext20ResultsOnResultSearchPage.  Rewrote
        the scriptlets in FindContent.jsp to provide a better experience
        overall.

        * Bug fix: BugReferringPagesPluginDontWriteNobobyAfterFiltering.
        Reported by François Burtin.

        * Removed a bunch of compiler warnings found thanks to upgrade to
        Eclipse 3.2.

2006-08-04  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.30

        * Fixed cosmetic bug that was causing all search results to
          appear with the name "Search".

2006-08-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.29

        * Character encoding is now set in the servlet filter, not
        WikiEngine.createContext() anymore.  This should remove certain
        cases where character encoding got lost.

        * 2.4.28

        * Fixed a HUGE number of potential problems, found using FindBugs.
        Problems included such as:

        * Now many Comparators are also Serializable

        * hashCode() is now implemented properly on objects that do
        equals()

        * clone() is rewritten to use super.clone()

        * Many inner classes were made static to save extra effort

        * Forms package classes had really dubious null checks which
        were rewritten.

        * TranslatorReader is no longer used in the code anywhere.  Even
        the TranslatorReaderTest is gone.  The class, however, remains,
        until we can refactor it to be a facade for JSPWikiMarkupParser.

        * Coding style is now a local setting instead of a global
        setting...

        * And a lot of small bits and pieces...

2006-07-31  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.27

        * Bug fix: SecurityConfig was erroneously reporting that externally set
          values for java.security.policy did not resolve to existing files,
          even when they did.

        * Bug fix: SecurityConfig was erroneously reporting that wiki groups
          could not be deleted, even when this function actually worked
          properly.

2006-07-30  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.26

        * Fixed editor textarea width, thanks to Gordon Smith.

2006-07-29  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.25 - a.k.a. the AAA mega-patch

        * This release completely changes the way JSPWiki manages wiki groups.
          They are no longer stored in pages; instead, GroupManager controls
          access, while back-end storage is provided by the GroupDatabase interface.
          This change has caused many other changes. More details:

          * GroupManager changes from an interface to a concrete, final class. Group storage
            is now handled by a separate GroupDatabase interface. The default implmentation is
            XMLGroupDatabase. In addition, Group becomes a concrete final class; DefaultGroup
            and DefaultGroupManager disappear. Group gets a new method groupPrincipal() that returns
            the equivalent GroupPrincipal. Many new unit tests created for all of these changes.

          * Group creation handled in UI by NewGroup.jsp. Editing is via EditGroup.jsp.

          * UserProfileTag gains a property "groups" that will print the list of wiki groups
            the current user belongs to. The "roles" property now just prints the roles.

          * Default security policy (jspwiki.policy) gains grant entries for group
            viewing, editing, deletion permissions. By default, users must be at least
            "asserted" to view group members, and must be a member of a group to edit
            the membership.

          * PermissionTag gains three new permission checks: "viewGroup", "editGroup", "deleteGroup".

          * Group principal injection responsibilities moves to WikiSession from AuthenticationManager.

          * The hard-coded restriction on pages prefixed "Group" has been lifted.

          * SecurityVerifier adds tests for GroupPermission. Better support for detecting
            exceptions. Adds tests for adding/deleting Groups.

          * New Groups plugin prints a sorted list of the wiki groups in the group database;
            generates a hyperlink to each group page.

        * JSPWikiInstaller (Install.jsp) receives a makeover and substantial enhancements to
          support the new group scheme. When the wiki is set up, we now create an administrative
          user and an Admin group. It also uses the default CSS.

        * The new Command class is now fully integrated into WikiEngine.createContext()
          and the WikiContext constructors. Practically speaking, this means that the
          page names and redirect errors shown on pages will actually show something useful
          when non-pages are accessed (e.g., access denied for UserPreferences.jsp won't
          print the non-sensical "you don't have access to 'Main'). WikiEngine delegates
          page-resolution responsibilities to CommandResolver. Minor changes to new
          Command/CommandResolver classes to make JSP page names "friendlier".

        * WikiSession.getUserPrincipal now defaults to the wiki principal, rather than
          the full name. This means that favorites auto-linking won't break. It also gains
          a method getRoles() that returns the roles and groups the user possesses.
          The method doPrivileged(WikiSession,PrivilegedAction) allows actions to be
          executed using the user's privileges. WikiSession's getSubject() method has been
          removed; it was a security risk.

        * Substantial changes to the AAA package tests. Web unit tests changed to accomodate groups.

        * Minor refactoring: AllPermission, WikiPermission, PagePermission. AllPermissionCollection.

        * Bug fix: closed <span> tag in InsertPagePlugin

        * WikiContext.getName() provides a "safer" shortcut than calling WikiContext.getPage().getName()
          because not all wiki contexts apply to pages. This change was made to: TableOfContents plugin;
          most of the top-level JSPs; TranslatorReader; PageNameTag.

        * Container role principals are now injected at login time by WebContainerLoginModule,
          rather than the AuthenticationManager.

        * More use of checked exceptions. Authorizer.initialize() throws WikiSecurityException

        * WikiSecurityEvent gains the event type PROFILE_SAVED, emitted by UserDatabase. Most
          of the security events are now marked as "debug" level events, which means the logs
          will be much less chatty (this is a temporary hack).

        * AuthorizationManager gains a new public method: getAuthorizer()

        * The WikiEventSource "marker interface"  added to class declarations for AuthorizationManager
          AuthenticationManager, WikiEngine. EventSourceDelegate used in place of cut-and-paste code
          for these classes also.

        * TextUtil.password generator now uses SecureRandom instead of Random.

2006-07-24  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.23

        * Andy J. fixes what he broke... namely the build. Thanks
          to Mark Rawling for pointing it out.

        * SessionMonitor achieves escape velocity and becomes its own class,
          breaking free of WikiSession's gravity.

        * WikiSession.guestSession() changes to guestSession(WikiEngine).
          This required small tweaks to a few classes, notably the RPC handlers
          and parts of the Auth code.

        * Various classes receive small code tweaks in preparation for upcoming
          builds. WikiContext gains three new group-related contexts; WikiEngine
          gains code to initialize CommandResolver and a related accessor;

        * GroupPrincipal gains a two-argument constructor that accepts the
          wiki name as the first parameter.

        * WikiPermission's action strings are now public. Ebu's been waiting a while
          for this.

        * CommentedPropertiesTest's missing test.properties file is now in CVS.

2006-07-23  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.22

        * Added several classes and interfaces to support upcoming
          AAA refactoring. These do not affect functionality, because
          they are not referenced by any existing classes. New classes
          include: (1) Command interface and related AbstractCommand,
          PageCommand, GroupCommand and WikiCommand implementations;
          (2) WikiEventSource interface and EventSourceDelegate class,
          both in events package; (3) GroupDatabase interface and sample
          groupdatabase.xml files and (4) CommentedProperties class for
          reading and re-saving properties files that include comments.
          Again, these classes are not yet actively used.

        * Minor tweak to TestHttpServletRequest to support parameters and
          servlet path.

        * Removed cruft from HttpUtil; no functionality changes.

        * WikiBackgroundThread now contains a getEngine() accessor.

2006-07-17  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.21

        * RCSFileProvider had a rare concurrency issue with the
        SimpleDateFormat.  Reported by Bosmon on IRC.

2006-07-17  Erik Bunn  <root@d183.fi.basen.net>

        * Modularized RenderingManager. By setting
        jspwiki.renderingManager.renderer in jspwiki.properties, a custom
        WikiRenderer can be specified. Defaults to XHTMLRenderer.

2006-07-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.20

        * Fixed BugNoMoreThanOneSortableTablePerPage.  Thanks to
        Juan Pablo Santos Rodriguez!

2006-07-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.19

        * Added "InternalModule" interface.  This is just an empty
        interface which a module can declare and not get listed
        in SystemInfo, for example.  Used internally by JSPWiki.

        * Fixed a major issue with page renaming: thanks to an
        erroneus context sent downstream, the page which was renamed
        from would get random contents.

        * Page rename would not change referrers if the breakTitleWithSpaces
        option was set on.

2006-07-12  Erik Bunn  <Erik.Bunn@basen.net>

        * Made ParamTag attribute 'value' non-required; tag body is
        acceptable for value. (This should not warrant a version bump.)

2006-07-02  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.18

        * BugReportHandler was dutifully adding the "_cmdline" to the
        pages it was creating...

        * Fixed some quote issues in commonheader.jsp and
        PreferencesContent.jsp which were causing issues with
        WebSphere.  Reported by Robin Tew and Thorsten Nordholm S?birk.

2006-06-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.17

        * WikiSecurityEvent.toString() would die if you had a null principal...

2006-06-17  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.16

        * Bug fix: SessionMonitor.sessions() now returns the same
        number of sessions as userPrincipals(). Credit: Terry Steichen.
        Also, the array of Principals returned by userPrincipals() is now sorted.

        * WikiSession receives lots of Javadoc tweaks and minor
        cleanup-oriented fixes (e.g., member visibility changes) that
        do not change functionality. The class, and all of its methods, are
        now marked final. The setSubject() method, which was not called
        anywhere, was removed; it was a potential security risk.

        * Ant 'javadoc' task now links to J2EE 1.3 API.

        * Added table entry to SystemInfo page to display list of active users.
        If you feel this is a privacy risk, remove the line from SystemInfo.

2006-06-23  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.15

        * Fixed issue with absolute URLs and ShortURLConstructor (we were
        using %U where %u should've been used in ERROR and NONE contexts).
        Thanks to jim from IRC for pointing this out.

        * Added patch from Brad Johnson to give better error output if
        RCSFileProvider fails.

        * Added patch from Murray Altheim to support _cmdline in PluginManager.
        This allows a plugin to do completely custom parsing.

2006-06-17  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.14

        * Enhancement: all background threads now subclass a new class called
        WikiBackgroundThread which will gracefully shut themselves down when
        they hear a 'wiki shutdown' event. These threads are, at present:
        WikiSession.SessionMonitor, PageManager.LockReaper, RSSThread, and
        LuceneSearchProvider.LuceneUpdater. These threads are NO LONGER
        daemon threads, which means they won't stay in memory when
        the wiki webapp is removed.

        * Enhancement: Added protected method shutdown() to WikiEngine that is
        triggered by WikiServlet catching webapp destroy() events. Shutdown()
        fires a WikiEngineEvent called 'shutdown' to all listeners, which at
        present includes all WikiBackgroundThreads. New class added:
        WikiEngineEvent. To catch container events, WikiServlet was changed in
        web.xml to load at startup. This is a dirty hack, but not too dirty.

        * Enhancement: Major refactoring of WikiSession to include a background
        'monitor' thread that removes expired wiki sessions. This means that
        session-count information should be accurate to within a minute
        of when your web container expires its sessions. The background thread
        is an inner class called SessionMonitor that subclasses WikiBackgroundThread.
        WikiSession also gains a method called getUserPrincipals(WikiEngine)
        that returns an array of Principals that represents the current
        users currently using the wiki.

        * Enhancement: SessionsPlugin receives parameter 'property' to specify what
        session information should be returned. If set to 'users', plugin
        returns the list of current users. If omitted, it returns the number of
        active sessions. Thus, [{INSERT SessionsPlugin property=users}]
        will actually print the names of current users -- neat!

        * Enhancement: Group interface receives a long-awaited members()
        method that returns the wiki group's current members as an array
        of Principals.

        * Enhancement: thread responsible for RSS generation extracted out of
        WikEngine and moved to its own RSSThread class.

        * Bug fix: to support multi-wiki webapps, WikiSession.getWikiSession's
        method signature now includes a parameter for the current WikiEngine.
        Check your custom JSPs to see if this affects you (it shouldn't; none of
        the default JSPs currently use this method).

        * Bug fix: Fixed deprecated methods used in LuceneSearchProvider.

        * Bug fix: added sensible session timeout defaults to TestHttpSession
        to prevent some tests from failing.

        * Minor signature change to GroupManager: commit() now throws WikiException.

        * Minor refactoring of WikiEvent class and subclasses to add getType()
        method to superclass.

2006-06-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.13

        * Added EditorManager patch from Chuck Smith.  This now allows
        fully dynamic editor selection using a drop-down menu in EditContent.jsp

        * Added EditorIterator tag from Chuck, too.

        * Fixed some IE tab layout issues, thanks to Dirk Fredericx.

2006-06-05  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.12

        * Added Hypersonic embedded database for JDBC testing. Enabled
        JDBC testing in build.properties to use Hypersonic by default.
        Added license file; corrected file extensions of two others.

        * Removed database scripts for Mckoi embedded database.

        * Added Ant target called 'tests-auth' for JDPA debugging of
        AuthorizationManagerTest.

        * Minor Javadoc fixes.

2006-05-28  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.11

        * WikiSession received minor refactorings to remove the set/getLastContext()
        methods. These were used for only one purpose anyhow (WebContainerAuthorizer)
        and the net result was that their inclusion was preventing garbage collection
        of expired WikiSessions. WikiSession also receives a removeWikiSession()
        method, which removes wiki sessions from its internal cache, and is called
        during logout.

        * Bug fix: WikiSession.sessions() and the related SessionsPlugin now
        more accurately reflect the number of current WikiSessions, instead of
        continuously incrementing. (Technically, the counter shows the number of
        non-GCed sessions.) In the future a "session reaper" would make this even
        better.

        * Bug fix: Removed divide-by-zero error from SecurityVerifier.

        * Bug fix: DefaultGroup and DefaultGroupManager now store their
        WikiEventListeners in WeakHashMaps to prevent listener objects
        (such as WikiSession) from being reclaimed by GC.

        * Bug fix: WikiDocument now stores its reference to WikiContext
        as a WeakReference, so that caching operations won't prevent GC
        of the WikiContext.

        * Bug fix: Corrected text on the default PreferencesContent.jsp
        to reflect recent e-mail reset function.

        * Bug fix: Fixed listener bug DefaultGroupManager that was preventing
        WikiSessions from receiving updated GroupPrincipals when groups
        were changed to include new members in certain cases.

        * Bug fix: Fixed 'index out of range' error caused by zero-length cookies.

        * Bug fix: WebContainerAuthorizer now recognizes roles declared in
        web.xml for elements web-app/security-role/role-name, in addition to
        those declared for web-app/security-constraint/auth-constraint/role-name.

        * Moved hack-ey code that injects web container Role Principals from
        AuthenticationManager to WebContainerLoginModule, where it belongs.

        * As part of the memory-leak fix, WebContainerAuthorizer no longer
        relies on a sneaky call to WikiSession.getLastContext().getHttpRequest()
        to test whether a user possesses a particular container role. Instead,
        we (only) inspect the user's Subject's Principal set for the desired role.
        This means that changes to container's user/role mappings are NOT
        reflected until the next time the user logs in.

2006-05-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.10

        * Atom feeds now validate properly

        * RSS and Atom feeds are now served with proper media type

2006-05-20  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.9

        * Enhancement: UserDatabase interface includes two new methods:
        getWikiNames() for enumerating the users in the current database,
        and deleteByLoginName( String ), for removing users. I have implemented
        these methods to the concrete classes JDBCUserDatabase and
        XMLUserDatabase. Thanks to Frank Fischer for his patches; they
        served as the basis for these changes. I have *not* added convenience
        methods to UserManager... yet.

        * Enhancement: SecurityVerifier includes new code that checks to make
        sure the UserDatabase is initialized properly, and that it can add
        and delete users correctly. Also, admin/SecurityConfig.jsp includes
        a new section ('UserDatabase') where results of the checks are displayed.

        * Minor tweaks to the database setup scripts to include update/delete
        privileges for the roles table.

        * Minor tweak to web unit tests to account for cleared cookies at logout.

2006-05-20  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.8

        * Enhancement: AuthenticationManager now injects role Principals
        at login time from the external authorizer into our WikiSession's
        subject. This works with all Authorizers, including (of course)
        WebContainerAuthorizer. This enables grants to Principals of
        type com.ecyrd.jspwiki.auth.authorize.Role to be specified in
        the Java security policy. In particular, this means that policy
        files can be broadened to include container roles.
        WebContainerAuthorizer received a new method to accomodate this.

        * Enhancement: Added grant block in jspwiki for administrator groups
        principal com.ecyrd.jspwiki.auth.GroupPrincipal "Admin" (wiki group)
        and principal com.ecyrd.jspwiki.auth.authorize.Role "Admin" (container
        role). Added new wiki page to distribution, GroupAdmin.txt with an
        empty (disabled) membership, which makes the administrator group
        secure by default. We expect that a future enhancement to Install.jsp
        will overwrite the contents of this file, thus "enabling" the admin group.

        * Bug fix: Uploaded JDK1.4-compatible version of freshcookies-security.jar.

        * Bug fix: Fixed error in jspwiki.policy.

        * Bug fix: Changed WikiEvent so that its toString() method does not
        leak credentials.

        * Bug fix: Logout.jsp now removes "asserted" identity cookies.
        This is arguably less confusing to users.

        * Bug fix: Removed SecurityConfig.jsp from web.xml constraint (for now).

        * Removed spurious import in AuthorizationManager.

        * Massive refactoring and huge improvements to SecurityVerifier and
        admin/SecurityConfig.jsp. Janne, it should even for you now. :)

        * AllPermissionCollection now accepts WikiPermission and PagePermission
        types in its add() method. The newPermissionCollection() method for
        WikiPermission and PagePermission returns a new AllPermissionCollection().

2006-05-09  Dan Frankowski

        * 2.4.7

        * Fixed SearchBox "edit" bug when
	  jspwiki.urlConstructor=ShortURLConstructor

        * Add a link on the attachment page back to the original page

2006-05-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.6

        * Fixed NPE in ReferenceManager.pageRemoved (thanks
        to JMarquart).

        * ShortURLConstructor did not have PREVIEW context
        available; thanks to Malte Kiesel for the fix.

        * Added quick fix from Dan Frankowski to generate
        JDOM javadoc links.

        * Plain URIs in text are now parsed properly and no longer
        cut at the first "=" sign.

        * NewGroup.jsp would occasionally throw NPEs if the context
        was null - fixed by ICantRememberWhoAnymoreBecauseILostTheEmail.
        Thanks anyway!

2006-05-07  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.5

        * Added a new JSP for verifying JSPWiki's security
        configuartion, admin/SecurityConfig.jsp. This JSP
        collaborates with a new class, c.e.j.auth.SecurityVerifier.
        SecurityConfig will verify the presence or absence of
        the JAAS login config file, the security policy file,
        and container-managed auth constraints. It will also
        validate that the correct JAAS login configations exist,
        and will print a summary table showing the privileges
        that apply to each role. Much needed, and should
        help folks get their security working.

        * To support the security verifier, small (non-public)
        changes were made to WebContainerAuthorizer. This class
        also gains a new public method isConstrained(String, Principal).

        * Bug fix: AuthenticationManager's method of finding
        its JAAS and security policy files changed so that
        full (absolute) patchs are discovered, rather than
        local (JNDI) paths.

        * Bug fix: small change to default security policy file
        jspwiki.policy. It now includes commas between the
        codebase and principal entries, as it should have.

        * Added a small third-party utility jar (my own)
        for parsing security policy files.

2006-05-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.4

        * Added activation.jar and mail.jar to the distribution

        * AuthenticationManager now complains if it cannot
        locate the JAAS LoginManager information, instead of
        failing with NPE.

        * PagePermission.hashCode() no longer fails with NPE
        if wiki is not set (normally, though, you would never
        need it, but there are certain cases where this might
        occur).

        * Added a great patch from Dan Frankowski which allows
        recovery of forgotten passwords!  Please see your
        jspwiki.properties for new SMTP options.

        * Added search results filtering based on permissions,
        i.e. you no longer see pages to which you have no
        access to.  Requested by many people.

        * Login button is now on its own line instead of being
        hidden in the right corner.  Helps those people who
        like to "hunt and click" on the mouse.

2006-05-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.3

        * Added fix from Rolf Schumacher: no longer outputs
        password to the log file in Tomcat.  Oops.

        * Fixed a failing unit test

        * atom.jsp is now gone; please use "rss.jsp?type=atom"

        * Fixed SearchBox.jsp issue reported by Dirk Fredericx.

        * FeedDiscoveryTag should now offer Atom 1.0 feeds.

        * WeblogPlugin no longer considers empty comment pages
        as "1 comment".

2006-04-30  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.2

        * Page Renamer did not write the author name properly to
        any pages that were changed due to referrers changing.

        * Page Renamer would accidentally do double-encoding of
        XHTML entities...  Yes, there's a difference between
        getText() and getPureText().  Thanks to suomigo.net
        community for finding this one out.

        * WikiEngine.renamePage() API signature was changed
        because of this... It now takes a WikiContext as well.

        * Login.jsp did not write proper content encoding.

2006-04-26  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.1

        * Updated README.

        * Split old stuff from ChangeLog to OldChangeLog

        * Added missing SearchPageHelp

        * PageActions.jsp now checks if login is allowed

        * Install.jsp now sets "jspwiki.security=container" to make
        first-time installs easier.

        * AuthorizationManager returns now "false", if security is
        set to container and you ask for login permissions.  This
        drops the "Login" button from the display, if JSPWiki is
        not managing authentication, fixing an annoyance.

2006-04-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.0

        * SearchResultsIterator now can start from a given place

        * You can now see all of the search results - just click on
        "next 20 results".

        * Included patch from Dan Frankowski to support returning
        of search fragments.  Thanks!

        * Upgraded to Lucene 1.9.1

        * Removed slash from allowed characters in wikipage - that would
        create pages that were impossible to link to.  Oops!  It must've
        been some debug code left in...

        * LinkTag now removes extra whitespace from link text; this allows
        you to use multi-line <wiki:Param> tags without the text becoming
        too unwieldy...

        * Search now also supports Google-like "are you feeling lucky"
        -functionality.  Just click on "Go!" in the search page.

        * Search help is now on a page called "SearchPageHelp".

        * Added support for left-to-right and right-to-left markup with
        the %%ltr and %%rtl default styles.  You can copy them from the
        "jspwiki.css" file.

        * Minor cleanups to build.xml.

        * CheckLockTag would get confused if two people were trying to
        create a non-existent page at the same time.  Reported by
        Mark Rawlings.
