Add files via upload

This commit is contained in:
公明
2026-07-08 10:55:34 +08:00
committed by GitHub
parent 89264c9c1a
commit b4b21f57fe
29 changed files with 415 additions and 83 deletions
@@ -0,0 +1,210 @@
package burp;
import javax.swing.*;
import java.awt.*;
import java.util.List;
/**
* Per-request send dialog: project, role, agent mode, and custom instruction.
*/
final class SendOptionsDialog {
private SendOptionsDialog() {}
static final class Result {
final String instruction;
final String projectId;
final String role;
final CyberStrikeAIClient.AgentMode agentMode;
Result(String instruction, String projectId, String role, CyberStrikeAIClient.AgentMode agentMode) {
this.instruction = instruction;
this.projectId = projectId == null ? "" : projectId;
this.role = role == null ? "" : role;
this.agentMode = agentMode;
}
}
private static String lastProjectId = "";
private static String lastRole = "";
private static CyberStrikeAIClient.AgentMode lastAgentMode = null;
static Result show(
Component parent,
CyberStrikeAIClient client,
CyberStrikeAIClient.Config cfg,
String token,
String defaultInstruction
) {
CyberStrikeAIClient.AgentMode defaultMode = lastAgentMode != null
? lastAgentMode
: CyberStrikeAIClient.AgentMode.EINO_SINGLE;
JPanel panel = new JPanel(new BorderLayout(0, 10));
panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4));
JPanel selectors = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.insets = new Insets(4, 6, 4, 6);
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weighty = 0;
JComboBox<CyberStrikeAIClient.ProjectOption> projectBox = new JComboBox<>();
projectBox.addItem(new CyberStrikeAIClient.ProjectOption("", "加载中..."));
projectBox.setEnabled(false);
JComboBox<CyberStrikeAIClient.RoleOption> roleBox = new JComboBox<>();
roleBox.addItem(new CyberStrikeAIClient.RoleOption("", "加载中..."));
roleBox.setEnabled(false);
JComboBox<CyberStrikeAIClient.AgentMode> agentBox = new JComboBox<>(CyberStrikeAIClient.AgentMode.values());
agentBox.setSelectedItem(defaultMode);
agentBox.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof CyberStrikeAIClient.AgentMode) {
setText(((CyberStrikeAIClient.AgentMode) value).displayName);
}
return this;
}
});
// Row 0: labels — 项目 | 角色 | 对话
gc.gridy = 0;
gc.weightx = 1.0;
gc.gridx = 0;
selectors.add(new JLabel("项目"), gc);
gc.gridx = 1;
selectors.add(new JLabel("角色"), gc);
gc.gridx = 2;
selectors.add(new JLabel("对话"), gc);
// Row 1: dropdowns
gc.gridy = 1;
gc.gridx = 0;
selectors.add(projectBox, gc);
gc.gridx = 1;
selectors.add(roleBox, gc);
gc.gridx = 2;
selectors.add(agentBox, gc);
JTextArea editor = new JTextArea(
defaultInstruction == null || defaultInstruction.trim().isEmpty()
? HttpMessageFormatter.defaultInstruction()
: defaultInstruction,
7,
70
);
editor.setLineWrap(true);
editor.setWrapStyleWord(true);
editor.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 13));
JPanel instructionPanel = new JPanel(new BorderLayout(0, 6));
instructionPanel.add(new JLabel("测试指令(可针对当前流量修改):"), BorderLayout.NORTH);
instructionPanel.add(new JScrollPane(editor), BorderLayout.CENTER);
panel.add(selectors, BorderLayout.NORTH);
panel.add(instructionPanel, BorderLayout.CENTER);
Thread loader = new Thread(() -> {
try {
List<CyberStrikeAIClient.ProjectOption> projects = client.fetchProjects(cfg, token);
List<CyberStrikeAIClient.RoleOption> roles = client.fetchRoles(cfg, token);
SwingUtilities.invokeLater(() -> populateProjects(projectBox, projects, lastProjectId));
SwingUtilities.invokeLater(() -> populateRoles(roleBox, roles, lastRole));
} catch (Exception ex) {
SwingUtilities.invokeLater(() -> {
projectBox.removeAllItems();
projectBox.addItem(new CyberStrikeAIClient.ProjectOption("", "(加载失败)"));
projectBox.setEnabled(true);
roleBox.removeAllItems();
roleBox.addItem(new CyberStrikeAIClient.RoleOption("", "默认"));
roleBox.setEnabled(true);
JOptionPane.showMessageDialog(parent,
"加载项目/角色失败: " + ex.getMessage(),
"CyberStrikeAI", JOptionPane.WARNING_MESSAGE);
});
}
}, "CyberStrikeAI-LoadCatalog");
loader.start();
int result = JOptionPane.showConfirmDialog(
parent,
panel,
"发送到 CyberStrikeAI",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE
);
if (result != JOptionPane.OK_OPTION) {
return null;
}
CyberStrikeAIClient.ProjectOption project = (CyberStrikeAIClient.ProjectOption) projectBox.getSelectedItem();
CyberStrikeAIClient.RoleOption role = (CyberStrikeAIClient.RoleOption) roleBox.getSelectedItem();
CyberStrikeAIClient.AgentMode agentMode = (CyberStrikeAIClient.AgentMode) agentBox.getSelectedItem();
if (agentMode == null) {
agentMode = defaultMode;
}
String instruction = editor.getText();
if (instruction == null || instruction.trim().isEmpty()) {
instruction = HttpMessageFormatter.defaultInstruction();
} else {
instruction = instruction.trim();
}
lastProjectId = project != null ? project.id : "";
lastRole = role != null ? role.name : "";
lastAgentMode = agentMode;
return new Result(instruction, lastProjectId, lastRole, agentMode);
}
private static void populateProjects(JComboBox<CyberStrikeAIClient.ProjectOption> box,
List<CyberStrikeAIClient.ProjectOption> items,
String selectId) {
box.removeAllItems();
for (CyberStrikeAIClient.ProjectOption item : items) {
box.addItem(item);
}
selectComboById(box, selectId);
box.setEnabled(true);
}
private static void populateRoles(JComboBox<CyberStrikeAIClient.RoleOption> box,
List<CyberStrikeAIClient.RoleOption> items,
String selectName) {
box.removeAllItems();
for (CyberStrikeAIClient.RoleOption item : items) {
box.addItem(item);
}
selectComboByName(box, selectName);
box.setEnabled(true);
}
private static void selectComboById(JComboBox<CyberStrikeAIClient.ProjectOption> box, String id) {
if (id == null) id = "";
for (int i = 0; i < box.getItemCount(); i++) {
CyberStrikeAIClient.ProjectOption item = box.getItemAt(i);
if (item != null && id.equals(item.id)) {
box.setSelectedIndex(i);
return;
}
}
box.setSelectedIndex(0);
}
private static void selectComboByName(JComboBox<CyberStrikeAIClient.RoleOption> box, String name) {
if (name == null) name = "";
for (int i = 0; i < box.getItemCount(); i++) {
CyberStrikeAIClient.RoleOption item = box.getItemAt(i);
if (item != null && name.equals(item.name)) {
box.setSelectedIndex(i);
return;
}
}
box.setSelectedIndex(0);
}
}