Друпалургия

Drupal-школа - четвертое занятие: создание нового типа контента, управление полями и их отображением на Drupal 8.

Drupal в рунете - вс, 25/06/2017 - 15:02

Практическое занятие по созданию нового типа материалов и работе с полями на Drupal 8.

Содержание: добавление нового вида материалов; настройка полей; настройка полей с изображениями (минимальное и максимальное разрешение и пр.); управление отображением полей в материале и его тизере; настройка показа материала на главой странице; настройка показа автора и даты публикации материала .

Фрагмент занятия от 1.02.2017.

Drupal-школа - проект посвященный обучению школьников (13 гимназия, г. Новосибирск) веб-разработке на основе CMS Drupal 8. Поддерживается администрацией школы, сибирским сообществом друпаллеров DrupalSib и группой компаний i20.

Версия Drupal: Drupal 8.*Ключевые слова: друпал-школа Форумы: DrupalSib2 Спасибо
Категории: Друпалургия

Обновление Drupal (новые версии Drupal 7.56 и Drupal 8.3.4)

Drupal в рунете - чт, 22/06/2017 - 16:18
Newsletter: Новости Друпал

Примечания к выпуску:
Настоятельно рекомендуется обновить существующие сайты на Drupal 7 и Drupal 8, т.к. в новых версиях решена проблема связанная с безопасностью DRUPAL-SA-CORE-2017-003

Описание:

PECL YAML - CVE-2017-6920

Парсер PECL YAML не безопасно обрабатывает объекты PHP во время определенных операций в ядре Drupal. Это может привести к удаленному выполнению кода.

Файл REST ресурса неправильно проверяет - CVE-2017-6921

Ресурс REST файла неправильно обрабатывает некоторые поля при работе с файлами. Сайт будет затронут этим, лишь в том случае, если на сайте включен модуль RESTful Web Services (rest), ресурс REST файла включен и разрешает запросы PATCH, а злоумышленник может получить или зарегистрировать учетную запись пользователя на сайте с разрешениями на загрузку файлов и изменить файловый ресурс.

Файлы, загруженные анонимными пользователями в частную файловую систему, могут быть доступны другим анонимным пользователям - CVE-2017-6922

Частные файлы, которые были загружены анонимным пользователем, но не постоянно прикреплены к контенту на сайте, должны быть видны только анонимному пользователю, который их загрузил, а не всем анонимным пользователям. Ядро Drupal ранее не предоставляло эту защиту, что позволяло избежать уязвимости доступа. Эта проблема смягчается тем фактом, что для того, чтобы быть затронутым, сайт должен позволять анонимным пользователям загружать файлы в частную файловую систему.

Команда безопасности Drupal также получила сообщения о том, что эта уязвимость используется для целей спама, аналогично сценарию, обсуждаемому в PSA-2016-003 для общедоступной файловой системы.

Подробнее об новых версиях

0 Спасибо
Категории: Друпалургия

Как создать подтему (sub-theme) и для чего это нужно

Drupal в рунете - пн, 19/06/2017 - 21:23

Добрый день в этом посте я вам расскажу как создать подтему и для чего это нужно. Чтоб не читать сей длинный опус предлагаю посмотреть видео:

Ну а для тех кто лучше воспринимает информацию визуально вот некая расшифровка видео.

Для чего это нужно

Вариант №1. Скачали вы тему с d.org или где-то ее купили, есть большая вероятность того, что вас эта тема устраивает не полностью. И вы начинаете вносить в нее какие-то изменения. Но вот автор темы выпустил обновления, вы не думая обновились и все вроде бы прекрасно, но все ваши изменения пропали.

Вариант №2. Создали вы свою тему и все у вас прекрасно, но вот пришел заказчик, начальник или вы сами вдруг решили не много изменить тему под какой-то например праздник. Не переделывать же основную тему, а через какое-то время ее менять обратно.

В обоих случаях я следует использовать подтему. Она не только поможет вам не потерять свои изменения и пользоваться новыми фичами родительской темы, но и послужит прекрасным вариантом небольших изменений для праздников которые вы сможете из года в год включать и не заморачиваться.

Как создать

В друпал 7 есть стандартная тема Бартик, на ее основе мы будем делать подтему. Для начала переходим в папку sites/all/themes и создаем там папку с нашей темой, допустим swd. Называться наша тема должна на английском и начинаться с буквы. Внутри папки swd создаем файл swd.info, именно по этому файлу друпал поймет что мы создали тему. Так же содаем папку css и в ней файл style.css. Так как мы создаем тему на основе Бартика, то рекомендую вам просто скопировать содержимое bartik.info в наш файл, с не большими изменениями:

name = SWD
description = SWD Bartik sub-theme
package = Core
version = 0.1
core = 7.x
base theme = bartik

stylesheets[all][] = css/style.css

regions[header] = Header
regions[help] = Help
regions[page_top] = Page top
regions[page_bottom] = Page bottom
regions[highlighted] = Highlighted

regions[featured] = Featured
regions[content] = Content
regions[sidebar_first] = Sidebar first
regions[sidebar_second] = Sidebar second

regions[triptych_first] = Triptych first
regions[triptych_middle] = Triptych middle
regions[triptych_last] = Triptych last

regions[footer_firstcolumn] = Footer first column
regions[footer_secondcolumn] = Footer second column
regions[footer_thirdcolumn] = Footer third column
regions[footer_fourthcolumn] = Footer fourth column
regions[footer] = Footer

Самое главное в нашем файле, это строка base theme = bartik, где bartik машинное имя родительской темы. На нашем сайте заходим в Оформление и видим, что появилась наша тема, включаем ее по умолчанию и переходим на главную страницу. Видим что тут слегка все перекошено. Все это потому, что у нас пустой css, вы можете заполнять его своими свойствами или полностью скопировать css родительской темы и вносить свои изменения.

Так же можно переопределять шаблоны рендеринга страниц в нашей теме. Например из папки themes/bartik/templates мы можем скопировать файл page.tpl.php в нашу тему (рекомендую в нашей теме создать папку templates и копировать туда, но можно и в корень нашей темы). Этот файл отвечает за рендеринг страниц нашего файла. Для того чтобы убедиться, что все работает предлагаю удалить из него например вот это:

<?php if ($main_menu): ?>
      <div id="main-menu" class="navigation">
        <?php print theme('links__system_main_menu', array(
          'links' => $main_menu,
          'attributes' => array(
            'id' => 'main-menu-links',<h3></h3>
            'class' => array('links', 'clearfix'),
          ),
          'heading' => array(
            'text' => t('Main menu'),
            'level' => 'h2',
            'class' => array('element-invisible'),
          ),
        )); ?>
      </div> <!-- /#main-menu -->
    <?php endif; ?>

