rea-agents 6.0.0 → 6.2.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/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -26,15 +26,21 @@ export const analyzeAppleAssetCatalogs = async (input) => {
|
|
|
26
26
|
const page = appleAssetCatalogInputSchema.parse(input.page ?? {});
|
|
27
27
|
const reader = new DirectoryArtifactReader(input.bundlePath);
|
|
28
28
|
const catalogs = [];
|
|
29
|
+
const uninspected = [];
|
|
29
30
|
let totalMetadataBytes = 0;
|
|
30
31
|
try {
|
|
31
32
|
for await (const entry of reader.entries(input.signal)) {
|
|
32
|
-
if (
|
|
33
|
+
if (!entry.path.endsWith("Assets.car"))
|
|
33
34
|
continue;
|
|
35
|
+
if (entry.kind !== "file") {
|
|
36
|
+
uninspected.push(`${entry.path} (${entry.kind})`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
34
39
|
const inspected = await inspectAssetCatalogEntry({
|
|
35
40
|
reader,
|
|
36
41
|
entry,
|
|
37
|
-
runAssetUtil: input.runAssetUtil ??
|
|
42
|
+
runAssetUtil: input.runAssetUtil ??
|
|
43
|
+
((path, signal) => runAssetUtil(path, input.environment, signal)),
|
|
38
44
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
39
45
|
});
|
|
40
46
|
totalMetadataBytes += inspected.metadataBytes;
|
|
@@ -46,8 +52,10 @@ export const analyzeAppleAssetCatalogs = async (input) => {
|
|
|
46
52
|
finally {
|
|
47
53
|
await reader.close();
|
|
48
54
|
}
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
// Without any readable catalog, unmatched resource keys would overstate an
|
|
56
|
+
// absence that a skipped catalog entry may contradict.
|
|
57
|
+
if (catalogs.length === 0 && uninspected.length > 0)
|
|
58
|
+
throw new ArtifactReaderFailure("path", `Asset catalog entries are not regular files and were not inspected: ${uninspected.join(", ")}`);
|
|
51
59
|
const interfaceBuilder = await analyzeInterfaceBuilderBundle({
|
|
52
60
|
bundlePath: input.bundlePath,
|
|
53
61
|
targetSha256: input.targetSha256,
|
|
@@ -65,6 +73,18 @@ export const analyzeAppleAssetCatalogs = async (input) => {
|
|
|
65
73
|
...result,
|
|
66
74
|
limitations: [
|
|
67
75
|
...result.limitations,
|
|
76
|
+
// An app without a compiled catalog is an observed empty inventory, not
|
|
77
|
+
// a missing host tool.
|
|
78
|
+
...(catalogs.length === 0
|
|
79
|
+
? [
|
|
80
|
+
"No compiled Assets.car catalog was found among the app bundle's regular files (symlinks are not followed); any resource keys are reported as unmatched.",
|
|
81
|
+
]
|
|
82
|
+
: []),
|
|
83
|
+
...(uninspected.length === 0
|
|
84
|
+
? []
|
|
85
|
+
: [
|
|
86
|
+
`Asset catalog entries that are not regular files were not inspected, so resource keys reported as unmatched may resolve there: ${uninspected.join(", ")}`,
|
|
87
|
+
]),
|
|
68
88
|
"Exact resource-key joins use only recognized image or asset key fields on decoded Interface Builder resource objects; other archive resource references are not inferred.",
|
|
69
89
|
...(interfaceBuilder.graph.truncated
|
|
70
90
|
? [
|
|
@@ -131,9 +151,10 @@ export const collectInterfaceBuilderResourceKeys = (nodes) => nodes.flatMap((nod
|
|
|
131
151
|
]
|
|
132
152
|
: []);
|
|
133
153
|
});
|
|
134
|
-
const runAssetUtil = async (path, signal) => {
|
|
154
|
+
const runAssetUtil = async (path, environment, signal) => {
|
|
135
155
|
try {
|
|
136
156
|
return (await execFileOutput(ASSETUTIL, ["--info", path], {
|
|
157
|
+
env: environment,
|
|
137
158
|
timeout: 60_000,
|
|
138
159
|
maxBuffer: MAX_CATALOG_BYTES,
|
|
139
160
|
...(signal === undefined ? {} : { signal }),
|
|
@@ -2,11 +2,14 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { lstat, open, readlink, realpath } from "node:fs/promises";
|
|
4
4
|
import { join, relative, sep } from "node:path";
|
|
5
|
+
import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
|
|
5
6
|
import { resolveTreePath } from "../../domain/apple/dyldPaths.js";
|
|
6
7
|
import { dylibResolutionInputSchema, dylibResolutionResultSchema, traceDylibLoading, } from "../../domain/apple/dylibResolution.js";
|
|
8
|
+
import { projectInputIssues } from "../../domain/inputIssueProjection.js";
|
|
7
9
|
import { ArtifactReaderFailure } from "../ArtifactReader.js";
|
|
8
10
|
import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
|
|
9
11
|
import { hasMachoMagic, readMachoImage } from "./MachoLoadCommandReader.js";
|
|
12
|
+
const OPERATION = "trace_dylib_resolution";
|
|
10
13
|
const HASH_CHUNK_BYTES = 1024 * 1024;
|
|
11
14
|
/** Lazily probed, symlink-preserving view of one analyzed directory. */
|
|
12
15
|
class FilesystemTreeView {
|
|
@@ -64,7 +67,7 @@ class FilesystemTreeView {
|
|
|
64
67
|
export const traceDylibResolution = async (options) => {
|
|
65
68
|
const parsed = dylibResolutionInputSchema.safeParse(options.parameters);
|
|
66
69
|
if (!parsed.success)
|
|
67
|
-
throw new
|
|
70
|
+
throw new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, options.parameters));
|
|
68
71
|
// Canonicalization is inside the translated region: a revoked permission
|
|
69
72
|
// keeps its reason and path.
|
|
70
73
|
let root = options.rootPath;
|
|
@@ -79,7 +82,7 @@ export const traceDylibResolution = async (options) => {
|
|
|
79
82
|
: options.enumerateRoots
|
|
80
83
|
? await executableRoots(root, view, options.signal)
|
|
81
84
|
: { roots: [target], unclassified: [] };
|
|
82
|
-
const roots = await requireMachoRoots(view, requested);
|
|
85
|
+
const roots = await requireMachoRoots(view, requested, parsed.data.roots !== undefined);
|
|
83
86
|
const trace = await traceDylibLoading(view, {
|
|
84
87
|
roots,
|
|
85
88
|
unclassified,
|
|
@@ -151,17 +154,24 @@ const compare = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
|
151
154
|
/**
|
|
152
155
|
* Resolve each root segment by segment, as dependency candidates are, so a
|
|
153
156
|
* symlink in an intermediate directory cannot lead outside the analyzed root.
|
|
157
|
+
* A root the caller selected that fails is an input error on that root; a
|
|
158
|
+
* root REA derived itself keeps reporting an artifact failure.
|
|
154
159
|
*/
|
|
155
|
-
const requireMachoRoots = async (view, roots) => {
|
|
160
|
+
const requireMachoRoots = async (view, roots, callerSelected) => {
|
|
156
161
|
const resolved = [];
|
|
157
|
-
for (const path of roots) {
|
|
162
|
+
for (const [index, path] of roots.entries()) {
|
|
163
|
+
const reject = (reason, message) => callerSelected
|
|
164
|
+
? new AnalysisInputError(OPERATION, undefined, [
|
|
165
|
+
{ path: ["roots", index], reason: "invalid_value", message },
|
|
166
|
+
])
|
|
167
|
+
: new ArtifactReaderFailure(reason, message);
|
|
158
168
|
const lookup = await resolveTreePath(view, path);
|
|
159
169
|
if (lookup.kind === "escapes")
|
|
160
|
-
throw
|
|
170
|
+
throw reject("path", `Root ${path} resolves outside the analyzed root`);
|
|
161
171
|
if (lookup.kind !== "file")
|
|
162
|
-
throw
|
|
172
|
+
throw reject("path", `Root ${path} is not a regular file in the analyzed root`);
|
|
163
173
|
if ((await view.image(lookup.path)).status === "not-mach-o")
|
|
164
|
-
throw
|
|
174
|
+
throw reject("format", `Root ${path} is not a Mach-O image`);
|
|
165
175
|
if (!resolved.includes(lookup.path))
|
|
166
176
|
resolved.push(lookup.path);
|
|
167
177
|
}
|
|
@@ -4,36 +4,72 @@ import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
|
|
|
4
4
|
import { projectPlistValue } from "../../domain/apple/plistValue.js";
|
|
5
5
|
import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../../domain/propertyListKeys.js";
|
|
6
6
|
import { decodeNibArchive } from "./NibArchive.js";
|
|
7
|
+
import { estimatePropertyListDecodeBytes, InterfaceBuilderDecodeBudget, InterfaceBuilderDecodeBudgetExceeded, } from "./InterfaceBuilderDecodeBudget.js";
|
|
7
8
|
import { buildInterfaceBuilderAnalysis, interfaceBuilderLimitsSchema, } from "../../domain/apple/interfaceBuilderGraph.js";
|
|
8
9
|
import { mergeNibHierarchies, projectNibViewHierarchy, } from "./NibViewHierarchy.js";
|
|
9
10
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
10
|
-
|
|
11
|
+
import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
|
|
12
|
+
const MAX_AGGREGATE_INPUT_BYTES = 32 * 1024 * 1024;
|
|
13
|
+
const MAX_AGGREGATE_DECODE_BYTES = 256 * 1024 * 1024;
|
|
14
|
+
const MAX_REPORTED_OMITTED_ARCHIVES = 64;
|
|
11
15
|
/** Decode compiled Interface Builder archives from a local app bundle. */
|
|
12
16
|
export const analyzeInterfaceBuilderBundle = async (input) => {
|
|
13
17
|
const limits = interfaceBuilderLimitsSchema.parse(input.limits ?? {});
|
|
14
18
|
const reader = new DirectoryArtifactReader(input.bundlePath);
|
|
15
19
|
const documents = [];
|
|
16
20
|
const invalid = [];
|
|
21
|
+
const omittedArchives = [];
|
|
22
|
+
let unreportedOmittedArchives = 0;
|
|
17
23
|
const incompleteHierarchies = new Map();
|
|
18
24
|
const prototypeKeyOmissions = new Map();
|
|
19
25
|
let omitted = 0;
|
|
20
26
|
let attempted = 0;
|
|
27
|
+
let candidates = 0;
|
|
28
|
+
let aggregateInputBytes = 0;
|
|
29
|
+
const decodeBudget = new InterfaceBuilderDecodeBudget(MAX_AGGREGATE_DECODE_BYTES);
|
|
30
|
+
const recordOmittedArchive = (path, reason) => {
|
|
31
|
+
if (omittedArchives.length < MAX_REPORTED_OMITTED_ARCHIVES)
|
|
32
|
+
omittedArchives.push({ path, reason });
|
|
33
|
+
else
|
|
34
|
+
unreportedOmittedArchives += 1;
|
|
35
|
+
};
|
|
21
36
|
try {
|
|
22
37
|
for await (const entry of reader.entries(input.signal)) {
|
|
23
38
|
if (entry.kind !== "file" || !isInterfaceBuilderArchive(entry.path))
|
|
24
39
|
continue;
|
|
25
|
-
|
|
40
|
+
candidates += 1;
|
|
41
|
+
if (candidates > limits.max_documents) {
|
|
26
42
|
omitted += 1;
|
|
43
|
+
recordOmittedArchive(entry.path, "max_documents");
|
|
27
44
|
continue;
|
|
28
45
|
}
|
|
29
|
-
attempted += 1;
|
|
30
46
|
try {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
47
|
+
const remainingInputBytes = MAX_AGGREGATE_INPUT_BYTES - aggregateInputBytes;
|
|
48
|
+
if (entry.declaredSize !== null &&
|
|
49
|
+
entry.declaredSize > remainingInputBytes) {
|
|
50
|
+
omitted += 1;
|
|
51
|
+
recordOmittedArchive(entry.path, "aggregate_decode_budget_exhausted");
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
attempted += 1;
|
|
55
|
+
const bytes = await readEntry(reader, entry, input.signal, remainingInputBytes);
|
|
56
|
+
aggregateInputBytes += bytes.length;
|
|
57
|
+
const isNibArchive = bytes.subarray(0, 10).toString("ascii") === "NIBArchive";
|
|
58
|
+
let nib = null;
|
|
59
|
+
let xmlText;
|
|
60
|
+
if (isNibArchive) {
|
|
61
|
+
const documentBudget = new InterfaceBuilderDecodeBudget(decodeBudget.remainingBytes);
|
|
62
|
+
nib = projectNibArchive(decodeNibArchive(bytes, documentBudget), documentBudget, limits.max_objects);
|
|
63
|
+
decodeBudget.reserve(documentBudget.usedBytes, "NIBArchive representation exceeds the aggregate Interface Builder decode budget");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
if (bytes.subarray(0, 8).toString("ascii") !== "bplist00")
|
|
67
|
+
xmlText = decodeXmlPlistText(bytes);
|
|
68
|
+
const decodedReservation = estimatePropertyListDecodeBytes(bytes, decodeBudget.remainingBytes, xmlText);
|
|
69
|
+
decodeBudget.reserve(decodedReservation, "plist representation exceeds the aggregate Interface Builder decode budget");
|
|
70
|
+
}
|
|
35
71
|
const { value: raw, omittedPrototypeKeys } = nib === null
|
|
36
|
-
? decodePlist(bytes)
|
|
72
|
+
? decodePlist(bytes, xmlText)
|
|
37
73
|
: { value: nib.raw, omittedPrototypeKeys: 0 };
|
|
38
74
|
if (nib !== null && nib.omitted > 0)
|
|
39
75
|
incompleteHierarchies.set(entry.path, nib.omitted);
|
|
@@ -52,6 +88,11 @@ export const analyzeInterfaceBuilderBundle = async (input) => {
|
|
|
52
88
|
catch (cause) {
|
|
53
89
|
if (input.signal?.aborted === true)
|
|
54
90
|
throw cause;
|
|
91
|
+
if (cause instanceof InterfaceBuilderDecodeBudgetExceeded) {
|
|
92
|
+
omitted += 1;
|
|
93
|
+
recordOmittedArchive(entry.path, cause.reason);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
55
96
|
invalid.push(`${entry.path}: ${cause instanceof Error ? cause.message : "archive decode failed"}`);
|
|
56
97
|
}
|
|
57
98
|
}
|
|
@@ -69,13 +110,17 @@ export const analyzeInterfaceBuilderBundle = async (input) => {
|
|
|
69
110
|
incompleteHierarchies,
|
|
70
111
|
prototypeKeyOmissions,
|
|
71
112
|
invalid,
|
|
113
|
+
omittedArchives,
|
|
114
|
+
unreportedOmittedArchives,
|
|
72
115
|
attempted,
|
|
73
116
|
omitted,
|
|
74
117
|
});
|
|
75
118
|
};
|
|
76
119
|
const finalizeHierarchyCoverage = (result, counts) => {
|
|
77
|
-
const { incompleteHierarchies, prototypeKeyOmissions, invalid } = counts;
|
|
78
|
-
const archiveDecodePartial = invalid.length > 0 ||
|
|
120
|
+
const { incompleteHierarchies, prototypeKeyOmissions, invalid, omittedArchives, unreportedOmittedArchives, } = counts;
|
|
121
|
+
const archiveDecodePartial = invalid.length > 0 ||
|
|
122
|
+
prototypeKeyOmissions.size > 0 ||
|
|
123
|
+
omittedArchives.length > 0;
|
|
79
124
|
return {
|
|
80
125
|
...result,
|
|
81
126
|
documents: result.documents.map((document) => ({
|
|
@@ -102,11 +147,17 @@ const finalizeHierarchyCoverage = (result, counts) => {
|
|
|
102
147
|
status: archiveDecodePartial
|
|
103
148
|
? "partial"
|
|
104
149
|
: "complete",
|
|
105
|
-
reason:
|
|
106
|
-
? "
|
|
107
|
-
:
|
|
108
|
-
? "
|
|
109
|
-
:
|
|
150
|
+
reason: omittedArchives.some(({ reason }) => reason === "aggregate_decode_budget_exhausted")
|
|
151
|
+
? "aggregate_decode_budget_exhausted"
|
|
152
|
+
: omittedArchives.some(({ reason }) => reason === "max_documents")
|
|
153
|
+
? "document_limit_reached"
|
|
154
|
+
: omittedArchives.length > 0
|
|
155
|
+
? "archive_decode_budget_exhausted"
|
|
156
|
+
: invalid.length > 0
|
|
157
|
+
? "one_or_more_archives_invalid"
|
|
158
|
+
: prototypeKeyOmissions.size > 0
|
|
159
|
+
? "dictionary_entries_omitted"
|
|
160
|
+
: null,
|
|
110
161
|
examined: counts.attempted,
|
|
111
162
|
omitted: counts.omitted,
|
|
112
163
|
},
|
|
@@ -130,27 +181,70 @@ const finalizeHierarchyCoverage = (result, counts) => {
|
|
|
130
181
|
`Some Interface Builder archives could not be decoded: ${invalid.slice(0, 16).join("; ")}`,
|
|
131
182
|
]),
|
|
132
183
|
...[...prototypeKeyOmissions].map(([path, count]) => `${path}: ${omittedPrototypeKeysLimitation(count)}`),
|
|
184
|
+
...omittedArchives.map(({ path, reason }) => `${path}: omitted because ${reason.replaceAll("_", " ")}.`),
|
|
185
|
+
...(unreportedOmittedArchives === 0
|
|
186
|
+
? []
|
|
187
|
+
: [
|
|
188
|
+
`${unreportedOmittedArchives} additional omitted archive path(s) and their reasons were not retained; reporting is bounded to ${MAX_REPORTED_OMITTED_ARCHIVES} paths.`,
|
|
189
|
+
]),
|
|
133
190
|
],
|
|
134
191
|
};
|
|
135
192
|
};
|
|
136
193
|
/** Project decoded NIB records into the same bounded graph input as ibtool. */
|
|
137
|
-
const projectNibArchive = (archive) => {
|
|
194
|
+
const projectNibArchive = (archive, budget, maxHierarchyNodes) => {
|
|
138
195
|
const byId = new Map(archive.objects.map((object) => [object.id, object]));
|
|
196
|
+
const normalizedClassNames = new Map();
|
|
197
|
+
const normalizeClassName = (value) => {
|
|
198
|
+
const known = normalizedClassNames.get(value);
|
|
199
|
+
if (known !== undefined)
|
|
200
|
+
return known;
|
|
201
|
+
const normalized = value.replace(/\0+$/u, "");
|
|
202
|
+
normalizedClassNames.set(value, normalized);
|
|
203
|
+
return normalized;
|
|
204
|
+
};
|
|
205
|
+
const decodedStrings = new Map();
|
|
206
|
+
const decodedString = (objectId, object) => {
|
|
207
|
+
if (decodedStrings.has(objectId))
|
|
208
|
+
return decodedStrings.get(objectId) ?? null;
|
|
209
|
+
const data = object.values["NS.bytes"];
|
|
210
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
211
|
+
decodedStrings.set(objectId, null);
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const encoded = data.$nib_data_base64;
|
|
215
|
+
if (typeof encoded !== "string") {
|
|
216
|
+
decodedStrings.set(objectId, null);
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
budget.reserve(64 + encoded.length * 2, "NIBArchive string projection exceeds the aggregate Interface Builder decode budget");
|
|
220
|
+
const value = Buffer.from(encoded, "base64").toString("utf8");
|
|
221
|
+
decodedStrings.set(objectId, value);
|
|
222
|
+
return value;
|
|
223
|
+
};
|
|
224
|
+
let projectedFields = 0;
|
|
225
|
+
for (const object of archive.objects)
|
|
226
|
+
projectedFields += Object.keys(object.values).length;
|
|
227
|
+
budget.reserve(archive.objects.length * 128 + projectedFields * 128, "NIBArchive graph projection exceeds the aggregate Interface Builder decode budget");
|
|
228
|
+
budget.reserve(archive.classes.length * 96, "NIBArchive class projection exceeds the aggregate Interface Builder decode budget");
|
|
139
229
|
const dereference = (value) => {
|
|
140
230
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
141
231
|
return value;
|
|
232
|
+
const encodedData = value.$nib_data_base64;
|
|
233
|
+
if (typeof encodedData === "string") {
|
|
234
|
+
budget.reserveBase64JsonStringOccurrence(encodedData);
|
|
235
|
+
return value;
|
|
236
|
+
}
|
|
142
237
|
const ref = value.$nib_object_ref;
|
|
143
238
|
if (typeof ref !== "number")
|
|
144
239
|
return value;
|
|
145
240
|
const target = byId.get(ref);
|
|
146
241
|
if (target === undefined)
|
|
147
242
|
return undefined;
|
|
148
|
-
if (target.class_name
|
|
149
|
-
const
|
|
150
|
-
if (
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
return Buffer.from(encoded, "base64").toString("utf8");
|
|
243
|
+
if (normalizeClassName(target.class_name) === "NSString") {
|
|
244
|
+
const string = decodedString(ref, target);
|
|
245
|
+
if (string !== null) {
|
|
246
|
+
budget.reserveJsonStringOccurrence(string);
|
|
247
|
+
return string;
|
|
154
248
|
}
|
|
155
249
|
}
|
|
156
250
|
return { objectID: String(ref) };
|
|
@@ -162,26 +256,30 @@ const projectNibArchive = (archive) => {
|
|
|
162
256
|
if (typeof ref !== "number")
|
|
163
257
|
return null;
|
|
164
258
|
const target = byId.get(ref);
|
|
165
|
-
|
|
166
|
-
|
|
259
|
+
if (target === undefined ||
|
|
260
|
+
normalizeClassName(target.class_name) !== "NSString")
|
|
167
261
|
return null;
|
|
168
|
-
|
|
262
|
+
const string = decodedString(ref, target);
|
|
263
|
+
if (string === null)
|
|
169
264
|
return null;
|
|
170
|
-
|
|
171
|
-
return
|
|
172
|
-
? Buffer.from(encoded, "base64").toString("utf8")
|
|
173
|
-
: null;
|
|
265
|
+
budget.reserveJsonStringOccurrence(string);
|
|
266
|
+
return string;
|
|
174
267
|
};
|
|
268
|
+
const runtimeClasses = new Map();
|
|
175
269
|
const runtimeClass = (objectId) => {
|
|
270
|
+
if (runtimeClasses.has(objectId))
|
|
271
|
+
return runtimeClasses.get(objectId) ?? null;
|
|
176
272
|
const object = byId.get(objectId);
|
|
177
273
|
if (object === undefined)
|
|
178
274
|
return null;
|
|
179
|
-
const storedClass = object.class_name
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
275
|
+
const storedClass = normalizeClassName(object.class_name);
|
|
276
|
+
const resolvedClass = storedClass === "NSClassSwapper"
|
|
277
|
+
? (referencedString(object.values.NSClassName) ?? storedClass)
|
|
278
|
+
: storedClass === "UIClassSwapper"
|
|
279
|
+
? (referencedString(object.values.UIClassName) ?? storedClass)
|
|
280
|
+
: storedClass;
|
|
281
|
+
runtimeClasses.set(objectId, resolvedClass);
|
|
282
|
+
return resolvedClass;
|
|
185
283
|
};
|
|
186
284
|
const objects = Object.fromEntries(archive.objects
|
|
187
285
|
.filter((object) => {
|
|
@@ -189,22 +287,29 @@ const projectNibArchive = (archive) => {
|
|
|
189
287
|
return !/^(?:NSObject|NSIBObjectData|NSString|NSMutableString|NSNumber|NSArray|NSMutableArray|NSSet|NSMutableSet|NSDictionary|NSMutableDictionary|NSApplication|NSNib.*Connector|UIRuntime\w*Connection)$/u.test(name);
|
|
190
288
|
})
|
|
191
289
|
.map((object) => {
|
|
192
|
-
const className = runtimeClass(object.id) ?? object.class_name
|
|
193
|
-
|
|
290
|
+
const className = runtimeClass(object.id) ?? normalizeClassName(object.class_name);
|
|
291
|
+
budget.reserveJsonStringOccurrence(className);
|
|
292
|
+
let name = className;
|
|
293
|
+
for (const [key, value] of Object.entries(object.values)) {
|
|
294
|
+
if (!/(?:title|label|identifier|accessibility|name|contents)/iu.test(key))
|
|
295
|
+
continue;
|
|
194
296
|
const resolved = dereference(value);
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
297
|
+
if (typeof resolved !== "string")
|
|
298
|
+
continue;
|
|
299
|
+
name = resolved;
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
budget.reserveJsonStringOccurrence(name);
|
|
198
303
|
return [
|
|
199
304
|
String(object.id),
|
|
200
305
|
{
|
|
201
306
|
customClass: className,
|
|
202
307
|
label: name,
|
|
203
308
|
objectID: String(object.id),
|
|
204
|
-
nibValues: Object.fromEntries(Object.entries(object.values).map(([key, value]) =>
|
|
205
|
-
key
|
|
206
|
-
dereference(value) ?? null
|
|
207
|
-
|
|
309
|
+
nibValues: Object.fromEntries(Object.entries(object.values).map(([key, value]) => {
|
|
310
|
+
budget.reserveJsonPropertyNameOccurrence(key);
|
|
311
|
+
return [key, dereference(value) ?? null];
|
|
312
|
+
})),
|
|
208
313
|
},
|
|
209
314
|
];
|
|
210
315
|
}));
|
|
@@ -218,7 +323,7 @@ const projectNibArchive = (archive) => {
|
|
|
218
323
|
: null;
|
|
219
324
|
};
|
|
220
325
|
for (const object of archive.objects) {
|
|
221
|
-
const className = object.class_name
|
|
326
|
+
const className = normalizeClassName(object.class_name);
|
|
222
327
|
// AppKit connectors use NS-prefixed keys; UIKit's runtime outlet and
|
|
223
328
|
// event connections use UI-prefixed keys with the same roles.
|
|
224
329
|
const uiKit = /^UIRuntime\w*Connection$/u.test(className);
|
|
@@ -235,6 +340,7 @@ const projectNibArchive = (archive) => {
|
|
|
235
340
|
: className.includes("Control") || className.includes("Event")
|
|
236
341
|
? "action"
|
|
237
342
|
: className;
|
|
343
|
+
budget.reserveJsonStringOccurrence(type);
|
|
238
344
|
const eventMask = values.UIEventMask;
|
|
239
345
|
// The source is the outlet owner or the sending control; the destination
|
|
240
346
|
// is the outlet value or the action target, and a nil target is the
|
|
@@ -249,16 +355,26 @@ const projectNibArchive = (archive) => {
|
|
|
249
355
|
});
|
|
250
356
|
}
|
|
251
357
|
let hierarchyOmitted = 0;
|
|
358
|
+
let hierarchyNodeCount = 0;
|
|
252
359
|
const hierarchyFor = (objectId, seen, depth) => {
|
|
253
360
|
if (depth > 32 || seen.has(objectId)) {
|
|
254
361
|
hierarchyOmitted += 1;
|
|
255
362
|
return null;
|
|
256
363
|
}
|
|
364
|
+
if (hierarchyNodeCount >= maxHierarchyNodes) {
|
|
365
|
+
hierarchyOmitted += 1;
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
if (!budget.tryReserve(128)) {
|
|
369
|
+
hierarchyOmitted += 1;
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
257
372
|
const object = byId.get(objectId);
|
|
258
373
|
if (object === undefined) {
|
|
259
374
|
hierarchyOmitted += 1;
|
|
260
375
|
return null;
|
|
261
376
|
}
|
|
377
|
+
hierarchyNodeCount += 1;
|
|
262
378
|
const nextSeen = new Set(seen).add(objectId);
|
|
263
379
|
const children = [];
|
|
264
380
|
for (const [key, value] of Object.entries(object.values)) {
|
|
@@ -288,7 +404,7 @@ const projectNibArchive = (archive) => {
|
|
|
288
404
|
}
|
|
289
405
|
return { objectID: String(objectId), children };
|
|
290
406
|
};
|
|
291
|
-
const ibData = archive.objects.find(({ class_name }) => class_name
|
|
407
|
+
const ibData = archive.objects.find(({ class_name }) => normalizeClassName(class_name) === "NSIBObjectData");
|
|
292
408
|
const rootId = reference(ibData?.values.NSRoot);
|
|
293
409
|
const hierarchyRoots = rootId === null ? [] : [rootId];
|
|
294
410
|
for (const hierarchyRoot of hierarchyRoots) {
|
|
@@ -296,15 +412,19 @@ const projectNibArchive = (archive) => {
|
|
|
296
412
|
if (root !== null)
|
|
297
413
|
hierarchy.push(root);
|
|
298
414
|
}
|
|
299
|
-
const viewHierarchy = projectNibViewHierarchy(archive.objects, new Set(Object.keys(objects).map(Number)));
|
|
300
|
-
const merged = mergeNibHierarchies(hierarchy, viewHierarchy.hierarchy ?? []);
|
|
415
|
+
const viewHierarchy = projectNibViewHierarchy(archive.objects, new Set(Object.keys(objects).map(Number)), () => budget.tryReserve(128), maxHierarchyNodes);
|
|
416
|
+
const merged = mergeNibHierarchies(hierarchy, viewHierarchy.hierarchy ?? [], () => budget.tryReserve(96), maxHierarchyNodes);
|
|
301
417
|
return {
|
|
302
418
|
omitted: viewHierarchy.omitted + hierarchyOmitted + merged.omitted,
|
|
303
419
|
raw: jsonValueSchema.parse({
|
|
304
420
|
"com.apple.ibtool.document.objects": objects,
|
|
305
421
|
"com.apple.ibtool.document.connections": connections,
|
|
306
422
|
"com.apple.ibtool.document.hierarchy": merged.hierarchy,
|
|
307
|
-
"com.apple.ibtool.document.classes": Object.fromEntries(archive.classes.map((name) =>
|
|
423
|
+
"com.apple.ibtool.document.classes": Object.fromEntries(archive.classes.map((name) => {
|
|
424
|
+
const className = normalizeClassName(name);
|
|
425
|
+
budget.reserveJsonPropertyNameOccurrence(className);
|
|
426
|
+
return [className, {}];
|
|
427
|
+
})),
|
|
308
428
|
}),
|
|
309
429
|
};
|
|
310
430
|
};
|
|
@@ -312,9 +432,9 @@ const isInterfaceBuilderArchive = (path) => {
|
|
|
312
432
|
const lower = path.toLowerCase();
|
|
313
433
|
return lower.endsWith(".nib") || lower.endsWith("/objects.nib");
|
|
314
434
|
};
|
|
315
|
-
const readEntry = async (reader, entry, signal) => {
|
|
316
|
-
if (entry.declaredSize !== null && entry.declaredSize >
|
|
317
|
-
throw new
|
|
435
|
+
const readEntry = async (reader, entry, signal, maxInputBytes = MAX_AGGREGATE_INPUT_BYTES) => {
|
|
436
|
+
if (entry.declaredSize !== null && entry.declaredSize > maxInputBytes)
|
|
437
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "archive exceeds the aggregate Interface Builder decode budget");
|
|
318
438
|
const stream = await reader.open(entry, signal);
|
|
319
439
|
const chunks = [];
|
|
320
440
|
let length = 0;
|
|
@@ -323,18 +443,18 @@ const readEntry = async (reader, entry, signal) => {
|
|
|
323
443
|
? chunk
|
|
324
444
|
: Buffer.from(chunk);
|
|
325
445
|
length += bytes.length;
|
|
326
|
-
if (length >
|
|
446
|
+
if (length > maxInputBytes) {
|
|
327
447
|
stream.destroy();
|
|
328
|
-
throw new
|
|
448
|
+
throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "archive exceeded the aggregate Interface Builder decode budget");
|
|
329
449
|
}
|
|
330
450
|
chunks.push(bytes);
|
|
331
451
|
}
|
|
332
452
|
return Buffer.concat(chunks, length);
|
|
333
453
|
};
|
|
334
454
|
/** Project decoded plist data and dates while retaining omitted-key coverage. */
|
|
335
|
-
const decodePlist = (bytes) => {
|
|
455
|
+
const decodePlist = (bytes, xmlText) => {
|
|
336
456
|
const { value, omittedPrototypeKeys } = bytes.subarray(0, 8).toString("ascii") === "bplist00"
|
|
337
457
|
? { value: parseBinary(bytes), omittedPrototypeKeys: 0 }
|
|
338
|
-
: parseXmlPropertyList(bytes
|
|
458
|
+
: parseXmlPropertyList(xmlText ?? decodeXmlPlistText(bytes));
|
|
339
459
|
return { value: projectPlistValue(value).value, omittedPrototypeKeys };
|
|
340
460
|
};
|