From abfca5cb58d12d5df18c2ec4d42f8d7540b2bd6a Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Mon, 16 Sep 2013 14:08:14 +0200 Subject: [PATCH] tunnel-new: add cookie module argument When connecting to a remote server your local generated authentication cookie is used. If remote server's cookie is different from your local one you aren't allowed to connect. You can use the cookie argument or define a wider acl in remote server configuration for module-native-protocol. --- src/modules/module-tunnel-sink-new.c | 16 +++++++++++++--- src/modules/module-tunnel-source-new.c | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/modules/module-tunnel-sink-new.c b/src/modules/module-tunnel-sink-new.c index ee05d18f9..8d0409275 100644 --- a/src/modules/module-tunnel-sink-new.c +++ b/src/modules/module-tunnel-sink-new.c @@ -56,7 +56,8 @@ PA_MODULE_USAGE( "format= " "channels= " "rate= " - "channel_map=" + "channel_map= " + "cookie=" ); #define TUNNEL_THREAD_FAILED_MAINLOOP 1 @@ -82,6 +83,7 @@ struct userdata { bool connected; + char *cookie_file; char *remote_server; char *remote_sink_name; }; @@ -95,7 +97,7 @@ static const char* const valid_modargs[] = { "channels", "rate", "channel_map", - /* "cookie", unimplemented */ + "cookie", /* "reconnect", reconnect if server comes back again - unimplemented */ NULL, }; @@ -139,6 +141,11 @@ static void thread_func(void *userdata) { goto fail; } + if (u->cookie_file && pa_context_load_cookie_from_file(u->context, u->cookie_file) != 0) { + pa_log_error("Can not load cookie file!"); + goto fail; + } + pa_context_set_state_callback(u->context, context_state_cb, u); if (pa_context_connect(u->context, u->remote_server, @@ -450,7 +457,7 @@ int pa__init(pa_module *m) { goto fail; } u->thread_mainloop_api = pa_mainloop_get_api(u->thread_mainloop); - + u->cookie_file = pa_xstrdup(pa_modargs_get_value(ma, "cookie", NULL)); u->remote_sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); u->thread_mq = pa_xnew0(pa_thread_mq, 1); @@ -541,6 +548,9 @@ void pa__done(pa_module *m) { if (u->thread_mainloop) pa_mainloop_free(u->thread_mainloop); + if (u->cookie_file) + pa_xfree(u->cookie_file); + if (u->remote_sink_name) pa_xfree(u->remote_sink_name); diff --git a/src/modules/module-tunnel-source-new.c b/src/modules/module-tunnel-source-new.c index 8169b07f7..d2e2d6c68 100644 --- a/src/modules/module-tunnel-source-new.c +++ b/src/modules/module-tunnel-source-new.c @@ -56,7 +56,8 @@ PA_MODULE_USAGE( "format= " "channels= " "rate= " - "channel_map=" + "channel_map= " + "cookie=" ); #define TUNNEL_THREAD_FAILED_MAINLOOP 1 @@ -81,6 +82,7 @@ struct userdata { bool connected; bool new_data; + char *cookie_file; char *remote_server; char *remote_source_name; }; @@ -94,7 +96,7 @@ static const char* const valid_modargs[] = { "channels", "rate", "channel_map", - /* "cookie", unimplemented */ + "cookie", /* "reconnect", reconnect if server comes back again - unimplemented */ NULL, }; @@ -198,6 +200,11 @@ static void thread_func(void *userdata) { goto fail; } + if (u->cookie_file && pa_context_load_cookie_from_file(u->context, u->cookie_file) != 0) { + pa_log_error("Can not load cookie file!"); + goto fail; + } + pa_context_set_state_callback(u->context, context_state_cb, u); if (pa_context_connect(u->context, u->remote_server, @@ -454,6 +461,7 @@ int pa__init(pa_module *m) { goto fail; } u->thread_mainloop_api = pa_mainloop_get_api(u->thread_mainloop); + u->cookie_file = pa_xstrdup(pa_modargs_get_value(ma, "cookie", NULL)); u->remote_source_name = pa_xstrdup(pa_modargs_get_value(ma, "source", NULL)); u->thread_mq = pa_xnew0(pa_thread_mq, 1); @@ -543,6 +551,9 @@ void pa__done(pa_module *m) { if (u->thread_mainloop) pa_mainloop_free(u->thread_mainloop); + if (u->cookie_file) + pa_xfree(u->cookie_file); + if (u->remote_source_name) pa_xfree(u->remote_source_name);