Skip to content

Расширения ​

Расширения позволяют простым способом, установив всего один файл, расширять функционал сервера CommuniGate и его пользовательского интерфейса, не прибегая к модификации встроенного функционала сервера.

Установить расширение, скачанное с сайта communigatepro.ru или разработанное самостоятельно, можно в разделе Пользователи → Расширения интерфейса администрирования Dash.

Формат файла расширения ​

Файл расширения представляет собой ZIP-архив с расширением .cgplugin.

В корне архива обязательно должен находиться файл описания расширения cgplugin.json. JSON-Schema для него: cgplugin.schema.json.

Основные параметры файла конфигурации расширения:

  • id (обязательно) - Название расширения. Латиница, цифры и подчёркивание. Должно быть уникальным для конкретного расширения. Рекомендуется использовать обратную запись названия домена перед именем расширения, например, ru_communigatepro_ExamplePlugin
  • author (обязательно) - Имя автора расширения. Например, Ivan Ivanov или AO SBK
  • version (обязательно) - Версия расширения по SemVer 2.0. Например, 1.0.0
  • title (обязательно) - Имя поля из словарей локализации, которое будет использоваться при отображении расширения в интерфейсе администрирования. Например, PluginTitle.
  • description (необязательно) - Имя поля из словарей локализации, которое будет использоваться при отображении описания расширения в интерфейсе администрирования. Например, PluginDescription.
  • url - Адрес домашней страницы расширения. Например, https://communigatepro.ru/
  • icon - Опциональное имя файла иконки из архива для отображения расширения при просмотре его через интерфейс администрирования. Иконка должна быть в формате svg и иметь пропорции 1:1 (квадратные).
  • min_product_version - Опциональный параметр, который указывает минимальную версию сервера, необходимую для корректной работы плагина. Если параметр не указан, предполагается, что плагин совместим со всеми версиями сервера.

Локализация ​

При загрузке расширения из него автоматически загружаются доступные файлы локализации с расширением .data в формате Словарей CommuniGate Pro.

Данные из этих словарей будут доступны другому коду, в том числе, скриптам на CG/PL, содержащимся в расширении, с префиксом вида <id расширения>..

Точки расширения ​

Список точек расширения заполняется в секции extends файла описания. Доступны несколько типов расширений, описанные ниже.

Параметры конфигурации ​

Описываются в секции config в виде объекта с описаниями параметров конфигурации. Каждый ключ - идентификатор одного параметра конфигурации, под которым он будет храниться и передаваться запускаемым из расширения скриптам CG/PL.

  • type (обязательно) - Тип параметра, используется для выбора формата хранения параметра и типа отображаемого в интерфейсе администрирования виджета. На данный момент поддерживаются только параметры типов string и boolean.
  • title (обязательно) - Строка из файлов локализации, которая будет использоваться при отображении названия параметра в интерфейсе администрирования.
  • required - Обязателен ли параметр конфигурации для заполнения (если поле отсутствует, параметр необязательный).
  • editPresentation - Позволяет указать способ отображения элемента управления для параметра. Для типа string поддерживаются password и multilineText. Если для string ничего не указано, будет показано обычное однострочное поле ввода.
  • enum - Позволяет задать несколько допустимых вариантов для параметра конфигурации.
  • enumTitle (обязательно, если есть enum) - Строка из файлов локализации, которая указывает на словарь, который будет использоваться при отображении вариантов параметра конфигурации в интерфейсе администрирования.

Пример:

json
{
  "extends": {
    "config": {
      "APIKey": {
        "type": "string",
        "editPresentation": "password",
        "title": "APIKeyTitle",
        "required": true
      },
      "ServerType": {
        "type": "string",
        "enum": ["proxy", "DNS", "mail"],
        "enumTitle": "ServerTypeEnumTitle",
        "required": true,
        "title": "ServerTypeTitle"
      }
    }
  }
}

Пример локализации для параметра простого строкового типа string и enum:

{
  APIKeyTitle = "Ключ API";
  ServerTypeTitle = "Выберите тип сервера";
  ServerTypeEnumTitle = {
    proxy = "proxy";
    DNS = "dns";
    mail = "email server";
  };
}

