Skip to content

feat: add filename blacklist filtering for search index#262

Open
Johnson-zs wants to merge 1 commit intolinuxdeepin:masterfrom
Johnson-zs:master
Open

feat: add filename blacklist filtering for search index#262
Johnson-zs wants to merge 1 commit intolinuxdeepin:masterfrom
Johnson-zs:master

Conversation

@Johnson-zs
Copy link
Contributor

Added filename blacklist matching functionality to exclude blacklisted paths from search index directory checks. This prevents indexing of sensitive or system directories that should not be included in search results.

The implementation includes:

  1. Integration of BlacklistMatcher utility in search index directory validation
  2. Comprehensive test cases for blacklist matching logic
  3. Support for both absolute path matching and directory name pattern matching
  4. Edge case handling to prevent false positives

Log: Added filename blacklist filtering to exclude sensitive directories from search indexing

Influence:

  1. Test search functionality with paths that should be blacklisted
  2. Verify that blacklisted directories do not appear in search results
  3. Test edge cases like similar directory names that should not match
  4. Validate that non-blacklisted paths are still indexed correctly
  5. Check search performance with blacklist filtering enabled

feat: 为搜索索引添加文件名黑名单过滤功能

在搜索索引目录检查中添加了文件名黑名单匹配功能,排除黑名单中的路径不被索
引。这可以防止敏感或系统目录被包含在搜索结果中。

实现包括:

  1. 在搜索索引目录验证中集成黑名单匹配工具
  2. 黑名单匹配逻辑的全面测试用例
  3. 支持绝对路径匹配和目录名模式匹配
  4. 防止误报的边缘情况处理

Log: 新增文件名黑名单过滤功能,排除敏感目录不被搜索索引

Influence:

  1. 测试应被黑名单排除的路径的搜索功能
  2. 验证黑名单目录不会出现在搜索结果中
  3. 测试边缘情况,如不应匹配的相似目录名
  4. 确认非黑名单路径仍能正确被索引
  5. 检查启用黑名单过滤后的搜索性能

Added filename blacklist matching functionality to exclude blacklisted
paths from search index directory checks. This prevents indexing of
sensitive or system directories that should not be included in search
results.

The implementation includes:
1. Integration of BlacklistMatcher utility in search index directory
validation
2. Comprehensive test cases for blacklist matching logic
3. Support for both absolute path matching and directory name pattern
matching
4. Edge case handling to prevent false positives

Log: Added filename blacklist filtering to exclude sensitive directories
from search indexing

Influence:
1. Test search functionality with paths that should be blacklisted
2. Verify that blacklisted directories do not appear in search results
3. Test edge cases like similar directory names that should not match
4. Validate that non-blacklisted paths are still indexed correctly
5. Check search performance with blacklist filtering enabled

feat: 为搜索索引添加文件名黑名单过滤功能

在搜索索引目录检查中添加了文件名黑名单匹配功能,排除黑名单中的路径不被索
引。这可以防止敏感或系统目录被包含在搜索结果中。

实现包括:
1. 在搜索索引目录验证中集成黑名单匹配工具
2. 黑名单匹配逻辑的全面测试用例
3. 支持绝对路径匹配和目录名模式匹配
4. 防止误报的边缘情况处理

Log: 新增文件名黑名单过滤功能,排除敏感目录不被搜索索引

Influence:
1. 测试应被黑名单排除的路径的搜索功能
2. 验证黑名单目录不会出现在搜索结果中
3. 测试边缘情况,如不应匹配的相似目录名
4. 确认非黑名单路径仍能正确被索引
5. 检查启用黑名单过滤后的搜索性能
@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: Johnson-zs

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-ci-robot
Copy link

deepin pr auto review

这段代码实现了一个文件名黑名单匹配功能,用于判断特定路径是否在黑名单中。以下是对代码的详细审查和改进建议:

1. 语法与逻辑

优点:

  • 代码结构清晰,使用了命名空间 Global::BlacklistMatcher 进行封装,避免了全局命名污染。
  • 使用了 QDir::cleanPath 进行路径规范化,这是一个好的实践,可以处理 ... 以及多余的斜杠。
  • 测试用例覆盖了绝对路径匹配、子路径匹配、目录名匹配以及边界情况。

问题与建议:

  1. 相对路径匹配逻辑存在潜在缺陷
    isPathBlacklisted 中,对于非绝对路径(即目录名)的匹配逻辑是:

    if (pathSegments.contains(trimmedEntry)) { return true; }

    这个逻辑只检查了路径的是否包含黑名单条目。例如,如果黑名单是 "bin",路径 /usr/bin 会匹配,但 /usr/binary 也会匹配(因为 "binary" 包含 "bin" 作为子串,但 splitbinary 是一个整体,所以不会误匹配,这点逻辑是对的)。
    但是,如果黑名单条目是 "test",路径 /home/user/test 会匹配,但 /home/user/testcase 不会匹配(因为 split 后是 testcase)。这符合预期。
    潜在问题:如果黑名单条目是 "a",路径 /home/user/a 会匹配,但 /home/user/ab 不会。这是正确的。然而,如果黑名单条目包含路径分隔符,例如 "a/b",当前的逻辑会将其视为非绝对路径(因为它不以 / 开头),然后 pathSegments.contains("a/b") 永远为假,因为 split 后的段不包含 /
    建议:明确非绝对路径黑名单条目的语义。如果它表示“任何路径中包含此目录名”,则当前逻辑是正确的。如果它支持相对路径(如 a/b),则需要额外处理。

  2. 规范化路径的一致性
    normalizePathForBlacklistMatch 使用了 QDir::cleanPath,它会将 // 转换为 /,并处理 ..。但是,QDir::cleanPath 在 Windows 和 Unix 上的行为可能略有不同(虽然这里看起来是针对 Linux/Unix 环境)。
    建议:确保在所有平台上测试路径规范化的行为,或者明确代码仅支持特定平台。

