Skip to content

Commit 84f6795

Browse files
authored
Merge pull request #122 from ipa-lab/adapt_prompt_engineer
Adapt prompt engineer
2 parents 8d8a72c + aecb0be commit 84f6795

31 files changed

+312
-150
lines changed

src/hackingBuddyGPT/usecases/web_api_testing/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22
from .simple_web_api_testing import SimpleWebAPITesting
33
from . import response_processing
44
from . import documentation
5-
from . import prompt_generation
65
from . import testing

src/hackingBuddyGPT/usecases/web_api_testing/documentation/openapi_specification_handler.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import yaml
66
from hackingBuddyGPT.capabilities.yamlFile import YAMLFile
77
from hackingBuddyGPT.usecases.web_api_testing.documentation.pattern_matcher import PatternMatcher
8-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information import PromptStrategy
8+
from hackingBuddyGPT.utils.prompt_generation.information import PromptStrategy
99
from hackingBuddyGPT.usecases.web_api_testing.response_processing import ResponseHandler
1010
from hackingBuddyGPT.usecases.web_api_testing.utils import LLMHandler
1111

@@ -42,7 +42,8 @@ def __init__(self, llm_handler: LLMHandler, response_handler: ResponseHandler, s
4242
self.query_params = {}
4343
self.endpoint_methods = {}
4444
self.endpoint_examples = {}
45-
self.filename = f"{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.yaml"
45+
date = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
46+
self.filename = f"{name}_spec.yaml"
4647
self.openapi_spec = {
4748
"openapi": "3.0.0",
4849
"info": {
@@ -57,7 +58,7 @@ def __init__(self, llm_handler: LLMHandler, response_handler: ResponseHandler, s
5758
self.llm_handler = llm_handler
5859
current_path = os.path.dirname(os.path.abspath(__file__))
5960

60-
self.file_path = os.path.join(current_path, "openapi_spec", str(strategy).split(".")[1].lower(), name.lower())
61+
self.file_path = os.path.join(current_path, "openapi_spec", str(strategy).split(".")[1].lower(), name.lower(), date)
6162
os.makedirs(self.file_path, exist_ok=True)
6263
self.file = os.path.join(self.file_path, self.filename)
6364

src/hackingBuddyGPT/usecases/web_api_testing/response_processing/response_analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import re
33
from typing import Any, Dict, Optional, Tuple
44

5-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information.prompt_information import PromptPurpose
5+
from hackingBuddyGPT.utils.prompt_generation.information import PromptPurpose
66

77

88
class ResponseAnalyzer:

src/hackingBuddyGPT/usecases/web_api_testing/response_processing/response_analyzer_with_llm.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import json
22
import re
3-
from typing import Any, Dict, Tuple, List
3+
from typing import Any, Dict
44
from unittest.mock import MagicMock
55

66
from hackingBuddyGPT.capabilities.http_request import HTTPRequest
7-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information import (
7+
from hackingBuddyGPT.utils.prompt_generation.information import (
88
PenTestingInformation,
99
)
10-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information.prompt_information import (
10+
from hackingBuddyGPT.utils.prompt_generation.information import (
1111
PromptPurpose,
1212
)
1313
from hackingBuddyGPT.usecases.web_api_testing.utils import LLMHandler

src/hackingBuddyGPT/usecases/web_api_testing/response_processing/response_handler.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import copy
22
import json
3-
import os.path
43
import re
54
from collections import Counter
65
from itertools import cycle
@@ -12,9 +11,9 @@
1211
from rich.panel import Panel
1312

1413
from hackingBuddyGPT.usecases.web_api_testing.documentation.pattern_matcher import PatternMatcher
15-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation import PromptGenerationHelper
16-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information import PromptContext
17-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information.pentesting_information import (
14+
from hackingBuddyGPT.utils.prompt_generation import PromptGenerationHelper
15+
from hackingBuddyGPT.utils.prompt_generation.information import PromptContext
16+
from hackingBuddyGPT.utils.prompt_generation.information import (
1817
PenTestingInformation,
1918
)
2019
from hackingBuddyGPT.usecases.web_api_testing.response_processing.response_analyzer_with_llm import (
@@ -510,6 +509,8 @@ def handle_http_response(self, response: Any, prompt_history: Any, log: Any, com
510509
self.last_path = request_path
511510

512511
status_message = self.check_if_successful(is_successful, request_path, result_dict, result_str, categorized_endpoints)
512+
log.console.print(Panel(status_message, title="system"))
513+
513514
prompt_history.append(tool_message(status_message, tool_call_id))
514515

515516
else:
@@ -777,9 +778,6 @@ def update_step_and_category():
777778
elif self.prompt_helper.current_step == 7 and not self.prompt_helper._get_root_level_endpoints(self.name):
778779
update_step_and_category()
779780

780-
import random
781-
from urllib.parse import urlencode
782-
783781
def create_common_query_for_endpoint(self, endpoint):
784782
"""
785783
Constructs complete URLs with one query parameter for each API endpoint.
@@ -948,6 +946,8 @@ def check_if_successful(self, is_successful, request_path, result_dict, result_s
948946
error_msg = result_dict.get("error", {}).get("message", "unknown error") if isinstance(
949947
result_dict.get("error", {}), dict) else result_dict.get("error", "unknown error")
950948
self.no_new_endpoint_counter +=1
949+
if error_msg == "unknown error" and (result_str.startswith("4") or result_str.startswith("5")):
950+
error_msg = result_str
951951

952952
if result_str.startswith("400") or result_str.startswith("401") or result_str.startswith("403"):
953953
status_message = f"{request_path} is a correct endpoint, but encountered an error: {error_msg}"
@@ -960,7 +960,6 @@ def check_if_successful(self, is_successful, request_path, result_dict, result_s
960960
if error_msg not in self.prompt_helper.correct_endpoint_but_some_error:
961961
self.prompt_helper.correct_endpoint_but_some_error[error_msg] = []
962962
self.prompt_helper.correct_endpoint_but_some_error[error_msg].append(request_path)
963-
self.prompt_helper.hint_for_next_round = error_msg
964963
else:
965964
self.prompt_helper.unsuccessful_paths.append(request_path)
966965
status_message = f"{request_path} is not a correct endpoint; Reason: {error_msg}"

src/hackingBuddyGPT/usecases/web_api_testing/simple_openapi_documentation.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22
from dataclasses import field
33
from typing import Dict
44

5+
from rich.panel import Panel
6+
57
from hackingBuddyGPT.capabilities import Capability
68
from hackingBuddyGPT.capabilities.http_request import HTTPRequest
79
from hackingBuddyGPT.capabilities.record_note import RecordNote
810
from hackingBuddyGPT.usecases.agents import Agent
911
from hackingBuddyGPT.usecases.base import AutonomousAgentUseCase, use_case
1012
from hackingBuddyGPT.usecases.web_api_testing.documentation.openapi_specification_handler import \
1113
OpenAPISpecificationHandler
12-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation import PromptGenerationHelper
13-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information.prompt_information import PromptContext
14-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.prompt_engineer import PromptEngineer
14+
from hackingBuddyGPT.utils.prompt_generation import PromptGenerationHelper
15+
from hackingBuddyGPT.utils.prompt_generation.information import PromptContext
16+
from hackingBuddyGPT.utils.prompt_generation.prompt_engineer import PromptEngineer
1517
from hackingBuddyGPT.usecases.web_api_testing.response_processing.response_handler import ResponseHandler
1618
from hackingBuddyGPT.usecases.web_api_testing.utils import LLMHandler
1719
from hackingBuddyGPT.usecases.web_api_testing.utils.configuration_handler import ConfigurationHandler
@@ -54,6 +56,11 @@ class SimpleWebAPIDocumentation(Agent):
5456
default="",
5557
)
5658

59+
prompt_file: str = parameter(
60+
desc="prompt file name",
61+
default="",
62+
)
63+
5764

5865
_http_method_description: str = parameter(
5966
desc="Pattern description for expected HTTP methods in the API response",
@@ -155,10 +162,11 @@ def _initialize_handlers(self, config, description, token, name, initial_prompt)
155162

156163
self._prompt_engineer = PromptEngineer(
157164
strategy=self.strategy,
158-
context=self._prompt_context,
165+
context=PromptContext.DOCUMENTATION,
159166
prompt_helper=self.prompt_helper,
160167
open_api_spec=self._documentation_handler.openapi_spec,
161-
rest_api_info=(token, self.host, self._correct_endpoints, self.categorized_endpoints)
168+
rest_api_info=(token, self.host, self._correct_endpoints, self.categorized_endpoints),
169+
prompt_file=self.prompt_file
162170
)
163171
self._evaluator = Evaluator(config=config)
164172

@@ -376,6 +384,8 @@ def run_documentation(self, turn: int, move_type: str) -> None:
376384
prompt = self._prompt_engineer.generate_prompt(turn=turn, move_type=move_type,
377385
prompt_history=self._prompt_history)
378386
response, completion = self._llm_handler.execute_prompt_with_specific_capability(prompt,"http_request" )
387+
self.log.console.print(Panel(prompt[-1]["content"], title="system"))
388+
379389
is_good, self._prompt_history, result, result_str = self._response_handler.handle_response(response,
380390
completion,
381391
self._prompt_history,

src/hackingBuddyGPT/usecases/web_api_testing/simple_web_api_testing.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
from hackingBuddyGPT.capabilities.record_note import RecordNote
1616
from hackingBuddyGPT.usecases.agents import Agent
1717
from hackingBuddyGPT.usecases.base import AutonomousAgentUseCase, use_case
18-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation import PromptGenerationHelper
19-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information import PenTestingInformation
20-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information.prompt_information import PromptContext, \
21-
PromptPurpose
18+
from hackingBuddyGPT.utils.prompt_generation import PromptGenerationHelper
19+
from hackingBuddyGPT.utils.prompt_generation.information import PenTestingInformation
20+
from hackingBuddyGPT.utils.prompt_generation.information import PromptPurpose
2221
from hackingBuddyGPT.usecases.web_api_testing.documentation.parsing import OpenAPISpecificationParser
2322
from hackingBuddyGPT.usecases.web_api_testing.documentation.report_handler import ReportHandler
24-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information.prompt_information import PromptContext
25-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.prompt_engineer import PromptEngineer, PromptStrategy
23+
from hackingBuddyGPT.utils.prompt_generation.information import PromptContext
24+
from hackingBuddyGPT.utils.prompt_generation.prompt_engineer import PromptEngineer
2625
from hackingBuddyGPT.usecases.web_api_testing.response_processing.response_analyzer_with_llm import \
2726
ResponseAnalyzerWithLLM
2827
from hackingBuddyGPT.usecases.web_api_testing.response_processing.response_handler import ResponseHandler

src/hackingBuddyGPT/usecases/web_api_testing/utils/configuration_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
import os
33

4-
from hackingBuddyGPT.usecases.web_api_testing.prompt_generation.information import PromptStrategy, PromptContext
4+
from hackingBuddyGPT.utils.prompt_generation.information import PromptStrategy
55

66

77
class ConfigurationHandler(object):

0 commit comments

Comments
 (0)