В принципе для чтения работает. Но внести изменения не могу. Требует авторизации. Учетные записи из UserList не срабатывают.
Вообще как разделить доступ к календарю: одним только для чтения, другим для изменения?
Как это реализовать в acWeb?
Спасибо.
В логе acWEB.log должны появиться записи "UPLOADING..." и т.д. — реакция по умолчанию, заданная в acWEB\conf\http\PrePUT.rules.txt и acWEB\conf\http\PostPUT.rules.txt. Предполагается, что в PostPUT файл будет перемещаться туда, куда задумано админом — в публичный каталог, например (где на календарь могут подписаться другие).
Вот кусок из acWeb.log:
UPLOADING:..\script\control\wwwroot\my\
<?xml version="1.0"?>
<D:Propfind xmlns="DAV:"><D:Prop><D:getetag/></D:Prop></D:Propfind>
..\script\control\wwwroot\my\test2.ics
/my/test2.ics
..\script\control\wwwroot\my\test2.ics*
<?xml version='1.0' encoding='utf-8'?>
<D:multistatus xmlns='DAV:' xmlns:ns1='http://apache.org/dav/props/' xmlns:ns0='DAV:'>
<D:response xmlns:lp1='DAV:' xmlns:lp3='http://subversion.tigris.org/xmlns/dav/' xmlns:g0='DAV:' xmlns:g1='http://apache.org/dav/props/'>
<D:href>/my/test2.ics</D:href>
<D:Propstat>
<D:Prop>
<lp1:getcontentlength>118</lp1:getcontentlength>
<lp1:getcontenttype>text/xml</lp1:getcontenttype>
<lp1:creationdate>Tue, 06 May 2008 05:07:41 GMT</lp1:creationdate>
<lp1:getlastmodified>Tue, 06 May 2008 05:07:41 GMT</lp1:getlastmodified>
<lp1:resourcetype/>
<lp1:checked-in><D:href>/my/test2.ics</D:href></lp1:checked-in>
</D:Prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:Propstat>
<D:Propstat>
<D:Prop>
<g1:executable/>
<g0:checked-out/>
</D:Prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
</D:Propstat>
</D:response>
</D:multistatus>
AcceptDirectory: .
AcceptDirectory: ..\CONF\pub\wwwroot
AcceptDirectory: ..\script\control\wwwroot
AcceptDirectory: ..\script\control\wwwroot\my
AcceptDirectory: ..\script\control\wwwroot
AcceptDirectory: ..\script\control\wwwroot\my
..\script\control\wwwroot\my\
UPLOADING:..\script\control\wwwroot\my\
<?xml version="1.0"?>
<D:Propfind xmlns="DAV:"><D:Prop><D:getetag/></D:Prop></D:Propfind>
..\script\control\wwwroot\my\test2.ics
/my/test2.ics
..\script\control\wwwroot\my\test2.ics*
<?xml version='1.0' encoding='utf-8'?>
<D:multistatus xmlns='DAV:' xmlns:ns1='http://apache.org/dav/props/' xmlns:ns0='DAV:'>
<D:response xmlns:lp1='DAV:' xmlns:lp3='http://subversion.tigris.org/xmlns/dav/' xmlns:g0='DAV:' xmlns:g1='http://apache.org/dav/props/'>
<D:href>/my/test2.ics</D:href>
<D:Propstat>
<D:Prop>
<lp1:getcontentlength>118</lp1:getcontentlength>
<lp1:getcontenttype>text/xml</lp1:getcontenttype>
<lp1:creationdate>Tue, 06 May 2008 05:07:41 GMT</lp1:creationdate>
<lp1:getlastmodified>Tue, 06 May 2008 05:07:41 GMT</lp1:getlastmodified>
<lp1:resourcetype/>
<lp1:checked-in><D:href>/my/test2.ics</D:href></lp1:checked-in>
</D:Prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:Propstat>
<D:Propstat>
<D:Prop>
<g1:executable/>
<g0:checked-out/>
</D:Prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
</D:Propstat>
</D:response>
</D:multistatus>
AcceptDirectory: .
AcceptDirectory: ..\CONF\pub\wwwroot
AcceptDirectory: ..\script\control\wwwroot
AcceptDirectory: ..\script\control\wwwroot\my
AcceptDirectory: ..\script\control\wwwroot
AcceptDirectory: ..\script\control\wwwroot\my
.( UPLOADING 2DUP TYPE CR добавьте строку:
Тогда закачиваемый пользователем календарь будет попадать в общедоступную папку http://eserv/ics/ в файл username.ics , и обновления туда же.
Вот кусок лога:
UPLOADING:..\script\control\wwwroot\my\
Upload result ior:0
AcceptDirectory: .
AcceptDirectory: ..\CONF\pub\wwwroot
AcceptDirectory: ..\script\control\wwwroot
AcceptDirectory: ..\script\control\wwwroot\my
AcceptDirectory: ..\script\control\wwwroot
AcceptDirectory: ..\script\control\wwwroot\my
<?xml version="1.0"?>
<D:Propfind xmlns="DAV:"><D:Prop><D:getetag/></D:Prop></D:Propfind>
..\script\control\wwwroot\my\test2.ics
/my/test2.ics
..\script\control\wwwroot\my\test2.ics*
<?xml version='1.0' encoding='utf-8'?>
<D:multistatus xmlns='DAV:' xmlns:ns1='http://apache.org/dav/props/' xmlns:ns0='DAV:'>
<D:response xmlns:lp1='DAV:' xmlns:lp3='http://subversion.tigris.org/xmlns/dav/' xmlns:g0='DAV:' xmlns:g1='http://apache.org/dav/props/'>
<D:href>/my/test2.ics</D:href>
<D:Propstat>
<D:Prop>
<lp1:getcontentlength>118</lp1:getcontentlength>
<lp1:getcontenttype>text/xml</lp1:getcontenttype>
<lp1:creationdate>Tue, 06 May 2008 05:07:41 GMT</lp1:creationdate>
<lp1:getlastmodified>Tue, 06 May 2008 05:07:41 GMT</lp1:getlastmodified>
<lp1:resourcetype/>
<lp1:checked-in><D:href>/my/test2.ics</D:href></lp1:checked-in>
</D:Prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:Propstat>
<D:Propstat>
<D:Prop>
<g1:executable/>
<g0:checked-out/>
</D:Prop>
<D:status>HTTP/1.1 404 Not Found</D:status>
</D:Propstat>
</D:response>
</D:multistatus>
Исправление обновления существующего календаря:
http://www.eserv.ru/download/acWEB_8233.rar
Еще нужен как минимум простейший контроль типа (расширения) записываемого файла, чтоб скрипты не закачали. Например, такой — полный PrePUT:
Т.е. если закачивается не *.ics, то принудительно уводим его из /my/. Или так:
Остался еще вопрос. Есть ли возможность разграничить права доступа к календарю: только для чтения и чтения-записи на уровне acWeb?
mixsv спасибо за тему
ac нужна небольшая статья по работе с SB используем Active Desktop Calendar, хотим SB, очень.
Статья о чем? Если просто о работе с SB, то тут все просто, а если про связку SB + acWEB + WebDav то можно конечно, только чуть позже, я сейчас в отпуске и за компьютер сажусь вечером раз в два дня.
Через недельку постараюсь в кратце описать как я это делал, если еще будет интересно.
Статья о связке "SB + acWEB + WebDav"
Ждем, интересно, спасибо.
Да. Чтобы запретить запись конкретного URL'а через WebDav в каталог /my/, можно добавлять правила в acWEB\conf\http\MyOnRequest2.rules.txt
Например запрет записи admin.ics не-админу:
Uri /my/admin.ics | LoggedAs: admin 0= | Forbidden \EOF или запрет записи someuser.ics, если авторизован не как someuser:
URI " /my/{User}.ics" STR@ ~= 0= | Unauthorized "{User} calendars" \EOF
ACTION =~ DavPutFile | URI " /my/{User}.ics" STR@ ~= 0= | Unauthorized "{User} calendars" \EOF
А
может уже готова?
А Eserv (любой версии, включая 2.x и даже 1.x) поддерживает публикацию iCal-календарей. WebDav для этого не нужен, т.к. команда PUT (используемая для публикации всеми календарными приложениями) появилась в HTTP еще до разработки DAV-расширений. Но все последние версии календарей для выяснения "а могу ли я публиковать в этот каталог" используют OPTIONS/PROPFIND, которые уже "dav'овые", поэтому в своё время потребовали доработки Eserv. В Eserv/2 реализован OPTIONS, но PROPFIND отсутствует. Т.е. SunBird'ом публиковать календари на Eserv/2 уже не получится. А на Eserv/3 и Eserv/4 получится.
Подписка на календари в случае iCal производится обычными GET-запросами, поэтому возможна во всех версиях Eserv. В CalDav календари хранятся в тех же iCal-форматах, но CalDav (в лице SunBird и Apple'овского календарей) предусматривает другой порядок подписки — указанием не конкретного календаря, а папки с календарями — список календарей в папке извлекается PROPFIND'ом, соответственно и поддержку версиями Eserv'а см. выше. Функционально с точки здения каледарного клиента между способом PUT/GET и PUT/PROPFIND разницы никакой (внутри один и тот же iCal). Технически второй способ слегка экономнее для клиента, но затратнее для серверных ресурсов (перебор содержимого каталога, каждое событие/задача попадает на сервере в отдельный ics-файл). В SunBird/Lightning при создании календарей лучше использовать iCal-метод, т.к. только в этом случае вы точно знаете, какой URL указать для подписки на тот же календарь в Windows Calendar или Outlook.
http://www.eserv.ru/download/acWEB_180509.rar
Но опять же имеется проблема. Apache, например, не дает перезаписать файл, пока не скачаешь последнюю версию этого файла. Т.е. если кто-то что-то записал в задание, другой не может добавить что-то свое пока не нажмет кнопочку Обновить. Насколько я понимаю, за подобное поведение отвечает модуль dav_lock acWeb, по крайней мере пока, таким функционалом не располагает. Есть ли такое в планах?
И, опять же, в CalDAV проблемы блокировок нет. И при описанном мною выше способе работы с iCal (у каждого _свой_ календарь, и каждый подписывается на календари интересующих его людей) тоже.