@kenhkl/agent-moss 0.17.13 → 0.17.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +10 -4
- package/dist/engine/coordinator.js +10 -4
- package/dist/server.js +10 -4
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2162,6 +2162,10 @@ function checkReadBeforeWrite(actionType, actionDetail, actionHistory, reason, c
|
|
|
2162
2162
|
}
|
|
2163
2163
|
return null;
|
|
2164
2164
|
}
|
|
2165
|
+
function isAskUserAction(actionType) {
|
|
2166
|
+
if (ASK_USER_ACTION_TYPES.includes(actionType)) return true;
|
|
2167
|
+
return actionType.endsWith("-askuser");
|
|
2168
|
+
}
|
|
2165
2169
|
function consentWithinTtl(asked, aNext) {
|
|
2166
2170
|
const raw = String(process.env.AGENT_MOSS_CONSENT_TTL_SECONDS || "").trim();
|
|
2167
2171
|
const parsed = raw ? Number(raw) : CONSENT_TTL_SECONDS;
|
|
@@ -2180,7 +2184,7 @@ function hasValidConsent(actionHistory, aNext) {
|
|
|
2180
2184
|
const tail = actionHistory.slice(-CONSENT_MAX_DISTANCE);
|
|
2181
2185
|
for (let i = tail.length - 1; i >= 0; i--) {
|
|
2182
2186
|
const h = tail[i];
|
|
2183
|
-
if (String(h.actionType || "").toLowerCase()
|
|
2187
|
+
if (!isAskUserAction(String(h.actionType || "").toLowerCase())) continue;
|
|
2184
2188
|
const output = String(h.output || "").trim();
|
|
2185
2189
|
if (!output) return false;
|
|
2186
2190
|
const question = String(h.actionDetail || "");
|
|
@@ -2192,7 +2196,7 @@ function hasValidConsent(actionHistory, aNext) {
|
|
|
2192
2196
|
return false;
|
|
2193
2197
|
}
|
|
2194
2198
|
function checkPasswordConsent(actionType, actionDetail, actionHistory, osType, aNext) {
|
|
2195
|
-
if (actionType
|
|
2199
|
+
if (!BASH_LIKE_ACTION_TYPES.includes(actionType)) return null;
|
|
2196
2200
|
const pwdPatterns = runtimeConfigBridge.current?.effectivePasswordPatterns(osType) ?? PASSWORD_MODIFY_PATTERNS;
|
|
2197
2201
|
const isPasswordModify = pwdPatterns.some((p) => p.test(actionDetail));
|
|
2198
2202
|
if (!isPasswordModify) return null;
|
|
@@ -2208,7 +2212,7 @@ function checkPasswordConsent(actionType, actionDetail, actionHistory, osType, a
|
|
|
2208
2212
|
};
|
|
2209
2213
|
}
|
|
2210
2214
|
function checkUserDeletionConsent(actionType, actionDetail, actionHistory, osType, aNext) {
|
|
2211
|
-
if (actionType
|
|
2215
|
+
if (!BASH_LIKE_ACTION_TYPES.includes(actionType)) return null;
|
|
2212
2216
|
const udPatterns = runtimeConfigBridge.current?.effectiveUserDeletionPatterns(osType) ?? USER_DELETION_PATTERNS;
|
|
2213
2217
|
const isUserDeletion = udPatterns.some((p) => p.test(actionDetail));
|
|
2214
2218
|
if (!isUserDeletion) return null;
|
|
@@ -2314,7 +2318,7 @@ function checkIndirectFileAccess(actionType, actionDetail, cwd, osType) {
|
|
|
2314
2318
|
violatedLayers: ["L2.1"]
|
|
2315
2319
|
};
|
|
2316
2320
|
}
|
|
2317
|
-
var _LOGIC, _HEURISTIC, EXCLUDED_PREFIXES, TEMP_DIRS, ROOT_SENSITIVE_PATHS, HOME_SENSITIVE_PATHS, CREDENTIAL_PATHS, ROOT_SENSITIVE_PATHS_WINDOWS, HOME_SENSITIVE_PATHS_WINDOWS, CREDENTIAL_PATHS_WINDOWS, ROOT_SENSITIVE_PATHS_MACOS, HOME_SENSITIVE_PATHS_MACOS, CREDENTIAL_PATHS_MACOS, ROOT_SENSITIVE_PATHS_HARMONY, HOME_SENSITIVE_PATHS_HARMONY, CREDENTIAL_PATHS_HARMONY, _scopeIndex, NON_WRITE_TOOLS, NON_WRITE_TOOL_PREFIXES, PSEUDO_FS_PREFIXES, WRITE_KEYWORDS, SED_INPLACE_RE, DEVNULL_REDIRECT_RE, CREATE_KEYWORDS, PASSWORD_MODIFY_PATTERNS, USER_DELETION_PATTERNS, INTENT_DEVIATION_PATTERNS, COMBO_STAGES, COMBO_CHAINS, CONSENT_TOPIC, CONSENT_NEGATIVE, CONSENT_AFFIRMATIVE, CONSENT_INPUT_REQUEST, CONSENT_MAX_DISTANCE, CONSENT_TTL_SECONDS, INLINE_SCRIPT_RE, DIR_TRAVERSAL_KW, _IFA, IFA_READ_KEYWORDS, IFA_WRITE_KEYWORDS, IFA_EXEC_KEYWORDS, IFA_OPEN_KEYWORDS;
|
|
2321
|
+
var _LOGIC, _HEURISTIC, EXCLUDED_PREFIXES, TEMP_DIRS, ROOT_SENSITIVE_PATHS, HOME_SENSITIVE_PATHS, CREDENTIAL_PATHS, ROOT_SENSITIVE_PATHS_WINDOWS, HOME_SENSITIVE_PATHS_WINDOWS, CREDENTIAL_PATHS_WINDOWS, ROOT_SENSITIVE_PATHS_MACOS, HOME_SENSITIVE_PATHS_MACOS, CREDENTIAL_PATHS_MACOS, ROOT_SENSITIVE_PATHS_HARMONY, HOME_SENSITIVE_PATHS_HARMONY, CREDENTIAL_PATHS_HARMONY, _scopeIndex, NON_WRITE_TOOLS, NON_WRITE_TOOL_PREFIXES, PSEUDO_FS_PREFIXES, WRITE_KEYWORDS, SED_INPLACE_RE, DEVNULL_REDIRECT_RE, CREATE_KEYWORDS, PASSWORD_MODIFY_PATTERNS, USER_DELETION_PATTERNS, INTENT_DEVIATION_PATTERNS, COMBO_STAGES, COMBO_CHAINS, CONSENT_TOPIC, CONSENT_NEGATIVE, CONSENT_AFFIRMATIVE, CONSENT_INPUT_REQUEST, CONSENT_MAX_DISTANCE, CONSENT_TTL_SECONDS, BASH_LIKE_ACTION_TYPES, ASK_USER_ACTION_TYPES, INLINE_SCRIPT_RE, DIR_TRAVERSAL_KW, _IFA, IFA_READ_KEYWORDS, IFA_WRITE_KEYWORDS, IFA_EXEC_KEYWORDS, IFA_OPEN_KEYWORDS;
|
|
2318
2322
|
var init_logic_rules = __esm({
|
|
2319
2323
|
"src/engine/logic-rules.ts"() {
|
|
2320
2324
|
"use strict";
|
|
@@ -2407,6 +2411,8 @@ var init_logic_rules = __esm({
|
|
|
2407
2411
|
CONSENT_INPUT_REQUEST = /(?:请|输入|提供|填写|给出|告诉我).{0,8}(?:新的?)?(?:密码|口令|passwd|password)/i;
|
|
2408
2412
|
CONSENT_MAX_DISTANCE = 5;
|
|
2409
2413
|
CONSENT_TTL_SECONDS = 300;
|
|
2414
|
+
BASH_LIKE_ACTION_TYPES = ["bash", "executebash", "terminal-executebash"];
|
|
2415
|
+
ASK_USER_ACTION_TYPES = ["ask_user_question", "askuser"];
|
|
2410
2416
|
INLINE_SCRIPT_RE = /(?:^|\s)(?:python|python3|python3\.\d+|perl|perl5|ruby|jruby|mruby|node|php|lua)\s+(?:-[a-zA-Z]*[cer][a-zA-Z]*\s+)/i;
|
|
2411
2417
|
DIR_TRAVERSAL_KW = loadInline().dir_traversal_keywords ?? [];
|
|
2412
2418
|
_IFA = loadLogicRules().indirect_file_access ?? {};
|
|
@@ -1339,6 +1339,10 @@ function checkReadBeforeWrite(actionType, actionDetail, actionHistory, reason, c
|
|
|
1339
1339
|
}
|
|
1340
1340
|
return null;
|
|
1341
1341
|
}
|
|
1342
|
+
function isAskUserAction(actionType) {
|
|
1343
|
+
if (ASK_USER_ACTION_TYPES.includes(actionType)) return true;
|
|
1344
|
+
return actionType.endsWith("-askuser");
|
|
1345
|
+
}
|
|
1342
1346
|
function consentWithinTtl(asked, aNext) {
|
|
1343
1347
|
const raw = String(process.env.AGENT_MOSS_CONSENT_TTL_SECONDS || "").trim();
|
|
1344
1348
|
const parsed = raw ? Number(raw) : CONSENT_TTL_SECONDS;
|
|
@@ -1357,7 +1361,7 @@ function hasValidConsent(actionHistory, aNext) {
|
|
|
1357
1361
|
const tail = actionHistory.slice(-CONSENT_MAX_DISTANCE);
|
|
1358
1362
|
for (let i = tail.length - 1; i >= 0; i--) {
|
|
1359
1363
|
const h = tail[i];
|
|
1360
|
-
if (String(h.actionType || "").toLowerCase()
|
|
1364
|
+
if (!isAskUserAction(String(h.actionType || "").toLowerCase())) continue;
|
|
1361
1365
|
const output = String(h.output || "").trim();
|
|
1362
1366
|
if (!output) return false;
|
|
1363
1367
|
const question = String(h.actionDetail || "");
|
|
@@ -1369,7 +1373,7 @@ function hasValidConsent(actionHistory, aNext) {
|
|
|
1369
1373
|
return false;
|
|
1370
1374
|
}
|
|
1371
1375
|
function checkPasswordConsent(actionType, actionDetail, actionHistory, osType, aNext) {
|
|
1372
|
-
if (actionType
|
|
1376
|
+
if (!BASH_LIKE_ACTION_TYPES.includes(actionType)) return null;
|
|
1373
1377
|
const pwdPatterns = runtimeConfigBridge.current?.effectivePasswordPatterns(osType) ?? PASSWORD_MODIFY_PATTERNS;
|
|
1374
1378
|
const isPasswordModify = pwdPatterns.some((p) => p.test(actionDetail));
|
|
1375
1379
|
if (!isPasswordModify) return null;
|
|
@@ -1385,7 +1389,7 @@ function checkPasswordConsent(actionType, actionDetail, actionHistory, osType, a
|
|
|
1385
1389
|
};
|
|
1386
1390
|
}
|
|
1387
1391
|
function checkUserDeletionConsent(actionType, actionDetail, actionHistory, osType, aNext) {
|
|
1388
|
-
if (actionType
|
|
1392
|
+
if (!BASH_LIKE_ACTION_TYPES.includes(actionType)) return null;
|
|
1389
1393
|
const udPatterns = runtimeConfigBridge.current?.effectiveUserDeletionPatterns(osType) ?? USER_DELETION_PATTERNS;
|
|
1390
1394
|
const isUserDeletion = udPatterns.some((p) => p.test(actionDetail));
|
|
1391
1395
|
if (!isUserDeletion) return null;
|
|
@@ -1491,7 +1495,7 @@ function checkIndirectFileAccess(actionType, actionDetail, cwd, osType) {
|
|
|
1491
1495
|
violatedLayers: ["L2.1"]
|
|
1492
1496
|
};
|
|
1493
1497
|
}
|
|
1494
|
-
var _LOGIC, _HEURISTIC, EXCLUDED_PREFIXES, TEMP_DIRS, ROOT_SENSITIVE_PATHS, HOME_SENSITIVE_PATHS, CREDENTIAL_PATHS, ROOT_SENSITIVE_PATHS_WINDOWS, HOME_SENSITIVE_PATHS_WINDOWS, CREDENTIAL_PATHS_WINDOWS, ROOT_SENSITIVE_PATHS_MACOS, HOME_SENSITIVE_PATHS_MACOS, CREDENTIAL_PATHS_MACOS, ROOT_SENSITIVE_PATHS_HARMONY, HOME_SENSITIVE_PATHS_HARMONY, CREDENTIAL_PATHS_HARMONY, _scopeIndex, NON_WRITE_TOOLS, NON_WRITE_TOOL_PREFIXES, PSEUDO_FS_PREFIXES, WRITE_KEYWORDS, SED_INPLACE_RE, DEVNULL_REDIRECT_RE, CREATE_KEYWORDS, PASSWORD_MODIFY_PATTERNS, USER_DELETION_PATTERNS, INTENT_DEVIATION_PATTERNS, COMBO_STAGES, COMBO_CHAINS, CONSENT_TOPIC, CONSENT_NEGATIVE, CONSENT_AFFIRMATIVE, CONSENT_INPUT_REQUEST, CONSENT_MAX_DISTANCE, CONSENT_TTL_SECONDS, INLINE_SCRIPT_RE, DIR_TRAVERSAL_KW, _IFA, IFA_READ_KEYWORDS, IFA_WRITE_KEYWORDS, IFA_EXEC_KEYWORDS, IFA_OPEN_KEYWORDS;
|
|
1498
|
+
var _LOGIC, _HEURISTIC, EXCLUDED_PREFIXES, TEMP_DIRS, ROOT_SENSITIVE_PATHS, HOME_SENSITIVE_PATHS, CREDENTIAL_PATHS, ROOT_SENSITIVE_PATHS_WINDOWS, HOME_SENSITIVE_PATHS_WINDOWS, CREDENTIAL_PATHS_WINDOWS, ROOT_SENSITIVE_PATHS_MACOS, HOME_SENSITIVE_PATHS_MACOS, CREDENTIAL_PATHS_MACOS, ROOT_SENSITIVE_PATHS_HARMONY, HOME_SENSITIVE_PATHS_HARMONY, CREDENTIAL_PATHS_HARMONY, _scopeIndex, NON_WRITE_TOOLS, NON_WRITE_TOOL_PREFIXES, PSEUDO_FS_PREFIXES, WRITE_KEYWORDS, SED_INPLACE_RE, DEVNULL_REDIRECT_RE, CREATE_KEYWORDS, PASSWORD_MODIFY_PATTERNS, USER_DELETION_PATTERNS, INTENT_DEVIATION_PATTERNS, COMBO_STAGES, COMBO_CHAINS, CONSENT_TOPIC, CONSENT_NEGATIVE, CONSENT_AFFIRMATIVE, CONSENT_INPUT_REQUEST, CONSENT_MAX_DISTANCE, CONSENT_TTL_SECONDS, BASH_LIKE_ACTION_TYPES, ASK_USER_ACTION_TYPES, INLINE_SCRIPT_RE, DIR_TRAVERSAL_KW, _IFA, IFA_READ_KEYWORDS, IFA_WRITE_KEYWORDS, IFA_EXEC_KEYWORDS, IFA_OPEN_KEYWORDS;
|
|
1495
1499
|
var init_logic_rules = __esm({
|
|
1496
1500
|
"src/engine/logic-rules.ts"() {
|
|
1497
1501
|
"use strict";
|
|
@@ -1584,6 +1588,8 @@ var init_logic_rules = __esm({
|
|
|
1584
1588
|
CONSENT_INPUT_REQUEST = /(?:请|输入|提供|填写|给出|告诉我).{0,8}(?:新的?)?(?:密码|口令|passwd|password)/i;
|
|
1585
1589
|
CONSENT_MAX_DISTANCE = 5;
|
|
1586
1590
|
CONSENT_TTL_SECONDS = 300;
|
|
1591
|
+
BASH_LIKE_ACTION_TYPES = ["bash", "executebash", "terminal-executebash"];
|
|
1592
|
+
ASK_USER_ACTION_TYPES = ["ask_user_question", "askuser"];
|
|
1587
1593
|
INLINE_SCRIPT_RE = /(?:^|\s)(?:python|python3|python3\.\d+|perl|perl5|ruby|jruby|mruby|node|php|lua)\s+(?:-[a-zA-Z]*[cer][a-zA-Z]*\s+)/i;
|
|
1588
1594
|
DIR_TRAVERSAL_KW = loadInline().dir_traversal_keywords ?? [];
|
|
1589
1595
|
_IFA = loadLogicRules().indirect_file_access ?? {};
|
package/dist/server.js
CHANGED
|
@@ -1870,6 +1870,10 @@ function checkReadBeforeWrite(actionType, actionDetail, actionHistory, reason, c
|
|
|
1870
1870
|
}
|
|
1871
1871
|
return null;
|
|
1872
1872
|
}
|
|
1873
|
+
function isAskUserAction(actionType) {
|
|
1874
|
+
if (ASK_USER_ACTION_TYPES.includes(actionType)) return true;
|
|
1875
|
+
return actionType.endsWith("-askuser");
|
|
1876
|
+
}
|
|
1873
1877
|
function consentWithinTtl(asked, aNext) {
|
|
1874
1878
|
const raw = String(process.env.AGENT_MOSS_CONSENT_TTL_SECONDS || "").trim();
|
|
1875
1879
|
const parsed = raw ? Number(raw) : CONSENT_TTL_SECONDS;
|
|
@@ -1888,7 +1892,7 @@ function hasValidConsent(actionHistory, aNext) {
|
|
|
1888
1892
|
const tail = actionHistory.slice(-CONSENT_MAX_DISTANCE);
|
|
1889
1893
|
for (let i = tail.length - 1; i >= 0; i--) {
|
|
1890
1894
|
const h = tail[i];
|
|
1891
|
-
if (String(h.actionType || "").toLowerCase()
|
|
1895
|
+
if (!isAskUserAction(String(h.actionType || "").toLowerCase())) continue;
|
|
1892
1896
|
const output = String(h.output || "").trim();
|
|
1893
1897
|
if (!output) return false;
|
|
1894
1898
|
const question = String(h.actionDetail || "");
|
|
@@ -1900,7 +1904,7 @@ function hasValidConsent(actionHistory, aNext) {
|
|
|
1900
1904
|
return false;
|
|
1901
1905
|
}
|
|
1902
1906
|
function checkPasswordConsent(actionType, actionDetail, actionHistory, osType, aNext) {
|
|
1903
|
-
if (actionType
|
|
1907
|
+
if (!BASH_LIKE_ACTION_TYPES.includes(actionType)) return null;
|
|
1904
1908
|
const pwdPatterns = runtimeConfigBridge.current?.effectivePasswordPatterns(osType) ?? PASSWORD_MODIFY_PATTERNS;
|
|
1905
1909
|
const isPasswordModify = pwdPatterns.some((p) => p.test(actionDetail));
|
|
1906
1910
|
if (!isPasswordModify) return null;
|
|
@@ -1916,7 +1920,7 @@ function checkPasswordConsent(actionType, actionDetail, actionHistory, osType, a
|
|
|
1916
1920
|
};
|
|
1917
1921
|
}
|
|
1918
1922
|
function checkUserDeletionConsent(actionType, actionDetail, actionHistory, osType, aNext) {
|
|
1919
|
-
if (actionType
|
|
1923
|
+
if (!BASH_LIKE_ACTION_TYPES.includes(actionType)) return null;
|
|
1920
1924
|
const udPatterns = runtimeConfigBridge.current?.effectiveUserDeletionPatterns(osType) ?? USER_DELETION_PATTERNS;
|
|
1921
1925
|
const isUserDeletion = udPatterns.some((p) => p.test(actionDetail));
|
|
1922
1926
|
if (!isUserDeletion) return null;
|
|
@@ -2022,7 +2026,7 @@ function checkIndirectFileAccess(actionType, actionDetail, cwd, osType) {
|
|
|
2022
2026
|
violatedLayers: ["L2.1"]
|
|
2023
2027
|
};
|
|
2024
2028
|
}
|
|
2025
|
-
var _LOGIC, _HEURISTIC, EXCLUDED_PREFIXES, TEMP_DIRS, ROOT_SENSITIVE_PATHS, HOME_SENSITIVE_PATHS, CREDENTIAL_PATHS, ROOT_SENSITIVE_PATHS_WINDOWS, HOME_SENSITIVE_PATHS_WINDOWS, CREDENTIAL_PATHS_WINDOWS, ROOT_SENSITIVE_PATHS_MACOS, HOME_SENSITIVE_PATHS_MACOS, CREDENTIAL_PATHS_MACOS, ROOT_SENSITIVE_PATHS_HARMONY, HOME_SENSITIVE_PATHS_HARMONY, CREDENTIAL_PATHS_HARMONY, _scopeIndex, NON_WRITE_TOOLS, NON_WRITE_TOOL_PREFIXES, PSEUDO_FS_PREFIXES, WRITE_KEYWORDS, SED_INPLACE_RE, DEVNULL_REDIRECT_RE, CREATE_KEYWORDS, PASSWORD_MODIFY_PATTERNS, USER_DELETION_PATTERNS, INTENT_DEVIATION_PATTERNS, COMBO_STAGES, COMBO_CHAINS, CONSENT_TOPIC, CONSENT_NEGATIVE, CONSENT_AFFIRMATIVE, CONSENT_INPUT_REQUEST, CONSENT_MAX_DISTANCE, CONSENT_TTL_SECONDS, INLINE_SCRIPT_RE, DIR_TRAVERSAL_KW, _IFA, IFA_READ_KEYWORDS, IFA_WRITE_KEYWORDS, IFA_EXEC_KEYWORDS, IFA_OPEN_KEYWORDS;
|
|
2029
|
+
var _LOGIC, _HEURISTIC, EXCLUDED_PREFIXES, TEMP_DIRS, ROOT_SENSITIVE_PATHS, HOME_SENSITIVE_PATHS, CREDENTIAL_PATHS, ROOT_SENSITIVE_PATHS_WINDOWS, HOME_SENSITIVE_PATHS_WINDOWS, CREDENTIAL_PATHS_WINDOWS, ROOT_SENSITIVE_PATHS_MACOS, HOME_SENSITIVE_PATHS_MACOS, CREDENTIAL_PATHS_MACOS, ROOT_SENSITIVE_PATHS_HARMONY, HOME_SENSITIVE_PATHS_HARMONY, CREDENTIAL_PATHS_HARMONY, _scopeIndex, NON_WRITE_TOOLS, NON_WRITE_TOOL_PREFIXES, PSEUDO_FS_PREFIXES, WRITE_KEYWORDS, SED_INPLACE_RE, DEVNULL_REDIRECT_RE, CREATE_KEYWORDS, PASSWORD_MODIFY_PATTERNS, USER_DELETION_PATTERNS, INTENT_DEVIATION_PATTERNS, COMBO_STAGES, COMBO_CHAINS, CONSENT_TOPIC, CONSENT_NEGATIVE, CONSENT_AFFIRMATIVE, CONSENT_INPUT_REQUEST, CONSENT_MAX_DISTANCE, CONSENT_TTL_SECONDS, BASH_LIKE_ACTION_TYPES, ASK_USER_ACTION_TYPES, INLINE_SCRIPT_RE, DIR_TRAVERSAL_KW, _IFA, IFA_READ_KEYWORDS, IFA_WRITE_KEYWORDS, IFA_EXEC_KEYWORDS, IFA_OPEN_KEYWORDS;
|
|
2026
2030
|
var init_logic_rules = __esm({
|
|
2027
2031
|
"src/engine/logic-rules.ts"() {
|
|
2028
2032
|
"use strict";
|
|
@@ -2115,6 +2119,8 @@ var init_logic_rules = __esm({
|
|
|
2115
2119
|
CONSENT_INPUT_REQUEST = /(?:请|输入|提供|填写|给出|告诉我).{0,8}(?:新的?)?(?:密码|口令|passwd|password)/i;
|
|
2116
2120
|
CONSENT_MAX_DISTANCE = 5;
|
|
2117
2121
|
CONSENT_TTL_SECONDS = 300;
|
|
2122
|
+
BASH_LIKE_ACTION_TYPES = ["bash", "executebash", "terminal-executebash"];
|
|
2123
|
+
ASK_USER_ACTION_TYPES = ["ask_user_question", "askuser"];
|
|
2118
2124
|
INLINE_SCRIPT_RE = /(?:^|\s)(?:python|python3|python3\.\d+|perl|perl5|ruby|jruby|mruby|node|php|lua)\s+(?:-[a-zA-Z]*[cer][a-zA-Z]*\s+)/i;
|
|
2119
2125
|
DIR_TRAVERSAL_KW = loadInline().dir_traversal_keywords ?? [];
|
|
2120
2126
|
_IFA = loadLogicRules().indirect_file_access ?? {};
|