diff --git a/kde/pim/akonadi/akonadi-19.04.1-shorter-sockets.diff b/kde/pim/akonadi/akonadi-19.04.1-shorter-sockets.diff index c5808ad6..f4c15336 100644 --- a/kde/pim/akonadi/akonadi-19.04.1-shorter-sockets.diff +++ b/kde/pim/akonadi/akonadi-19.04.1-shorter-sockets.diff @@ -1,57 +1,297 @@ -diff -Nrub -x '*~' -x '*\.rej' -x '*\.orig' -x '*\.o' -x '*\.pyc' akonadi-19.04.1.orig/src/private/standarddirs.cpp akonadi-19.04.1/src/private/standarddirs.cpp ---- akonadi-19.04.1.orig/src/private/standarddirs.cpp 2019-04-19 06:59:33.000000000 +0200 -+++ akonadi-19.04.1/src/private/standarddirs.cpp 2019-06-07 15:05:49.000000000 +0200 -@@ -110,6 +110,8 @@ +From 7d969576d40d4019ef03ad57844d71653ddf407f Mon Sep 17 00:00:00 2001 +From: Filipe Azevedo +Date: Fri, 7 Jun 2019 16:42:45 +0200 +Subject: [PATCH] Shorten sockets file path + +Summary: +Use Qt dedicated 'runtime' standard location for sockets. +This fix an issue on macos where temporary directories are so long + that a user having a long nick would bypass the socket file path length + of 104chars. +The socket file path is now also checked to ensure it fit in the system + socket maximum allowed length. + +Subscribers: kde-pim + +Tags: #kde_pim + +Differential Revision: https://phabricator.kde.org/D21650 +--- + src/private/standarddirs.cpp | 2 ++ + src/server/akonadi.cpp | 9 ++++-- + src/server/storage/dbconfigmysql.cpp | 29 ++++++++++++-------- + src/server/utils.cpp | 41 +++++++++++----------------- + src/server/utils.h | 4 ++- + 5 files changed, 44 insertions(+), 41 deletions(-) + +diff --git a/src/private/standarddirs.cpp b/src/private/standarddirs.cpp +index 45af611aa..84434856f 100644 +--- a/src/private/standarddirs.cpp ++++ b/src/private/standarddirs.cpp +@@ -110,6 +110,8 @@ QString StandardDirs::saveDir(const char *resource, const QString &relPath) fullPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + fullRelPath; } else if (qstrncmp(resource, "data", 4) == 0) { fullPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + fullRelPath; + } else if (qstrncmp(resource, "runtime", 7) == 0) { + fullPath = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + fullRelPath; } else { qt_assert_x(__FUNCTION__, "Invalid resource type", __FILE__, __LINE__); return {}; -diff -Nrub -x '*~' -x '*\.rej' -x '*\.orig' -x '*\.o' -x '*\.pyc' akonadi-19.04.1.orig/src/server/utils.cpp akonadi-19.04.1/src/server/utils.cpp ---- akonadi-19.04.1.orig/src/server/utils.cpp 2019-04-19 06:59:33.000000000 +0200 -+++ akonadi-19.04.1/src/server/utils.cpp 2019-06-07 16:31:18.000000000 +0200 -@@ -33,7 +33,6 @@ +diff --git a/src/server/akonadi.cpp b/src/server/akonadi.cpp +index 883aca4a2..1e93c85a7 100644 +--- a/src/server/akonadi.cpp ++++ b/src/server/akonadi.cpp +@@ -142,8 +142,11 @@ bool AkonadiServer::init() + connectionSettings.setValue(QStringLiteral("Notifications/Method"), QStringLiteral("NamedPipe")); + connectionSettings.setValue(QStringLiteral("Notifications/NamedPipe"), ntfPipe); + #else +- const QString socketDir = Utils::preferredSocketDirectory(StandardDirs::saveDir("data")); +- const QString cmdSocketFile = socketDir % QStringLiteral("/akonadiserver-cmd.socket"); ++ const QString cmdSocketName = QStringLiteral("akonadiserver-cmd.socket"); ++ const QString ntfSocketName = QStringLiteral("akonadiserver-ntf.socket"); ++ const QString socketDir = Utils::preferredSocketDirectory(StandardDirs::saveDir("data"), ++ qMax(cmdSocketName.length(), ntfSocketName.length())); ++ const QString cmdSocketFile = socketDir % QLatin1Char('/') % cmdSocketName; + QFile::remove(cmdSocketFile); + if (!mCmdServer->listen(cmdSocketFile)) { + qCCritical(AKONADISERVER_LOG) << "Unable to listen on Unix socket" << cmdSocketFile << ":" << mCmdServer->errorString(); +@@ -151,7 +154,7 @@ bool AkonadiServer::init() + return false; + } + +- const QString ntfSocketFile = socketDir % QStringLiteral("/akonadiserver-ntf.socket"); ++ const QString ntfSocketFile = socketDir % QLatin1Char('/') % ntfSocketName; + QFile::remove(ntfSocketFile); + if (!mNtfServer->listen(ntfSocketFile)) { + qCCritical(AKONADISERVER_LOG) << "Unable to listen on Unix socket" << ntfSocketFile << ":" << mNtfServer->errorString(); +diff --git a/src/server/storage/dbconfigmysql.cpp b/src/server/storage/dbconfigmysql.cpp +index dfff6fc29..49edad301 100644 +--- a/src/server/storage/dbconfigmysql.cpp ++++ b/src/server/storage/dbconfigmysql.cpp +@@ -42,6 +42,8 @@ using namespace Akonadi::Server; + + #define MYSQL_VERSION_CHECK(major, minor, patch) ((major << 16) | (minor << 8) | patch) + ++static const QString s_mysqlSocketFileName = QStringLiteral("mysql.socket"); ++ + DbConfigMysql::DbConfigMysql() + : mInternalServer(true) + , mDatabaseProcess(nullptr) +@@ -86,7 +88,8 @@ bool DbConfigMysql::init(QSettings &settings) + QString defaultCleanShutdownCommand; + + #ifndef Q_OS_WIN +- const QString socketDirectory = Utils::preferredSocketDirectory(StandardDirs::saveDir("data", QStringLiteral("db_misc"))); ++ const QString socketDirectory = Utils::preferredSocketDirectory(StandardDirs::saveDir("data", QStringLiteral("db_misc")), ++ s_mysqlSocketFileName.length()); + #endif + + const bool defaultInternalServer = true; +@@ -102,8 +105,8 @@ bool DbConfigMysql::init(QSettings &settings) + const QString mysqladminPath = findExecutable(QStringLiteral("mysqladmin")); + if (!mysqladminPath.isEmpty()) { + #ifndef Q_OS_WIN +- defaultCleanShutdownCommand = QStringLiteral("%1 --defaults-file=%2/mysql.conf --socket=%3/mysql.socket shutdown") +- .arg(mysqladminPath, StandardDirs::saveDir("data"), socketDirectory); ++ defaultCleanShutdownCommand = QStringLiteral("%1 --defaults-file=%2/mysql.conf --socket=%3/%4 shutdown") ++ .arg(mysqladminPath, StandardDirs::saveDir("data"), socketDirectory, s_mysqlSocketFileName); + #else + defaultCleanShutdownCommand = QString::fromLatin1("%1 shutdown --shared-memory").arg(mysqladminPath); + #endif +@@ -118,7 +121,7 @@ bool DbConfigMysql::init(QSettings &settings) + mInternalServer = settings.value(QStringLiteral("QMYSQL/StartServer"), defaultInternalServer).toBool(); + #ifndef Q_OS_WIN + if (mInternalServer) { +- defaultOptions = QStringLiteral("UNIX_SOCKET=%1/mysql.socket").arg(socketDirectory); ++ defaultOptions = QStringLiteral("UNIX_SOCKET=%1/%2").arg(socketDirectory, s_mysqlSocketFileName); + } + #endif + +@@ -200,8 +203,9 @@ bool DbConfigMysql::startInternalServer() + const QString akDir = StandardDirs::saveDir("data"); + const QString dataDir = StandardDirs::saveDir("data", QStringLiteral("db_data")); + #ifndef Q_OS_WIN +- const QString socketDirectory = Utils::preferredSocketDirectory(StandardDirs::saveDir("data", QStringLiteral("db_misc"))); +- const QString socketFile = QStringLiteral("%1/mysql.socket").arg(socketDirectory); ++ const QString socketDirectory = Utils::preferredSocketDirectory(StandardDirs::saveDir("data", QStringLiteral("db_misc")), ++ s_mysqlSocketFileName.length()); ++ const QString socketFile = QStringLiteral("%1/%2").arg(socketDirectory, s_mysqlSocketFileName); + const QString pidFileName = QStringLiteral("%1/mysql.pid").arg(socketDirectory); + #endif + +@@ -302,7 +306,7 @@ bool DbConfigMysql::startInternalServer() + return false; + } + +- // If mysql.socket file exists, check if also the server process is still running, ++ // If mysql socket file exists, check if also the server process is still running, + // else we can safely remove the socket file (cleanup after a system crash, etc.) + QFile pidFile(pidFileName); + if (QFile::exists(socketFile) && pidFile.open(QIODevice::ReadOnly)) { +@@ -348,7 +352,7 @@ bool DbConfigMysql::startInternalServer() + #endif + + #ifndef Q_OS_WIN +- // If mysql.socket file does not exists, then we must start the server, ++ // If mysql socket file does not exists, then we must start the server, + // otherwise we reconnect to it + if (!QFile::exists(socketFile)) { + // move mysql error log file out of the way +@@ -403,7 +407,7 @@ bool DbConfigMysql::startInternalServer() + QThread::msleep(100); + } + } else { +- qCDebug(AKONADISERVER_LOG) << "Found mysql.socket file, reconnecting to the database"; ++ qCDebug(AKONADISERVER_LOG) << "Found " << qPrintable(s_mysqlSocketFileName) << " file, reconnecting to the database"; + } + #endif + +@@ -442,7 +446,7 @@ bool DbConfigMysql::startInternalServer() + QStringLiteral("--check-upgrade"), + QStringLiteral("--auto-repair"), + #ifndef Q_OS_WIN +- QStringLiteral("--socket=%1/mysql.socket").arg(socketDirectory), ++ QStringLiteral("--socket=%1/%2").arg(socketDirectory, s_mysqlSocketFileName), + #endif + mDatabaseName + }); +@@ -514,8 +518,9 @@ void DbConfigMysql::processFinished(int exitCode, QProcess::ExitStatus exitStatu + #ifndef Q_OS_WIN + // when the server stopped unexpectedly, make sure to remove the stale socket file since otherwise + // it can not be started again +- const QString socketDirectory = Utils::preferredSocketDirectory(StandardDirs::saveDir("data", QStringLiteral("db_misc"))); +- const QString socketFile = QStringLiteral("%1/mysql.socket").arg(socketDirectory); ++ const QString socketDirectory = Utils::preferredSocketDirectory(StandardDirs::saveDir("data", QStringLiteral("db_misc")), ++ s_mysqlSocketFileName.length()); ++ const QString socketFile = QStringLiteral("%1/%2").arg(socketDirectory, s_mysqlSocketFileName); + QFile::remove(socketFile); + #endif + +diff --git a/src/server/utils.cpp b/src/server/utils.cpp +index 08623fc00..715408823 100644 +--- a/src/server/utils.cpp ++++ b/src/server/utils.cpp +@@ -21,6 +21,7 @@ + + #include "utils.h" + #include "akonadiserver_debug.h" ++#include "instance_p.h" + + #include + +@@ -32,13 +33,13 @@ + #if !defined(Q_OS_WIN) #include #include ++#include #include -#include #include static QString akonadiSocketDirectory(); -@@ -101,15 +100,8 @@ + static bool checkSocketDirectory(const QString &path); +-static bool createSocketDirectory(const QString &link, const QString &tmpl); ++static bool createSocketDirectory(const QString &link, const QString &identifier); + #endif + + #ifdef Q_OS_LINUX +@@ -51,7 +52,7 @@ static bool createSocketDirectory(const QString &link, const QString &tmpl); + using namespace Akonadi; + using namespace Akonadi::Server; + +-QString Utils::preferredSocketDirectory(const QString &defaultDirectory) ++QString Utils::preferredSocketDirectory(const QString &defaultDirectory, int fnLengthHint) + { + const QString serverConfigFile = StandardDirs::serverConfigFile(StandardDirs::ReadWrite); + const QSettings serverSettings(serverConfigFile, QSettings::IniFormat); +@@ -87,6 +88,10 @@ QString Utils::preferredSocketDirectory(const QString &defaultDirectory) + if (!dirInfo.exists()) { + QDir::home().mkpath(dirInfo.absoluteFilePath()); + } ++ ++ if (socketDir.length() + 1 + fnLengthHint >= static_cast(sizeof(sockaddr_un::sun_path))) { ++ qCCritical(AKONADISERVER_LOG) << "akonadiSocketDirectory() length is too long to be used by the system."; ++ } + #endif + return socketDir; + } +@@ -101,25 +106,14 @@ QString akonadiSocketDirectory() return QString(); } - const uid_t uid = getuid(); - const struct passwd *pw_ent = getpwuid(uid); - if (!pw_ent) { - qCCritical(AKONADISERVER_LOG) << "Could not get passwd entry for user id" << uid; - return QString(); - } - - const QString link = StandardDirs::saveDir("data") + QLatin1Char('/') + QLatin1String("socket-") + hostname; +- const QString link = StandardDirs::saveDir("data") + QLatin1Char('/') + QLatin1String("socket-") + hostname; - QString tmpl = QLatin1String("akonadi-") + QString::fromLocal8Bit(pw_ent->pw_name) + QLatin1String(".XXXXXX"); -+ QString tmpl = QLatin1String("XXXXXX"); +- +- // Workaround for QLocalServer encoding bug +- // basically replace non-latin characters +- tmpl = QString::fromLatin1(tmpl.toLatin1()); ++ const QString identifier = Instance::hasIdentifier() ? Instance::identifier() : QLatin1String("default"); ++ const QString link = StandardDirs::saveDir("data") + QStringLiteral("/socket-%1-%2").arg(hostname, identifier); - // Workaround for QLocalServer encoding bug - // basically replace non-latin characters -@@ -152,7 +144,7 @@ + if (checkSocketDirectory(link)) { + return QFileInfo(link).symLinkTarget(); + } - static bool createSocketDirectory(const QString &link, const QString &tmpl) +- if (createSocketDirectory(link, tmpl)) { ++ if (createSocketDirectory(link, identifier)) { + return QFileInfo(link).symLinkTarget(); + } + +@@ -150,19 +144,15 @@ static bool checkSocketDirectory(const QString &path) + return true; + } + +-static bool createSocketDirectory(const QString &link, const QString &tmpl) ++static bool createSocketDirectory(const QString &link, const QString &identifier) { - QString directory = QStringLiteral("%1%2%3").arg(QDir::tempPath()).arg(QDir::separator()).arg(tmpl); -+ QString directory = QStringLiteral("%1%2%3").arg(StandardDirs::saveDir("runtime")).arg(QDir::separator()).arg(tmpl); ++ const QString directory = QStringLiteral("%1/%2").arg(StandardDirs::saveDir("runtime"), identifier); + +- QByteArray directoryString = directory.toLocal8Bit(); +- +- if (!mkdtemp(directoryString.data())) { +- qCCritical(AKONADISERVER_LOG) << "Creating socket directory with template" << directoryString << "failed:" << strerror(errno); ++ if (!QDir().mkpath(directory)) { ++ qCCritical(AKONADISERVER_LOG) << "Creating socket directory with name" << directory << "failed:" << strerror(errno); + return false; + } - QByteArray directoryString = directory.toLocal8Bit(); +- directory = QString::fromLocal8Bit(directoryString); +- + QFile::remove(link); -@@ -177,6 +169,7 @@ + if (!QFile::link(directory, link)) { +@@ -177,6 +167,7 @@ static bool createSocketDirectory(const QString &link, const QString &tmpl) QString Utils::getDirectoryFileSystem(const QString &directory) { #ifndef Q_OS_LINUX + Q_UNUSED(directory); return QString(); #else QString bestMatchPath; +diff --git a/src/server/utils.h b/src/server/utils.h +index fe268b0d3..0c6256a1f 100644 +--- a/src/server/utils.h ++++ b/src/server/utils.h +@@ -99,8 +99,10 @@ static inline QDateTime variantToDateTime(const QVariant &variant) + /** + * Returns the socket @p directory that is passed to this method or the one + * the user has overwritten via the config file. ++ * The passed @p fnLengthHint will also ensure the absolute file path length of the ++ * directory + separator + hint would not overflow the system limitation. + */ +-QString preferredSocketDirectory(const QString &directory); ++QString preferredSocketDirectory(const QString &directory, int fnLengthHint = -1); + + /** + * Returns name of filesystem that @p directory is stored on. This +-- +2.20.1 + diff --git a/kde/pim/akonadi/akonadi.py b/kde/pim/akonadi/akonadi.py index d18f6f6b..88498370 100644 --- a/kde/pim/akonadi/akonadi.py +++ b/kde/pim/akonadi/akonadi.py @@ -1,49 +1,52 @@ # -*- coding: utf-8 -*- import info class subinfo(info.infoclass): def setTargets(self): self.versionInfo.setDefaultValues() self.patchToApply["17.04.0"] = [("akonadi-17.04.0-20170530.diff", 1)] self.patchToApply["17.04.1"] = [("akonadi-17.04.0-20170530.diff", 1)] self.patchToApply["17.04.2"] = [("akonadi-17.04.0-20170530.diff", 1)] self.patchToApply["17.08.3"] = [("akonadi-17.08.3-20171204.diff", 1), #workaround for locked log crash https://phabricator.kde.org/T7538#119826 ("akonadi-17.08.3-20171204-1.diff", 1), ("akonadi-17.08.3-20171204-2.diff", 1)] self.patchToApply["17.12.0"] = [("akonadi-17.12.0-20171220.diff", 1), ("0001-Win-Create-local-socket-named-pipes-based-on-the-ins.patch", 1)] self.patchToApply["18.12.2"] = [("akonadi-18.12.2-macos.diff", 1), ("akonadi-18.12.2-errorstring.diff", 1)] self.patchLevel["18.12.2"] = 2 self.patchToApply["18.12.3"] = [("akonadi-18.12.2-macos.diff", 1), ("akonadi-18.12.2-errorstring.diff", 1)] self.patchLevel["18.12.3"] = 2 self.patchToApply["19.04.1"] = [("akonadi-19.04-macos.diff", 1), ("akonadi-18.12.2-errorstring.diff", 1), ("akonadi-19.04.1-shorter-sockets.diff", 1)] # macos temp path are so long that if a user has a long nick it bypass the limited socket file path length of 104chars. - self.patchLevel["19.04.1"] = 2 + self.patchLevel["19.04.1"] = 3 + self.patchToApply["19.04.2"] = [("akonadi-19.04-macos.diff", 1), + ("akonadi-18.12.2-errorstring.diff", 1), + ("akonadi-19.04.1-shorter-sockets.diff", 1)] # macos temp path are so long that if a user has a long nick it bypass the limited socket file path length of 104chars. self.description = "A storage service for PIM data and meta data" def setDependencies(self): self.buildDependencies["kde/frameworks/extra-cmake-modules"] = None self.buildDependencies["libs/boost/boost-graph"] = None self.runtimeDependencies["libs/libxslt"] = None self.runtimeDependencies["libs/sqlite"] = None self.runtimeDependencies["libs/shared-mime-info"] = None self.runtimeDependencies["libs/qt5/qtbase"] = None self.runtimeDependencies["kde/frameworks/tier3/kdesignerplugin"] = None self.runtimeDependencies["kde/frameworks/tier2/kcompletion"] = None self.runtimeDependencies["kde/frameworks/tier1/kitemmodels"] = None self.runtimeDependencies["kde/frameworks/tier3/kio"] = None from Package.CMakePackageBase import * class Package(CMakePackageBase): def __init__(self): CMakePackageBase.__init__(self) self.subinfo.options.configure.args = " -DDATABASE_BACKEND=SQLITE -DAKONADI_RUN_MYSQL_ISOLATED_TESTS=OFF -DBUILD_TESTING=OFF"