urisoft Опубликовано 13 Июля 2007 Жалоба Поделиться Опубликовано 13 Июля 2007 Исправление ошибки с подпиской на комментарии.При определенных условиях можно было подписаться на комментарии к закрытым записям, а так же к комментариям в дневниках где вы в списке врагов. 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']); } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Allure Опубликовано 27 Июля 2007 Жалоба Поделиться Опубликовано 27 Июля 2007 Вопрос снят. Ой, нет, не снят. Все-таки врагам приходят по подписке открытые записи. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
urisoft Опубликовано 29 Июля 2007 Автор Жалоба Поделиться Опубликовано 29 Июля 2007 Вопрос снят.А что был за вопрос ? Все-таки врагам приходят по подписке открытые записи.Это он и есть ? Письма приходят при подписке на комментарии к записи или при подписке на дневник ? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Полковник Опубликовано 29 Июля 2007 Жалоба Поделиться Опубликовано 29 Июля 2007 urisoft Скажите пожалуйста, это исправление в дистрибутиве тоже сделано? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Allure Опубликовано 29 Июля 2007 Жалоба Поделиться Опубликовано 29 Июля 2007 Это он и есть ? Письма приходят при подписке на комментарии к записи или при подписке на дневник ?Да, это был он. Приходят письма при подписке на дневник. При условии, что он открыт и запись тоже открыта. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
l-k Опубликовано 30 Июля 2007 Жалоба Поделиться Опубликовано 30 Июля 2007 Предлагаю еще 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'])).")))"; (добавить скобки) иначе получалось, что если журнал закрыт от гостей, но кто-то внесен во враги, то враг мог читать записи и комментарии через календарь и поиск. Это мелкий баг, т.к. враг всегда может зарегистрироваться заново и продолжать без помех читать "закрытый от гостей" дневник. Но непорядок Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.