Проверка параметров конфигурации ​

В расширение можно добавить файл сценария на языке CG/PL, выполняющий проверку корректности заполнения параметров конфигурации. Данный файл должен находиться в архиве с расширением.

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

Пример параметра:

json
{
  "extends": {
    "config": {
      "APIKey": {
        "type": "string",
        "title": "APIKeyTitle",
        "required": true
      }
    },
    "checkConfig": "checkconfig.scgp"
  }
}

Пример файла сценария:

entry checkConfig {
  var settings = Vars().pluginSettings;

  if (Length(settings.APIKey) != 10) {
    SetResult("invalid API key")
  }
}

Видеоконференции ​

Описываются в секции vcs в виде объекта с описаниями предоставляемых расширением скриптов для интеграции систем видеоконференцсвязи (далее - ВКС). Ключ - идентификатор, который будет использоваться для определения конкретной системы ВКС внутри CommuniGate Pro. Каждое описание - объект со следующими параметрами:

  • title (обязательно) - Строка из файлов локализации, которая будет использоваться при отображении параметра в интерфейсе пользователя.
  • script (обязательно) - Имя (с расширением) находящегося в архиве файла сценария на языке CG/PL, реализующего интеграцию с ВКС.
  • icon - Опционально: имя svg-файла с пиктограммой из архива. Пиктограмма будет отображаться пользователю в элементах интерфейса, связанных с конкретной системой видеоконференций. Она должна иметь пропорции 1:1 (квадратные).

Пример:

json
{
  "extends": {
    "vcs": {
      "bbb": {
        "title": "BBBTitle",
        "script": "bbb.scgp",
        "icon": "bbb.svg"
      }
    }
  }
}

Каждый модуль поддержки видеоконференции должен быть отдельным сценарием CG/PL в формате scgp.

Каждая функция оформляется отдельным методом внутри файла сценария (отдельной «точкой входа»). Сценарий всегда запускается в контексте пользователя, создающего конференцию, будь то через событие в календаре или через кнопку в чате.

Точки входа, которые должны быть реализованы в коде файла сценария, описаны ниже.

Точка входа createConf ​

  • createConf

    Создаёт видеоконференцию.

    Параметры доступны в словаре Vars().startParameter:

    • title (опционально)

      Тема конференции.

    • description (опционально)

      Подробное описание темы конференции.

    • isAllDay (опционально)

      Флаг, определяющий тип конференции, если конференция длится целый день с 0 до 24 часов - 1, если конференция имеет любое другое время начало и конца - 0.

    • rRule (опционально)

      Правило повторения события и ВКС, согласно RFC5545, section 3.8.5.3.

      Примеры:

      • FREQ=DAILY;UNTIL=20241215T000000Z

        ежедневное повторение, до 15 декабря 2024 г.

      • FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR

        еженедельное повторение каждый день недели.

      • FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=2;UNTIL=20250328T000000Z

        ежемесячно каждый второй месяц второй день до 28 марта 2025 г.

      • FREQ=MONTHLY;BYDAY=-1SU,-1MO,-1TU,-1WE,-1TH,-1FR,-1SA;UNTIL=20250319T000000Z

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

      • FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU,1TU,1FR;UNTIL=20250321T000000Z

        ежемесячно каждый второй месяц каждый первый вторник, пятницу, воскресенье до 21 марта 2025 г.

      • FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=6;UNTIL=20261231T000000Z

        ежегодно каждый четвертый месяц каждое шестое число до 31 декабря 2026 г.

    • from (опционально)

      Время начала конференции в UnixTime.

    • duration (опционально)

      Продолжительность конференции в секундах.

    • offset (опционально)

      Смещение временной зоны организатора относительно UTC (0) в секундах.

    • participants (опционально)

      Массив объектов, описывающих участников конференции.

      • name (опционально)

        Имя участника

      • email

        Адрес e-mail участника

    Возвращаемое значение - словарь с полями:

    • cid

      ID созданной конференции в строковом формате или ID созданной конференции и дополнительные параметры, если есть, в Base64Url после создания ВКС. Строка должна быть URL friendly и не содержать пробелов, двоеточия.

    • link

      Общая ссылка на подключение к конференции.

    • participantLinks (опционально)

      Cловарь, содержащих в себе индивидуальные ссылки на подключение к конференции для всех зарегистрированных участников. Если данная интеграция не поддерживает создание индивидуальных ссылок, параметр можно не указывать, ключ в словаре - aдрес e-mail участника, значение - индивидуальная ссылка для подключения к конференции:

    • description (опционально)

      Подробное описание темы конференции. Если поле будет возвращено, то оно перезапишет данное поле в календарном событии. Возвращённая пустая строка очистит поле в календарном событии.

    Ошибка:

    • error

      Текстовое описание ошибки при создании конференции. Если произошла ошибка, поле должно присутствовать.