Этот кусок отвечает за вывод main menu (основного меню). Обязательно очищаем кэш, переходим на главную страницу и видим, что меню в верху страницы больше нет, а значит все подключилось и прекрасно работает.

В каждой теме есть файл template.php. В нем находится вся логика нашей темы. Вы можете его создавать а можете и не создавать. Первоначально выполняется то что находится в файле подтеме, а только потом темы родителя, так что дублировать его содержимое не нужно. Подробней о создании подтем можно почитать на д.орг.

Вместо заключения

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

Тип материала: Предлагаю решениеВерсия Drupal: Drupal 7.*Ключевые слова: sub-theme Форумы: Установка и настройка2 Спасибо
Категории: Друпалургия

Обновление Drupal 7 (новая версия Drupal 7.55)

Drupal в рунете - чт, 08/06/2017 - 22:46
Newsletter: Новости Друпал

Примечания к выпуску:

В данной версии Drupal отсутствую исправления связанные с безопасностью.

В версия Drupal 7.55 сделаны изменения в .htaccess

  • Изменена поддержка таких сервисов, как Let's Encrypt, заставив Drupal не блокировать известный каталог, определенный RFC 5785 (см. # 2847325).
  • Изменение, позволяющее сайтам Drupal корректно работать на Apache 2.4, когда модуль mod_access_compat Apache отключен (см. # 1599774).

Рекомендуется обновить пользовательские версии .htaccess для включения этих изменений, но это не является обязательным.

Подробнее об новой версии

0 Спасибо
Категории: Друпалургия

Выпущен Drupal 8.3.3

Drupal в рунете - чт, 08/06/2017 - 03:35
Newsletter: Новости Друпал

Примечания к выпуску:

Выпущена готовая к использованию версия Drupal 8.3.3. См. CHANGELOG.txt для ознакомления с изменениями и улучшениями со времени последней минорной версии. Узнайте больше о Drupal 8.

Этот выпуск содержит только исправления ошибок, а также улучшения документации и тестирования.

В этой версии Drupal 8 решены следующие важные проблемы:

Изменения в процессе обновления с Drupal 8.2.3

Drupal 8.2.3 (и последующие), больше не будут содержать библиотек разработки PHP (ранее они находились в ядре Drupal 8, а теперь их надо будет дополнительно устанавливать). Drupal 8 больше не будет включать зависимости разработчиков в пакетах выпуска. См. UPDATE.TXT в Drupal для получения полных инструкций по обновлению.

Подробнее об новой версии

Ключевые слова: Выпущен Drupal 8.3.30 Спасибо
Категории: Друпалургия

Не используйте PHP фильтр!

Drupal в рунете - ср, 07/06/2017 - 16:11

На форуме некоторые товарищи, иногда рекомендуют для решения задачи использовать встроенный в ядро PHP фильтр, или Views PHP. Никогда так не делайте! И вот почему:

  1. Данный код пишется в базу, поэтому его нельзя будет отследить через систему контроля версий, например git. (если вы не используете систему контроля версий в разработке - это тоже плохо).
  2. Поля с php-фильтром не кэшируются.
  3. Код в php-фильтре выполняется через eval(). Код через eval работает медленнее, не кэшируется opcache-м, а на некоторых хостингах eval может быть отключен из соображений безопасности.
  4. Не информативные сообщения об ошибках. Что-то типа error in eval() on line 4. Где этот кусок кода, что с ним делать?
  5. Проблемы с обновлением модулей. Обновление модуля - и у вас куча ошибок, которые сложно найти и исправить.
  6. Сложно писать и поддерживать такой код. В обычном textfield - нет форматирования как в IDE, да и шрифт не моноширинный. Копировать туда-обратно тоже заколебаться можно.
  7. Человеческий фактор. Всегда существует возможность ошибки в конфигурации, которая позволит не доверенным пользователям заюзать php-фильтр. ОЙ!
  8. Безопасность в целом. Любой сайт могут взломать, но присутствие на сайте php-фильтра может сделать последствия взлома гораздо тяжелее. XSS, SQL-инъекция - и вот вас уже shell прямо в базе. =)
  9. Сложности деплоя. Нельзя просто обновить файлы на сервере. Надо лезть в админку, и копипастить код в нужные места. Хотя обычно в PHP-фильтр пишут прямо на продакте. Не стоит работать на продакте.
  10. Повышается цена ошибки. Одна небольшая опечатка в сквозном блоке - и всё пропало, шеф.

Хорошо, PHP-фильтр использовать не стоит. А что же тогда делать?

  1. Через template_preprocess хуки.
  2. Можно создать свой токен и вставлять его с помощью  token_filter
  3. Можно создавать вычисляемые поля с помощью  computed_field. Этот модуль даже сам подскажет вам, какое название функции использовать.
  4. Если используется Display Suite - можно написать своё Display Suite поле
  5. Ещё варианты, тысячи их! В зависимости от задачи.
Тип материала: Предлагаю решениеВерсия Drupal: Drupal 7.*Модули и темы: PHP filterdisplay suitecomputed_fieldtoken_insert Форумы: Программирование4 Спасибо
Категории: Друпалургия

Модуль Performance Monitor - оценка производительности системного окружения

Drupal в рунете - вт, 06/06/2017 - 12:32

Всем привет!

Недавно я опубликовал модуль Performance monitor, который позволяет быстро и из админки Drupal оценить производительность системного окружения Drupal сайта.

В каким случаях он будет полезен:

  1. При переезде на новый хостинг позволить быстро сравнить показатели старого и нового хостинга.
  2. При переезде на виртуальный/выделенный сервер позволит оценить оптимальность настройки системного окружения.
  3. Если сайт медленно стал работать, тоже может помочь понять нет ли проблемы в настройках серверного окружения.

Модуль помогает:

  1. Оценить время генерации страниц.
  2. Проверить статус и настройки MySQL.
  3. Проверить включен ли php opcache.
  4. Проверить используется ли сайтом Memcached для кэширования.
  5. Собрать статистику по потреблению системных ресурсов для дальнейшей оптимизации.

Надеюсь модуль будет полезен, буду рад услышать комментарии и предложения по использованию, доработке, исправлению ошибок в модуле.

Ссылка на краткую инструкцию в блоге: https://drupal-admin.ru/blog/performance-monitor
Ссылка на модуль: https://www.drupal.org/project/perfmon

Тип материала: Предлагаю решениеВерсия Drupal: Drupal 7.*Ключевые слова: Drupal 7 производительностьМодули и темы: perfmon Форумы: Системное окружение1 Спасибо
Категории: Друпалургия

