/* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SRC_TRACE_REDACTION_TRACE_REDACTOR_H_ #define SRC_TRACE_REDACTION_TRACE_REDACTOR_H_ #include #include #include #include #include "perfetto/base/status.h" #include "perfetto/trace_processor/trace_blob_view.h" #include "src/trace_redaction/trace_redaction_framework.h" namespace perfetto::trace_redaction { // Removes sensitive information from Perfetto traces by executing collect, // build, and transforms primtives in the correct order. // // The caller is responsible for adding all neccessary primitives. Primitives // are not directly dependent on each other, but rather dependent on the // information inside of the context. class TraceRedactor { public: TraceRedactor(); virtual ~TraceRedactor(); // Entry point for redacting a trace. Regardless of success/failure, `context` // will contain the current state. base::Status Redact(std::string_view source_filename, std::string_view dest_filename, Context* context) const; // T must be derived from trace_redaction::CollectPrimitive. template T* emplace_collect() { auto uptr = std::make_unique(); auto* ptr = uptr.get(); collectors_.push_back(std::move(uptr)); return ptr; } // T must be derived from trace_redaction::BuildPrimitive. template T* emplace_build() { auto uptr = std::make_unique(); auto* ptr = uptr.get(); builders_.push_back(std::move(uptr)); return ptr; } // T must be derived from trace_redaction::TransformPrimitive. template T* emplace_transform() { auto uptr = std::make_unique(); auto* ptr = uptr.get(); transformers_.push_back(std::move(uptr)); return ptr; } struct Config { // Controls whether or not the verify primitive is added to the pipeline. // This should always be enabled unless you know that your test content // fails verification. bool verify = true; }; static std::unique_ptr CreateInstance(const Config& config); private: // Run all collectors on a packet because moving to the next package. // // ``` // with context: // for packet in packets: // for collector in collectors: // collector(context, packet) // ``` base::Status Collect(Context* context, const trace_processor::TraceBlobView& view) const; // Runs builders once. // // ``` // with context: // for builder in builders: // builder(context) // ``` base::Status Build(Context* context) const; // Runs all transformers on a packet before moving to the next package. // // ``` // with context: // for packet in packets: // for transform in transformers: // transform(context, packet) // ``` base::Status Transform(const Context& context, const trace_processor::TraceBlobView& view, const std::string& dest_file) const; std::vector> collectors_; std::vector> builders_; std::vector> transformers_; }; } // namespace perfetto::trace_redaction #endif // SRC_TRACE_REDACTION_TRACE_REDACTOR_H_