Apache vs lighthttpd: comportamentos diferentes com tipo mime

4

Eu escrevi um aplicativo, um portal da web de provisionamento VPN automático em python para dispositivos Apple.

O que me incomoda é uma diferença de comportamento entre o servidor de teste e de produção; o primeiro está usando Apache , enquanto o segundo está usando lighthttpd .

Em lighhttpd , o arquivo .mobileconfig é aberto e "executado", e. ele abre o SysPrefs automaticamente, enquanto no Apache isso não está acontecendo.

Já notei que lighhtpd é muito mais frouxa em relação às definições adequadas de Content-Type , mas o problema é que o Safari carregará e "executará automaticamente" .mobileconfig arquivos corretamente com lighthttpd , enquanto o mesmo não acontece com Apache .

O que mais me irrita é que em ambos os servidores eu defini corretamente o mime.type correspondente como em:

lighthttpd.conf

$HTTP["url"] =~ "\.mobileconfig$" {
    setenv.add-response-header = ( "Content-Disposition" => "attachment" )
    mimetype.assign = (".mobileconfig" => "application/x-apple-aspen-config",
                    "" => "application/octet-stream")
}

Como no Apache, é:

dovpn.conf (vhost)

AddType application/x-apple-aspen-config .mobileconfig

A primeira dica de uma diferença, na verdade, parece derivar daquela diretiva add-response-header em lighthttpd .

No HTML gerado, tenho:

a download="profile.mobileconfig" href="../upload/8bd16b26-1473-4994-9803-8268a372cd0d.mobileconfig" type="application/octet-stream">Download automatic profile/a

e eu faço um download automático disso via Javascript

//If in Safari - download via virtual link click
if (window.downloadFile.isSafari) {
    //Creating new link node.
    var link = document.createElement('a');
    link.href = sUrl;
    if (link.download !== undefined) {
        //Set HTML5 download attribute. This will prevent file from opening if supported.
        var fileName = sUrl.substring(sUrl.lastIndexOf('/') + 1, sUrl.length);
        link.download = fileName;
    }
    //Dispatching click event.
    if (document.createEvent) {
        var e = document.createEvent('MouseEvents');
        e.initEvent('click', true, true);
        link.dispatchEvent(e);
        return true;
    }
}

O conteúdo da página de geração também tem apenas como Content-Type:

Content-Type: text/html\n\n

tanto no Apache como no lighthttpd. Eu cheirei o fio, e não há mudanças aparentes feitas no Content-Type feitas via lighthttpd .

Poderei replicar a funcionalidade semelhante de setenv.add-response-header com o Apache?

Eu já tentei adicionar ao host do Apache:

<Files "*.mobileconfig">
      Header set Content-Disposition attachment
</Files>

e

SetEnvIf Request_URI "\.mobileconfig$" change_header
Header set Content-Disposition attachment env=change_header

e

SetEnvIf Request_URI "\.mobileconfig$" change_header
Header always add "Content-Disposition" "attachment" env=change_header

e

<Files "*.mobileconfig">
    Header append Content-Disposition attachment
</Files>

Eu também tentei, no diretório atual, criar um arquivo .htaccess com:

<IfModule mod_headers.c>
    <FilesMatch "\.mobileconfig$">
        ForceType application/octet-stream
        Header append Content-Disposition "attachment"
        Allow from all
    </FilesMatch>
</IfModule>

e

<IfModule mod_headers.c>
    <FilesMatch "\.mobileconfig$">
        ForceType application/octet-stream
        Header add Content-Disposition "attachment"
        Allow from all
    </FilesMatch>
</IfModule>

Em ambos os casos, além de attachment , também usei "attachment" .

Por favor, note que o mod_headers está ativo por padrão no Apache / Debian 9, e nenhuma dessas alternativas funcionou.

Na verdade, acabei de me lembrar de lighthttpd está usando HTTP e Apache HTTPS. Eu testei o lighthttpd com HTTPS, e ele também funciona em HTTPS, enquanto o Apache não funciona.

Saída de curl -k -I https://localhost/cgi-bin/vpn.py no servidor lighthttpd:

HTTP/1.1 200 OK
Content type: text/html
Content-Length: 331
Date: Thu, 01 Jun 2017 09:03:26 GMT
Server: lighttpd/1.4.45

Saída de curl -k -I https://localhost/cgi-bin/vpn.py no servidor Apache:

HTTP/1.1 200 OK
Date: Thu, 01 Jun 2017 09:05:25 GMT
Server: Apache
Vary: Accept-Encoding
X-Frame-Options: sameorigin
Content-Type: text/html; charset=UTF-8

Além disso, no Apache também:

$curl -k -I https://localhost/download/xxx.mobileconfig
HTTP/1.1 200 OK
Date: Thu, 01 Jun 2017 09:13:35 GMT
Server: Apache
Last-Modified: Thu, 01 Jun 2017 03:08:57 GMT
ETag: "1f3b-550dd5b89d8df"
Accept-Ranges: bytes
Content-Length: 7995
X-Frame-Options: sameorigin
Content-Disposition: attachment
Content-Type: application/x-apple-aspen-config

Usando o Safari - > Desenvolvimento > Mostrar o Inspetor da web > Depurador - > clicando na página principal > Copiar como enrolar só me retorna "enrolar" link '-Xnull" ao colar.

Eu também tentei desabilitar X-Frame-Options: "sameorigin" e não fez diferença (eu sabia que era um tiro longo)

    
por Rui F Ribeiro 01.06.2017 / 04:41

1 resposta

2

Parece que o uso do arquivo .htaccess solucionou o problema de adicionar aos cabeçalhos o Content-Disposition.

No entanto, o problema em replicar a funcionalidade e a complexidade adicional em depuração e testes --- parece ter outra explicação.

Parece que tanto na última versão beta como na versão atual da atualização da Sierra .mobileconfig os arquivos foram retirados da lista do Safari de arquivos "seguros" por serem abertos por motivos de segurança.

Eu atualizei ontem (ou anteontem) o MacOS no trabalho, hoje em dia, e não consigo mais que .mobileconfig arquivos no sistema de produção ou de pré-produção abram automaticamente.

Acabei de atualizar meu iPhone para o iOS 10.3.3 beta, e também parece confirmar a tendência da Apple lidar como .mobileconfig provisioning files como potencialmente perigosos. Agora, ao clicar em tal arquivo, você recebe um novo aviso:

This website is trying to open Settings to show you a configuration profile. Do you want to allow this?
Ignore - Allow

    
por 01.06.2017 / 16:15