Земельная реформа друпал.ру

Drupal в рунете - пт, 02/06/2017 - 04:47
Access Level Control (ALC) Проблемы
  • Притеснение новичков со стороны старожилов
  • Дублирование контента
  • Контент не по тематике
Цели
  • Снизить травлю новичков
  • Заинтересовать сообщество в создании качественного контента
Решение

Для решения данной задачи требуется реорганизация структуры проекта с внедрением ограничения на публикацию контента. Всех пользователей ресурса можно разделить на 5 категорий:

  • Новички (уровень знаний и направления для развития пока не известны)
  • Администраторы сайта (умеют настраивать модули из админ. интерфейса)
  • Кодеры (люди, имеющие опыт в написании кода, знающие АПИ друпала)
  • Заказчики (просто нуждаются в исполнителях, знаниями могут либо не обладать вообще, либо умничают, начитавшись жёлтой прессы)
  • Спамеры (Всякая шалупонь, рекламирующая хостинги и прочие сервисы)

Предлагается "лестничное разграничение прав" на доступ к контенту. Проблема заключается в следующем: к "новичок -> администратор -> кодер" можно спокойно применить "лестницу", то "спамеры" и "заказчики" под этот принцип не попадают. Принцип лестничного разграничения прав предполагает, что любая ступенька "лестницы" может просматривать контент всех остальных ступений, за исключением закрытых разделов для каждой ступени. Публикация контента возможна внутри своей ступени и остальные низлежащие ступени за исключением закрытых разделов этих ступеней.

Повышение/понижение прав доступа

Для проверки уровня доступа предлагается использовать целочисленный счётчик для каждого пользователя. Чтобы всё не скатилось в кармафаппинг за "спасибки" необходима умная расчётная система.

Баллы начисляются:

  • Прохождение анкетирований и тестов
  • Привязки аккаунта к gihub (это так же будет своего рода идентификатором скилла)
  • Решение вопросов пользователей (Ответ помечен, как решение)
  • При оценке информационных и обучающих материалов другими пользователями

Баллы снимаются:

  • Тёмная материя
  • Нарушение правил
  • Минусование вопросов (за глупость, некорректность)
Публикация материалов в вышестоящие ступени

Возможна при ручном переносе модератором. Для этого вопрос должен иметь флаг на необходимость переноса топика вверх по лестнице (возможно даже указание ступени), либо находится в специальном разделе. Решение по переносу вопроса принимает модератор.

Реорганизация структуры контента

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

  • ALC В зависимости от количества баллов юзера:
    • Спамеры, Заказчики (0кацэ)
    • Новички (10кацэ)
    • Администраторы (20кацэ)
    • Кодеры (30кацэ).
  • Типы контента - На данный момент я вижу пока 5 типов контента:
    • Публикация - обучающий или инфо материал (Доступен всем, кроме первой категории)
    • Вопрос - Собственно вопрос, как сделать какую-нить "хреньку" (Всем, кроме первой категории)
    • Ответ - Ответ на вопрос (Всем, кроме первой категории)
    • Услуги - Раздел для спаммеров, рекламирующих свой хостинг и прочую якобы полезную "лабуду" (Доступен всем)
    • Заказы - Раздел, где заказчики, могут оставлять свои заказы (Доступен всем)

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

На этом у меня всё. Вопросы, критика, предложения в комменты.

Форумы: Сайт и проект Drupal.ru7 Спасибо
Категории: Друпалургия

Земельная реформа друпал.ру

Drupal в рунете - пт, 02/06/2017 - 04:47
Access Level Control (ALC) Проблемы
  • Притеснение новичков со стороны старожилов
  • Дублирование контента
  • Контент не по тематике
Цели
  • Снизить травлю новичков
  • Заинтересовать сообщество в создании качественного контента
Решение

Для решения данной задачи требуется реорганизация структуры проекта с внедрением ограничения на публикацию контента. Всех пользователей ресурса можно разделить на 5 категорий:

  • Новички (уровень знаний и направления для развития пока не известны)
  • Администраторы сайта (умеют настраивать модули из админ. интерфейса)
  • Кодеры (люди, имеющие опыт в написании кода, знающие АПИ друпала)
  • Заказчики (просто нуждаются в исполнителях, знаниями могут либо не обладать вообще, либо умничают, начитавшись жёлтой прессы)
  • Спамеры (Всякая шалупонь, рекламирующая хостинги и прочие сервисы)

Предлагается "лестничное разграничение прав" на доступ к контенту. Проблема заключается в следующем: к "новичок -> администратор -> кодер" можно спокойно применить "лестницу", то "спамеры" и "заказчики" под этот принцип не попадают. Принцип лестничного разграничения прав предполагает, что любая ступенька "лестницы" может просматривать контент всех остальных ступений, за исключением закрытых разделов для каждой ступени. Публикация контента возможна внутри своей ступени и остальные низлежащие ступени за исключением закрытых разделов этих ступеней.

Повышение/понижение прав доступа

Для проверки уровня доступа предлагается использовать целочисленный счётчик для каждого пользователя. Чтобы всё не скатилось в кармафаппинг за "спасибки" необходима умная расчётная система.

Баллы начисляются:

  • Прохождение анкетирований и тестов
  • Привязки аккаунта к gihub (это так же будет своего рода идентификатором скилла)
  • Решение вопросов пользователей (Ответ помечен, как решение)
  • При оценке информационных и обучающих материалов другими пользователями

Баллы снимаются:

  • Тёмная материя
  • Нарушение правил
  • Минусование вопросов (за глупость, некорректность)
Публикация материалов в вышестоящие ступени

Возможна при ручном переносе модератором. Для этого вопрос должен иметь флаг на необходимость переноса топика вверх по лестнице (возможно даже указание ступени), либо находится в специальном разделе. Решение по переносу вопроса принимает модератор.

Реорганизация структуры контента

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

  • ALC В зависимости от количества баллов юзера:
    • Спамеры, Заказчики (0кацэ)
    • Новички (10кацэ)
    • Администраторы (20кацэ)
    • Кодеры (30кацэ).
  • Типы контента - На данный момент я вижу пока 5 типов контента:
    • Публикация - обучающий или инфо материал (Доступен всем, кроме первой категории)
    • Вопрос - Собственно вопрос, как сделать какую-нить "хреньку" (Всем, кроме первой категории)
    • Ответ - Ответ на вопрос (Всем, кроме первой категории)
    • Услуги - Раздел для спаммеров, рекламирующих свой хостинг и прочую якобы полезную "лабуду" (Доступен всем)
    • Заказы - Раздел, где заказчики, могут оставлять свои заказы (Доступен всем)

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

