michaellukashov / Far-NetBox

SFTP/SCP/FTP/FTPS/WebDAV/S3 client for Far Manager 3 (http://farmanager.com/)
https://forum.farmanager.com/viewtopic.php?t=6317
GNU General Public License v2.0
158 stars 52 forks source link

Ошибка при формировании строки даты для WebDAV PROPPATCH #261

Closed yar229 closed 5 months ago

yar229 commented 6 years ago

https://github.com/michaellukashov/Far-NetBox/blob/master/src/core/WebDAVFileSystem.cpp

DateTime.DecodeDate(Y, M, D);
DateTime.DecodeTime(H, NN, S, MS);
UnicodeString LastModified = FORMAT("%04d, %d %02d %04d %02d:%02d%02d 'GMT'", D, D, M, Y, H, NN, D);
VictorVG commented 6 years ago

Не обязательно - всё зависит от локали вашей системы. Мы же настраиваем её так как нам удобно и я к примеру вижу время так:

1

или я обязан видеть что-то иное?

yar229 commented 6 years ago

Я не про отображение в панелях, с этим все нормально. При закачке файла на webdav сервер идут запросы

VictorVG commented 6 years ago

Сейчас попробовал от себя https://yadi.sk/i/AmzxSqpN3PyUDy и запросов не получил. Попробуйте импортировать настройки YD (WebDAV).netbox.zip, а после введите логин и пароль YD.

yar229 commented 6 years ago

Перед копированием выставляем галку Transfer Settings -> Preserve timestamp Закачиваю файл, созданный 2017-11-23 21:03 (UTC)

Сервер получает

И оно такое отослано плагином, это просто строка из пришедшего xml, ничего не менял

Должно быть что-то вроде Thu, 23 Nov 2017 21:03:00 GMT

yar229 commented 6 years ago

Попробуйте импортировать настройки YD (WebDAV).netbox.zip, а после введите логин и пароль YD.

Если я правильно смотрю в код формирования запроса

DateTime.DecodeDate(Y, M, D);
DateTime.DecodeTime(H, NN, S, MS);
UnicodeString LastModified = FORMAT("%04d, %d %02d %04d %02d:%02d%02d 'GMT'", D, D, M, Y, H, NN, D);

То там от настроек ничего не зависит, хардкодом формируется строка И число месяца D три раза вставляется - вместо дня недели, вместо названия месяца и вместо секунд.

VictorVG commented 6 years ago

Так это вам у себя настройки прокси надо смотреть - вы же обращаетесь к серверу через него по 801 порту, а что там дальше портится знает только он. Внешние клиенты тут явно не при чём.

У того же YD как-то иной IP будет - 213.180.193.50:443 и у меня идёт обращение к нему через DNS минуя неизвестно как построенный локальный прокси который ждёт строго определённый формат данных, а на любой иной ругается.

yar229 commented 6 years ago

Странное предположение, когда это прокси меняли xml в теле http-запроса.

Это не яндекс, это адрес запущенного локально webdav-сервера, по дороге от клиента до сервера - только localhost и никаких прокси.

Яндекс парсит, и я могу, конечно, распарсить на своей стороне и такой формат даты, но это не отменяет того, что он не верный.

VictorVG commented 6 years ago

При чём тут NetBox и другие клиенты если ваш локальный сервер матерится на всех? У меня с той же настройкой:

1

ни один из десятка вебдав серверов не матерится. Значит или ваш локальный сервер неправильно настроен, либо он из коробки кривой ибо не бывает так, что вся рота шагает не в ногу и только один в дым пьяный поручик шагает в ногу. Такого даже бравый солдат Швейк и его командир поручик Лукаш в ночном кошмаре не могли бы себе представить. :)

yar229 commented 6 years ago

Ммм... посмотрите RFC4918 HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)

И матерится он только на NetBox

VictorVG commented 6 years ago

Вы немного документацию-то почитайте - в RFC-4918 через RFC-3339 5.6 идёт ссылка на RFC 822 5.1:

  1. DATE AND TIME SPECIFICATION

    5.1. SYNTAX

    date-time = [ day "," ] date time ; dd mm yy ; hh:mm:ss zzz

    day = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"

    date = 1*2DIGIT month 2DIGIT ; day month year ; e.g. 20 Jun 82

    month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

    time = hour zone ; ANSI and Military

    hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT] ; 00:00:00 - 23:59:59

    zone = "UT" / "GMT" ; Universal Time ; North American : UT / "EST" / "EDT" ; Eastern: - 5/ - 4 / "CST" / "CDT" ; Central: - 6/ - 5 / "MST" / "MDT" ; Mountain: - 7/ - 6 / "PST" / "PDT" ; Pacific: - 8/ - 7 / 1ALPHA ; Military: Z = UT; ; A:-1; (J not used) ; M:-12; N:+1; Y:+12 / ( ("+" / "-") 4DIGIT ) ; Local differential ; hours+min. (HHMM)

и смотрим формат который вы считаете недопустимым

%04d, %d %02d %04d %02d:%02d%02d 'GMT'", D, D, M, Y, H, NN, D

результат соответствует RFC 822 и RFC 3339, а коли ваш конкретный сервер написан с игнорированием RFC, так же и WinSCP начиная с v5.10 beta 3 игнорирует RFC-1738 это не делает их эталоном раз, и из их авторов не приходится как из вас тащить подробности с помощью дыбы и пыточных клещей, два. Я потратил свой время и просмотрел и вторую ссылку - по крайней мере я как иженер не вижу взаимосвязи событий.

yar229 commented 6 years ago

Раз вы видите соответствие между Thu, 23 Nov 2017 21:03:00 GMT и 0023, 23 11 2017 21:0223 'GMT', то, пожалуй, вам стоит приберечь свою язвительность для случаев, которые входят в сферу вашей иженерной компетенции. Спасибо за ваш потраченный время.

VictorVG commented 6 years ago

Можете продолжать бездоказательно обвинять. У вас сиё отлично получается.

yar229 commented 6 years ago

Я привёл конкретный код из этого репозитория, который формирует конкретное значение.

Пожалуй, хватит вас кормить...

VictorVG commented 6 years ago

Ладно, давайте считать недорузумение из-за того что мы не поняли друг друга исчерпанным. Приношу свои извинения за недопустимый тон.

С формированием значения вы правы и тут надо проверять. Явно есть повод для проверки этого фрагмента алгоритма.