Merge pull request #2 from kijin/crazymerge

Crazymerge
This commit is contained in:
CONORY 2015-12-18 13:25:41 +09:00
commit 890a5dbfe9
185 changed files with 3108 additions and 662 deletions

View file

@ -80,6 +80,7 @@ class addonController extends addon
{
// Add-on module for use in creating the cache file
$buff = array('<?php if(!defined("__XE__")) exit();', '$_m = Context::get(\'mid\');');
$buff[] = 'ob_start();';
$oAddonModel = getAdminModel('addon');
$addon_list = $oAddonModel->getInsertedAddons($site_srl, $gtype);
foreach($addon_list as $addon => $val)
@ -135,6 +136,7 @@ class addonController extends addon
$buff[] = '$addon_time_log->called_extension = "' . $addon . '";';
$buff[] = 'writeSlowlog("addon",$after_time-$before_time,$addon_time_log);';
}
$buff[] = 'ob_end_flush();';
$addon_path = _XE_PATH_ . 'files/cache/addons/';
FileHandler::makeDir($addon_path);
$addon_file = $addon_path . ($gtype == 'site' ? $site_srl : '') . $type . '.acivated_addons.cache.php';

View file

@ -1,14 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants />
<permissions />
<permissions>
<permission action="procAddonAdminToggleActivate" target="manager" />
<permission action="dispAddonAdminSetup" target="manager" />
<permission action="procAddonAdminSetupAddon" target="manager" />
</permissions>
<actions>
<action name="dispAddonAdminIndex" type="view" admin_index="true" menu_name="installedAddon" menu_index="true" />
<action name="dispAddonAdminInfo" type="view" />
<action name="dispAddonAdminSetup" type="view" menu_name="installedAddon" />
<action name="procAddonAdminToggleActivate" type="controller" />
<action name="procAddonAdminSetupAddon" type="controller" ruleset="updateAddonSetup" />
<action name="procAddonAdminSaveActivate" type="controller" />
<action name="procAddonAdminSaveActivate" type="controller" />
</actions>
<menus>
<menu name="installedAddon">

View file

@ -140,7 +140,7 @@ class adminAdminController extends admin
$oMemberController = getController('member');
$oMemberController->procMemberLogout();
header('Location: ' . getNotEncodedUrl('', 'module', 'admin'));
header('Location: ' . getNotEncodedUrl(''));
}
public function procAdminInsertDefaultDesignInfo()

View file

@ -71,6 +71,7 @@ class adminAdminView extends admin
Context::set('use_html5', $db_info->use_html5 == 'Y' ? 'Y' : 'N');
Context::set('use_spaceremover', $db_info->use_spaceremover ? $db_info->use_spaceremover : 'Y'); //not use
Context::set('qmail_compatibility', $db_info->qmail_compatibility == 'Y' ? 'Y' : 'N');
Context::set('cache_friendly', $db_info->cache_friendly == 'Y' ? 'Y' : 'N');
Context::set('use_db_session', $db_info->use_db_session == 'N' ? 'N' : 'Y');
Context::set('use_mobile_view', $db_info->use_mobile_view == 'Y' ? 'Y' : 'N');
Context::set('use_ssl', $db_info->use_ssl ? $db_info->use_ssl : "none");

View file

@ -358,7 +358,7 @@
<value xml:lang="ko"><![CDATA[기본 URL]]></value>
<value xml:lang="en"><![CDATA[Default URL]]></value>
<value xml:lang="jp"><![CDATA[基本URL]]></value>
<value xml:lang="zh-CN"><![CDATA[XE通行证]]></value>
<value xml:lang="zh-CN"><![CDATA[预设网址]]></value>
<value xml:lang="zh-TW"><![CDATA[預設網址]]></value>
<value xml:lang="ru"><![CDATA[Основной URL]]></value>
<value xml:lang="tr"><![CDATA[Varsayılan URL]]></value>
@ -760,6 +760,18 @@
<value xml:lang="zh-CN"><![CDATA[启用Qmail]]></value>
<value xml:lang="tr"><![CDATA[Qmail etkinleştirin]]></value>
</item>
<item name="cache_friendly">
<value xml:lang="ko"><![CDATA[캐싱 최적화]]></value>
<value xml:lang="en"><![CDATA[Optimize for caching]]></value>
<value xml:lang="jp"><![CDATA[キャッシュに最適化]]></value>
<value xml:lang="zh-CN"><![CDATA[优化缓存]]></value>
<value xml:lang="tr"><![CDATA[Önbelleğe alma optimize]]></value>
</item>
<item name="about_cache_friendly">
<value xml:lang="ko"><![CDATA[Varnish 등의 캐싱 서버 사용시 성능 개선을 위해, 로그인하지 않은 사용자에게는 인증 세션을 부여하지 않습니다.<br>이 옵션을 선택할 경우 방문자 수 및 조회수 집계가 정확하지 않을 수 있습니다.]]></value>
<value xml:lang="en"><![CDATA[To improve performance when using a caching server such as Varnish, do not issue sessions to visitors until they log in.<br>Selecting this option may cause view counts and visitor counts to become inaccurate.]]></value>
<value xml:lang="jp"><![CDATA[Varnishなどのキャッシュサーバ使用時のパフォーマンスを向上させるために、ログインしていないユーザーには、認証セッションを付与しません。<br>このオプションを選択した場合、訪問者数とヒット集計が正確でない場合があります。]]></value>
</item>
<item name="sftp">
<value xml:lang="ko"><![CDATA[SFTP 사용]]></value>
<value xml:lang="en"><![CDATA[Use SFTP]]></value>
@ -1353,7 +1365,6 @@
<value xml:lang="jp"><![CDATA[PHPのsafe_modeがOnの場合、FTP情報を登録することで、XEのインストール及び利用が可能になります。]]></value>
<value xml:lang="zh-CN"><![CDATA[当PHP的safe_mode=On时请必须输入相关FTP信息否则将无法正常安装或使用XE程序。]]></value>
<value xml:lang="zh-TW"><![CDATA[當 PHP 的安全模式(safe_mode)開啟時,請輸入相關 FTP 資訊,否則無法正常安裝或使用程式。]]></value>
<value xml:lang="fr"><![CDATA[PHP의 safe_mode가 On일 경우 FTP 정보를 입력해야 XE의 설치 및 사용이 가능합니다]]></value>
<value xml:lang="de"><![CDATA[Zur Installation und Nutzung des XEs muss die Angabe des FTPs festgestellt werden, wenn safe_mode in PHP 'An' ist.]]></value>
<value xml:lang="es"><![CDATA[Si la la variable safe_mode está activa[safe_mode=On], debe rellenar los datos de FTP para seguir instalando y usar con normalidad el XE.]]></value>
<value xml:lang="tr"><![CDATA[Eğer PHP güvenli mod ayarları etkinse, XE'yi kurmak için FTP hesap bilgilerini girmelisiniz.]]></value>
@ -1397,7 +1408,6 @@
<value xml:lang="jp"><![CDATA[FTPでのディレクトリ作成に失敗しました。FTPサーバーの設定を再度確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[新建文件夹失败。请确认 FTP服务器设置。]]></value>
<value xml:lang="zh-TW"><![CDATA[新增資料夾失敗。請確認 FTP 主機設置。]]></value>
<value xml:lang="fr"><![CDATA[FTP를 이용한 디렉토리 생성 명령을 실패하였습니다. FTP 서버의 설정을 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Der Befehl von Herstellung des Verzeichnisses durch FTP ist gescheitert. FTP_Server festlegen.]]></value>
<value xml:lang="es"><![CDATA[Ha fallado el comando de FTP para la creación de directorio. Verifique la configuración del servicio FTP en el servidor]]></value>
<value xml:lang="tr"><![CDATA[Dizin oluşturma başarısız oldu. Lütfen FTP hesap iznini kontrol ediniz.]]></value>
@ -1410,7 +1420,6 @@
<value xml:lang="jp"><![CDATA[FTPでのディレクトリのアクセス権変更に失敗しました。FTPサーバーの設定を再度確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[修改文件夹属性失败。请确认 FTP服务器设置。]]></value>
<value xml:lang="zh-TW"><![CDATA[修改資料夾權限失敗。請確認 FTP 主機設置。]]></value>
<value xml:lang="fr"><![CDATA[FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Die Modifikation der Zugriffsberechtigung des Verzeichnisses durch FTP ist gescheitert. FTP_Server festlegen.]]></value>
<value xml:lang="ru"><![CDATA[Chmod failed. Please check the permission and configuration of FTP server.]]></value>
<value xml:lang="es"><![CDATA[Ha fallado el comando de FTP para la modificación de atributos de directorio. Verifique la configuración del servicio FTP en el servidor.]]></value>
@ -1424,7 +1433,6 @@
<value xml:lang="jp"><![CDATA[FTP接続、および認証に成功しました。]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP连接成功。]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP連線成功。]]></value>
<value xml:lang="fr"><![CDATA[FTP 접속 및 인증 성공하였습니다]]></value>
<value xml:lang="de"><![CDATA[Die Verbindung zu FTP ist erfolgreich und verifiziert.]]></value>
<value xml:lang="es"><![CDATA[conexión con éxito al FTP]]></value>
<value xml:lang="tr"><![CDATA[FTP sunucusu için bağlantı ve kimlik doğrulaması sağlandı.]]></value>
@ -1457,12 +1465,30 @@
<value xml:lang="jp"><![CDATA[インストールされたXEのFTP絶対パス設定]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP绝对路径设置]]></value>
<value xml:lang="zh-TW"><![CDATA[XE的 FTP 絕對路經]]></value>
<value xml:lang="fr"><![CDATA[설치된 XE의 FTP 절대경로]]></value>
<value xml:lang="de"><![CDATA[absoluten Pfad des FTPs, in dem XE installiert ist, festlegen.]]></value>
<value xml:lang="es"><![CDATA[설치된 XE의 FTP 절대경로]]></value>
<value xml:lang="tr"><![CDATA[XE Salt FTP Yolu]]></value>
<value xml:lang="vi"><![CDATA[Đường dẫn tuyệt đối của thư mục cài đặt XE trên FTP]]></value>
</item>
<item name="msg_php_warning_title">
<value xml:lang="ko"><![CDATA[안전하지 않은 PHP 버전 경고]]></value>
<value xml:lang="en"><![CDATA[Warning unsafe PHP version]]></value>
</item>
<item name="msg_php_warning_notice">
<value xml:lang="ko"><![CDATA[이 서버는 안전하지 않은 PHP 버전을 사용하고 있으며, PHP를 최신 안정 버전으로 업그레이드를 권장합니다.]]></value>
<value xml:lang="en"><![CDATA[The server is using a unsafe version of PHP, it is recommended to upgrade to the latest stable version.]]></value>
</item>
<item name="msg_php_warning_notice_explain">
<value xml:lang="ko"><![CDATA[<li>매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.</li><li>XE 최신 버전을 사용할 수 없습니다.</li><li>XE 최신 버전 이상에서 지원하는 확장 기능을 사용할 수 없습니다.</li><li>일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.</li>]]></value>
<value xml:lang="en"><![CDATA[<li>PHP version of this server can be exposed to serious security problems and attacks.</li><li>Latest version of XE is not available.</li><li>You can not use extensions that are supported by the latest version of XE.</li><li>Some extensions may not work properly. It can cause problems.</li>]]></value>
</item>
<item name="msg_php_warning_now_version">
<value xml:lang="ko"><![CDATA[이 서버의 PHP 버전]]></value>
<value xml:lang="en"><![CDATA[PHP version of this server]]></value>
</item>
<item name="msg_php_warning_latest_version_check">
<value xml:lang="ko"><![CDATA[PHP 최신 안정버전 확인하기]]></value>
<value xml:lang="en"><![CDATA[Check the latest stable version of PHP]]></value>
</item>
<item name="admin_setup">
<value xml:lang="ko"><![CDATA[관리자 설정]]></value>
<value xml:lang="en"><![CDATA[Admin Setup]]></value>

View file

@ -225,6 +225,15 @@
<label for="qmail_compatibility_n" class="x_inline"><input type="radio" name="qmail_compatibility" id="qmail_compatibility_n" value="N" checked="checked"|cond="$qmail_compatibility!='Y'" /> {$lang->cmd_no}</label>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->cache_friendly}</label>
<div class="x_controls">
<label for="cache_friendly_y" class="x_inline"><input type="radio" name="cache_friendly" id="cache_friendly_y" value="Y" checked="checked"|cond="$cache_friendly=='Y'" /> {$lang->cmd_yes}</label>
<label for="cache_friendly_n" class="x_inline"><input type="radio" name="cache_friendly" id="cache_friendly_n" value="N" checked="checked"|cond="$cache_friendly!='Y'" /> {$lang->cmd_no}</label>
<br />
<p class="x_help-block">{$lang->about_cache_friendly}</p>
</div>
</div>
<div class="x_clearfix btnArea">
<div class="x_pull-right">
<button type="submit" class="x_btn x_btn-primary">{$lang->cmd_save}</button>

View file

@ -81,17 +81,11 @@
</div>
<div class="message error" cond="version_compare(PHP_VERSION, __XE_MIN_PHP_VERSION__, '<')">
<h2>안전하지 않은 PHP 버전 경고</h2>
<p>이 서버는 안전하지 않은 PHP 버전을 사용하고 있으며, PHP를 최신 안정 버전으로의 업그레이드를 권장합니다.</p>
<p>이 서버의 PHP 버전 : <strong>{phpversion()}</strong></p>
<p><a href="http://php.net/downloads.php" target="_blank">PHP 최신 안정버전 확인하기</a></p>
<ul>
<li>매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.</li>
<li>XE 최신 버전을 사용할 수 없습니다.</li>
<li>XE 최신 버전 이상을 지원하는 확장 기능을 사용할 수 없습니다.</li>
<li>일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.</li>
</ul>
<h2>{$lang->msg_php_warning_title}</h2>
<p>{$lang->msg_php_warning_notice}</p>
<p>{$lang->msg_php_warning_now_version} : <strong>{phpversion()}</strong></p>
<p><a href="http://php.net/downloads.php" target="_blank">{$lang->msg_php_warning_latest_version_check}</a></p>
<ul>{$lang->msg_php_warning_notice_explain}</ul>
</div>
</div>

View file

@ -164,18 +164,28 @@ class autoinstallAdminModel extends autoinstall
*/
function getAutoinstallAdminIsAuthed()
{
$oAdminModel = getAdminModel('autoinstall');
$package = $oAdminModel->getInstallInfo(Context::get('package_srl'));
$is_authed = 0;
$ftp_info = Context::getFTPInfo();
if(!$ftp_info->ftp_root_path)
$output = $oAdminModel->checkUseDirectModuleInstall($package);
if($output->toBool()==TRUE)
{
$is_authed = -1;
$is_authed = 1;
}
else
{
$is_authed = (int) isset($_SESSION['ftp_password']);
$ftp_info = Context::getFTPInfo();
if(!$ftp_info->ftp_root_path)
{
$is_authed = -1;
}
else
{
$is_authed = (int) isset($_SESSION['ftp_password']);
}
}
$this->add('is_authed', $is_authed);
}

View file

@ -67,6 +67,13 @@ class boardController extends board
$is_update = true;
}
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_document_no_modify');
}
// if use anonymous is true
if($this->module_info->use_anonymous == 'Y')
{
@ -139,10 +146,13 @@ class boardController extends board
// send an email to admin user
if($output->toBool() && $this->module_info->admin_mail)
{
$oModuleModel = getModel('module');
$member_config = $oModuleModel->getModuleConfig('member');
$oMail = new Mail();
$oMail->setTitle($obj->title);
$oMail->setContent( sprintf("From : <a href=\"%s\">%s</a><br/>\r\n%s", getFullUrl('','document_srl',$obj->document_srl), getFullUrl('','document_srl',$obj->document_srl), $obj->content));
$oMail->setSender($obj->user_name, $obj->email_address);
$oMail->setSender($obj->user_name ? $obj->user_name : 'anonymous', $obj->email_address ? $obj->email_address : $member_config->webmaster_email);
$target_mail = explode(',',$this->module_info->admin_mail);
for($i=0;$i<count($target_mail);$i++)
@ -290,6 +300,14 @@ class boardController extends board
$comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager);
}
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($comment->member_srl);
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_comment_no_modify');
}
// if comment_srl is not existed, then insert the comment
if($comment->comment_srl != $obj->comment_srl)
{

View file

@ -643,6 +643,7 @@ class boardView extends board
}
$oDocumentModel = getModel('document');
$logged_info = Context::get('logged_info');
/**
* check if the category option is enabled not not
@ -652,7 +653,6 @@ class boardView extends board
// get the user group information
if(Context::get('is_logged'))
{
$logged_info = Context::get('logged_info');
$group_srls = array_keys($logged_info->group_list);
}
else
@ -686,6 +686,9 @@ class boardView extends board
$oDocument = $oDocumentModel->getDocument(0, $this->grant->manager);
$oDocument->setDocument($document_srl);
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($oDocument->get('module_srl') == $oDocument->get('member_srl')) $savedDoc = TRUE;
$oDocument->add('module_srl', $this->module_srl);
@ -693,6 +696,10 @@ class boardView extends board
{
return new Object(-1, 'msg_protect_content');
}
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_document_no_modify');
}
// if the document is not granted, then back to the password input form
$oModuleModel = getModel('module');
@ -925,6 +932,7 @@ class boardView extends board
**/
function dispBoardModifyComment()
{
$logged_info = Context::get('logged_info');
// check grant
if(!$this->grant->write_comment)
{
@ -945,6 +953,14 @@ class boardView extends board
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oComment->member_srl);
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_comment_no_modify');
}
// if the comment is not exited, alert an error message
if(!$oComment->isExists())
{

View file

@ -375,4 +375,10 @@
<value xml:lang="en"><![CDATA[You cannot modify or delete document which has any comment on it.]]></value>
<value xml:lang="jp"><![CDATA[コメントが登録された書き込みは修正、または削除が禁止されています。]]></value>
</item>
<item name="msg_admin_document_no_modify">
<value xml:lang="ko"><![CDATA[최고관리자의 게시물을 수정할 권한이 없습니다.]]></value>
</item>
<item name="msg_admin_comment_no_modify">
<value xml:lang="ko"><![CDATA[최고관리자의 댓글을 수정할 권한이 없습니다.]]></value>
</item>
</lang>

View file

@ -11,7 +11,7 @@
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$oComment->get('document_srl')}" />
<input type="hidden" name="comment_srl" value="{$oComment->get('comment_srl')}" />
<h1>{$lang->cmd_comment_do} {$lang->confirm_delete}</h1>
<h1>{sprintf($lang->comfirm_act_msg,$lang->comment,$lang->cmd_delete,$lang->msg_eul)}</h1>
<div class="btnArea">
<input type="submit" class="btn" value="{$lang->cmd_delete}" />
<button type="button" class="btn" onclick="history.back()">{$lang->cmd_cancel}</button>

View file

