AjaXplorer 4.2.3 Release Note

License : Affero GPL
Copyright : Charles du Jeu 2012
Demo : http://ajaxplorer.info/demo
Date : 2012-11-12
Rev Number : 3248

This is a final release for the 4.2.X stable branch. Thus it only includes bugfixes.

CORE

[Core] Make sure to re-order plugins by dependency before activating them
[Core] Link AJXP_SKIP_CACHE to i18n cache as well
[Core] CONF WebFTP Template
[Core] If recursive errors, use php error_log function
[Core] PHPCLI on windows, fix by @rmeske
[Core] Put Word, Excel and Presentation files in the core, not only in Zoho plugin
[Core] Follow @ultreia suggestion to trim only NULL character after decrypt operation.
[Core] Perform an ordering when activating plugins, to ensure a consistent order. Fixes the header of action.skeleton being
misplaced.
[Core] Logger : fix no IP when called through PHP_CLI
GUI : Fix Safari iOS6 Touch events broken
[Core] Simple getRemoteContent() function detecting allow_url_fopen, CURL extension, or using HttpClient
[action.updater] Use new getRemoteContent() function in action.updater, editor.zoho and shorten.bitly plugins. Shoudl prevent
people to miss updates!


Conf & Auth

[core.conf] New option in core.conf plugin to avoid autoloading last visited folder at login.
[auth.multi] trigger createUserObject() when creating local copy of the user, to make sure the default roles are applied
[auth.ldap] turn USER_LDAPATTR to lowercase / Fix the case sensitive userExists() test.
[auth.multi] fix getUsersCount() if no USER_BASE is set.
[auth.ftp] Disable remember box for auth.ftp, as we cannot store the credentials.
[conf.serial] Serial AJXP_USER : catch exception in __destruct() function


Access & Meta plugins

[access.ftp] Missing sortType in columns definition prevented sorting
[access.ftp] Trigger remote copy (ftp & remote_fs) if USER-AGENT is IOS or Apache-Http (=java)
[access.fs] Fix AJXP_LINK on dynamic repositories
[access.ajxp_conf] XML Entities on the roleID before sending.
[access.fs] Escape chmod to avoid error if operation is not authorized on server.
[meta.filehasher] (rsync) filling tmp dir with delta files.
[meta.filehasher] Remove rsync actions if extension is not found. Should be interpreted by the client.
[meta.git] Fix error when entering Plugins > Meta if VersionControl_Git is not installed
[index.lucene] Change default Analyser to be able to search for numbers.
[meta.mount] Escape password in Filesystem Mounter (@didier)
[meta.quota] For shared folder, a new parameter to skip caching.


Editors & Gui plugins

[gui.ajax] JS and css micro fixes (connexion does not display error correctly)
[editor.imagick] Fix IMagickPreviewer for remote wrappers.
[editor.imagick] Correct headers for pdf thumbs
[editor.diaporama] PThumb still had deprecated join() calls
[editor.soundmanager] Disable soundmanager if no Canvas
[gui.ajax] Apply a style similar to the iconset to the image thumbnails (white border and dropshadow)
[editor.pixlr] Node_change not triggered after Pixlr Modif (>git not commited)



-----------
AjaXplorer 4.2.2 Release Note

License : Affero GPL
Copyright : Charles du Jeu 2012
Demo : http://ajaxplorer.info/demo
Date : 2012-07-23
Rev Number : 3033

This is a bug fix release, and introduce two new features : simple but efficient documents automatic-versionning based on GIT,
and Amazon S3 driver. Other clouds drivers will come soon (Swift from Open Stack among others).

[NEW FEATURES]
Meta.git    : Git based versioning, way more simple than with svn, simply install GIT on the server and install the PEAR/VersionControl_Git library. Open in browser, revert to a given revision, cosmetics.
Access.S3   : Based on Pun'k Avenue s3 "better stream wrapper" implementation, and the aws-sdk from AWS (not packaged by default).