Точка входа updateConf ​

  • updateConf

    Обновляет видеоконференцию.

    Параметры доступны в словаре Vars().startParameter. Аналогичны параметрам точки входа createConf плюс cid.

    • cid

      Идентификатор конференции или идентификатор конференции и дополнительные параметры в Base64Url, необходимые для обновления ВКС.

    • title (опционально)

      Тема конференции.

    • description (опционально)

      Подробное описание темы конференции.

    • isAllDay (опционально)

      Флаг, определяющий тип конференции, если конференция длится целый день с 0 до 24 часов - 1, если конференция имеет любое другое время начало и конца - 0.

    • rRule (опционально)

      Правило повторения события и ВКС, согласно RFC5545, section 3.8.5.3.

      Примеры:

      • FREQ=DAILY;UNTIL=20241215T000000Z

        ежедневное повторение, до 15 декабря 2024 г.

      • FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR

        еженедельное повторение каждый день недели.

      • FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=2;UNTIL=20250328T000000Z

        ежемесячно каждый второй месяц второй день до 28 марта 2025 г.

      • FREQ=MONTHLY;BYDAY=-1SU,-1MO,-1TU,-1WE,-1TH,-1FR,-1SA;UNTIL=20250319T000000Z

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

      • FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU,1TU,1FR;UNTIL=20250321T000000Z

        ежемесячно каждый второй месяц каждый первый вторник, пятницу, воскресенье до 21 марта 2025 г.

      • FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=6;UNTIL=20261231T000000Z

        ежегодно каждый четвертый месяц каждое шестое число до 31 декабря 2026 г.

    • from (опционально)

      Время начала конференции в UnixTime.

    • duration (опционально)

      Продолжительность конференции в секундах.

    • offset (опционально)

      Смещение временной зоны организатора относительно UTC (0) в секундах.

    • participants (опционально)

      Массив объектов, описывающих участников конференции.

      • name (опционально)

        Имя участника

      • email

        Адрес e-mail участника

    Возвращаемое значение - словарь с полями, полностью совпадает по формату с возвращаемым значением точки входа createConf.

    • cid (опционально, возвращается, если при обновлении удалилась старая ВКС)

      ID созданной конференции в строковом формате. Строка должна быть URL friendly и не содержать пробелов, двоеточия.

    • link (опционально, возвращается, если при обновлении удалилась старая ВКС)

      Общая ссылка на подключение к конференции.

    • participantLinks (опционально)

      Словарь, содержащий в себе индивидуальные ссылки на подключение к конференции для всех зарегистрированных участников. Если данная интеграция не поддерживает создание индивидуальных ссылок, параметр можно не указывать, ключ в словаре - aдрес e-mail участника, значение - индивидуальная ссылка для подключения к конференции.

    • description (опционально)

      Подробное описание темы конференции. Если поле будет возвращено, то оно перезапишет данное поле в календарном событии. Возвращённая пустая строка очистит поле в календарном событии.

    Ошибка:

    • error

      Текстовое описание ошибки при обновлении конференции. Если произошла ошибка, поле должно присутствовать.