На этом у меня всё. Вопросы, критика, предложения в комменты.

Форумы: Сайт и проект Drupal.ru6 Спасибо
Категории: Друпалургия

Drupal и vue.js: как работать без jquery

Drupal в рунете - чт, 01/06/2017 - 00:11

Вольный перевод: https://www.adcisolutions.com/knowledge/drupal-vuejs-how-work-without-jquery

Начиная с 5-ой версии, Drupal содержит jQuery.
Это замечательный инструмент для разработчика. Был)
В настоящее время мы сталкиваемся с массой задач, проблем, которые эта библиотека не решает, и не снимает.

Зачем обращать внимание на Vue.js? О чем пойдет речь в статье?

  1. Как улучшить пользовательский интерфейс без jQuery.
  2. Как работать с компонентами Vue.js.
  3. Как интегрировать Vue.js со сторонними библиотеками.
  4. Как создать простое одностраничное приложение.

Начало

Самый простой способ подключить библиотеку vue.js - используя тег script

<script src="https://unpkg.com/vue"></script>

Кроме этого можно использовать npm пакет или модуль drupal.

Улучшение пользовательского интерфейса

Увы, Drupal не позволяет нам разрабатывать современный реактивный пользовательский интерфейс.
В ядре есть jQuery - но эта либа, не для этих дел)
Попробуем Vue.js для улучшения некоторых пользовательских элементов Drupal.

К примеру, мы хотим показать кнопку "Создать нового пользователя" только тогда, когда заполнены поля "Почта" и "Имя пользователя".

<form enctype="multipart/form-data" action="/user/register" method="post" id="user-register-form" accept-charset="UTF-8">
<div id="edit-account" class="form-wrapper">
 <div class="form-item form-type-textfield form-item-name">
   <label for="edit-name">Username <span class="form-required" title="This field is required.">*</span></label>
   <input class="username form-text required" autocapitalize="none" type="text" id="edit-name" name="name" value="" size="60" maxlength="60" v-model="name">
 </div>
<div class="form-item form-type-textfield form-item-mail">
 <label for="edit-mail">Email <span class="form-required" title="This field is required.">*</span></label>
<input type="text" id="edit-mail" name="mail" value="" size="60" maxlength="254" class="form-text required" v-model="mail">
</div>
<div class="form-actions form-wrapper" id="edit-actions"><input type="submit" id="edit-submit"
name="op" value="Create new account" class="form-submit" v-show="name && mail"></div>
</div>
</form>

var app = new Vue({
 el: '#user-register-form',
 data: {
   name: '',
   mail: '',
 }
})

Компоненты Vue.js

Сообщество Vue.js может предложить множество потрясающих компонентов, один из которых попробуем использовать.

Цель, проверить входные данные на стороне клиента, добавим следующее:

<script src=”https://cdn.jsdelivr.net/vee-validate/2.0.0-beta.25/vee-validate.js”></script>

vee-validate это легкий плагин Vue.js, позволяющий проверять поля ввода и отображать ошибки

Изменим элементы ввода

<input class="username form-text required" autocapitalize="none" type="text" id="edit-name"
name="name" value="" size="60" maxlength="60" v-model="name" v-validate.initial="name"
data-rules="required|alpha|min:3">
<input type="text" id="edit-mail" name="mail" value="" size="60" maxlength="254"
class="form-text required" v-model="mail" v-validate.initial="email"
data-rules="required|email">

Как вы видите, использовать Vue.js и ее компоненты для улучшения существующих элементов - не сложно.

Vue.js и другие библиотеки

В этом примере интегрируем jQuery плагин select2 обернув его в свой компонент.

<div id="el"></div>

<!-- using string template here to work around HTML <option> placement restriction -->
<script type="text/x-template" id="demo-template">
  <div>
    <p>Selected: {{ selected }}</p>
    <select2 :options="options" v-model="selected">
      <option disabled value="0">Select one</option>
    </select2>
  </div>
</script>

<script type="text/x-template" id="select2-template">
  <select>
    <slot></slot>
  </select>
</script>

Vue.component('select2', {
  props: ['options', 'value'],
  template: '#select2-template',
  mounted: function () {
    var vm = this
    $(this.$el)
      // init select2
      .select2({ data: this.options })
      .val(this.value)
      .trigger('change')
      // emit event on change.
      .on('change', function () {
        vm.$emit('input', this.value)
      })
  },
  watch: {
    value: function (value) {
      // update value
      $(this.$el).val(value).trigger('change');
    },
    options: function (options) {
      // update options
      $(this.$el).select2({ data: options })
    }
  },
  destroyed: function () {
    $(this.$el).off().select2('destroy')
  }
})

var vm = new Vue({
  el: '#el',
  template: '#demo-template',
  data: {
    selected: 2,
    options: [
      { id: 1, text: 'Hello' },
      { id: 2, text: 'World' }
    ]
  }
});

Vue.js не ведет себя так, как будто она одна на весь сайт (в отличии от React).
Мы можем использовать другие js-компоненты и позволить им работать с Virtual DOM.

Одностраничное приложение

Все что нужно для создания одностраничного приложения - есть в vue-router.

<script src=”https://unpkg.com/vue-router/dist/vue-router.js”></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- use router-link component for navigation. -->
    <!-- specify the link by passing the `to` prop. -->
    <!-- <router-link> will be rendered as an `<a>` tag by default -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- route outlet -->
  <!-- component matched by the route will render here -->
  <router-view></router-view>
</div>

const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// Each route should map to a component. The "component" can
// either be an actual component constructor created via
// Vue.extend(), or just a component options object.
// We'll talk about nested routes later.
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

// You can pass in additional options here, but let's
// keep it simple for now.
const router = new VueRouter({
  routes // short for routes: routes
})

// Make sure to inject the router with the router option to make the
// whole app router-aware.
const app = new Vue({
  router
}).$mount('#app')

Заключение

Как мы уже убедились - Vue.js прост в использвании, и полезен для проектов любого масштаба.
Надеюсь, после прочтения статьи, вы начнете удовлетворять свое любопытство на практике.
Сылки ниже могут быть полезны.

http://vuejs.org/
https://www.npmjs.com/package/vue
https://www.drupal.org/project/vuejs
http://about.gitlab.com/2016/10/20/why-we-chose-vue/
https://github.com/jcottrell/vue-example-contact-form
https://medium.freecodecamp.com/vue-js-introduction-for-people-who-know-just-enough-jquery-to-get-by-eab5aa193d77

Тип материала: Предлагаю решениеВерсия Drupal: Drupal 8.*Ключевые слова: Vue.js Форумы: Программирование2 Спасибо
Категории: Друпалургия

Drupal и vue.js: как работать без jquery

