LINUX.ORG.RU

Ограничить доступ программы к каталогам

 , , , ,


0

1

Доброго вам всего, дорогие форумчане.

Я тружусь над разработкой встроенной системы на основе Raspberry3B+ под Raspbian Stretch (самая свежая, upgrade буквально пару недель как). Архитектура системы такая: к малинке подключен 11" hdmi-тачскрин и контроллер периферии собственной разработки, управляющий целым гаремом всякого оборудования и датчиков. Всё это богатство работает в режиме киоска: пока система грузится, дисплей выключен, и включает его основное приложение, запускающееся в фуллскрине. И обратно, когда даётся команда на выход, приложение показывает прощальный экран, после чего гасит дисплей, и уже потом система выгружается и выключается. Таким образом, конечный пользователь не видит ничего, кроме интерфейса основного приложения и никакой возможности его свернуть или закрыть без выгрузки системы, нет. Так ему и надо!

И всё было бы чики-поки, если б не один нюанс: у юзера должна быть возможность открывать файло с флэшки. А диалог выбора файлов, хоть и открывается по умолчанию в каталоге /media/pi, всё же позволяет гулять юзеру по всей ФС, что совсем не надо!

Т.к. приложение активно манипулирует железом и сетью, оно работает из-под sudo, что усложняет ситуацию.

А теперь, внимание, вопрос знатокам! Как ограничить возможность браузинга и выбора файлов только съёмным носителем?

Пишу под Qt5.7.1 (не уверен, что это имеет значение - чую, что вопрос решается административными методами).

Буду признателен за любые идеи.


Ответ на: комментарий от conalex

Хм... Идея рабочая, хоть и выглядит немного костылевато. плюсы: системонезависимость, относительная простота. минусы: выглядеть будет «дёргано» - вроде как перешёл в каталог, но тут же выпрыгнул (как будто глюк).

Если других идей не будет, то так и сделаю, спасибо!

MadKid
() автор топика

Хэлпером. Напишите приложение которое после запуска делает chroot, показывает юзеру диалог и в случае выбора файла выдает его имя на stdout, и вызывайте его через pipe. Проблему надо решать в принципе, а не костылями фреймворка

Nastishka ★★★★★
()
Ответ на: комментарий от MadKid

ну, если только свой диалог написать. сделать exteded calss от QFileDialog.

https://stackoverflow.com/questions/12169878/limit-directory-traversal-in-qfi....

а. забыл еще вот про это - QSortFilterProxyModel.

можно назначить диалогу модель с прокси и там фильтроваться. но qt давненько уже не тыкал, могу чето путать.

conalex ★★★
()
Последнее исправление: conalex (всего исправлений: 1)
Ответ на: комментарий от Nastishka

используем кроссплатформенный фрейморк, делаем chroot, решаем проблему в принципе.

ну чо, норм. главное, некостыльно совсем.

conalex ★★★
()
Ответ на: комментарий от Nastishka

Идея понятна, но

к своему стыду, так и не победил работу с пайпами... Уже возникал прецедент, требующий их использования (приложение запускает аж несколько дочерних процессов). Но сколько я не бился, выхлопа на «своём» конце пайпа так и не получил. Тогда я просто использовал QProcess::waitForReadyRead и оно работает (и то, как-то странно).

В принципе, и сейчас можно пойти этим путём, по крайней мере юзабилити и эстетика у такого решения выше, чем у варианта с проверкой по сигналу directoryEntered.

Единственное «но» - тормозить будет (покаааа там запустится, покааа выхлоп долетит). И ещё один момент: приложение-то в фуллскрине, оно сторонний процесс пустит поверх себя?

MadKid
() автор топика

Т.к. приложение активно манипулирует железом и сетью, оно работает из-под sudo, что усложняет ситуацию.

Не осилили нормальную архитектуру с разделением прав, теперь хотите ещё костылей?

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Конечно, не хочу я костылей,

но на данный момент приходится выкручиваться. Когда я начинал этот проект, я линукса в глаза не видел, и вообще ничего о нём не знал... Всё изучал на лету, решал вопросы по мере их возникновения.

Сейчас-то конечно, я вижу, что архитектура вышла корявая, нерациональная, прямо скажем ламерская. Но несмотря на это, даже сейчас я не очень хорошо представляю себе, как её правильно перестроить: во-первых времени на это уже нет, во-вторых, линукс настолько стихиен, хаотичен и непредсказуем, что метод тыка составляет процентов 90 от всей работы... Многие совершенно простые вещи делаются через ж, а некоторые вообще без наставлений живого линуксоида самому не разрюхать. Всякие мануалы и прочая литература зачастую - лишь туманные наводки, ничего не гарантирующие. Как говорят биологи, видовая изменчивость и мутабельность очень высоки. Я, прямо скажем, не в восторге от последнего обстоятельства, но наверное со временем привыкну и освоюсь ))

