9 de outubro de 2015

Web2py admin sem https

Read this post in english.

Uma coisa que me chateia bastante é rodar o Web2py em uma máquina Vagrant e mesmo assim, ter que rodar o admin com https.

Ora, se estou em ambiente de desenvolvimento, basta rodar o admin em http.

Abaixo, segue um script que instala o web2py e configura o admin para rodar sem https (com http puro).

Em resumo, ele simula uma requisição local, mesmo estando dentro da VM, e coloca o ip do computador host na lista de endereços permitidos.

Nota: Esse script é projetado para atender as minhas necessidades e para rodar dentro de uma máquina virtual do Vagrant. Eu não recomendo rodar sua aplicação com essas configurações em produção.

#!/usr/bin/env bash

set -x

PROJECTNAME=xpto
HOME=/home/vagrant

cd ${HOME}/virtualenvs/${PROJECTNAME}/lib


# Web2py
rm -rf web2py
git clone https://github.com/web2py/web2py.git
cd web2py
git checkout master
git checkout -b v2.9.11 R-2.9.11  # Choose your version with `git tag`
ln -s /vagrant/src ${HOME}/virtualenvs/${PROJECTNAME}/lib/web2py/applications/${PROJECTNAME}

# Password file to enable admin without https
python -c "from gluon.main import save_password; save_password('a-Password', 8000)"


# vagrant owns the user-installed libs
chown -R vagrant:vagrant ${HOME}/virtualenvs/${PROJECTNAME}/lib


# Here's the first trick: a fake local request.
cd ${HOME}/virtualenvs/${PROJECTNAME}/lib/web2py/applications/admin/models
cat - 0.py > temp.py <<EOD
# Allow admin to work without https
request.is_local = True

EOD

mv 0.py 0.py.original
mv temp.py 0.py
Agora você precisa seguir os passos abaixo:
  1. Edite o arquivo controllers/appadmin.py da sua aplicação.
  2. Localize a linha que a variável hosts é setada dentro de um bloco except.
  3. Crie uma linha depois dessa
  4. Digite isso, com um nível a menos de indentação: hosts = (remote_addr, )
Esse é o último truque: permite que seu computador host rode o admin sem https.
Como deve ficar o trecho citado acima:

try:
    hosts = (http_host, socket.gethostname(),
             socket.gethostbyname(http_host),
             '::1', '127.0.0.1', '::ffff:127.0.0.1')
except:
    hosts = (http_host, )

hosts = (remote_addr, )
Pronto. Agora você já pode ir ao seu navegador e entrar no admin sem o https.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

Nenhum comentário:

Postar um comentário

Marcadores