Drupal в рунете - чт, 01/06/2017 - 00:11

Вольный перевод: https://www.adcisolutions.com/knowledge/drupal-vuejs-how-work-without-jquery

Начиная с 5-ой версии, Drupal содержит jQuery.
Это замечательный инструмент для разработчика. Был)
В настоящее время мы сталкиваемся с массой задач, проблем, которые эта библиотека не решает, и не снимает.

Зачем обращать внимание на Vue.js? О чем пойдет речь в статье?

  1. Как улучшить пользовательский интерфейс без jQuery.
  2. Как работать с компонентами Vue.js.
  3. Как интегрировать Vue.js со сторонними библиотеками.
  4. Как создать простое одностраничное приложение.

Начало

Самый простой способ подключить библиотеку vue.js - используя тег script

<script src="https://unpkg.com/vue"></script>

Кроме этого можно использовать npm пакет или модуль drupal.

Улучшение пользовательского интерфейса

Увы, Drupal не позволяет нам разрабатывать современный реактивный пользовательский интерфейс.
В ядре есть jQuery - но эта либа, не для этих дел)
Попробуем Vue.js для улучшения некоторых пользовательских элементов Drupal.

К примеру, мы хотим показать кнопку "Создать нового пользователя" только тогда, когда заполнены поля "Почта" и "Имя пользователя".

<form enctype="multipart/form-data" action="/user/register" method="post" id="user-register-form" accept-charset="UTF-8">
<div id="edit-account" class="form-wrapper">
 <div class="form-item form-type-textfield form-item-name">
   <label for="edit-name">Username <span class="form-required" title="This field is required.">*</span></label>
   <input class="username form-text required" autocapitalize="none" type="text" id="edit-name" name="name" value="" size="60" maxlength="60" v-model="name">
 </div>
<div class="form-item form-type-textfield form-item-mail">
 <label for="edit-mail">Email <span class="form-required" title="This field is required.">*</span></label>
<input type="text" id="edit-mail" name="mail" value="" size="60" maxlength="254" class="form-text required" v-model="mail">
</div>
<div class="form-actions form-wrapper" id="edit-actions"><input type="submit" id="edit-submit"
name="op" value="Create new account" class="form-submit" v-show="name && mail"></div>
</div>
</form>

var app = new Vue({
 el: '#user-register-form',
 data: {
   name: '',
   mail: '',
 }
})

Компоненты Vue.js

Сообщество Vue.js может предложить множество потрясающих компонентов, один из которых попробуем использовать.

Цель, проверить входные данные на стороне клиента, добавим следующее:

<script src=”https://cdn.jsdelivr.net/vee-validate/2.0.0-beta.25/vee-validate.js”></script>

vee-validate это легкий плагин Vue.js, позволяющий проверять полля ввода и отображать ошибки

Изменим элементы ввода

<input class="username form-text required" autocapitalize="none" type="text" id="edit-name"
name="name" value="" size="60" maxlength="60" v-model="name" v-validate.initial="name"
data-rules="required|alpha|min:3">
<input type="text" id="edit-mail" name="mail" value="" size="60" maxlength="254"
class="form-text required" v-model="mail" v-validate.initial="email"
data-rules="required|email">

Как вы видите, использовать Vue.js и ее компоненты для улучшения существующих элементов - не сложно.

Vue.js и другие библиотеки

В этом примере интегрируем jQuery плагин select2 обернув его в свой компонент.

<div id="el"></div>

<!-- using string template here to work around HTML <option> placement restriction -->
<script type="text/x-template" id="demo-template">
  <div>
    <p>Selected: {{ selected }}</p>
    <select2 :options="options" v-model="selected">
      <option disabled value="0">Select one</option>
    </select2>
  </div>
</script>

<script type="text/x-template" id="select2-template">
  <select>
    <slot></slot>
  </select>
</script>

Vue.component('select2', {
  props: ['options', 'value'],
  template: '#select2-template',
  mounted: function () {
    var vm = this
    $(this.$el)
      // init select2
      .select2({ data: this.options })
      .val(this.value)
      .trigger('change')
      // emit event on change.
      .on('change', function () {
        vm.$emit('input', this.value)
      })
  },
  watch: {
    value: function (value) {
      // update value
      $(this.$el).val(value).trigger('change');
    },
    options: function (options) {
      // update options
      $(this.$el).select2({ data: options })
    }
  },
  destroyed: function () {
    $(this.$el).off().select2('destroy')
  }
})

var vm = new Vue({
  el: '#el',
  template: '#demo-template',
  data: {
    selected: 2,
    options: [
      { id: 1, text: 'Hello' },
      { id: 2, text: 'World' }
    ]
  }
});

Vue.js не ведет себя так, как будто она одна на весь сайт (в отличии от React).
Мы можем использовать другие js-компоненты и позволить им работать с Virtual DOM.

Одностраничное приложение

Все что нужно для создания одностраничного приложения - есть в vue-router.

<script src=”https://unpkg.com/vue-router/dist/vue-router.js”></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- use router-link component for navigation. -->
    <!-- specify the link by passing the `to` prop. -->
    <!-- <router-link> will be rendered as an `<a>` tag by default -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- route outlet -->
  <!-- component matched by the route will render here -->
  <router-view></router-view>
</div>

const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// Each route should map to a component. The "component" can
// either be an actual component constructor created via
// Vue.extend(), or just a component options object.
// We'll talk about nested routes later.
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

// You can pass in additional options here, but let's
// keep it simple for now.
const router = new VueRouter({
  routes // short for routes: routes
})

// Make sure to inject the router with the router option to make the
// whole app router-aware.
const app = new Vue({
  router
}).$mount('#app')

Заключение

Как мы уже убедились - Vue.js прост в использвании, и полезен для проектов любого масштаба.
Надеюсь, после прочтения статьи, вы начнете удовлетворять свое любопытство на практике.
Сылки ниже могут быть полезны.

http://vuejs.org/
https://www.npmjs.com/package/vue
https://www.drupal.org/project/vuejs
http://about.gitlab.com/2016/10/20/why-we-chose-vue/
https://github.com/jcottrell/vue-example-contact-form
https://medium.freecodecamp.com/vue-js-introduction-for-people-who-know-just-enough-jquery-to-get-by-eab5aa193d77

Тип материала: Предлагаю решениеВерсия Drupal: Drupal 8.*Ключевые слова: Vue.js Форумы: Программирование1 Спасибо
Категории: Друпалургия

Дружелюбный Drupal сайт (Василий Устинов) [DrupalCamp Краснодар 2016]

Drupal в рунете - пн, 22/05/2017 - 16:51

