阻止JGit读取本机git配置

时间:2015-11-19 12:33:49

标签: jgit

我在应用中使用JGit。此应用有一个SecurityManager,只允许特定的白名单类和方法产生新流程。

JGit在内部发现是否安装了本机git并尝试在org.eclipse.jgit.util.FS.discoverGitSystemConfig()中读取其配置,甚至尝试在org.eclipse.jgit.util.FS_POSIX.findHook()中查找钩子并查看它们是否可执行。

由于前面提到的安全管理器,JGit无法运行和失败。 我试图在文档中找到是否有办法来抑制这种行为?

3 个答案:

答案 0 :(得分:3)

到目前为止, FS检测并不意味着在JGit中可以扩展(参见FS.DETECTED)。它将始终引用JGit提供的文件系统之一。

<强>可是...

实现自己的FS似乎是可行的,这可以避免调用受限制的API。

通过Repository创建FileRepositoryBuilder时,您可以指定FS,从而使存储库使用您的自定义FS。如果所有JGit代码都参考了要使用的文件系统的存储库,那么您的问题应该得到解决。

答案 1 :(得分:1)

在最新版本的JGit(3.3+)中,可以将环境变量GIT_CONFIG_NOSYSTEM设置为任何值,这将禁止读取本机系统范围的Git配置文件。这是通过Constants#GIT_CONFIG_NOSYSTEM_KEY在JGit源中定义的。

这模拟有一个空的系统级配置文件,并且防止代码在随机文件路径中四处搜索以及引发安全异常,这是原始问题所要求的。请注意,即使在这种情况下,JGit仍会尝试使用用户级别的配置文件(通常在$HOME/.gitconfig中)。

此问题的一个更常见的变体是使用一组预定义的配置选项,而不必担心任何环境污染(系统或用户级别的配置),因此上述修补程序无法填补所有空白。

以下示例显示如何使用JGit在定义的路径中使用特定的基于用户的Git配置文件,并且它提供了一个空的系统级Git配置文件,这意味着可以通过编程方式控制整个配置。

要使用此功能,请在运行任何JGit命令之前使用以下代码安装自己的SystemReader:

File userGitConfig = new File("/my/path/foo.config");
SystemReader.setInstance(new CustomConfigSystemReader(userGitConfig));

然后提供以下新的CustomConfigSystemReader类:

import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.SystemReader;

import java.io.File;

public class CustomConfigSystemReader extends SystemReader
{
    private static final SystemReader proxy = SystemReader.getInstance();
    private File userGitConfig;

    public CustomConfigSystemReader(File userGitConfig)
    {
        super();
        this.userGitConfig = userGitConfig;
    }

    @Override
    public String getenv(String variable)
    {
        return proxy.getenv(variable);
    }

    @Override
    public String getHostname()
    {
        return proxy.getHostname();
    }

    @Override
    public String getProperty(String key)
    {
        return proxy.getProperty(key);
    }

    @Override
    public long getCurrentTime()
    {
        return proxy.getCurrentTime();
    }

    @Override
    public int getTimezone(long when)
    {
        return proxy.getTimezone(when);
    }

    @Override
    public FileBasedConfig openUserConfig(Config parent, FS fs)
    {
        return new FileBasedConfig(parent, userGitConfig, fs);
    }

    // Return an empty system configuration, based on example in SystemReader.Default#openSystemConfig
    @Override
    public FileBasedConfig openSystemConfig(Config parent, FS fs)
    {
        return new FileBasedConfig(parent, null, fs)
        {
            @Override
            public void load()
            {
            }

            @Override
            public boolean isOutdated()
            {
                return false;
            }
        };
    }
}

答案 2 :(得分:0)

初始化git存储库时,我最终使用了SystemReader.getInstance().userConfig.clear()