Jump to content

Налик

Пользователи

Everything posted by Налик

  1. SlawkA поставил требование сложного пароля, одобрение поста в случаях когда в нем встречаются ссылки на внешний сайт, одобрение первых 3х постов. Проблему сейчас это не решит, но надеюсь в будущем это исправит ситуацию. Еще были мысли для группы пользователей требовать прохождение каптчи при написании первых 3х постов, но увы такого нету. Ну и сброс пароля, такого тоже увы нету.
  2. С одной. У меня всего 1 группа: "Пользователи" + добавляется дополнительная после некоторых фильтров "Активные пользователи" И еще вопрос, можно ли у пользователя потребовать смену пароля? Ну то есть вот я вижу, что с этого IP было 39 авторизаций. Блокировать людей нельзя, это как бы не правильно, адекватным решением было бы сбросить им пароль и не пускать на форум пока они его не изменят.
  3. Всем привет! Вопрос к знатокам. На форуме постоянно появляется спам от аккаунтов зарегистрированных людьми. Я точно уверен, что аккаунт зарегистрирован человеком. Я вижу, что он проявлял активность на форуме. Но потом с его аккаунта начался спам. И таких случаев много. Я захожу в историю IP пользователя и вижу, что он регистрировался с одного IP, но спам шел с другого IP. История авторизаций этого IP подтверждает мою теорию. Вероятно взлом, но этих аккаунтов множество. Что делать в такой ситуации? И тут вопрос логический. Это взлом почты пользователя или взлом именно аккаунта пользователя на форуме. И как от этого защитится..
  4. В общем приходится в функции mergeAndSend заменять содержимое переменной $htmlContent. Решение очень корявое, но я не знаток IPS. Нашел - написал костыль
  5. Пока нашел окончательный вид сообщения в этом файле /forum/system/Email/Email.php, функция /** * Merge and Send * * @param array $recipients Array where the keys are the email addresses to send to and the values are an array of variables to replace * @param mixed $fromEmail The email address to send from. If NULL, default setting is used. NOTE: This should always be a site-controlled domin. Some services like Sparkpost require the domain to be validated. * @param mixed $fromName The name the email should appear from. If NULL, default setting is used * @param array $additionalHeaders Additional headers to send. Merge tags can be used like in content. * @param \IPS\Lang $language The language the email content should be in * @return int Number of successful sends */ public function mergeAndSend( $recipients, $fromEmail = NULL, $fromName = NULL, $additionalHeaders = array(), \IPS\Lang $language ) { $return = 0; /* Get the current locale, and then set the language's locale so datetime formatting in templates is correct for this language */ $currentLocale = setlocale( LC_ALL, '0' ); $language->setLocale(); foreach ( $recipients as $address => $vars ) { $member = \IPS\Member::load( $address, 'email' ); $subject = $this->compileSubject( $member, $language ); $htmlContent = $this->compileContent( 'html', $member, $language ); $plaintextContent = $this->compileContent( 'plaintext', $member, $language ); $_additionalHeaders = $additionalHeaders; foreach ( $vars as $k => $v ) { $language->parseEmail( $v ); $htmlContent = str_replace( "*|{$k}|*", $v, $htmlContent ); $plaintextContent = str_replace( "*|{$k}|*", $v, $plaintextContent ); $subject = str_replace( "*|{$k}|*", $v, $subject ); foreach ( $_additionalHeaders as $headerKey => $headerValue ) { $_additionalHeaders[ $headerKey ] = str_replace( "*|{$k}|*", $v, $headerValue ); } } if ( static::buildFromContent( $subject, $htmlContent, $plaintextContent, $this->type, FALSE )->send( $address, array(), array(), $fromEmail, $fromName, $_additionalHeaders ) ) { $return++; } } /* Now restore the locale we started with */ \IPS\Lang::restoreLocale( $currentLocale ); return $return; } Но пока еще не разобрался как формируется $htmlContent, в каком месте берется само сообщение.
  6. Я создал тему в которой написал сообщение "wwwwwwwwwww". Потом я ответил в этой же теме, так же написал сообщение "wwwwwwwwwww". /system/Notification/Notification.php /** * Send emails * * @param array $emails Emails to send * @param array $emailRecipients Email recipients * @return void */ protected function sendEmails( $emails, $emailRecipients ) { //Лог $text = print_r($emails,true); $text = date("d.m.Y H:i:s").' '.$_SERVER['REMOTE_ADDR'].' '.$text.PHP_EOL.PHP_EOL; if (!file_exists($_SERVER['DOCUMENT_ROOT']."/forum/error/")) { mkdir($_SERVER['DOCUMENT_ROOT']."/forum/error/", 0777, true); } file_put_contents($_SERVER['DOCUMENT_ROOT']."/forum/error/logs.txt", $text, FILE_APPEND); foreach ( $emails as $languageId => $email ) { if ( !empty( $emailRecipients[ $languageId ] ) ) { $email->mergeAndSend( $emailRecipients[ $languageId ], NULL, NULL, array(), \IPS\Lang::load( $languageId ) ); } } } Содержимое файлов в случае ответа в топике и в случае создания нового топика отличаются. В случае ответа - файл Reply, видно отправляемое сообщение "wwwwwwwwwww" [_data:protected] => Array ( [topic_id] => 2923 [post_date] => 1636395890 [author_id] => 1 [author_name] => Nalik [post] => <p> wwwwwwwwwww </p> [ip_address] => **.**.**.** [new_topic] => 0 [queued] => 0 [post_bwoptions] => 0 [pid] => 18704 [append_edit] => 0 [edit_time] => [edit_name] => [post_key] => 0 [post_htmlstate] => 0 [post_edit_reason] => [pdelete_time] => 0 [post_field_int] => 0 [post_field_t1] => [post_field_t2] => [nbpinned] => 0 ) В случае создания топика - файл NewTopic нет информации об отправляемом сообщении. NewTopic.txt Reply.txt Возможно при создании топика текст сообщения подставляется из какого-то другого файла?
  7. Respected вопрос немного другой. Мне нужно узнать где генерируется отправка уведомлений на Email при создании топика Наверное зря я в целом завел речь о плагине. Задача в том, чтобы найти файл и функцию из которой отправляется уведомление при создании нового контента)
  8. На разные условия, во вложении скрин В сообщении можно скрывать часть текста в блок и ставить условия видимости. Скрытый блок оборачивается в <div class="hideContent"></div> При отправки уведомлений на почту я проверяю наличие текста hideContent и заменяю сообщение Как уже сказал, проблема в том, что при создании нового топика я не пойму откуда берется сообщение. Я отдебажил весь файл /forum/system/Notification/Notification.php и вижу, что уведомления формируются в функции public function send( $sentTo = array() ) и отправляются через функцию protected function sendEmails( $emails, $emailRecipients ) Данные об отправляемом сообщении находятся в переменной $emails И когда я отвечаю в топике, то вижу в этой переменной текст сообщения. Но когда я создаю топик, текста сообщения в этой переменной нет, хотя есть название топика. В общем я не могу найти место откуда берется сообщение при создании топика. Respected Собственно вот уведомления которые приходят на почту: При создании нового топика. При написание сообщения в уже созданном топике.
  9. Здравствуйте. Установлен плагин Hide with conditions, допиленный на разные условия. Суть в том, что он скрывает сообщение и показывает его только при определенных условиях, например если наступила определенная дата или если у пользователя больше N сообщений и т.д. Проблема начинается когда пользователю подписанному на тебя приходит уведомления на почту с содержимым скрытого сообщения. И соответственно сообщение видно. Хотя должно быть скрыто. Я нашел файл из которого отправляется уведомление о создании нового сообщения /forum/system/Notification/Notification.php И допилил его следующим образом (Все скрытые сообщения содержат класс hideContent) и если этот текст найден в сообщении вместо него показывается текст, что сообщение скрыто. //Скрыть содержимое хайда if(stripos($this->emailParams[0]->post, 'hideContent') !== false) $this->emailParams[0]->post = '<p style="font-style: italic; color: gray; ">'.($language == 2 ? 'Посетите сайт, чтобы прочитать скрытый текст.' : 'Visit the site to read the hidden text.').'</p>'; Теперь когда я в теме оставлю сообщение под хайдом все ок, на почту приходит уведомление о том, что сообщение скрыто. Но когда я создаю новую тему с сообщением под хайдом, то пользователю приходит сообщение снова открытое. Можете подсказать в каком месте идет отправка уведомлений при создании новой темы?
  10. Как получить дату регистрации в Unix формате? Пробовал так, но возвращает не ту дату, которая находится в БД таблицы core_members strtotime($member->joined->format( 'd.m.Y H:i:s' )) strtotime($member->joined)
  11. Нет такой возможности?)
  12. Desti Вы предлагаете это сделать в менеджере меню? Не вижу где бы там можно было прописать код.
  13. Можно ли как-то в коде сделать отправку сообщения от имени указанного пользователя (например конкретного администратора или модератора) адресованное указанному пользователю? Сейчас я это делаю прямым редактированием БД, но возможно есть более простой код которого я не знаю? Что-то вроде $IPS->sendMessage('userID','subject','message'); Кстати ранее я поднимал эту тему, но не получил ответа
  14. Здравствуйте, кто знает как можно сделать разные пункты меню в зависимости от языка форума пользователя? Ну то есть выбрано у пользователя отображение форума на русском языке, значит у него видны одни пункты меню, а если выбран английский язык, то уже другие пункты меню. Просто я хочу предлагать русским пользователям переходить по одним ссылкам в меню, а иностранным по другим.
  15. Сделал проверку находится ли в первом или последнем сообщении скрытый контент и в соответствии с этим либо запрещаю превью, либо разрешаю)
  16. siv1987 ага уже нашел, спасибо)
  17. Здравствуйте. На форуме установлен плагин скрытия контента Hide with conditions 1.0.0, в нем есть баг. Если скрыть контент в первом сообщение топика, то в самой теме контент скрыт. Но если перейти к списку тем и навести на наименование темы курсор мышки и подержать 1.5 секунды, то для темы вылезет всплывающее окошко с содержимым темы в котором скрытый контент уже перестанет быть скрытым. Подскажите пожалуйста как отключить превью для тем? Как вариант можно вырезать из шаблона темы (forums->front->forums->topicRow) код отвечающий за превью. Но это не решит самой проблемы, так как в браузере в редакторе исходного кода их можно вставить в ручную и посмотреть превью темы) <a href='{$row->url()}' class='' title='{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $row->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $row->tableHoverUrl and $row->canView()}} data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5'{{endif}}{{if $row->canEdit()}} data-role="editableTitle"{{endif}}> //Вырезать эти строки data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5' В общем как отключить полностью превью для тем, на уровне системы?
  18. siv1987 спасибо что дали направление поиска проблемы, это решило её правильным образом) В файле profile.php в функции content() добавил проверку на количество контента пользователя, в случае если он равен 0, то не делать редирект. У меня это находилось в 506 строке. Код ниже, доработка помечена комментарием //Доработка /* Build Output */ if ( !$currentType ) { $query = \IPS\Content\Search\Query::init()->filterByAuthor( $this->member )->setOrder( \IPS\Content\Search\Query::ORDER_NEWEST_UPDATED )->setPage( $page ); $results = $query->search(); /* If we requested a higher page than is allowed, redirect back to last page */ $totalResults = $results->count( TRUE ); if( ceil( $totalResults / $query->resultsToGet ) < $page ) { if($this->member->member_posts != 0) //Доработка { $highestPage = floor( $totalResults / $query->resultsToGet ); \IPS\Output::i()->redirect( \IPS\Request::i()->url()->setQueryString( 'page', $highestPage ?: 1 ), NULL, 303 ); } } $pagination = trim( \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( $this->member->url()->setQueryString( array( 'do' => 'content', 'all_activity' => 1 ) ), ceil( $results->count( TRUE ) / $query->resultsToGet ), $page, $query->resultsToGet ) ); if ( \IPS\Request::i()->isAjax() AND \IPS\Request::i()->all_activity ) { \IPS\Output::i()->json( array( 'rows' => \IPS\Theme::i()->getTemplate('profile')->userContentStream( $this->member, $results, $pagination ) ) ); return; } else { $output = \IPS\Theme::i()->getTemplate('profile')->userContentStream( $this->member, $results, $pagination ); } } Упростил код. 504 строка if( ceil( $totalResults / $query->resultsToGet ) < $page && $this->member->member_posts != 0) { $highestPage = floor( $totalResults / $query->resultsToGet ); \IPS\Output::i()->redirect( \IPS\Request::i()->url()->setQueryString( 'page', $highestPage ?: 1 ), NULL, 303 ); } Хотя пожалуй лучше будет даже так && $this->member->member_posts > 0
  19. Увы не придумал ничего лучше размещения этого скрипта в index.php в самом верху. if(strpos($_SERVER['REQUEST_URI'], '/content/')) { ob_start(); require_once 'init.php'; $urlID = explode('-', explode("/", $_SERVER['REQUEST_URI'])[3])[0]; $profile_IPS = \IPS\Member::load( $urlID ); if($profile_IPS->member_posts <= 0) { $urlGo = 'https://site.ru/forum/profile/'.$profile_IPS->member_id.'-q/'; header('Location: '.$urlGo); ob_flush(); exit; } } Если находимся на странице содержащей в URL текст /content/, то смотрим существует ли у пользователя хоть 1 сообщение, если их нет то выполняем редирект на его профиль. Вот такой некрасивый костыль. Возможно кому-то пригодиться или кто-то предложит решение лучше.
  20. Ryo я находил, выкладывали не плагин, а скрипт который на прямую с БД работает и он для моей версии IPS некорректно работает) В общем задачу я решил указанным выше способом, спасибо)
  21. Придется дописывать код $post = \IPS\forums\Topic\Post::load($topic->topic_firstpost); $post->post_date = 1523375996; $post->save();
  22. WaNted я делал это через скобки😀 Спасибо!) WaNted жалко, что связный пост все равно не меняет времени публикации.
  23. siv1987 это поля таблицы mysql "forums_topics", там нужно будет тогда еще менять значение поля "post_date" в таблице "forums_posts" и значение полей "index_date_created" и "index_date_updated" в таблице "core_search_index". Конечно можно это напрямую в БД делать, но нет ли кода который позволит это сделать от самого IPS? Ну что-то типа $topic = \IPS\forums\Topic::load($ID); $topic->start_date(1554910672); //1554910672 - unix time
  24. siv1987 теперь понял, спасибо)
  25. $topic = \IPS\forums\Topic::load($ID); $topic->unhide(FALSE); Таким кодом можно открыть скрытую тему. А как изменить время создания топика? Ну естественно со всеми вытекающими. То есть изменяем время создания топика и соответственно время первого сообщения топика.