Skip to content

Commit 29390f1

Browse files
authored
Merge pull request #3115 from artbear/ExternalAppStarting
Правило "Запуск внешних приложений" - ExternalAppStarting
2 parents 33eb49d + f378e30 commit 29390f1

File tree

8 files changed

+396
-0
lines changed

8 files changed

+396
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Запуск внешних приложений (ExternalAppStarting)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Описание диагностики
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
Для повышения качества и безопасности решения на 1С необходимо контролировать запуск внешних приложений из кода 1С.
7+
8+
Данное правило распространяется на все способы запуска внешних программ, в том числе:
9+
- КомандаСистемы
10+
- ЗапуститьСистему
11+
- ЗапуститьПриложение
12+
- НачатьЗапускПриложения
13+
- ЗапуститьПриложениеАсинх
14+
- ПерейтиПоНавигационнойСсылке или ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку
15+
- ФайловаяСистемаКлиент.ЗапуститьПрограмму (в клиентском коде) и ФайловаяСистема.ЗапуститьПрограмму (в серверном коде)
16+
- ФайловаяСистемаКлиент.ОткрытьПроводник
17+
- ФайловаяСистемаКлиент.ОткрытьФайл
18+
19+
## Примеры
20+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
21+
```bsl
22+
Процедура Метод()
23+
СтрокаКоманды = "";
24+
ТекущийКаталог = "";
25+
ДождатьсяЗавершения = Истина;
26+
ОписаниеОповещения = Неопределено;
27+
ПараметрыКоманды = Новый Структура;
28+
29+
КомандаСистемы(СтрокаКоманды, ТекущийКаталог); // есть замечание
30+
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог); // есть замечание
31+
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, Истина); // есть замечание
32+
33+
НачатьЗапускПриложения(ОписаниеОповещения, СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание
34+
35+
ПерейтиПоНавигационнойСсылке(СтрокаКоманды); // есть замечание
36+
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды); // есть замечание
37+
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды, ОписаниеОповещения); // есть замечание
38+
39+
ФайловаяСистемаКлиент.ЗапуститьПрограмму("ping 127.0.0.1 -n 5", ПараметрыКоманды); // есть замечание
40+
ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание
41+
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды); // есть замечание
42+
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание
43+
44+
ФайловаяСистемаКлиент.ОткрытьПроводник("C:\Users"); // есть замечание
45+
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды); // есть замечание
46+
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды, ОписаниеОповещения); // есть замечание
47+
48+
КонецПроцедуры
49+
50+
&НаКлиенте
51+
Асинх Процедура Подключить()
52+
СтрокаКоманды = "";
53+
ТекущийКаталог = "";
54+
ДождатьсяЗавершения = Истина;
55+
56+
Ждать ЗапуститьПриложениеАсинх(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание
57+
КонецПроцедуры
58+
59+
&НаКлиенте
60+
Процедура ПроверкаЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки, КодВозврата)
61+
ДождатьсяЗавершения = Истина;
62+
63+
ЗапуститьСистему(); // есть замечание
64+
ЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки); // есть замечание
65+
ЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки, ДождатьсяЗавершения); // есть замечание
66+
ЗапуститьСистему(ДополнительныеПараметрыКоманднойСтроки, ДождатьсяЗавершения, КодВозврата); // есть замечание
67+
КонецПроцедуры
68+
```
69+
70+
## Источники
71+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
72+
<!-- Примеры источников
73+
74+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
75+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
76+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
77+
- [стандарт Безопасность запуска приложений](https://its.1c.ru/db/v8std/content/774/hdoc)
78+
- [стандарт Ограничение на выполнение «внешнего» кода](https://its.1c.ru/db/v8std/content/669/hdoc )
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# External applications starting (ExternalAppStarting)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Description
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
7+
## Examples
8+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
9+
10+
## Sources
11+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
12+
<!-- Примеры источников
13+
14+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
15+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
16+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* This file is a part of BSL Language Server.
3+
*
4+
* Copyright (c) 2018-2023
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com> and contributors
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Language Server is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Language Server is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Language Server.
21+
*/
22+
package com.github._1c_syntax.bsl.languageserver.diagnostics;
23+
24+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
25+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter;
26+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope;
27+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
28+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
29+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
30+
import com.github._1c_syntax.utils.CaseInsensitivePattern;
31+
32+
import java.util.Map;
33+
import java.util.regex.Pattern;
34+
35+
@DiagnosticMetadata(
36+
type = DiagnosticType.VULNERABILITY,
37+
severity = DiagnosticSeverity.MAJOR,
38+
minutesToFix = 5,
39+
tags = {
40+
DiagnosticTag.SUSPICIOUS
41+
},
42+
scope = DiagnosticScope.BSL
43+
44+
)
45+
public class ExternalAppStartingDiagnostic extends AbstractFindMethodDiagnostic {
46+
private static final String DEFAULT_PATTERN_STRING =
47+
"КомандаСистемы|System|ЗапуститьСистему|RunSystem|ЗапуститьПриложение|RunApp" +
48+
"|НачатьЗапускПриложения|BeginRunningApplication" +
49+
"|ЗапуститьПриложениеАсинх|RunAppAsync|ЗапуститьПрограмму|ОткрытьПроводник|ОткрытьФайл";
50+
private static final String PATTERN_STRING_FOR_NAVI =
51+
"|ПерейтиПоНавигационнойСсылке|GotoURL|ОткрытьНавигационнуюСсылку";
52+
private static final Pattern DEFAULT_PATTERN = CaseInsensitivePattern.compile(DEFAULT_PATTERN_STRING);
53+
private static final boolean CHECK_GOTO_URL = false;
54+
55+
@DiagnosticParameter(
56+
type = Boolean.class,
57+
defaultValue = "" + CHECK_GOTO_URL
58+
)
59+
private boolean checkGotoUrl = CHECK_GOTO_URL;
60+
61+
@DiagnosticParameter(
62+
type = String.class,
63+
defaultValue = DEFAULT_PATTERN_STRING
64+
)
65+
private String userPatternString = DEFAULT_PATTERN_STRING;
66+
67+
public ExternalAppStartingDiagnostic() {
68+
super(DEFAULT_PATTERN);
69+
}
70+
71+
@Override
72+
public void configure(Map<String, Object> configuration) {
73+
super.configure(configuration);
74+
var pattern = userPatternString;
75+
if (checkGotoUrl){
76+
pattern += PATTERN_STRING_FOR_NAVI;
77+
}
78+
setMethodPattern(CaseInsensitivePattern.compile(pattern));
79+
}
80+
}

src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,30 @@
658658
"title": "Ban export global module variables",
659659
"$id": "#/definitions/ExportVariables"
660660
},
661+
"ExternalAppStarting": {
662+
"description": "External applications starting",
663+
"default": true,
664+
"type": [
665+
"boolean",
666+
"object"
667+
],
668+
"title": "External applications starting",
669+
"properties": {
670+
"checkGotoUrl": {
671+
"description": "Check navigation links",
672+
"default": false,
673+
"type": "boolean",
674+
"title": "Check navigation links"
675+
},
676+
"userPatternString": {
677+
"description": "User regex pattern",
678+
"default": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430\u0421\u0438\u0441\u0442\u0435\u043c\u044b|System|\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0421\u0438\u0441\u0442\u0435\u043c\u0443|RunSystem|\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435|RunApp|\u041d\u0430\u0447\u0430\u0442\u044c\u0417\u0430\u043f\u0443\u0441\u043a\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f|BeginRunningApplication|\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0410\u0441\u0438\u043d\u0445|RunAppAsync|\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443|\u041e\u0442\u043a\u0440\u044b\u0442\u044c\u041f\u0440\u043e\u0432\u043e\u0434\u043d\u0438\u043a|\u041e\u0442\u043a\u0440\u044b\u0442\u044c\u0424\u0430\u0439\u043b",
679+
"type": "string",
680+
"title": "User regex pattern"
681+
}
682+
},
683+
"$id": "#/definitions/ExternalAppStarting"
684+
},
661685
"ExtraCommas": {
662686
"description": "Commas without a parameter at the end of a method call",
663687
"default": true,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
diagnosticMessage=Check the launch of an external application
2+
diagnosticName=External applications starting
3+
checkGotoUrl=Check navigation links
4+
userPatternString=User regex pattern
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
diagnosticMessage=Проверьте запуск внешнего приложения
2+
diagnosticName=Запуск внешних приложений
3+
checkGotoUrl=Проверять переход по навигационным ссылкам
4+
userPatternString=Пользовательский шаблон (регулярное выражение)
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
* This file is a part of BSL Language Server.
3+
*
4+
* Copyright (c) 2018-2023
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com> and contributors
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Language Server is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Language Server is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Language Server.
21+
*/
22+
package com.github._1c_syntax.bsl.languageserver.diagnostics;
23+
24+
import org.eclipse.lsp4j.Diagnostic;
25+
import org.junit.jupiter.api.Test;
26+
27+
import java.util.List;
28+
import java.util.Map;
29+
30+
import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat;
31+
32+
class ExternalAppStartingDiagnosticTest extends AbstractDiagnosticTest<ExternalAppStartingDiagnostic> {
33+
ExternalAppStartingDiagnosticTest() {
34+
super(ExternalAppStartingDiagnostic.class);
35+
}
36+
37+
@Test
38+
void test() {
39+
40+
List<Diagnostic> diagnostics = getDiagnostics();
41+
42+
assertThat(diagnostics, true)
43+
.hasRange(8, 4, 18)
44+
.hasRange(9, 4, 23)
45+
.hasRange(10, 4, 23)
46+
.hasRange(12, 4, 26)
47+
48+
.hasRange(18, 26, 44)
49+
.hasRange(19, 26, 44)
50+
.hasRange(20, 20, 38)
51+
.hasRange(21, 20, 38)
52+
.hasRange(23, 26, 42)
53+
.hasRange(24, 26, 37)
54+
.hasRange(25, 26, 37)
55+
.hasRange(35, 10, 34)
56+
57+
.hasRange(53, 4, 20)
58+
.hasRange(54, 4, 20)
59+
.hasRange(55, 4, 20)
60+
.hasRange(56, 4, 20)
61+
.hasSize(16);
62+
}
63+
64+
@Test
65+
void testConfigure_checkGotoUrl() {
66+
67+
Map<String, Object> configuration = diagnosticInstance.info.getDefaultConfiguration();
68+
configuration.put("checkGotoUrl", true);
69+
diagnosticInstance.configure(configuration);
70+
71+
List<Diagnostic> diagnostics = getDiagnostics();
72+
73+
assertThat(diagnostics, true)
74+
.hasRange(8, 4, 18)
75+
.hasRange(9, 4, 23)
76+
.hasRange(10, 4, 23)
77+
.hasRange(12, 4, 26)
78+
79+
.hasRange(14, 4, 32)
80+
.hasRange(15, 26, 52)
81+
.hasRange(16, 26, 52)
82+
83+
.hasRange(18, 26, 44)
84+
.hasRange(19, 26, 44)
85+
.hasRange(20, 20, 38)
86+
.hasRange(21, 20, 38)
87+
.hasRange(23, 26, 42)
88+
.hasRange(24, 26, 37)
89+
.hasRange(25, 26, 37)
90+
.hasRange(35, 10, 34)
91+
92+
.hasRange(53, 4, 20)
93+
.hasRange(54, 4, 20)
94+
.hasRange(55, 4, 20)
95+
.hasRange(56, 4, 20)
96+
.hasSize(19);
97+
}
98+
99+
@Test
100+
void testConfigure_userPatternString() {
101+
102+
Map<String, Object> configuration = diagnosticInstance.info.getDefaultConfiguration();
103+
configuration.put("userPatternString", "КомандаСистемы");
104+
diagnosticInstance.configure(configuration);
105+
106+
List<Diagnostic> diagnostics = getDiagnostics();
107+
108+
assertThat(diagnostics, true)
109+
.hasRange(8, 4, 18)
110+
.hasSize(1);
111+
}
112+
113+
@Test
114+
void testConfigure_userPatternString_checkGotoUrl() {
115+
116+
Map<String, Object> configuration = diagnosticInstance.info.getDefaultConfiguration();
117+
configuration.put("checkGotoUrl", true);
118+
configuration.put("userPatternString", "КомандаСистемы");
119+
diagnosticInstance.configure(configuration);
120+
121+
List<Diagnostic> diagnostics = getDiagnostics();
122+
123+
assertThat(diagnostics, true)
124+
.hasRange(8, 4, 18)
125+
126+
.hasRange(14, 4, 32)
127+
.hasRange(15, 26, 52)
128+
.hasRange(16, 26, 52)
129+
130+
.hasSize(4);
131+
}
132+
}

0 commit comments

Comments
 (0)