Точка входа deleteConf ​

  • deleteConf

    Удаляет видеоконференцию.

    Параметры доступны в словаре Vars().startParameter:

    • cid

      идентификатор конференции или идентификатор конференции и дополнительные параметры в Base64Url, необходимые для удаления ВКС (ID и дополнительные параметры, закодированные в Base64Url, разбирает сам плагин на своё усмотрение).

    • description (опционально)

      Подробное описание темы конференции.

    Возвращаемое значение - словарь с полями:

    • description (опционально)

      Подробное описание темы конференции. Если поле будет возвращено, то оно перезапишет данное поле в календарном событии. Возвращённая пустая строка очистит поле в календарном событии.

    Ошибка:

    • error

      Текстовое описание ошибки при удалении конференции. Если произошла ошибка, поле должно присутствовать.

Занятость участников ​

Описывается в секции freebusy в виде объекта с описаниями предоставляемых расширением скриптов для получения информации о занятости (далее - Free/Busy). Ключ - идентификатор, который будет использоваться для определения типа сервера, откуда будет загружаться информация о занятости внутри CommuniGate Pro. Каждое описание - объект со следующими параметрами:

  • title (обязательно)

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

  • script (обязательно)

    Имя (с расширением) находящегося в архиве файла сценария на языке CG/PL, реализующего получение информации о занятости.

  • config (опционально)

    Параметры, передаваемые в скрипт, аналогичны параметрам расширения. Доступны в скрипте в словаре Vars().freebusySettings.

  • checkConfig (опционально)

    Имя (с расширением) находящегося в архиве файла сценария на языке CG/PL, реализующего проверку параметров FreeBusy (из секции config выше).

Пример:

json
{
  "extends": {
    "config": {},
    "freebusy": {
      "CommunigatePro": {
        "title": "CommunigateProTitle",
        "script": "freebusy.scgp",
        "config": {
          "Host": {
            "type": "string",
            "required": true,
            "title": "HostTitle"
          }
        },
        "checkConfig": "checkFreeBusyConfig.scgp"
      }
    }
  }
}

Каждый модуль получения информации о доступности / занятости участников (Free/Busy) должен быть отдельным сценарием CG/PL в формате scgp.

Точки входа, которые должны быть реализованы в коде файла сценария, описаны ниже.

Точка входа getFreeBusy ​

  • getFreeBusy

    Получение информации Free/Busy.

    Параметры доступны в словаре Vars().startParameter:

    • email (обязательно)

      e-mail пользователя для которого запрашивается информация.

    • timeStart (опционально)

      Начало запрашиваемого периода информации о занятости в формате временной метки.

    • timeEnd (опционально)

      Окончание запрашиваемого периода информации о занятости в формате временной метки.

    Возвращаемое значение - строка в формате iCalendar Object RFC 5545, section 3.4, включающий в себя компонент RFC 5545, section 3.6.4. В случае ошибки должна возвращаться пустая строка.

В скрипте доступны следующие данные, кроме описанного выше Vars().startParameter:

  • Vars().pluginSettings - словарь

    Общие настройки расширения, описанные в extends/config

  • Vars().freebusySettings - словарь

    Настройки домена получения Free/Busy, описанные в extends/freebusy/freebusyid_/config

    • Host

      Host адрес почтового сервера для домена

    • ...

      Остальные параметры, указанные в секции extends/freebusy/config и настроеные администратором сервера/домена.

Пример файла сценария:

entry getFreeBusy is

  // email передаётся в словаре startParameter
  var param = Vars().startParameter;
  var email = param.email;
  var timeStart = param.timeStart;
  var timeEnd = param.timeEnd;
  if (isDate(timeStart)) {
    // обработать временные данные
  }

  // pluginSettings и freebusySettings общие для запросов на данный Free/Busy домен (в сервере передаётся как переменные среды окружения env)
  var pluginSettings = Vars().pluginSettings;
  var freebusySettings = Vars().freebusySettings;

  var host = freebusySettings.Host;

  // отправиляем запрос за информацией
  var params = NewDictionary();
  params.responseFormat = "";
  var url = host + "~" + email + "/freebusy.vfb";
  var httpResult = HTTPCall(url, params);
  if (isString(httpResult)) {
    SetResult(httpResult);
  } else {
    SetResult(httpResult.body);
  }

