Un programa pequeño que conecta una VPN existente necesita un controlador, no una implementación nueva de VPN. El motor compatible debería encargarse de la negociación y del tráfico del túnel; tu programa debería expresar la solicitud del usuario y explicar el resultado con honestidad. En Linux, la interfaz D-Bus de NetworkManager da a ese controlador un modelo concreto que seguir.

Cuatro comprobaciones evitan que el controlador confunda un perfil guardado, una solicitud de activación y una sesión en funcionamiento.

Comprobación uno: qué identidad se selecciona

Mantén el UUID del perfil como identidad persistente y resuélvelo a través del gestor cuando necesites la ruta del objeto. Dos perfiles pueden compartir un nombre visible, y una ruta de bus en tiempo de ejecución no es una preferencia de usuario sensata que guardar. Escribe la selección en tu propia configuración, no en un comentario sobre qué entrada era la segunda de la lista.

Verifica qué devuelve el gestor antes de llamarlo coincidencia. Un UUID que ya no existe produce un fallo de búsqueda, que es una ruta de código distinta de la de un perfil que existe y se niega a activarse.

Comprobación dos: qué devuelve la llamada de activación

La llamada de activación documentada toma la ruta del objeto de una conexión existente, la ruta de un dispositivo y un objeto específico. Devuelve la ruta de una conexión activa, y esa respuesta es un identificador, no un resultado de disponibilidad. No fijes el indicador de disponibilidad de tu aplicación a partir del valor devuelto; suscríbete en su lugar al estado y al motivo de la conexión activa.

Para una VPN, el objeto específico selecciona la conexión base activa. Pasar la ruta raíz deja la elección del dispositivo en manos de NetworkManager, que elige el que está predeterminado en ese momento. Es una decisión de contexto de enrutamiento y no un campo de contraseña, y cambia sobre qué dispositivo se dispone el túnel.

No copies un ejemplo genérico de añadir y activar y esperes que cree un perfil de VPN. El auxiliar documentado excluye las conexiones VPN, así que aprovisionar o importar el perfil es un paso aparte y revisado. Eso importa porque el aprovisionamiento necesita autorización y revisión que un botón de conectar no aporta. Trata la importación como una acción administrativa con su propia línea de registro y su propio aprobador.

Comprobación tres: cómo se representa el estado

Una conexión activa pasa por activación, activa, desactivación y desactivada, y el campo de motivo dice por qué. Reducir todo eso a un booleano llamado loggedIn pierde la información que el usuario necesita y la que soporte pedirá. Muestra al menos si la conexión está pendiente, establecida o desaparecida, y conserva la cadena de motivo para el caso de fallo.

Asocia las respuestas asíncronas con la solicitud que las produjo. Una finalización tardía de un intento anterior no debe sobrescribir una acción más reciente del usuario, y una pulsación duplicada de Connect debería ignorarse o tratarse como cancelar y reintentar con una política visible.

Comprobación cuatro: qué ocurre tras un reinicio

Cuando el gestor se reinicia o tu controlador se reconecta al bus, reconstruye el estado observado a partir del propietario. No sigas mostrando una sesión en caché como activa porque una ruta de objeto antigua sigue en memoria. Las señales de cambio de estado existen precisamente para que un controlador pueda resincronizarse en lugar de adivinar.

Elige qué significa cerrar el controlador. Dejar levantada una conexión existente propiedad de la máquina puede ser correcto, y desmontar una sesión deliberadamente efímera también puede serlo. Dejar levantada una conexión existente propiedad de la máquina puede ser correcto; desmontar una sesión deliberadamente efímera también puede serlo. Escribe ese contrato de propiedad en la interfaz en lugar de suponer que la salida del proceso realiza la acción de red. Los usuarios no deberían tener que adivinar si cerrar la ventana tumbarán su túnel. Pon la respuesta en el texto de la interfaz, no solo en un comentario del código.

Mantén la autoridad y los secretos con sus dueños

Los permisos vuelven como sí, auth o no, y la interfaz debería reflejar la diferencia entre permitido, permitido tras autenticarse y denegado. Ejecutar el controlador como root no implementa una política de permisos; elimina la pregunta.

Las credenciales pertenecen al agente de secretos compatible o a la integración del cliente para el método de autenticación configurado. Una contraseña en el código fuente, en un argumento o en un registro es un hallazgo, y la autorización administrativa local no es el mismo evento que la autenticación con la puerta de enlace.

Por último, informa del estado de la conexión por separado de la tarea que el usuario quiere realizar. Un túnel puede estar activo mientras un nombre privado o una aplicación siguen no disponibles, y ese segundo fallo merece su propio mensaje y su propio estado. Un controlador que dice exactamente qué capa falló es más útil que uno que dice que la VPN está caída.

Artículos relacionados