2015-05-01 15 views
5

Zainstalowałem Gitlab na serwerze lokalnym do oceny, a jedną z kluczowych funkcji dla mnie będzie wyświetlanie plików svg jako obrazów na wiki. Mam gdybym przeciągnąć plik do edytora wiki, która produkuje url jak tak to działa:Gitlab (rails) "surowy" plik typu mime dla plików .svg to "text/plain". Czy można go skonfigurować jako wyjście "image/svg + xml"?

w wiki Markdown:

![my svg diagram](http://server/my-group/my-project/uploads/90cdd5d76a05957ab7cf8854c55a38b8/my-diagram.svg) 

wyników na stronie HTML:

<img src="http://server/my-group/my-project/uploads/90cdd5d76a05957ab7cf8854c55a38b8/my-diagram.svg" alt="my svg diagram"> 

iw aby uzyskać to do pracy, musiałem edytować /opt/gitlab/embedded/service/gitlab-rails/config/initializers/mime_types.rb dodać linię:

Mime::Type.register_alias "image/svg+xml", :svg 

a to g jeśli chcę przeciągnąć plik svg do wiki i przechowywać go w tej sekcji 'uploadów' projektu, ALE, co naprawdę chcę zrobić, to wyświetlić obraz svg z repozytorium git. (tak, że na przykład, gdy zmienia się diagram svg, nie muszę go szukać w wiki, po prostu odbierze go z gałęzi głównej)

Okazało się, że na przykład jest to link do pliku repo:

http://server/my-group/my-project/raw/master/docsfolder/my-drawing.svg 

jednak, typ MIME apears być text/plain dla plików SVG odwołuje ten sposób, a obrazy z ich src że jak nie będą wyświetlane. Czy istnieje sposób, aby je ustawić image/svg+xml? wygląda na to, że plik konfiguracyjny mime_types.rb nie ma wpływu na to "surowe" wyjście. lub czy istnieje inny sposób mogę link do pliku repo i uzyskać określony typ MIME?

Próbowałem również <object type="image/svg+xml" data="... i <embed type="image/svg+xml" src=" i nawet iframe, ale żaden z nich nie działa.

Uwaga: to działa doskonale dla obrazów jpg z repozytorium, ale nie ze zdjęć svg.

Odpowiedz

4

Znaleziono. Wygląda na to, że typ zawartości jest ustawiony w kodzie ruby ​​w pliku raw_controller.rb. więc mogę edytować

/opt/gitlab/embedded/service/gitlab-rails/app/controllers/projects/raw_controller.rb 

zmiany to:

def get_blob_type 
    if @blob.text? 
     'text/plain; charset=utf-8' 
    else 
     'application/octet-stream' 
    end 
    end 

aby coś takiego:

def get_blob_type 
    extn = File.extname(@blob.name).downcase 
    if @blob.text? 
     if extn == ".svg" 
     'image/svg+xml' 
     else 
     'text/plain; charset=utf-8' 
     end 
    else 
     case extn 
     when ".jpg", ".jpeg" 
      'image/jpeg' 
     when ".gif" 
      'image/gif' 
     when ".png" 
      'image/png' 
     when ".bmp" 
      'image/bmp' 
     when ".tiff" 
      'image/tiff' 
     else 
      'application/octet-stream' 
     end 
    end 
    end 

następnie sudo gitlab-ctrl restart

Teraz w moim obniżki, jeśli mogę to zrobić:

![my-diagram](http://server/my-group/my-project/raw/master/docsfolder/my-drawing.svg) 

to działa!

Nigdy wcześniej nie używałam ruby, więc może jest lepszy sposób, ale jak dotąd działa dla mnie.

+0

Cześć Chris, myślę, że uzasadnienie, dlaczego to nie jest włączone jest zabezpieczenie: W pomostów żylnych można użyć JavaScript, który jest teraz dostarczany w imieniu swojego gitlab przykład tak zły facet lub dziewczyna może uchwycić sesja. –

+0

To ciekawe, nie wiedziałem, że można wstrzyknąć javascript do pliku svg! Wypróbowałem to w systemie, którego użyłem, zmodyfikowałem jak wyżej, poprzez wstrzyknięcie alertu " 'przed zamykającym tagiem SVG w pliku i zaznaczone. Wiki nadal wyświetlało obraz i nie wykonało skryptu javascript. (IE i FF) Być może tag img nie uruchamia skryptu? Wykonał skrypt, jeśli przeglądam plik raw na jego własnej stronie. – 101chris

+0

tak długo, jak zapis notacji znaczników zawiera znacznik '', uznaje svg za "statyczny" svg ... jeśli otworzysz plik w trybie surowym, prawdopodobnie skrypt wykona (nie przetestował) .. ale ponieważ używam gitlab w kontrolowanym środowisku (niewielu znanych użytkowników), akceptujemy tutaj problem bezpieczeństwa. świetne rozwiązanie. dzięki! – Filipiz

1

Propozycja 101chris działa dobrze na 7.x, ale wymaga trochę przeróbek na gitlab 8.x. Oto moja aktualizacja przetestowana na 8.14.4:

/opt/gitlab/embedded/service/gitlab-rails/app/helpers/blob_helper.RB:

def safe_content_type(blob) 
    if blob.text? 
     case File.extname(blob.name).downcase 
     when '.html' 
     'text/html' 
     when '.css' 
     'text/css' 
     when '.xml' 
     'text/xml' 
     when '.js' 
     'application/javascript' 
     else 
     'text/plain; charset=utf-8' 
     end 
    elsif blob.image? 
     blob.content_type 
    else 
     'application/octet-stream' 
    end 
    end