[PATCH 2/2] libmbim,utils: new internal __mbim_user_allowed() method

Aleksander Morgado aleksander at aleksander.es
Tue Nov 18 08:10:03 PST 2014


On 15/11/14 02:23, Roshan Pius wrote:
> Allows to check whether the user is allowed to use the MBIM device.
> 
> Also fixes mbim_proxy_open() to make sure we always set the GError when FALSE is
> returned.
> 

Merged to git master, thanks.

> ---
>  src/libmbim-glib/mbim-proxy.c | 39 ++++++---------------------------------
>  src/libmbim-glib/mbim-utils.c | 33 +++++++++++++++++++++++++++++++++
>  src/libmbim-glib/mbim-utils.h |  2 ++
>  3 files changed, 41 insertions(+), 33 deletions(-)
> 
> diff --git a/src/libmbim-glib/mbim-proxy.c b/src/libmbim-glib/mbim-proxy.c
> index fc69cd7..e87b57a 100644
> --- a/src/libmbim-glib/mbim-proxy.c
> +++ b/src/libmbim-glib/mbim-proxy.c
> @@ -27,7 +27,6 @@
>  #include <sys/file.h>
>  #include <sys/types.h>
>  #include <errno.h>
> -#include <pwd.h>
>  
>  #include <glib.h>
>  #include <glib/gstdio.h>
> @@ -1044,7 +1043,6 @@ incoming_cb (GSocketService *service,
>      Client *client;
>      GCredentials *credentials;
>      GError *error = NULL;
> -    struct passwd *expected_usr = NULL;
>      uid_t uid;
>  
>      g_debug ("Client (%d) connection open...", g_socket_get_fd (g_socket_connection_get_socket (connection)));
> @@ -1064,20 +1062,13 @@ incoming_cb (GSocketService *service,
>          return;
>      }
>  
> -    expected_usr = getpwnam (MBIM_USERNAME);
> -    if (!expected_usr) {
> -        g_warning ("Unknown user configured: %s", MBIM_USERNAME);
> -        /* Falling back to check for root user if the configured user is unknown */
> -        if (uid != 0) {
> -            g_warning ("Client not allowed: Not enough privileges");
> -            return;
> -        }
> -    }
> -    else if (uid != expected_usr->pw_uid) {
> -        g_warning ("Client not allowed: Not the expected user: %s", MBIM_USERNAME);
> +    if (!__mbim_user_allowed (uid, &error)) {
> +        g_warning ("Client not allowed: %s", error->message);
> +        g_error_free (error);
>          return;
>      }
>  
> +
>      /* Create client */
>      client = g_slice_new0 (Client);
>      client->self = self;
> @@ -1226,26 +1217,8 @@ MbimProxy *
>  mbim_proxy_new (GError **error)
>  {
>      MbimProxy *self;
> -    struct passwd *expected_usr = NULL;
> -
> -    /* Only the specified user can run the mbim-proxy */
> -    expected_usr = getpwnam (MBIM_USERNAME);
> -    if (!expected_usr) {
> -        g_warning ("Unknown user configured: %s", MBIM_USERNAME);
> -        /* Falling back to check for root user if the configured user is unknown */
> -        if (getuid () != 0) {
> -            g_set_error (error,
> -                         MBIM_CORE_ERROR,
> -                         MBIM_CORE_ERROR_FAILED,
> -                          "Not enough privileges");
> -            return NULL;
> -        }
> -    }
> -    else if (getuid () != expected_usr->pw_uid) {
> -        g_set_error (error,
> -                     MBIM_CORE_ERROR,
> -                     MBIM_CORE_ERROR_FAILED,
> -                     "Not started with the expected user: %s", MBIM_USERNAME);
> +
> +    if (!__mbim_user_allowed (getuid(), error)) {
>          return NULL;
>      }
>  
> diff --git a/src/libmbim-glib/mbim-utils.c b/src/libmbim-glib/mbim-utils.c
> index 12fab7a..f5a766b 100644
> --- a/src/libmbim-glib/mbim-utils.c
> +++ b/src/libmbim-glib/mbim-utils.c
> @@ -25,8 +25,10 @@
>  #include <string.h>
>  #include <stdint.h>
>  #include <stdio.h>
> +#include <pwd.h>
>  
>  #include "mbim-utils.h"
> +#include "mbim-error-types.h"
>  
>  /**
>   * SECTION:mbim-utils
> @@ -73,6 +75,37 @@ __mbim_utils_str_hex (gconstpointer mem,
>  }
>  
>  /*****************************************************************************/
> +gboolean
> +__mbim_user_allowed (uid_t uid,
> +                     GError **error)
> +{
> +    struct passwd *expected_usr = NULL;
> +
> +    expected_usr = getpwnam (MBIM_USERNAME);
> +    if (!expected_usr) {
> +        g_warning ("Unknown user configured: %s", MBIM_USERNAME);
> +        /* Falling back to check for root user if the configured user is unknown */
> +        if (uid == 0)
> +            return TRUE;
> +
> +        g_set_error (error,
> +                     MBIM_CORE_ERROR,
> +                     MBIM_CORE_ERROR_FAILED,
> +                     "Not enough privileges (unknown username %s)", MBIM_USERNAME);
> +        return FALSE;
> +    }
> +
> +    if (uid == expected_usr->pw_uid)
> +        return TRUE;
> +
> +    g_set_error (error,
> +                 MBIM_CORE_ERROR,
> +                 MBIM_CORE_ERROR_FAILED,
> +                 "Not enough privileges");
> +    return FALSE;
> +}
> +
> +/*****************************************************************************/
>  
>  static volatile gint __traces_enabled = FALSE;
>  
> diff --git a/src/libmbim-glib/mbim-utils.h b/src/libmbim-glib/mbim-utils.h
> index 62bbc92..ee5632f 100644
> --- a/src/libmbim-glib/mbim-utils.h
> +++ b/src/libmbim-glib/mbim-utils.h
> @@ -42,6 +42,8 @@ void     mbim_utils_set_traces_enabled (gboolean enabled);
>  gchar *__mbim_utils_str_hex (gconstpointer mem,
>                               gsize         size,
>                               gchar         delimiter);
> +gboolean __mbim_user_allowed (uid_t uid,
> +                              GError **error);
>  #endif
>  
>  G_END_DECLS
> 


-- 
Aleksander
https://aleksander.es


More information about the libmbim-devel mailing list