[BUG FIXES]
gui.mobile : open/info menu had disappeared (FilesList refactoring).
Auth.ftp & Auth.smb were broken
Notify.phpmail-lite : Base64_decode when necessary
Disable scheduler if not able to create db folder
Do not catch errors and exception at the very first boot
[core] Factorise generateAttachmentHeaders and generateInlineHeaders inside HTMLWriter, and use them in fsAccessDriver and in FileMimeSendSender.
[gui.ajax] Fix various things in JS files for FilesList class impermeability.
[access.smb] Make sure to register smb:// wrapper (bug in cross-repository copy)
[access.smb] Apply Thomas Oettli tweaks (new DOMAIN parameter).
[access.ajxp_confDriver] Not very nice, but working, make sure to register meta.svn & meta.git after the others (will trigger the hooks accordingly) @todo : generic reflexion on the hooks/plugins ordering.
[action.scheduler] Missing xmlEntities call on repositories list, could break the interface.
[action.scheduler] Make sure the folder is also initialize on unserialization
[meta.quota] Fix shell epression used for computing quota on Darwin
[core.auth] Wrong ajax response on pass-change error, reported by @ultreia
[AJXP_Utils] Fix from @mattlef : avoid exception on empty extension filename

[CLI & ASSOCIATED TEST]
CLI : detect / configure / use COM WScript.Shell to enable command line on IIS. Require giving correct rights to the cmd.exe executable.
Typo error totally breaking the PHPCLI test.
Test CLI : more tests on safe_mode & exec detection to be sure it will not crash

[WebDAV]
Disable locking for the moment, triggering too much random upload problem
[Quotas] webDAV and quota checking
[WebDAV] Fix error if a repository has no metastore
Conf.sql :  getRepositoryByAlias was simply broken, making webDAV fail when using conf.sql
GoodReader WebDAV client : do not urlEncode

-------------
AjaXplorer 4.2.0 Release Note

License : Affero GPL
Copyright : Charles du Jeu 2012
Demo : http://ajaxplorer.info/demo
Date : 2012-06-24
Rev Number : 2976

This is a major stable release that includes numerous bugfixes from the 4.1.0 and a lot of new features.

[NEW FEATURES]
Auth.multi driver       : Implement an alternative MODE, instead of proposing the various drivers to the user, consider one is the master (typically ldap) and the other is the local alternative (typically serial) to allow creating shared users.
Action.scheduler        : a generic CRON-LIKE scheduler triggering AjaXplorer actions in background. Only one call needs to be added to the cron to trigger the scheduler
Share engine            : Add an optional Downloads Limit on generated links to auto-expire after x downloads.
Default repository      : Add an option for forcing default repository at login.
Quota implementation    : New hook before_create / Pass new size when possible in before_change and before_create
meta.file_hasher        : Store md5_mtime to make sure some changes were not missed, recompute if not sure
meta.mount              : Automount any filesystem (Linux only) automatically
log.syslog              : Send logs to System Logger (Linux only)
Core.auth / Core.conf   : New mechanisms to list users in a paginated way, to avoid overflowing GUI. Implemented by auth.sql, auth.conf and auth.ldap for now on.
-- 4.1.0
PHP 5.4 Support         : Call-time pass by reference are deprecated, replace static calls to DOMDocument::loadXML


[CORE]
XSD Schema          : missing dynamicItems element definition, missing user_param element
Encoding            : XmlEntities before sending in triggerBgAction.
Encoding            : Preg_quote before using as regexp
New Cache           : I18n Messages caching mechanism, one file cache per language
Automated build     : exclude some under-used or very specific plugins from the standard build : access.demo, access.jsapi, access.wms, auth.cmsms, auth.phpbb, editor.codepress (deprecated), log.syslog
Replication         : Ability to replicate groups of fields in the standard form kit.
Config files        : New (optional) way of encoding serial files using JSON formatting. We may switch massively to this format, as it's much more easy to hack manually (but would have to check performances before).
Refactoring         : Deport login/logout and related actions inside AbstractAuthDriver instead of root index.php file
Autoloader          : search interfaces defined in core plugins
Refactoring         : New core.metastore plugin, defining the MetaStoreProvider interface & the AJXP_METADATA_ constants
Performances        : New skipCheck parameter added to AJXP_Utils::loadSerialFile
Distributed Env     : New variable AJXP_SHARED_CACHE_DIR / Shared cache can be a stream, which have implications at many levels
-- 4.1.0
Cross-Repo copy     : Two successive node expand changed the current repository to the destination repository (switch back replaced twice).
Core                : Fix mkdir() call for the cmd_outputs folder
Performance         : cache slow processing data when possible (registered extensions, messages, etc), either in memory (static var) or in cache files.


