Skip to content

Commit 50223b4

Browse files
authored
Merge pull request #56 from yashviagrawal/develop
DAST
2 parents 6df9536 + 302f362 commit 50223b4

14 files changed

+1036
-83
lines changed

appknox/analyses.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ type Finding struct {
122122
// AnalysisListOptions specifies the optional parameters to the
123123
// AnalysesService.List method.
124124
type AnalysisListOptions struct {
125+
VulnerabilityType int `url:"vulnerability_type,omitempty"`
125126
ListOptions
126127
}
127128

appknox/appknox.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ type Client struct {
6767

6868
// Reports service is used to interact with appknox reports api.
6969
Reports *ReportsService
70+
71+
// Dynamic Scan service is used to interact with appknox DAST related APIs
72+
DynamicScans *DynamicScanService
7073
}
7174

7275
// NewClient returns a new appknox API client.
@@ -102,6 +105,7 @@ func NewClient(accessToken string) (*Client, error) {
102105
c.OWASP = (*OWASPService)(&c.common)
103106
c.Organizations = (*OrganizationsService)(&c.common)
104107
c.Reports = (*ReportsService)(&c.common)
108+
c.DynamicScans = (*DynamicScanService)(&c.common)
105109
return c, nil
106110
}
107111

appknox/dynamic_scans.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package appknox
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
"time"
8+
9+
"github.com/appknox/appknox-go/appknox/enums"
10+
)
11+
12+
// DynamicScanService handles communication with the DAST related methods
13+
type DynamicScanService service
14+
15+
// DRFResponseDynamicScan represents the DRF response for the Appknox dynamic scan API.
16+
type DRFResponseDynamicScan struct {
17+
Count int `json:"count,omitempty"`
18+
Next string `json:"next,omitempty"`
19+
Previous string `json:"previous,omitempty"`
20+
Results []*DynamicScan `json:"results"`
21+
}
22+
23+
// DynamicScanResponse is a wrapper around DRFResponseDynamicScan
24+
// that can help with further pagination if needed.
25+
type DynamicScanResponse struct {
26+
r *DRFResponseDynamicScan
27+
s *DynamicScanService
28+
c *context.Context
29+
}
30+
31+
// DynamicScanListOptions is similar to AnalysisListOptions,
32+
// letting us specify limit, offset, etc.
33+
type DynamicScanListOptions struct {
34+
ListOptions // from appknox.go
35+
}
36+
37+
// DynamicScan represents a single dynamic scan object (DAST) in Appknox.
38+
type DynamicScan struct {
39+
ID int `json:"id,omitempty"`
40+
File int `json:"file,omitempty"`
41+
PackageName string `json:"package_name,omitempty"`
42+
Mode enums.DynamicScanModeType `json:"mode,omitempty"`
43+
ModeDisplay string `json:"mode_display,omitempty"`
44+
Status enums.DynamicScanStatusType `json:"status,omitempty"`
45+
StatusDisplay string `json:"status_display,omitempty"`
46+
MoriartyDynamicScanRequestID string `json:"moriarty_dynamicscanrequest_id,omitempty"`
47+
EnableAPICapture bool `json:"enable_api_capture,omitempty"`
48+
MoriartyDynamicScanID string `json:"moriarty_dynamicscan_id,omitempty"`
49+
MoriartyDynamicScanToken string `json:"moriarty_dynamicscan_token,omitempty"`
50+
StartedByUser int `json:"started_by_user,omitempty"`
51+
StoppedByUser int `json:"stopped_by_user,omitempty"`
52+
DeviceUsed map[string]interface{} `json:"device_used,omitempty"`
53+
DevicePreference map[string]interface{} `json:"device_preference,omitempty"`
54+
ErrorCode string `json:"error_code,omitempty"`
55+
ErrorMessage string `json:"error_message,omitempty"`
56+
CreatedOn *time.Time `json:"created_on,omitempty"`
57+
UpdatedOn *time.Time `json:"updated_on,omitempty"`
58+
EndedOn *time.Time `json:"ended_on,omitempty"`
59+
AutoShutDownOn *time.Time `json:"auto_shutdown_on,omitempty"`
60+
IsAnalysisDone bool `json:"is_analysis_done,omitempty"`
61+
}
62+
63+
// ListByFile lists the dynamic scans for a given file ID.
64+
func (s *DynamicScanService) ListByFile(
65+
ctx context.Context,
66+
fileID int,
67+
opt *DynamicScanListOptions,
68+
) ([]*DynamicScan, *DynamicScanResponse, error) {
69+
70+
// Base endpoint: e.g. "api/v2/files/123/dynamicscans"
71+
baseEndpoint := fmt.Sprintf("api/v2/files/%v/dynamicscans", fileID)
72+
73+
// If user wants limit=1 (or any other limit), we apply it here
74+
finalURL, err := addOptions(baseEndpoint, opt)
75+
if err != nil {
76+
return nil, nil, err
77+
}
78+
79+
req, err := s.client.NewRequest(http.MethodGet, finalURL, nil)
80+
if err != nil {
81+
return nil, nil, err
82+
}
83+
84+
var drfResponse DRFResponseDynamicScan
85+
_, err = s.client.Do(ctx, req, &drfResponse)
86+
if err != nil {
87+
return nil, nil, err
88+
}
89+
resp := DynamicScanResponse{
90+
r: &drfResponse,
91+
s: s,
92+
c: &ctx,
93+
}
94+
return drfResponse.Results, &resp, nil
95+
}
96+
97+
// ScheduleDastAutomation sends a POST request to schedule a DAST automation
98+
// for the specified file ID.
99+
func (s *DynamicScanService) ScheduleDastAutomation(ctx context.Context, fileID int, mode int,) (*Response, error) {
100+
101+
// The payload for the POST
102+
payload := struct {
103+
Mode int `json:"mode"`
104+
}{
105+
Mode: mode,
106+
}
107+
108+
// POST /api/v2/files/<file_id>/dynamicscans
109+
endpoint := fmt.Sprintf("api/v2/files/%d/dynamicscans", fileID)
110+
111+
req, err := s.client.NewRequest(http.MethodPost, endpoint, payload)
112+
if err != nil {
113+
return nil, err
114+
}
115+
116+
resp, err := s.client.Do(ctx, req, nil)
117+
if err != nil {
118+
return nil, err
119+
}
120+
return resp, nil
121+
}

