Skip to content

Commit b682290

Browse files
committed
chore: remove Go comments across codebase (preserving //go: directives and build tags)
1 parent dda8a26 commit b682290

30 files changed

Lines changed: 1168 additions & 1417 deletions

analyzer/aapt2_extractor.go

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,21 @@ func (a *AAPT2Extractor) ExtractMetadata(ctx context.Context, apkPath string) (*
3838

3939
metadata := &models.AAPT2Metadata{}
4040

41-
// Extract badging information (comprehensive metadata)
4241
badgingData, err := a.ExtractBadging(ctx, apkPath)
4342
if err == nil {
4443
metadata.Badging = badgingData
4544
}
4645

47-
// Extract package name
4846
packageName, err := a.ExtractPackageName(ctx, apkPath)
4947
if err == nil {
5048
metadata.PackageName = packageName
5149
}
5250

53-
// Extract permissions
5451
permissions, err := a.ExtractPermissions(ctx, apkPath)
5552
if err == nil {
5653
metadata.Permissions = permissions
5754
}
5855

59-
// Extract strings
6056
strings, err := a.ExtractStrings(ctx, apkPath)
6157
if err == nil {
6258
metadata.ExtractedStrings = strings
@@ -100,7 +96,6 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
10096
for _, line := range lines {
10197
line = strings.TrimSpace(line)
10298

103-
// Parse package line
10499
if strings.HasPrefix(line, "package:") {
105100
badging.PackageName = extractQuotedValue(line, "name=")
106101
badging.VersionCode = extractQuotedValue(line, "versionCode=")
@@ -111,22 +106,18 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
111106
badging.CompileSdkVersionCodename = extractQuotedValue(line, "compileSdkVersionCodename=")
112107
}
113108

114-
// Parse sdkVersion line
115109
if strings.HasPrefix(line, "sdkVersion:") {
116110
badging.MinSdkVersion = strings.Trim(strings.TrimPrefix(line, "sdkVersion:"), "'\"")
117111
}
118112

119-
// Parse targetSdkVersion line
120113
if strings.HasPrefix(line, "targetSdkVersion:") {
121114
badging.TargetSdkVersion = strings.Trim(strings.TrimPrefix(line, "targetSdkVersion:"), "'\"")
122115
}
123116

124-
// Parse application label
125117
if strings.HasPrefix(line, "application-label:") {
126118
badging.ApplicationLabel = strings.Trim(strings.TrimPrefix(line, "application-label:"), "'\"")
127119
}
128120

129-
// Parse application icon
130121
if strings.HasPrefix(line, "application-icon-") {
131122
parts := strings.SplitN(line, ":", 2)
132123
if len(parts) == 2 {
@@ -139,28 +130,24 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
139130
}
140131
}
141132

142-
// Parse launchable activity
143133
if strings.HasPrefix(line, "launchable-activity:") {
144134
badging.LaunchableActivity = extractQuotedValue(line, "name=")
145135
}
146136

147-
// Parse uses-permission
148137
if strings.HasPrefix(line, "uses-permission:") {
149138
permission := extractQuotedValue(line, "name=")
150139
if permission != "" {
151140
badging.UsesPermissions = append(badging.UsesPermissions, permission)
152141
}
153142
}
154143

155-
// Parse uses-feature
156144
if strings.HasPrefix(line, "uses-feature:") {
157145
feature := extractQuotedValue(line, "name=")
158146
if feature != "" {
159147
badging.UsesFeatures = append(badging.UsesFeatures, feature)
160148
}
161149
}
162150

163-
// Parse native code architectures
164151
if strings.HasPrefix(line, "native-code:") {
165152
archStr := strings.TrimPrefix(line, "native-code:")
166153
archStr = strings.Trim(archStr, "'\" ")
@@ -169,7 +156,6 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
169156
}
170157
}
171158

172-
// Parse locales
173159
if strings.HasPrefix(line, "locales:") {
174160
localeStr := strings.TrimPrefix(line, "locales:")
175161
localeStr = strings.Trim(localeStr, "'\" ")
@@ -178,7 +164,6 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
178164
}
179165
}
180166

181-
// Parse densities
182167
if strings.HasPrefix(line, "densities:") {
183168
densityStr := strings.TrimPrefix(line, "densities:")
184169
densityStr = strings.Trim(densityStr, "'\" ")
@@ -187,7 +172,6 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
187172
}
188173
}
189174

190-
// Parse supports-screens
191175
if strings.HasPrefix(line, "supports-screens:") {
192176
screenStr := strings.TrimPrefix(line, "supports-screens:")
193177
screenStr = strings.Trim(screenStr, "'\" ")
@@ -196,7 +180,6 @@ func (a *AAPT2Extractor) parseBadging(output string) *models.AAPT2BadgingInfo {
196180
}
197181
}
198182

199-
// Parse supports-any-density
200183
if strings.HasPrefix(line, "supports-any-density:") {
201184
denseStr := strings.TrimPrefix(line, "supports-any-density:")
202185
denseStr = strings.Trim(denseStr, "'\" ")
@@ -245,7 +228,7 @@ func (a *AAPT2Extractor) ExtractPermissions(ctx context.Context, apkPath string)
245228
for _, line := range lines {
246229
line = strings.TrimSpace(line)
247230
if line != "" && !strings.HasPrefix(line, "package:") {
248-
// Remove "permission: " prefix if present
231+
249232
line = strings.TrimPrefix(line, "permission: ")
250233
permissions = append(permissions, line)
251234
}
@@ -280,8 +263,6 @@ func (a *AAPT2Extractor) ExtractStrings(ctx context.Context, apkPath string) ([]
280263
continue
281264
}
282265

283-
// Parse string format: String #123: value
284-
// or just raw string values
285266
parts := strings.SplitN(line, ":", 2)
286267
var value string
287268
if len(parts) == 2 {
@@ -290,10 +271,8 @@ func (a *AAPT2Extractor) ExtractStrings(ctx context.Context, apkPath string) ([]
290271
value = line
291272
}
292273

293-
// Clean up the value
294274
value = strings.Trim(value, "\"'")
295-
296-
// Skip empty strings and duplicates
275+
297276
if value != "" && !seen[value] {
298277
seen[value] = true
299278
extractedStrings = append(extractedStrings, value)
@@ -305,21 +284,19 @@ func (a *AAPT2Extractor) ExtractStrings(ctx context.Context, apkPath string) ([]
305284

306285
// extractQuotedValue extracts a value from a key='value' or key="value" pattern
307286
func extractQuotedValue(line, key string) string {
308-
// Try single quotes first
287+
309288
pattern := regexp.MustCompile(key + `'([^']*)'`)
310289
matches := pattern.FindStringSubmatch(line)
311290
if len(matches) > 1 {
312291
return matches[1]
313292
}
314293

315-
// Try double quotes
316294
pattern = regexp.MustCompile(key + `"([^"]*)"`)
317295
matches = pattern.FindStringSubmatch(line)
318296
if len(matches) > 1 {
319297
return matches[1]
320298
}
321299

322-
// Try without quotes (for numeric values)
323300
pattern = regexp.MustCompile(key + `'?([^'\s]+)'?`)
324301
matches = pattern.FindStringSubmatch(line)
325302
if len(matches) > 1 {

analyzer/advanced_detectors.go

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,16 @@ func (a *Analyzer) detectNetworkSecurity(decompDir string) *models.NetworkSecuri
2525

2626
contentStr := strings.ToLower(string(content))
2727

28-
// Check for cleartext traffic
2928
if strings.Contains(contentStr, "cleartexttrafficpermitted=\"true\"") {
3029
config.CleartextAllowed = true
3130
config.Risks = append(config.Risks, "Cleartext (HTTP) traffic is permitted - data can be intercepted")
3231
}
3332

34-
// Check for certificate pinning
3533
if strings.Contains(contentStr, "<pin-set>") || strings.Contains(contentStr, "<pin ") {
3634
config.CertificatePinning = true
3735
config.SecurityFeatures = append(config.SecurityFeatures, "Certificate pinning enabled")
3836
}
3937

40-
// Check for trust anchors
4138
if strings.Contains(contentStr, "<trust-anchors>") {
4239
if strings.Contains(contentStr, "user") {
4340
config.TrustsUserCerts = true
@@ -48,7 +45,6 @@ func (a *Analyzer) detectNetworkSecurity(decompDir string) *models.NetworkSecuri
4845
}
4946
}
5047

51-
// Extract domain configs
5248
domainRegex := regexp.MustCompile(`<domain[^>]*>([^<]+)</domain>`)
5349
for _, match := range domainRegex.FindAllStringSubmatch(string(content), -1) {
5450
if len(match) > 1 {
@@ -98,13 +94,11 @@ func (a *Analyzer) detectDataStorage(contentStr string) *models.DataStorageAnaly
9894
}
9995
}
10096

101-
// Check for database encryption
10297
if strings.Contains(contentStr, "SQLCipher") || strings.Contains(contentStr, "encrypted") {
10398
analysis.DatabaseEncryption = true
10499
analysis.SecurityNotes = append(analysis.SecurityNotes, "Database encryption detected")
105100
}
106101

107-
// Check for backup flags
108102
if strings.Contains(contentStr, "allowBackup=\"true\"") {
109103
analysis.BackupAllowed = true
110104
analysis.SecurityNotes = append(analysis.SecurityNotes, "App data backup is allowed - sensitive data may be extracted")
@@ -151,7 +145,6 @@ func (a *Analyzer) detectWebViewSecurity(contentStr string) *models.WebViewSecur
151145
}
152146
}
153147

154-
// Check for secure settings
155148
secureSettings := []string{
156149
"setAllowFileAccess(false)",
157150
"setJavaScriptEnabled(false)",
@@ -171,14 +164,12 @@ func (a *Analyzer) detectWebViewSecurity(contentStr string) *models.WebViewSecur
171164
func (a *Analyzer) detectObfuscation(contentStr string, decompDir string) *models.ObfuscationAnalysis {
172165
analysis := &models.ObfuscationAnalysis{}
173166

174-
// Check for ProGuard/R8 mapping
175167
mappingPath := filepath.Join(decompDir, "mapping.txt")
176168
if _, err := os.Stat(mappingPath); err == nil {
177169
analysis.ProGuardDetected = true
178170
analysis.MappingFileFound = true
179171
}
180172

181-
// Heuristics for obfuscation
182173
shortNamePattern := regexp.MustCompile(`\b[a-z]\.[a-z]\.[a-z]\b`)
183174
shortNames := shortNamePattern.FindAllString(contentStr, -1)
184175
if len(shortNames) > 100 {
@@ -187,7 +178,6 @@ func (a *Analyzer) detectObfuscation(contentStr string, decompDir string) *model
187178
analysis.Indicators = append(analysis.Indicators, fmt.Sprintf("Found %d short class names (a.b.c pattern)", len(shortNames)))
188179
}
189180

190-
// Check for string encryption
191181
stringEncPatterns := []string{
192182
"decrypt",
193183
"deobfuscate",
@@ -203,7 +193,6 @@ func (a *Analyzer) detectObfuscation(contentStr string, decompDir string) *model
203193
}
204194
}
205195

206-
// Check for native library obfuscation
207196
if strings.Contains(contentStr, "UPX") {
208197
analysis.NativeObfuscation = true
209198
analysis.Indicators = append(analysis.Indicators, "UPX packer detected in native libraries")
@@ -217,7 +206,7 @@ func (a *Analyzer) detectDeepLinks(decompDir string) *models.DeepLinkAnalysis {
217206
manifestPath := filepath.Join(decompDir, "AndroidManifest.xml")
218207
content, err := os.ReadFile(manifestPath)
219208
if err != nil {
220-
// Try alternate location
209+
221210
manifestPath = filepath.Join(decompDir, "resources", "AndroidManifest.xml")
222211
content, err = os.ReadFile(manifestPath)
223212
if err != nil {
@@ -228,7 +217,6 @@ func (a *Analyzer) detectDeepLinks(decompDir string) *models.DeepLinkAnalysis {
228217
analysis := &models.DeepLinkAnalysis{}
229218
contentStr := string(content)
230219

231-
// Extract intent filters with data schemes
232220
schemeRegex := regexp.MustCompile(`android:scheme="([^"]+)"`)
233221
hostRegex := regexp.MustCompile(`android:host="([^"]+)"`)
234222
pathRegex := regexp.MustCompile(`android:path(?:Pattern|Prefix)?="([^"]+)"`)
@@ -255,11 +243,10 @@ func (a *Analyzer) detectDeepLinks(decompDir string) *models.DeepLinkAnalysis {
255243
}
256244
}
257245

258-
// Build example deep links
259246
if len(analysis.Schemes) > 0 && len(analysis.Hosts) > 0 {
260247
for i, scheme := range analysis.Schemes {
261248
if i >= 3 {
262-
break // Limit examples
249+
break
263250
}
264251
for j, host := range analysis.Hosts {
265252
if j >= 2 {
@@ -276,7 +263,6 @@ func (a *Analyzer) detectDeepLinks(decompDir string) *models.DeepLinkAnalysis {
276263
}
277264
}
278265

279-
// Check for App Links verification
280266
if strings.Contains(contentStr, "autoVerify=\"true\"") {
281267
analysis.AppLinksVerified = true
282268
analysis.SecurityNotes = append(analysis.SecurityNotes, "App Links auto-verification enabled")
@@ -296,46 +282,38 @@ func (a *Analyzer) detectThirdPartySDKs(packages []models.Package, contentStr st
296282
}
297283

298284
sdkDatabase := map[string]models.SDKInfo{
299-
// Analytics
285+
300286
"firebase_analytics": {Name: "Firebase Analytics", Category: "Analytics", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"Device info", "Usage patterns", "Crash data"}},
301287
"google_analytics": {Name: "Google Analytics", Category: "Analytics", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"User behavior", "Demographics", "Events"}},
302288
"mixpanel": {Name: "Mixpanel", Category: "Analytics", Vendor: "Mixpanel", PrivacyImpact: "High", DataCollected: []string{"User events", "User properties", "Behavioral data"}},
303289
"amplitude": {Name: "Amplitude", Category: "Analytics", Vendor: "Amplitude", PrivacyImpact: "High", DataCollected: []string{"Event tracking", "User segmentation"}},
304290

305-
// Advertising
306291
"google_mobile_ads": {Name: "Google Mobile Ads (AdMob)", Category: "Advertising", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"Advertising ID", "Location", "Device info"}},
307292
"facebook_audience_network": {Name: "Facebook Audience Network", Category: "Advertising", Vendor: "Meta", PrivacyImpact: "High", DataCollected: []string{"User profile", "Device ID", "Location"}},
308293
"unity_ads": {Name: "Unity Ads", Category: "Advertising", Vendor: "Unity", PrivacyImpact: "Medium", DataCollected: []string{"Device info", "Ad interactions"}},
309294

310-
// Crash Reporting
311295
"sentry": {Name: "Sentry", Category: "Crash Reporting", Vendor: "Sentry", PrivacyImpact: "Medium", DataCollected: []string{"Crash logs", "Stack traces", "Device state"}},
312296
"firebase_crashlytics": {Name: "Firebase Crashlytics", Category: "Crash Reporting", Vendor: "Google", PrivacyImpact: "Medium", DataCollected: []string{"Crash data", "Device info"}},
313297
"bugsnag": {Name: "Bugsnag", Category: "Crash Reporting", Vendor: "Bugsnag", PrivacyImpact: "Medium", DataCollected: []string{"Error logs", "User context"}},
314298

315-
// Authentication
316299
"firebase_auth": {Name: "Firebase Authentication", Category: "Authentication", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"Email", "Phone", "Auth tokens"}},
317300
"google_sign_in": {Name: "Google Sign-In", Category: "Authentication", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"Google profile", "Email"}},
318301
"flutter_facebook_auth": {Name: "Facebook Login", Category: "Authentication", Vendor: "Meta", PrivacyImpact: "High", DataCollected: []string{"Facebook profile", "Email", "Friends list"}},
319302

320-
// Payment
321303
"stripe": {Name: "Stripe", Category: "Payment", Vendor: "Stripe", PrivacyImpact: "High", DataCollected: []string{"Payment info", "Billing address", "Transaction history"}, RequiresCompliance: []string{"PCI-DSS"}},
322304
"razorpay": {Name: "Razorpay", Category: "Payment", Vendor: "Razorpay", PrivacyImpact: "High", DataCollected: []string{"Payment details", "Contact info"}},
323305
"paypal": {Name: "PayPal", Category: "Payment", Vendor: "PayPal", PrivacyImpact: "High", DataCollected: []string{"Payment info", "Transaction data"}},
324306

325-
// Social
326307
"share_plus": {Name: "Share Plus", Category: "Social", Vendor: "Community", PrivacyImpact: "Low", DataCollected: []string{"Shared content"}},
327308
"flutter_facebook_sdk": {Name: "Facebook SDK", Category: "Social", Vendor: "Meta", PrivacyImpact: "High", DataCollected: []string{"User interactions", "Device info"}},
328309

329-
// Location
330310
"geolocator": {Name: "Geolocator", Category: "Location", Vendor: "Community", PrivacyImpact: "High", DataCollected: []string{"GPS coordinates", "Location history"}},
331311
"google_maps_flutter": {Name: "Google Maps", Category: "Maps", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"Location", "Search queries", "Navigation history"}},
332312

333-
// Storage/Database
334313
"sqflite": {Name: "SQFlite", Category: "Storage", Vendor: "Community", PrivacyImpact: "Low", DataCollected: []string{"Local data only"}},
335314
"hive": {Name: "Hive", Category: "Storage", Vendor: "Community", PrivacyImpact: "Low", DataCollected: []string{"Local data only"}},
336315
"cloud_firestore": {Name: "Cloud Firestore", Category: "Database", Vendor: "Google", PrivacyImpact: "High", DataCollected: []string{"User data", "Database queries"}},
337316

338-
// Push Notifications
339317
"firebase_messaging": {Name: "Firebase Cloud Messaging", Category: "Push Notifications", Vendor: "Google", PrivacyImpact: "Medium", DataCollected: []string{"Device tokens", "Message data"}},
340318
"onesignal": {Name: "OneSignal", Category: "Push Notifications", Vendor: "OneSignal", PrivacyImpact: "Medium", DataCollected: []string{"Device info", "Notification preferences"}},
341319
}
@@ -356,7 +334,6 @@ func (a *Analyzer) detectThirdPartySDKs(packages []models.Package, contentStr st
356334
}
357335
}
358336

359-
// Calculate privacy score (0-100, lower is better for privacy)
360337
if analysis.TotalSDKs > 0 {
361338
analysis.PrivacyScore = analysis.HighPrivacyImpactCount * 20
362339
if analysis.PrivacyScore > 100 {

0 commit comments

Comments
 (0)