MadKid
() автор топика
Ответ на: комментарий от slovazap

Ну и конечно же,

если уж критикуете, то и предлагайте или советуйте. По крайней мере, дайте стратегическую наводку. Растолкуйте, как правильно строить «нормальную архитектуру»? А то как-то странно получается - вместо помощи мне приходится оправдываться...

MadKid
() автор топика

Почему ещё не предложили контейнер?

приложение активно манипулирует железом и сетью, оно работает из-под sudo

Плохо. Ограничиться capabilities не вариант?

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Опять ребус.

В отгадайку играть будем? Английский я знаю, но это не добавляет ни байта информативности вашему сообщению.

Что плохо, почему плохо? О каких именно capabilities, и о capabilities чего именно идёт речь? Что за контейнер?

Не предложили, видимо, потому что кроме Вас, ни у кого квалификации и опыта не хватило...

MadKid
() автор топика
Ответ на: Конечно, не хочу я костылей, от MadKid

линукс настолько стихиен, хаотичен и непредсказуем, что метод тыка составляет процентов 90 от всей работы.

Это ты про винду сейчас написал. Давно мне сказал один программист перешедший на линукс: «это просто отрада, читаешь документацию, делаешь, работает, в отличие от винды, где доку хер поймешь и без поиска примеров и личных тестов ничего не работает»

По прошествии Н кол-ва лет я с ним полностью согласился.

futurama ★★★★★
()

сделать два приложения. Одно будет работать из-под sudo, а другое будет работать из-под пользователя, позволять выбирать файлы, и передавать выбор в основное приложение.

Einstok_Fair ★★☆
()

Первый ответ из поисковика

You can detect when the current directory changes and if it is beyond your limit,
set the directory back to the limit directory.

You can do this by executing the dialog non-blocking, and connecting the 
  QFileDialog::directoryEntered(const QString& directory)
signal to a slot of your own where you can do the checking.
If it fails your check, set the current directory to the limit directory by 
  QFileDialog::setDirectory(const QString& directory).

проверяй!

futurama ★★★★★
()
Ответ на: Конечно, не хочу я костылей, от MadKid

Сейчас-то конечно, я вижу, что архитектура вышла корявая, нерациональная, прямо скажем ламерская. Но несмотря на это, даже сейчас я не очень хорошо представляю себе, как её правильно перестроить

Например, разделить на задник, работающий с привилегиями с железом, и морденфейс, отдающий команды.

линукс настолько стихиен, хаотичен и непредсказуем, что метод тыка составляет процентов 90 от всей работы... Многие совершенно простые вещи делаются через ж

Кто допустил до разработки искалеченного вантузнёй мутанта-зомби?

anonymous
()
Ответ на: Опять ребус. от MadKid

Какой ещё ребус? Мне казалось, что про linux capabilities разработчик под линукс хотя бы слышал. Если нет - то это то, что позволяет дать программе нужные полномочия, при этом не запуская её от рута.

gasinvein ★★★
()
Ответ на: комментарий от gasinvein

Спасибо за наводку, это и правда мощный инструмент.

Хочу только уточнить - я вовсе не разработчик под линукс )), не надо меня так называть. Строго говоря, я даже не программист, а инженер-схемотехник.

Проект, который я сейчас заканчиваю - это мой дебют (как программиста), в котором я только и познакомился с linux и qt. Именно поэтому я на этом форуме задаю вопросы, а не отвечаю на них. С нулевыми знаниями об устройстве системы, без наставника и в дефиците времени, да на гуглотяге, сделать всё рационально и красиво с наскока - невозможно. Поэтому моя приложуха сейчас больше напоминает франкенштейна, чем эйфелеву башню )). Но тем не менее, она работает хорошо.

К сожалению, перестраивать архитектуру сейчас - нереально. Я и так потратил на код 9 месяцев вместо заложенных 3. Заказчик молодец, всё понимает, но и его терпение не резиновое.

Но вот сейчас я сдам этап, и у меня появится время детально изучить систему. Надеюсь, года мне хватит, и в новой версии (на которую уже пишем тз) учесть то, что не учтено в версии настоящей, причесать код и тд..

Короче, всем спасибо! Думаю, я тут далеко не последний раз, ну а пока что тему закрываю.

MadKid
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.