Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

permission: add debug log when inserting fs nodes #48677

Merged
merged 1 commit into from
Jul 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/debug_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ void NODE_EXTERN_PRIVATE FWrite(FILE* file, const std::string& str);
V(NGTCP2_DEBUG) \
V(SEA) \
V(WASI) \
V(MKSNAPSHOT)
V(MKSNAPSHOT) \
V(PERMISSION_MODEL)

enum class DebugCategory : unsigned int {
#define V(name) name,
Expand Down
47 changes: 47 additions & 0 deletions src/permission/fs_permission.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "fs_permission.h"
#include "base_object-inl.h"
#include "debug_utils-inl.h"
#include "util.h"
#include "v8.h"

Expand Down Expand Up @@ -72,6 +73,46 @@ namespace node {

namespace permission {

void PrintTree(FSPermission::RadixTree::Node* node, int spaces = 0) {
std::string whitespace(spaces, ' ');

if (node == nullptr) {
return;
}
if (node->wildcard_child != nullptr) {
per_process::Debug(DebugCategory::PERMISSION_MODEL,
"%s Wildcard: %s\n",
whitespace,
node->prefix);
} else {
per_process::Debug(DebugCategory::PERMISSION_MODEL,
"%s Prefix: %s\n",
whitespace,
node->prefix);
if (node->children.size()) {
int child = 0;
for (const auto pair : node->children) {
++child;
per_process::Debug(DebugCategory::PERMISSION_MODEL,
"%s Child(%s): %s\n",
whitespace,
child,
std::string(1, pair.first));
PrintTree(pair.second, spaces + 2);
}
per_process::Debug(DebugCategory::PERMISSION_MODEL,
"%s End of tree - child(%s)\n",
whitespace,
child);
} else {
per_process::Debug(DebugCategory::PERMISSION_MODEL,
"%s End of tree: %s\n",
whitespace,
node->prefix);
}
}
}

// allow = '*'
// allow = '/tmp/,/home/example.js'
void FSPermission::Apply(const std::string& allow, PermissionScope scope) {
Expand Down Expand Up @@ -175,6 +216,12 @@ void FSPermission::RadixTree::Insert(const std::string& path) {
parent_node_prefix_len = i;
}
}

if (UNLIKELY(per_process::enabled_debug_list.enabled(
DebugCategory::PERMISSION_MODEL))) {
per_process::Debug(DebugCategory::PERMISSION_MODEL, "Inserting %s\n", path);
PrintTree(root_node_);
}
}

} // namespace permission
Expand Down
2 changes: 0 additions & 2 deletions src/permission/fs_permission.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ class FSPermission final : public PermissionBase {
void Apply(const std::string& allow, PermissionScope scope) override;
bool is_granted(PermissionScope perm, const std::string_view& param) override;

// For debugging purposes, use the gist function to print the whole tree
// https://gist.github.com/RafaelGSS/5b4f09c559a54f53f9b7c8c030744d19
struct RadixTree {
struct Node {
std::string prefix;
Expand Down