185
203
return m_server.listen(socketDir.filePath(uniqueName));
188
void UiProxyPrivate::setupPromptSession()
206
QString UiProxyPrivate::setupPromptSession()
192
210
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
193
if (!env.value("QT_QPA_PLATFORM").startsWith("ubuntu")) return;
211
if (!env.value("QT_QPA_PLATFORM").startsWith("ubuntu")) return QString();
195
213
PromptSession *session =
196
214
MirHelper::instance()->createPromptSession(m_clientPid);
197
if (!session) return;
215
if (!session) return QString();
199
217
QString mirSocket = session->requestSocket();
200
218
if (mirSocket.isEmpty()) {
205
223
m_promptSession = session;
206
224
QObject::connect(m_promptSession, SIGNAL(finished()),
207
225
q, SIGNAL(finished()));
209
env.insert("MIR_SOCKET", mirSocket);
210
m_process.setProcessEnvironment(env);
213
230
bool UiProxyPrivate::init()
215
232
if (Q_UNLIKELY(!setupSocket())) return false;
218
QStringList arguments;
219
QString wrapper = QString::fromUtf8(qgetenv("OAU_WRAPPER"));
220
QString accountsUi = QStringLiteral(INSTALL_BIN_DIR "/online-accounts-ui");
221
if (wrapper.isEmpty()) {
222
processName = accountsUi;
224
processName = wrapper;
225
arguments.append(accountsUi);
227
if (!m_promptSession) {
228
/* the first argument is required to be the desktop file */
229
arguments.append("--desktop_file_hint=/usr/share/applications/online-accounts-ui.desktop");
231
arguments.append("--socket");
232
arguments.append(m_server.fullServerName());
235
m_arguments.append(m_server.fullServerName().toUtf8());
237
QByteArray mirSocket;
234
238
if (m_clientPid) {
235
setupPromptSession();
238
m_process.start(processName, arguments);
239
return m_process.waitForStarted();
239
mirSocket = setupPromptSession().toUtf8();
241
if (mirSocket.isEmpty()) {
242
mirSocket = "invalid://url";
244
m_arguments.append(mirSocket);
248
QString UiProxyPrivate::findAppArmorProfile()
251
/* Look through the requests, and look for the first one which has a
252
* provider set. We'll use that provider's AppArmor id for confinement. */
253
Q_FOREACH(Request *request, m_requests) {
254
providerId = request->providerId();
255
if (!providerId.isEmpty())
259
if (Q_UNLIKELY(providerId.isEmpty())) return QString();
261
/* Load the provider XML file */
262
Accounts::Manager manager;
263
Accounts::Provider provider = manager.provider(providerId);
264
if (Q_UNLIKELY(!provider.isValid())) {
265
qWarning() << "Provider not found:" << providerId;
269
const QDomDocument doc = provider.domDocument();
270
QDomElement root = doc.documentElement();
271
return root.firstChildElement("profile").text();
274
void UiProxyPrivate::startProcess()
276
QVector<const gchar*> uris;
277
Q_FOREACH(const QByteArray &arg, m_arguments) {
278
uris.append(arg.constData());
282
QString profile = findAppArmorProfile();
283
if (profile.isEmpty()) {
284
profile = "unconfined";
288
ubuntu_app_launch_start_multiple_helper("online-accounts-ui",
289
profile.toUtf8().constData(),
291
if (Q_UNLIKELY(instanceId == NULL)) {
292
qWarning() << "Couldn't start account plugin process";
293
setStatus(UiProxy::Error);
297
setStatus(UiProxy::Loading);
242
300
void UiProxyPrivate::sendRequest(int requestId, Request *request)