Um programa pequeno que liga uma VPN existente precisa de um controlador, não de uma nova implementação de VPN. O motor suportado deve tratar da negociação e do tráfego do túnel; o seu programa deve expressar o pedido do utilizador e explicar o resultado com honestidade. Em Linux, a interface D-Bus do NetworkManager dá a esse controlador um modelo concreto a seguir.

Quatro verificações impedem o controlador de confundir um perfil guardado, um pedido de ativação e uma sessão a funcionar.

Verificação um: que identidade é selecionada

Mantenha o UUID do perfil como identidade persistente e resolva-o através do gestor quando precisar do caminho do objeto. Um nome de apresentação pode ser partilhado por dois perfis, e um caminho de bus em execução não é uma preferência de utilizador sensata para guardar. Escreva a seleção na sua própria configuração, não num comentário sobre qual entrada era a segunda da lista.

Verifique o que o gestor devolve antes de lhe chamar correspondência. Um UUID que já não existe produz uma falha de procura, que é um caminho de código diferente do de um perfil que existe e recusa ativar-se.

Verificação dois: o que a chamada de ativação devolve

A chamada de ativação documentada recebe o caminho do objeto de uma ligação existente, um caminho de dispositivo e um objeto específico. Devolve o caminho de uma ligação ativa, e essa resposta é um handle, não um resultado de prontidão. Não defina o indicador de prontidão da aplicação a partir do valor devolvido; subscreva antes o estado e o motivo da ligação ativa.

Para uma VPN, o objeto específico seleciona a ligação base ativa. Passar o caminho raiz deixa a escolha do dispositivo para o NetworkManager, que escolhe o que está atualmente predefinido. É uma decisão de contexto de encaminhamento e não um campo de palavra-passe, e altera em que dispositivo o túnel é colocado.

Não copie um exemplo genérico de adicionar e ativar e espere que crie um perfil de VPN. O auxiliar documentado exclui as ligações VPN, por isso o aprovisionamento ou a importação do perfil é um passo separado e revisto. Isso importa porque o aprovisionamento exige autorização e revisão que um botão de ligação não oferece. Trate a importação como uma ação administrativa com a sua própria linha de registo e o seu próprio aprovador.

Verificação três: como o estado é representado

Uma ligação ativa passa por ativação, ativa, desativação e desativada, e o campo de motivo diz porquê. Reduzir tudo isso a um booleano chamado loggedIn perde a informação de que o utilizador precisa e a que o suporte vai pedir. Mostre pelo menos se a ligação está pendente, estabelecida ou desaparecida, e guarde a cadeia de motivo para o caso de falha.

Associe as respostas assíncronas ao pedido que as produziu. Uma conclusão tardia de uma tentativa anterior não deve substituir uma ação mais recente do utilizador, e uma pressão duplicada em Connect deve ser ignorada ou tratada como cancelar e tentar novamente com uma política visível.

Verificação quatro: o que acontece após um reinício

Quando o gestor reinicia ou o seu controlador se volta a ligar ao bus, reconstrua o estado observado a partir do proprietário. Não continue a mostrar uma sessão em cache como ativa porque um caminho de objeto antigo ainda está em memória. Os sinais de mudança de estado existem precisamente para que um controlador possa ressincronizar em vez de adivinhar.

Escolha o que significa fechar o controlador. Deixar uma ligação existente pertencente à máquina em funcionamento pode estar correto, e desmontar uma sessão deliberadamente efémera também pode estar correto. Deixar uma ligação existente pertencente à máquina em funcionamento pode estar correto; desmontar uma sessão deliberadamente efémera também pode estar correto. Escreva esse contrato de propriedade na interface em vez de assumir que a saída do processo executa a ação de rede. Os utilizadores não deviam ter de adivinhar se fechar a janela fará cair o túnel. Coloque a resposta no texto da interface, não apenas num comentário de código.

Mantenha a autoridade e os segredos com os seus donos

As permissões voltam como sim, auth ou não, e a interface deve refletir a diferença entre permitido, permitido após autenticação e negado. Executar o controlador como root não implementa uma política de permissões; elimina a pergunta.

As credenciais pertencem ao agente de segredos suportado ou à integração do cliente para o método de autenticação configurado. Uma palavra-passe no código-fonte, num argumento ou num registo é uma constatação, e a autorização administrativa local não é o mesmo evento que a autenticação no gateway.

Por fim, reporte o estado da ligação separadamente da tarefa que o utilizador quer realizar. Um túnel pode estar ativo enquanto um nome privado ou uma aplicação permanecem indisponíveis, e essa segunda falha merece a sua própria mensagem e o seu próprio estado. Um controlador que diz exatamente que camada falhou é mais útil do que um que diz que a VPN está em baixo.

Artigos relacionados