Череду докладов с DrupalCamp Краснодар 2016 продолжает Василий Устинов с докладом о том, чем является удобный и дружелюбный сайт с точки зрения пользователя и как сделать Drupal-сайт таковым!
Презентацию вы найдёте здесь -> https://www.slideshare.net/secret/GYZWYdirfp3gkp
Лайки, комментарии, подписка и репосты - лучшая поддержка хорошего доклада, смотрим и делимся с друзьями и коллегами!

>> Все презентации с конференции "DrupalCamp Краснодар 2016"

Версия Drupal: Drupal 8.*Drupal 7.*Ключевые слова: DrupalCampDrupalYug Форумы: Drupal Юг1 Спасибо
Категории: Друпалургия

Дружелюбный Drupal сайт (Василий Устинов) [DrupalCamp Краснодар 2016]

Drupal в рунете - пн, 22/05/2017 - 16:51

Череду докладов с DrupalCamp Краснодар 2016 продолжает Василий Устинов с докладом о том, чем является удобный и дружелюбный сайт с точки зрения пользователя и как сделать Drupal-сайт таковым!
Презентацию вы найдёте здесь -> https://www.slideshare.net/secret/GYZWYdirfp3gkp
Лайки, комментарии, подписка и репосты - лучшая поддержка хорошего доклада, смотрим и делимся с друзьями и коллегами!

>> Все презентации с конференции "DrupalCamp Краснодар 2016"

Версия Drupal: Drupal 8.*Drupal 7.*Ключевые слова: DrupalCampDrupalYug Форумы: Drupal Юг1 Спасибо
Категории: Друпалургия

Service Desk на базе Drupal (Максим Хабибуллин) [DrupalCamp Краснодар 2016]

Drupal в рунете - чт, 18/05/2017 - 22:14

Представляем вашему вниманию доклад Максима Хабибулина с ­DrupalCamp Краснодар 2016 о реальном кейсе работы над их Service Desk для промышленных предприятий, какой функционал реализовывали в сжатые сроки и много чего ещё интересного!
Видео: https://www.youtube.com/watch?v=QBEmJBgtaG8
Презентацию вы можете найти здесь -> https://www.slideshare.net/secret/BkV2XXZ0RmPgvb
Лайки, комментарии и подписка обязательна!!!

>> Все презентации с конференции "DrupalCamp Краснодар 2016"

Версия Drupal: Drupal 8.*Drupal 7.*Ключевые слова: DrupalCampDrupalYug Форумы: Drupal Юг1 Спасибо
Категории: Друпалургия

Service Desk на базе Drupal (Максим Хабибуллин) [DrupalCamp Краснодар 2016]

Drupal в рунете - чт, 18/05/2017 - 22:14

Представляем вашему вниманию доклад Максима Хабибулина с ­DrupalCamp Краснодар 2016 о реальном кейсе работы над их Service Desk для промышленных предприятий, какой функционал реализовывали в сжатые сроки и много чего ещё интересного!
Видео: https://www.youtube.com/watch?v=QBEmJBgtaG8
Презентацию вы можете найти здесь -> https://www.slideshare.net/secret/BkV2XXZ0RmPgvb
Лайки, комментарии и подписка обязательна!!!

>> Все презентации с конференции "DrupalCamp Краснодар 2016"

Версия Drupal: Drupal 8.*Drupal 7.*Ключевые слова: DrupalCampDrupalYug Форумы: Drupal Юг0 Спасибо
Категории: Друпалургия

Профессия Drupal-разработчик (Николай Шаповалов) [DrupalCamp Краснодар 2016]

Drupal в рунете - чт, 18/05/2017 - 22:08

А в этом докладе с DrupalCamp Краснодар 2016 о том, что же это такое - быть Drupal-разработчиком, с нами поделился Николай Шаповалов.
Смотрим и комментируем, лайки и подписка тоже приветствуются!
Видео: https://www.youtube.com/watch?v=WUHu1fSLF10
Презентацию вы можете найти здесь -> https://www.slideshare.net/secret/ehOdq0pjy4VjcT
>> Все презентации с конференции "DrupalCamp Краснодар 2016" (обновлен)

Версия Drupal: Drupal 8.*Drupal 7.*Ключевые слова: DrupalCampDrupalYug Форумы: Drupal Юг1 Спасибо
Категории: Друпалургия

Профессия Drupal-разработчик (Николай Шаповалов) [DrupalCamp Краснодар 2016]

Drupal в рунете - чт, 18/05/2017 - 22:08

А в этом докладе с DrupalCamp Краснодар 2016 о том, что же это такое - быть Drupal-разработчиком, с нами поделился Николай Шаповалов.
Смотрим и комментируем, лайки и подписка тоже приветствуются!
Видео: https://www.youtube.com/watch?v=WUHu1fSLF10
Презентацию вы можете найти здесь -> https://www.slideshare.net/secret/ehOdq0pjy4VjcT
>> Все презентации с конференции "DrupalCamp Краснодар 2016" (обновлен)

Версия Drupal: Drupal 8.*Drupal 7.*Ключевые слова: DrupalCampDrupalYug Форумы: Drupal Юг0 Спасибо
Категории: Друпалургия

Drupal: Автоматическое удаление устаревших анонимных заказов в статусе "корзина"

Drupal Commerce самостоятельно не удаляет устаревшие анонимные заказы в статусе "корзина", что приводит к бессмысленному распуханию таблицы commerce_order.

"Устаревшими" я считаю заказы анонимных пользователя, чьи сессии удалены сборщиком мусора (по умолчанию это сессии старше 3 дней).

Решаем проблему:

