Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Store locale.conf per user and set system locale.
[systemsettings] Store locale to path based on uid. Contributes to JB#47651
[systemsettings] Set system locale. Contributes to JB#47651

Store user and system locale in separate directories. Store user locale
based on uid instead of username since that is easier to handle in
certain service files. Setting device owner locale sets system locale
too.

Working with paths that may not exist is a little ugly in Qt and it
doesn't seem to have a way to set directory permissions at all.

Signed-off-by: Tomi Leppänen <tomi.leppanen@jolla.com>
  • Loading branch information
Tomin1 committed Feb 26, 2020
1 parent cc0a430 commit 5459338
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 22 deletions.
1 change: 1 addition & 0 deletions rpm/nemo-qml-plugin-systemsettings.spec
Expand Up @@ -30,6 +30,7 @@ BuildRequires: pkgconfig(connman-qt5) >= 1.2.23
BuildRequires: pkgconfig(ssu-sysinfo) >= 1.1.0
BuildRequires: pkgconfig(packagekitqt5)
BuildRequires: pkgconfig(glib-2.0)
BuildRequires: pkgconfig(sailfishaccesscontrol)

%description
%{summary}.
Expand Down
84 changes: 71 additions & 13 deletions setlocale/main.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2019 Jolla Ltd.
* Copyright (C) 2020 Open Mobile Platform LLC.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
Expand Down Expand Up @@ -30,17 +31,78 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QRegularExpression>
#include <QDebug>

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sailfishaccesscontrol.h>

#include "../src/localeconfig.h"

static bool ensureDirectory(QString filePath)
{
auto directory = QFileInfo(filePath).dir();

if (directory.exists())
return true;

// Ensure parent with correct rights (recursion)
if (!ensureDirectory(directory.path()))
return false;

// Create this directory
if (!directory.mkpath(QStringLiteral(".")))
return false;

// Set correct access perms, root:root 755
auto pathArray = directory.path().toUtf8();
const char *path = pathArray.data();

if (chmod(path, S_IWUSR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == -1)
qWarning() << "Failed to set directory permissions" << directory.path() << ":" << strerror(errno);

if (chown(path, 0, 0) == -1)
qWarning() << "Failed to set directory as root:root" << directory.path() << ":" << strerror(errno);

return true;
}

static bool writeLocale(QString &configPath, QString &locale)
{
QFile localeConfig(configPath);
if (!ensureDirectory(configPath)) {
qWarning() << "Unable to create directory for locale configuration file";
return false;
}

if (!localeConfig.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Unable to open locale configuration file for writing:" << configPath
<< "-" << localeConfig.errorString();
return false;
}

localeConfig.setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner |
QFileDevice::ReadGroup | QFileDevice::ReadOther);

if (fchown(localeConfig.handle(), 0, 0) == -1) {
qWarning() << "Failed to set localeconfig as root:root:" << configPath << ":" << strerror(errno);
}

if (!configPath.startsWith("/etc/"))
localeConfig.write("# Autogenerated by settings\n");

localeConfig.write(QString("LANG=%1\n").arg(locale).toLatin1());
localeConfig.close();
return true;
}

int main(int argc, char *argv[])
{
if (argc != 2) {
Expand All @@ -61,23 +123,19 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}

QFile localeConfig(configPath);
if (!localeConfig.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Unable to open locale configuration file for writing:" << configPath
<< "-" << localeConfig.errorString();
if (!writeLocale(configPath, newLocale))
return EXIT_FAILURE;
}

localeConfig.setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner |
QFileDevice::ReadGroup | QFileDevice::ReadOther);
// Set system locale as well if the user is device owner
if (sailfish_access_control_hasgroup(getuid(), "sailfish-system")) {
QString configPath = systemLocaleConfigPath();

if (fchown(localeConfig.handle(), 0, 0)) {
qWarning() << "Failed to set localeconfig as root:root" << strerror(errno);
if (configPath.isEmpty()) {
qWarning() << "No path for system locale";
} else if (!writeLocale(configPath, newLocale)) {
qWarning() << "Could not set system locale";
} // else success
}

localeConfig.write("# Autogenerated by settings\n");
localeConfig.write(QString("LANG=%1\n").arg(newLocale).toLatin1());
localeConfig.close();

return EXIT_SUCCESS;
}
3 changes: 3 additions & 0 deletions setlocale/setlocale.pro
Expand Up @@ -5,6 +5,9 @@ target.path = $$TARGETPATH

QT = core

CONFIG += link_pkgconfig
PKGCONFIG += sailfishaccesscontrol

SOURCES += \
main.cpp \
../src/localeconfig.cpp
Expand Down
17 changes: 8 additions & 9 deletions src/localeconfig.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2019 Jolla Ltd.
* Copyright (C) 2020 Open Mobile Platform LLC.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
Expand Down Expand Up @@ -36,17 +37,15 @@

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

QString localeConfigPath()
{
struct passwd *passwdInfo = getpwuid(getuid());
// User-wide locale config
return QString("/home/.system/var/lib/environment/%1/locale.conf").arg(getuid());
}

if (passwdInfo) {
QString userName = passwdInfo->pw_name;
return QString("/var/lib/environment/%1/locale.conf").arg(userName);
} else {
qWarning() << "Unable to get user info";
return QString();
}
QString systemLocaleConfigPath()
{
// System-wide locale config
return QString("/etc/locale.conf");
}
2 changes: 2 additions & 0 deletions src/localeconfig.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2019 Jolla Ltd.
* Copyright (C) 2020 Open Mobile Platform LLC.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
Expand Down Expand Up @@ -36,5 +37,6 @@
#include <QString>

QString localeConfigPath();
QString systemLocaleConfigPath();

#endif

0 comments on commit 5459338

Please sign in to comment.