@ -9,7 +9,7 @@
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<h1>{$lang->cmd_document_do} {$lang->confirm_delete}</h1>
<h1>{sprintf($lang->comfirm_act_msg,$lang->document,$lang->cmd_delete,$lang->msg_rul)}</h1>
<div class="btnArea">
<input type="submit" class="btn" value="{$lang->cmd_delete}" />
<button type="button" class="btn" onclick="history.back()">{$lang->cmd_cancel}</button>

View file

@ -11,7 +11,7 @@
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$oComment->get('document_srl')}" />
<input type="hidden" name="comment_srl" value="{$oComment->get('comment_srl')}" />
<h1>{$lang->cmd_comment_do} {$lang->confirm_delete}</h1>
<h1>{sprintf($lang->comfirm_act_msg,$lang->comment,$lang->cmd_delete,$lang->msg_eul)}</h1>
<div class="btnArea">
<input type="submit" class="btn" value="{$lang->cmd_delete}" />
<button type="button" class="btn" onclick="history.back()">{$lang->cmd_cancel}</button>

View file

@ -9,7 +9,7 @@
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<h1>{$lang->cmd_document_do} {$lang->confirm_delete}</h1>
<h1>{sprintf($lang->comfirm_act_msg,$lang->document,$lang->cmd_delete,$lang->msg_rul)}</h1>
<div class="btnArea">
<input type="submit" class="btn" value="{$lang->cmd_delete}" />
<button type="button" class="btn" onclick="history.back()">{$lang->cmd_cancel}</button>

View file

@ -322,7 +322,7 @@ class commentController extends comment
// remove XE's own tags from the contents
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
if(Mobile::isFromMobilePhone())
if(Mobile::isFromMobilePhone() && !$manual_inserted && $obj->use_editor != 'Y')
{
if($obj->use_html != 'Y')
{
@ -330,6 +330,16 @@ class commentController extends comment
}
$obj->content = nl2br($obj->content);
}
else
{
$oModuleModel = getModel('module');
$editor_config = $oModuleModel->getModuleConfig('editor');
if(substr_compare($editor_config->sel_comment_editor_colorset, 'nohtml', -6) === 0 && !$manual_inserted)
{
$obj->content = preg_replace('/\r|\n/', '', nl2br(htmlspecialchars($obj->content, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)));
}
}
if(!$obj->regdate)
{
@ -731,7 +741,7 @@ class commentController extends comment
// remove XE's wn tags from contents
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
if(Mobile::isFromMobilePhone())
if(Mobile::isFromMobilePhone() && !$manual_inserted && $obj->use_editor != 'Y')
{
if($obj->use_html != 'Y')
{
@ -739,6 +749,16 @@ class commentController extends comment
}
$obj->content = nl2br($obj->content);
}
else
{
$oModuleModel = getModel('module');
$editor_config = $oModuleModel->getModuleConfig('editor');
if(substr_compare($editor_config->sel_comment_editor_colorset, 'nohtml', -6) === 0)
{
$obj->content = preg_replace('/\r|\n/', '', nl2br(htmlspecialchars($obj->content, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)));
}
}
// remove iframe and script if not a top administrator on the session
if($logged_info->is_admin != 'Y')
@ -789,6 +809,8 @@ class commentController extends comment
// create the comment model object
$oCommentModel = getModel('comment');
$logged_info = Context::get('logged_info');
// check if comment already exists
$comment = $oCommentModel->getComment($comment_srl);
if($comment->comment_srl != $comment_srl)
@ -796,6 +818,9 @@ class commentController extends comment
return new Object(-1, 'msg_invalid_request');
}
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($comment->member_srl);
$document_srl = $comment->document_srl;
// call a trigger (before)
@ -816,6 +841,7 @@ class commentController extends comment
if(count($childs) > 0)
{
$deleteAllComment = TRUE;
$deleteAdminComment = TRUE;
if(!$is_admin)
{
$logged_info = Context::get('logged_info');
@ -828,11 +854,28 @@ class commentController extends comment
}
}
}
else if($is_admin)
{
$logged_info = Context::get('logged_info');
foreach($childs as $val)
{
$c_member_info = $oMemberModel->getMemberInfoByMemberSrl($val->member_srl);
if($c_member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
$deleteAdminComment = FALSE;
break;
}
}
}
if(!$deleteAllComment)
{
return new Object(-1, 'fail_to_delete_have_children');
}
elseif(!$deleteAdminComment)
{
return new Object(-1, 'msg_admin_c_comment_no_delete');
}
else
{
foreach($childs as $val)
@ -846,6 +889,10 @@ class commentController extends comment
}
}
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_comment_no_delete');
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();

View file

@ -30,7 +30,7 @@ class commentItem extends Object
* @param array $columnList
* @return void
*/
function commentItem($comment_srl = 0, $columnList = array())
function __construct($comment_srl = 0, $columnList = array())
{
$this->comment_srl = $comment_srl;
$this->columnList = $columnList;
@ -131,7 +131,10 @@ class commentItem extends Object
function setAccessible()
{
$_SESSION['accessibled_comment'][$this->comment_srl] = TRUE;
if(Context::getSessionStatus())
{
$_SESSION['accessibled_comment'][$this->comment_srl] = TRUE;
}
}
function isEditable()
@ -377,9 +380,9 @@ class commentItem extends Object
return $content;
}
function getRegdate($format = 'Y.m.d H:i:s')
function getRegdate($format = 'Y.m.d H:i:s', $conversion = TRUE)
{
return zdate($this->get('regdate'), $format);
return zdate($this->get('regdate'), $format, $conversion);
}
function getRegdateTime()
@ -396,12 +399,12 @@ class commentItem extends Object
function getRegdateGM()
{
return $this->getRegdate('D, d M Y H:i:s') . ' ' . $GLOBALS['_time_zone'];
return $this->getRegdate('D, d M Y H:i:s', FALSE) . ' ' . $GLOBALS['_time_zone'];
}
function getUpdate($format = 'Y.m.d H:i:s')
function getUpdate($format = 'Y.m.d H:i:s', $conversion = TRUE)
{
return zdate($this->get('last_update'), $format);
return zdate($this->get('last_update'), $format, $conversion);
}
function getPermanentUrl()
@ -569,10 +572,11 @@ class commentItem extends Object
// Define thumbnail information
$thumbnail_path = sprintf('files/thumbnails/%s', getNumberingPath($this->comment_srl, 3));
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
$thumbnail_lockfile = sprintf('%s%dx%d.%s.lock', $thumbnail_path, $width, $height, $thumbnail_type);
$thumbnail_url = Context::getRequestUri() . $thumbnail_file;
// return false if a size of existing thumbnail file is 0. otherwise return the file path
if(file_exists($thumbnail_file))
if(file_exists($thumbnail_file) || file_exists($thumbnail_lockfile))
{
if(filesize($thumbnail_file) < 1)
{
@ -584,6 +588,9 @@ class commentItem extends Object
}
}
// Create lockfile to prevent race condition
FileHandler::writeFile($thumbnail_lockfile, '', 'w');
// Target file
$source_file = NULL;
$is_tmp_file = FALSE;
@ -674,21 +681,24 @@ class commentItem extends Object
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
// Remove source file if it was temporary
if($is_tmp_file)
{
FileHandler::removeFile($source_file);
}
// return the thumbnail path if successfully generated.
// Remove lockfile
FileHandler::removeFile($thumbnail_lockfile);
// Return the thumbnail path if it was successfully generated
if($output)
{
return $thumbnail_url;
}
// create an empty file not to attempt to generate the thumbnail afterwards
// Create an empty file if thumbnail generation failed
else
{
FileHandler::writeFile($thumbnail_file, '', 'w');
FileHandler::writeFile($thumbnail_file, '','w');
}
return;

View file

@ -312,4 +312,10 @@
<value xml:lang="en"><![CDATA[There are no selected comment.]]></value>
<value xml:lang="jp"><![CDATA[選択したコメントがありません。]]></value>
</item>
<item name="msg_admin_comment_no_delete">
<value xml:lang="ko"><![CDATA[최고관리자의 댓글을 삭제 할 수 없습니다.]]></value>
</item>
<item name="msg_admin_c_comment_no_delete">
<value xml:lang="ko"><![CDATA[이 댓글에 최고관리자의 댓글이 있어 삭제할 수 없습니다.]]></value>
</item>
</lang>

View file

@ -0,0 +1,12 @@
<query id="deleteMessagesMember" action="delete">
<tables>
<table name="member_message" />
</tables>
<conditions>
<condition operation="equal" column="message_type" var="message_type" />
<group pipe="and">
<condition operation="equal" column="sender_srl" var="sender_srl" />
<condition operation="equal" column="receiver_srl" var="receiver_srl" pipe="or" />
</group>
</conditions>
</query>

View file

@ -79,6 +79,13 @@ class documentAdminController extends document
$oDocument = $oDocumentModel->getDocument($document_srl);
if(!$oDocument->isExists()) continue;
$oMemberModel = getModel('member');
$logged_info = Context::get('logged_info');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object();
}
$source_category_srl = $oDocument->get('category_srl');
unset($obj);
@ -727,13 +734,21 @@ class documentAdminController extends document
*/
function procDocumentAdminMoveToTrash()
{
$logged_info = Context::get('logged_info');
$document_srl = Context::get('document_srl');
$oDocumentModel = getModel('document');
$oDocumentController = getController('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
if(!$oDocument->isGranted()) return $this->stop('msg_not_permitted');
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_document_no_move_to_trash');
}
$oModuleModel = getModel('module');
$module_info = $oModuleModel->getModuleInfoByDocumentSrl($document_srl);

View file

@ -50,7 +50,7 @@ class documentAdminView extends document
// get a list
$oDocumentModel = getModel('document');
$columnList = array('document_srl', 'module_srl', 'title', 'member_srl', 'nick_name', 'readed_count', 'voted_count', 'blamed_count', 'regdate', 'ipaddress', 'status');
$columnList = array('document_srl', 'module_srl', 'title', 'member_srl', 'nick_name', 'readed_count', 'voted_count', 'blamed_count', 'regdate', 'ipaddress', 'status', 'category_srl');
$output = $oDocumentModel->getDocumentList($args, false, true, $columnList);
// get Status name list

View file

@ -281,7 +281,7 @@ class documentController extends document
if($obj->title == '') $obj->title = 'Untitled';
// Remove XE's own tags from the contents.
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
if(Mobile::isFromMobilePhone())
if(Mobile::isFromMobilePhone() && !$manual_inserted && $obj->use_editor != 'Y')
{
if($obj->use_html != 'Y')
{
@ -289,6 +289,16 @@ class documentController extends document
}
$obj->content = nl2br($obj->content);
}
else
{
$oModuleModel = getModel('module');
$editor_config = $oModuleModel->getModuleConfig('editor');
if(substr_compare($editor_config->sel_editor_colorset, 'nohtml', -6) === 0 && !$manual_inserted)
{
$obj->content = preg_replace('/\r|\n/', '', nl2br(htmlspecialchars($obj->content, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)));
}
}
// Remove iframe and script if not a top adminisrator in the session.
if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);
// An error appears if both log-in info and user name don't exist.
@ -366,6 +376,8 @@ class documentController extends document
}
if(!$source_obj->document_srl || !$obj->document_srl) return new Object(-1,'msg_invalied_request');
if(!$obj->status && $obj->is_secret == 'Y') $obj->status = 'SECRET';
if(!$obj->status) $obj->status = 'PUBLIC';
@ -479,7 +491,7 @@ class documentController extends document
if($obj->title == '') $obj->title = 'Untitled';
// Remove XE's own tags from the contents.
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
if(Mobile::isFromMobilePhone())
if(Mobile::isFromMobilePhone() && !$manual_inserted && $obj->use_editor != 'Y')
{
if($obj->use_html != 'Y')
{
@ -487,6 +499,16 @@ class documentController extends document
}
$obj->content = nl2br($obj->content);
}
else
{
$oModuleModel = getModel('module');
$editor_config = $oModuleModel->getModuleConfig('editor');
if(substr_compare($editor_config->sel_editor_colorset, 'nohtml', -6) === 0)
{
$obj->content = preg_replace('/\r|\n/', '', nl2br(htmlspecialchars($obj->content, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)));
}
}
// Change not extra vars but language code of the original document if document's lang_code is different from author's setting.
if($source_obj->get('lang_code') != Context::getLangType())
{
@ -617,6 +639,16 @@ class documentController extends document
}
else if($isEmptyTrash && $oDocument == null) return new Object(-1, 'document is not exists');
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
$logged_info = Context::get('logged_info');
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_document_is_admin_not_permitted');
}
if(!$oDocument->isExists() || $oDocument->document_srl != $document_srl) return new Object(-1, 'msg_invalid_document');
// Check if a permossion is granted
if(!$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted');
@ -717,6 +749,7 @@ class documentController extends document
*/
function moveDocumentToTrash($obj)
{
$logged_info = Context::get('logged_info');
$trash_args = new stdClass();
// Get trash_srl if a given trash_srl doesn't exist
if(!$obj->trash_srl) $trash_args->trash_srl = getNextSequence();
@ -725,6 +758,14 @@ class documentController extends document
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($obj->document_srl);
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return new Object(-1, 'msg_admin_document_no_move_to_trash');
}
$trash_args->module_srl = $oDocument->get('module_srl');
$obj->module_srl = $oDocument->get('module_srl');
// Cannot throw data from the trash to the trash
@ -848,7 +889,7 @@ class documentController extends document
if($_SESSION['readed_document'][$document_srl]) return false;
// Pass if the author's IP address is as same as visitor's.
if($oDocument->get('ipaddress') == $_SERVER['REMOTE_ADDR'])
if($oDocument->get('ipaddress') == $_SERVER['REMOTE_ADDR'] && Context::getSessionStatus())
{
$_SESSION['readed_document'][$document_srl] = true;
return false;
@ -887,7 +928,7 @@ class documentController extends document
}
// Register session
if(!$_SESSION['banned_document'][$document_srl])
if(!$_SESSION['banned_document'][$document_srl] && Context::getSessionStatus())
{
$_SESSION['readed_document'][$document_srl] = true;
}
@ -2229,8 +2270,23 @@ class documentController extends document
$module_srl = Context::get('module_srl');
if($target_module && !$module_srl) $module_srl = $target_module;
$category_srl = Context::get('target_category');
$message_content = Context::get('message_content');
if($message_content) $message_content = nl2br($message_content);
// send default message - misol 2015-07-23
$send_default_message = Context::get('send_default_message');
if($send_default_message === 'Y')
{
$logged_info = Context::get('logged_info');
$message_content = '';
$default_message_verbs = Context::getLang('default_message_verbs');
if(isset($default_message_verbs[$type]) && is_string($default_message_verbs[$type]))
{
$message_content = sprintf(Context::getLang('default_message_format'), $logged_info->nick_name, $default_message_verbs[$type]);
}
}
else
{
$message_content = Context::get('message_content');
if($message_content) $message_content = nl2br($message_content);
}
$cart = Context::get('cart');
if(!is_array($cart)) $document_srl_list = explode('|@|', $cart);
@ -2247,28 +2303,6 @@ class documentController extends document
if(!$oDocument->isGranted()) return $this->stop('msg_not_permitted');
}
// Send a message
if($message_content)
{
$oCommunicationController = getController('communication');
$logged_info = Context::get('logged_info');
$title = cut_str($message_content,10,'...');
$sender_member_srl = $logged_info->member_srl;
foreach($document_items as $oDocument)
{
if(!$oDocument->get('member_srl') || $oDocument->get('member_srl')==$sender_member_srl) continue;
if($type=='move') $purl = sprintf("<a href=\"%s\" onclick=\"window.open(this.href);return false;\">%s</a>", $oDocument->getPermanentUrl(), $oDocument->getPermanentUrl());
else $purl = "";
$content = sprintf("<div>%s</div><hr />%s<div style=\"font-weight:bold\">%s</div>%s",$message_content, $purl, $oDocument->getTitleText(), $oDocument->getContent(false, false, false));
$oCommunicationController->sendMessage($sender_member_srl, $oDocument->get('member_srl'), $title, $content, false);
}
}
// Set a spam-filer not to be filtered to spams
$oSpamController = getController('spamfilter');
$oSpamController->setAvoidLog();
@ -2328,6 +2362,29 @@ class documentController extends document
$msg_code = 'success_declare_canceled';
}
// Send a message
if($message_content)
{
$oCommunicationController = getController('communication');
$logged_info = Context::get('logged_info');
$title = cut_str($message_content,10,'...');
$sender_member_srl = $logged_info->member_srl;
foreach($document_items as $oDocument)
{
if(!$oDocument->get('member_srl') || $oDocument->get('member_srl')==$sender_member_srl) continue;
if($type=='move') $purl = sprintf("<a href=\"%s\" onclick=\"window.open(this.href);return false;\" style=\"padding:10px 0;\">%s</a><hr />", $oDocument->getPermanentUrl(), $oDocument->getPermanentUrl());
else $purl = "";
$content = sprintf("<div style=\"padding:10px 0;\"><p>%s</p></div><hr />%s<div style=\"padding:10px 0;font-weight:bold\">%s</div>%s",$message_content, $purl, $oDocument->getTitleText(), $oDocument->getContent(false, false, false));
$oCommunicationController->sendMessage($sender_member_srl, $oDocument->get('member_srl'), $title, $content, false);
}
}
$_SESSION['document_management'] = array();
$this->setMessage($msg_code);

View file

