[glib/wip/2164-dbus-sha1-timeout] gdbusauthmechanismsha1: Use the same timeouts as libdbus
- From: Simon McVittie <smcv src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/2164-dbus-sha1-timeout] gdbusauthmechanismsha1: Use the same timeouts as libdbus
- Date: Mon, 7 Sep 2020 10:30:18 +0000 (UTC)
commit 92183fb70383fea247c7d76e31df4670e9615766
Author: Simon McVittie <smcv collabora com>
Date: Mon Sep 7 11:29:06 2020 +0100
gdbusauthmechanismsha1: Use the same timeouts as libdbus
For interoperability with libdbus, we want to use compatible timeouts.
In particular, this fixes a spurious failure of the `gdbus-server-auth`
test caused by libdbus and gdbus choosing to expire the key (cookie) at
different times, as diagnosed by Thiago Macieira. Previously, the libdbus
client would decline to use keys older than 7 minutes, but the GDBus
server would not generate a new key until the old key was 10 minutes old.
For completeness, also adjust the other arbitrary timeouts in the
DBUS_COOKIE_SHA1 mechanism to be the same as in libdbus. To make it
easier to align with libdbus, create internal macros with the same names
and values used in dbus-keyring.c.
* maximum time a key can be in the future due to clock skew between
systems sharing a home directory
- spec says "a reasonable time in the future"
- was 1 day
- now 5 minutes
- MAX_TIME_TRAVEL_SECONDS
* time to generate a new key if the newest is older
- spec says "If no recent keys remain, the server may generate a new
key", but that isn't practical, because in reality we need a grace
period during which an old key will not be used for new authentication
attempts but old authentication attempts can continue (in practice both
libdbus and GDBus implemented this logic)
- was 10 minutes
- now 5 minutes
- NEW_KEY_TIMEOUT_SECONDS
* time to discard old keys
- spec says "the timeout can be fairly short"
- was 15 minutes
- now 7 minutes
- EXPIRE_KEYS_TIMEOUT_SECONDS
* time allowed for a client using an old key to authenticate, before
that key gets deleted
- was at least 5 minutes
- now at least 2 minutes
- at least (EXPIRE_KEYS_TIMEOUT_SECONDS - NEW_KEY_TIMEOUT_SECONDS)
Based on a merge request by Philip Withnall.
Fixes: #2164
Thanks: Philip Withnall
Thanks: Thiago Macieira
Signed-off-by: Simon McVittie <smcv collabora com>
gio/gdbusauthmechanismsha1.c | 53 +++++++++++++++++++++++++++++++++-----------
1 file changed, 40 insertions(+), 13 deletions(-)
---
diff --git a/gio/gdbusauthmechanismsha1.c b/gio/gdbusauthmechanismsha1.c
index 416d8cc32..baa4e59d9 100644
--- a/gio/gdbusauthmechanismsha1.c
+++ b/gio/gdbusauthmechanismsha1.c
@@ -43,6 +43,37 @@
#include "glibintl.h"
+/*
+ * Arbitrary timeouts for keys in the keyring.
+ * For interoperability, these match the reference implementation, libdbus.
+ * To make them easier to compare, their names also match libdbus
+ * (see dbus/dbus-keyring.c).
+ */
+
+/*
+ * Maximum age of a key before we create a new key to use in challenges:
+ * 5 minutes.
+ */
+#define NEW_KEY_TIMEOUT_SECONDS (60*5)
+
+/*
+ * Time before we drop a key from the keyring: 7 minutes.
+ * Authentication will succeed if it takes less than
+ * EXPIRE_KEYS_TIMEOUT_SECONDS - NEW_KEY_TIMEOUT_SECONDS (2 minutes)
+ * to complete.
+ * The spec says "delete any cookies that are old (the timeout can be
+ * fairly short)".
+ */
+#define EXPIRE_KEYS_TIMEOUT_SECONDS (NEW_KEY_TIMEOUT_SECONDS + (60*2))
+
+/*
+ * Maximum amount of time a key can be in the future due to clock skew
+ * with a shared home directory: 5 minutes.
+ * The spec says "a reasonable time in the future".
+ */
+#define MAX_TIME_TRAVEL_SECONDS (60*5)
+
+
struct _GDBusAuthMechanismSha1Private
{
gboolean is_client;
@@ -750,12 +781,8 @@ keyring_generate_entry (const gchar *cookie_context,
{
/* Oddball case: entry is more recent than our current wall-clock time..
* This is OK, it means that another server on another machine but with
- * same $HOME wrote the entry.
- *
- * So discard the entry if it's more than 1 day in the future ("reasonable
- * time in the future").
- */
- if (line_when - now > 24*60*60)
+ * same $HOME wrote the entry. */
+ if (line_when - now > MAX_TIME_TRAVEL_SECONDS)
{
keep_entry = FALSE;
_log ("Deleted SHA1 cookie from %" G_GUINT64_FORMAT " seconds in the future", line_when -
now);
@@ -763,8 +790,8 @@ keyring_generate_entry (const gchar *cookie_context,
}
else
{
- /* Discard entry if it's older than 15 minutes ("can be fairly short") */
- if (now - line_when > 15*60)
+ /* Discard entry if it's too old. */
+ if (now - line_when > EXPIRE_KEYS_TIMEOUT_SECONDS)
{
keep_entry = FALSE;
}
@@ -782,13 +809,13 @@ keyring_generate_entry (const gchar *cookie_context,
line_when,
tokens[2]);
max_line_id = MAX (line_id, max_line_id);
- /* Only reuse entry if not older than 10 minutes.
+ /* Only reuse entry if not older than 5 minutes.
*
- * (We need a bit of grace time compared to 15 minutes above.. otherwise
- * there's a race where we reuse the 14min59.9 secs old entry and a
- * split-second later another server purges the now 15 minute old entry.)
+ * (We need a bit of grace time compared to 7 minutes above.. otherwise
+ * there's a race where we reuse the 6min59.9 secs old entry and a
+ * split-second later another server purges the now 7 minute old entry.)
*/
- if (now - line_when < 10 * 60)
+ if (now - line_when < NEW_KEY_TIMEOUT_SECONDS)
{
if (!have_id)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]