diff --git a/rpm/nemo-qml-plugin-systemsettings.spec b/rpm/nemo-qml-plugin-systemsettings.spec index b12f6ff..4f61fdf 100644 --- a/rpm/nemo-qml-plugin-systemsettings.spec +++ b/rpm/nemo-qml-plugin-systemsettings.spec @@ -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 diff --git a/setlocale/main.cpp b/setlocale/main.cpp new file mode 100644 index 0000000..6b62d1f --- /dev/null +++ b/setlocale/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2019 Jolla Ltd. + * Contact: Pekka Vuorela + * + * 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 +#include +#include + +#include +#include +#include +#include + +#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; +} diff --git a/setlocale/setlocale.pro b/setlocale/setlocale.pro new file mode 100644 index 0000000..f4c0f16 --- /dev/null +++ b/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 diff --git a/src/languagemodel.cpp b/src/languagemodel.cpp index 00d60fe..d002b01 100644 --- a/src/languagemodel.cpp +++ b/src/languagemodel.cpp @@ -30,17 +30,14 @@ */ #include "languagemodel.h" +#include "localeconfig.h" #include #include #include #include #include - -#include -#include -#include - +#include namespace { const char * const LanguageSupportDirectory = "/usr/share/jolla-supported-languages"; @@ -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); -} } @@ -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) { diff --git a/src/localeconfig.cpp b/src/localeconfig.cpp new file mode 100644 index 0000000..714b6d2 --- /dev/null +++ b/src/localeconfig.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 Jolla Ltd. + * Contact: Pekka Vuorela + * + * 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 + +#include "localeconfig.h" + +#include +#include +#include + +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(); + } +} diff --git a/src/localeconfig.h b/src/localeconfig.h new file mode 100644 index 0000000..03e2584 --- /dev/null +++ b/src/localeconfig.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2019 Jolla Ltd. + * Contact: Pekka Vuorela + * + * 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 localeConfigPath(); + +#endif diff --git a/src/src.pro b/src/src.pro index 4051b33..5e80b07 100644 --- a/src/src.pro +++ b/src/src.pro @@ -16,6 +16,7 @@ system(qdbusxml2cpp -c ConnmanServiceProxy -p connmanserviceproxy ../dbus/net.co SOURCES += \ languagemodel.cpp \ + localeconfig.cpp \ logging.cpp \ datetimesettings.cpp \ profilecontrol.cpp \ @@ -71,6 +72,7 @@ PUBLIC_HEADERS = \ HEADERS += \ $$PUBLIC_HEADERS \ qdbusxml2cpp_dbus_types.h \ + localeconfig.h \ batterystatus_p.h \ logging_p.h \ diskusage_p.h \ diff --git a/systemsettings.pro b/systemsettings.pro index 9fbcd10..f462179 100644 --- a/systemsettings.pro +++ b/systemsettings.pro @@ -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