Prepare master for new framework integration
[AGL/meta-agl.git] / meta-app-framework / recipes-core / dbus-cynagora / dbus-cynagora / 0007-Switch-from-cynara-to-cynagora.patch
diff --git a/meta-app-framework/recipes-core/dbus-cynagora/dbus-cynagora/0007-Switch-from-cynara-to-cynagora.patch b/meta-app-framework/recipes-core/dbus-cynagora/dbus-cynagora/0007-Switch-from-cynara-to-cynagora.patch
deleted file mode 100644 (file)
index 7a69efc..0000000
+++ /dev/null
@@ -1,1048 +0,0 @@
-From 43cc361a5c32c81c0f93451bdb0ef781cd19a1cb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jos=C3=A9=20Bollo?= <jose.bollo@iot.bzh>
-Date: Tue, 4 Feb 2020 12:23:36 +0100
-Subject: [PATCH 7/8] Switch from cynara to cynagora
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: José Bollo <jose.bollo@iot.bzh>
----
- bus/Makefile.am                    |   8 +-
- bus/bus.h                          |   2 +-
- bus/check.c                        |  26 +-
- bus/check.h                        |   2 +-
- bus/connection.c                   |  27 ---
- bus/connection.h                   |   3 -
- bus/cynagora-check.c               | 330 +++++++++++++++++++++++++
- bus/{cynara.h => cynagora-check.h} |  10 +-
- bus/cynara.c                       | 373 -----------------------------
- bus/system.conf.in                 |   6 +-
- configure.ac                       |  18 +-
- 11 files changed, 366 insertions(+), 439 deletions(-)
- create mode 100644 bus/cynagora-check.c
- rename bus/{cynara.h => cynagora-check.h} (81%)
- delete mode 100644 bus/cynara.c
-
-diff --git a/bus/Makefile.am b/bus/Makefile.am
-index 2a8a72c..1720048 100644
---- a/bus/Makefile.am
-+++ b/bus/Makefile.am
-@@ -13,7 +13,7 @@ DBUS_BUS_LIBS = \
-       $(THREAD_LIBS) \
-       $(ADT_LIBS) \
-       $(NETWORK_libs) \
--      $(CYNARA_LIBS) \
-+      $(CYNAGORA_LIBS) \
-       $(NULL)
- DBUS_LAUNCHER_LIBS = \
-@@ -31,7 +31,7 @@ AM_CPPFLAGS = \
-       $(APPARMOR_CFLAGS) \
-       -DDBUS_SYSTEM_CONFIG_FILE=\""$(dbusdatadir)/system.conf"\" \
-       -DDBUS_COMPILATION \
--      $(CYNARA_CFLAGS) \
-+      $(CYNAGORA_CFLAGS) \
-       $(NULL)
- # if assertions are enabled, improve backtraces
-@@ -101,8 +101,8 @@ BUS_SOURCES=                                       \
-       config-parser-common.h                  \
-       connection.c                            \
-       connection.h                            \
--      cynara.c                                \
--      cynara.h                                \
-+      cynagora-check.c                        \
-+      cynagora-check.h                        \
-       desktop-file.c                          \
-       desktop-file.h                          \
-       $(DIR_WATCH_SOURCE)                     \
-diff --git a/bus/bus.h b/bus/bus.h
-index 1b08f7c..e167d9e 100644
---- a/bus/bus.h
-+++ b/bus/bus.h
-@@ -47,7 +47,7 @@ typedef struct BusMatchRule     BusMatchRule;
- typedef struct BusActivationEntry BusActivationEntry;
- typedef struct BusCheck         BusCheck;
- typedef struct BusDeferredMessage BusDeferredMessage;
--typedef struct BusCynara        BusCynara;
-+typedef struct BusCynagora        BusCynagora;
- /**
-  * BusResult is defined as a pointer to a dummy structure to allow detection of type mismatches.
-diff --git a/bus/check.c b/bus/check.c
-index b73d08b..ec30770 100644
---- a/bus/check.c
-+++ b/bus/check.c
-@@ -26,7 +26,7 @@
- #include "check.h"
- #include "connection.h"
- #include "dispatch.h"
--#include "cynara.h"
-+#include "cynagora-check.h"
- #include "utils.h"
- #include <dbus/dbus-connection-internal.h>
- #include <dbus/dbus-message-internal.h>
-@@ -38,7 +38,7 @@ typedef struct BusCheck
-   int refcount;
-   BusContext *context;
--  BusCynara *cynara;
-+  BusCynagora *cynagora;
- } BusCheck;
- typedef struct BusDeferredMessage
-@@ -81,7 +81,7 @@ bus_check_new (BusContext *context, DBusError *error)
-   check->refcount = 1;
-   check->context = context;
--  check->cynara = bus_cynara_new(check, error);
-+  check->cynagora = bus_cynagora_new(check, error);
-   if (dbus_error_is_set(error))
-     {
-       dbus_message_free_data_slot(&deferred_message_data_slot);
-@@ -110,7 +110,7 @@ bus_check_unref (BusCheck *check)
-   if (check->refcount == 0)
-     {
--      bus_cynara_unref(check->cynara);
-+      bus_cynagora_unref(check->cynagora);
-       dbus_message_free_data_slot(&deferred_message_data_slot);
-       dbus_free(check);
-     }
-@@ -122,10 +122,10 @@ bus_check_get_context (BusCheck *check)
-   return check->context;
- }
--BusCynara *
--bus_check_get_cynara (BusCheck *check)
-+BusCynagora *
-+bus_check_get_cynagora (BusCheck *check)
- {
--  return check->cynara;
-+  return check->cynagora;
- }
- static void
-@@ -276,8 +276,8 @@ bus_check_privilege (BusCheck *check,
- {
-   BusDeferredMessage *previous_deferred_message;
-   BusResult result = BUS_RESULT_FALSE;
--#ifdef DBUS_ENABLE_CYNARA
--  BusCynara *cynara;
-+#ifdef DBUS_ENABLE_CYNAGORA
-+  BusCynagora *cynagora;
- #endif
-   DBusConnection *connection;
-@@ -304,7 +304,7 @@ bus_check_privilege (BusCheck *check,
-            * Message has been deferred due to receive or own rule which means that sending this message
-            * is allowed - it must have been checked previously.
-            * This might happen when client calls RequestName method which depending on security
--           * policy might result in both "can_send" and "can_own" Cynara checks.
-+           * policy might result in both "can_send" and "can_own" Cynagora checks.
-            */
-           result = BUS_RESULT_TRUE;
-         }
-@@ -327,9 +327,9 @@ bus_check_privilege (BusCheck *check,
-   else
-     {
-       /* ask policy checkers */
--#ifdef DBUS_ENABLE_CYNARA
--      cynara = bus_check_get_cynara(check);
--      result = bus_cynara_check_privilege(cynara, message, sender, addressed_recipient,
-+#ifdef DBUS_ENABLE_CYNAGORA
-+      cynagora = bus_check_get_cynagora(check);
-+      result = bus_cynagora_check_privilege(cynagora, message, sender, addressed_recipient,
-           proposed_recipient, privilege, check_type, deferred_message);
- #endif
-       if (result == BUS_RESULT_LATER && deferred_message != NULL)
-diff --git a/bus/check.h b/bus/check.h
-index d718a69..ab63c18 100644
---- a/bus/check.h
-+++ b/bus/check.h
-@@ -45,7 +45,7 @@ BusCheck   *bus_check_ref         (BusCheck *check);
- void        bus_check_unref       (BusCheck *check);
- BusContext *bus_check_get_context (BusCheck *check);
--BusCynara  *bus_check_get_cynara  (BusCheck *check);
-+BusCynagora  *bus_check_get_cynagora  (BusCheck *check);
- BusResult   bus_check_privilege   (BusCheck *check,
-                                    DBusMessage *message,
-                                    DBusConnection *sender,
-diff --git a/bus/connection.c b/bus/connection.c
-index b520d57..48910e0 100644
---- a/bus/connection.c
-+++ b/bus/connection.c
-@@ -38,10 +38,6 @@
- #include <dbus/dbus-connection-internal.h>
- #include <dbus/dbus-internals.h>
- #include <dbus/dbus-message-internal.h>
--#ifdef DBUS_ENABLE_CYNARA
--#include <stdlib.h>
--#include <cynara-session.h>
--#endif
- /* Trim executed commands to this length; we want to keep logs readable */
- #define MAX_LOG_COMMAND_LEN 50
-@@ -124,9 +120,6 @@ typedef struct
-   /** non-NULL if and only if this is a monitor */
-   DBusList *link_in_monitors;
--#ifdef DBUS_ENABLE_CYNARA
--  char *cynara_session_id;
--#endif
- } BusConnectionData;
- static dbus_bool_t bus_pending_reply_expired (BusExpireList *list,
-@@ -461,10 +454,6 @@ free_connection_data (void *data)
-   
-   dbus_free (d->name);
-   
--#ifdef DBUS_ENABLE_CYNARA
--  free (d->cynara_session_id);
--#endif
--
-   dbus_free (d);
- }
-@@ -1095,22 +1084,6 @@ bus_connection_get_policy (DBusConnection *connection)
-   return d->policy;
- }
--#ifdef DBUS_ENABLE_CYNARA
--const char *bus_connection_get_cynara_session_id (DBusConnection *connection)
--{
--  BusConnectionData *d = BUS_CONNECTION_DATA (connection);
--  _dbus_assert (d != NULL);
--
--  if (d->cynara_session_id == NULL)
--    {
--      unsigned long pid;
--      if (dbus_connection_get_unix_process_id(connection, &pid))
--        d->cynara_session_id = cynara_session_from_pid(pid);
--    }
--  return d->cynara_session_id;
--}
--#endif
--
- static dbus_bool_t
- foreach_active (BusConnections               *connections,
-                 BusConnectionForeachFunction  function,
-diff --git a/bus/connection.h b/bus/connection.h
-index 6af7bf1..3116bcf 100644
---- a/bus/connection.h
-+++ b/bus/connection.h
-@@ -138,9 +138,6 @@ dbus_bool_t bus_connection_be_monitor (DBusConnection  *connection,
-                                        BusTransaction  *transaction,
-                                        DBusList       **rules,
-                                        DBusError       *error);
--#ifdef DBUS_ENABLE_CYNARA
--const char *bus_connection_get_cynara_session_id (DBusConnection *connection);
--#endif
- /* transaction API so we can send or not send a block of messages as a whole */
-diff --git a/bus/cynagora-check.c b/bus/cynagora-check.c
-new file mode 100644
-index 0000000..6c0c635
---- /dev/null
-+++ b/bus/cynagora-check.c
-@@ -0,0 +1,330 @@
-+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-+/* cynagora.c  Cynagora runtime privilege checking
-+ *
-+ * Copyright (c) 2014 Samsung Electronics, Ltd.
-+ *
-+ * Licensed under the Academic Free License version 2.1
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-+ *
-+ */
-+
-+#include <config.h>
-+#include "cynagora-check.h"
-+#include "check.h"
-+#include "utils.h"
-+
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <errno.h>
-+
-+#include <dbus/dbus.h>
-+#include <dbus/dbus-watch.h>
-+#include <dbus/dbus-connection-internal.h>
-+#include <bus/connection.h>
-+
-+#ifndef DBUS_ENABLE_CYNAGORA
-+
-+BusCynagora *
-+bus_cynagora_new(BusCheck *check, DBusError *error)
-+{
-+  return NULL;
-+}
-+
-+BusCynagora *
-+bus_cynagora_ref (BusCynagora *cynagora)
-+{
-+  return NULL;
-+}
-+
-+void
-+bus_cynagora_unref (BusCynagora *cynagora)
-+{
-+}
-+
-+BusResult
-+bus_cynagora_check_privilege (BusCynagora *cynagora,
-+                            DBusMessage *message,
-+                            DBusConnection *sender,
-+                            DBusConnection *addressed_recipient,
-+                            DBusConnection *proposed_recipient,
-+                            const char *privilege,
-+                            BusDeferredMessageStatus check_type,
-+                            BusDeferredMessage **deferred_message_param)
-+{
-+  return BUS_RESULT_FALSE;
-+}
-+
-+#endif
-+
-+#ifdef DBUS_ENABLE_CYNAGORA
-+
-+#include <time.h>
-+#include <sys/epoll.h>
-+
-+#include <cynagora.h>
-+
-+#ifndef CYNAGORA_CACHE_SIZE
-+#define CYNAGORA_CACHE_SIZE 8000
-+#endif
-+
-+typedef struct BusCynagora
-+{
-+  int refcount;
-+
-+  BusContext   *context;
-+  BusCheck     *check;
-+  cynagora_t   *cynagora;
-+  DBusWatch    *cynagora_watch;
-+} BusCynagora;
-+
-+static int async_callback(void *closure,
-+                          int op,
-+                          int fd,
-+                          uint32_t events);
-+
-+BusCynagora *
-+bus_cynagora_new(BusCheck *check, DBusError *error)
-+{
-+  BusContext *context;
-+  BusCynagora *cynagora;
-+  int ret;
-+
-+  cynagora = dbus_new(BusCynagora, 1);
-+  if (cynagora == NULL)
-+    {
-+      BUS_SET_OOM(error);
-+      return NULL;
-+    }
-+
-+  context = bus_check_get_context(check);
-+
-+  cynagora->refcount = 1;
-+  cynagora->check = check;
-+  cynagora->context = context;
-+  cynagora->cynagora_watch = NULL;
-+
-+  ret = cynagora_create(&cynagora->cynagora, cynagora_Check, CYNAGORA_CACHE_SIZE, NULL);
-+  if (ret < 0)
-+    {
-+      dbus_set_error (error, DBUS_ERROR_FAILED, "Failed to create Cynagora configuration");
-+    }
-+  else
-+    {
-+      ret = cynagora_async_setup(cynagora->cynagora, async_callback, cynagora);
-+      if (ret < 0)
-+        {
-+          dbus_set_error (error, DBUS_ERROR_FAILED, "Failed to initialize Cynagora client");
-+        }
-+        else
-+        {
-+          return cynagora;
-+        }
-+        cynagora_destroy(cynagora->cynagora);
-+    }
-+
-+  dbus_free(cynagora);
-+  return NULL;
-+}
-+
-+BusCynagora *
-+bus_cynagora_ref (BusCynagora *cynagora)
-+{
-+  _dbus_assert (cynagora->refcount > 0);
-+  cynagora->refcount += 1;
-+
-+  return cynagora;
-+}
-+
-+void
-+bus_cynagora_unref (BusCynagora *cynagora)
-+{
-+  _dbus_assert (cynagora->refcount > 0);
-+
-+  cynagora->refcount -= 1;
-+
-+  if (cynagora->refcount == 0)
-+    {
-+      cynagora_destroy(cynagora->cynagora);
-+      dbus_free(cynagora);
-+    }
-+}
-+
-+static void
-+async_check_callback (void *closure, int status)
-+{
-+  BusDeferredMessage *deferred_message = closure;
-+  BusResult result;
-+
-+  if (deferred_message == NULL)
-+    return;
-+
-+  if (status == 1)
-+    result = BUS_RESULT_TRUE;
-+  else
-+    result = BUS_RESULT_FALSE;
-+
-+  bus_deferred_message_response_received(deferred_message, result);
-+  bus_deferred_message_unref(deferred_message);
-+}
-+
-+BusResult
-+bus_cynagora_check_privilege (BusCynagora *cynagora,
-+                            DBusMessage *message,
-+                            DBusConnection *sender,
-+                            DBusConnection *addressed_recipient,
-+                            DBusConnection *proposed_recipient,
-+                            const char *permission,
-+                            BusDeferredMessageStatus check_type,
-+                            BusDeferredMessage **deferred_message_param)
-+{
-+  int result;
-+  unsigned long uid;
-+  unsigned long pid;
-+  char *label;
-+  char user[32];
-+  char session[32];
-+  DBusConnection *connection = check_type == BUS_DEFERRED_MESSAGE_CHECK_RECEIVE ? proposed_recipient : sender;
-+  BusDeferredMessage *deferred_message;
-+  BusResult ret;
-+  cynagora_key_t key;
-+
-+  _dbus_assert(connection != NULL);
-+
-+  if (dbus_connection_get_unix_user(connection, &uid) == FALSE)
-+      return BUS_RESULT_FALSE;
-+
-+  if (dbus_connection_get_unix_process_id(connection, &pid) == FALSE)
-+      return BUS_RESULT_FALSE;
-+
-+  if (_dbus_connection_get_linux_security_label(connection, &label) == FALSE || label == NULL)
-+    {
-+      _dbus_warn("Failed to obtain security label for connection\n");
-+      return BUS_RESULT_FALSE;
-+    }
-+
-+  snprintf(user, sizeof(user), "%lu", uid);
-+  snprintf(session, sizeof(session), "%lu", pid);
-+
-+  key.client = label;
-+  key.session = session;
-+  key.user = user;
-+  key.permission = permission;
-+
-+  result = cynagora_cache_check(cynagora->cynagora, &key);
-+  switch (result)
-+  {
-+  case 1:
-+    _dbus_verbose("Cynagora: got ALLOWED answer from cache (client=%s session_id=%s user=%s permission=%s)\n",
-+               label, session_id, user, permission);
-+    ret = BUS_RESULT_TRUE;
-+    break;
-+
-+  case 0:
-+    _dbus_verbose("Cynagora: got DENIED answer from cache (client=%s session_id=%s user=%s permission=%s)\n",
-+               label, session_id, user, permission);
-+    ret = BUS_RESULT_FALSE;
-+    break;
-+
-+  default:
-+     deferred_message = bus_deferred_message_new(message, sender, addressed_recipient,
-+         proposed_recipient, BUS_RESULT_LATER);
-+     if (deferred_message == NULL)
-+       {
-+         _dbus_verbose("Failed to allocate memory for deferred message\n");
-+         ret = BUS_RESULT_FALSE;
-+         goto out;
-+       }
-+
-+    /* callback is supposed to unref deferred_message*/
-+    result = cynagora_async_check(cynagora->cynagora, &key, 1, 0, async_check_callback, deferred_message);
-+    if (result == 0)
-+      {
-+        _dbus_verbose("Created Cynagora request: client=%s session_id=%s user=%s permission=%s "
-+            "deferred_message=%p\n", label, session_id, user, permission, deferred_message);
-+        if (deferred_message_param != NULL)
-+          *deferred_message_param = deferred_message;
-+        ret = BUS_RESULT_LATER;
-+      }
-+    else
-+      {
-+        _dbus_verbose("Error on cynagora request create: %i\n", result);
-+        bus_deferred_message_unref(deferred_message);
-+        ret = BUS_RESULT_FALSE;
-+      }
-+    break;
-+  }
-+out:
-+  dbus_free(label);
-+  return ret;
-+}
-+
-+static dbus_bool_t
-+watch_handler_callback(DBusWatch    *watch,
-+                       unsigned int  flags,
-+                       void         *data)
-+{
-+  BusCynagora *cynagora = (BusCynagora *)data;
-+  int result = cynagora_async_process(cynagora->cynagora);
-+  if (result < 0)
-+      _dbus_verbose("cynagora_async_process returned %d\n", result);
-+
-+  return result != -ENOMEM ? TRUE : FALSE;
-+}
-+
-+static int
-+async_callback(void *closure, int op, int fd, uint32_t events)
-+{
-+  BusCynagora *cynagora = (BusCynagora *)closure;
-+  DBusLoop *loop = bus_context_get_loop(cynagora->context);
-+  unsigned int flags;
-+  DBusWatch *watch;
-+
-+  /* compute flags */
-+  flags = 0;
-+  if (events & EPOLLIN)
-+    flags |= DBUS_WATCH_READABLE;
-+  if (events & EPOLLOUT)
-+    flags |= DBUS_WATCH_WRITABLE;
-+
-+  /* remove the watch if needed */
-+  watch = cynagora->cynagora_watch;
-+  if (watch != NULL)
-+    {
-+      cynagora->cynagora_watch = NULL;
-+      _dbus_loop_remove_watch(loop, watch);
-+      _dbus_watch_invalidate(watch);
-+      _dbus_watch_unref(watch);
-+    }
-+
-+  /* create the watch if needed */
-+  watch = cynagora->cynagora_watch;
-+  if (op != EPOLL_CTL_DEL)
-+    {
-+      watch = _dbus_watch_new(fd, flags, TRUE, watch_handler_callback, cynagora, NULL);
-+      if (watch == NULL)
-+        return -ENOMEM;
-+      if (_dbus_loop_add_watch(loop, watch) != TRUE)
-+        {
-+          _dbus_watch_invalidate(watch);
-+          _dbus_watch_unref(watch);
-+          return -ENOMEM;
-+        }
-+      cynagora->cynagora_watch = watch;
-+    }
-+  return 0;
-+}
-+
-+#endif /* DBUS_ENABLE_CYNAGORA */
-diff --git a/bus/cynara.h b/bus/cynagora-check.h
-similarity index 81%
-rename from bus/cynara.h
-rename to bus/cynagora-check.h
-index c4728bb..c0892c3 100644
---- a/bus/cynara.h
-+++ b/bus/cynagora-check.h
-@@ -1,5 +1,5 @@
- /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
--/* cynara.h  Cynara runtime privilege checking
-+/* cynagora.h  Cynagora runtime privilege checking
-  *
-  * Copyright (c) 2014 Samsung Electronics, Ltd.
-  *
-@@ -24,10 +24,10 @@
- #include "bus.h"
- #include "check.h"
--BusCynara *bus_cynara_new             (BusCheck *check, DBusError *error);
--BusCynara *bus_cynara_ref             (BusCynara *cynara);
--void       bus_cynara_unref           (BusCynara *cynara);
--BusResult  bus_cynara_check_privilege (BusCynara *cynara,
-+BusCynagora *bus_cynagora_new             (BusCheck *check, DBusError *error);
-+BusCynagora *bus_cynagora_ref             (BusCynagora *cynagora);
-+void       bus_cynagora_unref           (BusCynagora *cynagora);
-+BusResult  bus_cynagora_check_privilege (BusCynagora *cynagora,
-                                        DBusMessage *message,
-                                        DBusConnection *sender,
-                                        DBusConnection *addressed_recipient,
-diff --git a/bus/cynara.c b/bus/cynara.c
-deleted file mode 100644
-index 77aed62..0000000
---- a/bus/cynara.c
-+++ /dev/null
-@@ -1,373 +0,0 @@
--/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
--/* cynara.c  Cynara runtime privilege checking
-- *
-- * Copyright (c) 2014 Samsung Electronics, Ltd.
-- *
-- * Licensed under the Academic Free License version 2.1
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program 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 General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-- *
-- */
--
--#include <config.h>
--#include "cynara.h"
--#include "check.h"
--#include "utils.h"
--
--#include <stdio.h>
--
--#include <dbus/dbus.h>
--#include <dbus/dbus-watch.h>
--#include <dbus/dbus-connection-internal.h>
--#include <bus/connection.h>
--#ifdef DBUS_ENABLE_CYNARA
--#include <cynara-client-async.h>
--#endif
--
--#ifdef DBUS_ENABLE_CYNARA
--typedef struct BusCynara
--{
--  int refcount;
--
--  BusContext   *context;
--  BusCheck     *check;
--  cynara_async *cynara;
--  DBusWatch    *cynara_watch;
--} BusCynara;
--
--#define USE_CYNARA_CACHE 1
--#ifdef USE_CYNARA_CACHE
--#define CYNARA_CACHE_SIZE 1000
--#endif
--
--static dbus_bool_t bus_cynara_watch_callback(DBusWatch *watch,
--                                             unsigned int flags,
--                                             void *data);
--
--static void status_callback(int old_fd,
--                            int new_fd,
--                            cynara_async_status status,
--                            void *user_status_data);
--static void bus_cynara_check_response_callback (cynara_check_id check_id,
--                                                cynara_async_call_cause cause,
--                                                int response,
--                                                void *user_response_data);
--#endif
--
--
--BusCynara *
--bus_cynara_new(BusCheck *check, DBusError *error)
--{
--#ifdef DBUS_ENABLE_CYNARA
--  BusContext *context;
--  BusCynara *cynara;
--  cynara_async_configuration *conf = NULL;
--  int ret;
--
--  cynara = dbus_new(BusCynara, 1);
--  if (cynara == NULL)
--    {
--      BUS_SET_OOM(error);
--      return NULL;
--    }
--
--  context = bus_check_get_context(check);
--
--  cynara->refcount = 1;
--  cynara->check = check;
--  cynara->context = context;
--  cynara->cynara_watch = NULL;
--
--  ret = cynara_async_configuration_create(&conf);
--  if (ret != CYNARA_API_SUCCESS)
--    {
--      dbus_set_error (error, DBUS_ERROR_FAILED, "Failed to create Cynara configuration");
--      goto out;
--    }
--
--#ifdef CYNARA_CACHE_SIZE
--  ret = cynara_async_configuration_set_cache_size(conf, CYNARA_CACHE_SIZE);
--  if (ret != CYNARA_API_SUCCESS)
--    {
--      dbus_set_error (error, DBUS_ERROR_FAILED, "Failed to Cynara cache size");
--      goto out;
--    }
--#endif
--
--  ret = cynara_async_initialize(&cynara->cynara, conf, &status_callback, cynara);
--  if (ret != CYNARA_API_SUCCESS)
--    {
--      dbus_set_error (error, DBUS_ERROR_FAILED, "Failed to initialize Cynara client");
--      goto out;
--    }
--
--out:
--  cynara_async_configuration_destroy(conf);
--  if (ret != CYNARA_API_SUCCESS)
--    {
--      dbus_free(cynara);
--      return NULL;
--    }
--
--  return cynara;
--#else
--  return NULL;
--#endif
--}
--
--BusCynara *
--bus_cynara_ref (BusCynara *cynara)
--{
--#ifdef DBUS_ENABLE_CYNARA
--  _dbus_assert (cynara->refcount > 0);
--  cynara->refcount += 1;
--
--  return cynara;
--#else
--  return NULL;
--#endif
--}
--
--void
--bus_cynara_unref (BusCynara *cynara)
--{
--#ifdef DBUS_ENABLE_CYNARA
--  _dbus_assert (cynara->refcount > 0);
--
--  cynara->refcount -= 1;
--
--  if (cynara->refcount == 0)
--    {
--      cynara_async_finish(cynara->cynara);
--      dbus_free(cynara);
--    }
--#endif
--}
--
--BusResult
--bus_cynara_check_privilege (BusCynara *cynara,
--                            DBusMessage *message,
--                            DBusConnection *sender,
--                            DBusConnection *addressed_recipient,
--                            DBusConnection *proposed_recipient,
--                            const char *privilege,
--                            BusDeferredMessageStatus check_type,
--                            BusDeferredMessage **deferred_message_param)
--{
--#ifdef DBUS_ENABLE_CYNARA
--  int result;
--  unsigned long uid;
--  char *label;
--  const char *session_id;
--  char user[32];
--  cynara_check_id check_id;
--  DBusConnection *connection = check_type == BUS_DEFERRED_MESSAGE_CHECK_RECEIVE ? proposed_recipient : sender;
--  BusDeferredMessage *deferred_message;
--  BusResult ret;
--
--  _dbus_assert(connection != NULL);
--
--  if (dbus_connection_get_unix_user(connection, &uid) == FALSE)
--      return BUS_RESULT_FALSE;
--
--  if (_dbus_connection_get_linux_security_label(connection, &label) == FALSE || label == NULL)
--    {
--      _dbus_warn("Failed to obtain security label for connection\n");
--      return BUS_RESULT_FALSE;
--    }
--
--  session_id = bus_connection_get_cynara_session_id (connection);
--  if (session_id == NULL)
--    {
--      ret = BUS_RESULT_FALSE;
--      goto out;
--    }
--
--  snprintf(user, sizeof(user), "%lu", uid);
--
--#if USE_CYNARA_CACHE
--  result = cynara_async_check_cache(cynara->cynara, label, session_id, user, privilege);
--#else
--  result = CYNARA_API_CACHE_MISS;
--#endif
--
--  switch (result)
--  {
--  case CYNARA_API_ACCESS_ALLOWED:
--    _dbus_verbose("Cynara: got ALLOWED answer from cache (client=%s session_id=%s user=%s privilege=%s)\n",
--               label, session_id, user, privilege);
--    ret = BUS_RESULT_TRUE;
--    break;
--
--  case CYNARA_API_ACCESS_DENIED:
--    _dbus_verbose("Cynara: got DENIED answer from cache (client=%s session_id=%s user=%s privilege=%s)\n",
--               label, session_id, user, privilege);
--    ret = BUS_RESULT_FALSE;
--    break;
--
--  case CYNARA_API_CACHE_MISS:
--     deferred_message = bus_deferred_message_new(message, sender, addressed_recipient,
--         proposed_recipient, BUS_RESULT_LATER);
--     if (deferred_message == NULL)
--       {
--         _dbus_verbose("Failed to allocate memory for deferred message\n");
--         ret = BUS_RESULT_FALSE;
--         goto out;
--       }
--
--    /* callback is supposed to unref deferred_message*/
--    result = cynara_async_create_request(cynara->cynara, label, session_id, user, privilege, &check_id,
--        &bus_cynara_check_response_callback, deferred_message);
--    if (result == CYNARA_API_SUCCESS)
--      {
--        _dbus_verbose("Created Cynara request: client=%s session_id=%s user=%s privilege=%s check_id=%u "
--            "deferred_message=%p\n", label, session_id, user, privilege, (unsigned int)check_id, deferred_message);
--        if (deferred_message_param != NULL)
--          *deferred_message_param = deferred_message;
--        ret = BUS_RESULT_LATER;
--      }
--    else
--      {
--        _dbus_verbose("Error on cynara request create: %i\n", result);
--        bus_deferred_message_unref(deferred_message);
--        ret = BUS_RESULT_FALSE;
--      }
--    break;
--  default:
--    _dbus_verbose("Error when accessing Cynara cache: %i\n", result);
--    ret = BUS_RESULT_FALSE;
--  }
--out:
--  dbus_free(label);
--  return ret;
--
--#else
--  return BUS_RESULT_FALSE;
--#endif
--}
--
--
--
--#ifdef DBUS_ENABLE_CYNARA
--static void
--status_callback(int old_fd, int new_fd, cynara_async_status status,
--                void *user_status_data)
--{
--  BusCynara *cynara = (BusCynara *)user_status_data;
--  DBusLoop *loop = bus_context_get_loop(cynara->context);
--
--  if (cynara->cynara_watch != NULL)
--    {
--      _dbus_loop_remove_watch(loop, cynara->cynara_watch);
--      _dbus_watch_invalidate(cynara->cynara_watch);
--      _dbus_watch_unref(cynara->cynara_watch);
--      cynara->cynara_watch = NULL;
--    }
--
--  if (new_fd != -1)
--    {
--      unsigned int flags;
--      DBusWatch *watch;
--
--      switch (status)
--      {
--      case CYNARA_STATUS_FOR_READ:
--        flags = DBUS_WATCH_READABLE;
--        break;
--      case CYNARA_STATUS_FOR_RW:
--        flags = DBUS_WATCH_READABLE | DBUS_WATCH_WRITABLE;
--        break;
--      default:
--        /* Cynara passed unknown status - warn and add RW watch */
--        _dbus_verbose("Cynara passed unknown status value: 0x%08X\n", (unsigned int)status);
--        flags = DBUS_WATCH_READABLE | DBUS_WATCH_WRITABLE;
--        break;
--      }
--
--      watch = _dbus_watch_new(new_fd, flags, TRUE, &bus_cynara_watch_callback, cynara, NULL);
--      if (watch != NULL)
--        {
--          if (_dbus_loop_add_watch(loop, watch) == TRUE)
--            {
--              cynara->cynara_watch = watch;
--              return;
--            }
--
--          _dbus_watch_invalidate(watch);
--          _dbus_watch_unref(watch);
--        }
--
--      /* It seems like not much can be done at this point. Cynara events won't be processed
--       * until next Cynara function call triggering status callback */
--      _dbus_verbose("Failed to add dbus watch\n");
--    }
--}
--
--static dbus_bool_t
--bus_cynara_watch_callback(DBusWatch    *watch,
--                          unsigned int  flags,
--                          void         *data)
--{
--  BusCynara *cynara = (BusCynara *)data;
--  int result = cynara_async_process(cynara->cynara);
--  if (result != CYNARA_API_SUCCESS)
--      _dbus_verbose("cynara_async_process returned %d\n", result);
--
--  return result != CYNARA_API_OUT_OF_MEMORY ? TRUE : FALSE;
--}
--
--static inline const char *
--call_cause_to_string(cynara_async_call_cause cause)
--{
--  switch (cause)
--  {
--  case CYNARA_CALL_CAUSE_ANSWER:
--    return "ANSWER";
--  case CYNARA_CALL_CAUSE_CANCEL:
--    return "CANCEL";
--  case CYNARA_CALL_CAUSE_FINISH:
--    return "FINSIH";
--  case CYNARA_CALL_CAUSE_SERVICE_NOT_AVAILABLE:
--    return "SERVICE NOT AVAILABLE";
--  default:
--    return "INVALID";
--  }
--}
--
--static void
--bus_cynara_check_response_callback (cynara_check_id check_id,
--                                    cynara_async_call_cause cause,
--                                    int response,
--                                    void *user_response_data)
--{
--  BusDeferredMessage *deferred_message = user_response_data;
--  BusResult result;
--
--  _dbus_verbose("Cynara callback: check_id=%u, cause=%s response=%i response_data=%p\n",
--      (unsigned int)check_id, call_cause_to_string(cause), response, user_response_data);
--
--  if (deferred_message == NULL)
--    return;
--
--  if (cause == CYNARA_CALL_CAUSE_ANSWER && response == CYNARA_API_ACCESS_ALLOWED)
--    result = BUS_RESULT_TRUE;
--  else
--    result = BUS_RESULT_FALSE;
--
--  bus_deferred_message_response_received(deferred_message, result);
--  bus_deferred_message_unref(deferred_message);
--}
--
--#endif /* DBUS_ENABLE_CYNARA */
-diff --git a/bus/system.conf.in b/bus/system.conf.in
-index 19d0c04..81c39c8 100644
---- a/bus/system.conf.in
-+++ b/bus/system.conf.in
-@@ -72,10 +72,10 @@
-            send_interface="org.freedesktop.DBus.Introspectable"/>
-     <allow send_destination="org.freedesktop.DBus"
-            send_interface="org.freedesktop.DBus.Properties"/>
--    <!-- If there is a need specific bus services could be protected by Cynara as well.
-+    <!-- If there is a need specific bus services could be protected by Cynagora as well.
-          However, this can lead to deadlock during the boot process when such check is made and
--         Cynara is not yet activated (systemd calls protected method synchronously,
--         dbus daemon tries to consult Cynara, Cynara waits for systemd activation).
-+         Cynagora is not yet activated (systemd calls protected method synchronously,
-+         dbus daemon tries to consult Cynagora, Cynagora waits for systemd activation).
-          Therefore it is advised to allow root processes to use bus services.
-          Currently anyone is allowed to talk to the message bus -->
-     <allow receive_sender="org.freedesktop.DBus"/>
-diff --git a/configure.ac b/configure.ac
-index 11b5ffd..df9341c 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1742,16 +1742,16 @@ AC_ARG_ENABLE([user-session],
- AM_CONDITIONAL([DBUS_ENABLE_USER_SESSION],
-   [test "x$enable_user_session" = xyes])
--#enable cynara integration
--AC_ARG_ENABLE([cynara], [AS_HELP_STRING([--enable-cynara], [enable Cynara integration])], [], [enable_cynara=no])
--if test "x$enable_cynara" = xyes; then
--  PKG_CHECK_MODULES([CYNARA], [cynara-client-async >= 0.6.0 cynara-session >= 0.6.0],
--     [AC_DEFINE([DBUS_ENABLE_CYNARA], [1], [Define to enable Cynara privilege checks in dbus-daemon])],
--     [AC_MSG_ERROR([libcynara-client-async and cynara-session are required to enable Cynara integration])])
-+#enable cynagora integration
-+AC_ARG_ENABLE([cynagora], [AS_HELP_STRING([--enable-cynagora], [enable Cynagora integration])], [], [enable_cynagora=no])
-+if test "x$enable_cynagora" = xyes; then
-+  PKG_CHECK_MODULES([CYNAGORA], [cynagora],
-+     [AC_DEFINE([DBUS_ENABLE_CYNAGORA], [1], [Define to enable Cynagora privilege checks in dbus-daemon])],
-+     [AC_MSG_ERROR([libcynagora is required to enable Cynagora integration])])
- fi
--AC_SUBST([CYNARA_CFLAGS])
--AC_SUBST([CYNARA_LIBS])
-+AC_SUBST([CYNAGORA_CFLAGS])
-+AC_SUBST([CYNAGORA_LIBS])
- AC_CONFIG_FILES([
- Doxyfile
-@@ -1835,7 +1835,7 @@ echo "
-         Building bus stats API:   ${enable_stats}
-         Building SELinux support: ${have_selinux}
-         Building AppArmor support: ${have_apparmor}
--        Building Cynara support:  ${enable_cynara}
-+        Building Cynagora support: ${enable_cynagora}
-         Building inotify support: ${have_inotify}
-         Building kqueue support:  ${have_kqueue}
-         Building systemd support: ${have_systemd}
--- 
-2.21.1
-