Портабельная виртуализация путей

  !   Данная информация предназначена только только для IT-специалистов по системной интеграции модулей БИОСОФТ-М. (см. Руководства пользователя к программным продуктам)

Реализацией внутренней логики виртуализациии путей занимается класс Islib virtfs доступный только выборочному низкоуровневому коду (SEMIPUBLIC).

Приложениям при обычной работе с файлами не нужно беспокоиться о трансляции путей между внутренним потрабельным представлением их в Islibи особенностями файлов данной платформы. Такая трансляция, одновременно с проверкой корректности доступа, автоматически выполняется всеми функциями Islib получающими path, а так же низкоуровневыми инкапсуляторами как CFileHeap из ExtraSys и проч.

Связанные с этим системные классы

  • virtfsbypass- запрещен к использованию и предназначен для локальной отмены проверки корректности путей
  • virtfsimmune- содержит код, обходящий ограничения виртуализации для исключительных случаев
  • классы filedirfiledircommonsagaCModule, и частично sys поддерживают виртуализацию
  • CFileHeapCArchiveLzmaSessionIfaceGpCInterprocRunProcessIfaceGpCWaveMmioIfaceGpHTTP через cURLSQLiteБиблиотека DICOM, CShellResourceIfaceGp и проч. транслируют виртуальные пути в физические
Девиртуализация

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

    ospath ospathReal;
    if (!virtfs::GPermitPath(
            virtfs::F_Permit_..........,
            virtfs::F_Permit_..........,
            virtfs::F_Permit_..........,
            pathVirtual,
            out ospathReal,
            out out_sError))
    {
        rASSTR(out_sError);
        return out_sError == "";
    }
  • При одной конверсии поддерживается проверка до трех типов доступа сразу.
  • На входе поступает виртуальный путь pathVirtualизначально полученный от одной из системных функций и возможно дополненный приложением через GetAppendedPath().
  • На выходе ospathсодержит системный путь зависящий от платформы
  • В случае возврата false файловая операция не должна выполнятся, и если out_sError не пустая то ошибка должна диагностироваться в приложение (особый не обычный режим работы когда сбой сопровождается пустой out_sError означает что файловая операция должна быть просто пропущена без всякой диагностики)
Виртуализация непортабельных путей

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

На низком уровне virtfs::GVirtualizeLocalOsPath() формирует виртуализованный путь к корневой директории из непортабельного пути текущей платформы. Тот факт что эта функция сработала без ассертов не означает что последующий доступ к данному пути будет разрешен GPermitPath().

Виртуальный синтаксис путей

Пути в path теперь содержат некие текстовые строчки с неопределенным синтаксисом, определяющим либо

  • либо корневой полный абсолютный путь к файлу начинающийся с того что вернула Islib функция возвращающаяя разрешенные пути, возможно дополненый с помощью GetAppendedPath()
  • либо относительный путь сформированный через GetAppendedPath(): path("MySubDir").GetAppendedPath("MyFile.txt") который невозможно использовать для доступа к файлам пока он не будет прилеплен к абсолютному пути с помощю GetAppendedPath()
  • либо просто имя файла или директории, предназначенное потом быть прилепленным к полному пути
  • либо расширение начинающееся с точки (всегда!)
  • либо полный абсолютный сетевой путь полученный из легального виртуализирующего источника (virtfs::GVirtualizeLocalOrNetworkOsPath() для LL кода которому она разрешена в предварительно согласованном SEMIPUBLIC)
  • либо http:// URL
  • либо пустую строку

Непортабельные низкоуровневые пути обрабатываются ospath запрещенным для обычных приложений.

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

Единственное знание о синтаксисе путей которое должно быть явно прописано в приложении это то что расширение файла начинается с точки. Это всегда будет интерпретироваться правильно в любых системах. Кроме того точка может использоваться и в других целях в именах файлов (как при обозначении номера версий). Никаких слешей и двоеточий в приложении быть не может и ожидать их наличия или отсутствия в сформированных pathнельзя.

Приложение должно очень осторожно использовать GetFolder, GetParentFolder только на сформированных им путях или не использовать никогда вообще. Нельзя подразумевать что системный path который вернула системная функции содержит какую то предсказуемую цепочку директорий и можно подняться на уровень выше. Например взять системный GGetMyDocumentsFolder() и пытаться зайти в его GetParentFolder! Очевидно что это операция приводит к какому то катастрофически непортабельному результату. Эта операция может и не работать вообще если Islib использует макросы внутри path и GGetMyDocumentsFolder() вернет скрипт вида "<MyDocuments>" а GetPatientDataFolder(): "{drive:c}{dir:<Patients@Data>}" где просто нет компонентов на которые приложение может что то разложить.

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

 !  Хранение абсолютных путей в файлах между разными сессиями и передача их между машинами по сети или иначе запрещена!

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

Регистр

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

Политика слешей

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

Визуализация в UV

Для удобства при выводе path средствами UniversalView путь обретает более читабельный синтаксис текущей ОС (для Windows появляется двоеточие отделяющее диск, которое однако выглядит своеобразно).

Корректное отображение виртуализированных путей для пользователя

В логах тестов

Пока все спецификации дисков заменяются на виндусный формат "c:\" для постоянства логов.

Передача путей другим процессам

Между нашими Islib-процессами абсолютные виртуальные пути path (не ospath) можно передавать любым способом. Через экспозицию и Interproc или в командной строке. Девиртуализация с верификацией будет сделана процессом, непосредственно выполняющим файловую операцию.

Это совместимо и с консольными Consex-based процессами. Они работают с виртуальными путями.

Для не-Islib внешних приложений потребуется обязательная девиртуализация пути path с проверкой прав доступа согласно тому как внешнее приложение будет этот путь использовать.

Исключения их правил

http://www.biosoft-m.ru/17977

Эта категория в данный момент пуста.