[PATCH] tunnel-new: add cookie module argument

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 4494a19..d9fe0e6 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=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate> "
-        "channel_map=<channel map>"
+        "channel_map=<channel map> "
+        "cookie=<cookie file path>"
         );
 
 #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 8169b07..d2e2d6c 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=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate> "
-        "channel_map=<channel map>"
+        "channel_map=<channel map> "
+        "cookie=<cookie file path>"
         );
 
 #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);
 
-- 
1.8.4



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux