Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'jb47651_locale_changes' into 'master'
Store locale.conf per user and set system locale.

See merge request mer-core/nemo-qml-plugin-systemsettings!132
  • Loading branch information
Tomin1 committed Feb 27, 2020
2 parents cc0a430 + 660dd17 commit 26cc3ae
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 23 deletions.
20 changes: 19 additions & 1 deletion rpm/nemo-qml-plugin-systemsettings.spec
Expand Up @@ -12,6 +12,7 @@ Requires: connman
Requires: mce >= 1.83.0
Requires: libsailfishkeyprovider >= 0.0.14
Requires: connman-qt5 >= 1.2.21
Requires(post): coreutils
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5SystemInfo)
BuildRequires: pkgconfig(Qt5Test)
Expand All @@ -30,6 +31,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 Expand Up @@ -60,7 +62,23 @@ make %{?_smp_mflags}
rm -rf %{buildroot}
%qmake5_install

%post -p /sbin/ldconfig
%post
/sbin/ldconfig
# Migrate old installations to system/user locale, see JB#47651
if [ -e /var/lib/environment/nemo/locale.conf ]
then
# Copy system locale to user location
if [ ! -e /home/.system/var/lib/environment/100000/locale.conf ]
then
mkdir -p /home/.system/var/lib/environment/100000 || :
# Fix an issue with dir perms, from connman
chmod +rx /home/.system /home/.system/var /home/.system/var/lib || :
cp /var/lib/environment/nemo/locale.conf /home/.system/var/lib/environment/100000/ || :
fi

# Migrate to new system locale location
mv /var/lib/environment/nemo/locale.conf /etc/locale.conf || :
fi

%postun -p /sbin/ldconfig

Expand Down
89 changes: 76 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,24 +31,90 @@
* 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) {
qWarning() << "No locale given";
return EXIT_FAILURE;
}

if (!sailfish_access_control_hasgroup(getuid(), "users")) {
qWarning() << "User with id" << getuid() << "is not member of users group";
return EXIT_FAILURE;
}

QString configPath = localeConfigPath();

if (configPath.isEmpty()) {
Expand All @@ -61,23 +128,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 26cc3ae

Please sign in to comment.