Skip to content

Commit

Permalink
Allow a daemon to provide additional service objects.
Browse files Browse the repository at this point in the history
  • Loading branch information
adenexter committed Jan 20, 2017
1 parent c0a798f commit 5625d03
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 41 deletions.
19 changes: 18 additions & 1 deletion src/nemo-devicelock/host/hostobject.cpp
Expand Up @@ -112,7 +112,6 @@ void HostObject::propertyChanged(const QString &interface, const QString &proper
}
}


unsigned long HostObject::connectionPid(const QDBusConnection &connection)
{
unsigned long pid = 0;
Expand All @@ -124,6 +123,24 @@ unsigned long HostObject::connectionPid(const QDBusConnection &connection)
}
}

unsigned long HostObject::connectionUid(const QDBusConnection &connection)
{
unsigned long uid = 0;
if (dbus_connection_get_unix_user(
static_cast<DBusConnection *>(connection.internalPointer()), &uid)) {
return uid;
} else {
return 0;
}
}

bool HostObject::authorizeConnection(const QDBusConnection &connection)
{
Q_UNUSED(connection);

return true;
}

bool HostObject::isActiveClient(const QString &client) const
{
return m_activeConnection == QDBusContext::connection().name() && m_activeClient == client;
Expand Down
3 changes: 3 additions & 0 deletions src/nemo-devicelock/host/hostobject.h
Expand Up @@ -60,6 +60,9 @@ class HostObject : public QObject, protected QDBusContext
virtual void cancel();

static unsigned long connectionPid(const QDBusConnection &connection);
static unsigned long connectionUid(const QDBusConnection &connection);

virtual bool authorizeConnection(const QDBusConnection &connection);

bool isActiveClient(const QString &client) const;
void setActiveClient(const QString &client);
Expand Down
56 changes: 31 additions & 25 deletions src/nemo-devicelock/host/hostservice.cpp
Expand Up @@ -50,8 +50,6 @@
namespace NemoDeviceLock
{

template <typename T, int N> constexpr int lengthOf(const T(&)[N]) { return N; }

class ConnectionMonitor : public QObject
{
Q_OBJECT
Expand All @@ -68,8 +66,8 @@ public slots:
{
deleteLater();

for (int i = 0; i < lengthOf(m_service->m_objects); ++i) {
m_service->m_objects[i]->clientDisconnected(m_connectionName);
for (const auto object : m_service->m_objects) {
object->clientDisconnected(m_connectionName);
}
}

Expand All @@ -78,23 +76,9 @@ public slots:
const QString m_connectionName;
};

HostService::HostService(
HostAuthenticator *authenticator,
HostDeviceLock *deviceLock,
HostDeviceLockSettings *deviceLockSettings,
HostDeviceReset *deviceReset,
HostEncryptionSettings *encryptionSettings,
HostFingerprintSensor *fingerprintSensor,
HostFingerprintSettings *fingerprintSettings,
QObject *parent)
HostService::HostService(const QVector<HostObject *> objects, QObject *parent)
: QDBusServer(QStringLiteral("unix:path=/run/nemo-devicelock/socket"), parent)
, m_authenticator(authenticator)
, m_deviceLock(deviceLock)
, m_deviceLockSettings(deviceLockSettings)
, m_deviceReset(deviceReset)
, m_encryptionSettings(encryptionSettings)
, m_fingerprintSensor(fingerprintSensor)
, m_fingerprintSettings(fingerprintSettings)
, m_objects(objects)
{
setAnonymousAuthenticationAllowed(true);

Expand All @@ -116,6 +100,28 @@ HostService::HostService(
}
}

HostService::HostService(
HostAuthenticator *authenticator,
HostDeviceLock *deviceLock,
HostDeviceLockSettings *deviceLockSettings,
HostDeviceReset *deviceReset,
HostEncryptionSettings *encryptionSettings,
HostFingerprintSensor *fingerprintSensor,
HostFingerprintSettings *fingerprintSettings,
QObject *parent)
: HostService(
QVector<HostObject *>()
<< authenticator
<< deviceLock
<< deviceLockSettings
<< deviceReset
<< encryptionSettings
<< fingerprintSensor
<< fingerprintSettings
, parent)
{
}

HostService::~HostService()
{
}
Expand Down Expand Up @@ -149,11 +155,11 @@ void HostService::connectionReady(const QDBusConnection &newConnection)

const auto connectionName = newConnection.name();

for (int i = 0; i < lengthOf(m_objects); ++i) {
const auto object = m_objects[i];

registerObject(connection, object->path(), object);
object->clientConnected(connectionName);
for (const auto object : m_objects) {
if (object->authorizeConnection(newConnection)) {
registerObject(connection, object->path(), object);
object->clientConnected(connectionName);
}
}
}

Expand Down
14 changes: 2 additions & 12 deletions src/nemo-devicelock/host/hostservice.h
Expand Up @@ -53,6 +53,7 @@ class HostService : public QDBusServer
{
Q_OBJECT
public:
HostService(const QVector<HostObject *> objects, QObject *parent = nullptr);
HostService(
HostAuthenticator *authenticator,
HostDeviceLock *deviceLock,
Expand All @@ -69,18 +70,7 @@ class HostService : public QDBusServer

void connectionReady(const QDBusConnection &connection);

union {
struct {
HostObject * const m_authenticator;
HostObject * const m_deviceLock;
HostObject * const m_deviceLockSettings;
HostObject * const m_deviceReset;
HostObject * const m_encryptionSettings;
HostObject * const m_fingerprintSensor;
HostObject * const m_fingerprintSettings;
};
HostObject * const m_objects[7];
};
const QVector<HostObject *> m_objects;
};

}
Expand Down
2 changes: 1 addition & 1 deletion src/nemo-devicelock/host/mcedevicelock.cpp
Expand Up @@ -347,7 +347,7 @@ void MceDeviceLockAdaptor::setState(int state)
if (state != DeviceLock::Locked) {
// Unauthenticated unlocking is not accepted.
sendErrorReply(QDBusError::AccessDenied);
} else if (m_deviceLock->automaticLocking() == 1) {
} else if (m_deviceLock->automaticLocking() == -1) {
sendErrorReply(QDBusError::AccessDenied, QStringLiteral("Device lock not in use"));
} else {
m_deviceLock->setState(DeviceLock::LockState(state));
Expand Down
2 changes: 0 additions & 2 deletions src/nemo-devicelock/private/connection.cpp
Expand Up @@ -40,8 +40,6 @@ namespace NemoDeviceLock

Connection *Connection::sharedInstance = nullptr;

static const auto systemdService = QStringLiteral("org.freedesktop.systemd1");

static QDBusConnection connectToHost()
{
static int counter = 0;
Expand Down

0 comments on commit 5625d03

Please sign in to comment.