Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Расширения - это просто!

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 2 месяца
Благодарил (а): 7 раз

Re: Расширения - это просто!

Сообщение UncleAndy »

Охо-хо... Пытаюсь как-то запретить пользователю лезть в изменение пароля. Ресет пароля запретил через глобальный конфиг.

Но теперь другая проблема. Мне надо как-то запретить изменение пароля в профиле пользователя. Насколько я понял, это изменение регулируется только правами пользователя. Есть-ли какая-то возможность где-то перехватить управление и задать жесткие права?

Ну и параллельно вопрос - можно-ли разрешить пользователю изменение своего логина без ввода пароля? В шаблоне профиля я что-то не вижу что-бы это можно было регулировать. :(
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16375
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1746 раз

Re: Расширения - это просто!

Сообщение rxu »

UncleAndy писал(а):это изменение регулируется только правами пользователя. Есть-ли какая-то возможность где-то перехватить управление и задать жесткие права?
Недопонял... права задаются в админке, запретите изменение пароля, и всё. Жестче некуда.
UncleAndy писал(а):можно-ли разрешить пользователю изменение своего логина без ввода пароля
Нет, и без правки ядра это сделать не получится.
2PiK писал(а):в /includes/message_parser.php есть событие modify_bbcode_init для добавления/модификации бб-кодов, нужно добавить бб-код, но в качестве замены используется не код, а функция из расширения, так естественно не работает:

Код: Выделить всё

			'mybbcode'				=> array('bbcode_id' => id,	'regexp' => array('#\[mybbcode\](.*?)\[/mybbcode\]#uise' => "\$this->bbcode_mybbcode('\$1')")),

Код: Выделить всё

Fatal error: Call to undefined method parse_message::bbcode_mybbcode()
как использовать функцию из расширения?
К сожалению, пока не нашел способа передать туда указатель на текущий экземпляр объекта слушателя, т.к. это строка. Похоже, надо вносить изменения в function parse_bbcode() путем добавления $phpbb_container в global, тогда в расширении будет возможен вызов типа

Код: Выделить всё

$bbcodes = array_merge($bbcodes, array('mybbcode'	=> array('bbcode_id' => id,	'regexp' => array('#\[mybbcode\](.*?)\[/mybbcode\]#uise' => "\$phpbb_container->get('sheer.callsign.listener')->bbcode_mybbcode('\$1')"))));
Добавлено спустя 24 минуты:
2PiK
https://tracker.phpbb.com/browse/PHPBB3-13648
Изображение
2PiK
phpBB 1.4.2
Сообщения: 69
Стаж: 15 лет 8 месяцев
Благодарил (а): 10 раз
Поблагодарили: 2 раза

Re: Расширения - это просто!

Сообщение 2PiK »

Спасибо (за запрос на github особенно), остаётся ещё одна проблема, в ту функцию теперь нужно передать bbcode_uid :roll:

Код: Выделить всё

 Undefined property: author/extname/event/listener::$bbcode_uid
Последний раз редактировалось 2PiK 23.02.2015 17:47, всего редактировалось 1 раз.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16375
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1746 раз

Re: Расширения - это просто!

Сообщение rxu »

uid же привязан уже к конкретному посту? Тогда через экземпляр самого класса parse_message()?
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 2 месяца
Благодарил (а): 7 раз

Re: Расширения - это просто!

Сообщение UncleAndy »

rxu писал(а):
UncleAndy писал(а):это изменение регулируется только правами пользователя. Есть-ли какая-то возможность где-то перехватить управление и задать жесткие права?
Недопонял... права задаются в админке, запретите изменение пароля, и всё. Жестче некуда.
В глобальном конфиге есть только allow_password_reset. Но это немного другое, как я понял. Судя по исходному коду за изменение пароля отвечают именно права конкретного пользователя. Поэтому глобально это не запретишь, насколько я понял. Или я понял неправильно?
rxu писал(а):
UncleAndy писал(а):можно-ли разрешить пользователю изменение своего логина без ввода пароля
Нет, и без правки ядра это сделать не получится.
Жаль. Я надеялся что не придется лезть в код ядра. :(

В принципе, я мог-бы использовать и другую модель авторизации - что-бы была и возможность авторизации с паролем, и через QR-код. Но тут возникает вопрос - как передать в функцию login() auth-провайдера дополнительные данные из формы? Насколько я понимаю, в инициализаторе можно сохранить переменную класса \phpbb\request\request. Из нее возможно извлечь параметры запроса?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16375
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1746 раз

Re: Расширения - это просто!

Сообщение rxu »

UncleAndy писал(а):Поэтому глобально это не запретишь, насколько я понял. Или я понял неправильно?
allow_password_reset - это глобальная настройка опции восстановления пароля. Локально изменение пароля можно запретить отдельным пользователям или группам, есть право u_chgpasswd - Может менять пароль.
UncleAndy писал(а):ак передать в функцию login() auth-провайдера дополнительные данные из формы?
UncleAndy писал(а):в инициализаторе можно сохранить переменную класса \phpbb\request\request
Практически так, для примера можете посмотреть \phpbb\auth\provider\apache.php. Сервис @request просто передается в конструктор стандартным способом, и через экземпляр этого класса можно получить любые переменные из формы.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 2 месяца
Благодарил (а): 7 раз

Re: Расширения - это просто!

Сообщение UncleAndy »

rxu писал(а):Локально изменение пароля можно запретить отдельным пользователям или группам, есть право u_chgpasswd - Может менять пароль.
Т.е. сделать такой запрет перманентным через расширение не получится?
2PiK
phpBB 1.4.2
Сообщения: 69
Стаж: 15 лет 8 месяцев
Благодарил (а): 10 раз
Поблагодарили: 2 раза

Re: Расширения - это просто!

Сообщение 2PiK »

rxu писал(а):uid же привязан уже к конкретному посту?
т.е.?, не понял вопроса, для примера, в message_parser.php

Код: Выделить всё

 			'quote'			=> array('bbcode_id' => 0,	'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#uise' => "\$this->bbcode_quote('\$0')")),
в bbcode_quote() используется $this->bbcode_uid, вот он нужен и в функции.
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 2 месяца
Благодарил (а): 7 раз

Re: Расширения - это просто!

Сообщение UncleAndy »

Так... Тогда еще вот такой вопрос... А в auth-провайдере возможно использовать код из другого (заранее известного) auth-провайдера? Что-бы мне, например, совместить авторизацию Db и свой метод, но не дублировать код.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16375
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1746 раз

Re: Расширения - это просто!

Сообщение rxu »

2PiK писал(а):в bbcode_quote() используется $this->bbcode_uid, вот он нужен и в функции.
Можно взять через событие core.message_parser_check_message.

Добавлено спустя 24 минуты 13 секунд:
UncleAndy писал(а):Т.е. сделать такой запрет перманентным через расширение не получится?
Можно в миграции при установке расширения задать право доступа, а при удалении расширения возвращать его на место.
UncleAndy писал(а): совместить авторизацию Db и свой метод, но не дублировать код.
Плохо себе это представляю, но в теории можно воткнуть в свой провайдер сервис другого провайдера (например, @auth.provider.db), и использовать его методы вместе со своими.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 2 месяца
Благодарил (а): 7 раз

Re: Расширения - это просто!

Сообщение UncleAndy »

rxu писал(а):но в теории можно воткнуть в свой провайдер сервис другого провайдера (например, @auth.provider.db), и использовать его методы вместе со своими.
По идее, можно-же использовать наследование? Своего провайдера сделать наследником от Db.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16375
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1746 раз

Re: Расширения - это просто!

Сообщение rxu »

UncleAndy писал(а):По идее, можно-же использовать наследование
Думаю, не проблема.

Добавлено спустя 1 час 8 минут 15 секунд:
2PiK
Реализовал немного по-другому https://github.com/phpbb/phpbb/pull/3435
Изображение
2PiK
phpBB 1.4.2
Сообщения: 69
Стаж: 15 лет 8 месяцев
Благодарил (а): 10 раз
Поблагодарили: 2 раза

Re: Расширения - это просто!

Сообщение 2PiK »

rxu писал(а):Можно взять через событие core.message_parser_check_message.
точно, я всё "в лоб" пытаюсь решить.
rxu писал(а):Реализовал немного по-другому
там ещё один момент, /includes/bbcode.php, событие bbcode_cache_init_end, аналогично, можно использовать и код и функцию:

Код: Выделить всё

							'#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#'	=> "\$1",

Код: Выделить всё

							'#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#ise'	=> "\$this->bbcode_second_pass_quote('\$1', '\$2')"
пользовательская функция опять работать не будет, если через $phpbb_container решать, то нужно добавить его в bbcode_second_pass, возможно как-то по другому сделают (поднимите если не сложно вопрос на github'e)
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16375
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1746 раз

Re: Расширения - это просто!

Сообщение rxu »

2PiK писал(а):там ещё один момент, /includes/bbcode.php, событие bbcode_cache_init_end, аналогично, можно использовать и код и функцию:
Согласен. Позже отправлю PR.
2PiK писал(а): если через $phpbb_container решать, то нужно добавить его в bbcode_second_pass, возможно как-то по другому сделают
Так же, как и в предыдущем случае, через отдельный метод, аналогичный validate_bbcode_by_extension() https://github.com/phpbb/phpbb/pull/3435 (см. комментарии на предмет использования).
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 2 месяца
Благодарил (а): 7 раз

Re: Расширения - это просто!

Сообщение UncleAndy »

Хочу поблагодарить всех за помощь. К сожалению, текущих возможностей PHPBB по расширению не хватает для моих целей. А лезть в исходники ядра не хочется. Тем не менее, текущие наработки на PHP пригодятся в дальнейшем. Если кому-то интересно, вот тут текущее состояние исходников расширения. В текущем состоянии работает авторегистрация и автологин по QR-коду. Но дальше доделать уже не получается - не вижу штатных возможностей для этого. Если кто-то заинтересуется продолжением работы над расширением или форком, буду рад помочь.

Вернуться в «Для разработчиков»