Перейти к контенту

[Fix] 2.0pb7 - Исправление ошибки с подпиской на комментарии


Рекомендуемые сообщения

Исправление ошибки с подпиской на комментарии.

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

 

 

1. В файле ./journal/journal.php найти и заменить функцию get_user_friends на следующую:

	// ---------------------------------------------------------
//
// cache user friends
//
// ---------------------------------------------------------

function get_user_friends()
{
	global $DB;

	if (!isset($this->_cache['u_friends']) || !is_array($this->_cache['u_friends']))
	{
		$this->_cache['u_friends'] = array();
		$this->_cache['u_enemy'] = array();

		$DB->query("SELECT i.friend_id as id, i.is_super_friend, i.is_friend, m.name
					FROM ibf_jfriends i
					LEFT JOIN ibf_jmembers m ON (m.id = i.friend_id)
					WHERE i.member_id='".$this->users['id']."'");

		while ($r = $DB->fetch_row())
		{
			if ($r['is_friend'])
			{
				$this->_cache['u_friends'][$r['id']] = array($r['name'],$r['is_super_friend']);
			}
			else
			{
				$this->_cache['u_enemy'][$r['id']] = array($r['name']);
			}

		}
	}
	return count($this->_cache['u_friends']);
}

 

2. В файле comment_new.php заменить функцию post_tracker на следующую:

	// --------------------------------
// post tracker
// --------------------------------
function post_tracker($pid='', $poster='', $last_post='', $post='')
{
	global $ibforums, $DB, $journal;

	if ($pid == '') return;

	// do not send if journal closed for all

	if ($journal->users['j_access'] == 0) return;

	// Loading email class

	require ROOT_PATH.'sources/classes/class_email.php';
	$this->email = new emailer();

	// make link for this comments

	$links = $journal->base_url.'user='.$journal->users['id'].'&comm='.$pid.'&view=last';

	// send to owner first (auto mail).
	//  Send ALL new comments
	$owner_id = 0;

	if (!$ibforums->member['is_j_owner'] and $journal->users['j_auto_mail'])
	{
		$DB->query("SELECT m.name, m.email, m.id, m.language, m.last_activity, p.title
					FROM ibf_jposts p
					LEFT JOIN ibf_members m ON (m.id=p.journal_id)
					WHERE p.pid='".$pid."'
					AND p.journal_id = '".$journal->users['id']."'");

		if ($DB->get_num_rows())
		{
			$r = $DB->fetch_row();
			$r['language'] = $r['language'] ? $r['language'] : 'en';

			$this->email->get_template('journal_owner', $r['language']);
			$this->email->build_message(array(
											'LINKS'		   => $links,
											'TITLE'		   => $r['title'],
											'NAME'			=> $r['name'],
											'POST'			=> $post,
											'POSTER'		  => $poster,
										  )	);
			$this->email->to	  = $r['email'];
			$this->email->send_mail();
		}
		$DB->free_result();
	}

	$journal->get_user_friends();
	$friends = array_keys($journal->_cache['u_friends']);
	$enemy   = array_keys($journal->_cache['u_enemy']);

	// send to all others

	$DB->query("SELECT tr.post_id, m.name, m.email, m.id, m.language, m.last_activity, p.title, p.closed
				FROM ibf_jtracker tr
				LEFT JOIN ibf_jposts p ON (p.pid=tr.post_id)
				LEFT JOIN ibf_members m ON (m.id=tr.member_id)
				WHERE tr.post_id='".$pid."'
				AND m.id <> '".$ibforums->member['id']."'
				AND m.last_activity > '".$last_post."'");

	if ($DB->get_num_rows())
	{
		while ( $r = $DB->fetch_row() )
		{
			// do not send to journal owner

			if ($r['id'] == $journal->users['id']) continue;

			// do not send to enemy

			if (in_array($r['id'],$enemy)) continue;

			// do not send if journal only to friends and track member is not friend

			if ($journal->users['j_access'] == 2 and !in_array($r['id'],$friends)) continue;

			// send closed post comments only to friends

			if ($r['closed'] == 1 and !in_array($r['id'],$friends)) continue;

			$r['language'] = $r['language'] ? $r['language'] : 'en';

			$this->email->get_template('journal_reply', $r['language']);
			$this->email->build_message(array(
											'LINKS'		   => $links,
											'JOURNAL'		 => $journal->users['name'],
											'TITLE'		   => $r['title'],
											'NAME'			=> $r['name'],
											'POST'			=> $post,
											'POSTER'		  => $poster,
										  ) );
			$this->email->to	  = $r['email'];
			$this->email->send_mail();
		}
	}
}

 

3. В файле dosetup.php заменить функцию add_tracker на следующую:

	// -----------------------------------
// add tracker
// -----------------------------------

function add_tracker()
{
		global $ibforums, $DB, $journal;

	if (!$ibforums->member['id'])
	{
		$journal->err_journal($ibforums->lang['j_err_hack']);
	}

		if (! preg_match( "/^(\d+)$/", $ibforums->input['id']))
	{
		$journal->err_journal($ibforums->lang['j_err_hack']);
	}

	// ---------------------------------------------
	// get post and journal access info
	// ---------------------------------------------

	$DB->query("SELECT p.journal_id, p.closed, m.j_access
				FROM ibf_jposts p
				LEFT JOIN ibf_jmembers m ON (m.id = p.journal_id)
				WHERE pid='".$ibforums->input['id']."'");

	$row = $DB->fetch_row();

	if (!$row['journal_id'])
	{
		$journal->err_journal($ibforums->lang['j_err_hack']);
	}

	// ---------------------------------------------
	// disable track enemy
	// ---------------------------------------------

	if (in_array($row['id'],$journal->_cache['enemy']))
	{
		$journal->err_journal($ibforums->lang['j_err_hack']);
	}

	// ---------------------------------------------
	// disable track closed posts
	// ---------------------------------------------

	$show_closed = 0;

	if (($ibforums->member['id'] == $row['journal_id']) or (in_array($row['journal_id'],$journal->_cache['ufriends'])))
	{
		$show_closed = 1;
	}

	if ($row['closed'] == 1 and $show_closed == 0)
	{
		$journal->err_journal($ibforums->lang['j_err_hack']);
	}

	// ---------------------------------------------
	// disable track closed journals
	// ---------------------------------------------

	$row['j_public'] = $row['j_access'] & 3;

	if ($row['j_public'] == 1 or $row['j_public'] == 3 or ($row['j_public'] == 2 and in_array($row['journal_id'],$journal->_cache['ufriends'])))
	{
		// ---------------------------------------------
		// Check allready tracked
		// ---------------------------------------------
		$DB->query("SELECT trid FROM ibf_jtracker WHERE post_id='".$ibforums->input['id']."' AND member_id='".$ibforums->member['id']."'");

		if (!$DB->get_num_rows())
		{
			// ---------------------------------------------
			// Add track
			// ---------------------------------------------

			$db_string = $DB->compile_db_insert_string(array(
														'member_id'  => $ibforums->member['id'],
														'post_id'   => $ibforums->input['id'],
														'start_date' => time(),
												  ));
			$DB->query("INSERT INTO ibf_jtracker (".$db_string['FIELD_NAMES'].") VALUES (".$db_string['FIELD_VALUES'].")");
		}

		$journal->redirect_screen( $ibforums->lang['j_redir_track'],$journal->base_url.'user='.$row['journal_id'].'&comm='.$ibforums->input['id']);
	}

	$journal->err_journal($ibforums->lang['j_err_hack']);
}

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...
Вопрос снят.

А что был за вопрос ?

 

Все-таки врагам приходят по подписке открытые записи.

Это он и есть ? Письма приходят при подписке на комментарии к записи или при подписке на дневник ?

Ссылка на комментарий
Поделиться на других сайтах

Это он и есть ? Письма приходят при подписке на комментарии к записи или при подписке на дневник ?
Да, это был он. Приходят письма при подписке на дневник. При условии, что он открыт и запись тоже открыта.
Ссылка на комментарий
Поделиться на других сайтах

Предлагаю еще 2 исправления.

 

1) теперь, после того, как urisoft сделал, чтобы в get_user_friends() формировался не только список друзей, но и врагов, можно в post_new.php, в ф-цию journal_tracker, после

$friends = array_keys($journal->_cache['u_friends']);

добавить

$enemies = array_keys($journal->_cache['u_enemy']);

а перед

$r['is_friend'] = (in_array($r['id'],$friends)) ? 1 : ($r['id'] == $journal->users['id'] ? 1 : 0);

добавить

if (in_array($r['id'], $enemies)) continue;

там же заменить

if (($journal->users['j_public'] == 1) or ($journal->users['j_public'] == 2 and $r['is_friend']))

на

if (($journal->users['j_public'] == 1) or ($journal->users['j_public'] == 3) or ($journal->users['j_public'] == 2 and $r['is_friend']))

не работала рассылка новых записей в дневниках, "закрытых от гостей". Или это уже кто-то исправлял?

 

2) в journal/journal.php в ф-ции get_access_query вот это

$q_extra = "m.j_access IN ('17', '19') OR (m.j_access = '18' AND m.id IN (".(implode(", ",$this->_cache['ufriends']))."))";

заменить на это

$q_extra = "(m.j_access IN ('17', '19') OR (m.j_access = '18' AND m.id IN (".(implode(", ",$this->_cache['ufriends'])).")))";

(добавить скобки) иначе получалось, что если журнал закрыт от гостей, но кто-то внесен во враги, то враг мог читать записи и комментарии через календарь и поиск. Это мелкий баг, т.к. враг всегда может зарегистрироваться заново и продолжать без помех читать "закрытый от гостей" дневник. Но непорядок :D

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

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

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.