Drupal 7 и Приватные файлы

С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.

Задача: Прикрепить к статье файл.

Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)

Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.

Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:

Цитата:

Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.

Для начала нам надо настроить “файловую систему” первым делом надо создать приватную папку, где будут хранится все наши приватные файлы. Я сделал это следующим образом:

cd /путь/к/папке/с/установленным/друпалом/sites/default chmod 755 . mkdir files-private chmod 555 .

Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.

Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:

Цитата:

Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()

Тут кстати автор опЯчататься. На самом деле хук называется  hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей  hook_permission, а второй тот самый  hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.

После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.

Теперь идем по дополнительным пунктам:

Цитата:

1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать

Уже сделано.

Цитата:

2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации

В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.

3 и 4 пункты решает модуль  Download Count вот только портировать под 7-ку еще надо его. А вот это  Download Tools для семерки, но сам его не тестил.

Ну в общем-то тема раскрыта, комментируем.

Источник: http://drupal.ru/node/56888

Drupal 7 и Приватные файлы

С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.

Задача: Прикрепить к статье файл.

Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)

Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.

Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:

Цитата:

Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.

Для начала нам надо настроить “файловую систему” первым делом надо создать приватную папку, где будут хранится все наши приватные файлы. Я сделал это следующим образом:

cd /путь/к/папке/с/установленным/друпалом/sites/default chmod 755 . mkdir files-private chmod 555 .

Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.

Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:

Цитата:

Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()

Тут кстати автор опЯчататься. На самом деле хук называется  hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей  hook_permission, а второй тот самый  hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.

После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.

Теперь идем по дополнительным пунктам:

Цитата:

1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать

Уже сделано.

Цитата:

2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации

В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.

3 и 4 пункты решает модуль  Download Count вот только портировать под 7-ку еще надо его. А вот это  Download Tools для семерки, но сам его не тестил.

Ну в общем-то тема раскрыта, комментируем.

Источник: http://www.drupal.ru/node/56888

© 2009 Обзор CMS