Launch shipped dbus-daemon if first connection attempt was unsuccessful

This commit is contained in:
Roland Winklmeier
2015-10-25 23:30:17 +01:00
committed by Mathew Sutcliffe
parent c14c25d278
commit 6ff9df5c05
3 changed files with 104 additions and 1 deletions

80
share/dbus-1/session.conf Normal file
View File

@@ -0,0 +1,80 @@
<!-- This configuration file controls the per-user-login-session message bus.
Add a session-local.conf and edit that rather than changing this
file directly. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Our well-known bus type, don't change this -->
<type>session</type>
<!-- If we fork, keep the user's original umask to avoid affecting
the behavior of child processes. -->
<keep_umask/>
<listen>autolaunch:</listen>
<!-- On Unix systems, the most secure authentication mechanism is
EXTERNAL, which uses credential-passing over Unix sockets.
This authentication mechanism is not available on Windows,
is not suitable for use with the tcp: or nonce-tcp: transports,
and will not work on obscure flavours of Unix that do not have
a supported credentials-passing mechanism. On those platforms/transports,
comment out the <auth> element to allow fallback to DBUS_COOKIE_SHA1. -->
<!--<auth>EXTERNAL</auth>-->
<standard_session_servicedirs />
<policy context="default">
<!-- Allow everything to be sent -->
<allow send_destination="*" eavesdrop="true"/>
<!-- Allow everything to be received -->
<allow eavesdrop="true"/>
<!-- Allow anyone to own anything -->
<allow own="*"/>
</policy>
<!-- Include legacy configuration location -->
<include ignore_missing="yes">../../etc/dbus-1/session.conf</include>
<!-- Config files are placed here that among other things,
further restrict the above policy for specific services. -->
<includedir>session.d</includedir>
<includedir>../../etc/dbus-1/session.d</includedir>
<!-- This is included last so local configuration can override what's
in this standard file -->
<include ignore_missing="yes">../../etc/dbus-1/session-local.conf</include>
<include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>
<!-- For the session bus, override the default relatively-low limits
with essentially infinite limits, since the bus is just running
as the user anyway, using up bus resources is not something we need
to worry about. In some cases, we do set the limits lower than
"all available memory" if exceeding the limit is almost certainly a bug,
having the bus enforce a limit is nicer than a huge memory leak. But the
intent is that these limits should never be hit. -->
<!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
<limit name="max_incoming_bytes">1000000000</limit>
<limit name="max_incoming_unix_fds">250000000</limit>
<limit name="max_outgoing_bytes">1000000000</limit>
<limit name="max_outgoing_unix_fds">250000000</limit>
<limit name="max_message_size">1000000000</limit>
<!-- We do not override max_message_unix_fds here since the in-kernel
limit is also relatively low -->
<limit name="service_start_timeout">120000</limit>
<limit name="auth_timeout">240000</limit>
<limit name="pending_fd_timeout">150000</limit>
<limit name="max_completed_connections">100000</limit>
<limit name="max_incomplete_connections">10000</limit>
<limit name="max_connections_per_user">100000</limit>
<limit name="max_pending_service_starts">10000</limit>
<limit name="max_names_per_connection">50000</limit>
<limit name="max_match_rules_per_connection">50000</limit>
<limit name="max_replies_per_connection">50000</limit>
</busconfig>

View File

@@ -10,7 +10,7 @@
#include "blackmisc/logmessage.h"
#include "blackmisc/network/networkutils.h"
#include "dbus_server.h"
#include <QDebug>
#include <QProcess>
#include <QMetaClassInfo>
using namespace BlackMisc;
@@ -35,6 +35,12 @@ namespace BlackCore
// we use a session bus connection instead of a real P2P connection
this->m_serverMode = CDBusServer::SERVERMODE_SESSIONBUS;
QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, ServiceName());
if (!connection.isConnected())
{
launchDbusDaemon();
connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, ServiceName());
}
if (!connection.registerService(service))
{
// registration fails can either mean something wrong with DBus or service already exists
@@ -48,6 +54,12 @@ namespace BlackCore
// we use a system bus connection instead of a real P2P connection
this->m_serverMode = CDBusServer::SERVERMODE_SYSTEMBUS;
QDBusConnection connection = QDBusConnection::systemBus();
if (!connection.isConnected())
{
launchDbusDaemon();
connection = QDBusConnection::systemBus();
}
if (!connection.registerService(service))
{
// registration fails can either mean something wrong with DBus or service already exists
@@ -91,6 +103,14 @@ namespace BlackCore
return sn;
}
void CDBusServer::launchDbusDaemon()
{
const QString program = QStringLiteral("dbus-daemon");
const QStringList arguments = { QStringLiteral("--config-file=../share/dbus-1/session.conf") };
bool success = QProcess::startDetached(program, arguments);
if (!success) { CLogMessage(this).warning("Failed to launch dbus-daemon!"); }
}
/*
* Check for P2P address
*/

View File

@@ -113,6 +113,9 @@ namespace BlackCore
QMap<QString, QObject *> m_objects; //!< Mapping of all exposed objects, for P2P registration when connection establishes, also to later unregister objects
QMap<QString, QDBusConnection> m_DBusConnections; //!< Mapping of all DBusConnection objects
//! Manually launch our shipped dbus daemon
void launchDbusDaemon();
//! Check if address means a real server with P2P connection
static bool isP2P(const QString &address);