/** * Implements hook_cron(). */ function hook_cron() { if (module_exists('commerce_order')) { $order_ids = db_select('commerce_order', 'o') ->fields('o', array('order_id')) ->condition('o.uid', 0)

Читать дальше →

Похожие записи:

Категории: Друпалургия

Как проверить взломан ли сайт на Друпале и как это исправить

Drupal в рунете - чт, 11/05/2017 - 09:42

С каждым владельцем сайта хоть раз происходит очень неприятная вещь: его сайт кто-то взломал. Об этом можно узнать по разным признакам: появились непонятные страницы с кучей рекламы, пришло предупреждение из Гугла, Яндекса о том, что Ваш сайт взломан, сайт еле-еле грузится и так далее, одним словом с сайтом "что-то не так".

Итак, приступим:

1. Устанавливаем модуль  drupalgeddon:

drush dl drupalgeddon

2. Устанавливаем  Site Audit:

drush dl site_audit --dev

3. Устанавливаем  Hacked!:

drush dl hacked --dev; drush en hacked -y

4. Устанавливаем  Security Review:

drush en security_review -y

Можно и сразу всё установить.

drush dl drupalgeddon -y; drush dl site_audit --dev -y; drush dl hacked --dev -y; drush en hacked -y; drush en security_review -y

5. Запускаем drupalgeddon в режиме проверки (аудита) сайта.

Что также запустит всё вышеустановленные модули и создаст файл отчета 'report.html'. Мы его откроем и увидим наши проблемы.
Удаляем все найденные вломанными файлы, ноды, модули.
drush aa --html --bootstrap --detail --skip=insights > ./report.html
Находим все подозрительные файлы и директории и удаляем их. Усиливаем защиту сайта.

6. Запускаем Hacked в Drush

Просматриваем все измененные проекты/модули:

drush hacked-list-projects --force-rebuild
После этого для каждого измененного проекта/модуля, например changedproject, запускаем:

drush hacked-details changedproject
Также, после этого находим все файлы/директории, которых нет в проекте/модуле:

drush hacked-diff changedproject

7. Drupalgeddon

drush asec

8. Удаляем пользователей

drush user-cancel username
drush ucan username

9. Сбрасываем пароль первого пользователя/администратора

drush uli

10. Изменяем пароли пользователей drush user-password username --password="NEWPASS"
#или
drush upwd username --password="NEWPASS"

Переходим на сайте по /admin/reports/security-review/, смотрим, что у нас взломали.

11. Находим и удаляем взломанные файлы find . -size 494c -name "*.php"
# также можно так:
find . -size 494c -name "*.php" | xargs rm 12. Находим файлы с PCT4B инъекцией grep -Rl PCT4BA6ODSE .
# и
grep -Rl  q6ae4d5 . 13. Определяем местонахождение разных зараженных файлов grep -Rl SOL_TCP .
grep -Rl SOCK_STREAM .
grep -Rl SOCK_DGRAM .
grep -Rl SOL_UDP .
grep -Rl SO_REUSEADDR .
​grep -Rl SO_RCVTIMEO .
​​grep -Rl SO_SNDTIMEO .

Как только нашли зараженные файлы, ищем лог файлы апачи и блокируем любой IP адрес, который обращался к этим зараженным файлам.

cd /var/log/httpd/
grep -iR 'ИМЯ_ЗАРАЖЕННОГО_ФАЙЛА.php' .

Если Вы найдете какой-нибудь зараженный файл в модуле, то лучше удалить весь модуль и повторно загрузить чистый.

14. Устанавливаем правильные права

cd /DRUPAL_DIR find . -type d -print0 | xargs -0 chmod 755; find . -type f -print0 | xargs -0 chmod 644; chmod 777 sites/default/files; find ./sites/default/files -type d -print0 | xargs -0 chmod 777; find ./sites/default/files -type f -print0 | xargs -0 chmod 666;

Или создаем и запускаем скрипт.

Копируешь код скрипта в файл и называешь его, нарример "fix-permissions.sh" и запускаешь:

sudo bash fix-permissions.sh --drupal_path=your/drupal/path --drupal_user=your_user_name
т.е. с нашими данными, это примерно так:

sudo bash fix-permissions.sh --drupal_path=..../директория_нашего_сайта --drupal_user=www-data

Также можно использовать скрипт для нормальных прав:

Запускаем его так:

/usr/local/bin/fix-permissions.sh --path=/home/USER/public_html --user=USER --group=GROUP

Скрипт для расстановки строгих прав:

Запускаем его так:

/usr/local/bin/fix-permissions-strict.sh --drupal_path=/home/USER/public_html --drupal_user=USER --httpd_group=GROUP

15. Проверяем лог файлы

grep cwd /var/log/exim/mainlog | grep -v /var/spool | awk -F"cwd=" '{print $2}' | awk '{print $1}' | sort | uniq -c | sort -n

В DirectAdmin:

/var/log/directadmin/error.log
/var/log/directadmin/errortaskq.log
/var/log/directadmin/system.log
/var/log/directadmin/security.log

В Apache:

/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpd/suexec_log
/var/log/httpd/fpexec_log
/var/log/httpd/domains/domain.com.error.log
/var/log/httpd/domains/domain.com.log
/var/log/messages (generic errors)

В Proftpd:

/var/log/proftpd/access.log
/var/log/proftpd/auth.log
/var/log/messages (generic errors)

В PureFTPd:

/var/log/pureftpd.log

В Dovecot и vm-pop3d:

/var/log/maillog
/var/log/messages

В сообщениях:

/var/log/messages

В exim:

/var/log/exim/mainlog
/var/log/exim/paniclog
/var/log/exim/processlog
/var/log/exim/rejectlog
#вместо 'username' впиши имя пользователя системы
/home/username/.php/php-mail.log

В mysqld:

Debian:

/var/log/syslog

В crond:

/var/log/cron

Чтобы удобнее просматривать логи:

less /var/log/filename

Где /var/log/filename это путь к лог файлу, который Вы собираетесь просмотреть. Если лог файл очень большой используйте команду "tail":

tail -n 30 /var/log/filename

Где 30 это число линий от конца файла.

16. Удаляем подозрительные письма в exim

Настройте exim.conf для автоматического удаления подозрительных писем

vi /etc/exim.conf

Устанавливаем следующие значения:

ignore_bounce_errors_after = 0h
timeout_frozen_after = 0h

Удаляем замороженные (заблокированные) письма в exim

exipick -zi | xargs exim -Mrm

Удаляем письма в очереди

exim -bp | awk '{ print $3 }' | xargs exim -Mrm

Удаляем письма старше 1 дня

exiqgrep -z -o 86400 -i | xargs -r exim -Mrm

Устанавливаем ограничение на отправку писем в exim

vi /etc/virtual/limit_USER
#добавляем максимально разрешенное число писем за 1 день... например: 300
------------------------------------------------------------------------------------------------------------
Дополнительно:
Защита от ботов fail2ban+csf сервера nginx c друпалом на борту

Тип материала: Предлагаю решениеКлючевые слова: безопасностьвзломdrupalgeddonМодули и темы: drupalgeddonsite_audithackedsecurity_review Форумы: Безопасность5 Спасибо
Категории: Друпалургия

[РЕШЕНО] Как проверить взломан ли сайт на Друпале и как это исправить [СРЕДНИЙ уровень сложности]

Drupal в рунете - чт, 11/05/2017 - 09:42

С каждым владельцем сайта хоть раз происходит очень неприятная вещь: его сайт кто-то взломал. Об этом можно узнать по разным признакам: появились непонятные страницы с кучей рекламы, пришло предупреждение из Гугла, Яндекса о том, что Ваш сайт взломан, сайт еле-еле грузится и так далее, одним словом с сайтом "что-то не так".

Итак, приступим:

1. Устанавливаем модуль  drupalgeddon:

drush dl drupalgeddon

2. Устанавливаем  Site Audit:

drush dl site_audit --dev

3. Устанавливаем  Hacked!:

drush dl hacked --dev; drush en hacked -y

4. Устанавливаем  Security Review:

drush en security_review -y

Можно и сразу всё установить.

drush dl drupalgeddon -y; drush dl site_audit --dev -y; drush dl hacked --dev -y; drush en hacked -y; drush en security_review -y

5. Запускаем drupalgeddon в режиме проверки (аудита) сайта.

Что также запустит всё вышеустановленные модули и создаст файл отчета 'report.html'. Мы его откроем и увидим наши проблемы.
Удаляем все найденные вломанными файлы, ноды, модули.
drush aa --html --bootstrap --detail --skip=insights > ./report.html
Находим все подозрительные файлы и директории и удаляем их. Усиливаем защиту сайта.

6. Запускаем Hacked в Drush

Просматриваем все измененные проекты/модули:

drush hacked-list-projects --force-rebuild
После этого для каждого измененного проекта/модуля, например changedproject, запускаем:

drush hacked-details changedproject
Также, после этого находим все файлы/директории, которых нет в проекте/модуле:

drush hacked-diff changedproject

7. Drupalgeddon

drush asec

8. Удаляем пользователей

drush user-cancel username
drush ucan username

9. Сбрасываем пароль первого пользователя/администратора

drush uli

10. Изменяем пароли пользователей drush user-password username --password="NEWPASS"
#или
drush upwd username --password="NEWPASS"

Переходим на сайте по /admin/reports/security-review/, смотрим.

11. Находим и удаляем взломанные файлы find . -size 494c -name "*.php"
# также можно так:
find . -size 494c -name "*.php" | xargs rm 12. Находим файлы с PCT4B инъекцией grep -Rl PCT4BA6ODSE .
# и
grep -Rl  q6ae4d5 . 13. Определяем местонахождение разных зараженных файлов grep -Rl SOL_TCP .
grep -Rl SOCK_STREAM .
grep -Rl SOCK_DGRAM .
grep -Rl SOL_UDP .
grep -Rl SO_REUSEADDR .
​grep -Rl SO_RCVTIMEO .
​​grep -Rl SO_SNDTIMEO .

Как только нашли зараженные файлы, ищем лог файлы апачи и блокируем любой IP адрес, который обращался к этим зараженным файлам.

cd /var/log/httpd/
grep -iR 'ИМЯ_ЗАРАЖЕННОГО_ФАЙЛА.php' .

Если Вы найдете какой-нибудь зараженный файл в модуле, то лучше удалить весь модуль и повторно загрузить чистый.

14. Устанавливаем правильные права

cd /DRUPAL_DIR find . -type d -print0 | xargs -0 chmod 755; find . -type f -print0 | xargs -0 chmod 644; chmod 777 sites/default/files; find ./sites/default/files -type d -print0 | xargs -0 chmod 777; find ./sites/default/files -type f -print0 | xargs -0 chmod 666;

Или создаем и запускаем скрипт.

Копируешь код скрипта в файл и называешь его, нарример "fix-permissions.sh" и запускаешь:

sudo bash fix-permissions.sh --drupal_path=your/drupal/path --drupal_user=your_user_name
т.е. с нашими данными, это примерно так:

sudo bash fix-permissions.sh --drupal_path=..../директория_нашего_сайта --drupal_user=www-data

Также можно использовать скрипт для нормальных прав:

Запускаем его так:

/usr/local/bin/fix-permissions.sh --path=/home/USER/public_html --user=USER --group=GROUP

Скрипт для расстановки строгих прав:

Запускаем его так:

/usr/local/bin/fix-permissions-strict.sh --drupal_path=/home/USER/public_html --drupal_user=USER --httpd_group=GROUP

15. Проверяем лог файлы

grep cwd /var/log/exim/mainlog | grep -v /var/spool | awk -F"cwd=" '{print $2}' | awk '{print $1}' | sort | uniq -c | sort -n

В DirectAdmin:

/var/log/directadmin/error.log
/var/log/directadmin/errortaskq.log
/var/log/directadmin/system.log
/var/log/directadmin/security.log

В Apache:

/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpd/suexec_log
/var/log/httpd/fpexec_log
/var/log/httpd/domains/domain.com.error.log
/var/log/httpd/domains/domain.com.log
/var/log/messages (generic errors)

В Proftpd:

/var/log/proftpd/access.log
/var/log/proftpd/auth.log
/var/log/messages (generic errors)

В PureFTPd:

/var/log/pureftpd.log

В Dovecot и vm-pop3d:

/var/log/maillog
/var/log/messages

В сообщениях:

/var/log/messages

В exim:

/var/log/exim/mainlog
/var/log/exim/paniclog
/var/log/exim/processlog
/var/log/exim/rejectlog
#вместо 'username' впиши имя пользователя системы
/home/username/.php/php-mail.log

В mysqld:

RedHat:

/var/lib/mysql/server.hostname.com.err

FreeBSD and Debian:

/usr/local/mysql/data/server.hostname.com.err

В crond:

/var/log/cron

Чтобы удобнее просматривать логи:

less /var/log/filename

Где /var/log/filename это путь к лог файлу, который Вы собираетесь просмотреть. Если лог файл очень большой используйте команду "tail":

tail -n 30 /var/log/filename

Где 30 это число линий от конца файла.

16. Удаляем подозрительные письма в exim

Настройте exim.conf для автоматического удаления подозрительных писем

vi /etc/exim.conf

Устанавливаем следующие значения:

ignore_bounce_errors_after = 0h
timeout_frozen_after = 0h

Удаляем замороженные (заблокированные) письма в exim

exipick -zi | xargs exim -Mrm

Удаляем письма в очереди

exim -bp | awk '{ print $3 }' | xargs exim -Mrm

Удаляем письма старше 1 дня

exiqgrep -z -o 86400 -i | xargs -r exim -Mrm

Устанавливаем ограничение на отправку писем в exim

vi /etc/virtual/limit_USER
#добавляем максимально разрешенное число писем за 1 день... например: 300
------------------------------------------------------------------------------------------------------------
Дополнительно:
Защита от ботов fail2ban+csf сервера nginx c друпалом на борту

Тип материала: Предлагаю решениеКлючевые слова: безопасностьвзломdrupalgeddonМодули и темы: drupalgeddonsite_audithackedsecurity_review Форумы: Безопасность4 Спасибо
Категории: Друпалургия

Страницы

Подписка на Друпалургия сбор новостей - Друпалургия