File indexing completed on 2024-04-21 04:43:23

0001 /*
0002     This file is part of the Polkit-qt project
0003     SPDX-FileCopyrightText: 2009 Jaroslav Reznik <jreznik@redhat.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "polkitqt1-subject.h"
0009 #include "polkitqt1-identity.h"
0010 #include "polkitqt1-config.h"
0011 
0012 #include <QDebug>
0013 #include <polkit/polkit.h>
0014 
0015 namespace PolkitQt1
0016 {
0017 
0018 class Q_DECL_HIDDEN Subject::Data : public QSharedData
0019 {
0020 public:
0021     Data()
0022         : QSharedData()
0023         , subject(nullptr)
0024     {}
0025     Data(const Data& other)
0026         : QSharedData(other)
0027         , subject(other.subject)
0028     {
0029         g_object_ref(subject);
0030     }
0031     ~Data()
0032     {
0033         g_object_unref(subject);
0034     }
0035 
0036     PolkitSubject *subject;
0037 };
0038 
0039 Subject::Subject()
0040         : d(new Data)
0041 {
0042 }
0043 
0044 Subject::Subject(PolkitSubject *subject)
0045         : d(new Data)
0046 {
0047     d->subject = subject;
0048     
0049     if (d->subject != nullptr) {
0050         g_object_ref(d->subject);
0051     }
0052 }
0053 
0054 Subject::Subject(const PolkitQt1::Subject& other)
0055         : d(other.d)
0056 {
0057 
0058 }
0059 
0060 Subject& Subject::operator=(const PolkitQt1::Subject& other)
0061 {
0062     d = other.d;
0063     return *this;
0064 }
0065 
0066 Subject::~Subject()
0067 {
0068 }
0069 
0070 bool Subject::isValid() const
0071 {
0072     return d->subject != nullptr;
0073 }
0074 
0075 PolkitSubject *Subject::subject() const
0076 {
0077     return d->subject;
0078 }
0079 
0080 void Subject::setSubject(PolkitSubject *subject)
0081 {
0082     if (d->subject != nullptr) {
0083         g_object_unref(d->subject);
0084     }
0085     d->subject = subject;
0086 }
0087 
0088 QString Subject::toString() const
0089 {
0090     Q_ASSERT(d->subject);
0091     return QString::fromUtf8(polkit_subject_to_string(d->subject));
0092 }
0093 
0094 Subject Subject::fromString(const QString &string)
0095 {
0096     Subject subject;
0097     GError *error = nullptr;
0098     subject.d->subject = polkit_subject_from_string(string.toUtf8().data(), &error);
0099     if (error != nullptr) {
0100         qWarning() << QString("Cannot create Subject from string: %1").arg(error->message);
0101         return nullptr;
0102     }
0103     return subject;
0104 }
0105 
0106 UnixProcessSubject::UnixProcessSubject(qint64 pid)
0107         : Subject()
0108 {
0109     setSubject(polkit_unix_process_new_for_owner(pid, 0, -1));
0110 }
0111 
0112 UnixProcessSubject::UnixProcessSubject(qint64 pid, quint64 startTime)
0113         : Subject()
0114 {
0115     setSubject(polkit_unix_process_new_for_owner(pid, startTime, -1));
0116 }
0117 
0118 UnixProcessSubject::UnixProcessSubject(PolkitUnixProcess *pkUnixProcess)
0119         : Subject((PolkitSubject *) pkUnixProcess)
0120 {
0121 
0122 }
0123 
0124 qint64 UnixProcessSubject::pid() const
0125 {
0126     return polkit_unix_process_get_pid((PolkitUnixProcess *) subject());
0127 }
0128 
0129 qint64 UnixProcessSubject::startTime() const
0130 {
0131     return polkit_unix_process_get_start_time((PolkitUnixProcess *) subject());
0132 }
0133 
0134 qint64 UnixProcessSubject::uid() const
0135 {
0136     return polkit_unix_process_get_uid((PolkitUnixProcess *) subject());
0137 }
0138 
0139 void UnixProcessSubject::setPid(qint64 pid)
0140 {
0141     polkit_unix_process_set_pid((PolkitUnixProcess *) subject(), pid);
0142 }
0143 
0144 // ----- SystemBusName
0145 SystemBusNameSubject::SystemBusNameSubject(const QString &name)
0146         : Subject()
0147 {
0148     setSubject(polkit_system_bus_name_new(name.toUtf8().data()));
0149 }
0150 
0151 SystemBusNameSubject::SystemBusNameSubject(PolkitSystemBusName *pkSystemBusName)
0152         : Subject((PolkitSubject *) pkSystemBusName)
0153 {
0154 
0155 }
0156 
0157 QString SystemBusNameSubject::name() const
0158 {
0159     return QString::fromUtf8(polkit_system_bus_name_get_name((PolkitSystemBusName *) subject()));
0160 }
0161 
0162 void SystemBusNameSubject::setName(const QString &name)
0163 {
0164     polkit_system_bus_name_set_name((PolkitSystemBusName *) subject(), name.toUtf8().data());
0165 }
0166 
0167 UnixUserIdentity SystemBusNameSubject::user()
0168 {
0169 #if HAVE_POLKIT_SYSTEM_BUS_NAME_GET_USER_SYNC
0170     return UnixUserIdentity(polkit_system_bus_name_get_user_sync((PolkitSystemBusName *) subject(), nullptr, nullptr));
0171 #else
0172     qWarning("Polkit is too old, returning invalid user from SystemBusNameSubject::user()!");
0173     return UnixUserIdentity();
0174 #endif
0175 }
0176 
0177 // ----- SystemSession
0178 UnixSessionSubject::UnixSessionSubject(const QString &sessionId)
0179         : Subject()
0180 {
0181     setSubject(polkit_unix_session_new(sessionId.toUtf8().data()));
0182 }
0183 
0184 UnixSessionSubject::UnixSessionSubject(qint64 pid)
0185         : Subject()
0186 {
0187     GError *error = nullptr;
0188     setSubject(polkit_unix_session_new_for_process_sync(pid, nullptr, &error));
0189     if (error != nullptr) {
0190         qWarning() << QString("Cannot create unix session: %1").arg(error->message);
0191         setSubject(nullptr);
0192     }
0193 }
0194 
0195 UnixSessionSubject::UnixSessionSubject(PolkitSystemBusName *pkUnixSession)
0196         : Subject((PolkitSubject *) pkUnixSession)
0197 {
0198 
0199 }
0200 
0201 QString UnixSessionSubject::sessionId() const
0202 {
0203     return QString::fromUtf8(polkit_unix_session_get_session_id((PolkitUnixSession *) subject()));
0204 }
0205 
0206 void UnixSessionSubject::setSessionId(const QString &sessionId)
0207 {
0208     polkit_unix_session_set_session_id((PolkitUnixSession *) subject(), sessionId.toUtf8().data());
0209 }
0210 
0211 }