Jump to content
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Доступ к закрытому форуму внешним модулем (подробно в тексте)

Моя версия IPB:3.1.4

 

Доброго времени суток.

 

Поиском я пользуюсь всегда, но вот для этой идеи даже поисковый запрос сложно придумать, одним словом - не нашел.

 

Собственно что требуется - открывать доступ к закрытому форуму внешним модулем.

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

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

 

Помогите пожалуйста написать модуль или найти готовое решение.

 

Как я себе это представляю:

На форуме имеется возможность ограничить доступ по паролю.

Хотелось бы что бы при попытке доступа пользователя в этот форум, до запроса пароля форум бы обращался к некому файлу (autopass.php), куда будет передаваться id того форума ($pass_forum_id), к которому пользователь хочет получить доступ. Файл в результате обработки запроса будет выдавать отказ ($auto_pass_ok=false) или разрешение ($auto_pass_ok=true) на доступ.

В результате, если доступ разрешон, то пользователь попадает в форум, минуя запрос пароля.

Если же доступ запрещен происходит запрос пароля или просто запрет на доступ (это уже как проще сделать).

 

Реализовать через выдачу пользователю пароля - не вариант, поскольку пароль быстро станет известен всем, а это полностью лишает идею смысла.

Через группы - очень сложно, поскольку это несколько десятков групп и несколько сотен пользователей, а доступ надо выдавать и запрещать регулярно, что может только админ.

 

Заранее благодарен.

Featured Replies

Сделайте его видимым только для определенной группы, при выполнения условий на сайте установите ее как дополнительную.

 

к которому пользователь хочет получить доступ. Файл в результате обработки запроса будет выдавать отказ ($auto_pass_ok=false) или разрешение ($auto_pass_ok=true) на доступ.

На каких оснований файл будет давать отказ или подтверждать доступ для конкретного пользователя?

Можете завести таблицу, записывать туда ид мемберов которые имеют доступ к форуму. При заходе в форуме смотрим нашу таблицу, если имеет доступ - пускаем, нет - просим оправить 20 руб на короткий номер смс.

То же самое что и группой. За то с ней не придется писать еще и хук для проверки доступа.

 

Через группы - очень сложно, поскольку это несколько десятков групп

Не важно сколько их, вы создаете только одну и устанавливайте как дополнительную.

  • Author
На каких оснований файл будет давать отказ или подтверждать

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

Можете завести таблицу, записывать туда ид мемберов которые имеют доступ к форуму

Примерно так, только форум не один, и соответственно в таблице указаны id пользователя и id форума.

 

Честно говоря не понял...

 

Вот есть форумы "Форум1"(id 1) и "Форум2" (id 2), я делаю группу "доступ", для которой создаю маску и прописываю этой группе доступ к этим двум форумам.

Сталю эту группу пользователям, как дополнительную.

 

А дальше?

 

Есть у меня 3 пользователя.

Есть таблица в которой записи, что

пользователь id 1 имеет доступ к форуму id 1

пользователь id 2 имеет доступ к форуму id 2

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

 

как реализовать

При заходе в форуме смотрим нашу таблицу, если имеет доступ - пускаем, нет...

 

Я не настолько разбираюсь в php и форуме :(

Сталю эту группу пользователям, как дополнительную.

А дальше?

А дальше то, что только пользователи с этой группой смогут просматривать форум выполнив определенные действия. Что и требуется по задаче.

 

Варианта два

- использовать доп. группу. Тогда форум сам будет проверять права при входе в соответствующий раздел на основе имеющихся групп.

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

 

Я не настолько разбираюсь в php и форуме

Боюсь в любом случае вам потребуются знания php.

Как реализовать я вам сказал, а написать за вас код и копаться в классах врядли кто-то будет.

  • Author

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

 

Честно - не понимаю.

Если в 2 разных форума доступ открыт всем, кто принадлежит к группе и у всех пользователей уже эта группа, как дополнительная, то что же мешает им заходить в эти форумы?

И как отличать в какие их пускать, а в какие нет?

Поясните пожалуйста идею.

 

Варианта два

- использовать доп. группу. Тогда форум сам будет проверять права при входе в соответствующий раздел на основе имеющихся групп.

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

 

Боюсь в любом случае вам потребуются знания php.

Как реализовать я вам сказал, а написать за вас код и копаться в классах врядли кто-то будет.

К сожалению так глубоко в скрипты форума я пока не смогу залезть.

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

 

Однако еще сам попробую.

 

Возможно сможете подсказать, кусок кода и куда его впихнуть, что бы при условии определенной группы начиналась проверка?

Саму проверку я уже написать смогу. Но вот как ее инициировать?

Гда находится скрипт, проверяющий права доступа и как в него вставить проверку дополнительных условий?

Если в 2 разных форума доступ открыт всем, кто принадлежит к группе и у всех пользователей уже эта группа, как дополнительная, то что же мешает им заходить в эти форумы?

Чтото вас не туда несет. Речь идет о закрытых форумах. О тех, доступ к которым нужно давать только избранным. Вот этим избранным и ставите группу, которая имеет право просматривать этот форум. Как же вы хотите реализовать, если свою задачу не можете понять до конца :)

 

