Jogg.About::$Me->RaVbaker

 

27

marca

2009

« Praca z Gitem lokalnie, a z SVNem globalnie Praca z Gitem lokalnie a z SVNem globalnie, cz. 2 - uprzyjemnianie pracy »

Hakowanie git-svn aby działał pod Mac OS X Leopard...

Może i użytkowników maków którzy czytają mojego bloga i nie ma zbyt dużo (Google Analytics mówi o 17.12% w ostatnim miesiącu), ale ja sam jako użytkownik systemu od Apple po prostu nie mogłem się powstrzymać, żeby nie napisać mojego hacka na zmuszenie git-svn'a do łączenia się z repozytorium za httpsem podczas clone'owania projektu z sVNa.

Problem na który napotykałem pojawiał się, gdy próbowałem zrobić wspomniany w poprzednim wpisie git svn clone svn://sciezka.do.repozytorium.com gdy svn wymagał autoryzacji. Problem polega na braku biblioteki Term::ReadKey w perlu. Próbowałem ją doinstalować przy pomocy sudo cpan install Term::ReadKey. Ale nie działo. Problemy pojawiały podczas kompilacji z programem make. CPAN uważał, że go nie ma, mimo że podawałem mu poprawną do niego ścieżkę. Problem zupełnie niezrozumiały. Dlatego postanowiłem ugryźć temat z innej strony.

Jako, że git-svn został napisany w perlu, można podejrzeć jego źródła w tym miejscu:

/usr/local/git/libexec/git-core/git-svn

Nigdy nie lubiłem perla, ale przyjrzyjmy się kawałku kodu w linii 3178, który psuje autentykację, uniemożliwiając wpisanie hasła:

         
3174 sub _read_password {
3175         my ($prompt, $realm) = @_;
3176         print STDERR $prompt;
3177         STDERR->flush;
3178         require Term::ReadKey;
3179         Term::ReadKey::ReadMode('noecho');
3180         my $password = '';
3181         while (defined(my $key = Term::ReadKey::ReadKey(0))) {
3182                 last if $key =~ /[\012\015]/; # \n\r
3183                 $password .= $key;
3184         }
3185         Term::ReadKey::ReadMode('restore');
3186         print STDERR "\n";
3187         STDERR->flush;
3188         $password;
3189 }                             

Rozwiązanie jest proste:

                 
3174 sub _read_password {
3175         my ($prompt, $realm) = @_;
3176         print STDERR $prompt;
3177         STDERR->flush;
3178 #       require Term::ReadKey;
3179 #       Term::ReadKey::ReadMode('noecho');
3180         my $password = '';
3181 #       while (defined(my $key = Term::ReadKey::ReadKey(0))) {
3182 #               last if $key =~ /[\012\015]/; # \n\r
3183 #               $password .= $key;
3184 #       }
3185 #       Term::ReadKey::ReadMode('restore');
3186				 chomp($password = <STDIN>);
3187         print STDERR "\n";
3188         STDERR->flush;
3189         $password;
3190 }                     

Zakomentowanie kodu odpowiedzialnego za komunikację z brakującą biblioteką i ustawienie zwykłego pobrania wartości zmiennej $password ze standardowego wejścia (STDIN). Może i nie jest to najelegantsze rozwiązanie, ale działa. Jedynym minusem jest to, że od tej chwili hasło jest widoczne podczas wpisywania. Tak więc, nie róbcie tego w miejscach publicznych. ;-)

Żadnych uwag nie przyjmuję. SOA#1

 

Komentarze

 
 
 

№ 1

27 marca 2009, 23:01:16

macnow

Odrobinę ładniejsze rozwiązanie: http://www.kkovacs.hu/2008/08/git-svn-for-os-x-fix/

 
 
 

№ 2

29 marca 2009, 16:12:59

zwierzak

Odrobinę jeszcze ładniejsze rozwiązanie: Zainstaluj Linuksa

 
 
 

№ 3

29 marca 2009, 16:18:38

RaVbaker

Bez flame‘ów proszę.

Po kolejne, Mariusz Cieśla na facebooku podpowiedział mi, że mogłem użyć jeszcze MacPorts:

sudo port install git-core

sudo port install git +svn

 
 
 

Dodaj komentarz

 

Podpis

 

URL

 

Treść
(z textile)

 
 
 
 

Flakoblog