Bug #7897
Fix localization of GNOME session in Jessie
100%
Description
When one chooses a language in tails-greeter, it as applied in the greeter, but NOT in the session opened afterwards.
Subtasks
Related issues
Related to Tails - |
Resolved | 2015-01-16 |
History
#1 Updated by alant 2014-09-14 09:55:09
- Status changed from New to In Progress
- % Done changed from 0 to 10
Adding echo "LANG=${TAILS_LOCALE_NAME}
" >> /home/${LIVE_USERNAME}/.xsessionrc@ in /etc/gdm/PostLogin/Default
solves the issue.
#2 Updated by alant 2014-09-14 10:07:33
Alternatively, gnome-control-center
sets locale through DBus on the system bus: org.freedesktop.locale1
/org/freedesktop/locale1
SetLocale
.
#3 Updated by alant 2014-09-14 16:14:06
- % Done changed from 10 to 20
- Feature Branch set to greeter:feature/jessie
It should be fixed the xsessionrc way in greeter:feature/jessie. To be tested.
#4 Updated by intrigeri 2014-09-15 10:28:15
- Category set to 165
- Assignee set to alant
alant wrote:
> Adding echo "LANG=${TAILS_LOCALE_NAME}
" >> /home/${LIVE_USERNAME}/.xsessionrc@ in /etc/gdm/PostLogin/Default
solves the issue.
Great! I’ve uploaded a new greeter package that has this change, so that we get the short term workaround.
I’m unsure if that’s the right way to fix it, though: it adds one more session initialization point, that might or might not be synchronized with other ones, and I’m kinda scared that we’re going to run into more race conditions by doing it with way, and that may require more ugly hacks later, such as the one we already have for setting the keyboard layout.
> Alternatively, gnome-control-center sets locale through DBus on the system bus: org.freedesktop.locale1 /org/freedesktop/locale1 SetLocale.
This seems to me this solution would potentially have better chances to correctly synchronize with the rest of the session initialization.
But still, the major question remains IMO: how does the standard GDM greeter set the locale? IMO, we should just do the same.
#5 Updated by alant 2014-09-15 14:23:31
> But still, the major question remains IMO: how does the standard GDM greeter set the locale? IMO, we should just do the same.
As far as I found, it doesn’t anymore set the locale.
#6 Updated by alant 2014-09-15 14:48:44
- Category deleted (
165) - Assignee deleted (
alant)
> It should be fixed the xsessionrc way in greeter:feature/jessie. To be tested.
It works now but I had to add the line LANG=C
in .xsessionrc
for it to be modified by grep_n_set
in greeter PostLogin
script, which looks like a bug in gren_n_set
or a misunderstanding I had on how it’s supposed to work. At least it enable the translators to work (Feature #7568).
Anyway the right solution seems to set locale through DBus on the system bus: org.freedesktop.locale1 /org/freedesktop/locale1 SetLocale.
#7 Updated by alant 2014-09-15 14:51:17
- Category set to 165
- Assignee set to alant
#8 Updated by intrigeri 2014-09-22 15:05:42
alant wrote:
> As far as I found, it doesn’t anymore set the locale.
So the locale is set by gnome-control-center once its run by the session manager? I’m kinda surprised, as for the correct locale environment to be set, it must be done in a process that’s a parent of the entire session.
> […] which looks like a bug in grep_n_set
I’ve looked at the code, and it seems correct, but I may be missing something.
> Anyway the right solution seems to set locale through DBus on the system bus: org.freedesktop.locale1 /org/freedesktop/locale1 SetLocale.
Agreed, if that’s how locales are initialized in a non-Tails GNOME session.
#9 Updated by intrigeri 2014-09-22 15:28:22
intrigeri wrote:
> > […] which looks like a bug in grep_n_set
>
> I’ve looked at the code, and it seems correct, but I may be missing something.
Ah, no, indeed it’s completely buggy: the vague grep -qs "$1" "$2"
check will return true, as our .xsessionrc
contains the string TAILS_WIKI_SUPPORTED_LANGUAGES
, which contains the string “LANG”. So, grep_n_set
switches to replacement mode (as opposed to addition mode). This would be fixed by anchoring the grep regexp to the beginning or a line (with whitespace, potentially), e.g. grep -qs "^\s*$1" "$2"
or similar. However, one needs to check for each other usage of this function, to see if a stricter regexp breaks anything else.
#10 Updated by intrigeri 2014-09-22 15:44:42
- Priority changed from Normal to High
- Target version set to Tails_2.0
(Like parent ticket.)
#11 Updated by alant 2014-09-23 05:39:05
intrigeri wrote:
> alant wrote:
> > As far as I found, it doesn’t anymore set the locale.
>
> So the locale is set by gnome-control-center once its run by the session manager? I’m kinda surprised, as for the correct locale environment to be set, it must be done in a process that’s a parent of the entire session.
As far as I understand, gdm doesn’t take care of that anymore (I didn’t find any code to setup locale in gdm). I’ll investigate gnome-sesson.
> > Anyway the right solution seems to set locale through DBus on the system bus: org.freedesktop.locale1 /org/freedesktop/locale1 SetLocale.
>
> Agreed, if that’s how locales are initialized in a non-Tails GNOME session.
I tried to boot tails jessie, comment the line modifying .xsessionrc
and change org.freedesktop.locale1.Locale
with gdbus
. It’s changed but the locale not applied in the session so it’s not the solution.
#12 Updated by alant 2014-09-23 08:11:22
- Assignee deleted (
alant)
There is also a org.freedesktop.Accounts.User.SetLocale
dbus method which doesn’t seem to work either.
GDM seems to handle $LANG
for the session in function build_launch_environment
of daemon/gdm-launch-environment.c
. If I understand well it looks for $LANG
and other variables in /etc/locale.conf
but setting this don’t work either.
I’m giving up on this.
#13 Updated by intrigeri 2014-10-02 09:32:06
- Assignee set to alant
- QA Check set to Info Needed
Asked on tails-dev@ for info about what was already tried.
#14 Updated by intrigeri 2014-10-02 09:41:20
alant wrote:
> GDM seems to handle $LANG
for the session in function build_launch_environment
of daemon/gdm-launch-environment.c
. If I understand well it looks for $LANG
and other variables in /etc/locale.conf
but setting this don’t work either.
Well, this function also sets RUNNING_UNDER_GDM
to true, so I doubt it’s used to set up the (non-GDM) regular user GNOME session.
#15 Updated by intrigeri 2014-10-02 10:14:10
After reading https://help.gnome.org/admin/gdm/stable/configuration.html.en#userconfig, I’ve tried editing .dmrc
in PostLogin/Default
. The configured language isn’t applied. I guess that this file is loaded earlier, to set the user’s default language.
#16 Updated by intrigeri 2014-10-02 16:02:22
Regardless of what language I choose in the Greeter, I see in the logs (language.py
):
__apply_locale: Setting session language to en_US.UTF-8
Some more debugging shows that self._locale
is always en_US
in __apply_locale
. That’s a first bug, I think. I’ve not looked at it in more details. Alan, now that we have a first lead, are you interested in having a closer look?
Then, I also see that in the logs:
AccountsService-WARNING **: SetLanguage call failed: GDBus.Error:org.freedesktop.Accounts.Error.PermissionDenied: Not authorized
It seems that we have a second bug here, and even if __apply_locale
was fixed, it might be that the correct locale could not be applied. We ship what looks very much like correct permissions to me in org.boum.tails.accounts.pkla
: I checked in data/org.freedesktop.Accounts.User.xml
the permission name, and tried with ResultAny=yes
as well; but pkcheck seems to agree that our greeter’s process is not allowed to run this action. I’ve also tried setting the same permissions on /etc/polkit-1/localauthority
that I have on my system, still same results. polkitd is started with --no-debug
, it would be great to enable its debug output to understand better what’s happening.
#17 Updated by alant 2014-10-08 03:09:28
> Regardless of what language I choose in the Greeter, I see in the logs (language.py
):
>
> __apply_locale: Setting session language to en_US.UTF-8
>
> Some more debugging shows that self._locale
is always en_US
in __apply_locale
.
You mean even after choosing another language than english, right?
> That’s a first bug, I think. I’ve not looked at it in more details. Alan, now that we have a first lead, are you interested in having a closer look?
>
Yes definately. Thanks for the finding.
> Then, I also see that in the logs:
>
> AccountsService-WARNING **: SetLanguage call failed: GDBus.Error:org.freedesktop.Accounts.Error.PermissionDenied: Not authorized
>
> It seems that we have a second bug here, and even if __apply_locale
was fixed, it might be that the correct locale could not be applied. We ship what looks very much like correct permissions to me in org.boum.tails.accounts.pkla
: I checked in data/org.freedesktop.Accounts.User.xml
the permission name, and tried with ResultAny=yes
as well; but pkcheck seems to agree that our greeter’s process is not allowed to run this action. I’ve also tried setting the same permissions on /etc/polkit-1/localauthority
that I have on my system, still same results. polkitd is started with --no-debug
, it would be great to enable its debug output to understand better what’s happening.
Oh annoying… I could have a quick look but I’m not an expert of policykit. Would you loke to try again once the 1st bug is fixed
#18 Updated by alant 2014-10-08 03:17:59
- QA Check changed from Info Needed to Dev Needed
intrigeri wrote:
> Asked on tails-dev@ for info about what was already tried.
Please find clarifications below.
> E.g. you wrote “I tried to boot tails jessie, comment the line
> modifying .xsessionrc and change org.freedesktop.locale1.Locale with
> gdbus. It’s changed but the locale not applied in the session so it’s
> not the solution.” — how exactly did you try this?
>
I set up a root password with rootpw
on kernel command line, then
when the greeter was ready I went to a text console, logged in,
changed .xsessionrc
and launched gdbus
from that text console
> (E.g. .xsessionrc is sourced before D-Bus is started, so if you did
> it via this file, it couldn’t possibly work.)
>
This call happens on the system bus which is started at this point.
> Also, you wrote “If I understand well it looks for $LANG and other
> variables in /etc/locale.conf but setting this don’t work either”; how
> exactly did you try to set this?
I set up a root password and logged in a text console as above but
instead of launching gdbus
I edited locale.conf
.
> The SetLocale method doesn’t exist on my system. You really meant
> org.freedesktop.Accounts.User.SetLanguage, right?
Yes.
#19 Updated by intrigeri 2014-10-08 03:33:16
>> Regardless of what language I choose in the Greeter, I see in the logs (language.py
):
>>
>> __apply_locale: Setting session language to en_US.UTF-8
>>
>> Some more debugging shows that self._locale
is always en_US
in __apply_locale
.
> You mean even after choosing another language than english, right?
Right.
> Oh annoying… I could have a quick look but I’m not an expert of policykit.
> Would you loke to try again once the 1st bug is fixed
I’m no expert in that field either, but sure, I can have a closer look.
#21 Updated by intrigeri 2014-11-07 10:58:36
Another lead (that shouldn’t prevent us from finding the bug highlighted above, that’s most likely in our own code) would be to use systemd’s localed:
- http://www.freedesktop.org/wiki/Software/systemd/localed/
localectl(1)
systemd-localed(8)
#22 Updated by alant 2014-12-31 18:50:42
- Assignee changed from alant to intrigeri
intrigeri wrote:
> Regardless of what language I choose in the Greeter, I see in the logs (language.py
):
>
> __apply_locale: Setting session language to en_US.UTF-8
>
> Some more debugging shows that self._locale
is always en_US
in __apply_locale
. That’s a first bug, I think. I’ve not looked at it in more details. Alan, now that we have a first lead, are you interested in having a closer look?
I tried to reproduce your log with tails-greeter 0.8.6+jessie1 in an iso built from 3a16e4e
I start with rootpw=
then go to the text console and edit /usr/share/tails-greeter/tails-logging
to set logging level to DEBUG
, then restart gdm with service gdm restart
.
When the greeter starts, I first get:
18:21:48 amnesia gnome-session[5629]: [DEBUG] language.py:364 __apply_locale: Setting session language to en_US.UTF-8
18:21:48 amnesia gnome-session[5629]: [WARNING] language.py:370 __apply_locale: AccountsManager not ready
Then when I choose french I see two of thses:
18:21:53 amnesia gnome-session[5629]: [DEBUG] language.py:358 __set_default_locale: setting default locale to fr_FR
18:21:53 amnesia gnome-session[5629]: [DEBUG] language.py:364 __apply_locale: Setting session language to fr_FR.UTF-8
These are the last calls to __apply_locale
so they should be the one taken into account. That looks right to me. So I fail to find a bug in the greeter code. How exacty did you obtained the log you got intrigeri?
#23 Updated by intrigeri 2015-01-16 13:30:32
The feature/jessie-localectl
branch migrates most of our locale and keyboard settings to localectl
. Quickly tested in a live Tails/Jessie, but that’s all.
Not looked at the bug I’ve reported above, that Alan can’t reproduced, yet.
#24 Updated by intrigeri 2015-01-16 15:39:19
- related to
Feature #8713: Consider replacing some of our code with the GDM->GNOME session keyboard layout passthrough added
#25 Updated by BitingBird 2015-01-16 17:23:37
- Subject changed from Fix localization of GNOME session to Fix localization of GNOME session in Jessie
#26 Updated by intrigeri 2015-03-07 20:02:36
- Status changed from In Progress to Resolved
- % Done changed from 20 to 100
Fixed with tails-greeter 0.8.8+jessie2 and commit:24621ee010819cd1e97fbb8e318b7dfc3778f54a.
#27 Updated by intrigeri 2020-04-15 06:05:39
- Affected tool changed from Greeter to Welcome Screen