appknox/enums/dynamicScanMode.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package enums
2+
3+
// DynamicScanModeType represents the mode in which a dynamic scan can run.
4+
type DynamicScanModeType int
5+
6+
const (
7+
dynamicScanModeManual DynamicScanModeType = 0
8+
dynamicScanModeAutomated DynamicScanModeType = 1
9+
)
10+
11+
// dynamicScanModeStruct holds references to each dynamic scan mode
12+
// and a map from code => human-readable string.
13+
type dynamicScanModeStruct struct {
14+
Manual DynamicScanModeType
15+
Automated DynamicScanModeType
16+
mappingHumanize map[DynamicScanModeType]string
17+
}
18+
19+
// DynamicScanMode provides the enumerations and the human-readable strings
20+
// for Appknox dynamic scan modes (manual or automated).
21+
var DynamicScanMode = dynamicScanModeStruct{
22+
Manual: dynamicScanModeManual,
23+
Automated: dynamicScanModeAutomated,
24+
mappingHumanize: map[DynamicScanModeType]string{
25+
dynamicScanModeManual: "Manual",
26+
dynamicScanModeAutomated: "Automated",
27+
},
28+
}
29+
30+
// String returns the human-readable name for a given DynamicScanModeType.
31+
func (d DynamicScanModeType) String() string {
32+
return DynamicScanMode.mappingHumanize[d]
33+
}

appknox/enums/dynamicScanState.go

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,59 @@ package enums
44
type DynamicScanStateType int
55