[GUI BUGFIXES]
IE10 Ready          : Prototypejs & Css fixes for forthcoming IE10 version (does not support filter: anymore)
Typo                : Error prevented the updateIcon in xTree
Diaporama           : Do not display splitter and info panel if no toggleButton action is passed
IFRAME uploader     : use closeValidation instead of closeFunction to avoid override
Error catching      : Catch error 500
Refactoring         : ParseXMLMessage Return false on error
Refactoring         : Set action_instance_ID on buttons referring to actions, to dynamically update their label if necessary.
Performances        : ActivityMonitor sends get_action=ping to avoid triggering default action.
HeaderResizer       : decorellate from table_rows_container, fix columns width, fix typo that was preventing Opera from working.
Refactoring         : Deep FilesList refactoring to attach a different data model
User Experience     : Repository configs Update the Meta Sources tab for better UX.
Bug                 : Avoid shadower error / Do not call activate() on accordion if already showing.
ConfigEditor        : Do not close window on repository creation error / Form Manager : use tab to navigate inside the accordion.
-- 4.1.0
Client Session timer: hook to "ajaxplorer:longtask_xxx" events to avoid disconnecting during very long task (namely uploads for the moment)
Remember me         : reported from 4.0.3 branch
Tpl Logo image      : Wrong content type header
Massive deletion    : POST instead of GET
Error Message       : Restyle message box (max height), fixed broken carriage return
JSPacker            : rtrim windows line feed

-- USERS & CONFIGS MANAGEMENT
Actions             : Group new user / new role actions under a same submenu.
Hooks               : New hook for adding section to the Settings console from other plugins
UX                  : User pagination if auth driver supports it in access.ajxp_conf
Bug                 : In the few cases where the user now can upgrade its own rights, make sure to load() it before, if an admin has changed the rights during the session.
User case           : Disable case sensitivity (in core.auth config)
Auth Schemes        : Auth driver can provide AuthSchemes (displayed in the admin interface). Should be used by conf.serial to differentiate the storages by folder and avoid using ugly ID_SEPARATOR.
Performances        : Implement __wakeup() function on Ajxp_user to make sure to clear the registerForSave array.
Performances        : [conf.serial] Delegate the user files saving to the __destruct method for better performances.
Performances        : New FAST_CHECKS parameter for conf and auth serial plugins

-- WEBDAV
Performances        : Performance improvement, applyActions() instead of directly calling driver methods, so that pre/post process are applied.
Refactoring         : Detect if there is a metastore, and use it for storing webdav properties. Should implement locking.
Refactoring         : Check interface AjxpWebdavProvider instead of hardcoded access types
Bug                 : Fix repository alias / id problems

