forked from 1c-syntax/bsl-language-server
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request 1c-syntax#3115 from artbear/ExternalAppStarting
Правило "Запуск внешних приложений" - ExternalAppStarting
- Loading branch information
Showing
8 changed files
with
396 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
# Запуск внешних приложений (ExternalAppStarting) | ||
|
||
<!-- Блоки выше заполняются автоматически, не трогать --> | ||
## Описание диагностики | ||
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу --> | ||
Для повышения качества и безопасности решения на 1С необходимо контролировать запуск внешних приложений из кода 1С. | ||
|
||
Данное правило распространяется на все способы запуска внешних программ, в том числе: | ||
- КомандаСистемы | ||
- ЗапуститьСистему | ||
- ЗапуститьПриложение | ||
- НачатьЗапускПриложения | ||
- ЗапуститьПриложениеАсинх | ||
- ПерейтиПоНавигационнойСсылке или ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку | ||
- ФайловаяСистемаКлиент.ЗапуститьПрограмму (в клиентском коде) и ФайловаяСистема.ЗапуститьПрограмму (в серверном коде) | ||
- ФайловаяСистемаКлиент.ОткрытьПроводник | ||
- ФайловаяСистемаКлиент.ОткрытьФайл | ||
|
||
## Примеры | ||
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию --> | ||
```bsl | ||
Процедура Метод() | ||
СтрокаКоманды = ""; | ||
ТекущийКаталог = ""; | ||
ДождатьсяЗавершения = Истина; | ||
ОписаниеОповещения = Неопределено; | ||
ПараметрыКоманды = Новый Структура; | ||
КомандаСистемы(СтрокаКоманды, ТекущийКаталог); // есть замечание | ||
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог); // есть замечание | ||
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, Истина); // есть замечание | ||
НачатьЗапускПриложения(ОписаниеОповещения, СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание | ||
ПерейтиПоНавигационнойСсылке(СтрокаКоманды); // есть замечание | ||
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды); // есть замечание | ||
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды, ОписаниеОповещения); // есть замечание | ||
ФайловаяСистемаКлиент.ЗапуститьПрограмму("ping 127.0.0.1 -n 5", ПараметрыКоманды); // есть замечание | ||
ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание | ||
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды); // есть замечание | ||
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание | ||
ФайловаяСистемаКлиент.ОткрытьПроводник("C:\Users"); // есть замечание | ||
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды); // есть замечание | ||
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды, ОписаниеОповещения); // есть замечание | ||
КонецПроцедуры | ||
&НаКлиенте | ||
Асинх Процедура Подключить() | ||
СтрокаКоманды = ""; | ||
ТекущийКаталог = ""; | ||
ДождатьсяЗавершения = Истина; | ||
Ждать ЗапуститьПриложениеАсинх(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание | ||
КонецПроцедуры | ||
&НаКлиенте | ||
Процедура ПроверкаЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки, КодВозврата) | ||
ДождатьсяЗавершения = Истина; | ||
ЗапуститьСистему(); // есть замечание | ||
ЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки); // есть замечание | ||
ЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки, ДождатьсяЗавершения); // есть замечание | ||
ЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки, ДождатьсяЗавершения, КодВозврата); // есть замечание | ||
КонецПроцедуры | ||
``` | ||
|
||
## Источники | ||
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики --> | ||
<!-- Примеры источников | ||
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc) | ||
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc) | ||
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) --> | ||
- [стандарт Безопасность запуска приложений](https://its.1c.ru/db/v8std/content/774/hdoc) | ||
- [стандарт Ограничение на выполнение «внешнего» кода](https://its.1c.ru/db/v8std/content/669/hdoc ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# External applications starting (ExternalAppStarting) | ||
|
||
<!-- Блоки выше заполняются автоматически, не трогать --> | ||
## Description | ||
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу --> | ||
|
||
## Examples | ||
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию --> | ||
|
||
## Sources | ||
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики --> | ||
<!-- Примеры источников | ||
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc) | ||
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc) | ||
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) --> |
80 changes: 80 additions & 0 deletions
80
...a/com/github/_1c_syntax/bsl/languageserver/diagnostics/ExternalAppStartingDiagnostic.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
/* | ||
* This file is a part of BSL Language Server. | ||
* | ||
* Copyright (c) 2018-2023 | ||
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors | ||
* | ||
* SPDX-License-Identifier: LGPL-3.0-or-later | ||
* | ||
* BSL Language Server is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 3.0 of the License, or (at your option) any later version. | ||
* | ||
* BSL Language Server is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with BSL Language Server. | ||
*/ | ||
package com.github._1c_syntax.bsl.languageserver.diagnostics; | ||
|
||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; | ||
import com.github._1c_syntax.utils.CaseInsensitivePattern; | ||
|
||
import java.util.Map; | ||
import java.util.regex.Pattern; | ||
|
||
@DiagnosticMetadata( | ||
type = DiagnosticType.VULNERABILITY, | ||
severity = DiagnosticSeverity.MAJOR, | ||
minutesToFix = 5, | ||
tags = { | ||
DiagnosticTag.SUSPICIOUS | ||
}, | ||
scope = DiagnosticScope.BSL | ||
|
||
) | ||
public class ExternalAppStartingDiagnostic extends AbstractFindMethodDiagnostic { | ||
private static final String DEFAULT_PATTERN_STRING = | ||
"КомандаСистемы|System|ЗапуститьСистему|RunSystem|ЗапуститьПриложение|RunApp" + | ||
"|НачатьЗапускПриложения|BeginRunningApplication" + | ||
"|ЗапуститьПриложениеАсинх|RunAppAsync|ЗапуститьПрограмму|ОткрытьПроводник|ОткрытьФайл"; | ||
private static final String PATTERN_STRING_FOR_NAVI = | ||
"|ПерейтиПоНавигационнойСсылке|GotoURL|ОткрытьНавигационнуюСсылку"; | ||
private static final Pattern DEFAULT_PATTERN = CaseInsensitivePattern.compile(DEFAULT_PATTERN_STRING); | ||
private static final boolean CHECK_GOTO_URL = false; | ||
|
||
@DiagnosticParameter( | ||
type = Boolean.class, | ||
defaultValue = "" + CHECK_GOTO_URL | ||
) | ||
private boolean checkGotoUrl = CHECK_GOTO_URL; | ||
|
||
@DiagnosticParameter( | ||
type = String.class, | ||
defaultValue = DEFAULT_PATTERN_STRING | ||
) | ||
private String userPatternString = DEFAULT_PATTERN_STRING; | ||
|
||
public ExternalAppStartingDiagnostic() { | ||
super(DEFAULT_PATTERN); | ||
} | ||
|
||
@Override | ||
public void configure(Map<String, Object> configuration) { | ||
super.configure(configuration); | ||
var pattern = userPatternString; | ||
if (checkGotoUrl){ | ||
pattern += PATTERN_STRING_FOR_NAVI; | ||
} | ||
setMethodPattern(CaseInsensitivePattern.compile(pattern)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 4 additions & 0 deletions
4
...hub/_1c_syntax/bsl/languageserver/diagnostics/ExternalAppStartingDiagnostic_en.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
diagnosticMessage=Check the launch of an external application | ||
diagnosticName=External applications starting | ||
checkGotoUrl=Check navigation links | ||
userPatternString=User regex pattern |
4 changes: 4 additions & 0 deletions
4
...hub/_1c_syntax/bsl/languageserver/diagnostics/ExternalAppStartingDiagnostic_ru.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
diagnosticMessage=Проверьте запуск внешнего приложения | ||
diagnosticName=Запуск внешних приложений | ||
checkGotoUrl=Проверять переход по навигационным ссылкам | ||
userPatternString=Пользовательский шаблон (регулярное выражение) |
132 changes: 132 additions & 0 deletions
132
...m/github/_1c_syntax/bsl/languageserver/diagnostics/ExternalAppStartingDiagnosticTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/* | ||
* This file is a part of BSL Language Server. | ||
* | ||
* Copyright (c) 2018-2023 | ||
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors | ||
* | ||
* SPDX-License-Identifier: LGPL-3.0-or-later | ||
* | ||
* BSL Language Server is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 3.0 of the License, or (at your option) any later version. | ||
* | ||
* BSL Language Server is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with BSL Language Server. | ||
*/ | ||
package com.github._1c_syntax.bsl.languageserver.diagnostics; | ||
|
||
import org.eclipse.lsp4j.Diagnostic; | ||
import org.junit.jupiter.api.Test; | ||
|
||
import java.util.List; | ||
import java.util.Map; | ||
|
||
import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat; | ||
|
||
class ExternalAppStartingDiagnosticTest extends AbstractDiagnosticTest<ExternalAppStartingDiagnostic> { | ||
ExternalAppStartingDiagnosticTest() { | ||
super(ExternalAppStartingDiagnostic.class); | ||
} | ||
|
||
@Test | ||
void test() { | ||
|
||
List<Diagnostic> diagnostics = getDiagnostics(); | ||
|
||
assertThat(diagnostics, true) | ||
.hasRange(8, 4, 18) | ||
.hasRange(9, 4, 23) | ||
.hasRange(10, 4, 23) | ||
.hasRange(12, 4, 26) | ||
|
||
.hasRange(18, 26, 44) | ||
.hasRange(19, 26, 44) | ||
.hasRange(20, 20, 38) | ||
.hasRange(21, 20, 38) | ||
.hasRange(23, 26, 42) | ||
.hasRange(24, 26, 37) | ||
.hasRange(25, 26, 37) | ||
.hasRange(35, 10, 34) | ||
|
||
.hasRange(53, 4, 20) | ||
.hasRange(54, 4, 20) | ||
.hasRange(55, 4, 20) | ||
.hasRange(56, 4, 20) | ||
.hasSize(16); | ||
} | ||
|
||
@Test | ||
void testConfigure_checkGotoUrl() { | ||
|
||
Map<String, Object> configuration = diagnosticInstance.info.getDefaultConfiguration(); | ||
configuration.put("checkGotoUrl", true); | ||
diagnosticInstance.configure(configuration); | ||
|
||
List<Diagnostic> diagnostics = getDiagnostics(); | ||
|
||
assertThat(diagnostics, true) | ||
.hasRange(8, 4, 18) | ||
.hasRange(9, 4, 23) | ||
.hasRange(10, 4, 23) | ||
.hasRange(12, 4, 26) | ||
|
||
.hasRange(14, 4, 32) | ||
.hasRange(15, 26, 52) | ||
.hasRange(16, 26, 52) | ||
|
||
.hasRange(18, 26, 44) | ||
.hasRange(19, 26, 44) | ||
.hasRange(20, 20, 38) | ||
.hasRange(21, 20, 38) | ||
.hasRange(23, 26, 42) | ||
.hasRange(24, 26, 37) | ||
.hasRange(25, 26, 37) | ||
.hasRange(35, 10, 34) | ||
|
||
.hasRange(53, 4, 20) | ||
.hasRange(54, 4, 20) | ||
.hasRange(55, 4, 20) | ||
.hasRange(56, 4, 20) | ||
.hasSize(19); | ||
} | ||
|
||
@Test | ||
void testConfigure_userPatternString() { | ||
|
||
Map<String, Object> configuration = diagnosticInstance.info.getDefaultConfiguration(); | ||
configuration.put("userPatternString", "КомандаСистемы"); | ||
diagnosticInstance.configure(configuration); | ||
|
||
List<Diagnostic> diagnostics = getDiagnostics(); | ||
|
||
assertThat(diagnostics, true) | ||
.hasRange(8, 4, 18) | ||
.hasSize(1); | ||
} | ||
|
||
@Test | ||
void testConfigure_userPatternString_checkGotoUrl() { | ||
|
||
Map<String, Object> configuration = diagnosticInstance.info.getDefaultConfiguration(); | ||
configuration.put("checkGotoUrl", true); | ||
configuration.put("userPatternString", "КомандаСистемы"); | ||
diagnosticInstance.configure(configuration); | ||
|
||
List<Diagnostic> diagnostics = getDiagnostics(); | ||
|
||
assertThat(diagnostics, true) | ||
.hasRange(8, 4, 18) | ||
|
||
.hasRange(14, 4, 32) | ||
.hasRange(15, 26, 52) | ||
.hasRange(16, 26, 52) | ||
|
||
.hasSize(4); | ||
} | ||
} |
Oops, something went wrong.