1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
/*
* Copyright (C) 2015 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Authored by: Ken VanDine <ken.vandine@canonical.com>
*/
#include <QCoreApplication>
#include <QStringList>
#include <QUrlQuery>
#include <lomiri-app-launch.h>
#include "autoexporter.h"
#include "debug.h"
namespace cuc = com::lomiri::content;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
if (qgetenv("APP_ID").isEmpty()) {
qputenv("APP_ID", "content-hub-send-file");
}
/* read environment variables */
QProcessEnvironment environment = QProcessEnvironment::systemEnvironment();
if (environment.contains(QLatin1String("CONTENT_HUB_LOGGING_LEVEL"))) {
bool isOk;
int value = environment.value(
QLatin1String("CONTENT_HUB_LOGGING_LEVEL")).toInt(&isOk);
if (isOk)
setLoggingLevel(value);
}
std::string handler = "export";
QString url, text, appId;
gchar* pkg = NULL;
gchar* app = NULL;
gchar* ver = NULL;
/* URL handled looks like:
* content:?pkg=foo&app=bar&ver=0.1&url=path&text=text
* Only pkg is required.
*/
QUrlQuery* query = new QUrlQuery(a.arguments().at(1).split("?").at(1));
TRACE() << "Handling URL:" << query->query();
if (query->hasQueryItem("pkg"))
pkg = g_strdup(query->queryItemValue("pkg").toStdString().c_str());
else {
qWarning() << "PKG is required";
return 1;
}
if (query->hasQueryItem("app"))
app = g_strdup(query->queryItemValue("app").toStdString().c_str());
if (query->hasQueryItem("ver"))
ver = g_strdup(query->queryItemValue("ver").toStdString().c_str());
if (query->hasQueryItem("handler"))
handler = query->queryItemValue("handler").toStdString();
url = query->queryItemValue("url");
/* Don't support file transfers via url-dispatcher
* it would allow unconfined access to any file simply
* by constructing an evil file url
*/
if (url.startsWith("file")) {
qWarning() << "File transfers are not supported";
return 1;
}
text = query->queryItemValue("text");
TRACE() << "URL:" << url;
TRACE() << "PKG:" << pkg;
TRACE() << "APP:" << app;
TRACE() << "VER:" << ver;
TRACE() << "HANDLER:" << handler.c_str();
appId = QString::fromLocal8Bit(lomiri_app_launch_triplet_to_app_id(pkg, app, ver));
if (appId.isNull())
appId = QString(pkg);
if (appId.isEmpty())
{
qWarning() << "Unable to determine peer";
return 1;
}
AutoExporter exporter;
if (!url.isEmpty())
exporter.setUrl(url);
if (!text.isEmpty())
exporter.setText(text);
TRACE() << "APP_ID:" << appId;
auto hub = cuc::Hub::Client::instance();
auto peer = cuc::Peer{appId};
if (handler == "share") {
auto transfer = hub->create_share_to_peer(peer);
exporter.handle_export(transfer);
} else {
auto transfer = hub->create_export_to_peer(peer);
exporter.handle_export(transfer);
}
return a.exec();
}
|