diff --git a/adm/admin.lib.php b/adm/admin.lib.php
index 31f765e45..7f0d6f63e 100644
--- a/adm/admin.lib.php
+++ b/adm/admin.lib.php
@@ -477,8 +477,8 @@ function admin_check_xss_params($params){
if( is_array($value) ){
admin_check_xss_params($value);
- } else if ( preg_match('/<\s?[^\>]*\/?\s?>/i', $value) && (preg_match('/script.*?\/script/ius', $value) || preg_match('/[onload|onerror]=.*/ius', $value)) ){
- alert('요청 쿼리에 잘못된 스크립트문장이 있습니다.\\nXSS 공격일수도 있습니다.');
+ } else if ( (preg_match('/<\s?[^\>]*\/?\s?>/i', $value) && (preg_match('/script.*?\/script/ius', $value) || preg_match('/[onload|onerror]=.*/ius', $value))) || preg_match('/^(?=.*token\()(?=.*xmlhttprequest\()(?=.*send\().*$/im', $value) || (preg_match('/[onload|onerror]=.*/ius', $value) && preg_match('/(eval|expression|exec|prompt)(\s*)\((.*)\)/ius', $value)) ){
+ alert('요청 쿼리에 잘못된 스크립트문장이 있습니다.\\nXSS 공격일수도 있습니다.', G5_URL);
die();
}
}
diff --git a/adm/board_form.php b/adm/board_form.php
index 3e60031d2..f75650a74 100644
--- a/adm/board_form.php
+++ b/adm/board_form.php
@@ -82,6 +82,7 @@ if (!isset($board['bo_use_captcha'])) {
$required = "";
$readonly = "";
+$sound_only = "";
if ($w == '') {
$html_title .= ' 생성';
diff --git a/adm/config_form.php b/adm/config_form.php
index 5bc7bccea..8629cd087 100644
--- a/adm/config_form.php
+++ b/adm/config_form.php
@@ -271,6 +271,13 @@ if(!isset($member['mb_scrap_cnt'])) {
ADD `mb_scrap_cnt` int(11) NOT NULL DEFAULT '0' AFTER `mb_memo_cnt`", true);
}
+// 아이코드 토큰키 추가
+if( ! isset($config['cf_icode_token_key']) ){
+ $sql = "ALTER TABLE `{$g5['config_table']}`
+ ADD COLUMN `cf_icode_token_key` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_icode_server_port`; ";
+ sql_query($sql, false);
+}
+
if(!$config['cf_faq_skin']) $config['cf_faq_skin'] = "basic";
if(!$config['cf_mobile_faq_skin']) $config['cf_mobile_faq_skin'] = "basic";
@@ -1257,29 +1264,29 @@ include_once('_rewrite_config_form.php');
SMS 기능을 사용하시려면 먼저 아이코드에 서비스 신청을 하셔야 합니다.
@@ -47,22 +55,31 @@ if ($config['cf_sms_use'] == 'icode') { // 아이코드 사용
- 아이코드 회원아이디 필수
+ SMS 전송유형
+
+ LMS로 선택하시면 90바이트 이하는 SMS로, 그 이상은 ".G5_ICODE_LMS_MAX_LENGTH."바이트까지 LMS로 전송됩니다. 요금은 건당 SMS는 16원, LMS는 48원입니다."); ?>
+
+ >SMS
+ >LMS
+
+
+
+
+ 아이코드 회원아이디 (구버전) 필수
-
+
-
- 아이코드 비밀번호 필수
+
+ 아이코드 비밀번호 (구버전) 필수
-
- 현재 비밀번호가 입력되어 있지 않습니다.
+
-
- 요금제
+
+ 요금제 (구버전)
';
} else {
- echo '가입해주세요.';
echo ' ';
}
?>
-
- 충전 잔액
+
+ 충전 잔액 (구버전)
원
충전하기
+
+ 아이코드 토큰키 (JSON버전)
+
+ SMS 전송유형을 LMS로 설정시 90바이트 이내는 SMS, 90 ~ 2000 바이트는 LMS 그 이상은 절삭 되어 LMS로 발송됩니다."); ?>
+
+ 토큰키관리 메뉴에서 생성한 토큰키를 입력합니다."); ?>
+
+ 서버아이피 :
+
+
회신번호 필수
diff --git a/adm/sms_admin/config_update.php b/adm/sms_admin/config_update.php
index 3d9b57e03..236d56e74 100644
--- a/adm/sms_admin/config_update.php
+++ b/adm/sms_admin/config_update.php
@@ -15,6 +15,7 @@ if(!check_vaild_callback($cf_phone))
alert('회신번호가 올바르지 않습니다.');
$userinfo = get_icode_userinfo($cf_icode_id, $cf_icode_pw);
+$cf_icode_server_port = isset($cf_icode_server_port) ? preg_replace('/[^0-9]/', '', $cf_icode_server_port) : '7295';
if ($userinfo['code'] == '202')
alert('아이코드 아이디와 패스워드가 맞지 않습니다.');
@@ -33,10 +34,12 @@ sql_query($sql);
// 아이코드 설정
$sql = " update {$g5['config_table']}
set cf_sms_use = '$cf_sms_use',
+ cf_sms_type = '$cf_sms_type',
cf_icode_id = '$cf_icode_id',
cf_icode_pw = '$cf_icode_pw',
cf_icode_server_ip = '$cf_icode_server_ip',
- cf_icode_server_port = '$cf_icode_server_port' ";
+ cf_icode_server_port = '$cf_icode_server_port',
+ cf_icode_token_key = '$cf_icode_token_key'";
sql_query($sql);
goto_url("./config.php");
diff --git a/adm/sms_admin/css/sms5.css b/adm/sms_admin/css/sms5.css
index b5c09d1c4..03187e7ea 100644
--- a/adm/sms_admin/css/sms5.css
+++ b/adm/sms_admin/css/sms5.css
@@ -22,6 +22,7 @@
.sms5_box {position:relative;padding:10px;border-radius:5px;background:#fbec99}
.sms5_box .box_ico {position:absolute;top:20px;left:-7px;width:7px;height:13px;background:url('../img/box_ico.gif') no-repeat}
.sms5_box .box_txt {border:0;background:transparent;word-break:break-all;resize:none;overflow:hidden}
+.sms5_box textarea.box_txt.is_overview{overflow:visible;min-height:130px}
.sms5_box .box_square {width:100px;height:90px}
#write_wrap {z-index:9}
diff --git a/adm/sms_admin/history_send.php b/adm/sms_admin/history_send.php
index 109dfcc41..9b4f29600 100644
--- a/adm/sms_admin/history_send.php
+++ b/adm/sms_admin/history_send.php
@@ -224,8 +224,8 @@ if($config['cf_sms_type'] == 'LMS') {
?>
&st=&sv=&wr_no=&wr_renum=';
@@ -104,7 +104,7 @@ function all_send()
-
+
diff --git a/adm/sms_admin/sms5.sql b/adm/sms_admin/sms5.sql
index 652872219..96bb7b1a4 100644
--- a/adm/sms_admin/sms5.sql
+++ b/adm/sms_admin/sms5.sql
@@ -149,7 +149,7 @@ CREATE TABLE `{$g5['sms5_write_table']}` (
`wr_no` int(11) NOT NULL default '1',
`wr_renum` int(11) NOT NULL default '0',
`wr_reply` varchar(255) NOT NULL default '',
- `wr_message` varchar(255) NOT NULL default '',
+ `wr_message` text NOT NULL,
`wr_booking` datetime NOT NULL default '0000-00-00 00:00:00',
`wr_total` int(11) NOT NULL default '0',
`wr_re_total` int(11) NOT NULL default '0',
diff --git a/adm/sms_admin/sms_write.php b/adm/sms_admin/sms_write.php
index 4654a3a6d..77754a97c 100644
--- a/adm/sms_admin/sms_write.php
+++ b/adm/sms_admin/sms_write.php
@@ -266,8 +266,8 @@ function sms5_chk_send(f)
w = document.body.clientWidth/2 - 200;
h = document.body.clientHeight/2 - 100;
- act = window.open('sms_ing.php', 'act', 'width=300, height=200, left=' + w + ', top=' + h);
- act.focus();
+ //act = window.open('sms_ing.php', 'act', 'width=300, height=200, left=' + w + ', top=' + h);
+ //act.focus();
f.send_list.value = list;
return true;
@@ -407,6 +407,7 @@ function byte_check(wr_message, sms_bytes)
var conts = document.getElementById(wr_message);
var bytes = document.getElementById(sms_bytes);
var max_bytes = document.getElementById("sms_max_bytes");
+ var lms_max_length =
var i = 0;
var cnt = 0;
@@ -427,14 +428,14 @@ function byte_check(wr_message, sms_bytes)
if(cnt > 90)
- max_bytes.innerHTML = 1500;
+ max_bytes.innerHTML = lms_max_length;
else
max_bytes.innerHTML = 90;
- if (cnt > 1500)
+ if (cnt > lms_max_length)
{
- exceed = cnt - 1500;
- alert('메시지 내용은 1500바이트를 넘을수 없습니다.\n\n작성하신 메세지 내용은 '+ exceed +'byte가 초과되었습니다.\n\n초과된 부분은 자동으로 삭제됩니다.');
+ exceed = cnt - lms_max_length;
+ alert('메시지 내용은 '+ lms_max_length +'바이트를 넘을수 없습니다.\n\n작성하신 메세지 내용은 '+ exceed +'byte가 초과되었습니다.\n\n초과된 부분은 자동으로 삭제됩니다.');
var tcnt = 0;
var xcnt = 0;
var tmp = conts.value;
@@ -447,7 +448,7 @@ function byte_check(wr_message, sms_bytes)
tcnt += 1;
}
- if (tcnt > 1500) {
+ if (tcnt > lms_max_length) {
tmp = tmp.substring(0,i);
break;
} else {
diff --git a/adm/sms_admin/sms_write_send.php b/adm/sms_admin/sms_write_send.php
index c7ec11030..e88bdae46 100644
--- a/adm/sms_admin/sms_write_send.php
+++ b/adm/sms_admin/sms_write_send.php
@@ -6,8 +6,24 @@ auth_check($auth[$sub_menu], "w");
check_admin_token();
+$result = sql_query("describe `{$g5['sms5_write_table']}`");
+while ($row = sql_fetch_array($result)){
+ if( $row['Field'] === 'wr_message' && $row['Type'] === 'varchar(255)' ){
+ sql_query("ALTER TABLE `{$g5['sms5_write_table']}` MODIFY wr_message TEXT NOT NULL;", false);
+ break;
+ }
+}
+
$g5['title'] = "문자전송중";
+if ($config['cf_sms_use'] != 'icode') {
+ alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.');
+}
+
+if ( ! (($config['cf_icode_id'] && $config['cf_icode_pw']) || $config['cf_icode_token_key']) ) {
+ alert('아이코드 설정값이 존재하지 않습니다.');
+}
+
$wr_reply = preg_replace('#[^0-9\-]#', '', trim($wr_reply));
$wr_message = clean_xss_tags(trim($wr_message));
@@ -94,12 +110,12 @@ while ($row = array_shift($send_list))
$hp = get_hp($item[$i][1], 0);
$name = $item[$i][0];
- if(!$hp) continue;
+ if(!$hp) continue 2;
if ($wr_overlap && array_overlap($hps, $hp)) {
$overlap++;
array_push( $duplicate_data['hp'], $row['bk_hp'] );
- continue;
+ continue 2;
}
array_push($list, array('bk_hp' => $hp, 'bk_name' => $name));
@@ -111,12 +127,12 @@ while ($row = array_shift($send_list))
$row = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$item[$i]'");
$row['bk_hp'] = get_hp($row['bk_hp'], 0);
- if(!$row['bk_hp']) continue;
+ if(!$row['bk_hp']) continue 2;
if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) {
$overlap++;
array_push( $duplicate_data['hp'], $row['bk_hp'] );
- continue;
+ continue 2;
}
array_push($list, $row);
array_push($hps, $row['bk_hp']);
@@ -141,14 +157,11 @@ if ($wr_by && $wr_bm && $wr_bd && $wr_bh && $wr_bi) {
$booking = '';
}
-if ($config['cf_sms_use'] != 'icode') {
- alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.');
-}
-
include_once(G5_ADMIN_PATH.'/admin.head.php');
$reply = str_replace('-', '', trim($wr_reply));
-$wr_message = conv_unescape_nl($wr_message);
+$db_wr_message = conv_unescape_nl($wr_message);
+$wr_message = conv_unescape_nl(stripslashes($wr_message));
$SMS = new SMS5;
@@ -186,7 +199,7 @@ if($config['cf_sms_type'] == 'LMS') {
if($result) {
$result = $SMS->Send();
-
+
if ($result) //SMS 서버에 접속했습니다.
{
foreach ($SMS->Result as $result)
@@ -242,7 +255,7 @@ if($config['cf_sms_type'] == 'LMS') {
}
}
- sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$wr_message', wr_success='$wr_success', wr_failure='$wr_failure', wr_memo='$str_serialize', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
+ sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$db_wr_message', wr_success='$wr_success', wr_failure='$wr_failure', wr_memo='$str_serialize', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
}
} else {
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']);
@@ -260,7 +273,7 @@ if($config['cf_sms_type'] == 'LMS') {
else
$wr_no = 1;
- sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$wr_message', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
+ sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$db_wr_message', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
$wr_success = 0;
$wr_failure = 0;
@@ -324,11 +337,16 @@ if($config['cf_sms_type'] == 'LMS') {
function win_close_alert($msg) {
- $html = "";
+ $html = "";
echo $html;
exit;
@@ -336,8 +354,8 @@ function win_close_alert($msg) {
?>
';
else
$screenshot = ' ';
-$name = get_text($info['theme_name']);
if($info['theme_uri']) {
$name = ''.$name.' ';
}
diff --git a/adm/visit_search.php b/adm/visit_search.php
index e29a0e382..524f2026f 100644
--- a/adm/visit_search.php
+++ b/adm/visit_search.php
@@ -11,6 +11,11 @@ include_once(G5_PLUGIN_PATH.'/jquery-ui/datepicker.php');
$colspan = 6;
$listall = '처음 '; //페이지 처음으로 (초기화용도)
+$sql_search = '';
+
+if(isset($sfl) && $sfl && !in_array($sfl, array('vi_ip','vi_date','vi_time','vi_referer','vi_agent','vi_browser','vi_os','vi_device')) ) {
+ $sfl = '';
+}
?>
diff --git a/bbs/db_table.optimize.php b/bbs/db_table.optimize.php
index 828923029..97a2fd8fa 100644
--- a/bbs/db_table.optimize.php
+++ b/bbs/db_table.optimize.php
@@ -53,7 +53,7 @@ if($config['cf_leave_day'] > 0) {
}
// 음성 캡챠 파일 삭제
-$captcha_mp3 = glob(G5_PATH.'/data/cache/kcaptcha-*.mp3');
+$captcha_mp3 = glob(G5_DATA_PATH.'/cache/kcaptcha-*.mp3');
if($captcha_mp3 && is_array($captcha_mp3)) {
foreach ($captcha_mp3 as $file) {
if (filemtime($file) + 86400 < G5_SERVER_TIME) {
diff --git a/bbs/download.php b/bbs/download.php
index e4f7fa3fe..2b2aa1f2b 100644
--- a/bbs/download.php
+++ b/bbs/download.php
@@ -108,17 +108,17 @@ run_event('download_file_header', $file, $file_exist_check);
if(preg_match("/msie/i", $_SERVER['HTTP_USER_AGENT']) && preg_match("/5\.5/", $_SERVER['HTTP_USER_AGENT'])) {
header("content-type: doesn/matter");
- header("content-length: ".filesize("$filepath"));
+ header("content-length: ".filesize($filepath));
header("content-disposition: attachment; filename=\"$original\"");
header("content-transfer-encoding: binary");
} else if (preg_match("/Firefox/i", $_SERVER['HTTP_USER_AGENT'])){
header("content-type: file/unknown");
- header("content-length: ".filesize("$filepath"));
+ header("content-length: ".filesize($filepath));
header("content-disposition: attachment; filename=\"".basename($file['bf_source'])."\"");
header("content-description: php generated data");
} else {
header("content-type: file/unknown");
- header("content-length: ".filesize("$filepath"));
+ header("content-length: ".filesize($filepath));
header("content-disposition: attachment; filename=\"$original\"");
header("content-description: php generated data");
}
diff --git a/bbs/move_update.php b/bbs/move_update.php
index b3c28f09c..044586264 100644
--- a/bbs/move_update.php
+++ b/bbs/move_update.php
@@ -192,6 +192,8 @@ while ($row = sql_fetch_array($result))
sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write + '$count_write' where bo_table = '$move_bo_table' ");
sql_query(" update {$g5['board_table']} set bo_count_comment = bo_count_comment + '$count_comment' where bo_table = '$move_bo_table' ");
+
+ run_event('bbs_move_copy', $row2, $move_bo_table, $insert_id, $next_wr_num, $sw);
delete_cache_latest($move_bo_table);
}
diff --git a/bbs/password.php b/bbs/password.php
index 5f6c4672e..54209e9d3 100644
--- a/bbs/password.php
+++ b/bbs/password.php
@@ -3,6 +3,10 @@ include_once('./_common.php');
$g5['title'] = '비밀번호 입력';
+if( isset($comment_id) ){
+ $comment_id = (int) $comment_id;
+}
+
switch ($w) {
case 'u' :
$action = G5_HTTP_BBS_URL.'/write.php';
diff --git a/bbs/qadownload.php b/bbs/qadownload.php
index 3c1a838c0..b6f163ed7 100644
--- a/bbs/qadownload.php
+++ b/bbs/qadownload.php
@@ -22,21 +22,26 @@ if($is_guest) {
$filepath = G5_DATA_PATH.'/qa/'.$file['qa_file'.$no];
$filepath = addslashes($filepath);
-if (!is_file($filepath) || !file_exists($filepath))
+$file_exist_check = (!is_file($filepath) || !file_exists($filepath)) ? false : true;
+
+if ( false === run_replace('qa_download_file_exist_check', $file_exist_check, $file) ){
alert('파일이 존재하지 않습니다.');
+}
$g5['title'] = '다운로드 > '.conv_subject($file['qa_subject'], 255);
+run_event('qa_download_file_header', $file, $file_exist_check);
+
$original = urlencode($file['qa_source'.$no]);
if(preg_match("/msie/i", $_SERVER['HTTP_USER_AGENT']) && preg_match("/5\.5/", $_SERVER['HTTP_USER_AGENT'])) {
header("content-type: doesn/matter");
- header("content-length: ".filesize("$filepath"));
+ header("content-length: ".filesize($filepath));
header("content-disposition: attachment; filename=\"$original\"");
header("content-transfer-encoding: binary");
} else {
header("content-type: file/unknown");
- header("content-length: ".filesize("$filepath"));
+ header("content-length: ".filesize($filepath));
header("content-disposition: attachment; filename=\"$original\"");
header("content-description: php generated data");
}
diff --git a/bbs/write_update.php b/bbs/write_update.php
index 3f50cc96a..723cb7857 100644
--- a/bbs/write_update.php
+++ b/bbs/write_update.php
@@ -466,9 +466,9 @@ for ($i=0; $i
');
+define('G5_NO_PROFILE_IMG', ' ');
// 썸네일 처리 방식, 비율유지 하지 않고 썸네일을 생성하려면 주석을 풀고 값은 false 입력합니다. ( true 또는 주석으로 된 경우에는 비율 유지합니다. )
//define('G5_USE_THUMB_RATIO', false);
diff --git a/extend/sms5.extend.php b/extend/sms5.extend.php
index dbef097cf..cae7e38a3 100644
--- a/extend/sms5.extend.php
+++ b/extend/sms5.extend.php
@@ -13,6 +13,12 @@ define('G5_SMS5_ADMIN_DIR', 'sms_admin');
define('G5_SMS5_ADMIN_PATH', G5_ADMIN_PATH.'/'.G5_SMS5_ADMIN_DIR);
define('G5_SMS5_ADMIN_URL', G5_ADMIN_URL.'/'.G5_SMS5_ADMIN_DIR);
+define('ICODE_JSON_SOCKET_HOST', '211.172.232.124');
+define('ICODE_JSON_SOCKET_PORT', '9201');
+
+define('G5_ICODE_LMS_MAX_LENGTH', 1500); // 구버전 LMS 최대길이
+define('G5_ICODE_JSON_MAX_LENGTH', 2000); // JSON 버전 LMS 최대길이
+
// SMS 테이블명
$g5['sms5_prefix'] = 'sms5_';
$g5['sms5_config_table'] = $g5['sms5_prefix'] . 'config';
diff --git a/install/ajax.install.check.php b/install/ajax.install.check.php
index fd5616f73..a6fc82f2c 100644
--- a/install/ajax.install.check.php
+++ b/install/ajax.install.check.php
@@ -15,6 +15,10 @@ if (file_exists($dbconfig_file)) {
die(install_json_msg('프로그램이 이미 설치되어 있습니다.'));
}
+if (preg_match("/[^0-9a-z_]+/i", $_POST['table_prefix']) ) {
+ die(install_json_msg('TABLE명 접두사는 영문자, 숫자, _ 만 입력하세요.'));
+}
+
$mysql_host = safe_install_string_check($_POST['mysql_host'], 'json');
$mysql_user = safe_install_string_check($_POST['mysql_user'], 'json');
$mysql_pass = safe_install_string_check($_POST['mysql_pass'], 'json');
diff --git a/install/install_config.php b/install/install_config.php
index 468c89372..03d3f3e86 100644
--- a/install/install_config.php
+++ b/install/install_config.php
@@ -61,7 +61,7 @@ $ajax_token = md5($tmp_str.$_SERVER['REMOTE_ADDR'].$_SERVER['DOCUMENT_ROOT']);
TABLE명 접두사
- 가능한 변경하지 마십시오.
+ TABLE명 접두사는 영문자, 숫자, _ 만 입력 가능합니다.
diff --git a/install/install_db.php b/install/install_db.php
index 89e78a8ec..bd2a66acf 100644
--- a/install/install_db.php
+++ b/install/install_db.php
@@ -33,6 +33,10 @@ $admin_pass = $_POST['admin_pass'];
$admin_name = $_POST['admin_name'];
$admin_email = $_POST['admin_email'];
+if (preg_match("/[^0-9a-z_]+/i", $table_prefix) ) {
+ die('
TABLE명 접두사는 영문자, 숫자, _ 만 입력하세요.
');
+}
+
if (preg_match("/[^0-9a-z_]+/i", $admin_id)) {
die('
관리자 아이디는 영문자, 숫자, _ 만 입력하세요.
');
}
@@ -340,10 +344,10 @@ $f = @fopen($file, 'a');
fwrite($f, "= $minimum_coin)
+ $is_sms_send = true;
+ }
+ }
+ }
+
+ return $is_sms_send;
+}
+
function is_use_email_certify(){
global $config;
@@ -3712,12 +3762,12 @@ function is_include_path_check($path='', $is_input='')
try {
// whether $path is unix or not
- $unipath = strlen($path)==0 || $path{0}!='/';
+ $unipath = strlen($path)==0 || substr($path, 0, 1) != '/';
$unc = substr($path,0,2)=='\\\\'?true:false;
// attempts to detect if path is relative in which case, add cwd
if(strpos($path,':') === false && $unipath && !$unc){
$path=getcwd().DIRECTORY_SEPARATOR.$path;
- if($path{0}=='/'){
+ if(substr($path, 0, 1) == '/'){
$unipath = false;
}
}
diff --git a/lib/icode.lms.lib.php b/lib/icode.lms.lib.php
index f7bb6f361..0da41bdb0 100644
--- a/lib/icode.lms.lib.php
+++ b/lib/icode.lms.lib.php
@@ -4,12 +4,19 @@ if (!defined('_GNUBOARD_')) exit;
// 요금제에 따른 port 구분
function get_icode_port_type($id, $pw)
{
+ global $config;
+
+ // 토큰키를 사용한다면 true 로 리턴
+ if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] ){
+ return 1;
+ }
+
$userinfo = get_icode_userinfo($id, $pw);
if($userinfo['payment'] == 'A') { // 충전제
return 1;
} else if($userinfo['payment'] == 'C') { // 정액제
- return 1;
+ return 2;
} else {
return false;
}
@@ -28,10 +35,21 @@ class LMS {
var $socket_portcode;
var $Data = array();
var $Result = array();
+ var $icode_key;
// SMS 서버 접속
function SMS_con($host, $id, $pw, $portcode) {
- $this->socket_host = $host;
+ global $config;
+
+ // 토큰키를 사용한다면
+ if(isset($config['cf_icode_token_key']) && $config['cf_icode_token_key']){
+ $this->icode_key = $config['cf_icode_token_key'];
+ $this->socket_host = ICODE_JSON_SOCKET_HOST;
+ $this->socket_port = ICODE_JSON_SOCKET_PORT;
+ } else {
+ $this->socket_host = $host;
+ }
+
$this->socket_portcode = $portcode;
$this->icode_id = FillSpace($id, 10);
$this->icode_pw = FillSpace($pw, 10);
@@ -43,32 +61,63 @@ class LMS {
}
function Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate="", $nCount) {
+ global $config;
// 문자 타입별 Port 설정.
$sendType = strlen($strData) > 90 ? 1 : 0; // 0: SMS / 1: LMS
- /* 개발 완료 후 아래 포트를 rand 함수를 이용하는 라인으로 변경 바랍니다.*/
+ // 토큰키를 사용한다면
+ if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){
+
+ // 개행치환
+ $strData = preg_replace("/\r\n/","\n",$strData);
+ $strData = preg_replace("/\r/","\n",$strData);
- // 충전식
- if ($this->socket_portcode == 1) {
- if($sendType && $sendType == 1) {
- //$this->socket_port = 8200; // LMS
- $this->socket_port=(int)rand(8200,8201); // LMS
- } else {
- //$this->socket_port = 6295; // SMS
- $this->socket_port=(int)rand(6295,6297); // SMS
- }
- }
- // 정액제
- else {
- if($sendType && $sendType == 1) {
- //$this->socket_port = 8300; // LMS
- $this->socket_port=(int)rand(8300,8301); // LMS
- } else {
- //$this->socket_port = 6291; // SMS
- $this->socket_port=(int)rand(6291,6293); // SMS
- }
- }
+ $checks = array('msg'=>$strData, 'subject'=>$strSubject);
+ $tmps = array();
+
+ foreach( $checks as $k=>$v ){
+
+ // 문자 내용이 euc-kr 인지 체크합니다.
+ $enc = mb_detect_encoding($v, array('EUC-KR', 'UTF-8'));
+
+ // 문자 내용이 euc-kr 이면 json_encode 에서 깨지기 때문에 utf-8 로 변환합니다.
+ $tmps[$k] = ($enc === 'EUC-KR') ? iconv_utf8($v) : $v;
+ }
+
+ $strData = $tmps['msg'];
+ $strSubject = $tmps['subject'];
+
+ // 문자 타입별 Port 설정.
+ $sendType = strlen($strData)>90 ? 1 : 0; // 0: SMS / 1: LMS
+ if($sendType==0) $strSubject = "";
+
+ $is_use_json = true;
+
+ } else {
+ /* 개발 완료 후 아래 포트를 rand 함수를 이용하는 라인으로 변경 바랍니다.*/
+
+ // 충전식
+ if ($this->socket_portcode == 1) {
+ if($sendType && $sendType == 1) {
+ //$this->socket_port = 8200; // LMS
+ $this->socket_port=(int)rand(8200,8201); // LMS
+ } else {
+ //$this->socket_port = 6295; // SMS
+ $this->socket_port=(int)rand(6295,6297); // SMS
+ }
+ }
+ // 정액제
+ else {
+ if($sendType && $sendType == 1) {
+ //$this->socket_port = 8300; // LMS
+ $this->socket_port=(int)rand(8300,8301); // LMS
+ } else {
+ //$this->socket_port = 6291; // SMS
+ $this->socket_port=(int)rand(6291,6293); // SMS
+ }
+ }
+ }
$strCallBack = FillSpace($strCallBack, 11); // 회신번호
$strDate = FillSpace($strDate, 12); // 즉시(12byte 공백), 예약전송(YmdHi)
@@ -88,9 +137,9 @@ class LMS {
$strSubject = str_replace(">", "]", $strSubject);
$strSubject = FillSpace($strSubject,30);
- $strData = FillSpace(CutChar($strData,1500),1500);
+ $strData = $is_use_json ? CutCharUtf8($strData, G5_ICODE_JSON_MAX_LENGTH) : FillSpace(CutChar($strData, G5_ICODE_LMS_MAX_LENGTH), G5_ICODE_LMS_MAX_LENGTH);
} else if (!$strURL) {
- $strData = FillSpace(CutChar($strData,90),90);
+ $strData = $is_use_json ? CutCharUtf8($strData, G5_ICODE_JSON_MAX_LENGTH) : FillSpace(CutChar($strData,90),90);
$strCaller = FillSpace($strCaller,10);
} else {
$strURL = FillSpace($strURL,50);
@@ -102,39 +151,85 @@ class LMS {
for ($i=0; $i<$nCount; $i++) {
- $strDest[$i] = FillSpace($strDest[$i],11);
- if ($sendType && $sendType == 1) {
- $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strSubject.$strDate.$strData;
- } else if (!$strURL) {
- $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData;
- } else {
- $strData = FillSpace(CheckCallCenter($strURL, $strDest[$i], $strData),80);
- $this->Data[$i] = '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData;
- }
+ if($is_use_json) {
+ $strDest[$i] = $strDest[$i];
+ $list = array(
+ "key" => $this->icode_key,
+ "tel" => $strDest[$i],
+ "cb" => $strCallBack,
+ "msg" => $strData,
+ "title" => $strSubject?$strSubject:"",
+ "date" => $strDate?$strDate:""
+ );
+ $packet = json_encode($list);
+
+ if( !$packet ){ // json_encode가 잘못되었으면 보내지 않습니다.
+ continue;
+ }
+ $this->Data[$i] = '06'.str_pad(strlen($packet), 4, "0", STR_PAD_LEFT).$packet;
+ } else {
+ $strDest[$i] = FillSpace($strDest[$i],11);
+ if ($sendType && $sendType == 1) {
+ $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strSubject.$strDate.$strData;
+ } else if (!$strURL) {
+ $this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData;
+ } else {
+ $strData = FillSpace(CheckCallCenter($strURL, $strDest[$i], $strData),80);
+ $this->Data[$i] = '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData;
+ }
+ }
}
return true;
}
function Send() {
- $fsocket = fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2);
- if (!$fsocket) return false;
- set_time_limit(60);
+ global $config;
- foreach($this->Data as $puts) {
- fputs($fsocket, $puts);
- while(!$gets) { $gets = fgets($fsocket,30); }
- $dest = substr($puts,26,11);
- if (substr($gets,0,19) == "0223 00".$dest) {
- $this->Result[] = $dest.":".substr($gets,19,10);
- } else {
- $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")";
- }
- $gets = "";
- }
+ // 토큰키를 사용한다면
+ if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){
+ $fsocket = @fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2);
+ if (!$fsocket) return false;
+ set_time_limit(300);
- fclose($fsocket);
- $this->Data = "";
+ foreach($this->Data as $puts) {
+ fputs($fsocket, $puts);
+ while(!$gets) { $gets = fgets($fsocket,32); }
+ $json = json_decode(substr($puts,6), true);
+
+ $dest = $json["tel"];
+ if (substr($gets,0,20) == "0225 00".FillSpace($dest,12)) {
+ $this->Result[] = $dest.":".substr($gets,20,11);
+
+ } else {
+ $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")";
+ if(substr($gets,6,2) >= "80") break;
+ }
+ $gets = "";
+ }
+
+ fclose($fsocket);
+ } else {
+ $fsocket = @fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2);
+ if (!$fsocket) return false;
+ set_time_limit(300);
+
+ foreach($this->Data as $puts) {
+ fputs($fsocket, $puts);
+ while(!$gets) { $gets = fgets($fsocket,30); }
+ $dest = substr($puts,26,11);
+ if (substr($gets,0,19) == "0223 00".$dest) {
+ $this->Result[] = $dest.":".substr($gets,19,10);
+ } else {
+ $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")";
+ }
+ $gets = "";
+ }
+
+ fclose($fsocket);
+ }
+
+ $this->Data = array();
return true;
}
}
@@ -168,6 +263,24 @@ function CutChar($word, $cut) {
return $word;
}
+function CutCharUtf8($word, $cut) {
+ preg_match_all('/[\xE0-\xFF][\x80-\xFF]{2}|./', $word, $match); // target for BMP
+
+ $m = $match[0];
+ $slen = strlen($word); // length of source string
+ if ($slen <= $cut) return $word;
+
+ $ret = array();
+ $count = 0;
+ for ($i=0; $i < $cut; $i++) {
+ $count += (strlen($m[$i]) > 1)?2:1;
+ if ($count > $cut) break;
+ $ret[] = $m[$i];
+ }
+
+ return join('', $ret);
+}
+
/**
* 수신번호의 값이 정확한 값인지 확인합니다.
*
@@ -183,7 +296,6 @@ function CheckCommonTypeDest($strDest, $nCount) {
}
}
-
/**
* 회신번호 유효성 여부조회 *
* @param string callback 회신번호
diff --git a/lib/icode.sms.lib.php b/lib/icode.sms.lib.php
index a3bee6613..6201f0081 100644
--- a/lib/icode.sms.lib.php
+++ b/lib/icode.sms.lib.php
@@ -44,8 +44,20 @@ class SMS {
var $SMS_Port;
var $Data = array();
var $Result = array();
+ var $icode_key;
+ var $socket_port;
+ var $socket_host;
function SMS_con($sms_server,$sms_id,$sms_pw,$port) {
+ global $config;
+
+ // 토큰키를 사용한다면
+ if(isset($config['cf_icode_token_key']) && $config['cf_icode_token_key']){
+ $this->icode_key = $config['cf_icode_token_key'];
+ $this->socket_host = ICODE_JSON_SOCKET_HOST;
+ $this->socket_port = ICODE_JSON_SOCKET_PORT;
+ }
+
$this->ID=$sms_id; // 계약 후 지정
$this->PWD=$sms_pw; // 계약 후 지정
$this->SMS_Server=$sms_server;
@@ -60,25 +72,82 @@ class SMS {
}
function Add($dest, $callBack, $Caller, $msg, $rsvTime="") {
- global $g5;
+ global $g5, $config;
- // 내용 검사 1
- $Error = CheckCommonType($dest, $rsvTime);
- if ($Error) return $Error;
- // 내용 검사 2
- //if ( eregi("[^0-9]",$callBack) ) return "회신 전화번호가 잘못되었습니다";
- if ( preg_match("/[^0-9]/i",$callBack) ) return "회신 전화번호가 잘못되었습니다";
+ // 토큰키를 사용한다면
+ if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){
- $msg=cut_char($msg,80); // 80자 제한
- // 보낼 내용을 배열에 집어넣기
- $dest = spacing($dest,11);
- $callBack = spacing($callBack,11);
- $Caller = spacing($Caller,10);
- $rsvTime = spacing($rsvTime,12);
- $msg = spacing($msg,80);
+ // 내용 검사 1
+ $Error = CheckCommonType($dest, $rsvTime);
+ if ($Error) return $Error;
+ if ( preg_match("/[^0-9]/i",$callBack) ) return "회신 전화번호가 잘못되었습니다";
- $this->Data[] = '01144 '.$this->ID.$this->PWD.$dest.$callBack.$Caller.$rsvTime.$msg;
- return "";
+ // 개행치환
+ $msg = preg_replace("/\r\n/", "\n", $msg);
+ $msg = preg_replace("/\r/", "\n", $msg);
+ // 90byte 이내는 SMS, 90 ~ 2000 byte 는 LMS 그 이상은 절삭 되어 LMS로 발송
+ // SMS 이기 때문에 90byte 이내로 합니다.
+ $msg=cut_char($msg, 90);
+ $msg = spacing($msg, 90);
+
+ // 한글 깨진것이 있는지 체크합니다.
+ if( preg_match('/^([\x00-\x7e]|.{2})*/', $msg, $z) ){
+ $msg = $z[0];
+ }
+
+ // 문자 내용이 euc-kr 인지 체크합니다.
+ $enc = mb_detect_encoding($msg, array('EUC-KR', 'UTF-8'));
+
+ // 문자 내용이 euc-kr 이면 json_encode 에서 깨지기 때문에 utf-8 로 변환합니다.
+ if($enc === 'EUC-KR'){
+ $msg = iconv_utf8($msg);
+ }
+
+ // 보낼 내용을 배열에 집어넣기
+ $dest = spacing($dest,11);
+ $callBack = spacing($callBack,11);
+ $Caller = spacing($Caller,10);
+ $rsvTime = $rsvTime ? spacing($rsvTime,12) : '';
+
+ $list = array(
+ "key" => $this->icode_key,
+ "tel" => $dest,
+ "cb" => $callBack,
+ "msg" => $msg,
+ "title" => "", //SMS 의 경우 타이틀을 지정할수 없습니다.
+ "date" => $rsvTime
+ );
+
+ $packet = json_encode($list);
+
+ if( !$packet ){ // json_encode가 잘못되었으면 보내지 않습니다.
+ return "json_encode error";
+ }
+ $this->Data[] = '06'.str_pad(strlen($packet), 4, "0", STR_PAD_LEFT).$packet;
+
+ return '';
+
+ } else {
+ // 기존 OLD SMS
+
+ // 내용 검사 1
+ $Error = CheckCommonType($dest, $rsvTime);
+ if ($Error) return $Error;
+ // 내용 검사 2
+ //if ( eregi("[^0-9]",$callBack) ) return "회신 전화번호가 잘못되었습니다";
+ if ( preg_match("/[^0-9]/i",$callBack) ) return "회신 전화번호가 잘못되었습니다";
+
+ $msg=cut_char($msg,80); // 80자 제한
+ // 보낼 내용을 배열에 집어넣기
+ $dest = spacing($dest,11);
+ $callBack = spacing($callBack,11);
+ $Caller = spacing($Caller,10);
+ $rsvTime = spacing($rsvTime,12);
+ $msg = spacing($msg,80);
+
+ $this->Data[] = '01144 '.$this->ID.$this->PWD.$dest.$callBack.$Caller.$rsvTime.$msg;
+ return "";
+ }
}
function AddURL($dest, $callBack, $URL, $msg, $rsvTime="") {
@@ -121,26 +190,53 @@ class SMS {
return "";
}
- function Send () {
- $fp=@fsockopen(trim($this->SMS_Server),trim($this->SMS_Port), $errno, $errstr, 2);
- if (!$fp) return false;
- set_time_limit(60);
+ function Send() {
+ global $config;
- ## php4.3.10일경우
- ## zend 최신버전으로 업해주세요..
- ## 또는 122번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요.
+ // 토큰키를 사용한다면
+ if( isset($config['cf_icode_token_key']) && $config['cf_icode_token_key'] === $this->icode_key ){
+ $fsocket = @fsockopen(trim($this->socket_host),trim($this->socket_port), $errno, $errstr, 2);
+ if (!$fsocket) return false;
+ set_time_limit(300);
- foreach($this->Data as $puts) {
- $dest = substr($puts,26,11);
- fputs($fp,$puts);
- while(!$gets) { $gets=fgets($fp,30); }
- if (substr($gets,0,19)=="0223 00".$dest) $this->Result[]=$dest.":".substr($gets,19,10);
- else $this->Result[$dest]=$dest.":Error";
- $gets="";
- }
- fclose($fp);
- $this->Data="";
- return true;
+ foreach($this->Data as $puts) {
+ fputs($fsocket, $puts);
+ while(!$gets) { $gets = fgets($fsocket,32); }
+ $json = json_decode(substr($puts,6), true);
+
+ $dest = $json["tel"];
+ if (substr($gets,0,20) == "0225 00".spacing($dest,12)) {
+ $this->Result[] = $dest.":".substr($gets,20,11);
+
+ } else {
+ $this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")";
+ if(substr($gets,6,2) >= "80") break;
+ }
+ $gets = "";
+ }
+ fclose($fsocket);
+
+ } else {
+
+ $fp=@fsockopen(trim($this->SMS_Server),trim($this->SMS_Port));
+ if (!$fp) return false;
+ set_time_limit(300);
+
+ ## php4.3.10일경우
+ ## zend 최신버전으로 업해주세요..
+ ## 또는 122번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요.
+
+ foreach($this->Data as $puts) {
+ $dest = substr($puts,26,11);
+ fputs($fp,$puts);
+ while(!$gets) { $gets=fgets($fp,30); }
+ if (substr($gets,0,19)=="0223 00".$dest) $this->Result[]=$dest.":".substr($gets,19,10);
+ else $this->Result[$dest]=$dest.":Error";
+ $gets="";
+ }
+ fclose($fp);
+ }
+ $this->Data=array();
}
}
?>
\ No newline at end of file
diff --git a/mobile/skin/board/basic/style.css b/mobile/skin/board/basic/style.css
index ac9fb3c70..17b5be269 100644
--- a/mobile/skin/board/basic/style.css
+++ b/mobile/skin/board/basic/style.css
@@ -85,6 +85,7 @@
.more_opt {display:none;position:absolute;top:50px;right:7px;background:#fff;border:1px solid #b8bfc4;z-index:999}
.more_opt:before {content:"";position:absolute;top:-8px;right:6px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent}
.more_opt:after {content:"";position:absolute;top:-6px;right:6px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
+.more_opt.is_list_btn{width:90px}
.more_opt li {display:block;border-bottom:1px solid #f1f1f1;padding:10px;margin:0;color:#6b757c;text-align:left}
.more_opt li:last-child {border-bottom:0}
.more_opt li button, .more_opt li a {width:100%;border:0;background:#fff;color:#6b757c}
diff --git a/mobile/skin/board/basic/view.skin.php b/mobile/skin/board/basic/view.skin.php
index 78c0a067d..3cd9811ba 100644
--- a/mobile/skin/board/basic/view.skin.php
+++ b/mobile/skin/board/basic/view.skin.php
@@ -143,7 +143,7 @@ jQuery(function($){
if (isset($view['file'][$i]['source']) && $view['file'][$i]['source'] && !$view['file'][$i]['view']) {
?>
-
+
()
diff --git a/mobile/skin/board/basic/view_comment.skin.php b/mobile/skin/board/basic/view_comment.skin.php
index 6ff08887b..eda34f3fa 100644
--- a/mobile/skin/board/basic/view_comment.skin.php
+++ b/mobile/skin/board/basic/view_comment.skin.php
@@ -22,6 +22,7 @@ var char_max = parseInt(); // 최대
$str = preg_replace("/\[\ \]/i", "", $str);
$c_reply_href = $comment_common_url.'&c_id='.$comment_id.'&w=c#bo_vc_w';
$c_edit_href = $comment_common_url.'&c_id='.$comment_id.'&w=cu#bo_vc_w';
+ $is_comment_reply_edit = ($list[$i]['is_reply'] || $list[$i]['is_edit'] || $list[$i]['is_del']) ? 1 : 0;
?>
+
@@ -45,6 +47,7 @@ var char_max = parseInt(); // 최대- 삭제
@@ -45,6 +47,7 @@ var char_max = parseInt(); // 최대- 삭제
- 관리자
- RSS
@@ -57,7 +56,6 @@ add_stylesheet('', 0
-