diff --git a/README.RU.md b/README.RU.md index 25cd5f8fd..1ec21e0b6 100644 --- a/README.RU.md +++ b/README.RU.md @@ -3,7 +3,7 @@ NetBox: SFTP/FTP(S)/SCP/WebDAV клиент для Far Manager 2.0/3.0 1. Общие сведения о плагине - Плагин реализует клиентскую часть протоколов SFTP, FTP, SCP, FTPS и WebDAV. + Плагин реализует клиентскую часть протоколов SFTP, FTP, SCP, FTPS, WebDAV и S3. SFTP, FTP, SCP, FTPS протоколы реализованы на основе плагина WinSCP [http://winscp.net/eng/download.php/](http://winscp.net/eng/download.php/) Поддержка протокола WebDAV реализована на основе библиотеки neon [http://www.webdav.org/neon/](http://www.webdav.org/neon/). Парсер xml работает c помощью библиотеки TinyXML [http://sourceforge.net/projects/tinyxml/] (http://sourceforge.net/projects/tinyxml/). @@ -12,24 +12,28 @@ NetBox: SFTP/FTP(S)/SCP/WebDAV клиент для Far Manager 2.0/3.0 Доступ к удалённому серверу возможен как через собственное хранилище сессий, так и через префикс. - Возможны два варианта использования префикса: + Возможны три варианта использования префикса: a. NetBox:Protocol://[[User]:[Password]@]HostName[:Port][/Path] - где Protocol - имя протокола (ftp/ftps/sftp/http/https) + где Protocol - имя протокола (ftp|ftps|ftpes|ssh|scp|sftp|dav|davs|http|https|s3|s3plain) User - имя пользователя Password - пароль пользователя HostName - имя хоста Port - номер порта Path - путь - b. (sftp|ftp|scp|ftps|http|https)://[[User]:[Password]@]HostName[:Port][/Path] - где (sftp|ftp|scp|ftps|http|https) - имя протокола + b. (sftp|ftp|scp|ftps|webdav|s3)://[[User]:[Password]@]HostName[:Port][/Path] + где (sftp|ftp|scp|ftps|webdav|s3) - имя протокола User - имя пользователя Password - пароль пользователя HostName - имя хоста Port - номер порта Path - путь + c. NetBox:SessionName[/Path] + где SessionName - сохранённое имя сессии + Path - путь + Особенности работы с FTP серверами допускающими анонимный логин. ВНИМАНИЕ! diff --git a/src/core/SessionData.cpp b/src/core/SessionData.cpp index af8b3d731..5b08d7929 100644 --- a/src/core/SessionData.cpp +++ b/src/core/SessionData.cpp @@ -2324,6 +2324,7 @@ bool TSessionData::ParseUrl(const UnicodeString & AUrl, TOptions * Options, int32_t DefaultProtocolPortNumber = 0; TFtps AFtps = ftpsNone; int32_t ProtocolLen = 0; + bool HasNetboxPrefix = false; if (Url.SubString(1, 7).LowerCase() == L"netbox:") { // Remove "netbox:" prefix @@ -2333,6 +2334,7 @@ bool TSessionData::ParseUrl(const UnicodeString & AUrl, TOptions * Options, // Remove "//" Url.Delete(1, 2); } + HasNetboxPrefix = true; } bool HttpForWebdav = FLAGCLEAR(Flags, pufPreferProtocol) || (FSProtocol != fsS3); if (IsProtocolUrl(Url, ScpProtocol, ProtocolLen)) @@ -2364,6 +2366,7 @@ bool TSessionData::ParseUrl(const UnicodeString & AUrl, TOptions * Options, DefaultProtocolPortNumber = FtpPortNumber; } else if (IsProtocolUrl(Url, WebDAVProtocol, ProtocolLen) || + (!HasNetboxPrefix && IsProtocolUrl(Url, WebDAVAltProtocol, ProtocolLen)) || (HttpForWebdav && IsProtocolUrl(Url, HttpProtocol, ProtocolLen))) { AFSProtocol = fsWebDAV; @@ -2484,13 +2487,13 @@ bool TSessionData::ParseUrl(const UnicodeString & AUrl, TOptions * Options, { DoCopyData(Data, ParseOnly); FSource = Data->FSource; - /*int32_t P = 1; + int32_t P = 1; while (!AnsiSameText(DecodeUrlChars(Url.SubString(1, P)), SessionNameWithoutFolder)) { P++; DebugAssert(P <= Url.Length()); } - ARemoteDirectory = Url.SubString(P + 1, Url.Length() - P);*/ + ARemoteDirectory = Url.SubString(P + 1, Url.Length() - P); if (Data->Hidden && !ParseOnly) { @@ -2662,6 +2665,7 @@ bool TSessionData::ParseUrl(const UnicodeString & AUrl, TOptions * Options, } } + ARemoteDirectory = ARemoteDirectory.TrimRight(); if (!ARemoteDirectory.IsEmpty() && (ARemoteDirectory != ROOTDIRECTORY)) { if ((ARemoteDirectory[ARemoteDirectory.Length()] != Slash) && @@ -2670,7 +2674,7 @@ bool TSessionData::ParseUrl(const UnicodeString & AUrl, TOptions * Options, *AFileName = DecodeUrlChars(base::UnixExtractFileName(ARemoteDirectory)); ARemoteDirectory = base::UnixExtractFilePath(ARemoteDirectory); } - SetRemoteDirectory(DecodeUrlChars(RemoteDirectory)); + SetRemoteDirectory(DecodeUrlChars(ARemoteDirectory)); // Is already true for ad-hoc URL, but we want to error even for "storedsite/path/"-style URL. RequireDirectories = true; } diff --git a/src/core/SessionData.h b/src/core/SessionData.h index 1fc7b6fd6..ff4aabd36 100644 --- a/src/core/SessionData.h +++ b/src/core/SessionData.h @@ -108,6 +108,7 @@ constexpr const wchar_t * FtpsProtocol = L"ftps"; constexpr const wchar_t * FtpesProtocol = L"ftpes"; constexpr const wchar_t * WebDAVProtocol = L"dav"; constexpr const wchar_t * WebDAVSProtocol = L"davs"; +constexpr const wchar_t * WebDAVAltProtocol = L"webdav"; constexpr const wchar_t * S3Protocol = L"s3"; constexpr const wchar_t * S3PlainProtocol = L"s3plain"; constexpr const wchar_t * SshProtocol = L"ssh";