<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>51809</bug_id>
          
          <creation_ts>2024-10-23 16:45:39 +0300</creation_ts>
          <short_desc>Невозможно войти из lightdm в классический gnome</short_desc>
          <delta_ts>2024-10-26 17:06:03 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>lightdm</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ivan A. Melnikov">iv</reporter>
          <assigned_to name="manowar@altlinux.org">manowar</assigned_to>
          <cc>aris</cc>
    
    <cc>golubevan</cc>
    
    <cc>liannnix</cc>
    
    <cc>manowar</cc>
    
    <cc>sin</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>253370</commentid>
    <comment_count>0</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-23 16:45:39 +0300</bug_when>
    <thetext>Раньше было можно, теперь падает.

- возьмите систему с lightdm
- установите пакет gnome-regular
- выберете сеанс &quot;Классический GNOME c Xorg&quot;
- войдите в систему

Ожидание: запустится классический GNOME
Реальность: что-то падает и снова появляется приглашение входа в систему от lightdm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253371</commentid>
    <comment_count>1</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-23 16:47:00 +0300</bug_when>
    <thetext>При этом у пользователя в ~/.xsession-errors:0 появляется что-то такое:

Running Xsession[13468] env GNOME_SHELL_SESSION_MODE=classic gnome-session
Agent pid 13511
runwm: window manager &quot;env gnome_shell_session_mode=classic gnome-session&quot; not found.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253373</commentid>
    <comment_count>2</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-23 17:00:40 +0300</bug_when>
    <thetext>Примерная цепочка событий:

Для старта сессии нужно запустить такую команду:

# grep ^Exec /usr/share/xsessions/gnome-classic-xorg.desktop
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session

lightdm по умолчанию пытается эту команду завернуть в Xsession:

# grep ^session-wrapper /etc/lightdm/lightdm.conf
session-wrapper=/etc/X11/Xsession

Однако раз session-wrapper есть, вся строка из Exec попадает в один, первый аргумент session-wrapper&apos;а (т.е. /etc/X11/Xsession), вместо того чтобы разделиться на отдельные аргументы:

https://git.altlinux.org/gears/l/lightdm.git?p=lightdm.git;a=blob;f=lightdm/src/seat.c;h=09c78004f4ee72cf09be075b34f35527f71c7adf#l942

/etc/X11/Xsession (пакет xinitrc) видит, что его первый аргумент -- это не абсолютный путь к бинарнику, и передаёт его в rundm

https://git.altlinux.org/gears/x/xinitrc.git?a=blob;f=xinitrc/install/etc/X11/Xsession;h=4dc829853de54fa74f77d0435539cfa2dfde23ea#l219

rundm, естественно, к такому не готов.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253374</commentid>
    <comment_count>3</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-23 17:06:03 +0300</bug_when>
    <thetext>&gt; Примерная цепочка событий:
[...]

То есть, сейчас получается, что lightdm работает, только если в Exec указан полный путь к исполняемому файлу, причём без аргументов. Спецификация на desktop-файлы[1] разрешает указывать имена без пути (чтобы их поискали в $PATH) и аргументы через пробел. Так что если в /usr/share/xsessions лежат обычные настоящие desktop-файлы без каких-либо дополнительных ограничений, lightdm неправ в том, как он их обрабатывает.

[1] https://specifications.freedesktop.org/desktop-entry-spec/latest/exec-variables.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253382</commentid>
    <comment_count>4</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-24 13:15:55 +0300</bug_when>
    <thetext>Да, как единую строку читает &quot;Exec&quot;: https://git.altlinux.org/gears/l/lightdm.git?p=lightdm.git;a=blob;f=lightdm/src/session-config.c;h=e0bca920eea15a6afe62457abb25468645054a1f;hb=0c7668cc9d018f80cd3e3b602ae1f76f63150288#l32

Нужно сделать разбиение на аргументы командной строки, вероятно, с учётом возможного экранирования. Нет ли на этот счёт известного готового решения?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253399</commentid>
    <comment_count>5</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-24 23:35:16 +0300</bug_when>
    <thetext>(In reply to manowar@altlinux.org from comment #4)
&gt; Нужно сделать разбиение на аргументы командной строки, вероятно, с учётом
&gt; возможного экранирования. Нет ли на этот счёт известного готового решения?

В том же get_session_argv чуть ниже используется g_shell_parse_argv из glib. На первый взгляд оно делает всё что нужно.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253414</commentid>
    <comment_count>6</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 13:13:59 +0300</bug_when>
    <thetext>Спасибо, и правда. Осталось понять тогда, почему в lightdm в случае, когда есть обёртка, всё укладывается в один аргумент. То есть, как будто бы специально это сделано.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253422</commentid>
    <comment_count>7</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 14:35:06 +0300</bug_when>
    <thetext>Да, я нашёл комит специально отменяющий правильное, на наш взгляд, поведение: https://git.altlinux.org/people/manowar/packages/?p=lightdm.git;a=commitdiff;h=964619ba615cd6c57070ad59cdcca8f132d9dfb1 .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253423</commentid>
    <comment_count>8</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 15:03:46 +0300</bug_when>
    <thetext>https://github.com/canonical/lightdm/issues/381</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253439</commentid>
    <comment_count>9</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 16:46:07 +0300</bug_when>
    <thetext>Ну как бы вот: это что-то убунто-специфическое и старое:

--- a/tests/src/lightdm-session
+++ b/tests/src/lightdm-session
@@ -1,5 +1,4 @@
 #!/bin/sh
 
-# Run the session expecting the full command to be the first argument.  It has
-# to be like this for backwards compatibility instead of having a normal argument list
-exec $1
+# Run the session expecting an argument list.
+exec &quot;$@&quot;

Но мы вполне можем сделать по своему, мне кажется.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253440</commentid>
    <comment_count>10</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 16:59:49 +0300</bug_when>
    <thetext>Сделал:

https://git.altlinux.org/people/manowar/packages/?p=lightdm.git;a=commitdiff;h=1055b1486093458dbaf2dedc53f267597479e1ee

Но не особо полегчало-то. :) Теперь:

runwm: window manager &quot;env&quot; not found.

Оно и понятно, раз

&gt; Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session

и

&gt; /etc/X11/Xsession (пакет xinitrc) видит, что его первый
&gt; аргумент -- это не абсолютный путь к бинарнику, и передаёт
&gt; его в rundm</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253445</commentid>
    <comment_count>11</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-25 17:08:52 +0300</bug_when>
    <thetext>&gt; runwm: window manager &quot;env&quot; not found.

А разве &quot;env&quot; не должен привратиться в /usr/bin/env?

То есть, разве g_find_program_in_path (argv[0]) не нужен и в ветке if-a c session-wrapper?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253446</commentid>
    <comment_count>12</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 17:21:08 +0300</bug_when>
    <thetext>Так он там есть:

+    if (session_wrapper)
+    {
+        path = g_find_program_in_path (session_wrapper);
+       prepend_argv (&amp;argv, path ? path : session_wrapper);
+    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253448</commentid>
    <comment_count>13</comment_count>
    <who name="manowar@altlinux.org">manowar</who>
    <bug_when>2024-10-25 17:37:59 +0300</bug_when>
    <thetext>А, не сразу понял твою мысль, извини. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253461</commentid>
    <comment_count>14</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2024-10-25 19:28:10 +0300</bug_when>
    <thetext>lightdm-1.32.0-alt9 -&gt; sisyphus:

 Fri Oct 25 2024 Paul Wolneykien &lt;manowar@altlinux&gt; 1.32.0-alt9
 - Fix: Invoke session wrapper with splitted arguments (closes: 51809).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>253472</commentid>
    <comment_count>15</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2024-10-26 17:06:03 +0300</bug_when>
    <thetext>Спасибо!</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>