end entry;

Файл сценария проверки параметров получения информации о доступности / занятости участников (Free/Busy) может как выполнять базовые проверки по регулярным выражениям или заполнению полей, так и проверять корректность введённых параметров путём обращения к внешнему серверу. Это должен быть отдельный сценарий в формате scgp. В файле сценария должен содержаться метод checkConfig, выполняющий проверку параметров конфигурации Free/Busy, доступных ему через словарь Vars().freebusySettings окружения запуска сценария. Также доступны общие параметры расширения в словаре Vars().pluginSettings.

Пример файла сценария проверки параметров Free/Busy:

entry checkConfig {
  // Общие настройки расширения, если необходимы
  var pluginSettings = Vars().pluginSettings;

  // Настройки Free/Busy
  var freebusySettings = Vars().freebusySettings;


  if (Length(freebusySettings.Host) == 0) {
    SetResult("Host is empty");
    stop;
  }

  if (Length(freebusySettings.Password) < 6) {
    SetResult("Password too short");
    stop;
  }

  var req = NewDictionary();
  req.method = "GET";
  var res = HTTPCall(freebusySettings.Host), req);

  if (!res.isDictionary()) {
    SetResult("failed to connect to server");
    stop;
  }

}

Помощники ​

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

Помощники в расширениях могут быть двух типов: фильтрации сообщений и помощники приложений. Имя помощника определяется названием секции в cgplugin.json. Включение помощников осуществляется включением выключением расширения. Настройка помощников осуществляется со страницы настройки расширения. Параметры настройки определяются также в cgplugin.json. Помощникам, установленным в составе расширений, доступны настройки расширения. Для получения настроек расширения помощник должен отправить серверу (после установки версии протокола) GETCONFIG, подписка на обновление конфигурации расширения, команда серверу SUBSCRIBECONFIG и ответ сервера в случае изменения настроек CONFIGUPDATED. Описание протокола.

Пример протокола (I - сообщения сервера, O - сообщения помощника):

O: H00007 GETCONFIG
I: H00007 OK { type = "cat" }

O: H00005 SUBSCRIBECONFIG
I: H00005 OK

I: 00010 CONFIGUPDATED { type = "dog" }
O: 00010 OK

Помощники определяются в объекте helpers объектами с описаниями программ для разных архитектур. В разделе all могут быть указаны помощники, написанные на скриптовых языках и независимые от архитектуры, при этом, если для текущей архитектуры будет переопределён helper_id, то будет использоваться именно он. (в примере ниже на архитектуре x86_64 будут запущены два помощника: all/@helper_id1 и x86_64/helper_id2). Наличие в секции config параметров LogLevel, RestartPause, Timeout необходимо для задания настройки помощников в расширении. Если они не заданы, то сервер установит в этом случае предопределённые настройки.

json
{
  "extends": {
    "config": {
      "LogLevel": {
        "type": "string",
        "required": false,
        "title": "LogLevelTitle"
      },
      "RestartPause": {
        "type": "string",
        "required": false,
        "title": "RestartPauseTitle"
      },
      "Timeout": {
        "type": "string",
        "required": false,
        "title": "TimeoutTitle"
      },
      "SomeExtensionParameter1": {
        "type": "string",
        "required": false,
        "title": "SomeExtensionParameter1Title"
      },
      "SomeExtensionParameter2": {
        "type": "string",
        "required": false,
        "title": "SomeExtensionParameter2Title"
      }
    },
    "helpers": {
      "all": {
        "helper_id1": {
          "system_exe": "/usr/bin/bash",
          "exe": "script1.sh",
          "params": "--logAll -k value1 --key2=value2",
          "type": "filter"
        },
        "helper_id2": {
          "system_exe": "/usr/bin/perl",
          "exe": "script2.pl",
          "params": "--p1 --p2 --p3",
          "type": "app"
        }
      },
      "x86_64": {
        "helper_id2": {
          "exe": "program2",
          "params": "--p1 --p2",
          "type": "app"
        }
      }
    }
  }
}