66
const (
7-
dynamicScanStateUnknown DynamicScanStateType = -1
7+
dynamicScanStateError DynamicScanStateType = -1
88
dynamicScanStateNone DynamicScanStateType = 0
9-
dynamicScanStateBooting DynamicScanStateType = 1
10-
dynamicScanStateReady DynamicScanStateType = 2
11-
dynamicScanStateShuttingDown DynamicScanStateType = 3
12-
dynamicScanStateDownloading DynamicScanStateType = 4
13-
dynamicScanStateInstalling DynamicScanStateType = 5
14-
dynamicScanStateLaunching DynamicScanStateType = 6
15-
dynamicScanStateHooking DynamicScanStateType = 7
9+
dynamicScanStateInQueue DynamicScanStateType = 1
10+
dynamicScanStateBooting DynamicScanStateType = 2
11+
dynamicScanStateDownloading DynamicScanStateType = 3
12+
dynamicScanStateInstalling DynamicScanStateType = 4
13+
dynamicScanStateLaunching DynamicScanStateType = 5
14+
dynamicScanStateHooking DynamicScanStateType = 6
15+
dynamicScanStateReady DynamicScanStateType = 7
16+
dynamicScanStateShuttingDown DynamicScanStateType = 8
17+
dynamicScanStateCompleted DynamicScanStateType = 9
1618
)
1719

1820
type dynamicScanStateStruct struct {
19-
Unknown DynamicScanStateType
21+
Error DynamicScanStateType
2022
None DynamicScanStateType
23+
InQueue DynamicScanStateType
2124
Booting DynamicScanStateType
22-
Ready DynamicScanStateType
23-
ShuttingDown DynamicScanStateType
2425
Downloading DynamicScanStateType
2526
Installing DynamicScanStateType
2627
Launching DynamicScanStateType
2728
Hooking DynamicScanStateType
29+
Ready DynamicScanStateType
30+
ShuttingDown DynamicScanStateType
31+
Completed DynamicScanStateType
2832
mappingHumanize map[DynamicScanStateType]string
2933
}
3034

3135
// DynamicScanState represents the dynamic scan status
3236
var DynamicScanState = dynamicScanStateStruct{
33-
Unknown: dynamicScanStateUnknown,
37+
Error: dynamicScanStateError,
3438
None: dynamicScanStateNone,
39+
InQueue: dynamicScanStateInQueue,
3540
Booting: dynamicScanStateBooting,
36-
Ready: dynamicScanStateReady,
37-
ShuttingDown: dynamicScanStateShuttingDown,
3841
Downloading: dynamicScanStateDownloading,
3942
Installing: dynamicScanStateInstalling,
4043
Launching: dynamicScanStateLaunching,
4144
Hooking: dynamicScanStateHooking,
45+
Ready: dynamicScanStateReady,
46+
ShuttingDown: dynamicScanStateShuttingDown,
47+
Completed: dynamicScanStateCompleted,
4248
mappingHumanize: map[DynamicScanStateType]string{
43-
dynamicScanStateUnknown: "Unknown",
49+
dynamicScanStateError: "Error",
4450
dynamicScanStateNone: "None",
51+
dynamicScanStateInQueue: "In Queue",
4552
dynamicScanStateBooting: "Booting",
46-
dynamicScanStateReady: "Ready",
47-
dynamicScanStateShuttingDown: "ShuttingDown",
48-
dynamicScanStateDownloading: "Downloading",
49-
dynamicScanStateInstalling: "Installing",
50-
dynamicScanStateLaunching: "Launching",
53+
dynamicScanStateDownloading: "Downloading Package",
54+
dynamicScanStateInstalling: "Installing Package",
55+
dynamicScanStateLaunching: "Launching App",
5156
dynamicScanStateHooking: "Hooking",
57+
dynamicScanStateReady: "Ready",
58+
dynamicScanStateShuttingDown: "Shutting Down",
59+
dynamicScanStateCompleted: "Completed",
5260
},
5361
}
5462

appknox/enums/dynamicScanStatus.go

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package enums
2+
3+
// DynamicScanStatusType represents the status codes that a dynamic scan can have.
4+
type DynamicScanStatusType int
5+
6+
// These constants list all possible dynamic scan statuses recognized by Appknox.
7+
const (
8+
dynamicScanStatusNotStarted DynamicScanStatusType = 0
9+
dynamicScanStatusPreProcessing DynamicScanStatusType = 1
10+
dynamicScanStatusProcessingScanRequest DynamicScanStatusType = 2
11+
dynamicScanStatusInQueue DynamicScanStatusType = 3
12+
dynamicScanStatusDeviceAllocated DynamicScanStatusType = 4
13+
dynamicScanStatusConnectingToDevice DynamicScanStatusType = 5
14+
dynamicScanStatusPreparingDevice DynamicScanStatusType = 6
15+
dynamicScanStatusInstalling DynamicScanStatusType = 7
16+
dynamicScanStatusConfiguringAPICapture DynamicScanStatusType = 8
17+
dynamicScanStatusHooking DynamicScanStatusType = 9
18+
dynamicScanStatusLaunching DynamicScanStatusType = 10
19+
dynamicScanStatusReadyForInteraction DynamicScanStatusType = 11
20+
dynamicScanStatusDownloadingAutoPilotScript DynamicScanStatusType = 12
21+
dynamicScanStatusConfiguringAutoPilot DynamicScanStatusType = 13
22+
dynamicScanStatusAutoPilotRunning DynamicScanStatusType = 14
23+
dynamicScanStatusAutoPilotCompleted DynamicScanStatusType = 15
24+
dynamicScanStatusStopScanRequested DynamicScanStatusType = 16
25+
dynamicScanStatusScanTimeLimitExceeded DynamicScanStatusType = 17
26+
dynamicScanStatusShuttingDown DynamicScanStatusType = 18
27+
dynamicScanStatusCleaningDevice DynamicScanStatusType = 19
28+
dynamicScanStatusRuntimeDetectionCompleted DynamicScanStatusType = 20
29+
dynamicScanStatusAnalyzing DynamicScanStatusType = 21
30+
dynamicScanStatusAnalysisCompleted DynamicScanStatusType = 22
31+
dynamicScanStatusTimedOut DynamicScanStatusType = 23
32+
dynamicScanStatusError DynamicScanStatusType = 24
33+
dynamicScanStatusCancelled DynamicScanStatusType = 25
34+
dynamicScanStatusTerminated DynamicScanStatusType = 26
35+
)
36+
37+
// dynamicScanStatusStruct holds references to each of the status codes
38+
// and a map from code => human-readable string.
39+
type dynamicScanStatusStruct struct {
40+
NotStarted DynamicScanStatusType
41+
PreProcessing DynamicScanStatusType
42+
ProcessingScanRequest DynamicScanStatusType
43+
InQueue DynamicScanStatusType
44+
DeviceAllocated DynamicScanStatusType
45+
ConnectingToDevice DynamicScanStatusType
46+
PreparingDevice DynamicScanStatusType
47+
Installing DynamicScanStatusType
48+
ConfiguringAPICapture DynamicScanStatusType
49+
Hooking DynamicScanStatusType
50+
Launching DynamicScanStatusType
51+
ReadyForInteraction DynamicScanStatusType
52+
DownloadingAutoPilotScript DynamicScanStatusType
53+
ConfiguringAutoPilot DynamicScanStatusType
54+
AutoPilotRunning DynamicScanStatusType
55+
AutoPilotCompleted DynamicScanStatusType
56+
StopScanRequested DynamicScanStatusType
57+
ScanTimeLimitExceeded DynamicScanStatusType
58+
ShuttingDown DynamicScanStatusType
59+
CleaningDevice DynamicScanStatusType
60+
RuntimeDetectionCompleted DynamicScanStatusType
61+
Analyzing DynamicScanStatusType
62+
AnalysisCompleted DynamicScanStatusType
63+
TimedOut DynamicScanStatusType
64+
Error DynamicScanStatusType
65+
Cancelled DynamicScanStatusType
66+
Terminated DynamicScanStatusType
67+
68+
// mappingHumanize maps each status code to a human-readable string.
69+
mappingHumanize map[DynamicScanStatusType]string
70+
}
71+
72+
// DynamicScanStatus exports the enumerations and the human-readable strings
73+
// for Appknox dynamic scan statuses.
74+
var DynamicScanStatus = dynamicScanStatusStruct{
75+
NotStarted: dynamicScanStatusNotStarted,
76+
PreProcessing: dynamicScanStatusPreProcessing,
77+
ProcessingScanRequest: dynamicScanStatusProcessingScanRequest,
78+
InQueue: dynamicScanStatusInQueue,
79+
DeviceAllocated: dynamicScanStatusDeviceAllocated,
80+
ConnectingToDevice: dynamicScanStatusConnectingToDevice,
81+
PreparingDevice: dynamicScanStatusPreparingDevice,
82+
Installing: dynamicScanStatusInstalling,
83+
ConfiguringAPICapture: dynamicScanStatusConfiguringAPICapture,
84+
Hooking: dynamicScanStatusHooking,
85+
Launching: dynamicScanStatusLaunching,
86+
ReadyForInteraction: dynamicScanStatusReadyForInteraction,
87+
DownloadingAutoPilotScript: dynamicScanStatusDownloadingAutoPilotScript,
88+
ConfiguringAutoPilot: dynamicScanStatusConfiguringAutoPilot,
89+
AutoPilotRunning: dynamicScanStatusAutoPilotRunning,
90+
AutoPilotCompleted: dynamicScanStatusAutoPilotCompleted,
91+
StopScanRequested: dynamicScanStatusStopScanRequested,
92+
ScanTimeLimitExceeded: dynamicScanStatusScanTimeLimitExceeded,
93+
ShuttingDown: dynamicScanStatusShuttingDown,
94+
CleaningDevice: dynamicScanStatusCleaningDevice,
95+
RuntimeDetectionCompleted: dynamicScanStatusRuntimeDetectionCompleted,
96+
Analyzing: dynamicScanStatusAnalyzing,
97+
AnalysisCompleted: dynamicScanStatusAnalysisCompleted,
98+
TimedOut: dynamicScanStatusTimedOut,
99+
Error: dynamicScanStatusError,
100+
Cancelled: dynamicScanStatusCancelled,
101+
Terminated: dynamicScanStatusTerminated,
102+
103+
mappingHumanize: map[DynamicScanStatusType]string{
104+
dynamicScanStatusNotStarted: "Not Started",
105+
dynamicScanStatusPreProcessing: "Preprocessing",
106+
dynamicScanStatusProcessingScanRequest: "Processing scan request",
107+
dynamicScanStatusInQueue: "In Queue",
108+
dynamicScanStatusDeviceAllocated: "Device allocated",
109+
dynamicScanStatusConnectingToDevice: "Connecting to device",
110+
dynamicScanStatusPreparingDevice: "Preparing device",
111+
dynamicScanStatusInstalling: "Installing app",
112+
dynamicScanStatusConfiguringAPICapture: "Preparing for API capture",
113+
dynamicScanStatusHooking: "Preparing for data capture",
114+
dynamicScanStatusLaunching: "Launching app",
115+
dynamicScanStatusReadyForInteraction: "Ready for interaction",
116+
dynamicScanStatusDownloadingAutoPilotScript: "Downloading autopilot script",
117+
dynamicScanStatusConfiguringAutoPilot: "Configuring autopilot",
118+
dynamicScanStatusAutoPilotRunning: "Autopilot running",
119+
dynamicScanStatusAutoPilotCompleted: "Autopilot completed",
120+
dynamicScanStatusStopScanRequested: "Stop scan requested",
121+
dynamicScanStatusScanTimeLimitExceeded: "Scan time limit exceeded",
122+
dynamicScanStatusShuttingDown: "Shutting down",
123+
dynamicScanStatusCleaningDevice: "Cleaning device",
124+
dynamicScanStatusRuntimeDetectionCompleted: "Runtime detection completed",
125+
dynamicScanStatusAnalyzing: "Analyzing",
126+
dynamicScanStatusAnalysisCompleted: "Analysis completed",
127+
dynamicScanStatusTimedOut: "Timed out",
128+
dynamicScanStatusError: "Error",
129+
dynamicScanStatusCancelled: "Cancelled",
130+
dynamicScanStatusTerminated: "Terminated",
131+
},
132+
}
133+
134+
// String returns the human-readable name for a given DynamicScanStatusType.
135+
func (d DynamicScanStatusType) String() string {
136+
return DynamicScanStatus.mappingHumanize[d]
137+
}

0 commit comments

Comments
 (0)