Report precise avatar editor source validation failures

This commit is contained in:
evgeny committed 2026-10-27 12:30:21 +01:00
1 parent 6c1b429e91
commit b62ca4093e
1 file changed
+9 -5
+9 -5
View File
@@ -106,18 +106,22 @@ bool selectAvatarCrop(const QString& source, QRectF& crop, QWidget* parent) {
pool.start(QRunnable::create([source, &completion, dialog, view, status, buttons] {
QImageReader reader(source); reader.setAutoTransform(true); const QSize size = reader.size(); QImage image;
QString error;
const qint64 sourceBytes = QFileInfo(source).size(); const QByteArray format = reader.format();
QSize orientedSize=size;
if (reader.transformation() & QImageIOHandler::TransformationRotate90) orientedSize.transpose();
if (QFileInfo(source).size() > 0 && QFileInfo(source).size() <= AvatarCache::OriginalMaxBytes && size.width() > 0 && size.height() > 0 &&
qint64(size.width())*size.height() <= 16*1024*1024 &&
(reader.format()=="jpeg" || reader.format()=="png" || reader.format()=="webp")) {
if (sourceBytes < 1 || sourceBytes > AvatarCache::OriginalMaxBytes) error = QStringLiteral("source must contain 1..33554432 bytes");
else if (size.width() < 1 || size.height() < 1) error = reader.errorString();
else if (qint64(size.width())*size.height() > 16*1024*1024) error = QStringLiteral("source exceeds 16 megapixels");
else if (format != "jpeg" && format != "png" && format != "webp") error = QStringLiteral("unsupported image format");
else {
if (qMax(size.width(), size.height()) > 1600) {
const QSize preview = size.scaled(1600, 1600, Qt::KeepAspectRatio);
reader.setScaledSize({qMax(1, preview.width()), qMax(1, preview.height())});
}
image = reader.read(); if (image.isNull()) error = reader.errorString();
} else error = QStringLiteral("source is unreadable, exceeds 32 MiB/16 MP, or has an unsupported format");
if (image.isNull()) DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "avatar: editor decode failed source=%s reason=%s", qPrintable(source), qPrintable(error));
}
if (image.isNull()) DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "avatar: editor decode failed source=%s bytes=%lld original=%dx%d format=%s reason=%s",
qPrintable(source), (long long)sourceBytes, size.width(), size.height(), format.constData(), qPrintable(error));
if (!QMetaObject::invokeMethod(&completion, [dialog, view, image, orientedSize, status, buttons] {
if (!dialog) return;
if (image.isNull()) {