Саму проверку я уже написать смогу. Но вот как ее инициировать?

Гда находится скрипт, проверяющий права доступа и как в него вставить проверку дополнительных условий?

Вот как ее инициировать эту проверку - вопрос, ответ на который уже есть решения половины задачи.

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

 

Для форумов можете посмотреть в этом файле

\admin\applications\forums\modules_public\forums\forums.php

  • Author

Чтото вас не туда несет. Речь идет о закрытых форумах. О тех, доступ к которым нужно давать только избранным. Вот этим избранным и ставите группу, которая имеет право просматривать этот форум. Как же вы хотите реализовать, если свою задачу не можете понять до конца :)

Возможно мы не понимаем друг друга.

У меня несколько десятков закрытых форумов и несколько сотен пользователей.

Но доступ к каждому форуму нужно выдавать отдельно.

Один должен получить доступ к одному из этих десятков форумов, другой к другому.

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

 

Вот как ее инициировать эту проверку - вопрос, ответ на который уже есть решения половины задачи.

Я бы даже сказал, что это больше половины и вообще основная проблема. :)

 

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

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

 

Для форумов можете посмотреть в этом файле

\admin\applications\forums\modules_public\forums\forums.php

Пойду копать...

 

А для тем?

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

Создайте несколько десяток групп.

  • Author

Создаете несколько десяток групп.

 

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

 

Вообще я уже подумал, что если по второму варианту не получится сделать - напишу скрипт, пусть лезет в таблицу пользователей форума и добавляет/убирает дополнительные группы.

С этим я справлюсь :)

 

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

 

В любом случае готовое решение выложу тут, вдруг еще кому пригодится...

 

Подскажите, а в какой таблице форум хранит список групп?

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

Можно не делать отдельную таблицу, а создать еще одно поле в ibf_members (скажем access_from_site), тогда не придется делать доп запрос, и все данные будут под рукой в memberData.

Присмотреться к методу forumsCheckAccess (\admin\applications\forums\sources\classes\forums\class_forums.php) - он проверят доступы, из него можно будет следить сразу и за форумами, и за топиками. Этот метод кстати можно захукать.

Создать настройку с id форумов, для которых нужно проверять доступ по нашему полю из ibf_memebrs

 

добавить в коде, ниже $fid = intval( $fid ); $deny_access = 1;

	if( ( $in == 'topic' OR $in == 'forum' ) AND in_array( $fid, explode( ',', $this->settings['access_forums_id'] ) ) )
	{
		$access_id = explode( ',', $this->memberData['access_from_site'] );
		if( ! in_array( $fid, $access_id ) )
		{
			$this->registry->output->showError('Извините, но вы не имеете доступа к этому разделу.');
		}
	}

 

$this->settings['access_forums_id'] - id форумов для инициализации проверки.

$this->memberData['access_from_site'] - id форумов к которым данный пользователи имеет доступ.

 

Ну и остается написать интерфейс для управлением пользователей с этим поле.

  • Author

Пол ночи ломал мозг, но до конца понять не смог.

 

ниже $fid = intval( $fid ); $deny_access = 1;

если я правильно понял это 661 строка

 

Во первых как создается эта "настройка", но с другой стороны понял, что $this->settings['access_forums_id'] - это список id форумов, с которыми работает этот модуль и данные туда я вполне могу подсунуть переменной.

 

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

Выдает другое сообщение о запрете доступа (то же, что и без этого модуля).

 

Пробовал добавить else

if( ! in_array( $fid, $access_id ) ) 
                       { 
                               $this->registry->output->showError('Извините, но вы не имеете доступа к этому разделу.'); 
                       }
else
{
 $deny_access = 0;
}

Не помогло, результат тот же.

 

Или нужно следующий в коде if переделать в elseif, что бы он не выполнялся после этого кода?

 

Помогите пожалуйста разобраться.

Edited by Bard

  • Author

Кажется разобрался.

 

Попробовал сделать elseif( $this->registry->permissions->check( 'view', $this->forum_by_id[$fid] ) == TRUE )

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

 

Так что несколько испровил блок ( $this->registry->permissions->check( 'view', $this->forum_by_id[$fid] ) == TRUE )

Для отладки вставил переменные (потом исправлю)

$bardtest=$this->settings['access_forums_id']

$bardtest2=$this->memberData['access_from_site']

Результат редактирования (насколько правильно)?

 

 