-- PLUGINS
access.fs           : Preconfigure a folder whose content will be automatically copied to the repository at first load.
access.fs           : optional arguments to use rename as  move
access.fs           : Upload : pass accented characters in the urlencoded_filename POST parameter
access.ftp          : Fix FTP listing when multiple groups
access.ftp          : Fix autorenaming on upload not working.
editor.browser      : Classic header fixes for IE8
editor.imagick      : Unoconv integration for both previews of office files and indexation of their textual content.
editor.imagick      : Autodetection of thumbs ratios for pdf thumbnails.
editor.imagick      : Threshold for generating all pdf pages at onces or on-demand.
index.lucene        : Lucene and office documents : silently tries to index, avoid throwing errors
editor.video        : Fix m4v support
action.updater      : Connect to update site through a proxy.
http.downloader     : Trigger before_create before downloading!
http.downloader     : Fix  progress bar for remote downloads
shorten.bitly       : Re-display shorten form when showing shared link url
editor.pixlr        : Add IfModule instruction in htaccess otherwise it can prevent from accessing the content of the folder.
meta.filehasher     : rsync actions (requires PECL rsync extension)
uploader.jumploader : skip pre/post processors if xhr_uploader passed in the url
auth.sql            : Override the clearRights() method, changes must be saved directly in the DB.
auth.sql            : Fix double bookmarks loading
Jumploader          : use uploader passed as argument, may solve FF random problems?
action.share        : Change share action rights : allow readonly users to share links (but not folders).
action.share        : Do not allow re-creating a temporary user
action.share        : Handle SessionCredentials case along with folder sharing by saving an encoded version of the credentials in the options.
meta.svn            : Usability & improvements, more documents oriented than source control. To be generalized. Todo : how to grab old versions metadata?
meta.svn            : pass the LC_ALL environnent variable to proc_open if AJXP_LOCALE is defined
meta.svn            : pass array if multiple arguments (will be shell escaped) /  Auto-commit metafile changes
unoconv             : How to guess the encoding of pdfs of docs for extracting text?  / TODO : report documentation
-- 4.1.0
Metadata loading    : Set a "hidden" metadata to a passed node
Access.fs           : handle symlinks more properly
Access.fs           : Filter files and folders when creating Zips, using PCLZIP_CB_PRE_ADD callback
Access.smb          : Clean URL everywhere, pass the Locale as environnement variable when defined
Access.fs           : Big typo error making the "nodeName" resetting useless
Access.smb          : override makeZip and allow its usage (by plugin configuration), as it can be an option when on a very fast network connection.
Access.smb          : fix "+" in folder name, use rawurldecode() instead of urldecode()
Open_basedir        : Multiple files downloads broken, do not "patch path" in readFile function when on the realFileSystem.
Core.conf           : Add a $context parameter to the user save() method, to avoid "over saving" data : if context is "superuser", save preferences and rights, where as in context "user" save only preferences.
Core.uploader       : should solve the problems of setting the upload limit.
WebDAV Server       : detect MiniRedir user agent
Synchro             : Recursive listing implementation & hooks applyCondition for better performances. Testing synchro tool
Synchro             : Various tricks to trigger the metadata updates from outside, and webdav optims
Conf.sql            : Auto detect "objects" preferences and serialize them in the DB, adding the $phpserial$ prefix. Fixes AJXP_WEBDAV_DATA of users, as well as PLUGINS_DATA used by notify.phpmail
Editor.diaporama    : fix the "navigator" when the is a marginTop on the thumbnail, encodeURIComponent before triggering download action, otherwise breaks (e.g. & in file name)
Editor.zoho         : as reported by zoho support team, the Secret Key is in fact deprecated and no more necessary, apply node.before_change hook before saving
Editor.pixlr        : apply node.before_change hook before saving
Editor.imagick      : do not inverse slashes if not necessary!
Editor.video        : Pass alternate videos versions in the metadata, and set them as HTML5 video source (require an external pre-encoding)
Index.lucene        : ignore case for determining content-indexed extensions
Uploader.*          : trigger events ajaxplorer:longtask_starting / ajaxplorer:longtask_finished
Auth.ftp            : Force call to getServerFeatures() when coming from the login operation.
Auth.ldap           : Jon Peck ldap contrib : ability to configure DN as an array and iterate through them
Meta.svn            : manually set a library path to access the SVN commands.
Meta.filehasher     : new utility for accelerating synchronization, compute and store file md5 in metadata (if metastore active) and delete on file change.
Action.powerfs      : Fix zip delegation : do not sleep for one second, change the download mechanism, and place the zip inside the temporary folder, otherwise it makes problems for read-only folders. Allow compression when using powerfs in read mode, Todo : exclude hidden files from zip operation using an exclude list,
Action.share        : AjxpSharedDriver avoid error on empty glob(), fix typo error


-- TESTS & INSTALL
Test PHPCLI         : Catch Errors on popen() to avoid IIS crash.
testPHPSession      : Skip test if save_handler is not file based
CLI                 : Change the way the CLI is detected.
--FROM 4.1.0
New config file     : New optional config file to set the configs that must be set before anything else : LOCALE, TMP_DIR, INI_SET
Test.gpc            : Totally commenting magic_quote_gpc breaks JSON if magic_quote is active!
Test.writeability   : Call is_dir silently to avoid error triggering and let the diagnostic tool run
Tests failed        : Suggest changes (in the new bootstrap_conf.php file)
Documentation       : Plugin Info XML, ability to browse many plugins folders (experimental)
Security            : Reported from 4.0.4 branch




---------------------------
PREVIOUS RELEASES FROM 4.X
---------------------------


AjaXplorer 4.0.4 Release Note

A vulnerability was discovered that could allow a non-logged user to access other files on the server
file system. The « remember me » mechanism was also improved to lower the session hacking probability
in case of « cookie stealing ».

