# Упражнение 3. Сущности Plesk и авторизация

Это упражнение позволит вам создать расширение, которое выдает отчет о количестве учетных записей клиентов, сайтов, баз данных и почтовых учетных записей на сервере Plesk; формат отчета — простой текст или текст в XML или JSON. Во время написания этого расширения вы узнаете, как делать следующее:

- Использовать персональную авторизацию (вызов файлов PHP обходных контроллеров).
- Обращаться к сущностям Plesk через XML API.

Мы предполагаем, что идентификатор расширения — plesk-stats, и что вы начнете разработку с кода из папки ex3. Мы уже частично написали этот код, чтобы помочь вам сосредоточиться только на определенных областях. Кроме того, мы добавили в папку медиа-контент, необходимый для выполнения упражнения. Чтобы посмотреть завершенное упражнение, ознакомьтесь с содержимым папки ex3complete.

## Шаг 1. Установите персональную авторизацию.

Расширение, которое мы собираемся написать, будет состоять из формы, в которой администратор может задать выходной формат данных, и формы, в которой пользователи будут запрашивать статистику. Так как статистика содержит защищенные данные, нам надо настроить контроль доступа, чтобы результаты отправлялись только определенным пользователям. Это можно сделать двумя способами:

- Определите тип пользователя — администратор, реселлер или клиент — и ограничьте доступ в зависимости от типа. Для этого создайте экземпляр класса pm_Session и используйте его методы типа boolean isClient(), isReseller() и isAdmin() .

      $session = new pm_Session();
      $client = $session->getClient();
      if ($client->isAdmin()) {
      }

- Напишите свой собственный метод авторизации.

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

Начните с определения секретного токена authToken в нашем скрипте, запускаемом после авторизации, и сохранения его в хранилище пар «ключ-значение». Для этого добавьте следующие две строки в файл `/plib/scripts/post-install.php`:

    pm_Settings::set('useAuth', true);
    pm_Settings::set('authToken', md5(uniqid(rand(), true)));

Если вы прежде не писали скриптов для установки и не работали с хранилищем пар «ключ-значение», мы рекомендуем вам посмотреть Упражнение 2.

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

    /htdocs/index.php
    /plib/controllers/IndexController.php
    /plib/library/Form/Settings.php
    /plib/views/scripts/index/index.phtml

Стоит отметить, что, помимо других полей, форма содержит ссылки на статистику. Эти ссылки ведут к /public/?authToken=$authToken в корневой веб-папке расширения. Веб-папка `/public` связана с папкой `/htdocs/public` расширения. Это специальная папка. Если кто-либо запрашивает какой-либо ресурс из этой папки, управление будет передано напрямую обходным контроллерам ресурса. В нашем примере, если мы хотим иметь публично доступную конечную точку, нам надо создать скрипт внутри этой папки и сообщить потребителям URL этого скрипта.

Чтобы управлять запросами к статистике в `/public`, добавьте следующие строки в `/htdocs/public/index.php`:

    if (pm_Settings::get('useAuth') && @$_GET['authToken'] != pm_Settings::get('authToken')) {
        die('Invalid auth token supplied.');
    }

Этот код сравнивает токен из хранилища с токеном из запроса. Если они не совпадают, выполнение скрипта прекратится.

Отлично, теперь, когда у вас есть система авторизации, добавим немного статистики в вывод `/htdocs/public/index.php`.

## Шаг 2. Получите информацию о сущностях Plesk.

Расширение будет использовать класс Modules_PanelStats_Reporter для взаимодействия с XML API. Этот класс уже определен, он требует только вызова XML API с помощью pm_ApiRpc. Откройте `/plib/library/Reporter.php` и измените конструктор класса так, чтобы он запрашивал необходимую статистику:

    $request = '<server><get><stat/></get></server>';
    $this->_stats = pm_ApiRpc::getService()->call($request)->server->get->result->stat->objects;

Описание операции, которую запрашивает этот код, можно найти здесь.

Описание ответа доступно здесь.

Согласно этому руководству, поле класса _stats содержит узлы, описанные здесь.

Предварительно написанные методы Modules_PanelStats_Reporter помогают обрабатывать данные ответа. Метод getResultsXml возвращает данные как дерево XML, getResultsJson возвращает результат в формате JSON, а getResultsPlain возвращает информацию как простой текст. Теперь эту информацию необходимо показать пользователям расширения.

## Шаг 3. Предоставление статистики пользователям расширения.

Как обсуждалось на шаге 1, конечные пользователи будут запрашивать файл `/htdocs/public/index.php` для получения статистики, а в нем в настоящий момент реализован контроль доступа. Для предоставления статистики, измените этот файл, чтобы он выглядел следующим образом:

    <?php

    require_once('sdk.php');

    pm_Context::init('plesk-stats');

    if (pm_Settings::get('useAuth') && @$_GET['authToken'] != pm_Settings::get('authToken')) {
        die('Invalid auth token supplied.');
    }

    $reporter = new Modules_PanelStats_Reporter();

    $format = isset($_GET['format']) ? $_GET['format'] : 'xml';

    if ('plain' == $format) {
        echo $reporter->getResultsPlain();
    } else if ('json' == $format) {
        header("Content-Type: application/json");
        echo $reporter->getResultsJson();
    } else {
        header("Content-Type: text/xml");
        echo $reporter->getResultsXml();
    }

В отличие от предыдущей версии файла, эта версия создает экземпляр класса Modules_PanelStats_Reporter и предоставляет статистику в зависимости от аргумента format операции GET.

Вы могли заметить, что код начинается со следующей строки:

    require_once('sdk.php');

Примечание

Эта строка требуется для настройки автозагрузки классов в этом скрипте, так как функция автозагрузки не работает в `/htdocs/public` по умолчанию.

## Шаг 4. Установите и протестируйте расширение.

Поздравляем! Вы выполнили упражнение. Чтобы установить ваше расширение в Plesk:

1. Упакуйте содержимое папки ex3 (но не саму папку) в архив ZIP, используя вашу любимую программу-архиватор.

   Примечание

   Удостоверьтесь в том, что файл `meta.xml` находится в корне распакованного архива. Это требование очень важно, и, если оно не выполнено, при попытке добавить расширение в Plesk возникнет ошибка.

2. Войдите в Plesk как администратор и добавьте расширение на странице Управление сервером > Расширения.

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