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 }