AjaXplorer 4.0.3 Release Note

License : Affero GPL
Copyright : Charles du Jeu 2012
Version number : 4.0.3
Demo : http://ajaxplorer.info/demo
Rev Number : 2748

[Fix side effects of previous release]
Revert bootstrap_context commited once again with setlocale uncommented.
PHPCLI test : detect the disabled functions to avoid ugly error at startup!
The open_basedir fix for zip browsing was breaking the zip extension on download.
Test glob result in upgrader
Locked file could save content even if hook node.before_change returned an exception.

[Access Samba]
Make smb access more robust : configure smbclient path, blur credential in debug, get the procopen error stream, etc...
Access.smb : handle Windows case for smbclient+cygwin install. Nice!
Fix a couple of samba tweaks, plus shared links when using auth.smb/access.smb, may impact other auth.** drivers
Update access.smb documentation

[Users number scalability]
New options for the ShareCenter : Ability to pass a regexp pattern to AuthService::listUsers()
Touch a file in the cache to avoid triggering countAdminUser() if not necessary (ie do it only the very first time). Can be very long when a lot of users!

[Android client redirection]
Adapt iOS GUI Plugin for Android as well, ability to set the app url via the configurations.
Handle the skipANDROID parameter & cookie

[Other]
Editor.diaporama : defer cache cleaning hook
Editor.diaporam : allow the client to ask a specific thumbnail dimension => useful for mobile devices!
Make joomla_auth_remote function more robust, when the HTML cannot be correctly parsed by a DOMDocument.
Auth.remote MASTER_XXX variable documentation update, along with the website How-To.

-------------------------------------------------------------------------
AjaXplorer 4.0.2
Rev Number : 2728
[Security]
Fix a potential XSS via the doc feature

[Hooks]
Ability to apply callbacks in a "deferred" way, i.e. after the output is sent to the client. Drastically increasing user experience.
New hook "node.before_change", to be used by locking plugins

[Access drivers]
Moved global parameters "hide folder, show hidden files, etc" to the filesystem_commons mixin.
Test HIDE_XXX is not empty, otherwise there are false-negatives
Try to chmod 755 publiclets to make sure they are executable.
Typo error in the fixPermissions() routine
Access.fs : Deploy various strategies to go around open_basedir php inconsistencies.
Access.fs : Use copy() when driver is not remote, it's much more efficient
Access.fs : X-Sendfile needs UTF8
Action.powerfs : Do not sleep() at the end of the archive creation, otherwise the zip_operation file is created again
Access.fs : "Purge" action was commited commented

[Gui]
Place the window.opener tentative inside a try/catch to avoid permission error
Adapt tree scrolling when focusing on a given node, + compile
Fix dragndrop & scrolling problems.
NL2BR for line feeds in the notification body
Editor.browser : url broken if there are paremeters in the current url
Editor.browser : Filehandle left open, was breaking download on CentOS

[Plugins]
Meta.simple_lock : Simple "locking" implementation : manually lock/unlock files to other users.
Action.skeleton: custom_target_url typo error
Auth.ftp  : Translate FTP dynamic login screen / Translate yes/no options
Uploader.flex : FlexUploadProcessor, double utf8 decoding was breaking special chars!
Uploader.html : Make sure no to close the uploader if some file is still loading
Uploader.html : Fix the allowed extension mechanism
Access.ajxp_conf : fix MIXIN_MESSAGE appearance in Wallet data
german translation for action.share
Fix uploaders ALLOWED_EXTENSIONS usage (comma separated list), and text for other uploaders to enable flex if it's the only one.

[Core & Language]
Add a new test for detecting the CLI php
Catch exception in webdav backend and encapsulate in a webdav error.
Fix compat version of json_decode, and make sure to expect the "assoc" version of the function, as the compat version only support this (not the stdClass). Was breaking upgrade for php5.1.X
Weirdness in serializations with the inferOptionsFromParent property, seem to be fixed by setting it private with getter/setter. Was breaking share metadata in templates children...
For php 5.1, the protected nature of the properties fail, do not call them directly, use the getter() instead.



AjaXplorer 4.0.1 Release Note
------------------------------------------------------
This is a bugfix release.

