Конфигурация безопасности на базе era

Для демонстрации конфигурации безопасности на базе семейства политик era потребуются следующие файлы:

security.cfg и ping.era

Конфигурация безопасности в этом примере разрешает запуск всех сущностей и позволяет любой сущности обращаться к сущностям core и server.

При этом вызовы методов сущности server контролируются с помощью политик семейства era (реализация Event-Recording Automata – разновидность временных автоматов):

security.cfg

/* Конфигурация безопасности для демонстрации использования семейства "era" в примере "ping". */

/* Определение execute-интерфейса. */

execute = execute.execute;

/* Импорт файла с объявлением базовых политик безопасности. */

#include <kss/server/base.cfg>

/* Импорт файла с объявлением политик семейства "era". */

#include <kss/server/era.cfg>

/* Создание экземпляра семейства "era". Имя нового экземпляра: "request_state". Файл конфигурации семейства "era": ping.era.*/

use family request_state = era "ping.era";

/* Отправка и получение запросов разрешены. */

request { grant; }

/* Отправка и получение ответов разрешены. */

response { grant; }

/* Запуск сущностей разрешен. */

execute { grant; }

/* Объявление сущностей. */

entity services.core;

entity einit;

entity client;

entity server;

/* Ядру разрешены обращения по интерфейсу безопасности. */

security src=services.core { grant; }

/* При запуске сущности "server" перевести request_state в начальное состояние. */

execute dst=server, method=main {

request_state.restart;

}

/* При вызове метода Ping наступит событие ping, если это разрешено конфигурацией экземпляра request_state. */

request dst=server, endpoint=ping_comp.ping_impl, method=Ping {

request_state.event ping;

}

/* При вызове метода Pong наступит событие pong, если это разрешено конфигурацией экземпляра request_state. */

request dst=server, endpoint=ping_comp.ping_impl, method=Pong {

request_state.event pong;

}

Семейство era всегда конфигурируется в отдельном файле.

Экземпляр request_state может находиться в одном из двух состояний: process или stop. С этим экземпляром связаны два события: ping и pong.

Наступление события ping возможно не чаще раза в секунду, а наступление события pong переводит экземпляр в конечное состояние stop, в котором оба события запрещены.

ping.era

/* Список возможных событий. */

events: [ping, pong],

/* Начальное состояние экземпляра: "process". */

initial: process,

/* Размерность таймера (множитель). Используется при вычислении условия "if ping > 10". */

scale: 100 msec,

/* Если экземпляр находится в состоянии "process", то:

- при наступлении события "ping" произойдет переход в состояние "process", если с прошлого события прошло не менее одной секунды;

- при наступлении события "pong" произойдет переход в состояние "stop". */

process: {

ping: process if ping > 10,

pong: stop

}

test.c

В функции test() выполняются вызовы методов Ping и Pong следующим образом:

  1. Метод Ping вызывается 8 раз с интервалом 200 мс.
  2. Дважды вызывается метод Pong.
  3. Метод Ping вызывается 8 раз с интервалом 200 мс.

test.c

#include <stdint.h>

#include "ping.idl.h"

void test(struct IPing *proxy)

{

uint32_t value;

int i;

/* Реализация функций ping() и ping() содержится в файле client.c. */

uint32_t ping(struct IPing *proxy, uint32_t value);

uint32_t pong(struct IPing *proxy, uint32_t value);

value = 777;

for (i = 0; i < 7; ++i)

{

value = ping(proxy, value);/* Разрешён только шестой вызов Ping. */

usleep(200*1000);

}

value = pong(proxy, value);/* Вызов Pong разрешен. */

value = pong(proxy, value);/* Вызов Pong запрещен. */

for (i = 0; i < 7; ++i)

{

value = ping(proxy, value);/* Все вызовы Ping запрещены. */

usleep(200*1000);

}

}

В начало