O projeto Code Lab permite programar diretamente pelo navegador, sem nenhuma outra dependência externa. É interessante para os casos em que se quer fazer um experimento rápido mas não há um computador com a linguagem instalada e configurada por perto.
Esse projeto foi feito originalmente como uma prova de conceito e também ajudar meus alunos a usarem diferentes linguagens de programação sem a necessidade de instalar nada na máquina deles.
A execução de um código de fonte desconhecida traz riscos à segurança porque um código malicioso pode tentar tomar o controle do sistema, acessar áreas e dados restritos ou fazer mau uso de recursos disponíveis (memória, processos, disco etc.). A forma de mitigar esse risco é executando o código em um sandbox, que é um tipo de virtualização de um ambiente restrito e controlado [1].
No Code Lab,
o sandbox é baseado em um container Docker denominado de Codebox,
que contém com todas as linguagens, bibliotecas e ferramentas oferecidas pelo Code Lab
,
mas que roda com limitações de permissões de usuário, tempo, memória e restrição de acesso à rede.
Mesmo que haja uma violação,
seus efeitos serão contidos e depois eliminados quando o container for destruído.
A comunicação é feita através da entrada e saída padrões stdin
e stdout
do Codebox
.
Os arquivos do projeto, dados de entrada e os comandos a serem executados são enviados pelo stdin
.
A saída (stdout
) e os erros (stderr
) dos comandos
são agrupados e devolvidos pelo stdout
do Codebox
.
Os modelos usados para troca de informações estão especificados no arquivo backend/app/models.py
.
O Codebox é a parte mais importante mas não funciona sozinho:
Tudo começa com a aplicação web, que segue o padrão SPA (Single Page Application)
e é construída com Vue.js.
O backend está hospedado em um droplet do DigitalOcean
.
A aplicação é servida através de um proxy reverso pelo Caddy
e de um servidor Hypercorn, que usa o padrão ASGI (Asynchronous Server Gateway Interface),
e serve a aplicação feita com FastAPI.
A execução dos projetos não é imediata.
Primeiro é feita uma verificação no cache (Redis)
e só se não estiver lá é que o projeto é executado no Codebox
.
Note
Se você reparar, verá arquivos como .hgignore
e .hgtags
no repositório.
Isso significa que eu uso o Mercurial como controle de versão dos meus projetos pessoais
apesar de hospedá-los no GitHub
.
[1] | Sandbox (computer security): https://en.wikipedia.org/wiki/Sandbox_(computer_security) |
[2] | Repositório do Code Lab: https://github.com/andredias/codelab |
[3] | Repositório do Codebox: https://github.com/andredias/Codebox |