diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index 26e1c1cb7b..06f2ad6412 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -1523,6 +1523,10 @@ gst_rtsp_connection_get_write_socket gst_rtsp_connection_get_tls gst_rtsp_connection_set_tls_validation_flags gst_rtsp_connection_get_tls_validation_flags +gst_rtsp_connection_set_tls_database +gst_rtsp_connection_get_tls_database +gst_rtsp_connection_set_tls_interaction +gst_rtsp_connection_get_tls_interaction GstRTSPWatch GstRTSPWatchFuncs diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c index 08120d206f..98342dd1f8 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.c +++ b/gst-libs/gst/rtsp/gstrtspconnection.c @@ -159,6 +159,7 @@ struct _GstRTSPConnection /* TLS */ GTlsDatabase *tls_database; + GTlsInteraction *tls_interaction; DecodeCtx ctx; DecodeCtx *ctxp; @@ -253,7 +254,7 @@ verify_error: static void socket_client_event (GSocketClient * client, GSocketClientEvent event, - GSocketConnectable * connectable, GIOStream * connection, + GSocketConnectable * connectable, GTlsConnection * connection, GstRTSPConnection * rtspconn) { if (event == G_SOCKET_CLIENT_TLS_HANDSHAKING) { @@ -261,6 +262,8 @@ socket_client_event (GSocketClient * client, GSocketClientEvent event, g_signal_connect (connection, "accept-certificate", (GCallback) tls_accept_certificate, rtspconn); + + g_tls_connection_set_interaction (connection, rtspconn->tls_interaction); } } @@ -622,6 +625,61 @@ gst_rtsp_connection_get_tls_database (GstRTSPConnection * conn) return result; } +/** + * gst_rtsp_connection_set_tls_interaction: + * @conn: a #GstRTSPConnection + * @interaction: a #GTlsInteraction + * + * Sets a #GTlsInteraction object to be used when the connection or certificate + * database need to interact with the user. This will be used to prompt the + * user for passwords where necessary. + * + * Since: 1.6 + */ +void +gst_rtsp_connection_set_tls_interaction (GstRTSPConnection * conn, + GTlsInteraction * interaction) +{ + GTlsInteraction *old_interaction; + + g_return_if_fail (conn != NULL); + + if (interaction) + g_object_ref (interaction); + + old_interaction = conn->tls_interaction; + conn->tls_interaction = interaction; + + if (old_interaction) + g_object_unref (old_interaction); +} + +/** + * gst_rtsp_connection_get_tls_interaction: + * @conn: a #GstRTSPConnection + * + * Gets a #GTlsInteraction object to be used when the connection or certificate + * database need to interact with the user. This will be used to prompt the + * user for passwords where necessary. + * + * Returns: (transfer full): a reference on the #GTlsInteraction. Use + * g_object_unref() to release. + * + * Since: 1.6 + */ +GTlsInteraction * +gst_rtsp_connection_get_tls_interaction (GstRTSPConnection * conn) +{ + GTlsInteraction *result; + + g_return_val_if_fail (conn != NULL, NULL); + + if ((result = conn->tls_interaction)) + g_object_ref (result); + + return result; +} + static GstRTSPResult setup_tunneling (GstRTSPConnection * conn, GTimeVal * timeout, gchar * uri) { @@ -2298,6 +2356,8 @@ gst_rtsp_connection_free (GstRTSPConnection * conn) g_object_unref (conn->client); if (conn->tls_database) g_object_unref (conn->tls_database); + if (conn->tls_interaction) + g_object_unref (conn->tls_interaction); g_timer_destroy (conn->timer); gst_rtsp_url_free (conn->url); diff --git a/gst-libs/gst/rtsp/gstrtspconnection.h b/gst-libs/gst/rtsp/gstrtspconnection.h index bc2dc62686..464764b895 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.h +++ b/gst-libs/gst/rtsp/gstrtspconnection.h @@ -78,6 +78,8 @@ gboolean gst_rtsp_connection_set_tls_validation_flags (GstRTSPConnec GTlsCertificateFlags gst_rtsp_connection_get_tls_validation_flags (GstRTSPConnection * conn); void gst_rtsp_connection_set_tls_database (GstRTSPConnection * conn, GTlsDatabase * database); GTlsDatabase * gst_rtsp_connection_get_tls_database (GstRTSPConnection * conn); +void gst_rtsp_connection_set_tls_interaction (GstRTSPConnection * conn, GTlsInteraction * interaction); +GTlsInteraction * gst_rtsp_connection_get_tls_interaction (GstRTSPConnection * conn); /* sending/receiving raw bytes */ GstRTSPResult gst_rtsp_connection_read (GstRTSPConnection * conn, guint8 * data,