| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | /* GDBus - GLib D-Bus Library
 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 13:14:55 -04:00
										 |  |  |  * Copyright (C) 2008-2010 Red Hat, Inc. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author: David Zeuthen <davidz@redhat.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "config.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #ifdef __FreeBSD__
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #include <sys/socket.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #ifdef __OpenBSD__
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #include <sys/socket.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-14 08:38:07 -04:00
										 |  |  | #include <gobject/gvaluecollector.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "gcredentials.h"
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  | #include "gnetworkingprivate.h"
 | 
					
						
							| 
									
										
										
										
											2010-05-14 08:38:07 -04:00
										 |  |  | #include "gioerror.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 16:34:23 -04:00
										 |  |  | #include "glibintl.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * SECTION:gcredentials | 
					
						
							| 
									
										
										
										
											2010-05-06 15:31:45 -04:00
										 |  |  |  * @short_description: An object containing credentials | 
					
						
							|  |  |  |  * @include: gio/gio.h | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * The #GCredentials type is a reference-counted wrapper for native | 
					
						
							|  |  |  |  * credentials. This information is typically used for identifying, | 
					
						
							|  |  |  |  * authenticating and authorizing other processes. | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Some operating systems supports looking up the credentials of the | 
					
						
							|  |  |  |  * remote peer of a communication endpoint - see e.g. | 
					
						
							|  |  |  |  * g_socket_get_credentials(). | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Some operating systems supports securely sending and receiving | 
					
						
							|  |  |  |  * credentials over a Unix Domain Socket, see | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * #GUnixCredentialsMessage, g_unix_connection_send_credentials() and | 
					
						
							|  |  |  |  * g_unix_connection_receive_credentials() for details. | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * On Linux, the native credential type is a <type>struct ucred</type> | 
					
						
							|  |  |  |  * - see the | 
					
						
							|  |  |  |  * <citerefentry><refentrytitle>unix</refentrytitle><manvolnum>7</manvolnum></citerefentry> | 
					
						
							|  |  |  |  * man page for details. This corresponds to | 
					
						
							|  |  |  |  * %G_CREDENTIALS_TYPE_LINUX_UCRED. | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * On FreeBSD, the native credential type is a <type>struct cmsgcred</type>. | 
					
						
							|  |  |  |  * This corresponds to %G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED. | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * On OpenBSD, the native credential type is a <type>struct sockpeercred</type>. | 
					
						
							|  |  |  |  * This corresponds to %G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * GCredentials: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The #GCredentials structure contains only private data and | 
					
						
							|  |  |  |  * should only be accessed using the provided API. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct _GCredentials | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   /*< private >*/ | 
					
						
							|  |  |  |   GObject parent_instance; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef __linux__
 | 
					
						
							|  |  |  |   struct ucred native; | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   struct cmsgcred native; | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #elif defined(__OpenBSD__)
 | 
					
						
							|  |  |  |   struct sockpeercred native; | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-06-22 12:13:21 +03:00
										 |  |  | #ifdef __GNUC__
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #warning Please add GCredentials support for your OS
 | 
					
						
							| 
									
										
										
										
											2010-06-22 12:13:21 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * GCredentialsClass: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Class structure for #GCredentials. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct _GCredentialsClass | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /*< private >*/ | 
					
						
							|  |  |  |   GObjectClass parent_class; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | G_DEFINE_TYPE (GCredentials, g_credentials, G_TYPE_OBJECT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_credentials_finalize (GObject *object) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   G_GNUC_UNUSED GCredentials *credentials = G_CREDENTIALS (object); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (G_OBJECT_CLASS (g_credentials_parent_class)->finalize != NULL) | 
					
						
							|  |  |  |     G_OBJECT_CLASS (g_credentials_parent_class)->finalize (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_credentials_class_init (GCredentialsClass *klass) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  |   gobject_class->finalize = g_credentials_finalize; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_credentials_init (GCredentials *credentials) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   credentials->native.pid = getpid (); | 
					
						
							| 
									
										
										
										
											2010-07-30 11:26:43 -04:00
										 |  |  |   credentials->native.uid = geteuid (); | 
					
						
							|  |  |  |   credentials->native.gid = getegid (); | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   memset (&credentials->native, 0, sizeof (struct cmsgcred)); | 
					
						
							|  |  |  |   credentials->native.cmcred_pid  = getpid (); | 
					
						
							|  |  |  |   credentials->native.cmcred_euid = geteuid (); | 
					
						
							|  |  |  |   credentials->native.cmcred_gid  = getegid (); | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #elif defined(__OpenBSD__)
 | 
					
						
							|  |  |  |   credentials->native.pid = getpid (); | 
					
						
							|  |  |  |   credentials->native.uid = geteuid (); | 
					
						
							|  |  |  |   credentials->native.gid = getegid (); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_credentials_new: | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Creates a new #GCredentials object with credentials matching the | 
					
						
							|  |  |  |  * the current process. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Returns: A #GCredentials. Free with g_object_unref(). | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | GCredentials * | 
					
						
							|  |  |  | g_credentials_new (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return g_object_new (G_TYPE_CREDENTIALS, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_credentials_to_string: | 
					
						
							|  |  |  |  * @credentials: A #GCredentials object. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Creates a human-readable textual representation of @credentials | 
					
						
							|  |  |  |  * that can be used in logging and debug messages. The format of the | 
					
						
							|  |  |  |  * returned string may change in future GLib release. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Returns: A string that should be freed with g_free(). | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | gchar * | 
					
						
							|  |  |  | g_credentials_to_string (GCredentials *credentials) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GString *ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ret = g_string_new ("GCredentials:"); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   g_string_append (ret, "linux-ucred:"); | 
					
						
							|  |  |  |   if (credentials->native.pid != -1) | 
					
						
							|  |  |  |     g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.pid); | 
					
						
							|  |  |  |   if (credentials->native.uid != -1) | 
					
						
							|  |  |  |     g_string_append_printf (ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.uid); | 
					
						
							|  |  |  |   if (credentials->native.gid != -1) | 
					
						
							|  |  |  |     g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.gid); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   if (ret->str[ret->len - 1] == ',') | 
					
						
							|  |  |  |     ret->str[ret->len - 1] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   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); | 
					
						
							|  |  |  |   if (credentials->native.cmcred_euid != -1) | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #elif defined(__OpenBSD__)
 | 
					
						
							|  |  |  |   g_string_append (ret, "openbsd-sockpeercred:"); | 
					
						
							|  |  |  |   if (credentials->native.pid != -1) | 
					
						
							|  |  |  |     g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.pid); | 
					
						
							|  |  |  |   if (credentials->native.uid != -1) | 
					
						
							|  |  |  |     g_string_append_printf (ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.uid); | 
					
						
							|  |  |  |   if (credentials->native.gid != -1) | 
					
						
							|  |  |  |     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'; | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   g_string_append (ret, "unknown"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return g_string_free (ret, FALSE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * g_credentials_is_same_user: | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * @credentials: A #GCredentials. | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * @other_credentials: A #GCredentials. | 
					
						
							|  |  |  |  * @error: Return location for error or %NULL. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Checks if @credentials and @other_credentials is the same user. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * This operation can fail if #GCredentials is not supported on the | 
					
						
							|  |  |  |  * the OS. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Returns: %TRUE if @credentials and @other_credentials has the same | 
					
						
							|  |  |  |  * user, %FALSE otherwise or if @error is set. | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | gboolean | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | g_credentials_is_same_user (GCredentials  *credentials, | 
					
						
							|  |  |  |                             GCredentials  *other_credentials, | 
					
						
							|  |  |  |                             GError       **error) | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   gboolean ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_CREDENTIALS (credentials), FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_CREDENTIALS (other_credentials), FALSE); | 
					
						
							|  |  |  |   g_return_val_if_fail (error == NULL || *error == NULL, FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   ret = FALSE; | 
					
						
							|  |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   if (credentials->native.uid == other_credentials->native.uid) | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |     ret = TRUE; | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   if (credentials->native.cmcred_euid == other_credentials->native.cmcred_euid) | 
					
						
							|  |  |  |     ret = TRUE; | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #elif defined(__OpenBSD__)
 | 
					
						
							|  |  |  |   if (credentials->native.uid == other_credentials->native.uid) | 
					
						
							|  |  |  |     ret = TRUE; | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   g_set_error_literal (error, | 
					
						
							|  |  |  |                        G_IO_ERROR, | 
					
						
							|  |  |  |                        G_IO_ERROR_NOT_SUPPORTED, | 
					
						
							|  |  |  |                        _("GCredentials is not implemented on this OS")); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   return ret; | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-09-24 18:24:41 -03:00
										 |  |  |  * g_credentials_get_native: (skip) | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * @credentials: A #GCredentials. | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * @native_type: The type of native credentials to get. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * Gets a pointer to native credentials of type @native_type from | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * @credentials. | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * It is a programming error (which will cause an warning to be | 
					
						
							|  |  |  |  * logged) to use this method if there is no #GCredentials support for | 
					
						
							|  |  |  |  * the OS or if @native_type isn't supported by the OS. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Returns: The pointer to native credentials or %NULL if the | 
					
						
							|  |  |  |  * operation there is no #GCredentials support for the OS or if | 
					
						
							|  |  |  |  * @native_type isn't supported by the OS. Do not free the returned | 
					
						
							|  |  |  |  * data, it is owned by @credentials. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | gpointer | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  | g_credentials_get_native (GCredentials     *credentials, | 
					
						
							|  |  |  |                           GCredentialsType  native_type) | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   gpointer ret; | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   ret = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   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; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   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; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #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; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   g_warning ("g_credentials_get_native: Trying to get credentials but GLib has no support " | 
					
						
							|  |  |  |              "for the native credentials type. Please add support."); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ret; | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * g_credentials_set_native: | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * @credentials: A #GCredentials. | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * @native_type: The type of native credentials to set. | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * @native: A pointer to native credentials. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * Copies the native credentials of type @native_type from @native | 
					
						
							|  |  |  |  * into @credentials. | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * It is a programming error (which will cause an warning to be | 
					
						
							|  |  |  |  * logged) to use this method if there is no #GCredentials support for | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |  * the OS or if @native_type isn't supported by the OS. | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  | g_credentials_set_native (GCredentials     *credentials, | 
					
						
							|  |  |  |                           GCredentialsType  native_type, | 
					
						
							|  |  |  |                           gpointer          native) | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   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)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   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)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #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)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   g_warning ("g_credentials_set_native: Trying to set credentials but GLib has no support " | 
					
						
							|  |  |  |              "for the native credentials type. Please add support."); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef G_OS_UNIX
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * g_credentials_get_unix_user: | 
					
						
							|  |  |  |  * @credentials: A #GCredentials | 
					
						
							|  |  |  |  * @error: Return location for error or %NULL. | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Tries to get the UNIX user identifier from @credentials. This | 
					
						
							|  |  |  |  * method is only available on UNIX platforms. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * This operation can fail if #GCredentials is not supported on the | 
					
						
							|  |  |  |  * OS or if the native credentials type does not contain information | 
					
						
							|  |  |  |  * about the UNIX user. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Returns: The UNIX user identifier or -1 if @error is set. | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | uid_t | 
					
						
							|  |  |  | g_credentials_get_unix_user (GCredentials    *credentials, | 
					
						
							|  |  |  |                              GError         **error) | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   uid_t ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_CREDENTIALS (credentials), -1); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   g_return_val_if_fail (error == NULL || *error == NULL, -1); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   ret = credentials->native.uid; | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   ret = credentials->native.cmcred_euid; | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #elif defined(__OpenBSD__)
 | 
					
						
							|  |  |  |   ret = credentials->native.uid; | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   ret = -1; | 
					
						
							|  |  |  |   g_set_error_literal (error, | 
					
						
							|  |  |  |                        G_IO_ERROR, | 
					
						
							|  |  |  |                        G_IO_ERROR_NOT_SUPPORTED, | 
					
						
							| 
									
										
										
										
											2010-05-18 23:45:54 +02:00
										 |  |  |                        _("There is no GCredentials support for your platform")); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * g_credentials_set_unix_user: | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * @credentials: A #GCredentials. | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * @uid: The UNIX user identifier to set. | 
					
						
							|  |  |  |  * @error: Return location for error or %NULL. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Tries to set the UNIX user identifier on @credentials. This method | 
					
						
							|  |  |  |  * is only available on UNIX platforms. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * This operation can fail if #GCredentials is not supported on the | 
					
						
							|  |  |  |  * OS or if the native credentials type does not contain information | 
					
						
							|  |  |  |  * about the UNIX user. | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |  * Returns: %TRUE if @uid was set, %FALSE if error is set. | 
					
						
							| 
									
										
										
										
											2010-05-06 16:02:08 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.26 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | gboolean | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | g_credentials_set_unix_user (GCredentials    *credentials, | 
					
						
							|  |  |  |                              uid_t            uid, | 
					
						
							|  |  |  |                              GError         **error) | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   gboolean ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_CREDENTIALS (credentials), FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   g_return_val_if_fail (uid != -1, FALSE); | 
					
						
							|  |  |  |   g_return_val_if_fail (error == NULL || *error == NULL, FALSE); | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   ret = FALSE; | 
					
						
							|  |  |  | #ifdef __linux__
 | 
					
						
							| 
									
										
										
										
											2010-07-20 14:02:14 -04:00
										 |  |  |   credentials->native.uid = uid; | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   ret = TRUE; | 
					
						
							| 
									
										
										
										
											2010-09-09 14:10:01 -04:00
										 |  |  | #elif defined(__FreeBSD__)
 | 
					
						
							|  |  |  |   credentials->native.cmcred_euid = uid; | 
					
						
							|  |  |  |   ret = TRUE; | 
					
						
							| 
									
										
										
										
											2011-05-27 15:51:08 +02:00
										 |  |  | #elif defined(__OpenBSD__)
 | 
					
						
							|  |  |  |   credentials->native.uid = uid; | 
					
						
							|  |  |  |   ret = TRUE; | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   g_set_error_literal (error, | 
					
						
							|  |  |  |                        G_IO_ERROR, | 
					
						
							|  |  |  |                        G_IO_ERROR_NOT_SUPPORTED, | 
					
						
							|  |  |  |                        _("GCredentials is not implemented on this OS")); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  |   return ret; | 
					
						
							| 
									
										
										
										
											2010-05-06 14:13:59 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-05-09 10:02:56 -04:00
										 |  |  | #endif /* G_OS_UNIX */
 |