diff --git a/ChangeLog b/ChangeLog index 5a653d13..9a9d3832 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23635,3 +23635,6 @@ * Added a file format check to the 'Image Manager' dialog in rdadmin(1) to ensure that only JPEG or PNG formatted image files can be imported. +2022-11-09 Fred Gleason + * Added an image format check to rddbmgr(8) to prevent it from + attempting to generate thumbnail images from non-JPEG/PNG images. diff --git a/lib/rdconf.cpp b/lib/rdconf.cpp index 06b498a1..51766f10 100644 --- a/lib/rdconf.cpp +++ b/lib/rdconf.cpp @@ -1149,3 +1149,33 @@ QString RDMimeType(const QString &filename,bool *ok) return ret; } + + +QString RDMimeType(const QByteArray &data,bool *ok) +{ + QStringList args; + QString ret; + QByteArray ret_data; + + args.push_back("--mime-type"); + args.push_back("-"); + QProcess *proc=new QProcess(); + proc->start("/usr/bin/file",args); + proc->waitForStarted(); + proc->write(data); + proc->closeWriteChannel(); + proc->waitForFinished(); + if((proc->exitStatus()!=QProcess::NormalExit)||(proc->exitCode()!=0)) { + *ok=false; + delete proc; + return ret; + } + *ok=true; + + ret=QString(proc->readAllStandardOutput()). + split(":",QString::SkipEmptyParts).last().trimmed(); + + delete proc; + + return ret; +} diff --git a/lib/rdconf.h b/lib/rdconf.h index 535487ec..b7ba3602 100644 --- a/lib/rdconf.h +++ b/lib/rdconf.h @@ -112,6 +112,7 @@ int RDCheckExitCode(const QString &msg,int exit_code); int RDCheckExitCode(RDConfig *config,const QString &msg,int exit_code); int RDCheckReturnCode(const QString &msg,int code,int ok_value); QString RDMimeType(const QString &filename,bool *ok); +QString RDMimeType(const QByteArray &data,bool *ok); #endif // RDCONF_H diff --git a/utils/rddbmgr/updateschema.cpp b/utils/rddbmgr/updateschema.cpp index d94cf674..b58fa92d 100644 --- a/utils/rddbmgr/updateschema.cpp +++ b/utils/rddbmgr/updateschema.cpp @@ -19,6 +19,7 @@ // #include +#include #include #include #include @@ -36,6 +37,7 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) QString tablename; RDCart *cart; bool length_update_required=false; + bool ok=false; if(!db_start_datetime.isNull()) { QDateTime now=QDateTime::currentDateTime(); @@ -11292,22 +11294,37 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) return false; } sql=QString("select ")+ - "`ID`,"+ // 00 - "`DATA` "+ // 01 + "`ID`,"+ // 00 + "`DATA`,"+ // 01 + "`FEED_KEY_NAME`," // 02 + "`DESCRIPTION` "+ // 03 "from `FEED_IMAGES`"; q=new RDSqlQuery(sql); while(q->next()) { - sql=QString("update `FEED_IMAGES` set ")+ - "`DATA_MID_THUMB`="+ - RDEscapeBlob(RDIMResizeImage(q->value(1).toByteArray(), - RD_MID_THUMB_SIZE))+","+ - "`DATA_SMALL_THUMB`="+ - RDEscapeBlob(RDIMResizeImage(q->value(1).toByteArray(), - RD_SMALL_THUMB_SIZE))+" "+ - QString::asprintf("where `ID`=%u",q->value(0).toUInt()); - if(!RDSqlQuery::apply(sql,err_msg)) { + QString mimetype=RDMimeType(q->value(1).toByteArray(),&ok); + if(!ok) { + *err_msg=tr("unable to determine image file type"); return false; } + if((mimetype=="image/jpeg")||(mimetype=="image/png")) { + sql=QString("update `FEED_IMAGES` set ")+ + "`DATA_MID_THUMB`="+ + RDEscapeBlob(RDIMResizeImage(q->value(1).toByteArray(), + RD_MID_THUMB_SIZE))+","+ + "`DATA_SMALL_THUMB`="+ + RDEscapeBlob(RDIMResizeImage(q->value(1).toByteArray(), + RD_SMALL_THUMB_SIZE))+" "+ + QString::asprintf("where `ID`=%u",q->value(0).toUInt()); + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + } + else { + fprintf(stderr,"rddbmgr: image %u:\"%s\" in RSS feed \"%s\" is not in JPEG or PNG format, skipping thumbnail generation\n", + q->value(0).toUInt(), + q->value(3).toString().toUtf8().constData(), + q->value(2).toString().toUtf8().constData()); + } } delete q;