mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-15 20:08:18 +08:00
fix(security): require tool guard rule id (#88)
This commit is contained in:
parent
f7c1af80a4
commit
4567bd6019
@ -64,6 +64,10 @@ public class ToolGuardRuleService {
|
|||||||
* 新增自定义规则
|
* 新增自定义规则
|
||||||
*/
|
*/
|
||||||
public ToolGuardRuleEntity createRule(ToolGuardRuleEntity rule) {
|
public ToolGuardRuleEntity createRule(ToolGuardRuleEntity rule) {
|
||||||
|
if (rule == null || rule.getRuleId() == null || rule.getRuleId().isBlank()) {
|
||||||
|
throw new IllegalArgumentException("Rule ID is required");
|
||||||
|
}
|
||||||
|
rule.setRuleId(rule.getRuleId().trim());
|
||||||
rule.setBuiltin(false);
|
rule.setBuiltin(false);
|
||||||
ruleMapper.insert(rule);
|
ruleMapper.insert(rule);
|
||||||
ruleRegistry.reload();
|
ruleRegistry.reload();
|
||||||
|
|||||||
@ -1340,6 +1340,10 @@ export default {
|
|||||||
remediation: 'Remediation',
|
remediation: 'Remediation',
|
||||||
priority: 'Priority',
|
priority: 'Priority',
|
||||||
},
|
},
|
||||||
|
messages: {
|
||||||
|
ruleIdRequired: 'Rule ID is required',
|
||||||
|
saveFailed: 'Failed to save rule',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
fileGuard: {
|
fileGuard: {
|
||||||
title: 'File Guard',
|
title: 'File Guard',
|
||||||
|
|||||||
@ -1238,6 +1238,10 @@ export default {
|
|||||||
remediation: '修复建议',
|
remediation: '修复建议',
|
||||||
priority: '优先级',
|
priority: '优先级',
|
||||||
},
|
},
|
||||||
|
messages: {
|
||||||
|
ruleIdRequired: '规则 ID 不能为空',
|
||||||
|
saveFailed: '保存规则失败',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
fileGuard: {
|
fileGuard: {
|
||||||
title: '文件防护',
|
title: '文件防护',
|
||||||
|
|||||||
@ -146,8 +146,13 @@
|
|||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="form-grid">
|
<div class="form-grid">
|
||||||
<div class="form-group" v-if="!editingRule">
|
<div class="form-group" v-if="!editingRule">
|
||||||
<label>{{ t('security.toolGuard.fields.ruleId') }}</label>
|
<label>{{ t('security.toolGuard.fields.ruleId') }} <span class="required">*</span></label>
|
||||||
<input v-model="ruleForm.ruleId" class="form-input" placeholder="CUSTOM_RULE_001" />
|
<input
|
||||||
|
v-model.trim="ruleForm.ruleId"
|
||||||
|
class="form-input"
|
||||||
|
placeholder="CUSTOM_RULE_001"
|
||||||
|
required
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>{{ t('security.toolGuard.fields.name') }}</label>
|
<label>{{ t('security.toolGuard.fields.name') }}</label>
|
||||||
@ -215,6 +220,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue'
|
import { ref, reactive, onMounted } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
import { securityApi } from '@/api'
|
import { securityApi } from '@/api'
|
||||||
import { parseJsonArray } from '../composables/helpers'
|
import { parseJsonArray } from '../composables/helpers'
|
||||||
import type { GuardRule } from '@/types'
|
import type { GuardRule } from '@/types'
|
||||||
@ -350,6 +356,11 @@ function openEditRuleModal(rule: GuardRule) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function saveRule() {
|
async function saveRule() {
|
||||||
|
if (!editingRule.value && !ruleForm.ruleId.trim()) {
|
||||||
|
ElMessage.error(t('security.toolGuard.messages.ruleIdRequired'))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (editingRule.value) {
|
if (editingRule.value) {
|
||||||
await securityApi.updateRule(editingRule.value.ruleId, ruleForm)
|
await securityApi.updateRule(editingRule.value.ruleId, ruleForm)
|
||||||
@ -358,8 +369,8 @@ async function saveRule() {
|
|||||||
}
|
}
|
||||||
showRuleModal.value = false
|
showRuleModal.value = false
|
||||||
loadRules()
|
loadRules()
|
||||||
} catch {
|
} catch (e: any) {
|
||||||
// ignore
|
ElMessage.error(e?.msg || e?.message || t('security.toolGuard.messages.saveFailed'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,6 +409,7 @@ onMounted(async () => {
|
|||||||
.subsection-title { font-size: 16px; font-weight: 600; color: var(--mc-text-primary); margin: 0 0 12px; }
|
.subsection-title { font-size: 16px; font-weight: 600; color: var(--mc-text-primary); margin: 0 0 12px; }
|
||||||
|
|
||||||
.rule-name { font-weight: 500; }
|
.rule-name { font-weight: 500; }
|
||||||
|
.required { color: var(--mc-danger, #ef4444); }
|
||||||
.rule-pattern {
|
.rule-pattern {
|
||||||
font-family: 'SF Mono', 'Fira Code', monospace;
|
font-family: 'SF Mono', 'Fira Code', monospace;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user