Skip to content

open-sdbl 0.6.0

Choose a tag to compare

@dobpilot dobpilot released this 20 Sep 12:36
· 23 commits to main since this release

Релиз после 0.5.5: чтение прав доступа доведено до рабочего состояния на трёх типовых базах — УНФ, «Документооборот» (PostgreSQL и MS SQL Server). Каждое изменение поведения — со своей спецификацией OpenSpec.

Ограничения доступа применяются к запросам

\as <пользователь> теперь не только запоминает пользователя, а разворачивает ограничения его ролей на Чтение и кладёт их в тот же список, что и \restrict, — по строке на объект, на языке 1С:

open-sdbl=> \as Петрова (бухгалтер)
Current user: Петрова (бухгалтер) (640 roles): …
7 session parameters read from the base: ВерсииШаблоновОграниченияДоступа, …
375 restrictions derived into \restrict.
Петрова (бухгалтер)=>

Набранное руками \restrict перекрывает развёрнутое и никогда не затирается; \as clear и \refresh забывают развёрнутые, \session разворачивает их заново. Приглашение консоли называет текущего пользователя.

Параметры сеанса берутся из базы

\as читает то, что база хранит для своих шаблонов: регистр сведений ПараметрыОграниченияДоступа (на MS SQL Server значение лежит в колонке, на PostgreSQL — ссылкой STORHDR на части в binarydata), элемент Справочник.Пользователи по идентификатору пользователя ИБ как ТекущийПользователь и пустую ссылку ВнешниеПользователи. Заданное руками не перетирается; если регистр есть, а прочитать его не удалось — названа причина.

Шаблоны ограничений

  • parse_template разбирает текст ограничения или тело шаблона в узлы TemplateNode — текст, #Если с ветвями, вызовы с аргументами, #Параметр(N) и прочие имена — со смещением каждого узла; несбалансированные директивы дают ошибку с позицией.
  • Директивы по документации 5.5.4.8.7: #ТекущаяТаблица (имя таблицы), #ИмяТекущейТаблицы (оно же строковым значением, в кавычках), ## как один #, вызов шаблона без скобок.
  • Полная форма платформы: описание таблицы после ИЗ и соединения ЛЕВОЕ/ВНУТРЕННЕЕ перед ГДЕ. Соединения компилируются в коррелированный предикат со строкой-якорем (VALUES (1)), поэтому не размножают строки ограничиваемой таблицы.
  • Консоль показывает шаблоны: \role — сигнатуры, \template <роль> [<имя>] — тело, из чего оно состоит и разбирается ли.

Роли расширений

Роль, которой нет в Config, ищется в расширениях: _ExtensionsInfo хранит ключ корневого ресурса, корень — индекс имя → ключ, ConfigCas адресует ресурсы по ключу. Читаются и права (<guid>.0), и описатель (<guid>), поэтому роль расширения называется и ограничивает. Роль, которой нет нигде, ничего не даёт и названа в отчёте, а не валит команду.

Консоль

  • \users и \user показывают e-mail (v8users.Email, с проверкой наличия колонки).
  • \rls без аргументов — список ограничений в прочитанных правах: роль, объект, право.
  • Команды доступа добавлены в автодополнение.

Производительность

Поиск без учёта регистра при разворачивании сворачивал текст на каждое вхождение: одно разворачивание шаблона БСП стоило 0.63 с. Теперь текст сворачивается один раз на поиск — \as для пользователя с 640 ролями и 470 ограниченными объектами занимает 2 с вместо 5 минут, и настолько же быстрее любой запрос к ограниченной таблице.

Совместимость

  • ExpandedRestriction получил поле joins; RestrictionError — вариант SyntaxAt { message, offset } (перечисление #[non_exhaustive]).
  • Новое в API: parse_template, TemplateNode, TemplateBranch, RestrictionTemplate::new, parse_serialized_sequence, ContentKey, extension_root_key, parse_extension_index, StoredValueRef, decode_stored_value, RoleCatalog::extend, InfoBaseUser::email.
  • #ИмяТекущейТаблицы теперь подставляется в кавычках, как описывает документация платформы.