blob: d4982ca95ca29917b93af75f037d0579aecd0ab1 [file] [log] [blame]
/*
* 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 <memory>
#include <string>
#include <string_view>
#include <vector>
#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 <typename T>
T* emplace_collect() {
auto uptr = std::make_unique<T>();
auto* ptr = uptr.get();
collectors_.push_back(std::move(uptr));
return ptr;
}
// T must be derived from trace_redaction::BuildPrimitive.
template <typename T>
T* emplace_build() {
auto uptr = std::make_unique<T>();
auto* ptr = uptr.get();
builders_.push_back(std::move(uptr));
return ptr;
}
// T must be derived from trace_redaction::TransformPrimitive.
template <typename T>
T* emplace_transform() {
auto uptr = std::make_unique<T>();
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<TraceRedactor> 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<std::unique_ptr<CollectPrimitive>> collectors_;
std::vector<std::unique_ptr<BuildPrimitive>> builders_;
std::vector<std::unique_ptr<TransformPrimitive>> transformers_;
};
} // namespace perfetto::trace_redaction
#endif // SRC_TRACE_REDACTION_TRACE_REDACTOR_H_