if ( $this->registry->permissions->check( 'view', $this->forum_by_id[$fid] ) == TRUE )
	{
		if ( $this->registry->permissions->check( 'read', $this->forum_by_id[$fid] ) == TRUE )
		{
			$deny_access = 0;
		}
		else
		{
			//-----------------------------------------
			// Can see topics?
			//-----------------------------------------

			if ( $this->forum_by_id[$fid]['permission_showtopic'] )
			{
				$this->read_topic_only = 1;

				if ( $in == 'forum' )
				{
					$deny_access = 0;
				}
				else
				{
					if( $return )
					{
						return false;
					}

					if( ($in=='topic' OR $in=='forum') AND in_array ($fid, explode( ',', $bardtest) ) )
					{
						$access_id=explode( ',', $bardtest2 );
						if ( ! in_array( $fid, $access_id ) )
						{
							$this->registry->output->showError('oblom');
						}
						else
						{
							$deny_access = 0;
						}
					}
					else
					{

						$this->forumsCustomError( $fid );

						$deny_access = 1;						
					}
				}	
			}
			else
			{
				if( $return )
				{
					return false;
				}

				if( ($in=='topic' OR $in=='forum') AND in_array ($fid, explode( ',', $bardtest) ) )
				{
					$access_id=explode( ',', $bardtest2 );
					if ( ! in_array( $fid, $access_id ) )
					{
						$this->registry->output->showError('oblom');
					}
					else
					{
						$deny_access = 0;
					}
				}
				else
				{

					$this->forumsCustomError( $fid );

					$deny_access = 1;
				}
			}
		}
	}
	else
	{
		if( $return )
		{
			return false;
		}

		if( ($in=='topic' OR $in=='forum') AND in_array ($fid, explode( ',', $bardtest) ) )
		{
			$access_id=explode( ',', $bardtest2 );
			if ( ! in_array( $fid, $access_id ) )
			{
				$this->registry->output->showError('oblom');
			}
			else
			{
				$deny_access = 0;
			}
		}
		else
		{
			$this->forumsCustomError( $fid );

			$deny_access = 1;
		}
	}

 

 

Проверил, вроде бы работает...

 

Теперь вопрос: где производится проверка прав на создание тем, ответы в темах, скачивание и загрузку файлов?

Во первых как создается эта "настройка"

В админцентре создается :)

 

но вот если доступ открыт - не получается.

Работайте надо логикой этого условия

if( ( $in == 'topic' OR $in == 'forum' ) AND in_array( $fid, explode( ',', $this->settings['access_forums_id'] ) )

'access_forums_id' - должна быть строка ид форумов через запятую, для которых будет проверятся наш доступ (уже в десятый раз пишу). Вы говорили что справитесь, а все равно приходится разжевывать даже простой блок if.

Результат редактирования (насколько правильно)?

Говно-код. :)

Зря вы встряли в логику, еще больше запутайтесь, работать надо было там где я вам показывал.

  • Author

Работайте надо логикой этого условия

Понял, вставлю исключение нужных групп.

 

'access_forums_id' - должна быть строка ид форумов через запятую, для которых будет проверятся наш доступ (уже в десятый раз пишу). Вы говорили что справитесь, а все равно приходится разжевывать даже простой блок if.

Так это понятно, я так и даю ему список id форумов через запятую, к этому как раз вопросов у меня нет.

  • Author

Благодаря Вашей наводке кажется смог решить задачу.

 

Нашел в том же файле чуть ниже обработку запароленного форума.

Ниже строчки // Do we have permission to even see the password page?

 

if ( $deny_access == 0 )
	{
		$group_exempt = 0;

		if ( isset( $this->forum_by_id[$fid]['password'] ) AND $this->forum_by_id[$fid]['password'] AND $this->forum_by_id[$fid]['sub_can_post'] )
		{
			if ( isset( $this->forum_by_id[$fid]['password_override'] ) && IPSText::cleanPermString($this->forum_by_id[$fid]['password_override']) != '' )
			{
				if ( IPSMember::isInGroup( $this->memberData, explode( ",", IPSText::cleanPermString($this->forum_by_id[$fid]['password_override']) ) ) )
				{
					$group_exempt = 1;
					$deny_access = 0;
				}
			}

			if ( $group_exempt == 0 )
			{
				if ( $this->forumsComparePassword( $fid ) == TRUE )
				{
					$deny_access = 0;
				}
				else
				{
					$deny_access = 1;

                                               if ($site_access==1)
					{
						$deny_access = 0;
					}
					else
					{
					   if ( $prompt_login == 1 )
					   {
						if( $return )
						{
							return false;
						}

						$this->forumsShowLogin( $fid );
					   }
                                               } 
				}
			}
		}
	}

$site_access - имеет значение 1 или 0, эту переменную получаю отельным скриптом, который определяет имеет ли пользователь доступ к форуму.

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

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.