Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6dbfa73461 | ||
|
|
76ecc6efe8 | ||
|
|
f4b0737178 | ||
|
|
e99c7a81db | ||
|
|
ce0a6dc3af | ||
|
|
f3e428ea1e | ||
|
|
9b422b38c5 | ||
|
|
f6056b2d37 | ||
|
|
a560fc353c |
+1
-1
@@ -21,7 +21,7 @@ if (!defined('_GNUBOARD_')) exit;
|
|||||||
|
|
||||||
<!-- <p>실행시간 : <?php echo get_microtime() - $begin_time; ?> -->
|
<!-- <p>실행시간 : <?php echo get_microtime() - $begin_time; ?> -->
|
||||||
|
|
||||||
<script src="<?php echo G5_ADMIN_URL ?>/admin.js"></script>
|
<script src="<?php echo G5_ADMIN_URL ?>/admin.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(function(){
|
||||||
var hide_menu = false;
|
var hide_menu = false;
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ $g5['title'] = '게시판 복사';
|
|||||||
include_once(G5_PATH.'/head.sub.php');
|
include_once(G5_PATH.'/head.sub.php');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<script src="<?php echo G5_ADMIN_URL ?>/admin.js"></script>
|
<script src="<?php echo G5_ADMIN_URL ?>/admin.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
|
|
||||||
<div class="new_win">
|
<div class="new_win">
|
||||||
<h1><?php echo $g5['title']; ?></h1>
|
<h1><?php echo $g5['title']; ?></h1>
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ if (is_numeric($fg_no))
|
|||||||
else
|
else
|
||||||
$sql_group = "";
|
$sql_group = "";
|
||||||
|
|
||||||
|
$st = clean_xss_tags($st);
|
||||||
|
$sv = clean_xss_tags($sv);
|
||||||
|
|
||||||
if ($st == 'all') {
|
if ($st == 'all') {
|
||||||
$sql_search = "and (fo_name like '%{$sv}%' or fo_content like '%{$sv}%')";
|
$sql_search = "and (fo_name like '%{$sv}%' or fo_content like '%{$sv}%')";
|
||||||
} else if ($st == 'name') {
|
} else if ($st == 'name') {
|
||||||
@@ -60,7 +63,7 @@ function book_all_checked(chk)
|
|||||||
function book_del(fo_no)
|
function book_del(fo_no)
|
||||||
{
|
{
|
||||||
if (confirm("한번 삭제한 자료는 복구할 방법이 없습니다.\n\n그래도 삭제하시겠습니까?"))
|
if (confirm("한번 삭제한 자료는 복구할 방법이 없습니다.\n\n그래도 삭제하시겠습니까?"))
|
||||||
location.href = "./form_update.php?w=d&fo_no=" + fo_no + "&page=<?php echo $page?>&fg_no=<?php echo $fg_no?>&st=<?php echo $st?>&sv=<?php echo $sv?>";
|
location.href = "./form_update.php?w=d&fo_no=" + fo_no + "&page=<?php echo $page?>&fg_no=<?php echo $fg_no?>&st=<?php echo get_text($st); ?>&sv=<?php echo get_text($sv); ?>";
|
||||||
}
|
}
|
||||||
|
|
||||||
function multi_update(sel)
|
function multi_update(sel)
|
||||||
@@ -127,7 +130,7 @@ function multi_update(sel)
|
|||||||
<option value="content"<?php echo get_selected('content', $st); ?>>이모티콘</option>
|
<option value="content"<?php echo get_selected('content', $st); ?>>이모티콘</option>
|
||||||
</select>
|
</select>
|
||||||
<label for="sv" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
|
<label for="sv" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
|
||||||
<input type="text" name="sv" value="<?php echo $sv;?>" id="sv" required class="frm_input required" >
|
<input type="text" name="sv" value="<?php echo get_text($sv) ;?>" id="sv" required class="frm_input required" >
|
||||||
<input type="submit" value="검색" class="btn_submit">
|
<input type="submit" value="검색" class="btn_submit">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -181,7 +184,7 @@ function multi_update(sel)
|
|||||||
<span class="sound_only">등록 </span><?php echo date('Y-m-d', strtotime($res['fo_datetime']))?>
|
<span class="sound_only">등록 </span><?php echo date('Y-m-d', strtotime($res['fo_datetime']))?>
|
||||||
</div>
|
</div>
|
||||||
<div class="li_cmd">
|
<div class="li_cmd">
|
||||||
<a href="./form_write.php?w=u&fo_no=<?php echo $res['fo_no']?>&page=<?php echo $page;?>&fg_no=<?php echo $fg_no;?>&st=<?php echo $st;?>&sv=<?php echo $sv;?>">수정</a>
|
<a href="./form_write.php?w=u&fo_no=<?php echo $res['fo_no']?>&page=<?php echo $page;?>&fg_no=<?php echo $fg_no;?>&st=<?php echo get_text($st);?>&sv=<?php echo get_text($sv);?>">수정</a>
|
||||||
<a href="javascript:void(book_del('<?php echo $res['fo_no']?>'));">삭제</a>
|
<a href="javascript:void(book_del('<?php echo $res['fo_no']?>'));">삭제</a>
|
||||||
<a href="./sms_write.php?fo_no=<?php echo $res['fo_no']?>">보내기</a>
|
<a href="./sms_write.php?fo_no=<?php echo $res['fo_no']?>">보내기</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
include_once('./_common.php');
|
||||||
|
include_once(G5_LIB_PATH.'/json.lib.php');
|
||||||
|
|
||||||
|
if(!$bo_table)
|
||||||
|
die(json_encode(array('error'=>'게시판 정보가 올바르지 않습니다.', 'url'=>G5_URL)));
|
||||||
|
|
||||||
|
set_session('ss_write_'.$bo_table.'_token', '');
|
||||||
|
|
||||||
|
$token = get_write_token($bo_table);
|
||||||
|
|
||||||
|
die(json_encode(array('error'=>'', 'token'=>$token, 'url'=>'')));
|
||||||
|
?>
|
||||||
@@ -3,6 +3,9 @@ include_once('./_common.php');
|
|||||||
include_once(G5_LIB_PATH.'/naver_syndi.lib.php');
|
include_once(G5_LIB_PATH.'/naver_syndi.lib.php');
|
||||||
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
|
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
|
||||||
|
|
||||||
|
// 토큰체크
|
||||||
|
check_write_token($bo_table);
|
||||||
|
|
||||||
$g5['title'] = '게시글 저장';
|
$g5['title'] = '게시글 저장';
|
||||||
|
|
||||||
$msg = array();
|
$msg = array();
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
********************/
|
********************/
|
||||||
|
|
||||||
define('G5_VERSION', '그누보드5');
|
define('G5_VERSION', '그누보드5');
|
||||||
define('G5_GNUBOARD_VER', '5.2.1');
|
define('G5_GNUBOARD_VER', '5.2.3');
|
||||||
|
|
||||||
// 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음
|
// 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음
|
||||||
define('_GNUBOARD_', true);
|
define('_GNUBOARD_', true);
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||||
|
|
||||||
|
define('G5_JS_VER', '161020');
|
||||||
|
define('G5_CSS_VER', '161020');
|
||||||
|
?>
|
||||||
+5
-5
@@ -55,9 +55,9 @@ if($config['cf_add_meta'])
|
|||||||
<?php
|
<?php
|
||||||
if (defined('G5_IS_ADMIN')) {
|
if (defined('G5_IS_ADMIN')) {
|
||||||
if(!defined('_THEME_PREVIEW_'))
|
if(!defined('_THEME_PREVIEW_'))
|
||||||
echo '<link rel="stylesheet" href="'.G5_ADMIN_URL.'/css/admin.css">'.PHP_EOL;
|
echo '<link rel="stylesheet" href="'.G5_ADMIN_URL.'/css/admin.css?ver='.G5_CSS_VER.'">'.PHP_EOL;
|
||||||
} else {
|
} else {
|
||||||
echo '<link rel="stylesheet" href="'.G5_CSS_URL.'/'.(G5_IS_MOBILE?'mobile':'default').'.css">'.PHP_EOL;
|
echo '<link rel="stylesheet" href="'.G5_CSS_URL.'/'.(G5_IS_MOBILE?'mobile':'default').'.css?ver='.G5_CSS_VER.'">'.PHP_EOL;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<!--[if lte IE 8]>
|
<!--[if lte IE 8]>
|
||||||
@@ -79,9 +79,9 @@ var g5_admin_url = "<?php echo G5_ADMIN_URL; ?>";
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
</script>
|
</script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/jquery-1.8.3.min.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/jquery-1.8.3.min.js"></script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/jquery.menu.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/jquery.menu.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/common.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/common.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/wrest.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/wrest.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<?php
|
<?php
|
||||||
if(G5_IS_MOBILE) {
|
if(G5_IS_MOBILE) {
|
||||||
echo '<script src="'.G5_JS_URL.'/modernizr.custom.70111.js"></script>'.PHP_EOL; // overflow scroll 감지
|
echo '<script src="'.G5_JS_URL.'/modernizr.custom.70111.js"></script>'.PHP_EOL; // overflow scroll 감지
|
||||||
|
|||||||
@@ -689,4 +689,53 @@ $(function(){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function get_write_token(bo_table)
|
||||||
|
{
|
||||||
|
var token = "";
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: g5_bbs_url+"/write_token.php",
|
||||||
|
data: { bo_table: bo_table },
|
||||||
|
cache: false,
|
||||||
|
async: false,
|
||||||
|
dataType: "json",
|
||||||
|
success: function(data) {
|
||||||
|
if(data.error) {
|
||||||
|
alert(data.error);
|
||||||
|
if(data.url)
|
||||||
|
document.location.href = data.url;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
token = data.token;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
$(document).on("click", "form[name=fwrite] input:submit", function() {
|
||||||
|
var f = this.form;
|
||||||
|
var bo_table = f.bo_table.value;
|
||||||
|
var token = get_write_token(bo_table);
|
||||||
|
|
||||||
|
if(!token) {
|
||||||
|
alert("토큰 정보가 올바르지 않습니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $f = $(f);
|
||||||
|
|
||||||
|
if(typeof f.token === "undefined")
|
||||||
|
$f.prepend('<input type="hidden" name="token" value="">');
|
||||||
|
|
||||||
|
$f.find("input[name=token]").val(token);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
+38
-1
@@ -2423,6 +2423,8 @@ class html_process {
|
|||||||
if(!trim($link[1]))
|
if(!trim($link[1]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
$link[1] = preg_replace('#\.css([\'\"]?>)$#i', '.css?ver='.G5_CSS_VER.'$1', $link[1]);
|
||||||
|
|
||||||
$stylesheet .= PHP_EOL.$link[1];
|
$stylesheet .= PHP_EOL.$link[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2447,6 +2449,8 @@ class html_process {
|
|||||||
if(!trim($js[1]))
|
if(!trim($js[1]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
$js[1] = preg_replace('#\.js([\'\"]?>)$#i', '.js?ver='.G5_JS_VER.'$1', $js[1]);
|
||||||
|
|
||||||
$javascript .= $php_eol.$js[1];
|
$javascript .= $php_eol.$js[1];
|
||||||
$php_eol = PHP_EOL;
|
$php_eol = PHP_EOL;
|
||||||
}
|
}
|
||||||
@@ -2464,7 +2468,10 @@ class html_process {
|
|||||||
<body>
|
<body>
|
||||||
전에 스킨의 자바스크립트가 위치하도록 하게 한다.
|
전에 스킨의 자바스크립트가 위치하도록 하게 한다.
|
||||||
*/
|
*/
|
||||||
$buffer = preg_replace('#(</head>[^<]*<body[^>]*>)#', "$javascript\n$1", $buffer);
|
$nl = '';
|
||||||
|
if($javascript)
|
||||||
|
$nl = "\n";
|
||||||
|
$buffer = preg_replace('#(</head>[^<]*<body[^>]*>)#', "$javascript{$nl}$1", $buffer);
|
||||||
|
|
||||||
return $buffer;
|
return $buffer;
|
||||||
}
|
}
|
||||||
@@ -2981,6 +2988,11 @@ function check_url_host($url, $msg='', $return_url=G5_URL)
|
|||||||
$p = @parse_url($url);
|
$p = @parse_url($url);
|
||||||
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
|
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
|
||||||
|
|
||||||
|
if(stripos($url, 'http:') !== false) {
|
||||||
|
if(!isset($p['scheme']) || !$p['scheme'] || !isset($p['host']) || !$p['host'])
|
||||||
|
alert('url 정보가 올바르지 않습니다.', $return_url);
|
||||||
|
}
|
||||||
|
|
||||||
if ((isset($p['scheme']) && $p['scheme']) || (isset($p['host']) && $p['host'])) {
|
if ((isset($p['scheme']) && $p['scheme']) || (isset($p['host']) && $p['host'])) {
|
||||||
//if ($p['host'].(isset($p['port']) ? ':'.$p['port'] : '') != $_SERVER['HTTP_HOST']) {
|
//if ($p['host'].(isset($p['port']) ? ':'.$p['port'] : '') != $_SERVER['HTTP_HOST']) {
|
||||||
if ($p['host'] != $host) {
|
if ($p['host'] != $host) {
|
||||||
@@ -3221,4 +3233,29 @@ class str_encrypt
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
|
||||||
|
function get_write_token($bo_table)
|
||||||
|
{
|
||||||
|
$token = md5(uniqid(rand(), true));
|
||||||
|
set_session('ss_write_'.$bo_table.'_token', $token);
|
||||||
|
|
||||||
|
return $token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// POST로 넘어온 토큰과 세션에 저장된 토큰 비교
|
||||||
|
function check_write_token($bo_table)
|
||||||
|
{
|
||||||
|
if(!$bo_table)
|
||||||
|
alert('올바른 방법으로 이용해 주십시오.', G5_URL);
|
||||||
|
|
||||||
|
$token = get_session('ss_write_'.$bo_table.'_token');
|
||||||
|
set_session('ss_write_'.$bo_table.'_token', '');
|
||||||
|
|
||||||
|
if(!$token || !$_REQUEST['token'] || $token != $_REQUEST['token'])
|
||||||
|
alert('올바른 방법으로 이용해 주십시오.', G5_URL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
@@ -77,7 +77,7 @@ if( count($faq_master_list) ){
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
// 하단 HTML
|
// 하단 HTML
|
||||||
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
|
echo '<div id="faq_thtml">'.conv_content($fm['fm_mobile_tail_html'], 1).'</div>';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="faq_sch">
|
<div id="faq_sch">
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ if(defined('G5_THEME_PATH')) {
|
|||||||
<div id="ft_copy">
|
<div id="ft_copy">
|
||||||
<div id="ft_company">
|
<div id="ft_company">
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보취급방침</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보처리방침</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
||||||
</div>
|
</div>
|
||||||
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
|
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
|
||||||
* FILE, changes will be overwritten the next time the script is run.
|
* FILE, changes will be overwritten the next time the script is run.
|
||||||
*
|
*
|
||||||
* @version 4.7.0
|
* @version 4.8.0
|
||||||
*
|
*
|
||||||
* @warning
|
* @warning
|
||||||
* You must *not* include any other HTML Purifier files before this file,
|
* You must *not* include any other HTML Purifier files before this file,
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
HTML Purifier 4.7.0 - Standards Compliant HTML Filtering
|
HTML Purifier 4.8.0 - Standards Compliant HTML Filtering
|
||||||
Copyright (C) 2006-2008 Edward Z. Yang
|
Copyright (C) 2006-2008 Edward Z. Yang
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
@@ -78,12 +78,12 @@ class HTMLPurifier
|
|||||||
* Version of HTML Purifier.
|
* Version of HTML Purifier.
|
||||||
* @type string
|
* @type string
|
||||||
*/
|
*/
|
||||||
public $version = '4.7.0';
|
public $version = '4.8.0';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constant with version of HTML Purifier.
|
* Constant with version of HTML Purifier.
|
||||||
*/
|
*/
|
||||||
const VERSION = '4.7.0';
|
const VERSION = '4.8.0';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global configuration object.
|
* Global configuration object.
|
||||||
@@ -124,7 +124,7 @@ class HTMLPurifier
|
|||||||
/**
|
/**
|
||||||
* Initializes the purifier.
|
* Initializes the purifier.
|
||||||
*
|
*
|
||||||
* @param HTMLPurifier_Config $config Optional HTMLPurifier_Config object
|
* @param HTMLPurifier_Config|mixed $config Optional HTMLPurifier_Config object
|
||||||
* for all instances of the purifier, if omitted, a default
|
* for all instances of the purifier, if omitted, a default
|
||||||
* configuration is supplied (which can be overridden on a
|
* configuration is supplied (which can be overridden on a
|
||||||
* per-use basis).
|
* per-use basis).
|
||||||
@@ -406,6 +406,11 @@ class HTMLPurifier_AttrCollections
|
|||||||
* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
|
* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
|
||||||
*/
|
*/
|
||||||
public function __construct($attr_types, $modules)
|
public function __construct($attr_types, $modules)
|
||||||
|
{
|
||||||
|
$this->doConstruct($attr_types, $modules);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function doConstruct($attr_types, $modules)
|
||||||
{
|
{
|
||||||
// load extensions from the modules
|
// load extensions from the modules
|
||||||
foreach ($modules as $module) {
|
foreach ($modules as $module) {
|
||||||
@@ -1557,6 +1562,19 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
|
|||||||
);
|
);
|
||||||
$this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
|
$this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
|
||||||
|
|
||||||
|
$border_radius = new HTMLPurifier_AttrDef_CSS_Composite(
|
||||||
|
array(
|
||||||
|
new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
|
||||||
|
new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->info['border-top-left-radius'] =
|
||||||
|
$this->info['border-top-right-radius'] =
|
||||||
|
$this->info['border-bottom-right-radius'] =
|
||||||
|
$this->info['border-bottom-left-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 2);
|
||||||
|
// TODO: support SLASH syntax
|
||||||
|
$this->info['border-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1736,7 +1754,7 @@ class HTMLPurifier_Config
|
|||||||
* HTML Purifier's version
|
* HTML Purifier's version
|
||||||
* @type string
|
* @type string
|
||||||
*/
|
*/
|
||||||
public $version = '4.7.0';
|
public $version = '4.8.0';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not to automatically finalize
|
* Whether or not to automatically finalize
|
||||||
@@ -3198,7 +3216,7 @@ abstract class HTMLPurifier_DefinitionCache
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all expired (older version or revision) objects from cache
|
* Clears all expired (older version or revision) objects from cache
|
||||||
* @note Be carefuly implementing this method as flush. Flush must
|
* @note Be careful implementing this method as flush. Flush must
|
||||||
* not interfere with other Definition types, and cleanup()
|
* not interfere with other Definition types, and cleanup()
|
||||||
* should not be repeatedly called by userland code.
|
* should not be repeatedly called by userland code.
|
||||||
* @param HTMLPurifier_Config $config
|
* @param HTMLPurifier_Config $config
|
||||||
@@ -6293,6 +6311,11 @@ class HTMLPurifier_HTMLModuleManager
|
|||||||
if ($config->get('HTML.TargetBlank')) {
|
if ($config->get('HTML.TargetBlank')) {
|
||||||
$modules[] = 'TargetBlank';
|
$modules[] = 'TargetBlank';
|
||||||
}
|
}
|
||||||
|
// NB: HTML.TargetNoreferrer must be AFTER HTML.TargetBlank
|
||||||
|
// so that its post-attr-transform gets run afterwards.
|
||||||
|
if ($config->get('HTML.TargetNoreferrer')) {
|
||||||
|
$modules[] = 'TargetNoreferrer';
|
||||||
|
}
|
||||||
|
|
||||||
// merge in custom modules
|
// merge in custom modules
|
||||||
$modules = array_merge($modules, $this->userModules);
|
$modules = array_merge($modules, $this->userModules);
|
||||||
@@ -7743,12 +7766,17 @@ class HTMLPurifier_Lexer
|
|||||||
public function extractBody($html)
|
public function extractBody($html)
|
||||||
{
|
{
|
||||||
$matches = array();
|
$matches = array();
|
||||||
$result = preg_match('!<body[^>]*>(.*)</body>!is', $html, $matches);
|
$result = preg_match('|(.*?)<body[^>]*>(.*)</body>|is', $html, $matches);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
return $matches[1];
|
// Make sure it's not in a comment
|
||||||
} else {
|
$comment_start = strrpos($matches[1], '<!--');
|
||||||
return $html;
|
$comment_end = strrpos($matches[1], '-->');
|
||||||
|
if ($comment_start === false ||
|
||||||
|
($comment_end !== false && $comment_end > $comment_start)) {
|
||||||
|
return $matches[2];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return $html;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10073,6 +10101,7 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
|
|||||||
$css = $this->parseCDATA($css);
|
$css = $this->parseCDATA($css);
|
||||||
|
|
||||||
$definition = $config->getCSSDefinition();
|
$definition = $config->getCSSDefinition();
|
||||||
|
$allow_duplicates = $config->get("CSS.AllowDuplicates");
|
||||||
|
|
||||||
// we're going to break the spec and explode by semicolons.
|
// we're going to break the spec and explode by semicolons.
|
||||||
// This is because semicolon rarely appears in escaped form
|
// This is because semicolon rarely appears in escaped form
|
||||||
@@ -10082,6 +10111,7 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
|
|||||||
|
|
||||||
$declarations = explode(';', $css);
|
$declarations = explode(';', $css);
|
||||||
$propvalues = array();
|
$propvalues = array();
|
||||||
|
$new_declarations = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Name of the current CSS property being validated.
|
* Name of the current CSS property being validated.
|
||||||
@@ -10131,7 +10161,11 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
|
|||||||
if ($result === false) {
|
if ($result === false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$propvalues[$property] = $result;
|
if ($allow_duplicates) {
|
||||||
|
$new_declarations .= "$property:$result;";
|
||||||
|
} else {
|
||||||
|
$propvalues[$property] = $result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$context->destroy('CurrentCSSProperty');
|
$context->destroy('CurrentCSSProperty');
|
||||||
@@ -10140,7 +10174,6 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
|
|||||||
// slightly inefficient, but it's the only way of getting rid of
|
// slightly inefficient, but it's the only way of getting rid of
|
||||||
// duplicates. Perhaps config to optimize it, but not now.
|
// duplicates. Perhaps config to optimize it, but not now.
|
||||||
|
|
||||||
$new_declarations = '';
|
|
||||||
foreach ($propvalues as $prop => $value) {
|
foreach ($propvalues as $prop => $value) {
|
||||||
$new_declarations .= "$prop:$value;";
|
$new_declarations .= "$prop:$value;";
|
||||||
}
|
}
|
||||||
@@ -12251,6 +12284,9 @@ class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$uri_string = substr($uri_string, 4);
|
$uri_string = substr($uri_string, 4);
|
||||||
|
if (strlen($uri_string) == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
$new_length = strlen($uri_string) - 1;
|
$new_length = strlen($uri_string) - 1;
|
||||||
if ($uri_string[$new_length] != ')') {
|
if ($uri_string[$new_length] != ')') {
|
||||||
return false;
|
return false;
|
||||||
@@ -12625,18 +12661,26 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
|
|||||||
|
|
||||||
// we purposely avoid using regex, hopefully this is faster
|
// we purposely avoid using regex, hopefully this is faster
|
||||||
|
|
||||||
if (ctype_alpha($id)) {
|
if ($config->get('Attr.ID.HTML5') === true) {
|
||||||
$result = true;
|
if (preg_match('/[\t\n\x0b\x0c ]/', $id)) {
|
||||||
} else {
|
|
||||||
if (!ctype_alpha(@$id[0])) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// primitive style of regexps, I suppose
|
} else {
|
||||||
$trim = trim(
|
if (ctype_alpha($id)) {
|
||||||
$id,
|
// OK
|
||||||
'A..Za..z0..9:-._'
|
} else {
|
||||||
);
|
if (!ctype_alpha(@$id[0])) {
|
||||||
$result = ($trim === '');
|
return false;
|
||||||
|
}
|
||||||
|
// primitive style of regexps, I suppose
|
||||||
|
$trim = trim(
|
||||||
|
$id,
|
||||||
|
'A..Za..z0..9:-._'
|
||||||
|
);
|
||||||
|
if ($trim !== '') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$regexp = $config->get('Attr.IDBlacklistRegexp');
|
$regexp = $config->get('Attr.IDBlacklistRegexp');
|
||||||
@@ -12644,14 +12688,14 @@ class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->selector && $result) {
|
if (!$this->selector) {
|
||||||
$id_accumulator->add($id);
|
$id_accumulator->add($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if no change was made to the ID, return the result
|
// if no change was made to the ID, return the result
|
||||||
// else, return the new id if stripping whitespace made it
|
// else, return the new id if stripping whitespace made it
|
||||||
// valid, or return false.
|
// valid, or return false.
|
||||||
return $result ? $id : false;
|
return $id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13024,24 +13068,33 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
|
|||||||
// fairly well supported.
|
// fairly well supported.
|
||||||
$underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
|
$underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
|
||||||
|
|
||||||
|
// Based off of RFC 1738, but amended so that
|
||||||
|
// as per RFC 3696, the top label need only not be all numeric.
|
||||||
// The productions describing this are:
|
// The productions describing this are:
|
||||||
$a = '[a-z]'; // alpha
|
$a = '[a-z]'; // alpha
|
||||||
$an = '[a-z0-9]'; // alphanum
|
$an = '[a-z0-9]'; // alphanum
|
||||||
$and = "[a-z0-9-$underscore]"; // alphanum | "-"
|
$and = "[a-z0-9-$underscore]"; // alphanum | "-"
|
||||||
// domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
|
// domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
|
||||||
$domainlabel = "$an($and*$an)?";
|
$domainlabel = "$an(?:$and*$an)?";
|
||||||
// toplabel = alpha | alpha *( alphanum | "-" ) alphanum
|
// AMENDED as per RFC 3696
|
||||||
$toplabel = "$a($and*$an)?";
|
// toplabel = alphanum | alphanum *( alphanum | "-" ) alphanum
|
||||||
|
// side condition: not all numeric
|
||||||
|
$toplabel = "$an(?:$and*$an)?";
|
||||||
// hostname = *( domainlabel "." ) toplabel [ "." ]
|
// hostname = *( domainlabel "." ) toplabel [ "." ]
|
||||||
if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
|
if (preg_match("/^(?:$domainlabel\.)*($toplabel)\.?$/i", $string, $matches)) {
|
||||||
return $string;
|
if (!ctype_digit($matches[1])) {
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PHP 5.3 and later support this functionality natively
|
||||||
|
if (function_exists('idn_to_ascii')) {
|
||||||
|
return idn_to_ascii($string);
|
||||||
|
|
||||||
// If we have Net_IDNA2 support, we can support IRIs by
|
// If we have Net_IDNA2 support, we can support IRIs by
|
||||||
// punycoding them. (This is the most portable thing to do,
|
// punycoding them. (This is the most portable thing to do,
|
||||||
// since otherwise we have to assume browsers support
|
// since otherwise we have to assume browsers support
|
||||||
|
} elseif ($config->get('Core.EnableIDNA')) {
|
||||||
if ($config->get('Core.EnableIDNA')) {
|
|
||||||
$idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
|
$idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
|
||||||
// we need to encode each period separately
|
// we need to encode each period separately
|
||||||
$parts = explode('.', $string);
|
$parts = explode('.', $string);
|
||||||
@@ -13505,8 +13558,7 @@ class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
|
|||||||
if ($src) {
|
if ($src) {
|
||||||
$alt = $config->get('Attr.DefaultImageAlt');
|
$alt = $config->get('Attr.DefaultImageAlt');
|
||||||
if ($alt === null) {
|
if ($alt === null) {
|
||||||
// truncate if the alt is too long
|
$attr['alt'] = basename($attr['src']);
|
||||||
$attr['alt'] = substr(basename($attr['src']), 0, 40);
|
|
||||||
} else {
|
} else {
|
||||||
$attr['alt'] = $alt;
|
$attr['alt'] = $alt;
|
||||||
}
|
}
|
||||||
@@ -14053,6 +14105,44 @@ class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// must be called POST validation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds rel="noreferrer" to any links which target a different window
|
||||||
|
* than the current one. This is used to prevent malicious websites
|
||||||
|
* from silently replacing the original window, which could be used
|
||||||
|
* to do phishing.
|
||||||
|
* This transform is controlled by %HTML.TargetNoreferrer.
|
||||||
|
*/
|
||||||
|
class HTMLPurifier_AttrTransform_TargetNoreferrer extends HTMLPurifier_AttrTransform
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $attr
|
||||||
|
* @param HTMLPurifier_Config $config
|
||||||
|
* @param HTMLPurifier_Context $context
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function transform($attr, $config, $context)
|
||||||
|
{
|
||||||
|
if (isset($attr['rel'])) {
|
||||||
|
$rels = explode(' ', $attr['rel']);
|
||||||
|
} else {
|
||||||
|
$rels = array();
|
||||||
|
}
|
||||||
|
if (isset($attr['target']) && !in_array('noreferrer', $rels)) {
|
||||||
|
$rels[] = 'noreferrer';
|
||||||
|
}
|
||||||
|
if (!empty($rels) || isset($attr['rel'])) {
|
||||||
|
$attr['rel'] = implode(' ', $rels);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $attr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets height/width defaults for <textarea>
|
* Sets height/width defaults for <textarea>
|
||||||
*/
|
*/
|
||||||
@@ -14329,6 +14419,12 @@ class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if li is not allowed, delete parent node
|
||||||
|
if (!isset($config->getHTMLDefinition()->info['li'])) {
|
||||||
|
trigger_error("Cannot allow ul/ol without allowing li", E_USER_WARNING);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// the new set of children
|
// the new set of children
|
||||||
$result = array();
|
$result = array();
|
||||||
|
|
||||||
@@ -15166,6 +15262,12 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
}
|
}
|
||||||
$dir = $this->generateDirectoryPath($config);
|
$dir = $this->generateDirectoryPath($config);
|
||||||
$dh = opendir($dir);
|
$dh = opendir($dir);
|
||||||
|
// Apparently, on some versions of PHP, readdir will return
|
||||||
|
// an empty string if you pass an invalid argument to readdir.
|
||||||
|
// So you need this test. See #49.
|
||||||
|
if (false === $dh) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
while (false !== ($filename = readdir($dh))) {
|
while (false !== ($filename = readdir($dh))) {
|
||||||
if (empty($filename)) {
|
if (empty($filename)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -15175,6 +15277,7 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
}
|
}
|
||||||
unlink($dir . '/' . $filename);
|
unlink($dir . '/' . $filename);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15188,6 +15291,10 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
}
|
}
|
||||||
$dir = $this->generateDirectoryPath($config);
|
$dir = $this->generateDirectoryPath($config);
|
||||||
$dh = opendir($dir);
|
$dh = opendir($dir);
|
||||||
|
// See #49 (and above).
|
||||||
|
if (false === $dh) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
while (false !== ($filename = readdir($dh))) {
|
while (false !== ($filename = readdir($dh))) {
|
||||||
if (empty($filename)) {
|
if (empty($filename)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -15200,6 +15307,7 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
unlink($dir . '/' . $filename);
|
unlink($dir . '/' . $filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15255,11 +15363,12 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
if ($result !== false) {
|
if ($result !== false) {
|
||||||
// set permissions of the new file (no execute)
|
// set permissions of the new file (no execute)
|
||||||
$chmod = $config->get('Cache.SerializerPermissions');
|
$chmod = $config->get('Cache.SerializerPermissions');
|
||||||
if (!$chmod) {
|
if ($chmod === null) {
|
||||||
$chmod = 0644; // invalid config or simpletest
|
// don't do anything
|
||||||
|
} else {
|
||||||
|
$chmod = $chmod & 0666;
|
||||||
|
chmod($file, $chmod);
|
||||||
}
|
}
|
||||||
$chmod = $chmod & 0666;
|
|
||||||
chmod($file, $chmod);
|
|
||||||
}
|
}
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
@@ -15273,9 +15382,6 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
{
|
{
|
||||||
$directory = $this->generateDirectoryPath($config);
|
$directory = $this->generateDirectoryPath($config);
|
||||||
$chmod = $config->get('Cache.SerializerPermissions');
|
$chmod = $config->get('Cache.SerializerPermissions');
|
||||||
if (!$chmod) {
|
|
||||||
$chmod = 0755; // invalid config or simpletest
|
|
||||||
}
|
|
||||||
if (!is_dir($directory)) {
|
if (!is_dir($directory)) {
|
||||||
$base = $this->generateBaseDirectoryPath($config);
|
$base = $this->generateBaseDirectoryPath($config);
|
||||||
if (!is_dir($base)) {
|
if (!is_dir($base)) {
|
||||||
@@ -15288,7 +15394,19 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
} elseif (!$this->_testPermissions($base, $chmod)) {
|
} elseif (!$this->_testPermissions($base, $chmod)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mkdir($directory, $chmod);
|
if ($chmod === null) {
|
||||||
|
trigger_error(
|
||||||
|
'Base directory ' . $base . ' does not exist,
|
||||||
|
please create or change using %Cache.SerializerPath',
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($chmod !== null) {
|
||||||
|
mkdir($directory, $chmod);
|
||||||
|
} else {
|
||||||
|
mkdir($directory);
|
||||||
|
}
|
||||||
if (!$this->_testPermissions($directory, $chmod)) {
|
if (!$this->_testPermissions($directory, $chmod)) {
|
||||||
trigger_error(
|
trigger_error(
|
||||||
'Base directory ' . $base . ' does not exist,
|
'Base directory ' . $base . ' does not exist,
|
||||||
@@ -15325,7 +15443,7 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (function_exists('posix_getuid')) {
|
if (function_exists('posix_getuid') && $chmod !== null) {
|
||||||
// POSIX system, we can give more specific advice
|
// POSIX system, we can give more specific advice
|
||||||
if (fileowner($dir) === posix_getuid()) {
|
if (fileowner($dir) === posix_getuid()) {
|
||||||
// we can chmod it ourselves
|
// we can chmod it ourselves
|
||||||
@@ -16873,6 +16991,28 @@ class HTMLPurifier_HTMLModule_TargetBlank extends HTMLPurifier_HTMLModule
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module adds the target-based noreferrer attribute transformation to a tags. It
|
||||||
|
* is enabled by HTML.TargetNoreferrer
|
||||||
|
*/
|
||||||
|
class HTMLPurifier_HTMLModule_TargetNoreferrer extends HTMLPurifier_HTMLModule
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @type string
|
||||||
|
*/
|
||||||
|
public $name = 'TargetNoreferrer';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param HTMLPurifier_Config $config
|
||||||
|
*/
|
||||||
|
public function setup($config) {
|
||||||
|
$a = $this->addBlankElement('a');
|
||||||
|
$a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoreferrer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* XHTML 1.1 Text Module, defines basic text containers. Core Module.
|
* XHTML 1.1 Text Module, defines basic text containers. Core Module.
|
||||||
* @note In the normative XML Schema specification, this module
|
* @note In the normative XML Schema specification, this module
|
||||||
@@ -17979,9 +18119,14 @@ class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// there is/are URL(s). Let's split the string:
|
// there is/are URL(s). Let's split the string.
|
||||||
// Note: this regex is extremely permissive
|
// We use this regex:
|
||||||
$bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
|
// https://gist.github.com/gruber/249502
|
||||||
|
// but with @cscott's backtracking fix and also
|
||||||
|
// the Unicode characters un-Unicodified.
|
||||||
|
$bits = preg_split(
|
||||||
|
'/\\b((?:[a-z][\\w\\-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\))+(?:\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\x{00ab}\x{00bb}\x{201c}\x{201d}\x{2018}\x{2019}]))/iu',
|
||||||
|
$token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
|
||||||
|
|
||||||
|
|
||||||
$token = array();
|
$token = array();
|
||||||
@@ -18126,6 +18271,12 @@ class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
|
|||||||
$this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
|
$this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
|
||||||
$this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
|
$this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
|
||||||
$this->exclude = $config->get('AutoFormat.RemoveEmpty.Predicate');
|
$this->exclude = $config->get('AutoFormat.RemoveEmpty.Predicate');
|
||||||
|
foreach ($this->exclude as $key => $attrs) {
|
||||||
|
if (!is_array($attrs)) {
|
||||||
|
// HACK, see HTMLPurifier/Printer/ConfigForm.php
|
||||||
|
$this->exclude[$key] = explode(';', $attrs);
|
||||||
|
}
|
||||||
|
}
|
||||||
$this->attrValidator = new HTMLPurifier_AttrValidator();
|
$this->attrValidator = new HTMLPurifier_AttrValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18308,6 +18459,7 @@ class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* These are all lower-case keys.
|
||||||
* @type array
|
* @type array
|
||||||
*/
|
*/
|
||||||
protected $allowedParam = array(
|
protected $allowedParam = array(
|
||||||
@@ -18315,7 +18467,7 @@ class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
|
|||||||
'movie' => true,
|
'movie' => true,
|
||||||
'flashvars' => true,
|
'flashvars' => true,
|
||||||
'src' => true,
|
'src' => true,
|
||||||
'allowFullScreen' => true, // if omitted, assume to be 'false'
|
'allowfullscreen' => true, // if omitted, assume to be 'false'
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -18365,9 +18517,11 @@ class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
|
|||||||
$token->attr['name'] === $this->addParam[$n]) {
|
$token->attr['name'] === $this->addParam[$n]) {
|
||||||
// keep token, and add to param stack
|
// keep token, and add to param stack
|
||||||
$this->paramStack[$i][$n] = true;
|
$this->paramStack[$i][$n] = true;
|
||||||
} elseif (isset($this->allowedParam[$n])) {
|
} elseif (isset($this->allowedParam[strtolower($n)])) {
|
||||||
// keep token, don't do anything to it
|
// keep token, don't do anything to it
|
||||||
// (could possibly check for duplicates here)
|
// (could possibly check for duplicates here)
|
||||||
|
// Note: In principle, parameters should be case sensitive.
|
||||||
|
// But it seems they are not really; so accept any case.
|
||||||
} else {
|
} else {
|
||||||
$token = false;
|
$token = false;
|
||||||
}
|
}
|
||||||
@@ -21400,9 +21554,18 @@ class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
|
|||||||
} else {
|
} else {
|
||||||
$raw_data = $data;
|
$raw_data = $data;
|
||||||
}
|
}
|
||||||
|
if ( strlen($raw_data) < 12 ) {
|
||||||
|
// error; exif_imagetype throws exception with small files,
|
||||||
|
// and this likely indicates a corrupt URI/failed parse anyway
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// XXX probably want to refactor this into a general mechanism
|
// XXX probably want to refactor this into a general mechanism
|
||||||
// for filtering arbitrary content types
|
// for filtering arbitrary content types
|
||||||
$file = tempnam("/tmp", "");
|
if (function_exists('sys_get_temp_dir')) {
|
||||||
|
$file = tempnam(sys_get_temp_dir(), "");
|
||||||
|
} else {
|
||||||
|
$file = tempnam("/tmp", "");
|
||||||
|
}
|
||||||
file_put_contents($file, $raw_data);
|
file_put_contents($file, $raw_data);
|
||||||
if (function_exists('exif_imagetype')) {
|
if (function_exists('exif_imagetype')) {
|
||||||
$image_code = exif_imagetype($file);
|
$image_code = exif_imagetype($file);
|
||||||
@@ -21719,6 +21882,53 @@ class HTMLPurifier_URIScheme_nntp extends HTMLPurifier_URIScheme
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates tel (for phone numbers).
|
||||||
|
*
|
||||||
|
* The relevant specifications for this protocol are RFC 3966 and RFC 5341,
|
||||||
|
* but this class takes a much simpler approach: we normalize phone
|
||||||
|
* numbers so that they only include (possibly) a leading plus,
|
||||||
|
* and then any number of digits and x'es.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @type bool
|
||||||
|
*/
|
||||||
|
public $browsable = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type bool
|
||||||
|
*/
|
||||||
|
public $may_omit_host = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param HTMLPurifier_URI $uri
|
||||||
|
* @param HTMLPurifier_Config $config
|
||||||
|
* @param HTMLPurifier_Context $context
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function doValidate(&$uri, $config, $context)
|
||||||
|
{
|
||||||
|
$uri->userinfo = null;
|
||||||
|
$uri->host = null;
|
||||||
|
$uri->port = null;
|
||||||
|
|
||||||
|
// Delete all non-numeric characters, non-x characters
|
||||||
|
// from phone number, EXCEPT for a leading plus sign.
|
||||||
|
$uri->path = preg_replace('/(?!^\+)[^\dx]/', '',
|
||||||
|
// Normalize e(x)tension to lower-case
|
||||||
|
str_replace('X', 'x', $uri->path));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs safe variable parsing based on types which can be used by
|
* Performs safe variable parsing based on types which can be used by
|
||||||
* users. This may not be able to represent all possible data inputs,
|
* users. This may not be able to represent all possible data inputs,
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
|||||||
|
Attr.ID.HTML5
|
||||||
|
TYPE: bool/null
|
||||||
|
DEFAULT: null
|
||||||
|
VERSION: 4.8.0
|
||||||
|
--DESCRIPTION--
|
||||||
|
In HTML5, restrictions on the format of the id attribute have been significantly
|
||||||
|
relaxed, such that any string is valid so long as it contains no spaces and
|
||||||
|
is at least one character. In lieu of a general HTML5 compatibility flag,
|
||||||
|
set this configuration directive to true to use the relaxed rules.
|
||||||
|
--# vim: et sw=4 sts=4
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
CSS.AllowDuplicates
|
||||||
|
TYPE: bool
|
||||||
|
DEFAULT: false
|
||||||
|
VERSION: 4.8.0
|
||||||
|
--DESCRIPTION--
|
||||||
|
<p>
|
||||||
|
By default, HTML Purifier removes duplicate CSS properties,
|
||||||
|
like <code>color:red; color:blue</code>. If this is set to
|
||||||
|
true, duplicate properties are allowed.
|
||||||
|
</p>
|
||||||
|
--# vim: et sw=4 sts=4
|
||||||
+6
-1
@@ -1,5 +1,5 @@
|
|||||||
Cache.SerializerPermissions
|
Cache.SerializerPermissions
|
||||||
TYPE: int
|
TYPE: int/null
|
||||||
VERSION: 4.3.0
|
VERSION: 4.3.0
|
||||||
DEFAULT: 0755
|
DEFAULT: 0755
|
||||||
--DESCRIPTION--
|
--DESCRIPTION--
|
||||||
@@ -8,4 +8,9 @@ DEFAULT: 0755
|
|||||||
Directory permissions of the files and directories created inside
|
Directory permissions of the files and directories created inside
|
||||||
the DefinitionCache/Serializer or other custom serializer path.
|
the DefinitionCache/Serializer or other custom serializer path.
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
In HTML Purifier 4.8.0, this also supports <code>NULL</code>,
|
||||||
|
which means that no chmod'ing or directory creation shall
|
||||||
|
occur.
|
||||||
|
</p>
|
||||||
--# vim: et sw=4 sts=4
|
--# vim: et sw=4 sts=4
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
HTML.TargetNoreferrer
|
||||||
|
TYPE: bool
|
||||||
|
VERSION: 4.8.0
|
||||||
|
DEFAULT: TRUE
|
||||||
|
--DESCRIPTION--
|
||||||
|
If enabled, noreferrer rel attributes are added to links which have
|
||||||
|
a target attribute associated with them. This prevents malicious
|
||||||
|
destinations from overwriting the original window.
|
||||||
|
--# vim: et sw=4 sts=4
|
||||||
@@ -8,6 +8,7 @@ array (
|
|||||||
'ftp' => true,
|
'ftp' => true,
|
||||||
'nntp' => true,
|
'nntp' => true,
|
||||||
'news' => true,
|
'news' => true,
|
||||||
|
'tel' => true,
|
||||||
)
|
)
|
||||||
--DESCRIPTION--
|
--DESCRIPTION--
|
||||||
Whitelist that defines the schemes that a URI is allowed to have. This
|
Whitelist that defines the schemes that a URI is allowed to have. This
|
||||||
|
|||||||
@@ -327,6 +327,10 @@ class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
|
|||||||
case HTMLPurifier_VarParser::HASH:
|
case HTMLPurifier_VarParser::HASH:
|
||||||
$nvalue = '';
|
$nvalue = '';
|
||||||
foreach ($value as $i => $v) {
|
foreach ($value as $i => $v) {
|
||||||
|
if (is_array($v)) {
|
||||||
|
// HACK
|
||||||
|
$v = implode(";", $v);
|
||||||
|
}
|
||||||
$nvalue .= "$i:$v" . PHP_EOL;
|
$nvalue .= "$i:$v" . PHP_EOL;
|
||||||
}
|
}
|
||||||
$value = $nvalue;
|
$value = $nvalue;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ if (G5_IS_MOBILE) {
|
|||||||
<div id="ft_copy">
|
<div id="ft_copy">
|
||||||
<div>
|
<div>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보취급방침</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보처리방침</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
||||||
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
||||||
<a href="#hd" id="ft_totop">상단으로</a>
|
<a href="#hd" id="ft_totop">상단으로</a>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ if($config['cf_add_meta'])
|
|||||||
echo $config['cf_add_meta'].PHP_EOL;
|
echo $config['cf_add_meta'].PHP_EOL;
|
||||||
?>
|
?>
|
||||||
<title><?php echo $g5_head_title; ?></title>
|
<title><?php echo $g5_head_title; ?></title>
|
||||||
<link rel="stylesheet" href="<?php echo G5_THEME_CSS_URL; ?>/<?php echo G5_IS_MOBILE ? 'mobile' : 'default'; ?>.css">
|
<link rel="stylesheet" href="<?php echo G5_THEME_CSS_URL; ?>/<?php echo G5_IS_MOBILE ? 'mobile' : 'default'; ?>.css?ver=<?php echo G5_CSS_VER; ?>">
|
||||||
<!--[if lte IE 8]>
|
<!--[if lte IE 8]>
|
||||||
<script src="<?php echo G5_JS_URL ?>/html5.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/html5.js"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
@@ -63,9 +63,9 @@ var g5_editor = "<?php echo ($config['cf_editor'] && $board['bo_use_dhtml_edi
|
|||||||
var g5_cookie_domain = "<?php echo G5_COOKIE_DOMAIN ?>";
|
var g5_cookie_domain = "<?php echo G5_COOKIE_DOMAIN ?>";
|
||||||
</script>
|
</script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/jquery-1.8.3.min.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/jquery-1.8.3.min.js"></script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/jquery.menu.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/jquery.menu.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/common.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/common.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<script src="<?php echo G5_JS_URL ?>/wrest.js"></script>
|
<script src="<?php echo G5_JS_URL ?>/wrest.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||||
<?php
|
<?php
|
||||||
if(G5_IS_MOBILE) {
|
if(G5_IS_MOBILE) {
|
||||||
echo '<script src="'.G5_JS_URL.'/modernizr.custom.70111.js"></script>'.PHP_EOL; // overflow scroll 감지
|
echo '<script src="'.G5_JS_URL.'/modernizr.custom.70111.js"></script>'.PHP_EOL; // overflow scroll 감지
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ if( count($faq_master_list) ){
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
// 하단 HTML
|
// 하단 HTML
|
||||||
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
|
echo '<div id="faq_thtml">'.conv_content($fm['fm_mobile_tail_html'], 1).'</div>';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="faq_sch">
|
<div id="faq_sch">
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
|||||||
<div id="ft_copy">
|
<div id="ft_copy">
|
||||||
<div id="ft_company">
|
<div id="ft_company">
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보취급방침</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보처리방침</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
||||||
</div>
|
</div>
|
||||||
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ if (G5_IS_MOBILE) {
|
|||||||
<div id="ft_copy">
|
<div id="ft_copy">
|
||||||
<div>
|
<div>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=company">회사소개</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보취급방침</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=privacy">개인정보처리방침</a>
|
||||||
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
<a href="<?php echo G5_BBS_URL; ?>/content.php?co_id=provision">서비스이용약관</a>
|
||||||
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
Copyright © <b>소유하신 도메인.</b> All rights reserved.<br>
|
||||||
<a href="#hd" id="ft_totop">상단으로</a>
|
<a href="#hd" id="ft_totop">상단으로</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user