[New]
+ "Default Role" implementation : like "Default Rights", all newly created users will have this
role.
+ Command-line delegation for both "compress" and multiple "download" actions, using the server
"zip" command.
+ Option for delegating the dowloads to the server, using the X-SendFile server module
(external module to install, available for Apache, Lighttpd & Nginx).

[GUI]
Fix IE7 double click for opening in external window : closing the lightbox too fast was
creating error with the shadower script.
Default double click switch to "download" if no openable editor available.
Typo error onCancel / onComplete function

[Plugins]
[access.fs] Error in readFile was breaking multiple files download in any other browser than
Chrome (wrong headers sent)
[access.dropbox] Missing columns definitions for dropbox plugin / Update dropbox-php for API
1.0, plus patch to skip SSL certificate, plus OAuth negociation at repository initiation.
[conf.sql] Fix conf.sql for templates children
[downloader.http] Move upload>subMenu as a downloader.http override, thus no submenu if this
plugin is not active.
[editor.audio] Wrong tooltip for Volume Button
[access.mysql] Add DEFAULT_RIGHTS option for Mysql driver
[editor.diaporama] Handle "array" config case during serial/deserialization (only applicable in
editor.diaporama until now, was breaking its configuration)
[editor.jumploader] Jumploader old doc was not correctly reported
[log.sql] Forgotten DIBI Require


[Core Auth]
ALLOW_CROSSUSER_SHARING : Do not compare to === true
"guest" user handling when ALLOW_GUEST_BROWSING is not active. Better check for delegate
repository creation, check for errors before creating anything. New method
AuthServide::isReservedUserId() for a future modularization of the "guest" concept.

[Misc]
Fix background action when users are not enabled.
Fix metastore & meta plugin when no user enabled!
Rename default text file and update the content
Fix backgroundPanel style
Ability to transmit directly a javascript instruction to the backgroundManager


-------------------------------------------------------------
AjaXplorer 4.0 Release Note

This is a major version release. Check ajaxplorer.info for complete description.
Below are described the changes introduced since v3.3.5

[GUI]

Fix scrolling overlay in FilesList
DisableNavigation when search input text is focused
Correctly resolve icon source in Search Engine
Remove google API alert, as it’s now commercial
Avoid full gui blocking if referencing a wrong message ID for action text
Clean destroyElement() if method exists
Fire events before/after rows initialization and rows clearing
Various hacks : go through modifiers even is column is hidden, passing a fourth argument in that case. ChooseOther now implements a full mechanism to remember mimes to editors for the user. Clean destroy of SliderInput. SoundManager : display currently playing with specific class.
Fix InfoPanel currentPreviewElement destruction
Scroll overflowX in gridMode
Fix CodeEditor resize
Fix various issues with drag’n'drop, particularly polluting IE
Fix Share Users autocompleter not appearing in IE (insert the box in the body for good positionning)
Detect Modernizr.multiplebgs and disable overlay icons if not present, otherwise it makes an empty icon.

[CORE]

New method getUniqueActivePluginForType() and application in the metastore users
Silently test library searching, to avoid open_basedir errors, will return false anyway
Silently catch meta sources error
Implementation of editor.soundmanager
Filter the registry actions before outputting
ALLOW_GUEST_BROWSING broken
AJXP_FORCE_LOGPATH optional constant for easing RPM packaging
Fix : do not load extensions contribution of inactive plugins.
Various fixes for widget case (when SERVER_PREFIX_URI is set)
Create a separate template for the tests results…
Skip brute force login with a log when server is in Debug mode
AUTH_DRIVER drupal sample included
Ignore Disabled access plugins, either in the new driver list, or in the current repository list
silently set_time_limit

[DOCUMENTATION]

Display plugin doc if presentAdd a note to explain how to force the flash uploader usage
Re-organize Settings data
Massive PhpDocs comments
Massive Plugin_doc files & screenshots
Remove old README from webdav plugin, now the role of plugin_doc.html

[PLUGINS]

Editor.SoundManager : add an active condition to limit to browsers that support canvas, otherwise it’s buggy.
Gui.ios : Fix # in IOS URL parsing
access.ajxp_conf : Fix filenames again
auth.basic_http : Daniel Berteaud patch for configuring logout URL for basic http.
Index.lucene : Auto-remove false indexes at search time, does not seem to impact the timing
access.ftp : Fix « permission fixing » losing the folder nature, and remove the fix from ftp wrapper.