@ -53,7 +53,7 @@ class documentItem extends Object
* @param array columnList
* @return void
*/
function documentItem($document_srl = 0, $load_extra_vars = true, $columnList = array())
function __construct($document_srl = 0, $load_extra_vars = true, $columnList = array())
{
$this->document_srl = $document_srl;
$this->columnList = $columnList;
@ -391,7 +391,10 @@ class documentItem extends Object
if($this->isSecret() && !$this->isGranted() && !$this->isAccessible()) return Context::getLang('msg_is_secret');
$result = $this->_checkAccessibleFromStatus();
if($result) $_SESSION['accessible'][$this->document_srl] = true;
if($result && Context::getSessionStatus())
{
$_SESSION['accessible'][$this->document_srl] = true;
}
$content = $this->get('content');
$content = preg_replace_callback('/<(object|param|embed)[^>]*/is', array($this, '_checkAllowScriptAccess'), $content);
@ -452,7 +455,10 @@ class documentItem extends Object
if($this->isSecret() && !$this->isGranted() && !$this->isAccessible()) return Context::getLang('msg_is_secret');
$result = $this->_checkAccessibleFromStatus();
if($result) $_SESSION['accessible'][$this->document_srl] = true;
if($result && Context::getSessionStatus())
{
$_SESSION['accessible'][$this->document_srl] = true;
}
$content = $this->get('content');
if(!$stripEmbedTagException) stripEmbedTagForAdmin($content, $this->get('member_srl'));
@ -551,9 +557,9 @@ class documentItem extends Object
return $content;
}
function getRegdate($format = 'Y.m.d H:i:s')
function getRegdate($format = 'Y.m.d H:i:s', $conversion = TRUE)
{
return zdate($this->get('regdate'), $format);
return zdate($this->get('regdate'), $format, $conversion);
}
function getRegdateTime()
@ -570,17 +576,17 @@ class documentItem extends Object
function getRegdateGM()
{
return $this->getRegdate('D, d M Y H:i:s').' '.$GLOBALS['_time_zone'];
return $this->getRegdate('D, d M Y H:i:s', FALSE).' '.$GLOBALS['_time_zone'];
}
function getRegdateDT()
{
return $this->getRegdate('Y-m-d').'T'.$this->getRegdate('H:i:s').substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3,2);
return $this->getRegdate('Y-m-d', FALSE).'T'.$this->getRegdate('H:i:s', FALSE).substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3,2);
}
function getUpdate($format = 'Y.m.d H:i:s')
function getUpdate($format = 'Y.m.d H:i:s', $conversion = TRUE)
{
return zdate($this->get('last_update'), $format);
return zdate($this->get('last_update'), $format, $conversion);
}
function getUpdateTime()
@ -601,7 +607,7 @@ class documentItem extends Object
function getUpdateDT()
{
return $this->getUpdate('Y-m-d').'T'.$this->getUpdate('H:i:s').substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3,2);
return $this->getUpdate('Y-m-d', FALSE).'T'.$this->getUpdate('H:i:s', FALSE).substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3,2);
}
function getPermanentUrl()
@ -749,6 +755,7 @@ class documentItem extends Object
// If admin priviledge is granted on parent posts, you can read its child posts.
$accessible = array();
$comment_list = array();
$setAccessibleComments = Context::getSessionStatus();
foreach($output->data as $key => $val)
{
$oCommentItem = new commentItem();
@ -758,7 +765,10 @@ class documentItem extends Object
// If the comment is set to private and it belongs child post, it is allowable to read the comment for who has a admin privilege on its parent post
if($val->parent_srl>0 && $val->is_secret == 'Y' && !$oCommentItem->isAccessible() && $accessible[$val->parent_srl]===true)
{
$oCommentItem->setAccessible();
if($setAccessibleComments)
{
$oCommentItem->setAccessible();
}
}
$comment_list[$val->comment_srl] = $oCommentItem;
}
@ -818,17 +828,29 @@ class documentItem extends Object
}
$thumbnail_type = $config->thumbnail_type;
}
// Define thumbnail information
$thumbnail_path = sprintf('files/thumbnails/%s',getNumberingPath($this->document_srl, 3));
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
$thumbnail_lockfile = sprintf('%s%dx%d.%s.lock', $thumbnail_path, $width, $height, $thumbnail_type);
$thumbnail_url = Context::getRequestUri().$thumbnail_file;
// Return false if thumbnail file exists and its size is 0. Otherwise, return its path
if(file_exists($thumbnail_file))
if(file_exists($thumbnail_file) || file_exists($thumbnail_lockfile))
{
if(filesize($thumbnail_file)<1) return false;
else return $thumbnail_url;
if(filesize($thumbnail_file) < 1)
{
return FALSE;
}
else
{
return $thumbnail_url;
}
}
// Create lockfile to prevent race condition
FileHandler::writeFile($thumbnail_lockfile, '', 'w');
// Target File
$source_file = null;
$is_tmp_file = false;
@ -903,11 +925,26 @@ class documentItem extends Object
{
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
}
if($is_tmp_file) FileHandler::removeFile($source_file);
// Return its path if a thumbnail is successfully genetated
if($output) return $thumbnail_url;
// Create an empty file not to re-generate the thumbnail
else FileHandler::writeFile($thumbnail_file, '','w');
// Remove source file if it was temporary
if($is_tmp_file)
{
FileHandler::removeFile($source_file);
}
// Remove lockfile
FileHandler::removeFile($thumbnail_lockfile);
// Return the thumbnail path if it was successfully generated
if($output)
{
return $thumbnail_url;
}
// Create an empty file if thumbnail generation failed
else
{
FileHandler::writeFile($thumbnail_file, '','w');
}
return;
}

View file

