From 87ae8307057944662bb8a4b638f56fa980eef48a Mon Sep 17 00:00:00 2001
From: Lennart Poettering
Date: Tue, 15 May 2012 23:59:33 +0200
Subject: [PATCH] auth: move cookie file to ~/.config/pulse/cookie
In order to follow XDG basedir, read the cookie file from
~/.config/pulse/cookie if possible, but fall back to the old file.
if it doesn't exist.
---
man/pax11publish.1.xml.in | 6 +++---
man/pulse-client.conf.5.xml.in | 2 +-
src/modules/module-esound-sink.c | 2 +-
src/modules/module-tunnel.c | 2 +-
src/modules/x11/module-x11-publish.c | 2 +-
src/pulse/client-conf.c | 24 ++++++++++++++++++------
src/pulsecore/auth-cookie.c | 4 ++--
src/pulsecore/auth-cookie.h | 2 +-
src/pulsecore/authkey.c | 14 +++++++-------
src/pulsecore/authkey.h | 4 ++--
src/pulsecore/native-common.h | 3 ++-
src/pulsecore/protocol-esound.c | 2 +-
src/pulsecore/protocol-native.c | 20 ++++++++++++++++----
src/utils/pax11publish.c | 2 +-
14 files changed, 57 insertions(+), 32 deletions(-)
diff --git a/man/pax11publish.1.xml.in b/man/pax11publish.1.xml.in
index 6ad20f7a..0628b9d6 100644
--- a/man/pax11publish.1.xml.in
+++ b/man/pax11publish.1.xml.in
@@ -73,7 +73,7 @@ USA.
the eval shell command to set the $PULSE_SERVER,
$PULSE_SINK, $PULSE_SOURCE environment variables. Also reads the
authentication cookie from the root window and stores it in
- ~/.pulse-cookie .
+ ~/.config/pulse/cookie .
@@ -88,7 +88,7 @@ USA.
exist). If specific options are passed on the command line
(-S , -O , -I , -c , see
below), they take precedence. Also uploads the local
- authentication cookie ~/.pulse-cookie to the X11
+ authentication cookie ~/.config/pulse/cookie to the X11
server.
@@ -133,7 +133,7 @@ USA.
Only valid for -e : export the PulseAudio
authentication cookie stored in the specified file to the X11
- display instead of the one stored in ~/.pulse-cookie .
+ display instead of the one stored in ~/.config/pulse/cookie .
diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index 6243a3b2..45f02da9 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -88,7 +88,7 @@ USA.
cookie-file= Specify the path to the PulseAudio
authentication cookie. Defaults to
- ~/.pulse-cookie .
+ ~/.config/pulse/cookie .
diff --git a/src/modules/module-esound-sink.c b/src/modules/module-esound-sink.c
index 1e26e5e4..08387163 100644
--- a/src/modules/module-esound-sink.c
+++ b/src/modules/module-esound-sink.c
@@ -623,7 +623,7 @@ int pa__init(pa_module*m) {
/* Prepare the initial request */
u->write_data = pa_xmalloc(u->write_length = ESD_KEY_LEN + sizeof(int32_t));
- if (pa_authkey_load_auto(pa_modargs_get_value(ma, "cookie", ".esd_auth"), u->write_data, ESD_KEY_LEN) < 0) {
+ if (pa_authkey_load_auto(pa_modargs_get_value(ma, "cookie", ".esd_auth"), TRUE, u->write_data, ESD_KEY_LEN) < 0) {
pa_log("Failed to load cookie");
goto fail;
}
diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c
index 09167178..554eecf6 100644
--- a/src/modules/module-tunnel.c
+++ b/src/modules/module-tunnel.c
@@ -1971,7 +1971,7 @@ int pa__init(pa_module*m) {
u->rtpoll = pa_rtpoll_new();
pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
- if (!(u->auth_cookie = pa_auth_cookie_get(u->core, pa_modargs_get_value(ma, "cookie", PA_NATIVE_COOKIE_FILE), PA_NATIVE_COOKIE_LENGTH)))
+ if (!(u->auth_cookie = pa_auth_cookie_get(u->core, pa_modargs_get_value(ma, "cookie", PA_NATIVE_COOKIE_FILE), TRUE, PA_NATIVE_COOKIE_LENGTH)))
goto fail;
if (!(u->server_name = pa_xstrdup(pa_modargs_get_value(ma, "server", NULL)))) {
diff --git a/src/modules/x11/module-x11-publish.c b/src/modules/x11/module-x11-publish.c
index 716fe0b8..643b735e 100644
--- a/src/modules/x11/module-x11-publish.c
+++ b/src/modules/x11/module-x11-publish.c
@@ -157,7 +157,7 @@ int pa__init(pa_module*m) {
u->hook_slot = pa_hook_connect(&pa_native_protocol_hooks(u->protocol)[PA_NATIVE_HOOK_SERVERS_CHANGED], PA_HOOK_NORMAL, servers_changed_cb, u);
- if (!(u->auth_cookie = pa_auth_cookie_get(m->core, pa_modargs_get_value(ma, "cookie", PA_NATIVE_COOKIE_FILE), PA_NATIVE_COOKIE_LENGTH)))
+ if (!(u->auth_cookie = pa_auth_cookie_get(m->core, pa_modargs_get_value(ma, "cookie", PA_NATIVE_COOKIE_FILE), TRUE, PA_NATIVE_COOKIE_LENGTH)))
goto fail;
if (!(u->x11_wrapper = pa_x11_wrapper_get(m->core, pa_modargs_get_value(ma, "display", NULL))))
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index e2c2aae1..781fdf91 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -71,7 +71,7 @@ pa_client_conf *pa_client_conf_new(void) {
c->daemon_binary = pa_xstrdup(PA_BINARY);
c->extra_arguments = pa_xstrdup("--log-target=syslog");
- c->cookie_file = pa_xstrdup(PA_NATIVE_COOKIE_FILE);
+ c->cookie_file = NULL;
return c;
}
@@ -178,15 +178,27 @@ int pa_client_conf_env(pa_client_conf *c) {
}
int pa_client_conf_load_cookie(pa_client_conf* c) {
- pa_assert(c);
+ int k;
- if (!c->cookie_file)
- return -1;
+ pa_assert(c);
c->cookie_valid = FALSE;
- if (pa_authkey_load_auto(c->cookie_file, c->cookie, sizeof(c->cookie)) < 0)
- return -1;
+ if (c->cookie_file)
+ k = pa_authkey_load_auto(c->cookie_file, TRUE, c->cookie, sizeof(c->cookie));
+ else {
+ k = pa_authkey_load_auto(PA_NATIVE_COOKIE_FILE, FALSE, c->cookie, sizeof(c->cookie));
+
+ if (k < 0) {
+ k = pa_authkey_load_auto(PA_NATIVE_COOKIE_FILE_FALLBACK, FALSE, c->cookie, sizeof(c->cookie));
+
+ if (k < 0)
+ k = pa_authkey_load_auto(PA_NATIVE_COOKIE_FILE, TRUE, c->cookie, sizeof(c->cookie));
+ }
+ }
+
+ if (k < 0)
+ return k;
c->cookie_valid = TRUE;
return 0;
diff --git a/src/pulsecore/auth-cookie.c b/src/pulsecore/auth-cookie.c
index 0897502f..97ea351b 100644
--- a/src/pulsecore/auth-cookie.c
+++ b/src/pulsecore/auth-cookie.c
@@ -42,7 +42,7 @@ struct pa_auth_cookie {
size_t size;
};
-pa_auth_cookie* pa_auth_cookie_get(pa_core *core, const char *cn, size_t size) {
+pa_auth_cookie* pa_auth_cookie_get(pa_core *core, const char *cn, pa_bool_t create, size_t size) {
pa_auth_cookie *c;
char *t;
@@ -69,7 +69,7 @@ pa_auth_cookie* pa_auth_cookie_get(pa_core *core, const char *cn, size_t size) {
pa_assert_se(pa_shared_set(core, t, c) >= 0);
- if (pa_authkey_load_auto(cn, (uint8_t*) c + PA_ALIGN(sizeof(pa_auth_cookie)), size) < 0) {
+ if (pa_authkey_load_auto(cn, create, (uint8_t*) c + PA_ALIGN(sizeof(pa_auth_cookie)), size) < 0) {
pa_auth_cookie_unref(c);
return NULL;
}
diff --git a/src/pulsecore/auth-cookie.h b/src/pulsecore/auth-cookie.h
index 3db40bcd..5f871b10 100644
--- a/src/pulsecore/auth-cookie.h
+++ b/src/pulsecore/auth-cookie.h
@@ -26,7 +26,7 @@
typedef struct pa_auth_cookie pa_auth_cookie;
-pa_auth_cookie* pa_auth_cookie_get(pa_core *c, const char *cn, size_t size);
+pa_auth_cookie* pa_auth_cookie_get(pa_core *c, const char *cn, pa_bool_t create, size_t size);
pa_auth_cookie* pa_auth_cookie_ref(pa_auth_cookie *c);
void pa_auth_cookie_unref(pa_auth_cookie *c);
diff --git a/src/pulsecore/authkey.c b/src/pulsecore/authkey.c
index ac81513d..c37d3fe5 100644
--- a/src/pulsecore/authkey.c
+++ b/src/pulsecore/authkey.c
@@ -72,7 +72,7 @@ static int generate(int fd, void *ret_data, size_t length) {
/* Load an authorization cookie from file fn and store it in data. If
* the cookie file doesn't exist, create it */
-static int load(const char *fn, void *data, size_t length) {
+static int load(const char *fn, pa_bool_t create, void *data, size_t length) {
int fd = -1;
int writable = 1;
int unlock = 0, ret = -1;
@@ -82,9 +82,9 @@ static int load(const char *fn, void *data, size_t length) {
pa_assert(data);
pa_assert(length > 0);
- if ((fd = pa_open_cloexec(fn, O_RDWR|O_CREAT|O_BINARY, S_IRUSR|S_IWUSR)) < 0) {
+ if ((fd = pa_open_cloexec(fn, (create ? O_RDWR|O_CREAT : O_RDONLY)|O_BINARY, S_IRUSR|S_IWUSR)) < 0) {
- if (errno != EACCES || (fd = open(fn, O_RDONLY|O_BINARY)) < 0) {
+ if (!create || errno != EACCES || (fd = open(fn, O_RDONLY|O_BINARY)) < 0) {
pa_log_warn("Failed to open cookie file '%s': %s", fn, pa_cstrerror(errno));
goto finish;
} else
@@ -129,14 +129,14 @@ finish:
}
/* Load a cookie from a cookie file. If the file doesn't exist, create it. */
-int pa_authkey_load(const char *path, void *data, size_t length) {
+int pa_authkey_load(const char *path, pa_bool_t create, void *data, size_t length) {
int ret;
pa_assert(path);
pa_assert(data);
pa_assert(length > 0);
- if ((ret = load(path, data, length)) < 0)
+ if ((ret = load(path, create, data, length)) < 0)
pa_log_warn("Failed to load authorization key '%s': %s", path, (ret < 0) ? pa_cstrerror(errno) : "File corrupt");
return ret;
@@ -169,7 +169,7 @@ static char *normalize_path(const char *fn) {
/* Load a cookie from a file in the home directory. If the specified
* path starts with /, use it as absolute path instead. */
-int pa_authkey_load_auto(const char *fn, void *data, size_t length) {
+int pa_authkey_load_auto(const char *fn, pa_bool_t create, void *data, size_t length) {
char *p;
int ret;
@@ -180,7 +180,7 @@ int pa_authkey_load_auto(const char *fn, void *data, size_t length) {
if (!(p = normalize_path(fn)))
return -2;
- ret = pa_authkey_load(p, data, length);
+ ret = pa_authkey_load(p, create, data, length);
pa_xfree(p);
return ret;
diff --git a/src/pulsecore/authkey.h b/src/pulsecore/authkey.h
index 8301db1e..22ec990d 100644
--- a/src/pulsecore/authkey.h
+++ b/src/pulsecore/authkey.h
@@ -24,8 +24,8 @@
#include
-int pa_authkey_load(const char *path, void *data, size_t len);
-int pa_authkey_load_auto(const char *fn, void *data, size_t length);
+int pa_authkey_load(const char *path, pa_bool_t create, void *data, size_t len);
+int pa_authkey_load_auto(const char *fn, pa_bool_t create, void *data, size_t length);
int pa_authkey_save(const char *path, const void *data, size_t length);
diff --git a/src/pulsecore/native-common.h b/src/pulsecore/native-common.h
index 5d1ba6a6..8fde0236 100644
--- a/src/pulsecore/native-common.h
+++ b/src/pulsecore/native-common.h
@@ -177,7 +177,8 @@ enum {
};
#define PA_NATIVE_COOKIE_LENGTH 256
-#define PA_NATIVE_COOKIE_FILE ".pulse-cookie"
+#define PA_NATIVE_COOKIE_FILE ".config/pulse/cookie"
+#define PA_NATIVE_COOKIE_FILE_FALLBACK ".pulse-cookie"
#define PA_NATIVE_DEFAULT_PORT 4713
diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index 4e1c56cf..00ea0006 100644
--- a/src/pulsecore/protocol-esound.c
+++ b/src/pulsecore/protocol-esound.c
@@ -1711,7 +1711,7 @@ int pa_esound_options_parse(pa_esound_options *o, pa_core *c, pa_modargs *ma) {
if (!(cn = pa_modargs_get_value(ma, "cookie", NULL)))
cn = DEFAULT_COOKIE_FILE;
- if (!(o->auth_cookie = pa_auth_cookie_get(c, cn, ESD_KEY_LEN)))
+ if (!(o->auth_cookie = pa_auth_cookie_get(c, cn, TRUE, ESD_KEY_LEN)))
return -1;
} else
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 41fc0a02..396e143c 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -5215,11 +5215,23 @@ int pa_native_options_parse(pa_native_options *o, pa_core *c, pa_modargs *ma) {
/* The new name for this is 'auth-cookie', for compat reasons
* we check the old name too */
- if (!(cn = pa_modargs_get_value(ma, "auth-cookie", NULL)))
- if (!(cn = pa_modargs_get_value(ma, "cookie", NULL)))
- cn = PA_NATIVE_COOKIE_FILE;
+ cn = pa_modargs_get_value(ma, "auth-cookie", NULL);
+ if (!cn)
+ cn = pa_modargs_get_value(ma, "cookie", NULL);
- if (!(o->auth_cookie = pa_auth_cookie_get(c, cn, PA_NATIVE_COOKIE_LENGTH)))
+ if (cn)
+ o->auth_cookie = pa_auth_cookie_get(c, cn, TRUE, PA_NATIVE_COOKIE_LENGTH);
+ else {
+ o->auth_cookie = pa_auth_cookie_get(c, PA_NATIVE_COOKIE_FILE, FALSE, PA_NATIVE_COOKIE_LENGTH);
+ if (!o->auth_cookie) {
+ o->auth_cookie = pa_auth_cookie_get(c, PA_NATIVE_COOKIE_FILE_FALLBACK, FALSE, PA_NATIVE_COOKIE_LENGTH);
+
+ if (!o->auth_cookie)
+ o->auth_cookie = pa_auth_cookie_get(c, PA_NATIVE_COOKIE_FILE, TRUE, PA_NATIVE_COOKIE_LENGTH);
+ }
+ }
+
+ if (!o->auth_cookie)
return -1;
} else
diff --git a/src/utils/pax11publish.c b/src/utils/pax11publish.c
index d3ffc78b..0f9a030e 100644
--- a/src/utils/pax11publish.c
+++ b/src/utils/pax11publish.c
@@ -195,7 +195,7 @@ int main(int argc, char *argv[]) {
pa_client_conf_free(conf);
- if (pa_authkey_load_auto(cookie_file, cookie, sizeof(cookie)) < 0) {
+ if (pa_authkey_load_auto(cookie_file, cookie, TRUE, sizeof(cookie)) < 0) {
fprintf(stderr, _("Failed to load cookie data\n"));
goto finish;
}
--
2.39.2