В описании помощников в расширениях должен быть задан хотя бы один из элементов system_exe, exe.

  • system_exe (опционально) - исполняемый файл, уже присутствующий в системе, предполагался для указания интерпретатора скриптового языка.
  • exe (опционально) - исполняемый файл в составе расширения, бинарный или на скриптовом языке.
  • params (опционально) - Параметры, передаваемые помощнику.
  • type (обязательно) - тип помощника, app или filter.

Интерфейсы ​

В расширении можно добавить файлы интерфейсов (wssp, wcgp, изображения, js, css...) Файлы из расширения будут использоваться при совпадении имени скина и имени файла. Порядок поиска файлов скинов: интерфейсы в расширениях, интерфейсы, заданные для домена, "общесерверные" интерфейсы, интерфейсы в поставке сервера (стоковые). При этом в расширениях может только один раз указываться конкретный интерфейс. Если расширение выключено, указанные в нём файлы и скины не участвуют в поиске. При включении / выключении расширения с файлами интерфейсов на сервере происходит сброс кэша интерфейсов.

Описывается в секции WebSkins в виде объекта с именами интерфейсов, где в каждом объекте указывается каталог с файлами или список файлов. Для неименованного интерфейса можно указать в качестве имени интерфейса (объекта с описанием используемых файлов) пустую строку или строки unnamed, noname

json
{
  "extends": {
    "WebSkins": {
      "": {
        "dirs": ["WebSkins"]
      },
      "hPronto-": {
        "files": ["login.wssp", "login.css"]
      }
    }
  }
}

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

  • dirs (опционально) - список каталогов (не более 1 каталога) с файлами интерфейса.
  • files (опционально) - файлы интерфейса, лежащие в корне расширения.

Файлам wcgp и wssp передаются настройки расширения. Они доступны как:

  • для CG/PL: Vars().pluginSettings
  • для wssp: pluginSettings
    Строковые настройки расширения "type": "string" передаются как строки (для "editPresentation": "password" в расшифрованном виде).
    Логические параметры расширения "type": "boolean" передаются как YES для значения true, и не передаются (#NULL) для значения false.

В зависимости от контекста вызова wcgp будут браться настройки разных доменов.

  • Для /sys/program.wcgp - будут браться настройки расширения домена из URL, а не главного домена.
  • Для /auth/program.wcgp - настройки расширения домена пользователя (вряд ли будет использоваться в расширениях).
  • Для /program.wcgp - настройки расширения домена из URL.

Технология единого входа (Single sign-on) ​

В расширении указывается список методов авторизации SSO. Для этого необходимы скрипты wcgp из неименованного (базового) скина. Данное расширение "несамостоятельно" и требует наличия точки расширения Интерфейсы (WebSkins) с неименованным интерфейсом.

Описывается в массиве SingleSignOn список объектов с полями

  • script (обязательно) - имя файла скрипта wcgp, добавляемого тем же плагином, на который Web-интерфейс потом будет перенаправлен при нажатии соответствующей кнопки на экране входа (должен быть в плагине и добавлен в неименованный интерфейс).
  • title (обязательно) - cтрока из файлов локализации, которая будет использоваться при отображении метода входа.
  • icon - (опционально) имя файла в формате svg иконки. (Файл должен быть в плагине и добавлен в неименованный интерфейс)

Пример

json
{
  "extends": {
    "WebSkins": {
      "unnamed": {
        "dirs": ["WebSkins"]
      }
    },
    "SingleSignOn": [
      {
        "script": "sso1.wcgp",
        "title": "Title1",
        "icon": "icon1.svg"
      },
      {
        "script": "sso2.wcgp",
        "title": "Title2"
      }
    ]
  }
}

Файлам wcgp и wssp доступен список Single Sign-On, как массив словарей по переменной SingleSignOnList.

Каждый элемент массива - словарь с полями, описанными выше: script, title, icon (опционально). Кроме того, в каждом элементе есть поле PluginId, его можно использовать для перевода поля title (подстановки строк из файла локализации плагина).