Skip to content

Latest commit

 

History

History
114 lines (98 loc) · 7.29 KB

README.md

File metadata and controls

114 lines (98 loc) · 7.29 KB

rx-util-codeanalyzer

Репозиторий с утилитой «Скрипт-анализатор для поиска нелегалов».

Описание

Утилита позволяет найти в коде разработки Directum RX запрещенные конструкции. Чтобы произвести проверку, нужно запустить .bat файл прописав в нем необходимые параметры:

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

  • -path "Путь до проверяемой папки", папка в которой необходимо проверить файлы на присутствие запрещенных конструкций.

Результат работы утилиты выводится в консоль. При необходимости поток выводимых данных можно перенаправить в текстовый файл. Пример выполнения:

chcp 1251 && powershell.exe -executionpolicy unrestricted -File .\GetIllegals.ps1 -all all -path .\Work > .\logger.txt

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

Note

Замечания и пожеланию по развитию шаблона разработки фиксируйте через Issues. При оформлении ошибки, опишите сценарий для воспроизведения. Для пожеланий приведите обоснование для описываемых изменений - частоту использования, бизнес-ценность, риски и/или эффект от реализации.

Внимание! Изменения будут вноситься только в новые версии.

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

Критичные:

  1. Remote-функции в "Обновлении формы".
  2. Remote-функции и получение сущностей через Get, GetAll в "Возможности выполнения действий".

Средней критичности:

  1. Создание, удаление, получение сущностей через Get и GetAll не в серверном коде.
  2. Использование анонимных типов.
  3. Приведение к типу через is, as.
  4. Использование запрещенных класов .Net.

Порядок установки

Скрипт не имеет инсталлятора. Установка не требуется.

Для проверки необходимо:

  1. Склонировать репозиторий.
  2. Изменить файл run.bat, указав в нем необходимые параметры.
  3. Запустить утилиту с помощью run.bat, посмотреть результат работы.

Для использования при коммите:

  1. Склонировать репозиторий.
  2. Скопировать GetIllegals.ps1 в папку с репозиторием для которого необходимо настроить проверку, а pre-commit в папку .git\hooks данного репозитория.
  3. Внести файл GetIllegals.ps1 в файл .gitignore.

Модификация

Для модификации скрипта требуется наличие на рабочем месте разработчика интегрированной среды сценариев PowerShell ISE.

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

  1. Необходимо получить все файлы из родительской папки. В данном случае файл будет иметь в имени "Handlers", и так как данный код относится к клиентскому, то полный путь будет содержать "ClientBase".
$refreshFiles = Get-ChildItem -Include *.cs -Exclude *.g.cs, *g.i.cs -Recurse | ? { $_.FullName -match '\w*.ClientBase.*(Handlers)' }
  1. Разработать функцию для поиска серверных функций в обработчике события "Обновление формы". Установить факт вызова серверной функции из клиентского кода можно по аттрибуту "Remote". Поэтому реализуем регулярное выражение для поиска подобных конструкции, и если они есть, то выведем имя файла.
function Get-FilesRefreshIllegal ($file)
{
    $result = 0
    $content = Get-Content $file.FullName | % { $contentstring += $_ }
    $illegal = $contentstring | Select-String -Pattern ' Refresh\(.*?(Remote|public)' -AllMatches -CaseSensitive
    if ($illegal.Count -ne 0)
    {
        foreach ($match in $illegal.Matches)
        {
            if($match.Value -ne $null -and $match.Value.Contains("Remote"))
            {
                Write-Host $file.FullName
                $result = 1
            }
        }
    }
    return $result
}
  1. Пройтись в цикле по всем отфильтрованным файлам в пункте 1, функцией разработанной на шаге 2.
foreach($file in $refreshFiles)
{
    $result = Get-FilesRefreshIllegal($file)
    if ($result -eq 1)
    {
        $exitcode = 1;
    }
}

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

function Get-FilesRefreshIllegal ($file)
{
    $content = Get-Content $file.FullName | % { $contentstring += $_ }
    $illegal = $contentstring | Select-String -Pattern ' Refresh\(.*?(Remote|public)' -AllMatches -CaseSensitive
    if ($illegal.Count -ne 0)
    {
        foreach ($match in $illegal.Matches)
        {
            if($match.Value -ne $null -and $match.Value.Contains("Remote"))
            {
                Write-Host $file.FullName
            }
        }
    }
}
foreach($file in $refreshFiles)
{
    Get-FilesRefreshIllegal($file)
}