mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +01:00
gcredentials: add internal macros to simplify all the #ifdefs
Rather than having lots of obscure platform-based #ifdefs all over gio, define some macros in gcredentialsprivate.h, and use those to simplify the rest of the code. https://bugzilla.gnome.org/show_bug.cgi?id=701482
This commit is contained in:
parent
32d2539295
commit
cedd697bf8
@ -342,6 +342,7 @@ libgio_2_0_la_SOURCES = \
|
||||
gconverterinputstream.c \
|
||||
gconverteroutputstream.c \
|
||||
gcredentials.c \
|
||||
gcredentialsprivate.h \
|
||||
gdatainputstream.c \
|
||||
gdataoutputstream.c \
|
||||
gdrive.c \
|
||||
|
@ -28,8 +28,10 @@
|
||||
#include <gobject/gvaluecollector.h>
|
||||
|
||||
#include "gcredentials.h"
|
||||
#include "gcredentialsprivate.h"
|
||||
#include "gnetworking.h"
|
||||
#include "gioerror.h"
|
||||
#include "gioenumtypes.h"
|
||||
|
||||
#include "glibintl.h"
|
||||
|
||||
@ -77,16 +79,16 @@ struct _GCredentials
|
||||
/*< private >*/
|
||||
GObject parent_instance;
|
||||
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
struct ucred native;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
struct cmsgcred native;
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
struct sockpeercred native;
|
||||
#else
|
||||
#ifdef __GNUC__
|
||||
#warning Please add GCredentials support for your OS
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
#warning Please add GCredentials support for your OS
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -127,16 +129,16 @@ g_credentials_class_init (GCredentialsClass *klass)
|
||||
static void
|
||||
g_credentials_init (GCredentials *credentials)
|
||||
{
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
credentials->native.pid = getpid ();
|
||||
credentials->native.uid = geteuid ();
|
||||
credentials->native.gid = getegid ();
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
memset (&credentials->native, 0, sizeof (struct cmsgcred));
|
||||
credentials->native.cmcred_pid = getpid ();
|
||||
credentials->native.cmcred_euid = geteuid ();
|
||||
credentials->native.cmcred_gid = getegid ();
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
credentials->native.pid = getpid ();
|
||||
credentials->native.uid = geteuid ();
|
||||
credentials->native.gid = getegid ();
|
||||
@ -183,7 +185,7 @@ g_credentials_to_string (GCredentials *credentials)
|
||||
g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL);
|
||||
|
||||
ret = g_string_new ("GCredentials:");
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
g_string_append (ret, "linux-ucred:");
|
||||
if (credentials->native.pid != -1)
|
||||
g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.pid);
|
||||
@ -193,7 +195,7 @@ g_credentials_to_string (GCredentials *credentials)
|
||||
g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.gid);
|
||||
if (ret->str[ret->len - 1] == ',')
|
||||
ret->str[ret->len - 1] = '\0';
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
g_string_append (ret, "freebsd-cmsgcred:");
|
||||
if (credentials->native.cmcred_pid != -1)
|
||||
g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.cmcred_pid);
|
||||
@ -201,7 +203,7 @@ g_credentials_to_string (GCredentials *credentials)
|
||||
g_string_append_printf (ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.cmcred_euid);
|
||||
if (credentials->native.cmcred_gid != -1)
|
||||
g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.cmcred_gid);
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
g_string_append (ret, "openbsd-sockpeercred:");
|
||||
if (credentials->native.pid != -1)
|
||||
g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.pid);
|
||||
@ -248,13 +250,13 @@ g_credentials_is_same_user (GCredentials *credentials,
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||
|
||||
ret = FALSE;
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
if (credentials->native.uid == other_credentials->native.uid)
|
||||
ret = TRUE;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
if (credentials->native.cmcred_euid == other_credentials->native.cmcred_euid)
|
||||
ret = TRUE;
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
if (credentials->native.uid == other_credentials->native.uid)
|
||||
ret = TRUE;
|
||||
#else
|
||||
@ -267,6 +269,42 @@ g_credentials_is_same_user (GCredentials *credentials,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
credentials_native_type_check (GCredentialsType requested_type,
|
||||
const char *op)
|
||||
{
|
||||
GEnumClass *enum_class;
|
||||
GEnumValue *requested;
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
GEnumValue *supported;
|
||||
#endif
|
||||
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
if (requested_type == G_CREDENTIALS_NATIVE_TYPE)
|
||||
return TRUE;
|
||||
#endif
|
||||
|
||||
enum_class = g_type_class_ref (g_credentials_type_get_type ());
|
||||
requested = g_enum_get_value (enum_class, requested_type);
|
||||
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
supported = g_enum_get_value (enum_class, G_CREDENTIALS_NATIVE_TYPE);
|
||||
g_warning ("g_credentials_%s_native: Trying to %s credentials of type %s "
|
||||
"but only %s is supported on this platform.",
|
||||
op, op,
|
||||
requested ? requested->value_name : "(unknown)",
|
||||
supported->value_name);
|
||||
#else
|
||||
g_warning ("g_credentials_%s_native: Trying to %s credentials of type %s "
|
||||
"but there is no support for GCredentials on this platform.",
|
||||
op, op,
|
||||
requested ? requested->value_name : "(unknown)");
|
||||
#endif
|
||||
|
||||
g_type_class_unref (enum_class);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* g_credentials_get_native: (skip)
|
||||
* @credentials: A #GCredentials.
|
||||
@ -290,51 +328,16 @@ gpointer
|
||||
g_credentials_get_native (GCredentials *credentials,
|
||||
GCredentialsType native_type)
|
||||
{
|
||||
gpointer ret;
|
||||
|
||||
g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL);
|
||||
|
||||
ret = NULL;
|
||||
if (!credentials_native_type_check (native_type, "get"))
|
||||
return NULL;
|
||||
|
||||
#ifdef __linux__
|
||||
if (native_type != G_CREDENTIALS_TYPE_LINUX_UCRED)
|
||||
{
|
||||
g_warning ("g_credentials_get_native: Trying to get credentials of type %d but only "
|
||||
"G_CREDENTIALS_TYPE_LINUX_UCRED is supported.",
|
||||
native_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = &credentials->native;
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
if (native_type != G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED)
|
||||
{
|
||||
g_warning ("g_credentials_get_native: Trying to get credentials of type %d but only "
|
||||
"G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED is supported.",
|
||||
native_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = &credentials->native;
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
if (native_type != G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED)
|
||||
{
|
||||
g_warning ("g_credentials_get_native: Trying to get credentials of type %d but only "
|
||||
"G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED is supported.",
|
||||
native_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = &credentials->native;
|
||||
}
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
return &credentials->native;
|
||||
#else
|
||||
g_warning ("g_credentials_get_native: Trying to get credentials but GLib has no support "
|
||||
"for the native credentials type. Please add support.");
|
||||
g_assert_not_reached ();
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -357,42 +360,13 @@ g_credentials_set_native (GCredentials *credentials,
|
||||
GCredentialsType native_type,
|
||||
gpointer native)
|
||||
{
|
||||
#ifdef __linux__
|
||||
if (native_type != G_CREDENTIALS_TYPE_LINUX_UCRED)
|
||||
{
|
||||
g_warning ("g_credentials_set_native: Trying to set credentials of type %d "
|
||||
"but only G_CREDENTIALS_TYPE_LINUX_UCRED is supported.",
|
||||
native_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (&credentials->native, native, sizeof (struct ucred));
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
if (native_type != G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED)
|
||||
{
|
||||
g_warning ("g_credentials_set_native: Trying to set credentials of type %d "
|
||||
"but only G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED is supported.",
|
||||
native_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (&credentials->native, native, sizeof (struct cmsgcred));
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
if (native_type != G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED)
|
||||
{
|
||||
g_warning ("g_credentials_set_native: Trying to set credentials of type %d "
|
||||
"but only G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED is supported.",
|
||||
native_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (&credentials->native, native, sizeof (struct sockpeercred));
|
||||
}
|
||||
if (!credentials_native_type_check (native_type, "set"))
|
||||
return;
|
||||
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
memcpy (&credentials->native, native, sizeof (credentials->native));
|
||||
#else
|
||||
g_warning ("g_credentials_set_native: Trying to set credentials but GLib has no support "
|
||||
"for the native credentials type. Please add support.");
|
||||
g_assert_not_reached ();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -424,11 +398,11 @@ g_credentials_get_unix_user (GCredentials *credentials,
|
||||
g_return_val_if_fail (G_IS_CREDENTIALS (credentials), -1);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, -1);
|
||||
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
ret = credentials->native.uid;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
ret = credentials->native.cmcred_euid;
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
ret = credentials->native.uid;
|
||||
#else
|
||||
ret = -1;
|
||||
@ -466,11 +440,11 @@ g_credentials_get_unix_pid (GCredentials *credentials,
|
||||
g_return_val_if_fail (G_IS_CREDENTIALS (credentials), -1);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, -1);
|
||||
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
ret = credentials->native.pid;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
ret = credentials->native.cmcred_pid;
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
ret = credentials->native.pid;
|
||||
#else
|
||||
ret = -1;
|
||||
@ -512,13 +486,13 @@ g_credentials_set_unix_user (GCredentials *credentials,
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||
|
||||
ret = FALSE;
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
credentials->native.uid = uid;
|
||||
ret = TRUE;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
credentials->native.cmcred_euid = uid;
|
||||
ret = TRUE;
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
credentials->native.uid = uid;
|
||||
ret = TRUE;
|
||||
#else
|
||||
|
51
gio/gcredentialsprivate.h
Normal file
51
gio/gcredentialsprivate.h
Normal file
@ -0,0 +1,51 @@
|
||||
/* GIO - GLib Input, Output and Streaming Library
|
||||
*
|
||||
* Copyright 2013 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General
|
||||
* Public License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __G_CREDENTIALS_PRIVATE_H__
|
||||
#define __G_CREDENTIALS_PRIVATE_H__
|
||||
|
||||
#include "gio/gcredentials.h"
|
||||
#include "gio/gnetworking.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#define G_CREDENTIALS_SUPPORTED 1
|
||||
#define G_CREDENTIALS_USE_LINUX_UCRED 1
|
||||
#define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_LINUX_UCRED
|
||||
#define G_CREDENTIALS_NATIVE_SIZE (sizeof (struct ucred))
|
||||
#define G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1
|
||||
#define G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED 1
|
||||
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#define G_CREDENTIALS_SUPPORTED 1
|
||||
#define G_CREDENTIALS_USE_FREEBSD_CMSGCRED 1
|
||||
#define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED
|
||||
#define G_CREDENTIALS_NATIVE_SIZE (sizeof (struct cmsgcred))
|
||||
#define G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1
|
||||
|
||||
#elif defined(__OpenBSD__)
|
||||
#define G_CREDENTIALS_SUPPORTED 1
|
||||
#define G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED 1
|
||||
#define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED
|
||||
#define G_CREDENTIALS_NATIVE_SIZE (sizeof (struct sockpeercred))
|
||||
#define G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED 1
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __G_CREDENTIALS_PRIVATE_H__ */
|
@ -63,6 +63,7 @@
|
||||
#include "gsocketaddress.h"
|
||||
#include "gsocketcontrolmessage.h"
|
||||
#include "gcredentials.h"
|
||||
#include "gcredentialsprivate.h"
|
||||
#include "glibintl.h"
|
||||
|
||||
/**
|
||||
@ -4447,21 +4448,23 @@ g_socket_get_credentials (GSocket *socket,
|
||||
|
||||
ret = NULL;
|
||||
|
||||
#if defined(__linux__) || defined(__OpenBSD__)
|
||||
#if G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED
|
||||
{
|
||||
socklen_t optlen;
|
||||
#if defined(__linux__)
|
||||
struct ucred native_creds;
|
||||
optlen = sizeof (struct ucred);
|
||||
#elif defined(__OpenBSD__)
|
||||
struct sockpeercred native_creds;
|
||||
optlen = sizeof (struct sockpeercred);
|
||||
#endif
|
||||
guint8 native_creds_buf[G_CREDENTIALS_NATIVE_SIZE];
|
||||
socklen_t optlen = sizeof (native_creds_buf);
|
||||
|
||||
if (getsockopt (socket->priv->fd,
|
||||
SOL_SOCKET,
|
||||
SO_PEERCRED,
|
||||
(void *)&native_creds,
|
||||
&optlen) != 0)
|
||||
native_creds_buf,
|
||||
&optlen) == 0)
|
||||
{
|
||||
ret = g_credentials_new ();
|
||||
g_credentials_set_native (ret,
|
||||
G_CREDENTIALS_NATIVE_TYPE,
|
||||
native_creds_buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
int errsv = get_socket_errno ();
|
||||
g_set_error (error,
|
||||
@ -4470,17 +4473,6 @@ g_socket_get_credentials (GSocket *socket,
|
||||
_("Unable to read socket credentials: %s"),
|
||||
socket_strerror (errsv));
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = g_credentials_new ();
|
||||
g_credentials_set_native (ret,
|
||||
#if defined(__linux__)
|
||||
G_CREDENTIALS_TYPE_LINUX_UCRED,
|
||||
#elif defined(__OpenBSD__)
|
||||
G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED,
|
||||
#endif
|
||||
&native_creds);
|
||||
}
|
||||
}
|
||||
#else
|
||||
g_set_error_literal (error,
|
||||
|
@ -35,16 +35,6 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
#ifdef __linux__
|
||||
#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1
|
||||
#else
|
||||
/* TODO: please add support for your UNIX flavor */
|
||||
#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 0
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <fcntl.h>
|
||||
@ -54,6 +44,7 @@
|
||||
|
||||
#include "gunixcredentialsmessage.h"
|
||||
#include "gcredentials.h"
|
||||
#include "gcredentialsprivate.h"
|
||||
#include "gnetworking.h"
|
||||
|
||||
#include "glibintl.h"
|
||||
@ -70,13 +61,12 @@ enum
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GUnixCredentialsMessage, g_unix_credentials_message, G_TYPE_SOCKET_CONTROL_MESSAGE)
|
||||
|
||||
static gsize
|
||||
g_unix_credentials_message_get_size (GSocketControlMessage *message)
|
||||
{
|
||||
#ifdef __linux__
|
||||
return sizeof (struct ucred);
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
return sizeof (struct cmsgcred);
|
||||
#if G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED
|
||||
return G_CREDENTIALS_NATIVE_SIZE;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
@ -85,9 +75,7 @@ g_unix_credentials_message_get_size (GSocketControlMessage *message)
|
||||
static int
|
||||
g_unix_credentials_message_get_level (GSocketControlMessage *message)
|
||||
{
|
||||
#ifdef __linux__
|
||||
return SOL_SOCKET;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#if G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED
|
||||
return SOL_SOCKET;
|
||||
#else
|
||||
return 0;
|
||||
@ -97,10 +85,12 @@ g_unix_credentials_message_get_level (GSocketControlMessage *message)
|
||||
static int
|
||||
g_unix_credentials_message_get_msg_type (GSocketControlMessage *message)
|
||||
{
|
||||
#ifdef __linux__
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
return SCM_CREDENTIALS;
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
return SCM_CREDS;
|
||||
#elif G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED
|
||||
#error "G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED is set but there is no msg_type defined for this platform"
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
@ -112,91 +102,53 @@ g_unix_credentials_message_deserialize (gint level,
|
||||
gsize size,
|
||||
gpointer data)
|
||||
{
|
||||
#if G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED
|
||||
GSocketControlMessage *message;
|
||||
GCredentials *credentials;
|
||||
|
||||
message = NULL;
|
||||
if (level != SOL_SOCKET || type != g_unix_credentials_message_get_msg_type (NULL))
|
||||
return NULL;
|
||||
|
||||
#ifdef __linux__
|
||||
{
|
||||
GCredentials *credentials;
|
||||
struct ucred *ucred;
|
||||
if (size != G_CREDENTIALS_NATIVE_SIZE)
|
||||
{
|
||||
g_warning ("Expected a credentials struct of %" G_GSIZE_FORMAT " bytes but "
|
||||
"got %" G_GSIZE_FORMAT " bytes of data",
|
||||
G_CREDENTIALS_NATIVE_SIZE, size);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (level != SOL_SOCKET || type != SCM_CREDENTIALS)
|
||||
goto out;
|
||||
credentials = g_credentials_new ();
|
||||
g_credentials_set_native (credentials, G_CREDENTIALS_NATIVE_TYPE, data);
|
||||
|
||||
if (size != sizeof (struct ucred))
|
||||
{
|
||||
g_warning ("Expected a struct ucred (%" G_GSIZE_FORMAT " bytes) but "
|
||||
"got %" G_GSIZE_FORMAT " bytes of data",
|
||||
sizeof (struct ucred),
|
||||
size);
|
||||
goto out;
|
||||
}
|
||||
if (g_credentials_get_unix_user (credentials, NULL) == (uid_t) -1)
|
||||
{
|
||||
/* This happens on Linux if the remote side didn't pass the credentials */
|
||||
g_object_unref (credentials);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ucred = data;
|
||||
|
||||
if (ucred->uid == (uid_t)-1 &&
|
||||
ucred->gid == (gid_t)-1)
|
||||
{
|
||||
/* This happens if the remote side didn't pass the credentials */
|
||||
goto out;
|
||||
}
|
||||
|
||||
credentials = g_credentials_new ();
|
||||
g_credentials_set_native (credentials, G_CREDENTIALS_TYPE_LINUX_UCRED, ucred);
|
||||
message = g_unix_credentials_message_new_with_credentials (credentials);
|
||||
g_object_unref (credentials);
|
||||
out:
|
||||
;
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
{
|
||||
GCredentials *credentials;
|
||||
struct cmsgcred *cred;
|
||||
|
||||
if (level != SOL_SOCKET || type != SCM_CREDS)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
if (size < sizeof *cred)
|
||||
{
|
||||
g_warning ("Expected a struct cmsgcred (%" G_GSIZE_FORMAT " bytes) but "
|
||||
"got %" G_GSIZE_FORMAT " bytes of data",
|
||||
CMSG_LEN (sizeof *cred),
|
||||
size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
cred = data;
|
||||
|
||||
credentials = g_credentials_new ();
|
||||
g_credentials_set_native (credentials, G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED, cred);
|
||||
message = g_unix_credentials_message_new_with_credentials (credentials);
|
||||
g_object_unref (credentials);
|
||||
out:
|
||||
;
|
||||
}
|
||||
#endif
|
||||
message = g_unix_credentials_message_new_with_credentials (credentials);
|
||||
g_object_unref (credentials);
|
||||
|
||||
return message;
|
||||
|
||||
#else /* !G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED */
|
||||
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
g_unix_credentials_message_serialize (GSocketControlMessage *_message,
|
||||
gpointer data)
|
||||
{
|
||||
#if G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED
|
||||
GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (_message);
|
||||
#ifdef __linux__
|
||||
memcpy (data,
|
||||
g_credentials_get_native (message->priv->credentials,
|
||||
G_CREDENTIALS_TYPE_LINUX_UCRED),
|
||||
sizeof (struct ucred));
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
memcpy (data,
|
||||
g_credentials_get_native (message->priv->credentials,
|
||||
G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED),
|
||||
sizeof (struct cmsgcred));
|
||||
|
||||
memcpy (data,
|
||||
g_credentials_get_native (message->priv->credentials,
|
||||
G_CREDENTIALS_NATIVE_TYPE),
|
||||
G_CREDENTIALS_NATIVE_SIZE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -324,7 +276,11 @@ g_unix_credentials_message_class_init (GUnixCredentialsMessageClass *class)
|
||||
gboolean
|
||||
g_unix_credentials_message_is_supported (void)
|
||||
{
|
||||
return G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED;
|
||||
#if G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED
|
||||
return TRUE;
|
||||
#else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
@ -23,24 +23,15 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
#ifdef G_OS_UNIX
|
||||
# include "gio/gnetworkingprivate.h"
|
||||
|
||||
# if (defined(__linux__) || \
|
||||
defined(__FreeBSD__) || \
|
||||
defined(__FreeBSD_kernel__) || \
|
||||
defined(__OpenBSD__))
|
||||
# define SHOULD_HAVE_CREDENTIALS
|
||||
# endif
|
||||
#endif
|
||||
#include <gio/gcredentialsprivate.h>
|
||||
|
||||
static void
|
||||
test_basic (void)
|
||||
{
|
||||
GCredentials *creds = g_credentials_new ();
|
||||
GCredentials *other = g_credentials_new ();
|
||||
#ifdef SHOULD_HAVE_CREDENTIALS
|
||||
gpointer bad_native_creds;
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
GError *error = NULL;
|
||||
gboolean set;
|
||||
pid_t not_me;
|
||||
@ -51,7 +42,7 @@ test_basic (void)
|
||||
g_assert (creds != NULL);
|
||||
g_assert (other != NULL);
|
||||
|
||||
#ifdef SHOULD_HAVE_CREDENTIALS
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
g_assert (g_credentials_is_same_user (creds, other, &error));
|
||||
g_assert_no_error (error);
|
||||
|
||||
@ -83,7 +74,7 @@ test_basic (void)
|
||||
g_test_message ("%s", stringified);
|
||||
g_free (stringified);
|
||||
|
||||
#if defined(__linux__)
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
{
|
||||
struct ucred *native = g_credentials_get_native (creds,
|
||||
G_CREDENTIALS_TYPE_LINUX_UCRED);
|
||||
@ -91,7 +82,7 @@ test_basic (void)
|
||||
g_assert_cmpuint (native->uid, ==, geteuid ());
|
||||
g_assert_cmpuint (native->pid, ==, getpid ());
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
|
||||
{
|
||||
struct cmsgcred *native = g_credentials_get_native (creds,
|
||||
G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED);
|
||||
@ -99,7 +90,7 @@ test_basic (void)
|
||||
g_assert_cmpuint (native->cmcred_euid, ==, geteuid ());
|
||||
g_assert_cmpuint (native->cmcred_pid, ==, getpid ());
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
#elif G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED
|
||||
{
|
||||
struct sockpeercred *native = g_credentials_get_native (creds,
|
||||
G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED);
|
||||
@ -107,8 +98,38 @@ test_basic (void)
|
||||
g_assert_cmpuint (native->uid, ==, geteuid ());
|
||||
g_assert_cmpuint (native->pid, ==, getpid ());
|
||||
}
|
||||
#else
|
||||
#error "G_CREDENTIALS_SUPPORTED is set but there is no test for this platform"
|
||||
#endif
|
||||
|
||||
|
||||
#if G_CREDENTIALS_USE_LINUX_UCRED
|
||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
|
||||
"*g_credentials_get_native: Trying to get*"
|
||||
"G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED "
|
||||
"but only G_CREDENTIALS_TYPE_LINUX_UCRED*"
|
||||
"supported*");
|
||||
bad_native_creds = g_credentials_get_native (creds, G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED);
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert_null (bad_native_creds);
|
||||
#else
|
||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
|
||||
"*g_credentials_get_native: Trying to get*"
|
||||
"G_CREDENTIALS_TYPE_LINUX_UCRED "
|
||||
"but only G_CREDENTIALS_TYPE_*supported*");
|
||||
bad_native_creds = g_credentials_get_native (creds, G_CREDENTIALS_TYPE_LINUX_UCRED);
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert_null (bad_native_creds);
|
||||
#endif
|
||||
|
||||
#else /* ! G_CREDENTIALS_SUPPORTED */
|
||||
|
||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
|
||||
"*g_credentials_get_native: Trying to get*"
|
||||
"credentials but*no support*");
|
||||
bad_native_creds = g_credentials_get_native (creds, G_CREDENTIALS_TYPE_LINUX_UCRED);
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert_null (bad_native_creds);
|
||||
#endif
|
||||
|
||||
g_object_unref (creds);
|
||||
|
@ -38,19 +38,13 @@
|
||||
#include <gio/gnetworking.h>
|
||||
#include <gio/gunixsocketaddress.h>
|
||||
#include <gio/gunixfdlist.h>
|
||||
#include <gio/gcredentialsprivate.h>
|
||||
|
||||
#ifdef G_OS_UNIX
|
||||
#include <gio/gunixconnection.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#if (defined(__linux__) || \
|
||||
defined(__FreeBSD__) || \
|
||||
defined(__FreeBSD_kernel__) || \
|
||||
defined(__OpenBSD__))
|
||||
#define SHOULD_HAVE_CREDENTIALS_PASSING
|
||||
#endif
|
||||
|
||||
#include "gdbus-tests.h"
|
||||
|
||||
#include "gdbus-object-manager-example/gdbus-example-objectmanager-generated.h"
|
||||
@ -312,7 +306,7 @@ on_new_connection (GDBusServer *server,
|
||||
|
||||
g_ptr_array_add (data->current_connections, g_object_ref (connection));
|
||||
|
||||
#ifdef SHOULD_HAVE_CREDENTIALS_PASSING
|
||||
#if G_CREDENTIALS_SUPPORTED
|
||||
{
|
||||
GCredentials *credentials;
|
||||
|
||||
@ -844,9 +838,8 @@ test_peer (void)
|
||||
g_error_free (error);
|
||||
#endif /* G_OS_UNIX */
|
||||
|
||||
/* Check that g_socket_get_credentials() work - this really should
|
||||
* be in a GSocket-specific test suite but no such test suite exists
|
||||
* right now.
|
||||
/* Check that g_socket_get_credentials() work - (though this really
|
||||
* should be in socket.c)
|
||||
*/
|
||||
{
|
||||
GSocket *socket;
|
||||
@ -855,30 +848,15 @@ test_peer (void)
|
||||
g_assert (G_IS_SOCKET (socket));
|
||||
error = NULL;
|
||||
credentials = g_socket_get_credentials (socket, &error);
|
||||
#ifdef __linux__
|
||||
{
|
||||
struct ucred *native_creds;
|
||||
g_assert_no_error (error);
|
||||
g_assert (G_IS_CREDENTIALS (credentials));
|
||||
native_creds = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_LINUX_UCRED);
|
||||
g_assert (native_creds != NULL);
|
||||
g_assert (native_creds->uid == getuid ());
|
||||
g_assert (native_creds->gid == getgid ());
|
||||
g_assert (native_creds->pid == getpid ());
|
||||
}
|
||||
g_object_unref (credentials);
|
||||
#elif defined (__OpenBSD__)
|
||||
{
|
||||
struct sockpeercred *native_creds;
|
||||
g_assert_no_error (error);
|
||||
g_assert (G_IS_CREDENTIALS (credentials));
|
||||
native_creds = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED);
|
||||
g_assert (native_creds != NULL);
|
||||
g_assert (native_creds->uid == getuid ());
|
||||
g_assert (native_creds->gid == getgid ());
|
||||
g_assert (native_creds->pid == getpid ());
|
||||
}
|
||||
g_object_unref (credentials);
|
||||
|
||||
#if G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED
|
||||
g_assert_no_error (error);
|
||||
g_assert (G_IS_CREDENTIALS (credentials));
|
||||
|
||||
g_assert_cmpuint (g_credentials_get_unix_user (credentials, NULL), ==,
|
||||
getuid ());
|
||||
g_assert_cmpuint (g_credentials_get_unix_pid (credentials, NULL), ==,
|
||||
getpid ());
|
||||
#else
|
||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED);
|
||||
g_assert (credentials == NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user