Skip to content

Instantly share code, notes, and snippets.

@bfb
Created November 20, 2014 00:06
Show Gist options
  • Save bfb/55e33d593542b1e3976e to your computer and use it in GitHub Desktop.
Save bfb/55e33d593542b1e3976e to your computer and use it in GitHub Desktop.
Nomes: Bruno F. Bohn, Cássio S. Ghilardi
1. DESCRIÇÃO DO PROBLEMA
Deverá ser implementado um sistema de cofre de senhas, que tem como objetivo armazenar senhas do usuário. O cofre de senhas é protegido por uma senha master, na qual somente com ela é possível realizar as operações de obter uma senha já cadastrada e registrar uma nova senha.
2. REVISÃO CONCEITUAL
PIPE é um canal unidirecional de comunição entre processos. O PIPE é criado por um processo pai que utliza a chamada fork(). A chamada fork instancia um novo processo clone chamado de filho. E por fim, o PIPE é utlizado para a comunicação entre processo pai e filho.
POSIX Message Queue é um modelo de comunição no qual uma mensagem com uma prioridade e conteúdo e colocada em uma fila para posteriormente ser consumida. Para os processos se comunicarem, eles devem ter credencial compatível com as permissões configuradas para a fila.
3. SOLUÇÃO
Um processo servidor é inicializado e solicita ao usuário a configuração de uma senha master. Este mesmo processo é responsável por realizar as operações para obter e cadastrar senhas.
Após inicializado o processo cria uma fila através do comando POSIX_MQ.new("/vault", :rw), onde o primeiro parâmetro é o caminho da fila e o segundo as permissões, nesse caso leitura e escrita. O servidor aguarda a chegada das mensagens em um loop infinito através do comando mq.receive.first, onde mq refere-se a instância da fila do cofre. Existem dois tipos de mensagens suportadas pelo servidor, mensagens para obter uma senha já cadastrada e mensagens para cadastrar uma nova senha.
Estrutura de uma mensagem para obter uma senha:
{
type: “get”,
service: "github",
queue: “desired_queue”
}
Estrutura de uma mensagem para cadastrar uma nova senha:
{
type: "post",
service: "github",
user: "obama",
password: "123456"
}
Todas as senhas do cofre ficam armazenadas em um objeto do tipo Hash onde o nome do serviço é a chave. Ao obter uma mensagem do tipo “post” o servidor simplesmente insere as informações nesse Hash de senhas.
Quando uma mensagem do tipo “get” é obtida, o servidor solicita a senha master ao usuário através do comando “zenity --password”, no qual abre uma caixa de diálogo para o usuário informar a senha.
Essa etapa é realizada através de um PIPE que é criado através do comando IO.pipe, no qual retorna o descritor de leitura e o de escrita. O próximo passo é realizar o fork do processo que é realizado através da chamada fork. Desta forma o processo pai fica responsável por receber através do descritor de leitura do PIPE a senha informada pelo usuário para permitir o acesso a senha desejada pelo programa. O processo filho fica responsável por executar o zenity para solicitar a senha ao usuário. O STDOUT do comando zenity é redirecionado para o descritor do pipe através do comando $stdout.reopen(wr), onde wr é referência para o descritor de escrita do pipe. Se a senha master do usuário está correta, o servidor envia a senha solicitada através de uma mensagem na fila informada. O envio da senha é realizado através do comando POSIX_MQ.open(queue_name, :w) << @services[message[:service]], no qual abre a fila desejada e escreve a senha armazenada no Hash de senhas.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment