Validate EXIF UTF-8 strings (fixes #5923)
This commit is contained in:
@@ -69,6 +69,15 @@ T getFromFrame(
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string& validateUft8(const std::string& str, const std::string& on_error = "???")
|
||||||
|
{
|
||||||
|
if (Glib::ustring(str).validate()) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
return on_error;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FramesMetaData* FramesMetaData::fromFile(const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml, bool firstFrameOnly)
|
FramesMetaData* FramesMetaData::fromFile(const Glib::ustring& fname, std::unique_ptr<RawMetaDataLocation> rml, bool firstFrameOnly)
|
||||||
@@ -122,7 +131,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tag) {
|
if (tag) {
|
||||||
make = tag->valueToString();
|
make = validateUft8(tag->valueToString());
|
||||||
|
|
||||||
// Same dcraw treatment
|
// Same dcraw treatment
|
||||||
for (const auto& corp : {
|
for (const auto& corp : {
|
||||||
@@ -158,7 +167,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
tag = newFrameRootDir->findTagUpward("Model");
|
tag = newFrameRootDir->findTagUpward("Model");
|
||||||
|
|
||||||
if (tag) {
|
if (tag) {
|
||||||
model = tag->valueToString();
|
model = validateUft8(tag->valueToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!model.empty()) {
|
if (!model.empty()) {
|
||||||
@@ -193,14 +202,14 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
if (model == "Unknown") {
|
if (model == "Unknown") {
|
||||||
tag = newFrameRootDir->findTag("UniqueCameraModel");
|
tag = newFrameRootDir->findTag("UniqueCameraModel");
|
||||||
if (tag) {
|
if (tag) {
|
||||||
model = tag->valueToString();
|
model = validateUft8(tag->valueToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tag = newFrameRootDir->findTagUpward("Orientation");
|
tag = newFrameRootDir->findTagUpward("Orientation");
|
||||||
|
|
||||||
if (tag) {
|
if (tag) {
|
||||||
orientation = tag->valueToString();
|
orientation = validateUft8(tag->valueToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for Rating metadata in the following order:
|
// Look for Rating metadata in the following order:
|
||||||
@@ -310,7 +319,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tag) {
|
if (tag) {
|
||||||
serial = tag->valueToString();
|
serial = validateUft8(tag->valueToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// guess lens...
|
// guess lens...
|
||||||
@@ -320,7 +329,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
|
|
||||||
if (!make.compare(0, 8, "FUJIFILM")) {
|
if (!make.compare(0, 8, "FUJIFILM")) {
|
||||||
if (exif->getTag("LensModel")) {
|
if (exif->getTag("LensModel")) {
|
||||||
lens = exif->getTag("LensModel")->valueToString();
|
lens = validateUft8(exif->getTag("LensModel")->valueToString());
|
||||||
}
|
}
|
||||||
} else if (!make.compare(0, 4, "SONY")) {
|
} else if (!make.compare(0, 4, "SONY")) {
|
||||||
if (iso_speed == 65535 || iso_speed == 0) {
|
if (iso_speed == 65535 || iso_speed == 0) {
|
||||||
@@ -347,9 +356,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
const rtexif::Tag* const lens_make = exif->getTag(0xA433);
|
const rtexif::Tag* const lens_make = exif->getTag(0xA433);
|
||||||
const std::string make =
|
const std::string make =
|
||||||
lens_make
|
lens_make
|
||||||
? lens_make->valueToString()
|
? validateUft8(lens_make->valueToString())
|
||||||
: std::string();
|
: std::string();
|
||||||
const std::string model = lens_model->valueToString();
|
const std::string model = validateUft8(lens_model->valueToString());
|
||||||
|
|
||||||
if (!model.empty()) {
|
if (!model.empty()) {
|
||||||
lens = make;
|
lens = make;
|
||||||
@@ -382,7 +391,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
bool lensOk = false;
|
bool lensOk = false;
|
||||||
|
|
||||||
if (mnote->getTag("LensData")) {
|
if (mnote->getTag("LensData")) {
|
||||||
std::string ldata = mnote->getTag("LensData")->valueToString();
|
std::string ldata = validateUft8(mnote->getTag("LensData")->valueToString());
|
||||||
size_t pos;
|
size_t pos;
|
||||||
|
|
||||||
if (ldata.size() > 10 && (pos = ldata.find("Lens = ")) != Glib::ustring::npos) {
|
if (ldata.size() > 10 && (pos = ldata.find("Lens = ")) != Glib::ustring::npos) {
|
||||||
@@ -394,10 +403,10 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
size_t pos = lens.find("$FL$"); // is there a placeholder for focallength?
|
size_t pos = lens.find("$FL$"); // is there a placeholder for focallength?
|
||||||
|
|
||||||
if (pos != Glib::ustring::npos) { // then fill in focallength
|
if (pos != Glib::ustring::npos) { // then fill in focallength
|
||||||
lens = lens.replace(pos, 4, exif->getTag("FocalLength")->valueToString());
|
lens = lens.replace(pos, 4, validateUft8(exif->getTag("FocalLength")->valueToString()));
|
||||||
|
|
||||||
if (mnote->getTag("LensType")) {
|
if (mnote->getTag("LensType")) {
|
||||||
std::string ltype = mnote->getTag("LensType")->valueToString();
|
const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString());
|
||||||
|
|
||||||
if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always
|
if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always
|
||||||
lens = lens.replace(0, 7, "MF");
|
lens = lens.replace(0, 7, "MF");
|
||||||
@@ -416,7 +425,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!lensOk && mnote->getTag("Lens")) {
|
if (!lensOk && mnote->getTag("Lens")) {
|
||||||
std::string ldata = mnote->getTag("Lens")->valueToString();
|
const std::string ldata = validateUft8(mnote->getTag("Lens")->valueToString());
|
||||||
size_t i = 0, j = 0;
|
size_t i = 0, j = 0;
|
||||||
double n[4] = {0.0};
|
double n[4] = {0.0};
|
||||||
|
|
||||||
@@ -453,7 +462,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
|
|
||||||
// Look whether it's MF or AF
|
// Look whether it's MF or AF
|
||||||
if (mnote->getTag("LensType")) {
|
if (mnote->getTag("LensType")) {
|
||||||
std::string ltype = mnote->getTag("LensType")->valueToString();
|
const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString());
|
||||||
|
|
||||||
if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens
|
if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens
|
||||||
lens = lens.replace(0, 7, "MF"); // replace 'Unknwon' with 'MF'
|
lens = lens.replace(0, 7, "MF"); // replace 'Unknwon' with 'MF'
|
||||||
@@ -478,7 +487,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
|
|
||||||
if (lt) {
|
if (lt) {
|
||||||
if (lt->toInt()) {
|
if (lt->toInt()) {
|
||||||
std::string ldata = lt->valueToString ();
|
const std::string ldata = validateUft8(lt->valueToString());
|
||||||
|
|
||||||
if (ldata.size() > 1) {
|
if (ldata.size() > 1) {
|
||||||
found = true;
|
found = true;
|
||||||
@@ -499,7 +508,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
lt = mnote->findTag("LensID");
|
lt = mnote->findTag("LensID");
|
||||||
|
|
||||||
if (lt) {
|
if (lt) {
|
||||||
std::string ldata = lt->valueToString();
|
const std::string ldata = validateUft8(lt->valueToString());
|
||||||
|
|
||||||
if (ldata.size() > 1) {
|
if (ldata.size() > 1) {
|
||||||
lens = ldata;
|
lens = ldata;
|
||||||
@@ -521,7 +530,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mnote->getTag("LensType")) {
|
if (mnote->getTag("LensType")) {
|
||||||
lens = mnote->getTag ("LensType")->valueToString();
|
lens = validateUft8(mnote->getTag("LensType")->valueToString());
|
||||||
// If MakeNotes are vague, fall back to Exif LensMake and LensModel if set
|
// If MakeNotes are vague, fall back to Exif LensMake and LensModel if set
|
||||||
// https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensType
|
// https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensType
|
||||||
if (lens == "M-42 or No Lens" || lens == "K or M Lens" || lens == "A Series Lens" || lens == "Sigma") {
|
if (lens == "M-42 or No Lens" || lens == "K or M Lens" || lens == "A Series Lens" || lens == "Sigma") {
|
||||||
@@ -548,7 +557,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
} else if (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA")) {
|
} else if (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA")) {
|
||||||
if (mnote->getTag ("LensID")) {
|
if (mnote->getTag ("LensID")) {
|
||||||
lens = mnote->getTag ("LensID")->valueToString ();
|
lens = validateUft8(mnote->getTag("LensID")->valueToString());
|
||||||
if (lens == "Unknown") {
|
if (lens == "Unknown") {
|
||||||
lens_from_make_and_model();
|
lens_from_make_and_model();
|
||||||
}
|
}
|
||||||
@@ -558,7 +567,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory();
|
rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory();
|
||||||
|
|
||||||
if (eq->getTag("LensType")) {
|
if (eq->getTag("LensType")) {
|
||||||
lens = eq->getTag("LensType")->valueToString();
|
lens = validateUft8(eq->getTag("LensType")->valueToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (lens == "Unknown") {
|
if (lens == "Unknown") {
|
||||||
@@ -566,7 +575,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
} else if (!make.compare (0, 9, "Panasonic")) {
|
} else if (!make.compare (0, 9, "Panasonic")) {
|
||||||
if (mnote->getTag ("LensType")) {
|
if (mnote->getTag ("LensType")) {
|
||||||
std::string panalens = mnote->getTag("LensType")->valueToString();
|
const std::string panalens = validateUft8(mnote->getTag("LensType")->valueToString());
|
||||||
|
|
||||||
if (panalens.find("LUMIX") != Glib::ustring::npos) {
|
if (panalens.find("LUMIX") != Glib::ustring::npos) {
|
||||||
lens = "Panasonic " + panalens;
|
lens = "Panasonic " + panalens;
|
||||||
@@ -576,9 +585,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (exif->getTag("DNGLensInfo")) {
|
} else if (exif->getTag("DNGLensInfo")) {
|
||||||
lens = exif->getTag("DNGLensInfo")->valueToString();
|
lens = validateUft8(exif->getTag("DNGLensInfo")->valueToString());
|
||||||
} else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) {
|
} else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) {
|
||||||
lens = exif->getTag("LensInfo")->valueToString();
|
lens = validateUft8(exif->getTag("LensInfo")->valueToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -209,6 +209,9 @@ void ExifPanel::setImageData (const FramesMetaData* id)
|
|||||||
|
|
||||||
Gtk::TreeModel::Children ExifPanel::addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable)
|
Gtk::TreeModel::Children ExifPanel::addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable)
|
||||||
{
|
{
|
||||||
|
if (!value.validate()) {
|
||||||
|
value = "???";
|
||||||
|
}
|
||||||
|
|
||||||
Gtk::TreeModel::Row row = * (exifTreeModel->append (root));
|
Gtk::TreeModel::Row row = * (exifTreeModel->append (root));
|
||||||
row[exifColumns.action] = action;
|
row[exifColumns.action] = action;
|
||||||
|
Reference in New Issue
Block a user