Запретить JGit читать нативную конфигурацию git

Я использую JGit в приложении. В этом приложении есть SecurityManager, который позволяет только определенным классам и методам из белого списка создавать новые процессы.

JGit внутри обнаруживает, установлен ли собственный git, и пытается прочитать его конфигурацию в org.eclipse.jgit.util.FS.discoverGitSystemConfig() и даже пытается найти хуки в org.eclipse.jgit.util.FS_POSIX.findHook() и посмотреть, являются ли они исполняемыми.

Из-за наличия вышеупомянутого диспетчера безопасности JGit не может работать и дает сбой. Я пытался найти в документации, есть ли способ подавить такое поведение?


person Yogesh_D    schedule 19.11.2015    source источник


Ответы (3)


На данный момент обнаружение FS не предназначено для расширения в JGit (см. FS.DETECTED). Он всегда будет ссылаться на одну из файловых систем, предоставляемых JGit.

Но...

Кажется возможным реализовать собственный FS, который позволяет избежать вызова ограниченных API.

При создании от Repository до FileRepositoryBuilder вы можете указать FS и, таким образом, заставить репозиторий использовать ваш пользовательский FS. Если весь код JGit обращается к репозиторию для использования файловой системы, ваша проблема должна быть решена.

person Rüdiger Herrmann    schedule 19.11.2015
comment
имеет смысл, просто подождите немного, прежде чем принять ваш ответ, чтобы увидеть, произойдет ли чудо :) - person Yogesh_D; 19.11.2015
comment
Хм, чуда, видимо, не произошло ;) Но мне все равно было бы интересно узнать, хорошо ли сработало предложенное решение. - person Rüdiger Herrmann; 20.11.2015

В последних версиях JGit (3.3+) вы можете установить переменную среды GIT_CONFIG_NOSYSTEM в любое значение, и это подавит чтение собственного общесистемного файла конфигурации Git. Это определено в исходниках JGit через Constants#GIT_CONFIG_NOSYSTEM_KEY.

Это имитирует наличие пустого файла конфигурации системного уровня и предотвращает поиск кода в случайных путях к файлам и провоцирование исключений безопасности, что было задано в исходном вопросе. Обратите внимание, что даже в этом сценарии JGit по-прежнему пытается использовать файл конфигурации пользовательского уровня (обычно в $HOME/.gitconfig).

Более распространенный вариант этого вопроса, по-видимому, заключается в использовании предопределенного набора параметров конфигурации, не беспокоясь о каком-либо загрязнении окружающей среды (системные или пользовательские конфигурации), поэтому приведенное выше исправление не закрывает все пробелы.

В следующем примере показано, как использовать JGit для использования определенного пользовательского файла конфигурации Git по определенному пути, и он предоставляет пустой файл конфигурации Git системного уровня, что означает, что всей конфигурацией можно управлять программно.

Чтобы использовать это, установите свой собственный SystemReader, используя приведенный ниже код, прежде чем запускать какие-либо команды JGit:

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;
            }
        };
    }
}
person Scott Dudley    schedule 29.11.2019

В итоге я использовал SystemReader.getInstance().userConfig.clear() при инициализации репозитория git.

person Saket    schedule 07.07.2020
comment
Это не сработало для меня. - person c.sankhala; 26.03.2021