Albert S
aed0ca31f7
Detect mime types, and for text/*, run the default text processor. The added benefit is that we can now add plaintext files without extensions, or many other text files (e. g. source code).
130 linhas
3.3 KiB
C++
130 linhas
3.3 KiB
C++
#include <QFile>
|
|
#include <QFileInfo>
|
|
#include <QDataStream>
|
|
#include "sandboxedprocessor.h"
|
|
#include "pdfprocessor.h"
|
|
#include "defaulttextprocessor.h"
|
|
#include "tagstripperprocessor.h"
|
|
#include "nothingprocessor.h"
|
|
#include "odtprocessor.h"
|
|
#include "odsprocessor.h"
|
|
#include "../submodules/exile.h/exile.h"
|
|
#include "logger.h"
|
|
|
|
static DefaultTextProcessor *defaultTextProcessor = new DefaultTextProcessor();
|
|
static TagStripperProcessor *tagStripperProcessor = new TagStripperProcessor();
|
|
static NothingProcessor *nothingProcessor = new NothingProcessor();
|
|
static OdtProcessor *odtProcessor = new OdtProcessor();
|
|
static OdsProcessor *odsProcessor = new OdsProcessor();
|
|
|
|
static QMap<QString, Processor *> processors{
|
|
{"pdf", new PdfProcessor()}, {"txt", defaultTextProcessor}, {"md", defaultTextProcessor},
|
|
{"py", defaultTextProcessor}, {"xml", nothingProcessor}, {"html", tagStripperProcessor},
|
|
{"java", defaultTextProcessor}, {"js", defaultTextProcessor}, {"cpp", defaultTextProcessor},
|
|
{"c", defaultTextProcessor}, {"sql", defaultTextProcessor}, {"odt", odtProcessor},
|
|
{"ods", odsProcessor}, {"svg", nothingProcessor}};
|
|
|
|
void SandboxedProcessor::enableSandbox(QString readablePath)
|
|
{
|
|
struct exile_policy *policy = exile_init_policy();
|
|
if(policy == NULL)
|
|
{
|
|
qCritical() << "Could not init exile";
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
policy->namespace_options = EXILE_UNSHARE_NETWORK | EXILE_UNSHARE_USER;
|
|
|
|
if(!readablePath.isEmpty())
|
|
{
|
|
std::string readablePathLocation = readablePath.toStdString();
|
|
if(exile_append_path_policies(policy, EXILE_FS_ALLOW_ALL_READ, readablePathLocation.c_str()) != 0)
|
|
{
|
|
qCritical() << "Failed to add path policies";
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
policy->no_fs = 1;
|
|
}
|
|
int ret = exile_enable_policy(policy);
|
|
if(ret != 0)
|
|
{
|
|
qCritical() << "Failed to establish sandbox: " << ret;
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
exile_free_policy(policy);
|
|
}
|
|
|
|
void SandboxedProcessor::printResults(const QVector<PageData> &pageData)
|
|
{
|
|
QFile fsstdout;
|
|
fsstdout.open(stdout, QIODevice::WriteOnly);
|
|
QDataStream stream(&fsstdout);
|
|
|
|
for(const PageData &data : pageData)
|
|
{
|
|
stream << data;
|
|
// fsstdout.flush();
|
|
}
|
|
|
|
fsstdout.close();
|
|
}
|
|
|
|
int SandboxedProcessor::process()
|
|
{
|
|
QFileInfo fileInfo(this->filePath);
|
|
Processor *processor = processors.value(fileInfo.suffix(), nullptr);
|
|
if(processor == nullptr)
|
|
{
|
|
/* TODO: This is not sandboxed yet ... */
|
|
QMimeType mimeType = mimeDatabase.mimeTypeForFile(fileInfo);
|
|
if(mimeType.name().startsWith("text/"))
|
|
{
|
|
processor = defaultTextProcessor;
|
|
}
|
|
else
|
|
{
|
|
for(QString &str : mimeType.allAncestors())
|
|
{
|
|
if(str.startsWith("text/"))
|
|
{
|
|
processor = defaultTextProcessor;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(processor == nullptr || processor == nothingProcessor)
|
|
{
|
|
/* Nothing to do */
|
|
return NOTHING_PROCESSED;
|
|
}
|
|
|
|
QVector<PageData> pageData;
|
|
QString absPath = fileInfo.absoluteFilePath();
|
|
|
|
try
|
|
{
|
|
if(processor->PREFERED_DATA_SOURCE == FILEPATH)
|
|
{
|
|
/* Read access to FS needed... doh..*/
|
|
enableSandbox(absPath);
|
|
pageData = processor->process(absPath);
|
|
}
|
|
else
|
|
{
|
|
QByteArray data = Utils::readFile(absPath);
|
|
enableSandbox();
|
|
pageData = processor->process(data);
|
|
}
|
|
}
|
|
catch(LooqsGeneralException &e)
|
|
{
|
|
Logger::error() << "SandboxedProcessor: Error while processing" << absPath << ":" << e.message << Qt::endl;
|
|
return 3 /* PROCESSFAIL */;
|
|
}
|
|
|
|
printResults(pageData);
|
|
return 0;
|
|
}
|