Skip to content

Commit

Permalink
Merge branch 'localehelper' into 'master'
Browse files Browse the repository at this point in the history
Implement locale helper tool

See merge request mer-core/nemo-qml-plugin-systemsettings!105
  • Loading branch information
pvuorela committed May 7, 2019
2 parents aade641 + ef05064 commit d02d59d
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 24 deletions.
1 change: 1 addition & 0 deletions rpm/nemo-qml-plugin-systemsettings.spec
Expand Up @@ -69,6 +69,7 @@ rm -rf %{buildroot}
%{_libdir}/qt5/qml/org/nemomobile/systemsettings/plugins.qmltypes
%{_libdir}/qt5/qml/org/nemomobile/systemsettings/qmldir
%{_libdir}/libsystemsettings.so.*
%attr(4710,-,privileged) %{_libexecdir}/setlocale
%dir %attr(0775, root, privileged) /etc/location
%config %attr(0664, root, privileged) /etc/location/location.conf

Expand Down
83 changes: 83 additions & 0 deletions setlocale/main.cpp
@@ -0,0 +1,83 @@
/*
* Copyright (C) 2019 Jolla Ltd.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#include <QFile>
#include <QRegularExpression>
#include <QDebug>

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

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

int main(int argc, char *argv[])
{
if (argc != 2) {
qWarning() << "No locale given";
return EXIT_FAILURE;
}

QString configPath = localeConfigPath();

if (configPath.isEmpty()) {
return EXIT_FAILURE;
}

QString newLocale = QString(argv[1]);
QRegularExpression allowedInput("^[a-zA-Z0-9\\.@_]*$");
if (!allowedInput.match(newLocale).hasMatch()) {
qWarning() << "Invalid locale input:" << newLocale;
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();
return EXIT_FAILURE;
}

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

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

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

return EXIT_SUCCESS;
}
15 changes: 15 additions & 0 deletions setlocale/setlocale.pro
@@ -0,0 +1,15 @@
TEMPLATE = app
TARGET = setlocale
TARGETPATH = /usr/libexec
target.path = $$TARGETPATH

QT = core

SOURCES += \
main.cpp \
../src/localeconfig.cpp

HEADERS += \
../src/localeconfig.h

INSTALLS += target
29 changes: 6 additions & 23 deletions src/languagemodel.cpp
Expand Up @@ -30,17 +30,14 @@
*/

#include "languagemodel.h"
#include "localeconfig.h"

#include <QDir>
#include <QDebug>
#include <QSettings>
#include <QHash>
#include <QDBusInterface>

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

#include <QProcess>

namespace {
const char * const LanguageSupportDirectory = "/usr/share/jolla-supported-languages";
Expand All @@ -50,15 +47,6 @@ bool nameLessThan(const Language &lang1, const Language &lang2)
return (lang1.name().localeAwareCompare(lang2.name()) <= 0);
}

QString localeConfigPath()
{
struct passwd *passwdInfo = getpwuid(getuid());
QString userName;
if (passwdInfo) {
userName = passwdInfo->pw_name;
}
return QString("/var/lib/environment/%1/locale.conf").arg(userName);
}
}


Expand Down Expand Up @@ -183,17 +171,12 @@ QString LanguageModel::locale(int index) const

void LanguageModel::setSystemLocale(const QString &localeCode, LocaleUpdateMode updateMode)
{
QFile localeConfig(localeConfigPath());
if (!localeConfig.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Language model unable to open locale configuration file for writing:" << localeConfigPath()
<< " - " << localeConfig.errorString();
int ret = QProcess::execute(QLatin1String("/usr/libexec/setlocale"), QStringList(localeCode));
if (ret != 0) {
qWarning() << "Setting user locale failed!";
return;
}

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

int oldLocale = m_currentIndex;
m_currentIndex = getLocaleIndex(localeCode);
if (m_currentIndex != oldLocale) {
Expand Down Expand Up @@ -229,7 +212,7 @@ QList<Language> LanguageModel::supportedLanguages()
languages.append(newLanguage);
}

qSort(languages.begin(), languages.end(), nameLessThan);
std::sort(languages.begin(), languages.end(), nameLessThan);
return languages;
}

Expand Down
52 changes: 52 additions & 0 deletions src/localeconfig.cpp
@@ -0,0 +1,52 @@
/*
* Copyright (C) 2019 Jolla Ltd.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#include <QDebug>

#include "localeconfig.h"

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

QString localeConfigPath()
{
struct passwd *passwdInfo = getpwuid(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();
}
}
40 changes: 40 additions & 0 deletions src/localeconfig.h
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2019 Jolla Ltd.
* Contact: Pekka Vuorela <pekka.vuorela@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#ifndef LOCALECONFIG_H
#define LOCALECONFIG_H

#include <QString>

QString localeConfigPath();

#endif
2 changes: 2 additions & 0 deletions src/src.pro
Expand Up @@ -16,6 +16,7 @@ system(qdbusxml2cpp -c ConnmanServiceProxy -p connmanserviceproxy ../dbus/net.co

SOURCES += \
languagemodel.cpp \
localeconfig.cpp \
logging.cpp \
datetimesettings.cpp \
profilecontrol.cpp \
Expand Down Expand Up @@ -71,6 +72,7 @@ PUBLIC_HEADERS = \
HEADERS += \
$$PUBLIC_HEADERS \
qdbusxml2cpp_dbus_types.h \
localeconfig.h \
batterystatus_p.h \
logging_p.h \
diskusage_p.h \
Expand Down
2 changes: 1 addition & 1 deletion systemsettings.pro
Expand Up @@ -6,4 +6,4 @@ src_plugins.depends = src

OTHER_FILES += rpm/nemo-qml-plugin-systemsettings.spec

SUBDIRS = src src_plugins tests
SUBDIRS = src src_plugins setlocale tests

0 comments on commit d02d59d

Please sign in to comment.