Skip to content

Commit

Permalink
Merge remote-tracking branch 'ssvine/fix-webdav-prefix'
Browse files Browse the repository at this point in the history
  • Loading branch information
michaellukashov committed Apr 10, 2024
2 parents 40d4528 + 752874f commit ec4a6ff
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 8 deletions.
14 changes: 9 additions & 5 deletions README.RU.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/).
Expand All @@ -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 серверами допускающими анонимный логин.

ВНИМАНИЕ!
Expand Down
10 changes: 7 additions & 3 deletions src/core/SessionData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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))
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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) &&
Expand All @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions src/core/SessionData.h
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down

0 comments on commit ec4a6ff

Please sign in to comment.