Created
November 20, 2014 00:06
-
-
Save bfb/55e33d593542b1e3976e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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