LinuxForum.Fans
Тема

Нужна помощь в проекте xroot - GUI для su/sudo

Автор: romkaromka 34 сообщений 9411 просмотров
#238329

Проект: http://code.google.com/p/xroot/
Исходники: http://xroot.googlecode.com/files/xroot-src-0.0.3.tar.gz
Готова версия xroot-0.0.3 для тестирования.
На сайте http://code.google.com/p/xroot/downloads/list выложены архивы для 32bit и для 64bit. Из них надо лишь извлечь исполняемый файл xroot неважно куда (например, в /usr/bin/). Можно просто положить xroot на Рабочий стол и дважды щелкнуть - запустится окно, в котором будет предложено ввести команду, пароль и выбрать su/sudo. Возможна отладка: надо запустить xroot в консоли с параметром debug, поэтому если какая-то программа ведет себя странно, то попытайтесь по возможности выяснить почему.
Более подробное описание: http://code.google.com/p/xroot/wiki/003
Необходимо составить и здесь написать список программ, которые запускаются удачно и список программ проблемных.
Также необходимо протестировать в различных DE (KDE, LXDE, Gnome и т.д.) и в различных дистрибутивах у кого какие установлены.

Просьба ко всем принять участие в тестировании, это очень несложно и с этим справится любой желающий.
Все замечания будут проанализированы и по возможности учтены.

#238330

romkaromka, исходные тексты доступны?

#238331
Lupo Alberto написал:
romkaromka, исходные тексты доступны?

Конечно, rpm- и deb- пакеты тоже можно собрать, в исходниках для этого всё есть, это всего лишь один исполняемый файл. Когда тесты пройдут успешно, то пакеты начну собирать.

#238332
romkaromka написал:
конечно

Увы, сразу не нашёл :o
Где именно?

#238333
Lupo Alberto написал:
в исходниках для этого всё есть, это всего лишь один исполняемый файл.

Вы меня либо не правильно поняли, либо делаете вид, что не поняли.
Исходные тексты этого исполняемого файла есть?

#238335

Где исходные тексты этого файла — _http://code.google.com/p/xroot/source/browse/trunk/xroot/xroot ?

#238337
romkaromka написал:
убрал его из svn.

...и что изменилось? В тарболах по-прежнему бинарный блоб без исходных текстов.
Тему закрываю, ваш аккаунт, если завтра, до 10 часов утра по московскому времени, не проясните мне ситуацию, будет заблокирован.

romkaromka в первое сообщение добавил ссылку на svn-репозиторий.
Сам я далёк от программирования, поэтому жду комментариев более сведущих в этом деле людей.

#238343

Получить бинарник из исходников просто:

1) установить пакеты fpc и fpc-src,
2) затем выполнить скрипт get_msegui_32_64,
3) затем выполнить скрипт build_xroot_without_gui_32 (или build_xroot_without_gui_64).

Для сборки rpm-пакетов есть xroot.spec, а для сборки deb-пакетов есть скрипт debian.compile.sh

#238389
text

procedure ttermfo.on_receive(const sender: TObject; var atext: AnsiString;
               const errorinput: Boolean);
//это событие возникает когда в терминал поступает новый текст
...
 if (system.pos('Password',atext) > 0) or (system.pos('password',atext) > 0) then
      begin
         termfo.term.writestrln(mainfo.password_str.value); //пишем в терминал пароль
      end;
...
 //команда не найдена
 if (system.pos('command not found',atext) > 0) or (system.pos('команда не найдена',atext) > 0) then 
      begin    

Во-1-ых, достаточно if system.pos('assword')>0 then
Во-2-ых, если делать несколько языков, то применённый подход в корне порочен. Анализируется сообщение от bash, так зачем проверять английский и только русский, если можно посмотреть на LANG, сходить в /usr/share/locale/xx_XX/LC_MESSAGES/bash.mo и посмотреть, как эта строка переведена для текущей локали (см. man 3 gettext).

Для поиска нужных исходных (английских) сообщений bash можно использовать
msgunfmt /usr/share/locale/ru/LC_MESSAGES/bash.mo | iconv -f koi8-r | less

Для сообщения "command not found" это "%s: command not found".
В моей текущей (русской) локали это (использована консольная команда gettext)
[console]$ gettext bash '%s: command not found'; echo
%s: команда не найдена[/console]

В 3-их, двуязычие в стиле:

text

message2ru='Команда для выполнения:';
message2en='Command for executing:';

не самый лучший вариант, если не самый худший. Есть же resourcestring и TranslateResourceStrings().

В 4-ых, "grep -R DISPLAY" по исходникам молчит как партизан, значит, скорее всего, вот этот трюк не используется, а зря:
http://wasen.net/index.php?option=com_content&view=article&id=57:su-and-x&catid=36:linuxserver-related&Itemid=54

#238403

Спасибо, за то, что посмотрели код и написали замечания.
1) Не достаточно, иначе будет реагировать на всякий чих-пых ассворд'ов, должно же реагировать только на пароль,
2) Естественно, xroot еще не совершенен, анализ сообщенией от bash будет улучшен с учетом вашего замечания,
3) У xroot будет только один единственный исполняемый файл, поэтому языки и их переводы будут прямо в коде, пока таких языков 2 - русский и английский, можно сколько угодно говорить, что так делать не принято (но так делают), но программист имеет право решить как лучше сделать в конкретном случае, мне нужен лишь один бинарник для моих же других проектов - в этом и есть смысл создания xroot только одним бинарником.
4) Объясните про это подробнее, чего конкретно в коде не так и как исправить.

#238411

1) Посмотрите ещё раз внимательно на условие:
содержит "Password" или содержит "password"

и на исходники su/sudo:
grep -R assword ./

Я не вижу там других слов, содержащих assword. Да и в англо-русском словаре тоже как-то не попадалось.

3) Вам решать. Только учтите, что unit GetText у вас уже используется (см. main.pas, Gettext.GetLanguageIDs()), почему бы не дать возможность кому-либо закинуть в
/usr/share/locale/его_ЛОКАЛЬ/LC_MESSAGES/
файлик xroot.mo с переводом вашей программы на свой язык, без каких-либо усилий с вашей стороны, кроме пары дополнительных вызовов. По-моему, плата совсем не велика.

4) Для su вижу ключ -p, т.е. XAUTHORITY и DISPLAY должны сохраняться от текущего пользователя.
Для sudo вижу обработку XAUTHORITY, но не вижу экспорта переменной DISPLAY. Если запустить ещё одни X-ы и позвать X-овое приложение через xroot, на каком DISPLAY будет его вывод? Если на правильном, то ложная тревога.
И ещё один момент про sudo, не знаю, возможно уже его рассматривали: при выполнении "sudo -s" также сохраняется окружение пользователя, включая переменные XAUTHORITY и DISPLAY (равноценно "su -p").

#238420

1) лучше перестраховаться,
3) сам переведу на любой язык - присылайте только переводы, там переводить-то нечего, всего несколько фраз, концепция xroot - это возможность работать без установки, а xroot.mo - это уже использование каким-то образом внешних файлов, хранящихся не там, где находится бинарный файл, поэтому следуя идеи о том, что xroot не должен зависеть ни от чего по максимуму, то пока так считаю правильным,
4) для sudo используется скрипт xsudo (просто это неявно сделано):
http://dev-loki.blogspot.com/2010/06/sudo-x-applications-on-opensuse.html
http://pkgs.org/search/?keyword=xsudo
http://linuxforum.ru/viewtopic.php?pid=110528#p110528
в нем DISPLAY не экспортируется, надеясь вроде как на sudoers, но проверьте на нескольких иксах, если есть ошибки, то вносить правку надо в скрипт xsudo в первую очередь.

#238517
bormant написал:

В моей текущей (русской) локали это (использована консольная команда gettext)
[console]$ gettext bash '%s: command not found'; echo
%s: команда не найдена[/console]

исправил в trunk

#238850

- воспользовался модулем gettext и беру теперь переводы из coreutils.mo, bash.mo, соответственно execprog теперь по всем правилам.
- учел возможность локализации на другие языки (добавил свой переводчик в код), двуязычие из кода убрал.
Проверяйте trunk где еще чего поправить.

#238912
romkaromka написал:
воспользовался модулем gettext и беру теперь переводы из coreutils.mo, bash.mo, соответственно execprog теперь по всем правилам.

Хочу предостеречь от следующего момента. Библиотечный C-шный dgettext() учитывает текущую локаль и конвертирует строки из локали .mo в локаль приложения. А в исходниках fpc-шного юнита gettext я подобного кода не увидел, может быть плохо смотрел.
В моей системе /usr/share/locale/ru/LC_MESSAGES/bash.mo в кодировке KOI8-R, консоль в ru_RU.UTF-8:
[console]
$ msgufmt /usr/share/locale/ru/LC_MESSAGES/bash.mo | grep "Content-Type"
"Content-Type: text/plain; charset=KOI8-R\n"
$ echo $LANG
ru_RU.UTF-8
[/console]

Тестовый код на C даёт строку в локали приложения:

text

#include <locale.h>
#include <libintl.h>
#include <stdio.h>
#define BASH_MSG "%s: command not found"
int main (int argc, char **argv) {
    setlocale(LC_ALL, "");
    printf("%s\n", dgettext("bash", BASH_MSG));
    return 0;
}

[console]
$ gcc testс.c -o testс
$ ./testс
%s: команда не найдена
$ ./testс | hexdump -C
00000000 25 73 3a 20 d0 ba d0 be d0 bc d0 b0 d0 bd d0 b4 |%s: ............|
00000010 d0 b0 20 d0 bd d0 b5 20 d0 bd d0 b0 d0 b9 d0 b4 |.. .... ........|
00000020 d0 b5 d0 bd d0 b0 0a |.......|
00000027
[/console]

Тестовый код для fpc даёт строку в локали .mo файла:

text

uses gettext;
const
  BASH_MO = '/usr/share/locale/ru/LC_MESSAGES/bash.mo';
  BASH_MSG = '%s: command not found';
var
  mof: TMOFile;
begin
  mof := TMOFile.Create(BASH_MO);
  WriteLn(mof.Translate(BASH_MSG));
  mof.Free;
end.

[console]
$ fpc testpp.pp
$ testpp | iconv -f koi8-r
%s: команда не найдена
$ testpp | hexdump -C
00000000 25 73 3a 20 cb cf cd c1 ce c4 c1 20 ce c5 20 ce |%s: ....... .. .|
00000010 c1 ca c4 c5 ce c1 0a |.......|
00000017
[/console]
Я не знаток fpc, возможно требуется какой-то вызов, аналогичный setlocale(), чтобы всё работало как задумано. Во всяком случае, проверьте, правильно ли у вас будет работать ваш код, использующий модуль gettext, когда локаль приложения и кодировка .mo отличаются.

#239010

Пока проблема с кодировкой всплыла в Mageia (и то только с bash.mo), но они и сами могли перемудрить, тестил в других дистрибутивах - нормально.

#239051

Скорее, код xroot в этой части "недомудрён" -- не содердит приведения прочитанной из .mo строки к локали приложения.
Как посмотреть кодировку .mo, писал выше.

Войдите или зарегистрируйтесь, чтобы ответить.