@ -327,6 +327,10 @@
<value xml:lang="tr"><![CDATA[%d makale silinmiştir]]></value>
<value xml:lang="vi"><![CDATA[%d bài viết đã được xóa.]]></value>
</item>
<item name="msg_document_is_admin_not_permitted">
<value xml:lang="ko"><![CDATA[최고관리자의 게시글을 지울 권한이 없습니다.]]></value>
<value xml:lang="en"><![CDATA[You don't have permission to delete the posts of Top Admin.]]></value>
</item>
<item name="move_target_module">
<value xml:lang="ko"><![CDATA[대상 페이지]]></value>
<value xml:lang="en"><![CDATA[Target module ]]></value>
@ -874,4 +878,69 @@
<value xml:lang="jp"><![CDATA[タイトルがないドキュメントです。]]></value>
<value xml:lang="zh-TW"><![CDATA[此文章無標題。]]></value>
</item>
<item name="msg_admin_document_no_move_to_trash">
<value xml:lang="ko"><![CDATA[최고관리자의 게시물을 휴지통으로 이동시킬 권한이 없습니다.]]></value>
</item>
<item name="send_default_message">
<value xml:lang="ko"><![CDATA[기본 쪽지 내용으로 보내기]]></value>
<value xml:lang="en"><![CDATA[Send the default message]]></value>
<value xml:lang="jp"><![CDATA[Send the default message]]></value>
<value xml:lang="zh-CN"><![CDATA[Send the default message]]></value>
<value xml:lang="zh-TW"><![CDATA[Send the default message]]></value>
<value xml:lang="ru"><![CDATA[Send the default message]]></value>
<value xml:lang="tr"><![CDATA[Send the default message]]></value>
<value xml:lang="vi"><![CDATA[Send the default message]]></value>
</item>
<item name="default_message_format">
<value xml:lang="ko"><![CDATA[%1$s님께서 다음 게시물을 %2$s 합니다.]]></value>
<value xml:lang="en"><![CDATA[%1$s %2$s the document below.]]></value>
<value xml:lang="jp"><![CDATA[%1$s %2$s the document below.]]></value>
<value xml:lang="zh-CN"><![CDATA[%1$s %2$s the document below.]]></value>
<value xml:lang="zh-TW"><![CDATA[%1$s %2$s the document below.]]></value>
<value xml:lang="ru"><![CDATA[%1$s %2$s the document below.]]></value>
<value xml:lang="tr"><![CDATA[%1$s %2$s the document below.]]></value>
<value xml:lang="vi"><![CDATA[%1$s %2$s the document below.]]></value>
</item>
<item name="default_message_verbs" type="array">
<item name="move">
<value xml:lang="ko"><![CDATA[이동]]></value>
<value xml:lang="en"><![CDATA[moves]]></value>
<value xml:lang="jp"><![CDATA[moves]]></value>
<value xml:lang="zh-CN"><![CDATA[moves]]></value>
<value xml:lang="zh-TW"><![CDATA[moves]]></value>
<value xml:lang="ru"><![CDATA[moves]]></value>
<value xml:lang="tr"><![CDATA[moves]]></value>
<value xml:lang="vi"><![CDATA[moves]]></value>
</item>
<item name="copy">
<value xml:lang="ko"><![CDATA[복사]]></value>
<value xml:lang="en"><![CDATA[copies]]></value>
<value xml:lang="jp"><![CDATA[copies]]></value>
<value xml:lang="zh-CN"><![CDATA[copies]]></value>
<value xml:lang="zh-TW"><![CDATA[copies]]></value>
<value xml:lang="ru"><![CDATA[copies]]></value>
<value xml:lang="tr"><![CDATA[copies]]></value>
<value xml:lang="vi"><![CDATA[copies]]></value>
</item>
<item name="delete">
<value xml:lang="ko"><![CDATA[삭제]]></value>
<value xml:lang="en"><![CDATA[deletes]]></value>
<value xml:lang="jp"><![CDATA[deletes]]></value>
<value xml:lang="zh-CN"><![CDATA[deletes]]></value>
<value xml:lang="zh-TW"><![CDATA[deletes]]></value>
<value xml:lang="ru"><![CDATA[deletes]]></value>
<value xml:lang="tr"><![CDATA[deletes]]></value>
<value xml:lang="vi"><![CDATA[deletes]]></value>
</item>
<item name="trash">
<value xml:lang="ko"><![CDATA[삭제]]></value>
<value xml:lang="en"><![CDATA[deletes]]></value>
<value xml:lang="jp"><![CDATA[deletes]]></value>
<value xml:lang="zh-CN"><![CDATA[deletes]]></value>
<value xml:lang="zh-TW"><![CDATA[deletes]]></value>
<value xml:lang="ru"><![CDATA[deletes]]></value>
<value xml:lang="tr"><![CDATA[deletes]]></value>
<value xml:lang="vi"><![CDATA[deletes]]></value>
</item>
</item>
</lang>

View file

@ -11,6 +11,6 @@
<condition operation="equal" column="category_srl" var="category_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="document_srl" order="desc" />
<index var="sort_index" default="list_order" order="asc" />
</navigation>
</query>

View file

@ -40,6 +40,7 @@
<label class="x_control-label" for="message_content">{$lang->cmd_send_message}</label>
<div class="x_controls" style="margin-right:14px">
<textarea name="message_content" id="message_content" rows="4" cols="42" style="width:100%"></textarea>
<label for="send_default_message" class="x_inline"><input type="checkbox" name="send_default_message" id="send_default_message" value="Y" checked="checked" /> {$lang->send_default_message}</label>
</div>
</div>
</div>
@ -54,4 +55,20 @@
</span>
</div>
<!--@end-->
</form>
</form>
<script>
jQuery(function($){
var message_content_area = $('#message_content');
if($('#send_default_message').is(':checked'))
{
message_content_area.prop("disabled", true);
}
$('#send_default_message').change(function(){
if($(this).is(':checked')){
message_content_area.prop("disabled", true);
} else {
message_content_area.prop("disabled", false);
}
});
});
</script>

View file

@ -15,7 +15,7 @@ class emoticon extends EditorHandler
/**
* @brief editor_sequence and components out of the path
*/
function emoticon($editor_sequence, $component_path)
function __construct($editor_sequence, $component_path)
{
$this->editor_sequence = $editor_sequence;
$this->component_path = $component_path;

View file

@ -11,5 +11,5 @@
</select>
</div>
</div>
<div id="emoticons" style="height:1px"></div>
<div id="emoticons" style="min-height:1px"></div>
</section>

View file

@ -22,7 +22,20 @@ function completeGetEmoticons(ret_obj) {
for(var i=0;i<emoticons.length;i++) {
html[html.length] = '<img src="./modules/editor/components/emoticon/tpl/images/'+emoticons[i]+'" class="emoticon" />';
}
jQuery('#emoticons').html(html.join('')).find('img.emoticon').click(insertEmoticon);
jQuery('#emoticons').html(html.join('')).find('img.emoticon')
.click(insertEmoticon)
.load(function(){
/* resize popup window for new emoticons loaded, 2015-07-14 by misol */
if(jQuery('section.section').outerHeight(true) != jQuery( window ).height())
{
// more space for y-scroll
var ww = (jQuery('section.section').outerHeight(true) > jQuery( window ).height())? jQuery('section.section').outerWidth(true) + 60 : jQuery('section.section').outerWidth(true) + 30;
// not more than screen height
var wh = (screen.height-100 < jQuery('section.section').outerHeight(true)+100)? screen.height-100 : jQuery('section.section').outerHeight(true)+100;
window.resizeTo(ww, wh);
}
});
}
/**

View file

@ -0,0 +1 @@
jQuery(function(e){function o(e){var o={component:"emoticon",emoticon:e,method:"getEmoticonList"},t="error message emoticons".split(" ");exec_xml("editor","procEditorCall",o,i,t)}function i(e){for(var o=e.emoticons.split("\n"),i=[],n=0;n<o.length;n++)i[i.length]='<img src="./modules/editor/components/emoticon/tpl/images/'+o[n]+'" class="emoticon" />';jQuery("#emoticons").html(i.join("")).find("img.emoticon").click(t).load(function(){if(jQuery("section.section").outerHeight(!0)!=jQuery(window).height()){var e=jQuery("section.section").outerHeight(!0)>jQuery(window).height()?jQuery("section.section").outerWidth(!0)+60:jQuery("section.section").outerWidth(!0)+30,o=screen.height-100<jQuery("section.section").outerHeight(!0)+100?screen.height-100:jQuery("section.section").outerHeight(!0)+100;window.resizeTo(e,o)}})}function t(){var e,o=n?opener:window;if(o)return e='<img src="'+this.src+'" class="emoticon" />',o.editorFocus(o.editorPrevSrl),o.editorRelKeys[o.editorPrevSrl].pasteHTML(e),n&&window.focus(),!1}var n=window._isPoped;o("msn"),e("#selectEmoticonList").change(function(){o(this.value)})});

View file

@ -14,7 +14,7 @@ class image_gallery extends EditorHandler
/**
* @brief editor_sequence and components out of the path
*/
function image_gallery($editor_sequence, $component_path)
function __construct($editor_sequence, $component_path)
{
$this->editor_sequence = $editor_sequence;
$this->component_path = $component_path;

View file

@ -14,7 +14,7 @@ class image_link extends EditorHandler
/**
* @brief editor_sequence and components out of the path
*/
function image_link($editor_sequence, $component_path)
function __construct($editor_sequence, $component_path)
{
$this->editor_sequence = $editor_sequence;
$this->component_path = $component_path;

View file

@ -14,7 +14,7 @@ class poll_maker extends EditorHandler
/**
* @brief editor_sequence and components out of the path
*/
function poll_maker($editor_sequence, $component_path)
function __construct($editor_sequence, $component_path)
{
$this->editor_sequence = $editor_sequence;
$this->component_path = $component_path;

View file

@ -419,6 +419,18 @@
<value xml:lang="tr"><![CDATA[Etkin]]></value>
<value xml:lang="vi"><![CDATA[Hoạt động]]></value>
</item>
<item name="cmd_select_cover">
<value xml:lang="ko"><![CDATA[커버이미지로 선택]]></value>
<value xml:lang="en"><![CDATA[Be a cover image]]></value>
<value xml:lang="jp"><![CDATA[Be a cover image]]></value>
<value xml:lang="zh-CN"><![CDATA[Be a cover image]]></value>
<value xml:lang="zh-TW"><![CDATA[Be a cover image]]></value>
<value xml:lang="fr"><![CDATA[Be a cover image]]></value>
<value xml:lang="ru"><![CDATA[Be a cover image]]></value>
<value xml:lang="es"><![CDATA[Be a cover image]]></value>
<value xml:lang="tr"><![CDATA[Be a cover image]]></value>
<value xml:lang="vi"><![CDATA[Be a cover image]]></value>
</item>
<item name="editor_skin">
<value xml:lang="ko"><![CDATA[에디터 스킨]]></value>
<value xml:lang="en"><![CDATA[Editor Skin]]></value>

View file

@ -0,0 +1 @@
p.editor_autosaved_message.autosave_message {display:none;background: #f6ffdb;padding:6px 10px;margin:0;line-height:1;}

View file

@ -8,6 +8,10 @@
<load target="../../tpl/js/editor.app.js" />
<load target="js/xe_interface.js" />
<script>
var auto_saved_msg = "{$lang->msg_auto_saved}";
</script>
{@ $css_content = null }
<!--@if($content_font || $content_font_size)-->
<!--@if($content_style === 'ckeditor_light')-->{@ $css_content = '.xe_content.editable p { margin: 0;'. chr(125); }<!--@endif-->
@ -23,8 +27,17 @@
{@ $css_content .= chr(125);}
<!--@endif-->
<!--@if($enable_autosave)-->
<input type="hidden" name="_saved_doc_title" value="{htmlspecialchars($saved_doc->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" />
<input type="hidden" name="_saved_doc_content" value="{htmlspecialchars($saved_doc->content, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" />
<input type="hidden" name="_saved_doc_document_srl" value="{$saved_doc->document_srl}" />
<input type="hidden" name="_saved_doc_message" value="{$lang->msg_load_saved_doc}" />
<!--@end-->
<div id="ckeditor_instance_{$editor_sequence}" data-editor-sequence="{$editor_sequence}" data-editor-primary-key-name="{$editor_primary_key_name}" data-editor-content-key-name="{$editor_content_key_name}" style="min-height:{$editor_height}px;"></div>
<p cond="$enable_autosave" class="editor_autosaved_message autosave_message" id="editor_autosaved_message_{$editor_sequence}">&nbsp;</p>
<block cond="$allow_fileupload">
<include target="file_upload.html" />
</block>

View file

@ -44,10 +44,18 @@
</div>
<script>
<script cond="$allow_fileupload">
function reloadUploader(editor_sequence){
jQuery(function($){
var setting = {
maxFileSize: {$file_config->allowed_filesize},
limitMultiFileUploadSize: {$file_config->allowed_filesize}
};
var uploader = $('#xefu-container-' + editor_sequence).xeUploader(setting);
});
}
jQuery(function($){
// uploader
<!--@if($allow_fileupload)-->
var setting = {
maxFileSize: {$file_config->allowed_filesize},
limitMultiFileUploadSize: {$file_config->allowed_filesize}
@ -59,6 +67,5 @@
window.xe.msg_checked_file_is_deleted = '{$lang->msg_checked_file_is_deleted}';
window.xe.msg_not_allowed_filetype = '{$lang->msg_not_allowed_filetype}';
window.xe.msg_file_upload_error = '{$lang->msg_file_upload_error}';
<!--@endif-->
});
</script>

View file

@ -34,7 +34,6 @@ function editorGetContentTextarea(editor_sequence) {
content = content.replace(/>/g, "&gt;");
content = content.replace(/\"/g, "&quot;");
}
content = content.replace(/(\r\n|\n)/g, "<br />");
}
return content;
}

View file

@ -1 +1 @@
function editorStartTextarea(a,b,c){var d=xGetElementById("editor_"+a),e=xGetElementById("htm_"+a).value;d.form.setAttribute("editor_sequence",a),d.style.width="100%",editorRelKeys[a]=new Array,editorRelKeys[a].primary=d.form[c],editorRelKeys[a].content=d.form[b],editorRelKeys[a].func=editorGetContentTextarea;var f=d.form[b].value;e&&(f=f.replace(/<br([^>]*)>/gi,"\n"),"br"!=e&&(f=f.replace(/&lt;/g,"<"),f=f.replace(/&gt;/g,">"),f=f.replace(/&quot;/g,'"'),f=f.replace(/&amp;/g,"&"))),d.value=f}function editorGetContentTextarea(a){var b=xGetElementById("editor_"+a),c=xGetElementById("htm_"+a).value,d=b.value.trim();return c&&("br"!=c&&(d=d.replace(/&/g,"&amp;"),d=d.replace(/</g,"&lt;"),d=d.replace(/>/g,"&gt;"),d=d.replace(/\"/g,"&quot;")),d=d.replace(/(\r\n|\n)/g,"<br />")),d}
function editorStartTextarea(a,b,c){var d=xGetElementById("editor_"+a),e=xGetElementById("htm_"+a).value;d.form.setAttribute("editor_sequence",a),d.style.width="100%",editorRelKeys[a]=new Array,editorRelKeys[a].primary=d.form[c],editorRelKeys[a].content=d.form[b],editorRelKeys[a].func=editorGetContentTextarea;var f=d.form[b].value;e&&(f=f.replace(/<br([^>]*)>/gi,"\n"),"br"!=e&&(f=f.replace(/&lt;/g,"<"),f=f.replace(/&gt;/g,">"),f=f.replace(/&quot;/g,'"'),f=f.replace(/&amp;/g,"&"))),d.value=f}function editorGetContentTextarea(a){var b=xGetElementById("editor_"+a),c=xGetElementById("htm_"+a).value,d=b.value.trim();return c&&("br"!=c&&(d=d.replace(/&/g,"&amp;"),d=d.replace(/</g,"&lt;"),d=d.replace(/>/g,"&gt;"),d=d.replace(/\"/g,"&quot;"))),d}

View file

@ -1,3 +1,23 @@
function getCkFormInstance(editor_sequence)
{
var fo_obj = document.getElementById('ckeditor_instance_' + editor_sequence).parentNode;
while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; }
if(fo_obj.nodeName == 'FORM') return fo_obj;
return;
}
function getAutoSavedSrl(ret_obj, response_tags, c) {
var editor_sequence = ret_obj.editor_sequence;
var primary_key = ret_obj.key;
var fo_obj = getCkFormInstance(editor_sequence);
if(ret_obj.document_srl !== 0)
{
fo_obj[primary_key].value = ret_obj.document_srl;
reloadUploader(editor_sequence);
}
}
(function($){
"use strict";
var default_ckeconfig = {
@ -60,6 +80,8 @@
var $contentField = $form.find(opts.content_field);
var data = $containerEl.data();
var editor_sequence = $containerEl.data().editorSequence;
var primary_key = $containerEl.data().editorPrimaryKeyName;
var fo_obj = getCkFormInstance(editor_sequence);
this.ckeconfig = $.extend({}, default_ckeconfig, opts.ckeconfig || {});
@ -67,6 +89,29 @@
$form.attr('editor_sequence', data.editorSequence);
if(CKEDITOR.env.mobile) CKEDITOR.env.isCompatible = true;
// saved document(자동저장 문서)에 대한 확인
if(typeof(fo_obj._saved_doc_title)!= "undefined") { ///<< _saved_doc_title field가 없으면 자동저장 하지 않음
var saved_title = fo_obj._saved_doc_title.value;
var saved_content = fo_obj._saved_doc_content.value;
if(saved_title || saved_content) {
// 자동저장된 문서 활용여부를 물은 후 사용하지 않는다면 자동저장된 문서 삭제
if(confirm(fo_obj._saved_doc_message.value)) {
if(typeof(fo_obj.title)!='undefined') fo_obj.title.value = saved_title;
$contentField.val(saved_content);
var param = [];
param.editor_sequence = editor_sequence;
param.primary_key = primary_key;
param.mid = current_mid;
var response_tags = new Array("error","message","editor_sequence","key","title","content","document_srl");
exec_xml('editor',"procEditorLoadSavedDocument", param, getAutoSavedSrl, response_tags);
} else {
editorRemoveSavedDoc();
}
}
}
var instance = CKEDITOR.appendTo($containerEl[0], {}, $contentField.val());
@ -109,6 +154,9 @@
window.editorRelKeys[data.editorSequence].pasteHTML = function(text){
instance.insertHtml(text, 'html');
};
// 자동저장 필드가 있다면 자동 저장 기능 활성화
if(typeof(fo_obj._saved_doc_title)!="undefined" ) editorEnableAutoSave(fo_obj, editor_sequence);
},
getContent : function(seq) {
var self = this;

View file

@ -46,6 +46,12 @@ class fileController extends file
$output = $this->insertFile($file_info, $module_srl, $upload_target_srl);
Context::setResponseMethod('JSON');
$this->add('file_srl',$output->get('file_srl'));
$this->add('file_size',$output->get('file_size'));
$this->add('direct_download',$output->get('direct_download'));
$this->add('source_filename',$output->get('source_filename'));
$this->add('download_url',$output->get('uploaded_filename'));
$this->add('upload_target_srl',$output->get('upload_target_srl'));
if($output->error != '0') $this->stop($output->message);
}
@ -263,87 +269,151 @@ class fileController extends file
}
}
}
// Call a trigger (before)
$output = ModuleHandler::triggerCall('file.downloadFile', 'before', $file_obj);
if(!$output->toBool()) return $this->stop(($output->message)?$output->message:'msg_not_permitted_download');
// 다운로드 후 (가상)
// Increase download_count
$args = new stdClass();
$args->file_srl = $file_srl;
executeQuery('file.updateFileDownloadCount', $args);
// Call a trigger (after)
$output = ModuleHandler::triggerCall('file.downloadFile', 'after', $file_obj);
$random = new Password();
$file_key = $_SESSION['__XE_FILE_KEY__'][$file_srl] = $random->createSecureSalt(32, 'hex');
// Redirect to procFileOutput using file key
if(!isset($_SESSION['__XE_FILE_KEY__']) || !is_string($_SESSION['__XE_FILE_KEY__']) || strlen($_SESSION['__XE_FILE_KEY__']) != 32)
{
$random = new Password();
$_SESSION['__XE_FILE_KEY__'] = $random->createSecureSalt(32, 'hex');
}
$file_key_data = $file_obj->file_srl . $file_obj->file_size . $file_obj->uploaded_filename . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'];
$file_key = substr(hash_hmac('sha256', $file_key_data, $_SESSION['__XE_FILE_KEY__']), 0, 32);
header('Location: '.getNotEncodedUrl('', 'act', 'procFileOutput','file_srl',$file_srl,'file_key',$file_key));
Context::close();
exit();
}
public function procFileOutput()
{
// Get requsted file info
$oFileModel = getModel('file');
$file_srl = Context::get('file_srl');
$file_key = Context::get('file_key');
if(strstr($_SERVER['HTTP_USER_AGENT'], "Android")) $is_android = true;
if($is_android && $_SESSION['__XE_FILE_KEY_AND__'][$file_srl]) $session_key = '__XE_FILE_KEY_AND__';
else $session_key = '__XE_FILE_KEY__';
$columnList = array('source_filename', 'uploaded_filename', 'file_size');
$file_obj = $oFileModel->getFile($file_srl, $columnList);
$filesize = $file_obj->file_size;
$filename = $file_obj->source_filename;
$etag = md5($file_srl . $file_key . $_SERVER['HTTP_USER_AGENT']);
$uploaded_filename = $file_obj->uploaded_filename;
if(!file_exists($uploaded_filename)) return $this->stop('msg_file_not_found');
if(!$file_key || $_SESSION[$session_key][$file_srl] != $file_key)
// Check file key
if(strlen($file_key) != 32 || !isset($_SESSION['__XE_FILE_KEY__']) || !is_string($_SESSION['__XE_FILE_KEY__']))
{
unset($_SESSION[$session_key][$file_srl]);
return $this->stop('msg_invalid_request');
}
$file_key_data = $file_srl . $file_obj->file_size . $file_obj->uploaded_filename . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'];
$file_key_compare = substr(hash_hmac('sha256', $file_key_data, $_SESSION['__XE_FILE_KEY__']), 0, 32);
if($file_key !== $file_key_compare)
{
return $this->stop('msg_invalid_request');
}
// Check if file exists
$uploaded_filename = $file_obj->uploaded_filename;
if(!file_exists($uploaded_filename))
{
return $this->stop('msg_file_not_found');
}
$file_size = $file_obj->file_size;
$filename = $file_obj->source_filename;
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE || (strpos($_SERVER['HTTP_USER_AGENT'], 'Windows') !== FALSE && strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE && strpos($_SERVER['HTTP_USER_AGENT'], 'rv:') !== FALSE))
// If client sent an If-None-Match header with the correct ETag, do not download again
if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim(trim($_SERVER['HTTP_IF_NONE_MATCH']), '\'"') === $etag)
{
header('HTTP/1.1 304 Not Modified');
exit();
}
// If client sent an If-Modified-Since header with a recent modification date, do not download again
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) > filemtime($uploaded_filename))
{
header('HTTP/1.1 304 Not Modified');
exit();
}
// Filename encoding for browsers that support RFC 5987
if(preg_match('#(?:Chrome|Edge)/(\d+)\.#', $_SERVER['HTTP_USER_AGENT'], $matches) && $matches[1] >= 11)
{
$filename_param = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"';
}
elseif(preg_match('#(?:Firefox|Safari|Trident)/(\d+)\.#', $_SERVER['HTTP_USER_AGENT'], $matches) && $matches[1] >= 6)
{
$filename_param = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"';
}
// Filename encoding for browsers that do not support RFC 5987
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
{
$filename = rawurlencode($filename);
$filename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1);
$filename_param = 'filename="' . preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1) . '"';
}
if($is_android)
else
{
if($_SESSION['__XE_FILE_KEY__'][$file_srl]) $_SESSION['__XE_FILE_KEY_AND__'][$file_srl] = $file_key;
$filename_param = 'filename="' . $filename . '"';
}
unset($_SESSION[$session_key][$file_srl]);
// Close context to prevent blocking the session
Context::close();
// Open file
$fp = fopen($uploaded_filename, 'rb');
if(!$fp) return $this->stop('msg_file_not_found');
if(!$fp)
{
return $this->stop('msg_file_not_found');
}
header("Cache-Control: ");
// Take care of pause and resume
if(isset($_SERVER['HTTP_RANGE']) && preg_match('/^bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches))
{
$range_start = $matches[1];
$range_end = $matches[2] ? $matches[2] : ($filesize - 1);
$range_length = $range_end - $range_start + 1;
if($range_length < 1 || $range_start < 0 || $range_start >= $filesize || $range_end >= $filesize)
{
header('HTTP/1.1 416 Requested Range Not Satisfiable');
fclose($fp);
exit();
}
fseek($fp, $range_start);
header('HTTP/1.1 206 Partial Content');
header('Content-Range: bytes ' . $range_start . '-' . $range_end . '/' . $filesize);
}
else
{
$range_start = 0;
$range_length = $filesize - $range_start;
}
// Clear buffer
while(ob_get_level()) ob_end_clean();
// Set headers
header("Cache-Control: private; max-age=3600");
header("Pragma: ");
header("Content-Type: application/octet-stream");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-Length: " .(string)($file_size));
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary\n");
header('Content-Disposition: attachment; ' . $filename_param);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $range_length);
header('Accept-Ranges: bytes');
header('Etag: "' . $etag . '"');
// if file size is lager than 10MB, use fread function (#18675748)
if(filesize($uploaded_filename) > 1024 * 1024)
// Print the file contents
for($offset = 0; $offset < $range_length; $offset += 4096)
{
while(!feof($fp)) echo fread($fp, 1024);
fclose($fp);
}
else
{
fpassthru($fp);
$buffer_size = min(4096, $range_length - $offset);
echo fread($fp, $buffer_size);
flush();
}
exit();

View file

@ -96,11 +96,15 @@ class installAdminController extends install
$qmail_compatibility = Context::get('qmail_compatibility');
if($qmail_compatibility!='Y') $qmail_compatibility = 'N';
$cache_friendly = Context::get('cache_friendly');
if($cache_friendly!='Y') $cache_friendly = 'N';
$use_html5 = Context::get('use_html5');
if(!$use_html5) $use_html5 = 'N';
$db_info->default_url = $default_url;
$db_info->qmail_compatibility = $qmail_compatibility;
$db_info->cache_friendly = $cache_friendly;
$db_info->use_db_session = $use_db_session;
$db_info->use_rewrite = $use_rewrite;
$db_info->use_sso = $use_sso;

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="0.2">
<title xml:lang="ko">통합검색</title>
<title xml:lang="zh-CN">综合搜索</title>
<title xml:lang="jp">統合検索</title>
<title xml:lang="en">Integrated Search</title>
<title xml:lang="jp">統合検索</title>
<title xml:lang="zh-CN">集成搜索</title>
<title xml:lang="zh-TW">集成搜索</title>
<title xml:lang="vi">Tìm kiếm tích hợp</title>
<title xml:lang="es">Búsqueda Integrada</title>
<title xml:lang="ru">Интегрируемый поиск</title>
<title xml:lang="zh-TW">綜合搜尋</title>
<title xml:lang="tr">Birleşik Arama</title>
<description xml:lang="ko">
선택한 페이지를 대상으로 통합검색을 지원합니다.

View file

@ -98,6 +98,13 @@ class integration_searchView extends integration_search
if($is_keyword)
{
$oIS = getModel('integration_search');
$oTrackbackModel = getAdminModel('trackback');
Context::set('trackback_module_exist', true);
if(!$oTrackbackModel)
{
Context::set('trackback_module_exist', false);
}
switch($where)
{
case 'document' :

View file

@ -4,8 +4,8 @@
<value xml:lang="ko"><![CDATA[통합검색]]></value>
<value xml:lang="en"><![CDATA[Integrated Search]]></value>
<value xml:lang="jp"><![CDATA[統合検索]]></value>
<value xml:lang="zh-CN"><![CDATA[综合搜索]]></value>
<value xml:lang="zh-TW"><![CDATA[搜尋]]></value>
<value xml:lang="zh-CN"><![CDATA[集成搜索]]></value>
<value xml:lang="zh-TW"><![CDATA[集成搜索]]></value>
<value xml:lang="fr"><![CDATA[Recherche Unie]]></value>
<value xml:lang="ru"><![CDATA[Общий поиск]]></value>
<value xml:lang="es"><![CDATA[Búesqueda Integrada]]></value>
@ -70,9 +70,17 @@
</item>
<item name="msg_not_enabled">
<value xml:lang="ko"><![CDATA[통합 검색을 사용할 수 없습니다.]]></value>
<value xml:lang="en"><![CDATA[The integrated search is not available.]]></value>
<value xml:lang="jp"><![CDATA[統合検索を使用することができません。]]></value>
<value xml:lang="zh-CN"><![CDATA[集成搜索不可用。]]></value>
<value xml:lang="zh-TW"><![CDATA[集成搜索不可用。]]></value>
</item>
<item name="msg_admin_not_enabled">
<value xml:lang="ko"><![CDATA[통합 검색을 사용할 수 없습니다. 통합검색 설정에서 대상 모듈을 선택하세요.]]></value>
<value xml:lang="en"><![CDATA[The integrated search is not available. Please select a target module in integrated search settings.]]></value>
<value xml:lang="jp"><![CDATA[統合検索を使用することができません。統合検索の設定でターゲットモジュールを選択してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[集成搜索不可用。请在集成搜索设置中选择一个目标模块。]]></value>
<value xml:lang="zh-TW"><![CDATA[集成搜索不可用。請在集成搜索設置中選擇一個目標模塊。]]></value>
</item>
<item name="is_result_text">
<value xml:lang="ko"><![CDATA[<strong>'%s'</strong>에 대한 검색결과 <strong>%d</strong>건]]></value>

View file

@ -27,7 +27,7 @@
<li <!--@if(!$where)-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','','page','','division','')}">{$lang->integration_search}</a></li>
<li <!--@if($where=='document')-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','document','page',1,'division','')}">{$lang->document}</a></li>
<li <!--@if($where=='comment')-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','comment','page',1,'division','')}">{$lang->comment}</a></li>
<li <!--@if($where=='trackback')-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','trackback','page',1,'division','')}">{$lang->trackback}</a></li>
<li cond="$trackback_module_exist" <!--@if($where=='trackback')-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','trackback','page',1,'division','')}">{$lang->trackback}</a></li>
<li <!--@if($where=='multimedia')-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','multimedia','page',1,'division','')}">{$lang->multimedia}</a></li>
<li <!--@if($where=='file')-->class="on"<!--@end-->><a href="{getAutoEncodedUrl('where','file','page',1,'division','')}">{$lang->file}</a></li>
</ul>

View file

@ -12,11 +12,13 @@
<div class="isMore"><a href="{getAutoEncodedUrl('where','comment','page',1)}">more</a></div>
<!--@end-->
{@ $output = $search_result['trackback'] }
{@ $search_target = 'title'; }
<!--#include("trackback.html")-->
<!--@if(count($output->data))-->
<div class="isMore"><a href="{getAutoEncodedUrl('where','trackback','page',1)}">more</a></div>
<!--@if($trackback_module_exist)-->
{@ $output = $search_result['trackback'] }
{@ $search_target = 'title'; }
<!--#include("trackback.html")-->
<!--@if(count($output->data))-->
<div class="isMore"><a href="{getAutoEncodedUrl('where','trackback','page',1)}">more</a></div>
<!--@end-->
<!--@end-->
{@ $output = $search_result['multimedia'] }

View file

@ -3,39 +3,39 @@
<h3 class="subTitle">{$lang->trackback} <span>({number_format($output->total_count)})</span></h3>
<ul class="subNavigation">
<!--@foreach($lang->is_search_option['trackback'] as $key => $val)-->
<li value="{$key}" class="<!--@if($search_target == $key)-->on<!--@end--><!--@if($key=="tag")--> last<!--@end-->"><a href="{getUrl('where','trackback','search_target',$key,'page',1)}">{$val}</a></li>
<!--@end-->
<!--@foreach($lang->is_search_option['trackback'] as $key => $val)-->
<li value="{$key}" class="<!--@if($search_target == $key)-->on<!--@end--><!--@if($key=="tag")--> last<!--@end-->"><a href="{getUrl('where','trackback','search_target',$key,'page',1)}">{$val}</a></li>
<!--@end-->
</ul>
<!--@if(!count($output->data))-->
<span class="noResult">{$lang->msg_no_result}</span>
<span class="noResult">{$lang->msg_no_result}</span>
<!--@else-->
<ul class="searchResult">
<!--@foreach($output->data as $no => $trackback)-->
<li>
<dl>
<dt><a href="{getUrl('','document_srl',$trackback->document_srl)}" onclick="window.open(this.href);return false;">{htmlspecialchars($trackback->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}</a> </span></dt>
<dd>{cut_str(htmlspecialchars($trackback->excerpt, ENT_COMPAT | ENT_HTML401, 'UTF-8', false))}</dd>
</dl>
<address><strong><a href="{$trackback->url}">{htmlspecialchars($trackback->blog_name, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}</a></strong> | <span class="time">{zdate($trackback->regdate, "Y-m-d H:i")}</span> </address>
<ul class="searchResult">
<!--@foreach($output->data as $no => $trackback)-->
<li>
<dl>
<dt><a href="{getUrl('','document_srl',$trackback->document_srl)}" onclick="window.open(this.href);return false;">{htmlspecialchars($trackback->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}</a> </span></dt>
<dd>{cut_str(htmlspecialchars($trackback->excerpt, ENT_COMPAT | ENT_HTML401, 'UTF-8', false))}</dd>
</dl>
<address><strong><a href="{$trackback->url}">{htmlspecialchars($trackback->blog_name, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}</a></strong> | <span class="time">{zdate($trackback->regdate, "Y-m-d H:i")}</span> </address>
</li>
<!--@end-->
</ul>
</li>
<!--@end-->
</ul>
<!--@if($where == 'trackback' && $output->page_navigation)-->
<div class="pagination a1">
<a href="{getUrl('page','')}" class="prevEnd">{$lang->first_page}</a>
<!--@while($page_no = $output->page_navigation->getNextPage())-->
<!--@if($page == $page_no)-->
<strong>{$page_no}</strong>
<!--@else-->
<a href="{getUrl('page',$page_no)}">{$page_no}</a>
<!--@end-->
<!--@end-->
<a href="{getUrl('page',$output->page_navigation->last_page)}" class="nextEnd">{$lang->last_page}</a>
</div>
<!--@end-->
<!--@if($where == 'trackback' && $output->page_navigation)-->
<div class="pagination a1">
<a href="{getUrl('page','')}" class="prevEnd">{$lang->first_page}</a>
<!--@while($page_no = $output->page_navigation->getNextPage())-->
<!--@if($page == $page_no)-->
<strong>{$page_no}</strong>
<!--@else-->
<a href="{getUrl('page',$page_no)}">{$page_no}</a>
<!--@end-->
<!--@end-->
<a href="{getUrl('page',$output->page_navigation->last_page)}" class="nextEnd">{$lang->last_page}</a>
</div>
<!--@end-->
<!--@end-->

View file

@ -83,6 +83,7 @@
<action name="procMemberAdminDeleteMembers" type="controller" />
<action name="procMemberAdminInsertJoinForm" type="controller" ruleset="insertJoinForm" />
<action name="procMemberAdminUpdateJoinForm" type="controller" />
<action name="procMemberAdminUpdateManagedEmailHosts" type="controller" />
<action name="procMemberAdminDeleteJoinForm" type="controller" />
<action name="procMemberAdminUpdateDeniedNickName" type="controller" />
<action name="procMemberAdminInsertDeniedID" type="controller" ruleset="insertDeniedId" />

View file

@ -143,6 +143,22 @@
<value xml:lang="jp"><![CDATA[使用が禁止されたニックネームです。]]></value>
<value xml:lang="zh-CN"><![CDATA[被禁止的昵称。]]></value>
</item>
<item name="managed_email_host" type="array">
<item name="allowed">
<value xml:lang="ko"><![CDATA[%s 사이트 이메일 계정만 사용할 수 있습니다. (%s)]]></value>
<value xml:lang="en"><![CDATA[Only %s e-mail accounts are allowed. (%s)]]></value>
<value xml:lang="jp"><![CDATA[Only %s e-mail accounts are allowed. (%s)]]></value>
<value xml:lang="zh-CN"><![CDATA[Only %s e-mail accounts are allowed. (%s)]]></value>
<value xml:lang="zh-TW"><![CDATA[Only %s e-mail accounts are allowed. (%s)]]></value>
</item>
<item name="prohibited">
<value xml:lang="ko"><![CDATA[%s 사이트 이메일 계정은 사용할 수 없습니다. (%s)]]></value>
<value xml:lang="en"><![CDATA[E-mail accounts at %s are not allowed. (%s)]]></value>
<value xml:lang="jp"><![CDATA[E-mail accounts at %s are not allowed. (%s)]]></value>
<value xml:lang="zh-CN"><![CDATA[E-mail accounts at %s are not allowed. (%s)]]></value>
<value xml:lang="zh-TW"><![CDATA[E-mail accounts at %s are not allowed. (%s)]]></value>
</item>
</item>
<item name="null_user_id">
<value xml:lang="ko"><![CDATA[회원 아이디를 입력해주세요.]]></value>
<value xml:lang="en"><![CDATA[Please enter your ID.]]></value>
@ -475,6 +491,17 @@
<value xml:lang="tr"><![CDATA[E-posta Doğrulaması]]></value>
<value xml:lang="vi"><![CDATA[Xác nhận qua Email]]></value>
</item>
<item name="enable_find_account_question">
<value xml:lang="ko"><![CDATA[질문/답변 인증 사용]]></value>
<value xml:lang="en"><![CDATA[Account recovery using question/answer]]></value>
<value xml:lang="jp"><![CDATA[秘密質問/回答認証を使用]]></value>
<value xml:lang="zh-CN"><![CDATA[使用问题/答案认证]]></value>
<value xml:lang="zh-TW"><![CDATA[使用問題/答案認證]]></value>
<value xml:lang="fr"><![CDATA[Utiliser Authentification par question et réponse]]></value>
<value xml:lang="ru"><![CDATA[Активация по вопроса и ответа]]></value>
<value xml:lang="tr"><![CDATA[Soru ve cevap ile kimlik doğrulamasını kullanmak]]></value>
<value xml:lang="vi"><![CDATA[Xác nhận qua câu hỏi và câu trả lời]]></value>
</item>
<item name="enable_ssl">
<value xml:lang="ko"><![CDATA[SSL 기능 사용]]></value>
<value xml:lang="en"><![CDATA[Enable SSL]]></value>
@ -514,7 +541,6 @@
<value xml:lang="en"><![CDATA[Description for Temporary Limit Date]]></value>
<value xml:lang="jp"><![CDATA[一時的な期限日の説明]]></value>
</item>
<item name="limit_date">
<value xml:lang="ko"><![CDATA[제한일]]></value>
<value xml:lang="en"><![CDATA[Limit Date]]></value>
@ -1094,6 +1120,18 @@
<value xml:lang="tr"><![CDATA[Yasaklanmış Kimlikler]]></value>
<value xml:lang="vi"><![CDATA[Tên sử dụng cấm đăng kí]]></value>
</item>
<item name="cmd_manage_email_host">
<value xml:lang="ko"><![CDATA[이메일 제공자 관리]]></value>
<value xml:lang="en"><![CDATA[E-mail provider check]]></value>
<value xml:lang="jp"><![CDATA[E-mail provider check]]></value>
<value xml:lang="zh-CN"><![CDATA[E-mail provider check]]></value>
<value xml:lang="zh-TW"><![CDATA[E-mail provider check]]></value>
<value xml:lang="fr"><![CDATA[E-mail provider check]]></value>
<value xml:lang="ru"><![CDATA[E-mail provider check]]></value>
<value xml:lang="es"><![CDATA[E-mail provider check]]></value>
<value xml:lang="tr"><![CDATA[E-mail provider check]]></value>
<value xml:lang="vi"><![CDATA[E-mail provider check]]></value>
</item>
<item name="cmd_manage_nick_name">
<value xml:lang="ko"><![CDATA[금지 닉네임 관리]]></value>
<value xml:lang="en"><![CDATA[Prohibited NickNames]]></value>
@ -1962,6 +2000,13 @@
<value xml:lang="tr"><![CDATA[Kayıt formunu gösterebilmeniz için, öğeleri etkinleştirdiğinizden emin olun]]></value>
<value xml:lang="vi"><![CDATA[Nếu chọn, thông tin này sẽ được hiển thị trong bảng đăng kí.]]></value>
</item>
<item name="about_emailhost_check">
<value xml:lang="ko"><![CDATA[입력한 호스트네임이 없으면, 이 기능을 사용하지 않습니다. 가입자의 이메일 주소 제공자를 설정할 수 있습니다.<br />특정 이메일 제공자(hostname, 예: naver.com, gmail.com)만 허용하거나, 특정 이메일 제공자의 사용을 제한할 수 있습니다.]]></value>
<value xml:lang="en"><![CDATA[Empty value will allow almost all email account providers.<br />You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]></value>
<value xml:lang="jp"><![CDATA[Empty value will allow almost all email account providers.<br />You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]></value>
<value xml:lang="zh-TW"><![CDATA[Empty value will allow almost all email account providers.<br />You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]></value>
<value xml:lang="zh-CN"><![CDATA[Empty value will allow almost all email account providers.<br />You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]></value>
</item>
<item name="about_form_description">
<value xml:lang="ko"><![CDATA[설명란에 입력을 하면 가입시 표시가 됩니다.]]></value>
<value xml:lang="en"><![CDATA[If you enter description in this form, it will be displayed on join form.]]></value>
@ -2009,6 +2054,17 @@
<value xml:lang="tr"><![CDATA[Yeni üyelerin hesaplarını e-posta yoluyla etkinleştirmelerini istiyorsanız lütfen işaretleyiniz.]]></value>
<value xml:lang="vi"><![CDATA[Gửi Email xác nhận sau khi đăng kí.]]></value>
</item>
<item name="about_enable_find_account_question">
<value xml:lang="ko"><![CDATA[질문/답변을 통한 비밀번호 찾기를 허용합니다. 허용하지 않을 경우 메일을 통한 비밀번호 리셋만 허용됩니다.]]></value>
<value xml:lang="en"><![CDATA[Check if you want to allow members to recover their accounts using a security question and answer.]]></value>
<value xml:lang="jp"><![CDATA[質問/回答を通じたパスワードを忘れたを許可します。許可しない場合は、メールを介してリセットのみが許可されます。]]></value>
<value xml:lang="zh-CN"><![CDATA[允许使用成员答问恢复帐户。如果不允许,会员可以通过电子邮件恢复。]]></value>
<value xml:lang="zh-TW"><![CDATA[允許使用成員答問恢復帳戶。如果不允許,會員可以通過電子郵件恢復。]]></value>
<value xml:lang="fr"><![CDATA[Vérifiez si vous voulez permettre aux membres de récupérer leurs comptes en utilisant une question et réponse de sécurité.]]></value>
<value xml:lang="es"><![CDATA[Compruebe si desea permitir a los miembros a recuperar sus cuentas utilizando una pregunta y respuesta de seguridad.]]></value>
<value xml:lang="tr"><![CDATA[Eğer üye bir güvenlik sorusu ve cevabı kullanarak hesaplarını kurtarmak için izin istiyorum kontrol edin.]]></value>
<value xml:lang="vi"><![CDATA[Kiểm tra nếu bạn muốn cho phép các thành viên để phục hồi tài khoản của họ bằng cách sử dụng một câu hỏi bảo mật và câu trả lời.]]></value>
</item>
<item name="about_enable_ssl">
<value xml:lang="ko"><![CDATA[서버에서 보안접속(SSL) 지원이 될 경우 회원가입, 정보수정, 로그인 등의 개인정보가 서버로 보내질 때 SSL(https)을 이용하도록 할 수 있습니다.]]></value>
<value xml:lang="en"><![CDATA[Personal information from Sign up/Modify Member Info/Sign in can be sent as SSL(https) mode if server provides SSL service.]]></value>
@ -2356,6 +2412,14 @@
<value xml:lang="zh-CN"><![CDATA[请登录后更改密码。]]></value>
<value xml:lang="tr"><![CDATA[Giriş yaptıktan sonra şifrenizi değiştirin.]]></value>
</item>
<item name="msg_question_not_allowed">
<value xml:lang="ko"><![CDATA[질문/답변을 통한 비밀번호 찾기는 허용되지 않습니다.]]></value>
<value xml:lang="en"><![CDATA[The administrator has disabled this function.]]></value>
<value xml:lang="jp"><![CDATA[質問/回答を通じたパスワードを忘れたことはできません。]]></value>
<value xml:lang="zh-TW"><![CDATA[问题/通过回答密码是不允许的。]]></value>
<value xml:lang="zh-CN"><![CDATA[問題/通過回答密碼是不允許的。]]></value>
<value xml:lang="tr"><![CDATA[Sorular / Cevaplar aracılığıyla Şifre izin verilmez.]]></value>
</item>
<item name="msg_question_not_exists">
<value xml:lang="ko"><![CDATA[등록한 비밀번호 찾기 질문/답변이 없습니다.]]></value>
<value xml:lang="en"><![CDATA[You haven`t set your question for a temporary password.]]></value>
@ -2469,6 +2533,20 @@
<value xml:lang="zh-TW"><![CDATA[向此會員發送通知信]]></value>
<value xml:lang="zh-CN"><![CDATA[给此会员发送短消息]]></value>
</item>
<item name="cmd_allowed">
<value xml:lang="ko"><![CDATA[허가]]></value>
<value xml:lang="en"><![CDATA[Allowed]]></value>
<value xml:lang="jp"><![CDATA[Allowed]]></value>
<value xml:lang="zh-TW"><![CDATA[Allowed]]></value>
<value xml:lang="zh-CN"><![CDATA[Allowed]]></value>
</item>
<item name="cmd_prohibited">
<value xml:lang="ko"><![CDATA[제한]]></value>
<value xml:lang="en"><![CDATA[Prohibited]]></value>
<value xml:lang="jp"><![CDATA[Prohibited]]></value>
<value xml:lang="zh-TW"><![CDATA[Prohibited]]></value>
<value xml:lang="zh-CN"><![CDATA[Prohibited]]></value>
</item>
<item name="cmd_required">
<value xml:lang="ko"><![CDATA[필수]]></value>
<value xml:lang="en"><![CDATA[Required]]></value>
@ -2525,6 +2603,13 @@
<value xml:lang="zh-TW"><![CDATA[換行區隔]]></value>
<value xml:lang="zh-CN"><![CDATA[用换行区分]]></value>
</item>
<item name="count_manage_email_host">
<value xml:lang="ko"><![CDATA[다음 <span class="_managededEmailHostCount">%s</span>개의 이메일 주소 제공자를 <span id="managededEmailHostType">%s</span> 합니다.]]></value>
<value xml:lang="en"><![CDATA[There are <span class="_managededEmailHostCount">%s</span> <span id="managededEmailHostType">%s</span> e-mail address providers below.]]></value>
<value xml:lang="jp"><![CDATA[There are <span class="_managededEmailHostCount">%s</span> <span id="managededEmailHostType">%s</span> e-mail address providers below.]]></value>
<value xml:lang="zh-TW"><![CDATA[There are <span class="_managededEmailHostCount">%s</span> <span id="managededEmailHostType">%s</span> e-mail address providers below.]]></value>
<value xml:lang="zh-CN"><![CDATA[There are <span class="_managededEmailHostCount">%s</span> <span id="managededEmailHostType">%s</span> e-mail address providers below.]]></value>
</item>
<item name="count_manage_id">
<value xml:lang="ko"><![CDATA[<span class="_deniedIDCount">%s</span>개의 금지 아이디가 있습니다.]]></value>
<value xml:lang="en"><![CDATA[There are <span class="_deniedIDCount">%s</span> prohibited ID.]]></value>
@ -2629,6 +2714,13 @@
<value xml:lang="zh-TW"><![CDATA[電子郵件]]></value>
<value xml:lang="zh-CN"><![CDATA[电子邮件]]></value>
</item>
<item name="add_managed_emailhost">
<value xml:lang="ko"><![CDATA[이메일 제공자 추가]]></value>
<value xml:lang="en"><![CDATA[Add E-mail Host]]></value>
<value xml:lang="jp"><![CDATA[Add E-mail Host]]></value>
<value xml:lang="zh-TW"><![CDATA[Add E-mail Host]]></value>
<value xml:lang="zh-CN"><![CDATA[Add E-mail Host]]></value>
</item>
<item name="add_prohibited_id">
<value xml:lang="ko"><![CDATA[금지 아이디 추가]]></value>
<value xml:lang="en"><![CDATA[Add prohibited id]]></value>
@ -2662,6 +2754,13 @@
<value xml:lang="jp"><![CDATA[追加するニックネームを入力してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[请输入禁止昵称]]></value>
</item>
<item name="msg_null_managed_emailhost">
<value xml:lang="ko"><![CDATA[추가할 금지 이메일 주소 제공자를 입력해주세요. (예: naver.com)]]></value>
<value xml:lang="en"><![CDATA[Please enter email address providers to manage. (eg.: gmail.com)]]></value>
<value xml:lang="jp"><![CDATA[Please enter email address providers to manage. (eg.: gmail.com)]]></value>
<value xml:lang="zh-CN"><![CDATA[Please enter email address providers to manage. (eg.: gmail.com)]]></value>
<value xml:lang="zh-TW"><![CDATA[Please enter email address providers to manage. (eg.: gmail.com)]]></value>
</item>
<item name="identifier">
<value xml:lang="ko"><![CDATA[로그인 계정]]></value>
<value xml:lang="en"><![CDATA[Login Account]]></value>

View file

@ -0,0 +1 @@
</section>

View file

@ -0,0 +1,9 @@
<load target="css/member.css" />
<section class="xm">
<div class="mtab" cond="$is_logged && $logged_info->menu_list && (!$member_srl || $member_srl == $logged_info->member_srl)">
<ul class="mtab">
<li loop="$logged_info->menu_list=>$key,$val" class="active"|cond="$key==$act">
<a href="{getUrl('', 'act',$key, 'mid', $mid, 'vid', $vid)}"><span>{Context::getLang($val)}</span></a>
</li>
</ul>
</div>

View file

@ -31,4 +31,63 @@
.xm .ba li:first-child{border:0}
.xm .ba li>a,
.xm .ba li>button,
.xm .ba li>input{display:block;white-space:nowrap;padding:7px 10px;text-decoration:none;color:#000;background:#f4f4f4;text-shadow:0 1px 0 #fff;overflow:hidden;text-overflow:ellipsis}
.xm .ba li>input{display:block;white-space:nowrap;padding:7px 10px;text-decoration:none;color:#000;background:#f4f4f4;text-shadow:0 1px 0 #fff;overflow:hidden;text-overflow:ellipsis}
/* List */
.lt{margin:0;padding:0;list-style:none;background:#f8f8f8;font-size:14px}
.lt li{border-bottom:1px solid #ccc8be;overflow:hidden}
.lt a{box-sizing: border-box;width:100%;display:inline-block;float:left;text-decoration:none;color:#000;padding:10px}
.lt .memberInfo{float:right;}
.lt .notice{display:inline-block;background:#a06acd;font-weight:bold;color:#fff;font-size:12px;padding:1px;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px}
.lt .title{display:block;margin:0 0 5px 0}
.lt .title strong{font-size:14px;font-weight:bold}
.lt .title em{font-size:12px;color:#333;color:#6352d2}
.lt .auth{display:block;font-size:12px}
.lt .auth .time{padding:0 5px;border-left:1px solid #bfbfbf}
/* Pagination */
.pn{font-size:12px;text-align:center;background:#f2f0ec;padding:15px 0;border-top:1px solid #fff}
.pn a{color:#333;text-decoration:none}
.pn strong{margin:0 10px}
.pn .prev:before{content:"";display:inline-block;width:0;height:0;margin:0 4px 0 0;border:4px solid;border-color:transparent;border-right-color:#999}
.pn .next:after{content:"";display:inline-block;width:0;height:0;margin:0 0 0 4px;border:4px solid;border-color:transparent;border-left-color:#999}
/* MemberMenu */
.xm div.mtab{
overflow: hidden;
width:100%;
height: 52px;
white-space: nowrap;
border-bottom: 1px solid #e0e0e0;
box-sizing: border-box;
}
.xm ul.mtab{
display: block;
list-style: outside none none;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
padding: 6px 0px 100px;
text-decoration: none;
margin: 0;
}
.xm ul.mtab>li {
display:inline-block;
height: 40px;
line-height: 18px;
position: relative;
}
.xm ul.mtab>li a {
display:inline-block;
color: #000;
font-weight: 400;
letter-spacing: -1px;
line-height: 40px;
text-decoration: none;
}
.xm ul.mtab>li a:hover, .xm ul.mtab>li.active a {
font-weight: 700;
}
.xm ul.mtab>li a span {
border-left: 1px solid #e0e0e0;
padding: 0 15px;
}
.xm ul.mtab>li:first-child a span {
border-left: 0 none;
}

View file

@ -0,0 +1,18 @@
<include target="./common_header.html" />
<div class="xm">
<h2 class="hx h2">{$member_title = $lang->cmd_view_own_document}</h2>
<ul class="lt">
<li loop="$document_list => $no,$oDocument">
<a href="{getUrl('','document_srl',$oDocument->document_srl)}" onclick="window.open(this.href);return false;">
{$oDocument->getTitleText()}
<span class="memberInfo">{$oDocument->getRegdate("Y-m-d")}</span>
</a>
</li>
</ul>
<div class="pn">
<a cond="$page != 1" href="{getUrl('page',$page-1,'module_srl','','document_srl','')}" class="prev">{$lang->cmd_prev}</a>
<strong>{$page} / {$page_navigation->last_page}</strong>
<a cond="$page != $page_navigation->last_page" href="{getUrl('page',$page+1,'module_srl','','document_srl','')}" class="next">{$lang->cmd_next}</a>
</div>
</div>
<include target="./common_footer.html" />

View file

@ -1,35 +1,36 @@
<load target="css/member.css" />
<include target="./common_header.html" />
<div class="xm">
<h2 class="hx h2">{$lang->member_info}</h2>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/default/modify_info/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="table even">
<table class="table table-striped table-hover">
<tr loop="$displayDatas => $item">
<th scope="row" >{$item->title} <em cond="$item->required || $item->mustRequired">*</em></th>
<td class="text">{$item->value}</td>
</tr>
<tr>
<th scope="row">{$lang->member_group}</th>
<td class="text">{implode(', ', $memberInfo['group_list'])}</td>
</tr>
<tr>
<th>{$lang->signup_date}</th>
<td>{zdate($memberInfo[regdate],"Y-m-d")}</td>
</tr>
<!--@if($memberInfo[member_srl] == $logged_info->member_srl || $logged_info->is_admin == 'Y' )-->
<tr>
<th>{$lang->last_login}</th>
<td>{zdate($memberInfo[last_login],"Y-m-d")}</td>
</tr>
<!--@end-->
</table>
</div>
<div class="ba" cond="$memberInfo['member_srl'] == $logged_info->member_srl">
<li><a class="bn" cond="$member_config->identifier == 'email_address'" href="{getUrl('act', 'dispMemberModifyEmailAddress')}">{$lang->cmd_modify_member_email_address}...</a></li>
<li><a class="bn" href="{getUrl('act','dispMemberModifyInfo','member_srl','')}">{$lang->cmd_modify_member_info}...</a></li>
<li><a class="bn" href="{getUrl('act','dispMemberModifyPassword','member_srl','')}">{$lang->cmd_modify_member_password}...</a></li>
<li><a class="bn" href="{getUrl('act','dispMemberLeave','member_srl','')}">{$lang->cmd_leave}...</a></li>
</div>
<h2 class="hx h2">{$lang->member_info}</h2>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/default/modify_info/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="table even">
<table class="table table-striped table-hover">
<tr loop="$displayDatas => $item">
<th scope="row" >{$item->title} <em cond="$item->required || $item->mustRequired">*</em></th>
<td class="text">{$item->value}</td>
</tr>
<tr>
<th scope="row">{$lang->member_group}</th>
<td class="text">{implode(', ', $memberInfo['group_list'])}</td>
</tr>
<tr>
<th>{$lang->signup_date}</th>
<td>{zdate($memberInfo[regdate],"Y-m-d")}</td>
</tr>
<!--@if($memberInfo[member_srl] == $logged_info->member_srl || $logged_info->is_admin == 'Y' )-->
<tr>
<th>{$lang->last_login}</th>
<td>{zdate($memberInfo[last_login],"Y-m-d")}</td>
</tr>
<!--@end-->
</table>
</div>
<div class="ba" cond="$memberInfo['member_srl'] == $logged_info->member_srl">
<li><a class="bn" cond="$member_config->identifier == 'email_address'" href="{getUrl('act', 'dispMemberModifyEmailAddress')}">{$lang->cmd_modify_member_email_address}...</a></li>
<li><a class="bn" href="{getUrl('act','dispMemberModifyInfo','member_srl','')}">{$lang->cmd_modify_member_info}...</a></li>
<li><a class="bn" href="{getUrl('act','dispMemberModifyPassword','member_srl','')}">{$lang->cmd_modify_member_password}...</a></li>
<li><a class="bn" href="{getUrl('act','dispMemberLeave','member_srl','')}">{$lang->cmd_leave}...</a></li>
</div>
</div>
<include target="./common_footer.html" />

View file

@ -0,0 +1,18 @@
<include target="./common_header.html" />
<div class="xm">
<h2 class="hx h2">{$member_title = $lang->cmd_view_saved_document}</h2>
<ul class="lt">
<li loop="$document_list=>$no,$val">
<a href="{getUrl('','document_srl',$val->document_srl)}" onclick="window.open(this.href);return false;">
{$val->getTitle()}
<span class="memberInfo">{$val->getRegdate("Y-m-d")}</span>
</a>
</li>
</ul>
<div class="pn">
<a cond="$page != 1" href="{getUrl('page',$page-1,'module_srl','','document_srl','')}" class="prev">{$lang->cmd_prev}</a>
<strong>{$page} / {$page_navigation->last_page}</strong>
<a cond="$page != $page_navigation->last_page" href="{getUrl('page',$page+1,'module_srl','','document_srl','')}" class="next">{$lang->cmd_next}</a>
</div>
</div>
<include target="./common_footer.html" />

View file

@ -0,0 +1,18 @@
<include target="./common_header.html" />
<div class="xm">
<h2 class="hx h2">{$member_title = $lang->cmd_view_scrapped_document}</h2>
<ul class="lt">
<li loop="$document_list=>$no,$val">
<a href="{getUrl('','document_srl',$val->document_srl)}" onclick="window.open(this.href);return false;">
{htmlspecialchars($val->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}
<span class="memberInfo">{$val->nick_name} ({zdate($val->regdate,"Y-m-d")})</span>
</a>
</li>
</ul>
<div class="pn">
<a cond="$page != 1" href="{getUrl('page',$page-1,'module_srl','','document_srl','')}" class="prev">{$lang->cmd_prev}</a>
<strong>{$page} / {$page_navigation->last_page}</strong>
<a cond="$page != $page_navigation->last_page" href="{getUrl('page',$page+1,'module_srl','','document_srl','')}" class="next">{$lang->cmd_next}</a>
</div>
</div>
<include target="./common_footer.html" />

View file

@ -156,6 +156,7 @@ class memberAdminController extends member
$args = Context::gets(
'enable_join',
'enable_confirm',
'enable_find_account_question',
'webmaster_name',
'webmaster_email',
'password_strength',
@ -207,6 +208,7 @@ class memberAdminController extends member
$args = Context::gets(
'limit_day',
'limit_day_description',
'emailhost_check',
'agreement',
'redirect_url',
'profile_image', 'profile_image_max_width', 'profile_image_max_height',
@ -220,6 +222,7 @@ class memberAdminController extends member
$all_args = Context::getRequestVars();
$args->limit_day = (int)$args->limit_day;
if($args->emailhost_check != 'allowed' && $args->emailhost_check != 'prohibited') $args->emailhost_check == 'allowed';
if(!trim(strip_tags($args->agreement)))
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt';
@ -237,7 +240,8 @@ class memberAdminController extends member
return new Object('-1', 'msg_exist_selected_module');
}
$args->redirect_url = Context::getDefaultUrl().$redirectModuleInfo->mid;
$args->redirect_mid = $redirectModuleInfo->mid;
$args->redirect_url = getNotEncodedFullUrl('','mid',$redirectModuleInfo->mid);
}
$args->profile_image = $args->profile_image ? 'Y' : 'N';
@ -254,7 +258,7 @@ class memberAdminController extends member
global $lang;
$signupForm = array();
$items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark', 'profile_image_max_width', 'profile_image_max_height', 'image_name_max_width', 'image_name_max_height', 'image_mark_max_width', 'image_mark_max_height');
$mustRequireds = array('email_address', 'nick_name', 'password', 'find_account_question');
$mustRequireds = array('email_address', 'nick_name', 'password');
$extendItems = $oMemberModel->getJoinFormList();
foreach($list_order as $key)
{
@ -408,9 +412,9 @@ class memberAdminController extends member
$extendItems = $oMemberModel->getJoinFormList();
$items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark');
$mustRequireds = array('email_address', 'nick_name','password', 'find_account_question');
$orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name');
$orgUse = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday');
$mustRequireds = array('email_address', 'nick_name', 'password');
$orgRequireds = array('email_address', 'password', 'user_id', 'nick_name', 'user_name');
$orgUse = array('email_address', 'password', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday');
$list_order = array();
foreach($items as $key)
@ -497,7 +501,7 @@ class memberAdminController extends member
}
else if($formInfo->name == 'password')
{
$fields[] = '<field name="password"><if test="$act == \'procMemberInsert\'" attr="required" value="true" /><if test="$act == \'procMemberInsert\'" attr="length" value="4:20" /></field>';
$fields[] = '<field name="password"><if test="$act == \'procMemberInsert\'" attr="required" value="true" /><if test="$act == \'procMemberInsert\'" attr="length" value="4:60" /></field>';
$fields[] = '<field name="password2"><if test="$act == \'procMemberInsert\'" attr="required" value="true" /><if test="$act == \'procMemberInsert\'" attr="equalto" value="password" /></field>';
}
else if($formInfo->name == 'find_account_question')
@ -862,6 +866,17 @@ class memberAdminController extends member
$this->setMessage('success_updated');
break;
}
case 'spam':
{
$output = $this->spammerManage($member_srl);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
$this->setMessage('success_deleted');
break;
}
case 'delete':
{
$oMemberController->memberInfo = null;
@ -1015,6 +1030,44 @@ class memberAdminController extends member
$this->setRedirectUrl($returnUrl);
}
/**
* Add allowed or denied email hostnames
* @return void
*/
function procMemberAdminUpdateManagedEmailHosts()
{
$email_hosts = Context::get('email_hosts');
$mode = Context::get('mode');
$mode = $mode ? $mode : 'insert';
if($mode == 'delete')
{
$output = $this->deleteManagedEmailHost($email_hosts);
if(!$output->toBool())
{
return $output;
}
$msg_code = 'success_deleted';
$this->setMessage($msg_code);
}
else
{
$email_hosts = preg_replace('/([^a-z0-9\.\-\_\n]*)/i','',$email_hosts);
$email_hosts = array_unique(explode("\n",$email_hosts."\n"));
$success_email_hosts = array();
foreach($email_hosts as $val)
{
$val = trim($val);
if(!$val) continue;
$output = $this->insertManagedEmailHost($val, '');
if($output->toBool()) $success_email_hosts[] = $val;
}
$this->add('email_hosts', implode("\n",$success_email_hosts));
}
}
/**
* Add a denied nick name
* @return void
@ -1320,6 +1373,21 @@ class memberAdminController extends member
return executeQuery('member.insertDeniedNickName', $args);
}
/**
* Register managed Email Hostname
* @param string $email_host
* @param string $description
* @return Object
*/
function insertManagedEmailHost($email_host, $description = '')
{
$args = new stdClass();
$args->email_host = trim(strtolower($email_host));
$args->description = $description;
return executeQuery('member.insertManagedEmailHost', $args);
}
/**
* delete a denied id
* @param string $user_id
@ -1348,6 +1416,18 @@ class memberAdminController extends member
return executeQuery('member.deleteDeniedNickName', $args);
}
/**
* delete a denied nick name
* @param string $email_host
* @return object
*/
function deleteManagedEmailHost($email_host)
{
$args = new stdClass();
$args->email_host = $email_host;
return executeQuery('member.deleteManagedEmailHost', $args);
}
/**
* Delete a join form
* @param int $member_join_form_srl
@ -1455,6 +1535,74 @@ class memberAdminController extends member
return new Object();
}
/**
* Delete spammer's Activity
* @param int $member_srl
* @return Object
*/
function spammerManage($member_srl)
{
// 스팸 유저가 쓴 모든 글 자동 삭제
$oDocumentModel = &getModel('document');
$oDocumentController = &getController('document');
$obj->member_srl = $member_srl;
$obj->list_count = '99999999999';
$columnList = array('document_srl','ipaddress');
$document_list = $oDocumentModel->getDocumentList($obj,false,true,$columnList);
foreach($document_list->data as $key_document => $val_document)
{
// 회원 IP 스팸에 등록
$args_spam->ipaddress = $val_document->get('ipaddress');
if($args_spam->ipaddress && ($ipaddress_bk != $args_spam->ipaddress ))
{
$output_spam = executeQuery('spamfilter.isDeniedIP', $args_spam);
if(!$output_spam->data->count)
{
$ipaddress_bk = $args_spam->ipaddress;
executeQuery('spamfilter.insertDeniedIP', $args_spam);
}
}
// 글 삭제
$oDocumentController->deleteDocument($val_document->document_srl);
}
// 스팸 유저가 쓴 모든 댓글 자동 삭제
$oCommentModel = &getModel('comment');
$obj->search_target = 'member_srl';
$obj->search_keyword = $member_srl;
$comment_list = $oCommentModel->getTotalCommentList($obj);
$oCommentController = &getController('comment');
foreach($comment_list->data as $key_comment => $val_comment)
{
// 회원 IP 스팸에 등록
$args_spam->ipaddress = $val_comment->get('ipaddress');
if($args_spam->ipaddress && ($ipaddress_bk != $args_spam->ipaddress ))
{
$output_spam = executeQuery('spamfilter.isDeniedIP', $args_spam);
if(!$output_spam->data->count)
{
$ipaddress_bk = $args_spam->ipaddress;
executeQuery('spamfilter.insertDeniedIP', $args_spam);
}
}
$oCommentController->deleteComment($val_comment->comment_srl);
}
// 쪽지 삭제
$args_message->sender_srl = $obj->member_srl;
$args_message->receiver_srl = $obj->member_srl;
$output_message = executeQuery('communication.deleteMessagesMember', $args_message);
// 회원정보 삭제
$oMemberController = &getController('member');
$oMemberController->memberInfo = null;
$oMemberController = &getController('member');
$output = $oMemberController->deleteMember($obj->member_srl);
return $output;
}
}
/* End of file member.admin.controller.php */
/* Location: ./modules/member/member.admin.controller.php */

View file

@ -9,14 +9,14 @@ class memberAdminView extends member
{
/**
* Group list
*
*
* @var array
*/
var $group_list = NULL;
/**
* Selected member info
*
*
* @var array
*/
var $memberInfo = NULL;
@ -33,7 +33,7 @@ class memberAdminView extends member
*
* @return void
*/
function init()
function init()
{
$oMemberModel = getModel('member');
$this->memberConfig = $oMemberModel->getMemberConfig();
@ -43,7 +43,7 @@ class memberAdminView extends member
// if member_srl exists, set memberInfo
$member_srl = Context::get('member_srl');
if($member_srl)
if($member_srl)
{
$this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
if(!$this->memberInfo)
@ -141,7 +141,14 @@ class memberAdminView extends member
if($config->redirect_url)
{
$mid = str_ireplace(Context::getDefaultUrl(), '', $config->redirect_url);
if(!$config->redirect_mid)
{
$mid = str_ireplace(Context::getDefaultUrl(), '', $config->redirect_url);
}
else
{
$mid = $config->redirect_mid;
}
$siteModuleInfo = Context::get('site_module_info');
@ -159,6 +166,7 @@ class memberAdminView extends member
// get an editor
$option = new stdClass();
$option->skin = $oEditorModel->getEditorConfig()->editor_skin;
$option->primary_key_name = 'temp_srl';
$option->content_key_name = 'agreement';
$option->allow_fileupload = false;
@ -193,7 +201,13 @@ class memberAdminView extends member
// get denied NickName List
$deniedNickNames = $oMemberModel->getDeniedNickNames();
Context::set('deniedNickNames', $deniedNickNames);
$oSecurity->encodeHTML('deniedNickNames..nick_name');
$oSecurity->encodeHTML('deniedNickNames..nick_name');
//get managed Email Hosts
$managedEmailHost = $oMemberModel->getManagedEmailHosts();
Context::set('managedEmailHost', $managedEmailHost);
$oSecurity->encodeHTML('managedEmailHost..email_host');
$this->setTemplateFile('signup_config');
}
@ -231,7 +245,7 @@ class memberAdminView extends member
*
* @return void
*/
function dispMemberAdminConfigOLD()
function dispMemberAdminConfigOLD()
{
$oModuleModel = getModel('module');
$oMemberModel = getModel('member');
@ -259,6 +273,7 @@ class memberAdminView extends member
Context::set('editor_skin_list', $oEditorModel->getEditorSkinList());
// get an editor
$option->skin = $oEditorModel->getEditorConfig()->editor_skin;
$option->primary_key_name = 'temp_srl';
$option->content_key_name = 'agreement';
$option->allow_fileupload = false;
@ -352,6 +367,7 @@ class memberAdminView extends member
{
$oEditorModel = getModel('editor');
$option = new stdClass();
$option->skin = $oEditorModel->getEditorConfig()->editor_skin;
$option->primary_key_name = 'member_srl';
$option->content_key_name = 'signature';
$option->allow_fileupload = false;
@ -378,7 +394,7 @@ class memberAdminView extends member
}
/**
* Get tags by the member info type
* Get tags by the member info type
*
* @param object $memberInfo
* @param boolean $isAdmin (true : admin, false : not admin)
@ -631,7 +647,7 @@ class memberAdminView extends member
*
* @return void
*/
function dispMemberAdminGroupList()
function dispMemberAdminGroupList()
{
$oModuleModel = getModel('module');
$output = $oModuleModel->getModuleFileBoxList();

View file

@ -18,7 +18,7 @@ class member extends ModuleObject {
*
* @return void
*/
function member()
function __construct()
{
if(!Context::isInstalled()) return;

View file

@ -239,6 +239,23 @@ class memberController extends member
break;
case 'email_address' :
// Check managed Email Host
if($oMemberModel->isDeniedEmailHost($value))
{
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managed_email_host = Context::getLang('managed_email_host');
$email_hosts = $oMemberModel->getManagedEmailHosts();
foreach ($email_hosts as $host)
{
$hosts[] = $host->email_host;
}
$message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts));
return new Object(0,$message);
}
// Check if duplicated
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address');
@ -356,6 +373,10 @@ class memberController extends member
$this->insertImageName($args->member_srl, $image_name['tmp_name']);
}
// Save Signature
$signature = Context::get('signature');
$this->putSignature($args->member_srl, $signature);
// If a virtual site, join the site
$site_module_info = Context::get('site_module_info');
if($site_module_info->site_srl > 0)
@ -1051,6 +1072,10 @@ class memberController extends member
{
$oMemberModel = getModel('member');
$config = $oMemberModel->getMemberConfig();
if($config->enable_find_account_question != 'Y')
{
return new Object(-1, 'msg_question_not_allowed');
}
$email_address = Context::get('email_address');
$user_id = Context::get('user_id');
@ -1251,7 +1276,7 @@ class memberController extends member
$oMail->setTitle( Context::getLang('msg_confirm_account_title') );
$oMail->setContent($content);
$oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email);
$oMail->setReceiptor( $args->user_name, $args->email_address );
$oMail->setReceiptor( $member_info->user_name, $member_info->email_address );
$oMail->send();
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
@ -1988,6 +2013,22 @@ class memberController extends member
return new Object(-1,'msg_exists_nick_name');
}
// Check managed Email Host
if($oMemberModel->isDeniedEmailHost($args->email_address))
{
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managed_email_host = Context::getLang('managed_email_host');
$email_hosts = $oMemberModel->getManagedEmailHosts();
foreach ($email_hosts as $host)
{
$hosts[] = $host->email_host;
}
$message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts));
return new Object(-1, $message);
}
// Check if email address is duplicate
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address);
if($member_srl)
@ -2133,6 +2174,22 @@ class memberController extends member
$output = executeQuery('member.getMemberInfoByMemberSrl', $args);
$orgMemberInfo = $output->data;
// Check managed Email Host
if($oMemberModel->isDeniedEmailHost($args->email_address))
{
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managed_email_host = Context::getLang('managed_email_host');
$email_hosts = $oMemberModel->getManagedEmailHosts();
foreach ($email_hosts as $host)
{
$hosts[] = $host->email_host;
}
$message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts));
return new Object(-1, $message);
}
// Check if email address or user ID is duplicate
if($config->identifier == 'email_address')
{
@ -2455,6 +2512,23 @@ class memberController extends member
if(!$newEmail) return $this->stop('msg_invalid_request');
$oMemberModel = getModel('member');
// Check managed Email Host
if($oMemberModel->isDeniedEmailHost($newEmail))
{
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managed_email_host = Context::getLang('managed_email_host');
$email_hosts = $oMemberModel->getManagedEmailHosts();
foreach ($email_hosts as $host)
{
$hosts[] = $host->email_host;
}
$message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts));
return new Object(-1, $message);
}
// Check if the e-mail address is already registered
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($newEmail);
if($member_srl) return new Object(-1,'msg_exists_email_address');

View file

@ -67,6 +67,11 @@ class memberMobile extends memberView
Context::set('oMemberInfo', get_object_vars($this->member_info));
}
}
function dispMemberScrappedDocument()
{
parent::dispMemberScrappedDocument();
}
}
/* End of file member.mobile.php */
/* Location: ./modules/member/member.mobile.php */

View file

@ -66,12 +66,19 @@ class memberModel extends member
if(!$config->identifier) $config->identifier = 'user_id';
if(!$config->emailhost_check) $config->emailhost_check = 'allowed';
if(!$config->max_error_count) $config->max_error_count = 10;
if(!$config->max_error_count_time) $config->max_error_count_time = 300;
if(!$config->signature_editor_skin || $config->signature_editor_skin == 'default') $config->signature_editor_skin = 'ckeditor';
if(!$config->sel_editor_colorset) $config->sel_editor_colorset = 'moono';
if($config->redirect_mid)
{
$config->redirect_url = getNotEncodedFullUrl('','mid',$config->redirect_mid);
}
$member_config = $config;
return $config;
@ -196,8 +203,17 @@ class memberModel extends member
{
return true;
}
elseif(filter_var($_SESSION['ipaddress'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
{
// IPv6: require same /48
if(strncmp(inet_pton($_SESSION['ipaddress']), inet_pton($_SERVER['REMOTE_ADDR']), 6) == 0)
{
return true;
}
}
else
{
// IPv4: require same /24
if(ip2long($_SESSION['ipaddress']) >> 8 == ip2long($_SERVER['REMOTE_ADDR']) >> 8)
{
return true;
@ -205,7 +221,10 @@ class memberModel extends member
}
}
$_SESSION['is_logged'] = false;
if(Context::getSessionStatus())
{
$_SESSION['is_logged'] = false;
}
return false;
}
@ -321,7 +340,7 @@ class memberModel extends member
$args = new stdClass();
$args->member_srl = $member_srl;
$output = executeQuery('member.getMemberInfoByMemberSrl', $args, $columnList);
if(!$output->data)
if(!$output->data)
{
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, new stdClass);
return;
@ -840,6 +859,20 @@ class memberModel extends member
return $output->data;
}
function getManagedEmailHosts()
{
static $output;
if(isset($output->data)) return $output->data;
$output = executeQueryArray('member.getManagedEmailHosts');
if(!$output->toBool())
{
$output->data = array();
return array();
}
return $output->data;
}
/**
* @brief Verify if ID is denied
*/
@ -867,6 +900,49 @@ class memberModel extends member
}
return false;
}
/**
* @brief Verify if email_host from email_address is denied
*/
function isDeniedEmailHost($email_address)
{
$email_address = trim($email_address);
$oMemberModel = &getModel('member');
$config = $oMemberModel->getMemberConfig();
$emailhost_check = $config->emailhost_check;
$managedHosts = $oMemberModel->getManagedEmailHosts();
if(count($managedHosts) < 1) return FALSE;
static $return;
if(!isset($return[$email_address]))
{
$email = explode('@',$email_address);
$email_hostname = $email[1];
if(!$email_hostname) return TRUE;
foreach($managedHosts as $managedHost)
{
if($managedHost->email_host && strtolower($managedHost->email_host) == strtolower($email_hostname))
{
$return[$email_address] = TRUE;
}
}
if(!$return[$email_address])
{
$return[$email_address] = FALSE;
}
}
if($emailhost_check == 'prohibited')
{
return $return[$email_address];
}
else
{
return (!$return[$email_address]);
}
}
/**
* @brief Get information of the profile image
*/
@ -885,7 +961,7 @@ class memberModel extends member
$info = new stdClass();
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_name_file;
$info->src = Context::getRequestUri().$image_name_file . '?' . date('YmdHis', filemtime($image_name_file));
$info->file = './'.$image_name_file;
$GLOBALS['__member_info__']['profile_image'][$member_srl] = $info;
break;
@ -910,7 +986,7 @@ class memberModel extends member
$info = new stdClass;
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_name_file;
$info->src = Context::getRequestUri().$image_name_file. '?' . date('YmdHis', filemtime($image_name_file));
$info->file = './'.$image_name_file;
$GLOBALS['__member_info__']['image_name'][$member_srl] = $info;
}
@ -932,7 +1008,7 @@ class memberModel extends member
list($width, $height, $type, $attrs) = getimagesize($image_mark_file);
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_mark_file;
$info->src = Context::getRequestUri().$image_mark_file . '?' . date('YmdHis', filemtime($image_mark_file));
$info->file = './'.$image_mark_file;
$GLOBALS['__member_info__']['image_mark'][$member_srl] = $info;
}
@ -1096,7 +1172,7 @@ class memberModel extends member
case 'low':
if($length < 4) return false;
break;
break;
}
return true;

View file

@ -209,6 +209,29 @@ class memberView extends member
$formTags = $oMemberAdminView->_getMemberInputTag($member_info);
Context::set('formTags', $formTags);
// Editor of the module set for signing by calling getEditor
foreach($formTags as $formTag) {
if($formTag->name=='signature') {
$oEditorModel = getModel('editor');
$option = new stdClass();
$option->primary_key_name = 'member_srl';
$option->content_key_name = 'signature';
$option->allow_fileupload = false;
$option->enable_autosave = false;
$option->enable_default_component = true;
$option->enable_component = false;
$option->resizable = false;
$option->disable_html = true;
$option->height = 100;
$option->skin = $member_config->signature_editor_skin;
$option->colorset = $member_config->sel_editor_colorset;
$editor = $oEditorModel->getEditor($member_info->member_srl, $option);
Context::set('editor', $editor);
}
}
global $lang;
$identifierForm = new stdClass();
$identifierForm->title = $lang->{$member_config->identifier};
@ -529,6 +552,7 @@ class memberView extends member
$config = $this->member_config;
Context::set('identifier', $config->identifier);
Context::set('enable_find_account_question', $config->enable_find_account_question);
$this->setTemplateFile('find_member_account');
}

View file

@ -0,0 +1,8 @@
<query id="deleteManagedEmailHost" action="delete">
<tables>
<table name="member_managed_email_hosts" />
</tables>
<conditions>
<condition operation="equal" column="email_host" var="email_host" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,8 @@
<query id="getManagedEmailHosts" action="select">
<tables>
<table name="member_managed_email_hosts" />
</tables>
<columns>
<column name="email_host" />
</columns>
</query>

View file

@ -0,0 +1,10 @@
<query id="insertManagedEmailHost" action="insert">
<tables>
<table name="member_managed_email_hosts" />
</tables>
<columns>
<column name="email_host" var="email_host" notnull="notnull" />
<column name="regdate" default="curdate()" />
<column name="description" var="description" default="" />
</columns>
</query>

View file

@ -3,6 +3,6 @@
<customrules>
</customrules>
<fields>
<field name="password" required="true" length=":20" />
<field name="password" required="true" length="1:60" />
</fields>
</ruleset>

View file

@ -3,8 +3,8 @@
<customrules>
</customrules>
<fields>
<field name="current_password" required="true" length="1:50" />
<field name="password1" required="true" length="4:20" />
<field name="password2" required="true" length="4:20" equalto="password1" />
<field name="current_password" required="true" length="1:60" />
<field name="password1" required="true" length="4:60" />
<field name="password2" required="true" length="4:60" equalto="password1" />
</fields>
</ruleset>

View file

@ -4,8 +4,8 @@
</customrules>
<fields>
<field name="user_id" required="true" length="3:20" />
<field name="password1" required="true" length="6:20" />
<field name="password2" required="true" length="6:20" equalto="password1" />
<field name="password1" required="true" length="4:60" />
<field name="password2" required="true" length="4:60" equalto="password1" />
<field name="user_name" required="true" length="2:40" />
<field name="nick_name" required="true" length="2:40" />
<field name="email_address" required="true" length="1:200" rule="email" />

View file

@ -0,0 +1,5 @@
<table name="member_managed_email_hosts">
<column name="email_host" type="varchar" size="250" notnull="notnull" primary_key="primary_key" />
<column name="regdate" type="date" />
<column name="description" type="text" />
</table>

View file

@ -18,8 +18,8 @@
</span>
</form>
</section>
<hr>
<section cond="count($lang->find_account_question_items)>1">
<hr cond="count($lang->find_account_question_items)>1 && $enable_find_account_question == 'Y'">
<section cond="count($lang->find_account_question_items)>1 && $enable_find_account_question == 'Y'">
<h1>{$lang->cmd_find_member_account_with_email_question}</h1>
<p>{$lang->about_find_account_question}</p>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skin/default/find_member_account/2'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">

View file

@ -27,7 +27,7 @@
</div>
</div>
<div class="control-group" loop="$formTags=>$formTag">
<label for="" class="control-label">{$formTag->title}</label>
<label for="{$formTag->name}" class="control-label">{$formTag->title}</label>
<div class="controls" cond="$formTag->name != 'signature'">{$formTag->inputTag}</div>
<div class="controls" cond="$formTag->name =='signature'">
{$editor}

View file

@ -41,9 +41,17 @@
<input type="password" name="password2" id="password2" value="" required />
</div>
</div>
<div class="control-group" loop="$formTags=>$formTag" cond="$formTag->name != 'signature'">
<div class="control-group" loop="$formTags=>$formTag">
<label for="{$formTag->name}" class="control-label">{$formTag->title}</label>
<div class="controls">{$formTag->inputTag}</div>
<div class="controls" cond="$formTag->name != 'signature'">{$formTag->inputTag}</div>
<div class="controls" cond="$formTag->name =='signature'">
<input type="hidden" name="signature" value="" />
{$editor}
<style scoped>
.xpress-editor>#smart_content,
.xpress-editor>#smart_content>.tool{clear:none}
</style>
</div>
</div>
<div class="control-group">
<div class="control-label">{$lang->allow_mailing}</div>

View file

@ -20,6 +20,14 @@
<p class="x_help-block">{$lang->about_enable_confirm}</p>
</div>
</div>
<div class="x_control-group">
<div class="x_control-label">{$lang->enable_find_account_question}</div>
<div class="x_controls">
<label class="x_inline" for="enable_find_account_question_yes"><input type="radio" name="enable_find_account_question" id="enable_find_account_question_yes" value="Y" checked="checked"|cond="$config->enable_find_account_question == 'Y'" /> {$lang->cmd_yes}</label>
<label class="x_inline" for="enable_find_account_question_no"><input type="radio" name="enable_find_account_question" id="enable_find_account_question_no" value="N" checked="checked"|cond="$config->enable_find_account_question != 'Y'"/> {$lang->cmd_no}</label>
<p class="x_help-block">{$lang->about_enable_find_account_question}</p>
</div>
</div>
<div class="x_control-group">
<div class="x_control-label">{$lang->cmd_config_password_strength}</div>
<div class="x_controls">

View file

@ -17,7 +17,7 @@ function doUpdateDeniedID(user_id, mode, message) {
}
/* prohibited nick name functions */
function doUpdateDeniedNickName(nick_name, mode, message)
function doUpdateDeniedNickName(nick_name, mode, message)
{
if(typeof(message)!='undefined' && !confirm(message)) return;
@ -35,8 +35,27 @@ function doUpdateDeniedNickName(nick_name, mode, message)
);
}
/* managed E-mail Address functions */
function doUpdateManagedEmailHost(email_host, mode, message)
{
if(typeof(message)!='undefined' && !confirm(message)) return;
exec_xml(
'member',
'procMemberAdminUpdateManagedEmailHosts',
{email_hosts:email_host, mode:mode, email_hosts_count:jQuery('#managedEmailHost li').length},
function(){
if (mode == 'delete'){
jQuery('#managed_'+email_host.replace(/\./g,'\_\_')).remove();
jQuery('._managededEmailHostCount').html(jQuery('#managedEmailHost li').length);
}
},
['error','message','tpl']
);
}
jQuery(function($){
// hide form if enable_join is setted "No"
// hide form if enable_join is setted "No"
var suForm = $('table.__join_form'); // 회원가입 양식
function changeTable($i)
@ -66,6 +85,7 @@ jQuery(function($){
suForm.find(':checkbox[name="usable_list[]"]').each(function(){
var $i = $(this);
if($i.val() == 'find_account_question') return;
$i.change(function(){
changeTable($i);
@ -96,7 +116,7 @@ jQuery(function($){
if (!confirm(xe.lang.msg_delete_extend_form)) return;
var memberFormSrl = $(event.target).parent().attr('id');
var targetTR = $(event.target).closest('tr');
var targetTR = $(event.target).closest('tr');
exec_xml(
'member',
@ -111,7 +131,7 @@ jQuery(function($){
$('button._addDeniedID').click(function(){
var ids = $('#prohibited_id').val();
if(ids == ''){
if(ids == ''){
alert(xe.lang.msg_null_prohibited_id);
$('#prohibited_id').focus();
return;
@ -136,11 +156,40 @@ jQuery(function($){
jQuery.exec_json('member.procMemberAdminInsertDeniedID', {'user_id': ids}, on_complete);
});
$('button._addManagedEmailHost').click(function(){
var hosts = $('#manage_email_host').val();
if(hosts == ''){
alert(xe.lang.msg_null_managed_emailhost);
$('#manage_email_host').focus();
return;
}
var tag;
function on_complete(data)
{
$('#manage_email_host').val('');
var hosts = $.trim(data.email_hosts);
if(hosts == '') return;
var uids = hosts.split("\n");
for (var i=0; i<uids.length; i++)
{
uids[i] = $.trim(uids[i]);
tag = '<li id="managed_'+uids[i].replace(/\./g,'\_\_')+'">'+uids[i]+' <button type="button" class="x_icon-remove" onclick="doUpdateManagedEmailHost(\''+uids[i]+'\',\'delete\',\''+xe.lang.confirm_delete+'\');return false;">'+xe.lang.cmd_delete+'</button></li>';
$('#managedEmailHost').append($(tag));
}
$('._managededEmailHostCount').html($('#managedEmailHost li').length);
}
$.exec_json('member.procMemberAdminUpdateManagedEmailHosts', {'email_hosts': hosts}, on_complete);
});
$('button._addDeniedNickName').click(function(){
var ids = $('#prohibited_nick_name').val();
if(ids == ''){
if(ids == ''){
alert(xe.lang.msg_null_prohibited_nick_name);
$('#prohibited_nick_name').focus();
return;
@ -195,7 +244,7 @@ jQuery(function($){
$notCheckedTR.find('th').html('<div class="wrap"><button type="button" class="dragBtn">Move to</button><span class="_title" >'+$notCheckedTR.find('th ._title').html()+'</span></div>');
$notCheckedTR.removeClass('sticky');
// add sticky class
// add sticky class
}
});

View file

@ -24,12 +24,14 @@
<a class="x_btn x_btn-inverse" href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminInsert')}">{$lang->msg_new_member}</a>
<a href="#listManager" data-value="modify" class="modalAnchor _member x_btn">{$lang->modify}</a>
<a href="#listManager" data-value="delete" class="modalAnchor _member x_btn">{$lang->delete}</a>
<a href="#listManager" data-value="spam" class="modalAnchor _member x_btn">{$lang->cmd_spammer}</a>
</div>
</caption>
<thead>
<tr>
<th scope="col" class="nowr">{$lang->email}</th>
<th scope="col" class="nowr" loop="$usedIdentifiers=>$name,$title">{$title}</th>
<th scope="col" class="nowr">{$lang->status}</th>
<th scope="col" class="nowr"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminList', 'sort_index', 'regdate', 'sort_order', ($sort_order == 'asc') ? 'desc' : 'asc')}">{$lang->signup_date}<block cond="$sort_index == 'regdate'"> <em cond="$sort_order=='asc'"></em><em cond="$sort_order != 'asc'"></em></block></a></th>
<th scope="col" class="nowr"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminList', 'sort_index', 'last_login', 'sort_order', ($sort_order == 'asc') ? 'desc' : 'asc')}">{$lang->last_login}<block cond="$sort_index == 'last_login'"> <em cond="$sort_order=='asc'"></em><em cond="$sort_order != 'asc'"></em></block></a></th>
<th scope="col" class="nowr">{$lang->member_group}</th>
@ -47,6 +49,7 @@
</td>
{@ $member_info['group_list'] = implode(', ', $member_info['group_list'])}
<td class="nowr" loop="$usedIdentifiers=>$name,$title">{$member_info[$name]}</td>
<td class="nowr"><!--@if($member_info['denied']=='Y')--><span style="color:red;">{$lang->denied}</span><!--@else-->{$lang->approval}<!--@end--></td>
<td class="nowr" title="{zdate($member_info['regdate'], 'Y-m-d H:i:s')}">{zdate($member_info['regdate'], 'Y-m-d')}</td>
<td class="nowr" title="{zdate($member_info['last_login'], 'Y-m-d H:i:s')}">{zdate($member_info['last_login'], 'Y-m-d')}</td>
<td>{$member_info['group_list']}&nbsp;</td>
@ -110,6 +113,7 @@
<a class="x_btn x_btn-inverse" href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminInsert')}">{$lang->msg_new_member}</a>
<a href="#listManager" data-value="modify" class="modalAnchor _member x_btn">{$lang->modify}</a>
<a href="#listManager" data-value="delete" class="modalAnchor _member x_btn">{$lang->delete}</a>
<a href="#listManager" data-value="spam" class="modalAnchor _member x_btn">{$lang->cmd_spammer}</a>
</div>
</div>
<form action="./" method="get" class="search center x_input-append" no-error-return-url="true">
@ -167,7 +171,7 @@
<div class="x_modal-footer">
<button type="button" class="x_btn x_pull-left" data-hide="#listManager">{$lang->cmd_close}</button>
<span class="x_btn-group x_pull-right">
<button type="submit" name="type" value="modify|delete" class="x_btn x_btn-inverse">{$lang->confirm}</button>
<button type="submit" name="type" value="modify|delete|spam" class="x_btn x_btn-inverse">{$lang->confirm}</button>
</span>
</div>
</form>

View file

@ -7,6 +7,7 @@
xe.lang.cmd_delete = '{$lang->cmd_delete}';
xe.lang.msg_null_prohibited_id = '{$lang->msg_null_prohibited_id}';
xe.lang.msg_null_prohibited_nick_name = '{$lang->msg_null_prohibited_nick_name}';
xe.lang.msg_null_managed_emailhost = '{$lang->msg_null_managed_emailhost}';
xe.lang.msg_exists_user_id= '{$lang->msg_exists_user_id}';
</script>
<form action="./" class="x_form-horizontal" method="post">
@ -23,6 +24,24 @@
<input type="text" name="limit_day_description" value="{$config->limit_day_description}" placeholder="{$lang->limit_day_description}" style="width:90%" class="lang_code" />
</div>
</div>
<!--// Managed Email Host Control -->
<div class="x_control-group">
<label class="x_control-label" for="manage_email_host">{$lang->cmd_manage_email_host}[<a href="#helpHost" data-toggle>?</a>]</label>
<div class="x_controls">
<div class="layer x_alert x_alert-info" id="helpHost">
<p>{$lang->about_emailhost_check}</p>
</div>
<input type="radio" id="emailhost_check_allowed" name="emailhost_check" value="allowed" checked="checked"|cond="$config->emailhost_check =='allowed'" /><label for="emailhost_check_allowed" class="x_inline"> {$lang->cmd_allowed}</label>
<input type="radio" id="emailhost_check_prohibited" name="emailhost_check" value="prohibited" checked="checked"|cond="$config->emailhost_check =='prohibited'" /><label for="emailhost_check_prohibited" class="x_inline"> {$lang->cmd_prohibited}</label>
<p>{@ if($config->emailhost_check =='prohibited') $emailhost_check = $lang->cmd_prohibited; else $emailhost_check = $lang->cmd_allowed;}{sprintf($lang->count_manage_email_host, count($managedEmailHost), $emailhost_check)}</p>
<ul class="textList" id="managedEmailHost" style="margin-left:0">
<li loop="$managedEmailHost=>$emailInfo" id="managed_{str_replace('.','__',$emailInfo->email_host)}">{$emailInfo->email_host} <button type="button" class="x_icon-remove" onclick="doUpdateManagedEmailHost('{$emailInfo->email_host}','delete','{$lang->confirm_delete}');return false;">{$lang->delete}</button></li>
</ul>
<textarea rows="2" cols="42" id="manage_email_host" title="{$lang->add_managed_emailhost}" style="vertical-align:top"></textarea>
<button type="button" class="_addManagedEmailHost x_btn">{$lang->add}</button>
<p class="x_help-inline">{$lang->multi_line_input}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="prohibited_nick_name">{$lang->cmd_manage_nick_name}</label>
<div class="x_controls">
@ -30,7 +49,7 @@
<ul class="textList" id="deniedNickNameList" style="margin-left:0">
<li loop="$deniedNickNames=>$nicknameInfo" id="denied_{$nicknameInfo->nick_name}">{$nicknameInfo->nick_name} <button type="button" class="x_icon-remove" onclick="doUpdateDeniedNickName('{$nicknameInfo->nick_name}','delete','{$lang->confirm_delete}');return false;">{$lang->delete}</button></li>
</ul>
<textarea rows="2" cols="42" id="prohibited_nick_name" title="{$lang->add_prohibited_id}" style="vertical-align:top"></textarea>
<textarea rows="2" cols="42" id="prohibited_nick_name" title="{$lang->add_prohibited_nickname}" style="vertical-align:top"></textarea>
<button type="button" class="_addDeniedNickName x_btn">{$lang->add}</button>
<p class="x_help-inline">{$lang->multi_line_input}</p>
</div>

View file

@ -1024,7 +1024,9 @@ class menuAdminController extends menu
// get original menu item info for cache file recreate
$originalItemInfo = $oMenuAdminModel->getMenuItemInfo($target_srl);
if(!$originalItemInfo->menu_item_srl)
$targetMenuInfo = $oMenuAdminModel->getMenu($target_srl);
$targetMenuItemInfo = $oMenuAdminModel->getMenuItemInfo($target_srl);
if(!$originalItemInfo->menu_item_srl || (!$targetMenuInfo->menu_srl && !$targetMenuItemInfo->menu_item_srl))
{
return new Object(-1, 'msg_empty_menu_item');
}

View file

@ -3799,7 +3799,9 @@ jQuery(function($){
function installPackage(sPackageSrl, sPackageType, $item){
//act=getAutoinstallAdminIsAuthed
$.exec_json("admin.getAutoinstallAdminIsAuthed", {}, function(htData){
var params = {};
params.package_srl = sPackageSrl;
$.exec_json("admin.getAutoinstallAdminIsAuthed", params, function(htData){
// FTP 비밀번호 뿐만 아니라 정보가 전혀 없을 경우?
switch(htData.is_authed){
case -1:

View file

@ -457,7 +457,7 @@ class moduleController extends module
$args->browser_title = strip_tags($args->browser_title);
if($isMenuCreate == TRUE)
if($isMenuCreate === TRUE)
{
$menuArgs = new stdClass;
$menuArgs->menu_srl = $args->menu_srl;
@ -521,6 +521,15 @@ class moduleController extends module
*/
function updateModule($args)
{
if(isset($args->isMenuCreate))
{
$isMenuCreate = $args->isMenuCreate;
}
else
{
$isMenuCreate = TRUE;
}
$output = $this->arrangeModuleInfo($args, $extra_vars);
if(!$output->toBool()) return $output;
// begin transaction
@ -585,22 +594,25 @@ class moduleController extends module
return $output;
}
$menuArgs = new stdClass;
$menuArgs->url = $module_info->mid;
$menuArgs->site_srl = $module_info->site_srl;
$menuOutput = executeQueryArray('menu.getMenuItemByUrl', $menuArgs);
if($menuOutput->data && count($menuOutput->data))
if($isMenuCreate === TRUE)
{
$oMenuAdminController = getAdminController('menu');
foreach($menuOutput->data as $itemInfo)
$menuArgs = new stdClass;
$menuArgs->url = $module_info->mid;
$menuArgs->site_srl = $module_info->site_srl;
$menuOutput = executeQueryArray('menu.getMenuItemByUrl', $menuArgs);
if($menuOutput->data && count($menuOutput->data))
{
$itemInfo->url = $args->mid;
$updateMenuItemOutput = $oMenuAdminController->updateMenuItem($itemInfo);
if(!$updateMenuItemOutput->toBool())
$oMenuAdminController = getAdminController('menu');
foreach($menuOutput->data as $itemInfo)
{
$oDB->rollback();
return $updateMenuItemOutput;
$itemInfo->url = $args->mid;
$updateMenuItemOutput = $oMenuAdminController->updateMenuItem($itemInfo);
if(!$updateMenuItemOutput->toBool())
{
$oDB->rollback();
return $updateMenuItemOutput;
}
}
}
}

View file

@ -50,6 +50,8 @@ class pointAdminController extends point
$config->download_file = (int)$args->download_file;
$config->voted = (int)$args->voted;
$config->blamed = (int)$args->blamed;
$config->voted_comment = (int)$args->voted_comment;
$config->blamed_comment = (int)$args->blamed_comment;
// The highest level
$config->max_level = $args->max_level;
if($config->max_level>1000) $config->max_level = 1000;
@ -62,10 +64,10 @@ class pointAdminController extends point
// Check if reading a document is not allowed
if($args->disable_read_document == 'Y') $config->disable_read_document = 'Y';
else $config->disable_read_document = 'N';
$oMemberModel = getModel('member');
$group_list = $oMemberModel->getGroups();
// Per-level group configurations
foreach($group_list as $group)
{
@ -83,7 +85,7 @@ class pointAdminController extends point
}
//if group level is lower than 1, change to 1
if($args->{'point_group_'.$group_srl} < 1)
if($args->{'point_group_'.$group_srl} && $args->{'point_group_'.$group_srl} < 1)
{
$args->{'point_group_'.$group_srl} = 1;
}
@ -132,7 +134,7 @@ class pointAdminController extends point
{
$args = Context::getRequestVars();
$configTypeList = array('insert_document', 'insert_comment', 'upload_file', 'download_file', 'read_document', 'voted', 'blamed');
$configTypeList = array('insert_document', 'insert_comment', 'upload_file', 'download_file', 'read_document', 'voted', 'blamed', 'voted_comment', 'blamed_comment');
foreach($configTypeList AS $config)
{
if(is_array($args->{$config}))
@ -186,6 +188,8 @@ class pointAdminController extends point
$config['read_document'] = (int)Context::get('read_document');
$config['voted'] = (int)Context::get('voted');
$config['blamed'] = (int)Context::get('blamed');
$config['voted_comment'] = (int)Context::get('voted_comment');
$config['blamed_comment'] = (int)Context::get('blamed_comment');
$oModuleController->insertModulePartConfig('point', $srl, $config);
}

View file

@ -65,12 +65,34 @@ class point extends ModuleObject
// Vote up / Vote down
$config->voted = 0;
$config->blamed = 0;
// Comment Vote up / Comment Vote down
$config->voted_comment = 0;
$config->blamed_comment = 0;
// Save configurations
$oModuleController->insertModuleConfig('point', $config);
// Cash act list for faster execution
$oPointController = getAdminController('point');
$oPointController->cacheActList();
// Add a trigger for registration/insert document/insert comment/upload a file/download
$oModuleController->insertTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after');
$oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after');
$oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before');
$oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after');
$oModuleController->insertTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after');
$oModuleController->insertTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after');
$oModuleController->insertTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after');
$oModuleController->insertTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after');
$oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before');
$oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after');
$oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after');
$oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after');
$oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after');
// Add a trigger for voting up and down 2008.05.13 haneul
$oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
// Add a trigger for using points for permanent saving of a temporarily saved document 2009.05.19 zero
$oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before');
// Add a trigger for comment voting up and down 2014.08.30 sejin7940
$oModuleController->insertTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
return new Object();
}
@ -107,8 +129,10 @@ class point extends ModuleObject
// 2012. 08. 29 Add a trigger to copy additional setting when the module is copied
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'point', 'controller', 'triggerCopyModule', 'after')) return true;
}
// Add a trigger for comment voting up and down 2014.08.30 sejin7940
if(!$oModuleModel->getTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) return true;
}
return false;
}
@ -158,6 +182,15 @@ class point extends ModuleObject
{
$oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'point', 'controller', 'triggerCopyModule', 'after');
}
// Add a trigger for comment voting up and down 2014.08.30 sejin7940
if(!$oModuleModel->getTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'))
{
$config = $oModuleModel->getModuleConfig('point');
$config->voted_comment = 0;
$config->blamed_comment = 0;
$oModuleController->insertModuleConfig('point', $config);
$oModuleController->insertTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
}
return new Object(0, 'success_updated');
}

View file

@ -187,32 +187,37 @@ class pointController extends point
*/
function triggerDeleteDocument(&$obj)
{
$module_srl = $obj->module_srl;
$member_srl = $obj->member_srl;
// The process related to clearing the post object
if(!$module_srl || !$member_srl) return new Object();
// Run only when logged in
$logged_info = Context::get('logged_info');
if(!$logged_info->member_srl) return new Object();
// Get the points of the member
$oPointModel = getModel('point');
$cur_point = $oPointModel->getPoint($member_srl, true);
// Get the point module information
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('point');
$module_config = $oModuleModel->getModulePartConfig('point', $module_srl);
$point = $module_config['insert_document'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document;
// if the point is set to decrease when writing a document, make sure it does not increase the points when deleting an article
if($point < 0) return new Object();
$cur_point -= $point;
// Add points related to deleting an attachment
$point = $module_config['upload_file'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file;
if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count;
// Increase the point
$this->setPoint($member_srl,$cur_point);
$oDocumentModel = getModel('document');
if($obj->status != $oDocumentModel->getConfigStatus('temp'))
{
$module_srl = $obj->module_srl;
$member_srl = $obj->member_srl;
// The process related to clearing the post object
if(!$module_srl || !$member_srl) return new Object();
// Run only when logged in
$logged_info = Context::get('logged_info');
if(!$logged_info->member_srl) return new Object();
// Get the points of the member
$oPointModel = getModel('point');
$cur_point = $oPointModel->getPoint($member_srl, true);
// Get the point module information
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('point');
$module_config = $oModuleModel->getModulePartConfig('point', $module_srl);
$point = $module_config['insert_document'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document;
// if the point is set to decrease when writing a document, make sure it does not increase the points when deleting an article
if($point < 0) return new Object();
$cur_point -= $point;
// Add points related to deleting an attachment
$point = $module_config['upload_file'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file;
if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count;
// Increase the point
$this->setPoint($member_srl,$cur_point);
}
return new Object();
}
@ -459,15 +464,32 @@ class pointController extends point
if( $obj->point > 0 )
{
$point = $module_config['voted'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->voted;
if($obj->comment_srl)
{
$point = $module_config['voted_comment'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->voted_comment;
}
else
{
$point = $module_config['voted'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->voted;
}
}
else
{
$point = $module_config['blamed'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed;
if($obj->comment_srl)
{
$point = $module_config['blamed_comment'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed_comment;
}
else
{
$point = $module_config['blamed'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed;
}
}
if(!$point) return new Object();
// Increase the point
$cur_point += $point;

View file

@ -48,6 +48,8 @@ class pointView extends point
$module_config['read_document'] = $config->read_document;
$module_config['voted'] = $config->voted;
$module_config['blamed'] = $config->blamed;
$module_config['voted_comment'] = $config->voted_comment;
$module_config['blamed_comment'] = $config->blamed_comment;
}
}

View file

@ -58,6 +58,12 @@
<br />
<input type="number" name="blamed" value="{$config->blamed}" id="blamed" style="text-align:right" /> :
<label for="blamed" class="x_inline">{$lang->point_blamed}</label>
<br />
<input type="number" name="voted_comment" value="{$config->voted_comment}" style="text-align:right" id="voted_comment" /> :
<label for="voted_comment" class="x_inline">{$lang->comment} {$lang->point_voted}</label>
<br />
<input type="number" name="blamed_comment" value="{$config->blamed_comment}" id="blamed_comment" style="text-align:right" /> :
<label for="blamed_comment" class="x_inline">{$lang->comment} {$lang->point_blamed}</label>
</div>
</div>
<div class="x_control-group">

View file

@ -18,6 +18,8 @@
<th scope="col">{$lang->point_read_document}</th>
<th scope="col">{$lang->point_voted}</th>
<th scope="col">{$lang->point_blamed}</th>
<th scope="col">{$lang->comment} {$lang->point_voted}</th>
<th scope="col">{$lang->comment} {$lang->point_blamed}</th>
</tr>
</thead>
<tbody>
@ -30,6 +32,8 @@
<td class="nowr"><input type="number" style="width:40px;text-align:right" name="read_document[{$val->module_srl}]" value="{$module_config[$val->module_srl]['read_document']}" title="{$config->point_name}" /> {$config->point_name}</td>
<td class="nowr"><input type="number" style="width:40px;text-align:right" name="voted[{$val->module_srl}]" value="{$module_config[$val->module_srl]['voted']}" title="{$config->point_name}" /> {$config->point_name}</td>
<td class="nowr"><input type="number" style="width:40px;text-align:right" name="blamed[{$val->module_srl}]" value="{$module_config[$val->module_srl]['blamed']}" title="{$config->point_name}" /> {$config->point_name}</td>
<td class="nowr"><input type="number" style="width:40px;text-align:right" name="voted_comment[{$val->module_srl}]" value="{$module_config[$val->module_srl]['voted_comment']}" title="{$config->point_name}" /> {$config->point_name}</td>
<td class="nowr"><input type="number" style="width:40px;text-align:right" name="blamed_comment[{$val->module_srl}]" value="{$module_config[$val->module_srl]['blamed_comment']}" title="{$config->point_name}" /> {$config->point_name}</td>
</tr>
</tbody>
</table>

View file

@ -50,6 +50,18 @@
<input type="number" name="blamed" id="blamed" value="{$module_config['blamed']}" /> {$module_config['point_name']}
</div>
</div>
<div class="x_control-group">
<label for="voted_comment" class="x_control-label">{$lang->comment} {$lang->point_voted}</label>
<div class="x_controls">
<input type="number" name="voted_comment" id="voted_comment" value="{$module_config['voted_comment']}" /> {$module_config['point_name']}
</div>
</div>
<div class="x_control-group">
<label for="blamed_comment" class="x_control-label">{$lang->comment} {$lang->point_blamed}</label>
<div class="x_controls">
<input type="number" name="blamed_comment" id="blamed_comment" value="{$module_config['blamed_comment']}" /> {$module_config['point_name']}
</div>
</div>
<div class="x_clearfix btnArea">
<button class="x_btn x_btn-warning x_pull-left" type="button" onclick="doPointReset('{$module_config['module_srl']?$module_config['module_srl']:$module_srls}')">{$lang->cmd_reset}</button>
<span class="x_pull-right">

View file

@ -13,7 +13,7 @@ class session extends ModuleObject
var $lifetime = 18000;
var $session_started = false;
function session()
function __construct()
{
if(Context::isInstalled()) $this->session_started= true;
}