Un programa pequeno que conecta unha VPN existente necesita un controlador, non unha implementación nova de VPN. O motor compatible debería encargarse da negociación e do tráfico do túnel; o teu programa debería expresar a solicitude do usuario e explicar o resultado con honestidade. En Linux, a interface D-Bus de NetworkManager dá a ese controlador un modelo concreto que seguir.

Catro comprobacións evitan que o controlador confunda un perfil gardado, unha solicitude de activación e unha sesión en funcionamento.

Comprobación un: que identidade se selecciona

Mantén o UUID do perfil como identidade persistente e resólveo a través do xestor cando necesites a ruta do obxecto. Dous perfís poden compartir un nome visible, e unha ruta de bus en tempo de execución non é unha preferencia de usuario sensata que gardar. Escribe a selección na túa propia configuración, non nun comentario sobre que entrada era a segunda da lista.

Verifica que devolve o xestor antes de chamalo coincidencia. Un UUID que xa non existe produce un fallo de busca, que é unha ruta de código distinta da dun perfil que existe e se nega a activarse.

Comprobación dous: que devolve a chamada de activación

A chamada de activación documentada toma a ruta do obxecto dunha conexión existente, a ruta dun dispositivo e un obxecto específico. Devolve a ruta dunha conexión activa, e esa resposta é un identificador, non un resultado de dispoñibilidade. Non fixees o indicador de dispoñibilidade da túa aplicación a partir do valor devolto; subscríbete no seu lugar ao estado e ao motivo da conexión activa.

Para unha VPN, o obxecto específico selecciona a conexión base activa. Pasar a ruta raíz deixa a elección do dispositivo en mans de NetworkManager, que escolle o que está predeterminado nese momento. É unha decisión de contexto de encamiñamento e non un campo de contrasinal, e cambia sobre que dispositivo se dispón o túnel.

Non copies un exemplo xenérico de engadir e activar e esperes que cree un perfil de VPN. O auxiliar documentado exclúe as conexións VPN, así que aprovisionar ou importar o perfil é un paso aparte e revisado. Iso importa porque o aprovisionamento necesita autorización e revisión que un botón de conectar non achega. Trata a importación como unha acción administrativa coa súa propia liña de rexistro e o seu propio aprobador.

Comprobación tres: como se representa o estado

Unha conexión activa pasa por activación, activa, desactivación e desactivada, e o campo de motivo di por que. Reducir todo iso a un booleano chamado loggedIn perde a información que o usuario necesita e a que soporte pedirá. Amosa polo menos se a conexión está pendente, establecida ou desaparecida, e conserva a cadea de motivo para o caso de fallo.

Asocia as respostas asíncronas coa solicitude que as produciu. Unha finalización serodia dun intento anterior non debe sobrescribir unha acción máis recente do usuario, e unha pulsación duplicada de Connect debería ignorarse ou tratarse como cancelar e reintentar cunha política visible.

Comprobación catro: que ocorre tras un reinicio

Cando o xestor se reinicia ou o teu controlador se reconecta ao bus, reconstrúe o estado observado a partir do propietario. Non sigas mostrando unha sesión en caché como activa porque unha ruta de obxecto antiga segue en memoria. Os sinais de cambio de estado existen precisamente para que un controlador poida resincronizarse en lugar de adiviñar.

Escolle que significa pechar o controlador. Deixar levantada unha conexión existente propiedade da máquina pode ser correcto, e desmontar unha sesión deliberadamente efémera tamén pode ser correcto. Deixar levantada unha conexión existente propiedade da máquina pode ser correcto; desmontar unha sesión deliberadamente efémera tamén pode ser correcto. Escribe ese contrato de propiedade na interface en lugar de supor que a saída do proceso realiza a acción de rede. Os usuarios non deberían ter que adiviñar se pechar a xanela lles fará caer o túnel. Pon a resposta no texto da interface, non só nun comentario do código.

Mantén a autoridade e os segredos cos seus donos

Os permisos volven como si, auth ou non, e a interface debería reflectir a diferenza entre permitido, permitido tras autenticarse e denegado. Executar o controlador como root non implementa unha política de permisos; elimina a pregunta.

As credenciais pertencen ao axente de segredos compatible ou á integración do cliente para o método de autenticación configurado. Un contrasinal no código fonte, nun argumento ou nun rexistro é un achado, e a autorización administrativa local non é o mesmo evento que a autenticación coa pasarela.

Por último, informa do estado da conexión por separado da tarefa que o usuario quere realizar. Un túnel pode estar activo mentres un nome privado ou unha aplicación seguen non dispoñibles, e ese segundo fallo merece a súa propia mensaxe e o seu propio estado. Un controlador que di exactamente que capa fallou é máis útil que un que di que a VPN está caída.

Artigos relacionados