2. 代码质量

优点:

  • 使用了 Qt::SkipEmptyParts 避免空字符串。
  • 对输入进行了 trim() 处理,避免了前后空格的影响。
  • 头文件使用了 #pragma once#ifndef 保护(这里是 #ifndef)。

问题与建议:

  1. 测试代码与生产代码混在一起
    main.cpp 中的 testFileNameBlacklistMatcher 函数是测试代码,但它被放在了生产代码文件中。
    建议:将测试代码移到单独的测试文件中(例如 tests/tst_filenameblacklistmatcher.cpp),并使用 Qt Test 框架。

  2. 命名一致性
    isAbsolutePathMatchstatic 函数,但 normalizePathForBlacklistMatch 是公开的 API。
    建议:如果 normalizePathForBlacklistMatch 仅在内部使用,应将其设为 static 或放在匿名命名空间中。

  3. 注释缺失
    关键函数(如 isPathBlacklisted)缺少注释,尤其是对黑名单条目格式的说明。
    建议:添加注释说明黑名单条目的格式(例如:绝对路径以 / 开头,非绝对路径表示目录名)。

3. 代码性能

问题与建议:

  1. 重复的字符串操作
    isPathBlacklisted 中,normalizedPath.split('/', Qt::SkipEmptyParts) 会对每个黑名单条目执行一次(虽然实际上是在循环外执行了一次,但 trimmedEntrynormalizePathForBlacklistMatch 是在循环内执行的)。
    建议:如果黑名单条目很多,可以考虑预处理黑名单(例如分离绝对路径和非绝对路径),以减少运行时的判断。

  2. contains 的性能
    pathSegments.contains(trimmedEntry) 是线性查找,如果路径很长或黑名单条目很多,可能会影响性能。
    建议:将 pathSegments 转换为 QSet<QString>,这样 contains 是 O(1) 的。

4. 代码安全

问题与建议:

  1. 路径遍历攻击
    虽然使用了 QDir::cleanPath,但如果输入路径是恶意构造的(如 /../../etc/passwd),cleanPath 会将其规范化为 /etc/passwd。这可能是预期的行为,但需要确认。
    建议:如果路径来自用户输入,确保调用者已经验证了路径的合法性。

  2. 空路径或空黑名单
    代码处理了 trimmedEntry.isEmpty(),但没有显式处理 inputPath.isEmpty()
    建议:在 isPathBlacklisted 开头检查 inputPath 是否为空,并返回 false(因为空路径不在黑名单中)。

5. 其他建议

  1. 日志记录
    isPathBlacklisted 中,如果路径被黑名单命中,可以添加日志记录(例如使用 qDebugqInfo),便于调试。
    建议

    if (BlacklistMatcher::isPathBlacklisted(path, defaultBlacklistPaths())) {
        qInfo() << "Path" << path << "is blacklisted";
        return false;
    }
  2. 支持通配符或正则表达式
    当前黑名单仅支持精确匹配或前缀匹配(绝对路径)和目录名匹配(非绝对路径)。
    建议:未来可以考虑支持通配符(如 *.tmp)或正则表达式,但这会增加复杂性。

改进后的代码示例

以下是改进后的 filenameblacklistmatcher.cpp

#include "filenameblacklistmatcher.h"

#include <QDir>
#include <QSet>

DFM_SEARCH_BEGIN_NS
namespace Global {
namespace BlacklistMatcher {

namespace {
    QString normalizePathForBlacklistMatch(const QString &path) {
        return QDir::cleanPath(path.trimmed());
    }

    bool isAbsolutePathMatch(const QString &normalizedPath, const QString &blacklistAbsolutePath) {
        const QString normalizedRulePath = normalizePathForBlacklistMatch(blacklistAbsolutePath);
        if (normalizedRulePath.isEmpty()) {
            return false;
        }

        if (normalizedRulePath == "/") {
            return normalizedPath.startsWith('/');
        }

        return normalizedPath == normalizedRulePath || normalizedPath.startsWith(normalizedRulePath + '/');
    }
}

bool isPathBlacklisted(const QString &inputPath, const QStringList &blacklistEntries) {
    if (inputPath.isEmpty()) {
        return false;
    }

    const QString normalizedPath = normalizePathForBlacklistMatch(inputPath);
    const QStringList pathSegments = normalizedPath.split('/', Qt::SkipEmptyParts);
    const QSet<QString> pathSegmentSet(pathSegments.begin(), pathSegments.end());

    for (const QString &entry : blacklistEntries) {
        const QString trimmedEntry = entry.trimmed();
        if (trimmedEntry.isEmpty()) {
            continue;
        }

        if (QDir::isAbsolutePath(trimmedEntry)) {
            if (isAbsolutePathMatch(normalizedPath, trimmedEntry)) {
                return true;
            }
        } else {
            if (pathSegmentSet.contains(trimmedEntry)) {
                return true;
            }
        }
    }

    return false;
}

}   // namespace BlacklistMatcher
}   // namespace Global
DFM_SEARCH_END_NS

总结

这段代码整体质量较高,但在测试代码分离、性能优化和注释方面有改进空间。建议将测试代码移到单独的文件中,并使用 QSet 优化目录名匹配的性能。此外,添加注释和日志记录可以提高代码的可维护性和可调试性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants