driftdetect-detectors 0.7.1 → 0.8.0
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/api/cpp/boost-beast-detector.d.ts +31 -0
- package/dist/api/cpp/boost-beast-detector.d.ts.map +1 -0
- package/dist/api/cpp/boost-beast-detector.js +219 -0
- package/dist/api/cpp/boost-beast-detector.js.map +1 -0
- package/dist/api/cpp/crow-detector.d.ts +40 -0
- package/dist/api/cpp/crow-detector.d.ts.map +1 -0
- package/dist/api/cpp/crow-detector.js +181 -0
- package/dist/api/cpp/crow-detector.js.map +1 -0
- package/dist/api/cpp/index.d.ts +11 -0
- package/dist/api/cpp/index.d.ts.map +1 -0
- package/dist/api/cpp/index.js +11 -0
- package/dist/api/cpp/index.js.map +1 -0
- package/dist/api/cpp/qt-network-detector.d.ts +39 -0
- package/dist/api/cpp/qt-network-detector.d.ts.map +1 -0
- package/dist/api/cpp/qt-network-detector.js +175 -0
- package/dist/api/cpp/qt-network-detector.js.map +1 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/rust/actix-detector.d.ts +46 -0
- package/dist/api/rust/actix-detector.d.ts.map +1 -0
- package/dist/api/rust/actix-detector.js +241 -0
- package/dist/api/rust/actix-detector.js.map +1 -0
- package/dist/api/rust/axum-detector.d.ts +46 -0
- package/dist/api/rust/axum-detector.d.ts.map +1 -0
- package/dist/api/rust/axum-detector.js +303 -0
- package/dist/api/rust/axum-detector.js.map +1 -0
- package/dist/api/rust/index.d.ts +14 -0
- package/dist/api/rust/index.d.ts.map +1 -0
- package/dist/api/rust/index.js +12 -0
- package/dist/api/rust/index.js.map +1 -0
- package/dist/api/rust/rocket-detector.d.ts +63 -0
- package/dist/api/rust/rocket-detector.d.ts.map +1 -0
- package/dist/api/rust/rocket-detector.js +218 -0
- package/dist/api/rust/rocket-detector.js.map +1 -0
- package/dist/api/rust/warp-detector.d.ts +60 -0
- package/dist/api/rust/warp-detector.d.ts.map +1 -0
- package/dist/api/rust/warp-detector.js +282 -0
- package/dist/api/rust/warp-detector.js.map +1 -0
- package/dist/auth/cpp/index.d.ts +9 -0
- package/dist/auth/cpp/index.d.ts.map +1 -0
- package/dist/auth/cpp/index.js +9 -0
- package/dist/auth/cpp/index.js.map +1 -0
- package/dist/auth/cpp/middleware-detector.d.ts +51 -0
- package/dist/auth/cpp/middleware-detector.d.ts.map +1 -0
- package/dist/auth/cpp/middleware-detector.js +419 -0
- package/dist/auth/cpp/middleware-detector.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/rust/middleware-detector.d.ts +68 -0
- package/dist/auth/rust/middleware-detector.d.ts.map +1 -0
- package/dist/auth/rust/middleware-detector.js +505 -0
- package/dist/auth/rust/middleware-detector.js.map +1 -0
- package/dist/errors/cpp/error-handling-detector.d.ts +74 -0
- package/dist/errors/cpp/error-handling-detector.d.ts.map +1 -0
- package/dist/errors/cpp/error-handling-detector.js +598 -0
- package/dist/errors/cpp/error-handling-detector.js.map +1 -0
- package/dist/errors/cpp/index.d.ts +9 -0
- package/dist/errors/cpp/index.d.ts.map +1 -0
- package/dist/errors/cpp/index.js +9 -0
- package/dist/errors/cpp/index.js.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/rust/error-handling-detector.d.ts +77 -0
- package/dist/errors/rust/error-handling-detector.d.ts.map +1 -0
- package/dist/errors/rust/error-handling-detector.js +363 -0
- package/dist/errors/rust/error-handling-detector.js.map +1 -0
- package/dist/index.d.ts +22 -22
- package/package.json +13 -13
- package/LICENSE +0 -21
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boost.Beast Framework Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects Boost.Beast HTTP/WebSocket patterns in C++ code:
|
|
5
|
+
* - HTTP server/client patterns
|
|
6
|
+
* - WebSocket connections
|
|
7
|
+
* - Async operations with Boost.Asio
|
|
8
|
+
*
|
|
9
|
+
* @license Apache-2.0
|
|
10
|
+
*/
|
|
11
|
+
import type { Violation, QuickFix, Language } from 'driftdetect-core';
|
|
12
|
+
import { RegexDetector, type DetectionContext, type DetectionResult } from '../../base/index.js';
|
|
13
|
+
export declare class BoostBeastDetector extends RegexDetector {
|
|
14
|
+
readonly id = "api/cpp/boost-beast";
|
|
15
|
+
readonly category: "api";
|
|
16
|
+
readonly subcategory = "http";
|
|
17
|
+
readonly name = "Boost.Beast Detector";
|
|
18
|
+
readonly description = "Detects Boost.Beast HTTP/WebSocket patterns in C++ code";
|
|
19
|
+
readonly supportedLanguages: Language[];
|
|
20
|
+
generateQuickFix(_violation: Violation): QuickFix | null;
|
|
21
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
22
|
+
private isCppFile;
|
|
23
|
+
private usesBoostBeast;
|
|
24
|
+
private detectHttpPatterns;
|
|
25
|
+
private detectWebSocketPatterns;
|
|
26
|
+
private detectAsyncPatterns;
|
|
27
|
+
private detectSslPatterns;
|
|
28
|
+
private calculateConfidence;
|
|
29
|
+
}
|
|
30
|
+
export declare function createBoostBeastDetector(): BoostBeastDetector;
|
|
31
|
+
//# sourceMappingURL=boost-beast-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boost-beast-detector.d.ts","sourceRoot":"","sources":["../../../src/api/cpp/boost-beast-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAgB,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMjG,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,QAAQ,CAAC,EAAE,yBAAyB;IACpC,QAAQ,CAAC,QAAQ,EAAG,KAAK,CAAU;IACnC,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,WAAW,6DAA6D;IACjF,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAW;IAElD,gBAAgB,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI;IAIlD,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BjE,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,kBAAkB;IAwD1B,OAAO,CAAC,uBAAuB;IA+C/B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,mBAAmB;CAI5B;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boost.Beast Framework Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects Boost.Beast HTTP/WebSocket patterns in C++ code:
|
|
5
|
+
* - HTTP server/client patterns
|
|
6
|
+
* - WebSocket connections
|
|
7
|
+
* - Async operations with Boost.Asio
|
|
8
|
+
*
|
|
9
|
+
* @license Apache-2.0
|
|
10
|
+
*/
|
|
11
|
+
import { RegexDetector } from '../../base/index.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Boost.Beast Detector Class
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export class BoostBeastDetector extends RegexDetector {
|
|
16
|
+
id = 'api/cpp/boost-beast';
|
|
17
|
+
category = 'api';
|
|
18
|
+
subcategory = 'http';
|
|
19
|
+
name = 'Boost.Beast Detector';
|
|
20
|
+
description = 'Detects Boost.Beast HTTP/WebSocket patterns in C++ code';
|
|
21
|
+
supportedLanguages = ['cpp'];
|
|
22
|
+
generateQuickFix(_violation) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
async detect(context) {
|
|
26
|
+
const patterns = [];
|
|
27
|
+
const violations = [];
|
|
28
|
+
if (!this.isCppFile(context.file)) {
|
|
29
|
+
return this.createResult(patterns, violations, 1.0);
|
|
30
|
+
}
|
|
31
|
+
if (!this.usesBoostBeast(context.content)) {
|
|
32
|
+
return this.createResult(patterns, violations, 1.0);
|
|
33
|
+
}
|
|
34
|
+
// Detect HTTP patterns
|
|
35
|
+
this.detectHttpPatterns(context.content, context.file, patterns);
|
|
36
|
+
// Detect WebSocket patterns
|
|
37
|
+
this.detectWebSocketPatterns(context.content, context.file, patterns);
|
|
38
|
+
// Detect async patterns
|
|
39
|
+
this.detectAsyncPatterns(context.content, context.file, patterns);
|
|
40
|
+
// Detect SSL/TLS patterns
|
|
41
|
+
this.detectSslPatterns(context.content, context.file, patterns);
|
|
42
|
+
return this.createResult(patterns, violations, this.calculateConfidence(patterns));
|
|
43
|
+
}
|
|
44
|
+
isCppFile(file) {
|
|
45
|
+
return /\.(cpp|cc|cxx|hpp|hh|hxx|h)$/.test(file);
|
|
46
|
+
}
|
|
47
|
+
usesBoostBeast(content) {
|
|
48
|
+
return content.includes('boost::beast') ||
|
|
49
|
+
content.includes('#include <boost/beast') ||
|
|
50
|
+
content.includes('namespace beast = boost::beast');
|
|
51
|
+
}
|
|
52
|
+
detectHttpPatterns(content, file, patterns) {
|
|
53
|
+
// HTTP request types
|
|
54
|
+
const requestPattern = /beast::http::request\s*<\s*([^>]+)\s*>/g;
|
|
55
|
+
for (const match of this.matchLines(content, requestPattern)) {
|
|
56
|
+
patterns.push({
|
|
57
|
+
patternId: `${this.id}/http-request`,
|
|
58
|
+
location: { file, line: match.line, column: match.column },
|
|
59
|
+
confidence: 0.95,
|
|
60
|
+
isOutlier: false,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// HTTP response types
|
|
64
|
+
const responsePattern = /beast::http::response\s*<\s*([^>]+)\s*>/g;
|
|
65
|
+
for (const match of this.matchLines(content, responsePattern)) {
|
|
66
|
+
patterns.push({
|
|
67
|
+
patternId: `${this.id}/http-response`,
|
|
68
|
+
location: { file, line: match.line, column: match.column },
|
|
69
|
+
confidence: 0.95,
|
|
70
|
+
isOutlier: false,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// HTTP verbs
|
|
74
|
+
const verbPattern = /beast::http::verb::(\w+)/g;
|
|
75
|
+
for (const match of this.matchLines(content, verbPattern)) {
|
|
76
|
+
patterns.push({
|
|
77
|
+
patternId: `${this.id}/http-verb/${match.captures[1]?.toLowerCase() ?? 'unknown'}`,
|
|
78
|
+
location: { file, line: match.line, column: match.column },
|
|
79
|
+
confidence: 0.9,
|
|
80
|
+
isOutlier: false,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// HTTP read/write operations
|
|
84
|
+
const readPattern = /beast::http::(?:async_)?read\s*\(/g;
|
|
85
|
+
for (const match of this.matchLines(content, readPattern)) {
|
|
86
|
+
patterns.push({
|
|
87
|
+
patternId: `${this.id}/http-read`,
|
|
88
|
+
location: { file, line: match.line, column: match.column },
|
|
89
|
+
confidence: 0.9,
|
|
90
|
+
isOutlier: false,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const writePattern = /beast::http::(?:async_)?write\s*\(/g;
|
|
94
|
+
for (const match of this.matchLines(content, writePattern)) {
|
|
95
|
+
patterns.push({
|
|
96
|
+
patternId: `${this.id}/http-write`,
|
|
97
|
+
location: { file, line: match.line, column: match.column },
|
|
98
|
+
confidence: 0.9,
|
|
99
|
+
isOutlier: false,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
detectWebSocketPatterns(content, file, patterns) {
|
|
104
|
+
// WebSocket stream
|
|
105
|
+
const wsStreamPattern = /beast::websocket::stream\s*<\s*([^>]+)\s*>/g;
|
|
106
|
+
for (const match of this.matchLines(content, wsStreamPattern)) {
|
|
107
|
+
patterns.push({
|
|
108
|
+
patternId: `${this.id}/websocket-stream`,
|
|
109
|
+
location: { file, line: match.line, column: match.column },
|
|
110
|
+
confidence: 0.95,
|
|
111
|
+
isOutlier: false,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// WebSocket accept/handshake
|
|
115
|
+
const acceptPattern = /\.(?:async_)?accept\s*\(/g;
|
|
116
|
+
for (const match of this.matchLines(content, acceptPattern)) {
|
|
117
|
+
if (content.includes('websocket')) {
|
|
118
|
+
patterns.push({
|
|
119
|
+
patternId: `${this.id}/websocket-accept`,
|
|
120
|
+
location: { file, line: match.line, column: match.column },
|
|
121
|
+
confidence: 0.85,
|
|
122
|
+
isOutlier: false,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// WebSocket read/write
|
|
127
|
+
const wsReadPattern = /\.(?:async_)?read\s*\(\s*buffer/g;
|
|
128
|
+
for (const match of this.matchLines(content, wsReadPattern)) {
|
|
129
|
+
patterns.push({
|
|
130
|
+
patternId: `${this.id}/websocket-read`,
|
|
131
|
+
location: { file, line: match.line, column: match.column },
|
|
132
|
+
confidence: 0.85,
|
|
133
|
+
isOutlier: false,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const wsWritePattern = /\.(?:async_)?write\s*\(\s*(?:net::)?buffer/g;
|
|
137
|
+
for (const match of this.matchLines(content, wsWritePattern)) {
|
|
138
|
+
patterns.push({
|
|
139
|
+
patternId: `${this.id}/websocket-write`,
|
|
140
|
+
location: { file, line: match.line, column: match.column },
|
|
141
|
+
confidence: 0.85,
|
|
142
|
+
isOutlier: false,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
detectAsyncPatterns(content, file, patterns) {
|
|
147
|
+
// io_context
|
|
148
|
+
const ioContextPattern = /(?:net|asio)::io_context\s+\w+/g;
|
|
149
|
+
for (const match of this.matchLines(content, ioContextPattern)) {
|
|
150
|
+
patterns.push({
|
|
151
|
+
patternId: `${this.id}/io-context`,
|
|
152
|
+
location: { file, line: match.line, column: match.column },
|
|
153
|
+
confidence: 0.9,
|
|
154
|
+
isOutlier: false,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// async_connect
|
|
158
|
+
const asyncConnectPattern = /(?:net|asio)::async_connect\s*\(/g;
|
|
159
|
+
for (const match of this.matchLines(content, asyncConnectPattern)) {
|
|
160
|
+
patterns.push({
|
|
161
|
+
patternId: `${this.id}/async-connect`,
|
|
162
|
+
location: { file, line: match.line, column: match.column },
|
|
163
|
+
confidence: 0.9,
|
|
164
|
+
isOutlier: false,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Coroutine patterns (C++20)
|
|
168
|
+
const coroPattern = /(?:net|asio)::(?:awaitable|use_awaitable|co_spawn)/g;
|
|
169
|
+
for (const match of this.matchLines(content, coroPattern)) {
|
|
170
|
+
patterns.push({
|
|
171
|
+
patternId: `${this.id}/coroutine`,
|
|
172
|
+
location: { file, line: match.line, column: match.column },
|
|
173
|
+
confidence: 0.9,
|
|
174
|
+
isOutlier: false,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
detectSslPatterns(content, file, patterns) {
|
|
179
|
+
// SSL context
|
|
180
|
+
const sslContextPattern = /(?:ssl|asio::ssl)::context\s+\w+/g;
|
|
181
|
+
for (const match of this.matchLines(content, sslContextPattern)) {
|
|
182
|
+
patterns.push({
|
|
183
|
+
patternId: `${this.id}/ssl-context`,
|
|
184
|
+
location: { file, line: match.line, column: match.column },
|
|
185
|
+
confidence: 0.95,
|
|
186
|
+
isOutlier: false,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
// SSL stream
|
|
190
|
+
const sslStreamPattern = /(?:ssl|asio::ssl)::stream\s*<\s*([^>]+)\s*>/g;
|
|
191
|
+
for (const match of this.matchLines(content, sslStreamPattern)) {
|
|
192
|
+
patterns.push({
|
|
193
|
+
patternId: `${this.id}/ssl-stream`,
|
|
194
|
+
location: { file, line: match.line, column: match.column },
|
|
195
|
+
confidence: 0.95,
|
|
196
|
+
isOutlier: false,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Handshake
|
|
200
|
+
const handshakePattern = /\.(?:async_)?handshake\s*\(/g;
|
|
201
|
+
for (const match of this.matchLines(content, handshakePattern)) {
|
|
202
|
+
patterns.push({
|
|
203
|
+
patternId: `${this.id}/ssl-handshake`,
|
|
204
|
+
location: { file, line: match.line, column: match.column },
|
|
205
|
+
confidence: 0.85,
|
|
206
|
+
isOutlier: false,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
calculateConfidence(patterns) {
|
|
211
|
+
if (patterns.length === 0)
|
|
212
|
+
return 1.0;
|
|
213
|
+
return patterns.reduce((sum, p) => sum + p.confidence, 0) / patterns.length;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export function createBoostBeastDetector() {
|
|
217
|
+
return new BoostBeastDetector();
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=boost-beast-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boost-beast-detector.js","sourceRoot":"","sources":["../../../src/api/cpp/boost-beast-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crow Framework Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects Crow HTTP framework patterns in C++ code:
|
|
5
|
+
* - Route definitions (CROW_ROUTE)
|
|
6
|
+
* - Blueprint usage
|
|
7
|
+
* - Middleware
|
|
8
|
+
* - WebSocket handlers
|
|
9
|
+
*
|
|
10
|
+
* @license Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
import type { Violation, QuickFix, Language } from 'driftdetect-core';
|
|
13
|
+
import { RegexDetector, type DetectionContext, type DetectionResult } from '../../base/index.js';
|
|
14
|
+
export interface CrowRouteInfo {
|
|
15
|
+
method: string;
|
|
16
|
+
path: string;
|
|
17
|
+
line: number;
|
|
18
|
+
column: number;
|
|
19
|
+
hasParams: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class CrowDetector extends RegexDetector {
|
|
22
|
+
readonly id = "api/cpp/crow";
|
|
23
|
+
readonly category: "api";
|
|
24
|
+
readonly subcategory = "routes";
|
|
25
|
+
readonly name = "Crow Framework Detector";
|
|
26
|
+
readonly description = "Detects Crow HTTP framework route patterns in C++ code";
|
|
27
|
+
readonly supportedLanguages: Language[];
|
|
28
|
+
generateQuickFix(_violation: Violation): QuickFix | null;
|
|
29
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
30
|
+
private isCppFile;
|
|
31
|
+
private usesCrow;
|
|
32
|
+
private detectCrowRoutes;
|
|
33
|
+
private detectAppUsage;
|
|
34
|
+
private detectMiddleware;
|
|
35
|
+
private detectWebSocket;
|
|
36
|
+
private detectBlueprints;
|
|
37
|
+
private calculateConfidence;
|
|
38
|
+
}
|
|
39
|
+
export declare function createCrowDetector(): CrowDetector;
|
|
40
|
+
//# sourceMappingURL=crow-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crow-detector.d.ts","sourceRoot":"","sources":["../../../src/api/cpp/crow-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAgB,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMjG,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD,qBAAa,YAAa,SAAQ,aAAa;IAC7C,QAAQ,CAAC,EAAE,kBAAkB;IAC7B,QAAQ,CAAC,QAAQ,EAAG,KAAK,CAAU;IACnC,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,IAAI,6BAA6B;IAC1C,QAAQ,CAAC,WAAW,4DAA4D;IAChF,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAW;IAElD,gBAAgB,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI;IAIlD,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA8BjE,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,mBAAmB;CAI5B;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crow Framework Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects Crow HTTP framework patterns in C++ code:
|
|
5
|
+
* - Route definitions (CROW_ROUTE)
|
|
6
|
+
* - Blueprint usage
|
|
7
|
+
* - Middleware
|
|
8
|
+
* - WebSocket handlers
|
|
9
|
+
*
|
|
10
|
+
* @license Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
import { RegexDetector } from '../../base/index.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Crow Detector Class
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export class CrowDetector extends RegexDetector {
|
|
17
|
+
id = 'api/cpp/crow';
|
|
18
|
+
category = 'api';
|
|
19
|
+
subcategory = 'routes';
|
|
20
|
+
name = 'Crow Framework Detector';
|
|
21
|
+
description = 'Detects Crow HTTP framework route patterns in C++ code';
|
|
22
|
+
supportedLanguages = ['cpp'];
|
|
23
|
+
generateQuickFix(_violation) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
async detect(context) {
|
|
27
|
+
const patterns = [];
|
|
28
|
+
const violations = [];
|
|
29
|
+
if (!this.isCppFile(context.file)) {
|
|
30
|
+
return this.createResult(patterns, violations, 1.0);
|
|
31
|
+
}
|
|
32
|
+
if (!this.usesCrow(context.content)) {
|
|
33
|
+
return this.createResult(patterns, violations, 1.0);
|
|
34
|
+
}
|
|
35
|
+
// Detect CROW_ROUTE macro
|
|
36
|
+
this.detectCrowRoutes(context.content, context.file, patterns);
|
|
37
|
+
// Detect crow::App usage
|
|
38
|
+
this.detectAppUsage(context.content, context.file, patterns);
|
|
39
|
+
// Detect middleware
|
|
40
|
+
this.detectMiddleware(context.content, context.file, patterns);
|
|
41
|
+
// Detect WebSocket
|
|
42
|
+
this.detectWebSocket(context.content, context.file, patterns);
|
|
43
|
+
// Detect blueprints
|
|
44
|
+
this.detectBlueprints(context.content, context.file, patterns);
|
|
45
|
+
return this.createResult(patterns, violations, this.calculateConfidence(patterns));
|
|
46
|
+
}
|
|
47
|
+
isCppFile(file) {
|
|
48
|
+
return /\.(cpp|cc|cxx|hpp|hh|hxx|h)$/.test(file);
|
|
49
|
+
}
|
|
50
|
+
usesCrow(content) {
|
|
51
|
+
return content.includes('crow::') ||
|
|
52
|
+
content.includes('#include "crow') ||
|
|
53
|
+
content.includes('#include <crow') ||
|
|
54
|
+
content.includes('CROW_ROUTE') ||
|
|
55
|
+
content.includes('CROW_BP_ROUTE');
|
|
56
|
+
}
|
|
57
|
+
detectCrowRoutes(content, file, patterns) {
|
|
58
|
+
// CROW_ROUTE(app, "/path")
|
|
59
|
+
const routePattern = /CROW_ROUTE\s*\(\s*\w+\s*,\s*"([^"]+)"\s*\)/g;
|
|
60
|
+
for (const match of this.matchLines(content, routePattern)) {
|
|
61
|
+
patterns.push({
|
|
62
|
+
patternId: `${this.id}/route`,
|
|
63
|
+
location: { file, line: match.line, column: match.column },
|
|
64
|
+
confidence: 0.95,
|
|
65
|
+
isOutlier: false,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// CROW_BP_ROUTE (blueprint routes)
|
|
69
|
+
const bpRoutePattern = /CROW_BP_ROUTE\s*\(\s*\w+\s*,\s*"([^"]+)"\s*\)/g;
|
|
70
|
+
for (const match of this.matchLines(content, bpRoutePattern)) {
|
|
71
|
+
patterns.push({
|
|
72
|
+
patternId: `${this.id}/blueprint-route`,
|
|
73
|
+
location: { file, line: match.line, column: match.column },
|
|
74
|
+
confidence: 0.95,
|
|
75
|
+
isOutlier: false,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Method chaining: .methods(crow::HTTPMethod::GET)
|
|
79
|
+
const methodPattern = /\.methods\s*\(\s*crow::HTTPMethod::(\w+)/g;
|
|
80
|
+
for (const match of this.matchLines(content, methodPattern)) {
|
|
81
|
+
patterns.push({
|
|
82
|
+
patternId: `${this.id}/method/${match.captures[1]?.toLowerCase() ?? 'unknown'}`,
|
|
83
|
+
location: { file, line: match.line, column: match.column },
|
|
84
|
+
confidence: 0.9,
|
|
85
|
+
isOutlier: false,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
detectAppUsage(content, file, patterns) {
|
|
90
|
+
// crow::SimpleApp or crow::App<>
|
|
91
|
+
const appPattern = /crow::(SimpleApp|App\s*<[^>]*>)\s+\w+/g;
|
|
92
|
+
for (const match of this.matchLines(content, appPattern)) {
|
|
93
|
+
patterns.push({
|
|
94
|
+
patternId: `${this.id}/app`,
|
|
95
|
+
location: { file, line: match.line, column: match.column },
|
|
96
|
+
confidence: 0.95,
|
|
97
|
+
isOutlier: false,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// app.port().multithreaded().run()
|
|
101
|
+
const runPattern = /\.port\s*\(\s*\d+\s*\)[^;]*\.run\s*\(\s*\)/g;
|
|
102
|
+
for (const match of this.matchLines(content, runPattern)) {
|
|
103
|
+
patterns.push({
|
|
104
|
+
patternId: `${this.id}/server-start`,
|
|
105
|
+
location: { file, line: match.line, column: match.column },
|
|
106
|
+
confidence: 0.95,
|
|
107
|
+
isOutlier: false,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
detectMiddleware(content, file, patterns) {
|
|
112
|
+
// crow::App<crow::CORSHandler>
|
|
113
|
+
const middlewarePattern = /crow::App\s*<\s*([^>]+)\s*>/g;
|
|
114
|
+
for (const match of this.matchLines(content, middlewarePattern)) {
|
|
115
|
+
const middlewares = match.captures[1]?.split(',') ?? [];
|
|
116
|
+
for (const mw of middlewares) {
|
|
117
|
+
if (mw.trim()) {
|
|
118
|
+
patterns.push({
|
|
119
|
+
patternId: `${this.id}/middleware`,
|
|
120
|
+
location: { file, line: match.line, column: match.column },
|
|
121
|
+
confidence: 0.9,
|
|
122
|
+
isOutlier: false,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
detectWebSocket(content, file, patterns) {
|
|
129
|
+
// CROW_WEBSOCKET_ROUTE
|
|
130
|
+
const wsPattern = /CROW_WEBSOCKET_ROUTE\s*\(\s*\w+\s*,\s*"([^"]+)"\s*\)/g;
|
|
131
|
+
for (const match of this.matchLines(content, wsPattern)) {
|
|
132
|
+
patterns.push({
|
|
133
|
+
patternId: `${this.id}/websocket`,
|
|
134
|
+
location: { file, line: match.line, column: match.column },
|
|
135
|
+
confidence: 0.95,
|
|
136
|
+
isOutlier: false,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// .onopen, .onmessage, .onclose handlers
|
|
140
|
+
const handlerPattern = /\.(onopen|onmessage|onclose|onerror)\s*\(\s*\[/g;
|
|
141
|
+
for (const match of this.matchLines(content, handlerPattern)) {
|
|
142
|
+
patterns.push({
|
|
143
|
+
patternId: `${this.id}/websocket-handler`,
|
|
144
|
+
location: { file, line: match.line, column: match.column },
|
|
145
|
+
confidence: 0.9,
|
|
146
|
+
isOutlier: false,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
detectBlueprints(content, file, patterns) {
|
|
151
|
+
// crow::Blueprint
|
|
152
|
+
const bpPattern = /crow::Blueprint\s+\w+/g;
|
|
153
|
+
for (const match of this.matchLines(content, bpPattern)) {
|
|
154
|
+
patterns.push({
|
|
155
|
+
patternId: `${this.id}/blueprint`,
|
|
156
|
+
location: { file, line: match.line, column: match.column },
|
|
157
|
+
confidence: 0.95,
|
|
158
|
+
isOutlier: false,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// app.register_blueprint
|
|
162
|
+
const registerPattern = /\.register_blueprint\s*\(/g;
|
|
163
|
+
for (const match of this.matchLines(content, registerPattern)) {
|
|
164
|
+
patterns.push({
|
|
165
|
+
patternId: `${this.id}/blueprint-register`,
|
|
166
|
+
location: { file, line: match.line, column: match.column },
|
|
167
|
+
confidence: 0.9,
|
|
168
|
+
isOutlier: false,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
calculateConfidence(patterns) {
|
|
173
|
+
if (patterns.length === 0)
|
|
174
|
+
return 1.0;
|
|
175
|
+
return patterns.reduce((sum, p) => sum + p.confidence, 0) / patterns.length;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export function createCrowDetector() {
|
|
179
|
+
return new CrowDetector();
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=crow-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crow-detector.js","sourceRoot":"","sources":["../../../src/api/cpp/crow-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C++ API Framework Detectors
|
|
3
|
+
*
|
|
4
|
+
* Exports all C++ web framework detectors.
|
|
5
|
+
*
|
|
6
|
+
* @license Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
export { QtNetworkDetector, createQtNetworkDetector } from './qt-network-detector.js';
|
|
9
|
+
export { CrowDetector, createCrowDetector } from './crow-detector.js';
|
|
10
|
+
export { BoostBeastDetector, createBoostBeastDetector } from './boost-beast-detector.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/cpp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C++ API Framework Detectors
|
|
3
|
+
*
|
|
4
|
+
* Exports all C++ web framework detectors.
|
|
5
|
+
*
|
|
6
|
+
* @license Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
export { QtNetworkDetector, createQtNetworkDetector } from './qt-network-detector.js';
|
|
9
|
+
export { CrowDetector, createCrowDetector } from './crow-detector.js';
|
|
10
|
+
export { BoostBeastDetector, createBoostBeastDetector } from './boost-beast-detector.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/cpp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qt Network Framework Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects Qt Network HTTP patterns in C++ code:
|
|
5
|
+
* - QNetworkAccessManager requests
|
|
6
|
+
* - QNetworkReply handling
|
|
7
|
+
* - REST API patterns
|
|
8
|
+
* - WebSocket connections
|
|
9
|
+
*
|
|
10
|
+
* @license Apache-2.0
|
|
11
|
+
*/
|
|
12
|
+
import type { Violation, QuickFix, Language } from 'driftdetect-core';
|
|
13
|
+
import { RegexDetector, type DetectionContext, type DetectionResult } from '../../base/index.js';
|
|
14
|
+
export interface QtNetworkRequest {
|
|
15
|
+
method: string;
|
|
16
|
+
line: number;
|
|
17
|
+
column: number;
|
|
18
|
+
hasCallback: boolean;
|
|
19
|
+
isAsync: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class QtNetworkDetector extends RegexDetector {
|
|
22
|
+
readonly id = "api/cpp/qt-network";
|
|
23
|
+
readonly category: "api";
|
|
24
|
+
readonly subcategory = "http-client";
|
|
25
|
+
readonly name = "Qt Network Detector";
|
|
26
|
+
readonly description = "Detects Qt Network HTTP patterns in C++ code";
|
|
27
|
+
readonly supportedLanguages: Language[];
|
|
28
|
+
generateQuickFix(_violation: Violation): QuickFix | null;
|
|
29
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
30
|
+
private isCppFile;
|
|
31
|
+
private usesQtNetwork;
|
|
32
|
+
private detectNetworkManager;
|
|
33
|
+
private detectHttpRequests;
|
|
34
|
+
private detectReplyHandling;
|
|
35
|
+
private detectWebSocket;
|
|
36
|
+
private calculateConfidence;
|
|
37
|
+
}
|
|
38
|
+
export declare function createQtNetworkDetector(): QtNetworkDetector;
|
|
39
|
+
//# sourceMappingURL=qt-network-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qt-network-detector.d.ts","sourceRoot":"","sources":["../../../src/api/cpp/qt-network-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAgB,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMjG,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,QAAQ,CAAC,EAAE,wBAAwB;IACnC,QAAQ,CAAC,QAAQ,EAAG,KAAK,CAAU;IACnC,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,IAAI,yBAAyB;IACtC,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAW;IAElD,gBAAgB,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI;IAIlD,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BjE,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,kBAAkB;IAyD1B,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,mBAAmB;CAI5B;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
|