diff --git a/.htaccess b/.htaccess
index 747246c69..596c92996 100644
--- a/.htaccess
+++ b/.htaccess
@@ -9,7 +9,7 @@ RewriteRule ^(modules|addons|widgets)/(.+)/(conf|queries|schemas)/(.+)\.xml$ ./i
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+)/files/(member_extra_info|attach|cache|faceOff)/(.*) ./files/$2/$3 [L]
RewriteCond %{SCRIPT_FILENAME} !-f
-RewriteRule ^(.+)/(files|modules|common|widgets|widgetstyles|layouts|m.layouts|addons)/(.*) ./$2/$3 [L]
+RewriteRule ^(.+)/(files|modules|widgets|widgetstyles|layouts|m.layouts|addons)/(.*) ./$2/$3 [L]
# rss , blogAPI
RewriteRule ^(rss|atom)$ ./index.php?module=rss&act=$1 [L]
@@ -24,22 +24,22 @@ RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&documen
RewriteRule ^admin/?$ ./index.php?module=admin [L]
# document permanent link
-RewriteRule ^([0-9]+)$ ./index.php?document_srl=$1 [L]
+RewriteRule ^([0-9]+)$ ./index.php?document_srl=$1 [L,QSA]
# mid link
RewriteCond %{SCRIPT_FILENAME} !-d
-RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L]
+RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L,QSA]
# mid + document link
-RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?mid=$1&document_srl=$2 [L]
+RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?mid=$1&document_srl=$2 [L,QSA]
# vid + mid link
RewriteCond %{SCRIPT_FILENAME} !-d
-RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ ./index.php?vid=$1&mid=$2 [L]
+RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ ./index.php?vid=$1&mid=$2 [L,QSA]
# vid + mid + document link
-RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?vid=$1&mid=$2&document_srl=$3 [L]
+RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?vid=$1&mid=$2&document_srl=$3 [L,QSA]
# mid + entry title
-RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L]
+RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L,QSA]
# vid + mid + entry title
-RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?vid=$1&mid=$2&entry=$3 [L]
+RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?vid=$1&mid=$2&entry=$3 [L,QSA]
diff --git a/addons/adminlogging/adminlogging.addon.php b/addons/adminlogging/adminlogging.addon.php
new file mode 100644
index 000000000..a3eb4981a
--- /dev/null
+++ b/addons/adminlogging/adminlogging.addon.php
@@ -0,0 +1,17 @@
+is_admin == 'Y') {
+ $oAdminloggingController = &getController('adminlogging');
+ $oAdminloggingController->insertLog($this->module, $this->act);
+}
+?>
diff --git a/addons/adminlogging/conf/info.xml b/addons/adminlogging/conf/info.xml
new file mode 100644
index 000000000..3fc29c2c4
--- /dev/null
+++ b/addons/adminlogging/conf/info.xml
@@ -0,0 +1,22 @@
+
+
+ 어드민 메뉴 접근 로깅
+ admin menu access logging
+
+ admin menu에 접근한 기록을 로깅하는 애드온입니다.
+
+ 0.1
+ 2011-09-28
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
diff --git a/addons/autolink/autolink.addon.php b/addons/autolink/autolink.addon.php
index 0463eb57a..b5910a76a 100644
--- a/addons/autolink/autolink.addon.php
+++ b/addons/autolink/autolink.addon.php
@@ -1,12 +1,12 @@
-
+
diff --git a/addons/autolink/autolink.js b/addons/autolink/autolink.js
index 5b03d4bd7..ad2dcecf6 100644
--- a/addons/autolink/autolink.js
+++ b/addons/autolink/autolink.js
@@ -1,80 +1,80 @@
-/**
- * @file autolink.js
- * @brief javascript code for autolink addon
- * @author NHN (developers@xpressengine.com)
- */
-(function($){
- var protocol_re = '(https?|ftp|news|telnet|irc|mms)://';
- var domain_re = '(?:[\\w\\-]+\\.)+(?:[a-z]+)';
- var max_255_re = '(?:1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9]?[0-9])';
- var ip_re = '(?:'+max_255_re+'\\.){3}'+max_255_re;
- var port_re = '(?::([0-9]+))?';
- var user_re = '(?:/~[\\w-]+)?';
- var path_re = '((?:/[\\w!"$-/:-@]+)*)';
- var hash_re = '(?:#([\\w!-@]+))?';
-
- var url_regex = new RegExp('('+protocol_re+'('+domain_re+'|'+ip_re+'|localhost'+')'+port_re+user_re+path_re+hash_re+')', 'ig');
-
- var AutoLink = xe.createPlugin("autolink", {
- targets : [],
- init : function() {
- this.targets = [];
- },
- API_ONREADY : function() {
- var thisPlugin = this;
-
- // extract target text nodes
- this.extractTargets($('.xe_content'));
-
- $(this.targets).each(function(){
- thisPlugin.cast('AUTOLINK', [this]);
- });
- },
- API_AUTOLINK : function(oSender, params) {
- var textNode = params[0];
- if(!$(textNode).parent().length || $(textNode).parent().get(0).nodeName.toLowerCase() == 'a') return;
- var content = textNode.nodeValue;
- var dummy = $('');
-
- content = content.replace(//g, '>');
- content = content.replace(url_regex, '$1');
-
- $(textNode).before(dummy);
- $(textNode).replaceWith(content);
- params[0] = dummy.next('a');
- dummy.remove();
- },
- extractTargets : function(obj) {
- var thisPlugin = this;
- var wrap = $('.xe_content', obj);
- if(wrap.length) {
- this.extractTargets(wrap);
- return;
- }
-
- $(obj)
- .contents()
- .each(function(){
- var node_name = this.nodeName.toLowerCase();
- if($.inArray(node_name, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style', 'iframe', 'button', 'img', 'embed', 'object', 'ins']) != -1) return;
-
- // FIX ME : When this meanless code wasn't executed, url_regex do not run correctly. why?
- url_regex.exec('');
-
- if(this.nodeType == 3) { // text node
- var content = this.nodeValue;
-
- if(content.length < 5) return;
-
- if(!/(http|https|ftp|news|telnet|irc|mms):\/\//i.test(content)) return;
-
- thisPlugin.targets.push(this);
- } else {
- thisPlugin.extractTargets(this);
- }
- });
- }
- });
-
- xe.registerPlugin(new AutoLink());
+/**
+ * @file autolink.js
+ * @brief javascript code for autolink addon
+ * @author NHN (developers@xpressengine.com)
+ */
+(function($){
+ var protocol_re = '(https?|ftp|news|telnet|irc|mms)://';
+ var domain_re = '(?:[\\w\\-]+\\.)+(?:[a-z]+)';
+ var max_255_re = '(?:1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9]?[0-9])';
+ var ip_re = '(?:'+max_255_re+'\\.){3}'+max_255_re;
+ var port_re = '(?::([0-9]+))?';
+ var user_re = '(?:/~[\\w-]+)?';
+ var path_re = '((?:/[\\w!"$-/:-@]+)*)';
+ var hash_re = '(?:#([\\w!-@]+))?';
+
+ var url_regex = new RegExp('('+protocol_re+'('+domain_re+'|'+ip_re+'|localhost'+')'+port_re+user_re+path_re+hash_re+')', 'ig');
+
+ var AutoLink = xe.createPlugin("autolink", {
+ targets : [],
+ init : function() {
+ this.targets = [];
+ },
+ API_ONREADY : function() {
+ var thisPlugin = this;
+
+ // extract target text nodes
+ this.extractTargets($('.xe_content'));
+
+ $(this.targets).each(function(){
+ thisPlugin.cast('AUTOLINK', [this]);
+ });
+ },
+ API_AUTOLINK : function(oSender, params) {
+ var textNode = params[0];
+ if(!$(textNode).parent().length || $(textNode).parent().get(0).nodeName.toLowerCase() == 'a') return;
+ var content = textNode.nodeValue;
+ var dummy = $('');
+
+ content = content.replace(//g, '>');
+ content = content.replace(url_regex, '$1');
+
+ $(textNode).before(dummy);
+ $(textNode).replaceWith(content);
+ params[0] = dummy.next('a');
+ dummy.remove();
+ },
+ extractTargets : function(obj) {
+ var thisPlugin = this;
+ var wrap = $('.xe_content', obj);
+ if(wrap.length) {
+ this.extractTargets(wrap);
+ return;
+ }
+
+ $(obj)
+ .contents()
+ .each(function(){
+ var node_name = this.nodeName.toLowerCase();
+ if($.inArray(node_name, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style', 'iframe', 'button', 'img', 'embed', 'object', 'ins']) != -1) return;
+
+ // FIX ME : When this meanless code wasn't executed, url_regex do not run correctly. why?
+ url_regex.exec('');
+
+ if(this.nodeType == 3) { // text node
+ var content = this.nodeValue;
+
+ if(content.length < 5) return;
+
+ if(!/(http|https|ftp|news|telnet|irc|mms):\/\//i.test(content)) return;
+
+ thisPlugin.targets.push(this);
+ } else {
+ thisPlugin.extractTargets(this);
+ }
+ });
+ }
+ });
+
+ xe.registerPlugin(new AutoLink());
})(jQuery);
\ No newline at end of file
diff --git a/addons/autolink/conf/info.xml b/addons/autolink/conf/info.xml
index 017183672..0790b8198 100644
--- a/addons/autolink/conf/info.xml
+++ b/addons/autolink/conf/info.xml
@@ -1,53 +1,53 @@
-
-
- 자동 링크 애드온
- 自動リンクアドオン
- Auto Link
- Auto Link
- 自动链接插件
- auto vínculo addon
- авто ссылка аддон
- Auto-Link Addon
- 自動連結
-
- 글과 댓글의 내용 중 URL 문자열에 링크를 걸어주는 애드온입니다.
-
-
- 書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ、または同一ウィンドウに開くメニュが現れるアドオンです。
-
-
- This addon makes a link to a string that starts with http.
-
-
- Addon này sẽ tự động tạo ra một đường Link khi gặp chuỗi kí tự 'http' có trong bài viết.
-
-
- 主题及评论中以http开始的字符串,自动转换为链接。并且鼠标移到链接上方时,将出现可选(新窗/本页面)提示框。
-
-
- Los comentarios que comienzan con http naeyongjung tema común de la cadena para vincular automáticamente a colgar el puntero del ratón sobre cada uno de los vínculos y saechang Ciudad y aparecen en el menú de add-on de decoración.
-
-
- Комментарии, которые начинаются с http naeyongjung темой общей строки автоматически ссылку повесить мышь над каждой ссылке и saechang Сити и появляться на меню добавить-на украшения.
-
-
- Kommentare beginnen mit http naeyongjung Thema der gemeinsamen String automatisch Link zu hängen Sie mit der Maus über die einzelnen Links und saechang Stadt und auf dem Menü des Add-On Dekoration.
-
-
- 是種可將主題和評論內容中的URL網址字串自動轉換成連結的附加元件。
-
- 0.1
- 2008-04-22
-
-
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
-
-
+
+
+ 자동 링크 애드온
+ 自動リンクアドオン
+ Auto Link Addon
+ Auto Link
+ 自动链接插件
+ auto vínculo addon
+ Аддон авто-ссылки
+ Auto-Link Addon
+ 自動連結
+
+ 글과 댓글의 내용 중 URL 문자열에 링크를 걸어주는 애드온입니다.
+
+
+ 書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ、または同一ウィンドウに開くメニュが現れるアドオンです。
+
+
+ This addon automatically transforms text URLs encountered in posts and comments into linkable URLs.
+
+
+ Addon này sẽ tự động tạo ra một đường Link khi gặp chuỗi kí tự 'http' có trong bài viết.
+
+
+ 主题及评论中以http开始的字符串,自动转换为链接。并且鼠标移到链接上方时,将出现可选(新窗/本页面)提示框。
+
+
+ Los comentarios que comienzan con http naeyongjung tema común de la cadena para vincular automáticamente a colgar el puntero del ratón sobre cada uno de los vínculos y saechang Ciudad y aparecen en el menú de add-on de decoración.
+
+
+ Этот аддон-дополнение переводит все неактивные ссылки, которые встречаются в статьях и комментариях, в рабочие ссылки.
+
+
+ Kommentare beginnen mit http naeyongjung Thema der gemeinsamen String automatisch Link zu hängen Sie mit der Maus über die einzelnen Links und saechang Stadt und auf dem Menü des Add-On Dekoration.
+
+
+ 是種可將主題和評論內容中的URL網址字串自動轉換成連結的附加元件。
+
+ 0.1
+ 2008-04-22
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php
index 7b294e8e3..e3e241d6f 100644
--- a/addons/blogapi/blogapi.addon.php
+++ b/addons/blogapi/blogapi.addon.php
@@ -1,468 +1,435 @@
-domain, '', 'mid',$site_module_info->mid, 'act','api');
-
- // 헤더에 rsd태그 삽입
- Context::addHtmlHeader(" ".'');
- }
-
- // act가 api가 아니면 그냥 리턴~
- if($_REQUEST['act']!='api') return;
-
- // 관련 func 파일 읽음
- require_once('./addons/blogapi/blogapi.func.php');
-
- // xmlprc 파싱
- // 요청된 xmlrpc를 파싱
- $oXmlParser = new XmlParser();
- $xmlDoc = $oXmlParser->parse();
-
- $method_name = $xmlDoc->methodcall->methodname->body;
- $params = $xmlDoc->methodcall->params->param;
- if($params && !is_array($params)) $params = array($params);
-
- // 일부 methodname에 대한 호환
- if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) {
- $method_name = str_replace('metaWeblog.', 'blogger.', $method_name);
- }
-
- // blogger.deletePost일 경우 첫번째 인자 값 삭제
- if($method_name == 'blogger.deletePost') array_shift($params);
-
- // user_id, password를 구해서 로그인 시도
- $user_id = trim($params[1]->value->string->body);
- $password = trim($params[2]->value->string->body);
-
- // 모듈 실행전이라면 인증을 처리한다.
- if($called_position == 'before_module_init') {
-
- // member controller을 이용해서 로그인 시도
- if($user_id && $password) {
- $oMemberController = &getController('member');
- $output = $oMemberController->doLogin($user_id, $password);
- // 로그인 실패시 에러 메시지 출력
- if(!$output->toBool()) {
- $content = getXmlRpcFailure(1, $output->getMessage());
- printContent($content);
- }
- } else {
- $content = getXmlRpcFailure(1, 'not logged');
- printContent($content);
- }
- }
-
- // 모듈에서 무언가 작업을 하기 전에 blogapi tool의 요청에 대한 처리를 하고 강제 종료한다.
- if($called_position == 'before_module_proc') {
-
- // 글쓰기 권한 체크 (권한명의 경우 약속이 필요할듯..)
- if(!$this->grant->write_document) {
- printContent( getXmlRpcFailure(1, 'no permission') );
- }
-
- // 카테고리의 정보를 구해옴
- $oDocumentModel = &getModel('document');
- $category_list = $oDocumentModel->getCategoryList($this->module_srl);
-
- // 임시 파일 저장 장소 지정
- $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id);
- $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id);
-
- switch($method_name) {
- // 블로그 정보
- case 'blogger.getUsersBlogs' :
- $obj->url = getFullSiteUrl('');
- $obj->blogid = $this->mid;
- $obj->blogName = $this->module_info->browser_title;
- $blog_list = array($obj);
-
- $content = getXmlRpcResponse($blog_list);
- printContent($content);
- break;
-
- // 카테고리 목록 return
- case 'metaWeblog.getCategories' :
- $category_obj_list = array();
- if($category_list) {
- foreach($category_list as $category_srl => $category_info) {
- unset($obj);
- $obj->description = $category_info->title;
- //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1';
- //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1';
- $obj->title = $category_info->title;
- $obj->categoryid = $category_srl;
- $category_obj_list[] = $obj;
- }
- }
-
- $content = getXmlRpcResponse($category_obj_list);
- printContent($content);
- break;
-
- // 파일 업로드
- case 'metaWeblog.newMediaObject' :
- // 파일 업로드 권한 체크
- $oFileModel = &getModel('file');
- $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl);
- if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) {
- $logged_info = Context::get('logged_info');
- if($logged_info->is_admin != 'Y') {
- $is_permitted = false;
- for($i=0;$idownload_grant);$i++) {
- $group_srl = $file_module_config->download_grant[$i];
- if($logged_info->group_list[$group_srl]) {
- $is_permitted = true;
- break;
- }
- }
- if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') );
- }
- }
-
- $fileinfo = $params[3]->value->struct->member;
- foreach($fileinfo as $key => $val) {
- $nodename = $val->name->body;
- if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body);
- elseif($nodename == 'name') $filename = $val->value->string->body;
- }
-
- $tmp_arr = explode('/',$filename);
- $filename = array_pop($tmp_arr);
-
- if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path);
-
- $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename);
- FileHandler::writeFile($target_filename, $filedata);
- $obj->url = Context::getRequestUri().$target_filename;
-
- $content = getXmlRpcResponse($obj);
- printContent($content);
- break;
-
- // 글 가져오기
- case 'metaWeblog.getPost' :
- $document_srl = $params[0]->value->string->body;
- if(!$document_srl) {
- printContent( getXmlRpcFailure(1, 'no permission') );
- } else {
- $oDocumentModel = &getModel('document');
- $oDocument = $oDocumentModel->getDocument($document_srl);
- if(!$oDocument->isExists() || !$oDocument->isGranted()) {
- printContent( getXmlRpcFailure(1, 'no permission') );
- } else {
- // 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅
- $category = "";
- if($oDocument->get('category_srl')) {
- $oDocumentModel = &getModel('document');
- $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl'));
- if($category_list[$oDocument->get('category_srl')]) {
- $category = $category_list[$oDocument->get('category_srl')]->title;
- }
- }
-
- $content = sprintf(
- ''.
- ''.
- ''.
- ''.
- ''.
- ''.
- 'categories'.
- 'dateCreated%s'.
- 'description'.
- 'link%s'.
- 'postid%s'.
- 'title'.
- 'publish1'.
- ''.
- ''.
- ''.
- ''.
- '',
- $category,
- date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()),
- $oDocument->getContent(false, false, true,false),
- getFullUrl('','document_srl', $oDocument->document_srl),
- $oDocument->document_srl,
- $oDocument->getTitleText()
- );
- printContent($content);
- }
- }
- break;
-
- // 글작성
- case 'metaWeblog.newPost' :
- unset($obj);
- $info = $params[3];
- // 글, 제목, 카테고리 정보 구함
- for($i=0;$ivalue->struct->member);$i++) {
- $val = $info->value->struct->member[$i];
- switch($val->name->body) {
- case 'title' :
- $obj->title = $val->value->string->body;
- break;
- case 'description' :
- $obj->content = $val->value->string->body;
- break;
- case 'categories' :
- $categories = $val->value->array->data->value;
- if(!is_array($categories)) $categories = array($categories);
- $category = $categories[0]->string->body;
- if($category && $category_list) {
- foreach($category_list as $category_srl => $category_info) {
- if($category_info->title == $category) $obj->category_srl = $category_srl;
- }
- }
- break;
- case 'tagwords' :
- $tags = $val->value->array->data->value;
- if(!is_array($tags)) $tags = array($tags);
- for($j=0;$jstring->body;
- }
- if(count($tag_list)) $obj->tags = implode(',',$tag_list);
- break;
- }
-
- }
-
- // 문서 번호 설정
- $document_srl = getNextSequence();
- $obj->document_srl = $document_srl;
- $obj->module_srl = $this->module_srl;
-
- // 첨부파일 정리
- if(is_dir($tmp_uploaded_path)) {
- $file_list = FileHandler::readDir($tmp_uploaded_path);
- $file_count = count($file_list);
- if($file_count) {
- $oFileController = &getController('file');
- for($i=0;$i<$file_count;$i++) {
- $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]);
- $file_info['name'] = $file_list[$i];
- $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true);
- }
- $obj->uploaded_count = $file_count;
- }
- }
-
- $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content);
-
- $oDocumentController = &getController('document');
- $obj->allow_comment = 'Y';
- $obj->allow_trackback = 'Y';
- $output = $oDocumentController->insertDocument($obj);
-
- if(!$output->toBool()) {
- $content = getXmlRpcFailure(1, $output->getMessage());
- } else {
- $content = getXmlRpcResponse(strval($document_srl));
- }
- FileHandler::removeDir($tmp_uploaded_path);
-
- printContent($content);
- break;
-
- // 글 수정
- case 'metaWeblog.editPost' :
- $tmp_val = $params[0]->value->string->body;
- if(!$tmp_val) $tmp_val = $params[0]->value->i4->body;
- if(!$tmp_val) {
- $content = getXmlRpcFailure(1, 'no permission');
- break;
- }
- $tmp_arr = explode('/', $tmp_val);
- $document_srl = array_pop($tmp_arr);
- if(!$document_srl) {
- $content = getXmlRpcFailure(1, 'no permission');
- break;
- }
-
- $oDocumentModel = &getModel('document');
- $oDocument = $oDocumentModel->getDocument($document_srl);
-
- // 글 수정 권한 체크
- if(!$oDocument->isGranted()) {
- $content = getXmlRpcFailure(1, 'no permission');
- break;
- }
-
- $obj = $oDocument->getObjectVars();
-
- $info = $params[3];
-
- // 글, 제목, 카테고리 정보 구함
- for($i=0;$ivalue->struct->member);$i++) {
- $val = $info->value->struct->member[$i];
- switch($val->name->body) {
- case 'title' :
- $obj->title = $val->value->string->body;
- break;
- case 'description' :
- $obj->content = $val->value->string->body;
- break;
- case 'categories' :
- $categories = $val->value->array->data->value;
- if(!is_array($categories)) $categories = array($categories);
- $category = $categories[0]->string->body;
- if($category && $category_list) {
- foreach($category_list as $category_srl => $category_info) {
- if($category_info->title == $category) $obj->category_srl = $category_srl;
- }
- }
- break;
- case 'tagwords' :
- $tags = $val->value->array->data->value;
- if(!is_array($tags)) $tags = array($tags);
- for($j=0;$jstring->body;
- }
- if(count($tag_list)) $obj->tags = implode(',',$tag_list);
- break;
- }
-
- }
-
- // 문서 번호 설정
- $obj->document_srl = $document_srl;
- $obj->module_srl = $this->module_srl;
-
- // 첨부파일 정리
- if(is_dir($tmp_uploaded_path)) {
- $file_list = FileHandler::readDir($tmp_uploaded_path);
- $file_count = count($file_list);
- if($file_count) {
- $oFileController = &getController('file');
- for($i=0;$i<$file_count;$i++) {
- $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]);
- $file_info['name'] = $file_list[$i];
-
- $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']);
- if(file_exists($moved_filename)) continue;
-
- $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true);
- }
- $obj->uploaded_count += $file_count;
- }
- }
-
- $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content);
-
- $oDocumentController = &getController('document');
- $output = $oDocumentController->updateDocument($oDocument,$obj);
-
- if(!$output->toBool()) {
- $content = getXmlRpcFailure(1, $output->getMessage());
- } else {
- $content = getXmlRpcResponse(true);
- FileHandler::removeDir($tmp_uploaded_path);
- }
-
- printContent($content);
- break;
-
- // 글삭제
- case 'blogger.deletePost' :
- $tmp_val = $params[0]->value->string->body;
- $tmp_arr = explode('/', $tmp_val);
- $document_srl = array_pop($tmp_arr);
-
- // 글 받아오기
- $oDocumentModel = &getModel('document');
- $oDocument = $oDocumentModel->getDocument($document_srl);
-
- // 글 존재
- if(!$oDocument->isExists()) {
- $content = getXmlRpcFailure(1, 'not exists');
-
- // 글 삭제 권한 체크
- } elseif(!$oDocument->isGranted()) {
- $content = getXmlRpcFailure(1, 'no permission');
- break;
-
- // 삭제
- } else {
- $oDocumentController = &getController('document');
- $output = $oDocumentController->deleteDocument($document_srl);
- if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage());
- else $content = getXmlRpcResponse(true);
- }
-
- printContent($content);
- break;
-
- // 최신글 받기
- case 'metaWeblog.getRecentPosts' :
- // 목록을 구하기 위한 옵션
- $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl
- $args->page = 1;
- $args->list_count = 20;
- $args->sort_index = 'list_order'; ///< 소팅 값
- $logged_info = Context::get('logged_info');
- $args->search_target = 'member_srl';
- $args->search_keyword = $logged_info->member_srl;
- $output = $oDocumentModel->getDocumentList($args);
- if(!$output->toBool() || !$output->data) {
- $content = getXmlRpcFailure(1, 'post not founded');
- printContent($content);
- } else {
- $oEditorController = &getController('editor');
-
- $posts = array();
- foreach($output->data as $key => $oDocument) {
- $post = null;
- $post->categories = array();
- $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime());
- $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false)));
- $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl);
- $post->postid = $oDocument->document_srl;
- $post->title = htmlspecialchars($oDocument->get('title'));
- $post->publish = 1;
- $post->userid = $oDocument->get('user_id');
- $post->mt_allow_pings = 0;
- $post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0;
- $posts[] = $post;
- }
- $content = getXmlRpcResponse($posts);
- printContent($content);
- }
- break;
-
- // 아무런 요청이 없을 경우 RSD 출력
- default :
-
- $homepagelink = getUrl('','mid',$this->mid);
- $site_module_info = Context::get('site_module_info');
- $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api');
- $content = <<
-
-
- XpressEngine
- http://www.xpressengine.com/
- {$homepagelink}
-
-
-
-
-
-RSDContent;
- printContent($content);
- break;
- }
- }
-?>
+domain, '', 'mid',$site_module_info->mid, 'act','api');
+ // Insert rsd tag into the header
+ Context::addHtmlHeader(" ".'');
+}
+// If act isnot api, just return
+if($_REQUEST['act']!='api') return;
+// Read func file
+require_once('./addons/blogapi/blogapi.func.php');
+// xmlprc parsing
+// Parse the requested xmlrpc
+$oXmlParser = new XmlParser();
+$xmlDoc = $oXmlParser->parse();
+
+$method_name = $xmlDoc->methodcall->methodname->body;
+$params = $xmlDoc->methodcall->params->param;
+if($params && !is_array($params)) $params = array($params);
+// Compatible with some of methodname
+if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) {
+ $method_name = str_replace('metaWeblog.', 'blogger.', $method_name);
+}
+// Delete the first argument if it is blogger.deletePost
+if($method_name == 'blogger.deletePost') array_shift($params);
+// Get user_id, password and attempt log-in
+$user_id = trim($params[1]->value->string->body);
+$password = trim($params[2]->value->string->body);
+// Before executing the module, authentication is processed.
+if($called_position == 'before_module_init') {
+ // Attempt log-in by using member controller
+ if($user_id && $password) {
+ $oMemberController = &getController('member');
+ $output = $oMemberController->doLogin($user_id, $password);
+ // If login fails, an error message appears
+ if(!$output->toBool()) {
+ $content = getXmlRpcFailure(1, $output->getMessage());
+ printContent($content);
+ }
+ } else {
+ $content = getXmlRpcFailure(1, 'not logged');
+ printContent($content);
+ }
+}
+// Before module processing, handle requests from blogapi tool and then terminate.
+if($called_position == 'before_module_proc') {
+ // Check writing permission
+ if(!$this->grant->write_document) {
+ printContent( getXmlRpcFailure(1, 'no permission') );
+ }
+ // Get information of the categories
+ $oDocumentModel = &getModel('document');
+ $category_list = $oDocumentModel->getCategoryList($this->module_srl);
+ // Specifies a temporary file storage
+ $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id);
+ $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id);
+
+ switch($method_name) {
+ // Blog information
+ case 'blogger.getUsersBlogs' :
+ $obj->url = getFullSiteUrl('');
+ $obj->blogid = $this->mid;
+ $obj->blogName = $this->module_info->browser_title;
+ $blog_list = array($obj);
+
+ $content = getXmlRpcResponse($blog_list);
+ printContent($content);
+ break;
+ // Return a list of categories
+ case 'metaWeblog.getCategories' :
+ $category_obj_list = array();
+ if($category_list) {
+ foreach($category_list as $category_srl => $category_info) {
+ unset($obj);
+ $obj->description = $category_info->title;
+ //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1';
+ //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1';
+ $obj->title = $category_info->title;
+ $obj->categoryid = $category_srl;
+ $category_obj_list[] = $obj;
+ }
+ }
+
+ $content = getXmlRpcResponse($category_obj_list);
+ printContent($content);
+ break;
+ // Upload file
+ case 'metaWeblog.newMediaObject' :
+ // Check a file upload permission
+ $oFileModel = &getModel('file');
+ $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl);
+ if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) {
+ $logged_info = Context::get('logged_info');
+ if($logged_info->is_admin != 'Y') {
+ $is_permitted = false;
+ for($i=0;$idownload_grant);$i++) {
+ $group_srl = $file_module_config->download_grant[$i];
+ if($logged_info->group_list[$group_srl]) {
+ $is_permitted = true;
+ break;
+ }
+ }
+ if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') );
+ }
+ }
+
+ $fileinfo = $params[3]->value->struct->member;
+ foreach($fileinfo as $key => $val) {
+ $nodename = $val->name->body;
+ if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body);
+ elseif($nodename == 'name') $filename = $val->value->string->body;
+ }
+
+ $tmp_arr = explode('/',$filename);
+ $filename = array_pop($tmp_arr);
+
+ if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path);
+
+ $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename);
+ FileHandler::writeFile($target_filename, $filedata);
+ $obj->url = Context::getRequestUri().$target_filename;
+
+ $content = getXmlRpcResponse($obj);
+ printContent($content);
+ break;
+ // Get posts
+ case 'metaWeblog.getPost' :
+ $document_srl = $params[0]->value->string->body;
+ if(!$document_srl) {
+ printContent( getXmlRpcFailure(1, 'no permission') );
+ } else {
+ $oDocumentModel = &getModel('document');
+ $oDocument = $oDocumentModel->getDocument($document_srl);
+ if(!$oDocument->isExists() || !$oDocument->isGranted()) {
+ printContent( getXmlRpcFailure(1, 'no permission') );
+ } else {
+ // Get a list of categories and set Context
+ $category = "";
+ if($oDocument->get('category_srl')) {
+ $oDocumentModel = &getModel('document');
+ $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl'));
+ if($category_list[$oDocument->get('category_srl')]) {
+ $category = $category_list[$oDocument->get('category_srl')]->title;
+ }
+ }
+
+ $content = sprintf(
+ ''.
+ ''.
+ ''.
+ ''.
+ ''.
+ ''.
+ 'categories'.
+ 'dateCreated%s'.
+ 'description'.
+ 'link%s'.
+ 'postid%s'.
+ 'title'.
+ 'publish1'.
+ ''.
+ ''.
+ ''.
+ ''.
+ '',
+ $category,
+ date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()),
+ $oDocument->getContent(false, false, true,false),
+ getFullUrl('','document_srl', $oDocument->document_srl),
+ $oDocument->document_srl,
+ $oDocument->getTitleText()
+ );
+ printContent($content);
+ }
+ }
+ break;
+ // Write a new post
+ case 'metaWeblog.newPost' :
+ unset($obj);
+ $info = $params[3];
+ // Get information of post, title, and category
+ for($i=0;$ivalue->struct->member);$i++) {
+ $val = $info->value->struct->member[$i];
+ switch($val->name->body) {
+ case 'title' :
+ $obj->title = $val->value->string->body;
+ break;
+ case 'description' :
+ $obj->content = $val->value->string->body;
+ break;
+ case 'categories' :
+ $categories = $val->value->array->data->value;
+ if(!is_array($categories)) $categories = array($categories);
+ $category = $categories[0]->string->body;
+ if($category && $category_list) {
+ foreach($category_list as $category_srl => $category_info) {
+ if($category_info->title == $category) $obj->category_srl = $category_srl;
+ }
+ }
+ break;
+ case 'tagwords' :
+ $tags = $val->value->array->data->value;
+ if(!is_array($tags)) $tags = array($tags);
+ for($j=0;$jstring->body;
+ }
+ if(count($tag_list)) $obj->tags = implode(',',$tag_list);
+ break;
+ }
+
+ }
+ // Set document srl
+ $document_srl = getNextSequence();
+ $obj->document_srl = $document_srl;
+ $obj->module_srl = $this->module_srl;
+ // Attachment
+ if(is_dir($tmp_uploaded_path)) {
+ $file_list = FileHandler::readDir($tmp_uploaded_path);
+ $file_count = count($file_list);
+ if($file_count) {
+ $oFileController = &getController('file');
+ for($i=0;$i<$file_count;$i++) {
+ $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]);
+ $file_info['name'] = $file_list[$i];
+ $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true);
+ }
+ $obj->uploaded_count = $file_count;
+ }
+ }
+
+ $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content);
+
+ $oDocumentController = &getController('document');
+ $obj->commentStatus = 'ALLOW';
+ $obj->allow_trackback = 'Y';
+ $output = $oDocumentController->insertDocument($obj);
+
+ if(!$output->toBool()) {
+ $content = getXmlRpcFailure(1, $output->getMessage());
+ } else {
+ $content = getXmlRpcResponse(strval($document_srl));
+ }
+ FileHandler::removeDir($tmp_uploaded_path);
+
+ printContent($content);
+ break;
+ // Edit post
+ case 'metaWeblog.editPost' :
+ $tmp_val = $params[0]->value->string->body;
+ if(!$tmp_val) $tmp_val = $params[0]->value->i4->body;
+ if(!$tmp_val) {
+ $content = getXmlRpcFailure(1, 'no permission');
+ break;
+ }
+ $tmp_arr = explode('/', $tmp_val);
+ $document_srl = array_pop($tmp_arr);
+ if(!$document_srl) {
+ $content = getXmlRpcFailure(1, 'no permission');
+ break;
+ }
+
+ $oDocumentModel = &getModel('document');
+ $oDocument = $oDocumentModel->getDocument($document_srl);
+ // Check if a permission to modify a document is granted
+ if(!$oDocument->isGranted()) {
+ $content = getXmlRpcFailure(1, 'no permission');
+ break;
+ }
+
+ $obj = $oDocument->getObjectVars();
+
+ $info = $params[3];
+ // Get information of post, title, and category
+ for($i=0;$ivalue->struct->member);$i++) {
+ $val = $info->value->struct->member[$i];
+ switch($val->name->body) {
+ case 'title' :
+ $obj->title = $val->value->string->body;
+ break;
+ case 'description' :
+ $obj->content = $val->value->string->body;
+ break;
+ case 'categories' :
+ $categories = $val->value->array->data->value;
+ if(!is_array($categories)) $categories = array($categories);
+ $category = $categories[0]->string->body;
+ if($category && $category_list) {
+ foreach($category_list as $category_srl => $category_info) {
+ if($category_info->title == $category) $obj->category_srl = $category_srl;
+ }
+ }
+ break;
+ case 'tagwords' :
+ $tags = $val->value->array->data->value;
+ if(!is_array($tags)) $tags = array($tags);
+ for($j=0;$jstring->body;
+ }
+ if(count($tag_list)) $obj->tags = implode(',',$tag_list);
+ break;
+ }
+
+ }
+ // Document srl
+ $obj->document_srl = $document_srl;
+ $obj->module_srl = $this->module_srl;
+ // Attachment
+ if(is_dir($tmp_uploaded_path)) {
+ $file_list = FileHandler::readDir($tmp_uploaded_path);
+ $file_count = count($file_list);
+ if($file_count) {
+ $oFileController = &getController('file');
+ for($i=0;$i<$file_count;$i++) {
+ $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]);
+ $file_info['name'] = $file_list[$i];
+
+ $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']);
+ if(file_exists($moved_filename)) continue;
+
+ $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true);
+ }
+ $obj->uploaded_count += $file_count;
+ }
+ }
+
+ $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content);
+
+ $oDocumentController = &getController('document');
+ $output = $oDocumentController->updateDocument($oDocument,$obj);
+
+ if(!$output->toBool()) {
+ $content = getXmlRpcFailure(1, $output->getMessage());
+ } else {
+ $content = getXmlRpcResponse(true);
+ FileHandler::removeDir($tmp_uploaded_path);
+ }
+
+ printContent($content);
+ break;
+ // Delete the post
+ case 'blogger.deletePost' :
+ $tmp_val = $params[0]->value->string->body;
+ $tmp_arr = explode('/', $tmp_val);
+ $document_srl = array_pop($tmp_arr);
+ // Get a document
+ $oDocumentModel = &getModel('document');
+ $oDocument = $oDocumentModel->getDocument($document_srl);
+ // If the document exists
+ if(!$oDocument->isExists()) {
+ $content = getXmlRpcFailure(1, 'not exists');
+ // Check if a permission to delete a document is granted
+ } elseif(!$oDocument->isGranted()) {
+ $content = getXmlRpcFailure(1, 'no permission');
+ break;
+ // Delete
+ } else {
+ $oDocumentController = &getController('document');
+ $output = $oDocumentController->deleteDocument($document_srl);
+ if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage());
+ else $content = getXmlRpcResponse(true);
+ }
+
+ printContent($content);
+ break;
+ // Get recent posts
+ case 'metaWeblog.getRecentPosts' :
+ // Options to get a list
+ $args->module_srl = $this->module_srl; // /< module_srl of the current module
+ $args->page = 1;
+ $args->list_count = 20;
+ $args->sort_index = 'list_order'; // /< Sorting values
+ $logged_info = Context::get('logged_info');
+ $args->search_target = 'member_srl';
+ $args->search_keyword = $logged_info->member_srl;
+ $output = $oDocumentModel->getDocumentList($args);
+ if(!$output->toBool() || !$output->data) {
+ $content = getXmlRpcFailure(1, 'post not founded');
+ printContent($content);
+ } else {
+ $oEditorController = &getController('editor');
+
+ $posts = array();
+ foreach($output->data as $key => $oDocument) {
+ $post = null;
+ $post->categories = array();
+ $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime());
+ $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false)));
+ $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl);
+ $post->postid = $oDocument->document_srl;
+ $post->title = htmlspecialchars($oDocument->get('title'));
+ $post->publish = 1;
+ $post->userid = $oDocument->get('user_id');
+ $post->mt_allow_pings = 0;
+ $post->mt_allow_comments = $oDocument->allowComment()?1:0;
+ $posts[] = $post;
+ }
+ $content = getXmlRpcResponse($posts);
+ printContent($content);
+ }
+ break;
+ // Display RSD if there is no request
+ default :
+ $homepagelink = getUrl('','mid',$this->mid);
+ $site_module_info = Context::get('site_module_info');
+ $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api');
+ $content = <<
+
+
+ XpressEngine
+ http://www.xpressengine.com/
+ {$homepagelink}
+
+
+
+
+
+RSDContent;
+ printContent($content);
+ break;
+ }
+}
+?>
diff --git a/addons/blogapi/blogapi.func.php b/addons/blogapi/blogapi.func.php
index 511ac44e3..2d289bf40 100644
--- a/addons/blogapi/blogapi.func.php
+++ b/addons/blogapi/blogapi.func.php
@@ -1,69 +1,66 @@
-\n\n\nfaultCode\n%d\n\n\nfaultString\n%s\n\n\n\n",
- $error,
- htmlspecialchars($message)
- );
- }
-
- // 결과 표시
- function getXmlRpcResponse($params) {
- $buff = ''."\n";
- $buff .= _getEncodedVal($params);
- $buff .= "\n\n";
-
- return $buff;
- }
-
- // 인코딩 처리
- function _getEncodedVal($val, $is_sub_set = false) {
- if(is_int($val)) $buff = sprintf("%d", $val);
- elseif(is_string($val)&&preg_match('/^([0-9]+)T([0-9\:]+)$/', $val)) $buff = sprintf("%s\n", $val);
- elseif(is_double($val)) $buff = sprintf("%f", $val);
- elseif(is_bool($val)) $buff = sprintf("%d", $val?1:0);
- elseif(is_object($val)) {
- $values = get_object_vars($val);
- $val_count = count($values);
- $buff = "";
- foreach($values as $k => $v) {
- $buff .= sprintf("\n%s\n%s\n", htmlspecialchars($k), _getEncodedVal($v, true));
- }
- $buff .= "\n";
- } elseif(is_array($val)) {
- $val_count = count($val);
- $buff = "\n";
- for($i=0;$i<$val_count;$i++) {
- $buff .= _getEncodedVal($val[$i], true);
- }
- $buff .= "\n";
- } else {
- $buff = sprintf("%s\n", $val);
- }
- if(!$is_sub_set) return sprintf("\n%s", $buff);
- return $buff;
- }
-
- // 결과 출력
- function printContent($content) {
- header("Content-Type: text/xml; charset=UTF-8");
- header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
- header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
- header("Cache-Control: no-store, no-cache, must-revalidate");
- header("Cache-Control: post-check=0, pre-check=0", false);
- header("Pragma: no-cache");
- print $content;
- Context::close();
- exit();
- }
-?>
+\n\n\nfaultCode\n%d\n\n\nfaultString\n%s\n\n\n\n",
+ $error,
+ htmlspecialchars($message)
+ );
+ }
+ // Display results
+ function getXmlRpcResponse($params) {
+ $buff = ''."\n";
+ $buff .= _getEncodedVal($params);
+ $buff .= "\n\n";
+
+ return $buff;
+ }
+ // Encoding
+ function _getEncodedVal($val, $is_sub_set = false) {
+ if(is_int($val)) $buff = sprintf("%d", $val);
+ elseif(is_string($val)&&preg_match('/^([0-9]+)T([0-9\:]+)$/', $val)) $buff = sprintf("%s\n", $val);
+ elseif(is_double($val)) $buff = sprintf("%f", $val);
+ elseif(is_bool($val)) $buff = sprintf("%d", $val?1:0);
+ elseif(is_object($val)) {
+ $values = get_object_vars($val);
+ $val_count = count($values);
+ $buff = "";
+ foreach($values as $k => $v) {
+ $buff .= sprintf("\n%s\n%s\n", htmlspecialchars($k), _getEncodedVal($v, true));
+ }
+ $buff .= "\n";
+ } elseif(is_array($val)) {
+ $val_count = count($val);
+ $buff = "\n";
+ for($i=0;$i<$val_count;$i++) {
+ $buff .= _getEncodedVal($val[$i], true);
+ }
+ $buff .= "\n";
+ } else {
+ $buff = sprintf("%s\n", $val);
+ }
+ if(!$is_sub_set) return sprintf("\n%s", $buff);
+ return $buff;
+ }
+ // Display the result
+ function printContent($content) {
+ header("Content-Type: text/xml; charset=UTF-8");
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-store, no-cache, must-revalidate");
+ header("Cache-Control: post-check=0, pre-check=0", false);
+ header("Pragma: no-cache");
+ print $content;
+ Context::close();
+ exit();
+ }
+?>
diff --git a/addons/blogapi/conf/info.xml b/addons/blogapi/conf/info.xml
index f533cd4a6..90ce15f96 100644
--- a/addons/blogapi/conf/info.xml
+++ b/addons/blogapi/conf/info.xml
@@ -1,80 +1,80 @@
-
-
- BlogAPI 애드온
- BlogAPIアドオン
- BlogAPI
- Addon for BlogAPI
- BlogAPI Addon
- Addon für BlogAPI
- Addon para BlogAPI
- Аддон для BlogAPI
- 部落格 API
-
- metaWeblog를 지원하는 blogApi애드온입니다.
- 사용으로 설정하시면 각 모듈마다 RSD 태그를 노출합니다.
- api의 주소는 http://설치주소/모듈명/api 입니다.
- 사용으로 하셔야 RSD태그 및 api가 동작을 합니다.
-
-
- MetaWeblogをサポートするBlog APIアドオンです。
- 「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。
- APIのアドレスは「http://インストールURL/モジュール名/api」です。
- 「使用する」に設定してから、RSDタグ、およびAPIが作動します。
-
-
- 支持metaWeblog的 blogApi插件。
- 设置为"启用"时,会使每个模块都会显示RSD标签。
- api地址为http://安装地址/模块名/api。
- 把状态设置为"使用"时,才会激活RSD标签及api。
-
-
- This blogApi addon supports metaWeblog.
- By using this option, it lets the RSD tag to be exposed to each module.
- URL to the api is http://setup_path/module_name/api.
- RSD tag and the api will work only if u use this addon.
-
-
- Addon BlogAPI này hỗ trợ metaWeblog..
- Bằng việc sử dụng tùy chọn này, Tag RSD sẽ được hiển thị đến mỗi Module.
- URL cho API có dạng http://setup_path/module_name/api.
- RSD Tag và API chỉ làm việc khi Addon này được kích hoạt.
-
-
- Diese blogApi addon metaWeblog unterstützt.
- Durch die Verwendung dieser Option, die es ermöglicht RSD Tag ausgesetzt werden jedes Modul.
- URL der api ist http://setup_path/module_name/api.
- RSD-Tag und dem API arbeiten und nur dann, wenn Sie über dieses Addon.
-
-
- Este blogApi addon soporta el metaWeblog.
- Si seleccionas la optión usar, cada módulo entregará la etiqueta RSD.
- La dirección de api es http://dirección de la instalación/nombre de módulo/api.
- Sólo si seleccionas la opción usar, funcionará la etiqueta RSD y api.
-
-
- Этот blogApi аддон поддерживает metaWeblog.
- Используя этот аддон, RSD тег становится доступным для каждого модуля.
- URL для api - http://setup_path/module_name/api.
- тег RSD и api работают только при включенном аддоне.
-
-
- 支援 MetaWeblog 的部落格 API 附加元件。
- 設置成"啟用"時,會使每個模組都顯示 RSD 圖示。
- API網址是 http://安裝位置/模組名稱/api。
- 將狀態設置成"啟用"時,才可使用 RSD 和 API
-
- 0.1
- 2007-02-28
-
-
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
-
-
+
+
+ BlogAPI 애드온
+ BlogAPIアドオン
+ BlogAPI
+ Addon for BlogAPI
+ BlogAPI Addon
+ Addon für BlogAPI
+ Addon para BlogAPI
+ Аддон для BlogAPI
+ 部落格 API
+
+ metaWeblog를 지원하는 blogApi애드온입니다.
+ 사용으로 설정하시면 각 모듈마다 RSD 태그를 노출합니다.
+ api의 주소는 http://설치주소/모듈명/api 입니다.
+ 사용으로 하셔야 RSD태그 및 api가 동작을 합니다.
+
+
+ MetaWeblogをサポートするBlog APIアドオンです。
+ 「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。
+ APIのアドレスは「http://インストールURL/モジュール名/api」です。
+ 「使用する」に設定してから、RSDタグ、およびAPIが作動します。
+
+
+ 支持metaWeblog的 blogApi插件。
+ 设置为"启用"时,会使每个模块都会显示RSD标签。
+ api地址为http://安装地址/模块名/api。
+ 把状态设置为"使用"时,才会激活RSD标签及api。
+
+
+ This blogAPI addon supports metaWeblog.
+ By using this option, it lets the RSD tag to be exposed to each module.
+ URL to the API is http://setup_path/module_name/api.
+ RSD tag and the api will work only if you use this addon.
+
+
+ Addon BlogAPI này hỗ trợ metaWeblog..
+ Bằng việc sử dụng tùy chọn này, Tag RSD sẽ được hiển thị đến mỗi Module.
+ URL cho API có dạng http://setup_path/module_name/api.
+ RSD Tag và API chỉ làm việc khi Addon này được kích hoạt.
+
+
+ Diese blogApi addon metaWeblog unterstützt.
+ Durch die Verwendung dieser Option, die es ermöglicht RSD Tag ausgesetzt werden jedes Modul.
+ URL der api ist http://setup_path/module_name/api.
+ RSD-Tag und dem API arbeiten und nur dann, wenn Sie über dieses Addon.
+
+
+ Este blogApi addon soporta el metaWeblog.
+ Si seleccionas la optión usar, cada módulo entregará la etiqueta RSD.
+ La dirección de api es http://dirección de la instalación/nombre de módulo/api.
+ Sólo si seleccionas la opción usar, funcionará la etiqueta RSD y api.
+
+
+ Этот blogApi аддон поддерживает metaWeblog.
+ Используя этот аддон, RSD тег становится доступным для каждого модуля.
+ URL для api - http://setup_path/module_name/api.
+ тег RSD и api работают только при включенном аддоне.
+
+
+ 支援 MetaWeblog 的部落格 API 附加元件。
+ 設置成"啟用"時,會使每個模組都顯示 RSD 圖示。
+ API網址是 http://安裝位置/模組名稱/api。
+ 將狀態設置成"啟用"時,才可使用 RSD 和 API
+
+ 0.1
+ 2007-02-28
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
diff --git a/addons/captcha/captcha.addon.php b/addons/captcha/captcha.addon.php
index 83dc587f1..ad6520eec 100644
--- a/addons/captcha/captcha.addon.php
+++ b/addons/captcha/captcha.addon.php
@@ -1,263 +1,326 @@
-addon_info = $addon_info;
- }
-
- function before_module_proc()
- {
- if($this->addon_info->act_type == 'everytime' && $_SESSION['captcha_authed']) {
- unset($_SESSION['captcha_authed']);
- }
- }
-
- function before_module_init(&$ModuleHandler)
- {
- $logged_info = Context::get('logged_info');
- if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return false;
- if($this->addon_info->target != 'all' && Context::get('is_logged')) return false;
- if($_SESSION['captcha_authed']) return false;
-
- $target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory','procTextyleInsertComment');
- if($this->addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount';
- if($this->addon_info->apply_resend_auth_mail=='apply') $target_acts[] = 'procMemberResendAuthMail';
- if($this->addon_info->apply_signup=='apply') $target_acts[] = 'procMemberInsert';
-
- if(Context::getRequestMethod()!='XMLRPC' && Context::getRequestMethod()!=='JSON')
- {
- Context::addHtmlHeader('');
- Context::addJsFile('./addons/captcha/captcha.js',false, '', null, 'body');
- }
-
- // 게시판/ 이슈트래커의 글쓰기/댓글쓰기 액션 호출시 세션 비교
- if(!$_SESSION['captcha_authed'] && in_array(Context::get('act'), $target_acts)) {
- Context::loadLang('./addons/captcha/lang');
- $ModuleHandler->error = "captcha_denied";
- }
-
- return true;
- }
-
- function before_module_init_setCaptchaSession()
- {
- if($_SESSION['captcha_authed']) return false;
-
- // 언어파일 로드
- Context::loadLang(_XE_PATH_.'addons/captcha/lang');
-
- // 키워드 생성
- $arr = range('A','Y');
- shuffle($arr);
- $arr = array_slice($arr,0,6);
- $_SESSION['captcha_keyword'] = join('', $arr);
-
- $target = Context::getLang('target_captcha');
- header("Content-Type: text/xml; charset=UTF-8");
- header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
- header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
- header("Cache-Control: no-store, no-cache, must-revalidate");
- header("Cache-Control: post-check=0, pre-check=0", false);
- header("Pragma: no-cache");
- printf("\r\n 0\r\n success\r\n \r\n \r\n \r\n \r\n \r\n "
- ,Context::getLang('about_captcha')
- ,Context::getLang('captcha_reload')
- ,Context::getLang('captcha_play')
- ,Context::getLang('cmd_input')
- ,Context::getLang('cmd_cancel')
- );
- Context::close();
- exit();
- }
-
- function before_module_init_captchaImage()
- {
- if($_SESSION['captcha_authed']) return false;
-
- $keyword = $_SESSION['captcha_keyword'];
- $im = $this->createCaptchaImage($keyword);
-
- header("Cache-Control: ");
- header("Pragma: ");
- header("Content-Type: image/png");
-
- imagepng($im);
- imagedestroy($im);
-
- Context::close();
- exit();
- }
-
- function createCaptchaImage($string)
- {
- $arr = array();
- for($i=0,$c=strlen($string);$i<$c;$i++) $arr[] = $string{$i};
-
- // 글자 하나 사이즈
- $w = 18;
- $h = 25;
-
- // 글자 수
- $c = count($arr);
-
- // 글자 이미지
- $im = array();
-
- // 총사이즈로 바탕 이미지 생성
- $im[] = imagecreate(($w+2)*count($arr), $h);
-
- $deg = range(-30,30);
- shuffle($deg);
-
- // 글자별 이미지 생성
- foreach($arr as $i => $str)
- {
- $im[$i+1] = @imagecreate($w, $h);
- $background_color = imagecolorallocate($im[$i+1], 255, 255, 255);
- $text_color = imagecolorallocate($im[$i+1], 0, 0, 0);
-
- // 글자폰트(사이즈) 조절
- $ran = range(1,20);
- shuffle($ran);
-
- if(function_exists('imagerotate'))
- {
- imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%8), $str, $text_color);
- $im[$i+1] = imagerotate($im[$i+1], array_pop($deg), 0);
-
- $background_color = imagecolorallocate($im[$i+1], 255, 255, 255);
- imagecolortransparent($im[$i+1], $background_color);
- }
- else
- {
- imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%4), $str, $text_color);
- }
- }
-
- // 각글자 이미지를 합침
- for($i=1;$icreateCaptchaAudio($keyword);
-
- header('Content-type: audio/mpeg');
- header("Content-Disposition: attachment; filename=\"captcha_audio.mp3\"");
- header('Cache-Control: no-store, no-cache, must-revalidate');
- header('Expires: Sun, 1 Jan 2000 12:00:00 GMT');
- header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT');
- header('Content-Length: ' . strlen($data));
-
- echo $data;
- Context::close();
- exit();
- }
-
- function createCaptchaAudio($string)
- {
- $data = '';
- $_audio = './addons/captcha/audio/F_%s.mp3';
- for($i=0,$c=strlen($string);$i<$c;$i++)
- {
- $_data = FileHandler::readFile(sprintf($_audio, $string{$i}));
-
- $start = rand(5, 68); // 해더 4바이트, 데이터 영역 64바이트 정도 랜덤하게 시작
- $datalen = strlen($_data) - $start - 256; // 마지막 unchanged 256 바이트
-
- for($j=$start;$j<$datalen;$j+=64)
- {
- $ch = ord($_data{$j});
- if($ch<9 || $ch>119) continue;
- $_data{$j} = chr($ch+rand(-8,8));
- }
-
- $data .= $_data;
- }
-
- return $data;
- }
-
- function before_module_init_captchaCompare()
- {
- if($_SESSION['captcha_authed']) return false;
-
- if(strtoupper($_SESSION['captcha_keyword']) == strtoupper(Context::get('secret_text'))) $_SESSION['captcha_authed'] = true;
- else unset($_SESSION['captcha_authed']);
-
- header("Content-Type: text/xml; charset=UTF-8");
- header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
- header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
- header("Cache-Control: no-store, no-cache, must-revalidate");
- header("Cache-Control: post-check=0, pre-check=0", false);
- header("Pragma: no-cache");
- print("\r\n0\r\nsuccess\r\n");
-
- Context::close();
- exit();
- }
- }
-
- $GLOBALS['__AddonCaptcha__'] = new AddonCaptcha;
- $GLOBALS['__AddonCaptcha__']->setInfo($addon_info);
- }
-
- $oAddonCaptcha = &$GLOBALS['__AddonCaptcha__'];
-
- if(method_exists(&$oAddonCaptcha, $called_position))
- {
- if(!call_user_func(array(&$oAddonCaptcha, $called_position), &$this)) return false;
- }
-
- $addon_act = Context::get('captcha_action');
- if($addon_act && method_exists(&$oAddonCaptcha, $called_position.'_'.$addon_act))
- {
- if(!call_user_func(array(&$oAddonCaptcha, $called_position.'_'.$addon_act), &$this)) return false;
- }
-
-?>
+addon_info = $addon_info;
+ }
+
+ function before_module_proc()
+ {
+ if($this->addon_info->act_type == 'everytime' && $_SESSION['captcha_authed']) {
+ unset($_SESSION['captcha_authed']);
+ }
+ }
+
+ function before_module_init(&$ModuleHandler)
+ {
+ $logged_info = Context::get('logged_info');
+ if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return false;
+ if($this->addon_info->target != 'all' && Context::get('is_logged')) return false;
+ if($_SESSION['captcha_authed']) return false;
+
+ $type = Context::get('captchaType');
+
+ $target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory','procTextyleInsertComment');
+ if($this->addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount';
+ if($this->addon_info->apply_resend_auth_mail=='apply') $target_acts[] = 'procMemberResendAuthMail';
+ if($this->addon_info->apply_signup=='apply') $target_acts[] = 'procMemberInsert';
+
+ if(Context::getRequestMethod()!='XMLRPC' && Context::getRequestMethod()!=='JSON')
+ {
+ if($type == 'inline') {
+ $this->compareCaptcha();
+ } else {
+ Context::addHtmlHeader('');
+ Context::loadFile(array('./addons/captcha/captcha.js', 'body', '', null), true);
+ }
+ }
+
+ // compare session when calling actions such as writing a post or a comment on the board/issue tracker module
+ if(!$_SESSION['captcha_authed'] && in_array(Context::get('act'), $target_acts)) {
+ Context::loadLang('./addons/captcha/lang');
+ $ModuleHandler->error = "captcha_denied";
+ }
+
+ return true;
+ }
+
+ function createKeyword()
+ {
+ $type = Context::get('captchaType');
+ if ($type == 'inline' && $_SESSION['captcha_keyword']) return;
+
+ $arr = range('A','Y');
+ shuffle($arr);
+ $arr = array_slice($arr,0,6);
+ $_SESSION['captcha_keyword'] = join('', $arr);
+ }
+
+ function before_module_init_setCaptchaSession()
+ {
+ if($_SESSION['captcha_authed']) return false;
+ // Load language files
+
+ Context::loadLang(_XE_PATH_.'addons/captcha/lang');
+ // Generate keywords
+
+ $this->createKeyword();
+
+ $target = Context::getLang('target_captcha');
+ header("Content-Type: text/xml; charset=UTF-8");
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-store, no-cache, must-revalidate");
+ header("Cache-Control: post-check=0, pre-check=0", false);
+ header("Pragma: no-cache");
+ printf("\r\n 0\r\n success\r\n \r\n \r\n \r\n \r\n \r\n "
+ ,Context::getLang('about_captcha')
+ ,Context::getLang('captcha_reload')
+ ,Context::getLang('captcha_play')
+ ,Context::getLang('cmd_input')
+ ,Context::getLang('cmd_cancel')
+ );
+ Context::close();
+ exit();
+ }
+
+ function before_module_init_captchaImage()
+ {
+ if($_SESSION['captcha_authed']) return false;
+ if(Context::get('renew')) $this->createKeyword();
+
+ $keyword = $_SESSION['captcha_keyword'];
+ $im = $this->createCaptchaImage($keyword);
+
+ header("Cache-Control: ");
+ header("Pragma: ");
+ header("Content-Type: image/png");
+
+ imagepng($im);
+ imagedestroy($im);
+
+ Context::close();
+ exit();
+ }
+
+ function createCaptchaImage($string)
+ {
+ $arr = array();
+ for($i=0,$c=strlen($string);$i<$c;$i++) $arr[] = $string{$i};
+ // Font site
+
+ $w = 18;
+ $h = 25;
+ // Character length
+
+ $c = count($arr);
+ // Character image
+
+ $im = array();
+ // Create an image by total size
+
+ $im[] = imagecreate(($w+2)*count($arr), $h);
+
+ $deg = range(-30,30);
+ shuffle($deg);
+ // Create an image for each letter
+
+ foreach($arr as $i => $str)
+ {
+ $im[$i+1] = @imagecreate($w, $h);
+ $background_color = imagecolorallocate($im[$i+1], 255, 255, 255);
+ $text_color = imagecolorallocate($im[$i+1], 0, 0, 0);
+ // Control font size
+
+ $ran = range(1,20);
+ shuffle($ran);
+
+ if(function_exists('imagerotate'))
+ {
+ imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%8), $str, $text_color);
+ $im[$i+1] = imagerotate($im[$i+1], array_pop($deg), 0);
+
+ $background_color = imagecolorallocate($im[$i+1], 255, 255, 255);
+ imagecolortransparent($im[$i+1], $background_color);
+ }
+ else
+ {
+ imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%4), $str, $text_color);
+ }
+ }
+
+ // Combine images of each character
+
+ for($i=1;$icreateCaptchaAudio($keyword);
+
+ header('Content-type: audio/mpeg');
+ header("Content-Disposition: attachment; filename=\"captcha_audio.mp3\"");
+ header('Cache-Control: no-store, no-cache, must-revalidate');
+ header('Expires: Sun, 1 Jan 2000 12:00:00 GMT');
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT');
+ header('Content-Length: ' . strlen($data));
+
+ echo $data;
+ Context::close();
+ exit();
+ }
+
+ function createCaptchaAudio($string)
+ {
+ $data = '';
+ $_audio = './addons/captcha/audio/F_%s.mp3';
+ for($i=0,$c=strlen($string);$i<$c;$i++)
+ {
+ $_data = FileHandler::readFile(sprintf($_audio, $string{$i}));
+
+ $start = rand(5, 68); // Random start in 4-byte header and 64 byte data
+ $datalen = strlen($_data) - $start - 256; // Last unchanged 256 bytes
+
+ for($j=$start;$j<$datalen;$j+=64)
+ {
+ $ch = ord($_data{$j});
+ if($ch<9 || $ch>119) continue;
+ $_data{$j} = chr($ch+rand(-8,8));
+ }
+
+ $data .= $_data;
+ }
+
+ return $data;
+ }
+
+ function compareCaptcha()
+ {
+ if($_SESSION['captcha_authed']) return true;
+
+ if(strtoupper($_SESSION['captcha_keyword']) == strtoupper(Context::get('secret_text'))) {
+ $_SESSION['captcha_authed'] = true;
+ return true;
+ }
+
+ unset($_SESSION['captcha_authed']);
+
+ return false;
+ }
+
+ function before_module_init_captchaCompare()
+ {
+ if(!$this->compareCaptcha()) return false;
+
+ header("Content-Type: text/xml; charset=UTF-8");
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-store, no-cache, must-revalidate");
+ header("Cache-Control: post-check=0, pre-check=0", false);
+ header("Pragma: no-cache");
+ print("\r\n0\r\nsuccess\r\n");
+
+ Context::close();
+ exit();
+ }
+
+ function inlineDisplay()
+ {
+ unset($_SESSION['captcha_authed']);
+ $this->createKeyword();
+
+ $swfURL = getUrl().'addons/captcha/swf/play.swf';
+ Context::unloadFile('./addons/captcha/captcha.js');
+ Context::loadFile(array('./addons/captcha/inline_captcha.js','body'));
+
+ global $lang;
+
+ $tags=<<
+
+
+
+
+
+EOD;
+ $tags = sprintf($tags, getUrl('captcha_action','captchaImage', 'rand', mt_rand(10000, 99999))
+ , $swfURL
+ , $swfURL
+ , $lang->reload
+ , $lang->play);
+ return $tags;
+ }
+ }
+
+ $GLOBALS['__AddonCaptcha__'] = new AddonCaptcha;
+ $GLOBALS['__AddonCaptcha__']->setInfo($addon_info);
+ Context::set('oCaptcha', &$GLOBALS['__AddonCaptcha__']);
+ }
+
+ $oAddonCaptcha = &$GLOBALS['__AddonCaptcha__'];
+
+ if(method_exists($oAddonCaptcha, $called_position))
+ {
+ if(!call_user_func_array(array(&$oAddonCaptcha, $called_position), array(&$this))) return false;
+ }
+
+ $addon_act = Context::get('captcha_action');
+ if($addon_act && method_exists($oAddonCaptcha, $called_position.'_'.$addon_act))
+ {
+ if(!call_user_func_array(array(&$oAddonCaptcha, $called_position.'_'.$addon_act), array(&$this))) return false;
+ }
+
+?>
diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml
index e2353c16b..904baabf2 100644
--- a/addons/captcha/conf/info.xml
+++ b/addons/captcha/conf/info.xml
@@ -1,222 +1,221 @@
-
-
- Captcha 애드온
- CAPTCHA
- Captcha Addon
- 验证码插件
- Captchaアドオン
- Аддон Captcha
- 圖形驗證
-
- 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 알파벳을 입력해야 글/댓글이 입력되는 애드온 입니다.
- 로그인하지 않은 경우에만 해당됩니다.
-
-
- To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment.
- This addon applies only to not-logged-in users.
-
-
- Addon này tạo ra một hình ảnh xác nhận khi đăng kí, gửi bài, hay viết bình luận nếu thành viên không đăng nhập.
- Addon này chỉ hoạt động khi được kích hoạt.
-
-
- 为了解决互联网垃圾而开发的验证码机制。
- 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。
-
-
- ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。
- ログインしてない時だけ、動作します。
-
-
- To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment.
- This addon applies only to not-logged-in users.
-
-
- 可防止機器人程式的垃圾留言,非用戶要發表主題或回覆時,必須要輸入正確圖片中所顯示的文字才能發表。
-
- 1.0
- 2010-08-19
-
-
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
-
-
-
-
- Captcha 표시 대상
- 应用对象
- Captchaを表示する対象
- 選擇目標
- Captcha Target
- Captcha Target
- Mục tiêu Captcha hiển thị
- 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다
- 可以指定验证码应用对象(管理员除外)。
- 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。
- 除了管理員,可以選擇圖形驗證應用的對象。
- You may specify targets CAPTCHA work. It's not applied when administrator writes.
- You may specify targets CAPTCHA work. It's not applied when administrator writes.
- Khi gửi bài, bình luận, Capcha sẽ hiển thị để xác nhận hành động của người sử dụng. Chức năng này không hoạt động với người quản lý.
-
- 로그인하지 않은 사용자
- 非登录用户
- ログインしてないユーザー
- 非用戶
- Not logged-in users
- Not logged-in users
- Người dùng chưa đăng nhập
-
-
- 모든 사용자
- 所有用户
- すべてのユーザー
- 所有用戶
- All users
- All users
- Tất cả mọi người
-
-
-
- 동작 방식
- 验证方式
- 動作方式
- 驗證模式
- How it works
- How it works
- Sử dụng
- "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다
- "一次"就是每个IP只出现一次验证。
- 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。
- 選擇"單次",下次不會再顯示;選擇"每次"則會一直顯示。
- If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes.
- If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes.
- Nếu chọn "Chỉ một lần" thì sau lần hiển thị đó Capcha sẽ không hiển thị với người sử dụng đó nữa.
-
- 1번만 동작
- 一次
- 1回だけ表示
- 單次
- Chỉ một lần
- once
- 1 раз
-
-
- 매번 동작
- 每次
- 毎回表示
- 每次
- every time
- каждый раз
- Luôn sử dụng
-
-
-
- 비밀번호 찾기 적용
- 应用到查找密码功能
- 비밀번호 찾기 적용
- 忘記密碼
- applying to an action finding account
- applying to an action finding account
- Khi lấy lại mật khẩu
- 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
- 启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。
- 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
- 開啟功能後在忘記密碼時會顯示驗證碼。
- If you set this option as apply, CAPTCHA will work for finding account action, too.
- If you set this option as apply, CAPTCHA will work for finding account action, too.
- Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này.
-
- 적용하지 않음
- 不启用
- 적용하지 않음
- 關閉
- Not apply
- Not apply
- Không áp dụng
-
-
- 적용
- 启用
- 적용
- 開啟
- Apply
- Apply
- Áp dụng
-
-
-
- 인증 메일 재발송 적용
- 应用到认证邮件重新发送功能
- 인증 메일 재발송 적용
- 重寄認證信
- apply to an action resending authmail
- apply to an action resending authmail
- Khi lấy lại mã kích hoạt
- 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
- 启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。
- 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
- 開啟功能後在重寄認證信時會顯示驗證碼。
- If you set this option as apply, CAPTCHA will work for resending authmail action, too.
- If you set this option as apply, CAPTCHA will work for resending authmail action, too.
- Nếu áp dụng, khi thành viên cần lấy lại mã kích hoạt thành viên, Capcha sẽ hiện thị để xác nhận việc này.
-
- 적용하지 않음
- 不启用
- 적용하지 않음
- 關閉
- Not apply
- Not apply
- Không áp dụng
-
-
- 적용
- 启用
- 적용
- 開啟
- Apply
- Apply
- Áp dụng
-
-
-
- 회원 가입 적용
- 应用到用户注册表单
- 인증 메일 재발송 적용
- 會員註冊
- Apply to member signup
- Apply to member signup
- Apply to member signup
- 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.
- 启用此项功能可以有效地拦截自动注册软件的施虐。
- 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.
- 開啟功能後在註冊時會顯示驗證碼。
- If you set this option as apply, CAPTCHA will work for signup action, too.
- If you set this option as apply, CAPTCHA will work for signup action, too.
- If you set this option as apply, CAPTCHA will work for signup action, too.
-
- 적용하지 않음
- 不启用
- 적용하지 않음
- 關閉
- Not apply
- Not apply
- Không áp dụng
-
-
- 적용
- 启用
- 적용
- 開啟
- Apply
- Apply
- Áp dụng
-
-
-
-
+
+
+ Captcha 애드온
+ CAPTCHA
+ Captcha Addon
+ 验证码插件
+ Captchaアドオン
+ Аддон Captcha
+ 圖形驗證
+
+ 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 알파벳을 입력해야 글/댓글이 입력되는 애드온 입니다.
+ 로그인하지 않은 경우에만 해당됩니다.
+
+
+ This addon helps to prevent spam messages to be posted by requesting non-logged-in users to type characters displayed in the image before submitting comments or posts.
+
+
+ Addon này tạo ra một hình ảnh xác nhận khi đăng kí, gửi bài, hay viết bình luận nếu thành viên không đăng nhập.
+ Addon này chỉ hoạt động khi được kích hoạt.
+
+
+ 为了解决互联网垃圾而开发的验证码机制。
+ 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。
+
+
+ ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。
+ ログインしてない時だけ、動作します。
+
+
+ To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment.
+ This addon applies only to not-logged-in users.
+
+
+ 可防止機器人程式的垃圾留言,非用戶要發表主題或回覆時,必須要輸入正確圖片中所顯示的文字才能發表。
+
+ 1.0
+ 2010-08-19
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
+
+
+ Captcha 표시 대상
+ 应用对象
+ Captchaを表示する対象
+ 選擇目標
+ Captcha Target
+ Captcha Target
+ Mục tiêu Captcha hiển thị
+ 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다
+ 可以指定验证码应用对象(管理员除外)。
+ 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。
+ 除了管理員,可以選擇圖形驗證應用的對象。
+ You can specify if CAPTCHA should be displayed when posting an article or comment. It will not apply to administrators.
+ You may specify targets CAPTCHA work. It's not applied when administrator writes.
+ Khi gửi bài, bình luận, Capcha sẽ hiển thị để xác nhận hành động của người sử dụng. Chức năng này không hoạt động với người quản lý.
+
+ 로그인하지 않은 사용자
+ 非登录用户
+ ログインしてないユーザー
+ 非用戶
+ Not logged-in users
+ Not logged-in users
+ Người dùng chưa đăng nhập
+
+
+ 모든 사용자
+ 所有用户
+ すべてのユーザー
+ 所有用戶
+ All users
+ All users
+ Tất cả mọi người
+
+
+
+ 동작 방식
+ 验证方式
+ 動作方式
+ 驗證模式
+ How it works
+ How it works
+ Sử dụng
+ "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다
+ "一次"就是每个IP只出现一次验证。
+ 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。
+ 選擇"單次",下次不會再顯示;選擇"每次"則會一直顯示。
+ If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes.
+ If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes.
+ Nếu chọn "Chỉ một lần" thì sau lần hiển thị đó Capcha sẽ không hiển thị với người sử dụng đó nữa.
+
+ 1번만 동작
+ 一次
+ 1回だけ表示
+ 單次
+ Chỉ một lần
+ once
+ 1 раз
+
+
+ 매번 동작
+ 每次
+ 毎回表示
+ 每次
+ every time
+ каждый раз
+ Luôn sử dụng
+
+
+
+ 비밀번호 찾기 적용
+ 应用到查找密码功能
+ 비밀번호 찾기 적용
+ 忘記密碼
+ applying to an action finding account
+ applying to an action finding account
+ Khi lấy lại mật khẩu
+ 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
+ 启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。
+ 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
+ 開啟功能後在忘記密碼時會顯示驗證碼。
+ If you set this option as apply, CAPTCHA will work for finding account action, too.
+ If you set this option as apply, CAPTCHA will work for finding account action, too.
+ Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này.
+
+ 적용하지 않음
+ 不启用
+ 적용하지 않음
+ 關閉
+ Not apply
+ Not apply
+ Không áp dụng
+
+
+ 적용
+ 启用
+ 적용
+ 開啟
+ Apply
+ Apply
+ Áp dụng
+
+
+
+ 인증 메일 재발송 적용
+ 应用到认证邮件重新发送功能
+ 인증 메일 재발송 적용
+ 重寄認證信
+ apply to an action resending authmail
+ apply to an action resending authmail
+ Khi lấy lại mã kích hoạt
+ 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
+ 启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。
+ 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.
+ 開啟功能後在重寄認證信時會顯示驗證碼。
+ If you set this option as apply, CAPTCHA will work for resending authmail action, too.
+ If you set this option as apply, CAPTCHA will work for resending authmail action, too.
+ Nếu áp dụng, khi thành viên cần lấy lại mã kích hoạt thành viên, Capcha sẽ hiện thị để xác nhận việc này.
+
+ 적용하지 않음
+ 不启用
+ 적용하지 않음
+ 關閉
+ Not apply
+ Not apply
+ Không áp dụng
+
+
+ 적용
+ 启用
+ 적용
+ 開啟
+ Apply
+ Apply
+ Áp dụng
+
+
+
+ 회원 가입 적용
+ 应用到用户注册表单
+ 인증 메일 재발송 적용
+ 會員註冊
+ Apply to member signup
+ Apply to member signup
+ Apply to member signup
+ 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.
+ 启用此项功能可以有效地拦截自动注册软件的施虐。
+ 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.
+ 開啟功能後在註冊時會顯示驗證碼。
+ If you set this option as apply, CAPTCHA will work for signup action, too.
+ If you set this option as apply, CAPTCHA will work for signup action, too.
+ If you set this option as apply, CAPTCHA will work for signup action, too.
+
+ 적용하지 않음
+ 不启用
+ 적용하지 않음
+ 關閉
+ Not apply
+ Not apply
+ Không áp dụng
+
+
+ 적용
+ 启用
+ 적용
+ 開啟
+ Apply
+ Apply
+ Áp dụng
+
+
+
+
diff --git a/addons/captcha/inline_captcha.js b/addons/captcha/inline_captcha.js
new file mode 100644
index 000000000..26ff64a1b
--- /dev/null
+++ b/addons/captcha/inline_captcha.js
@@ -0,0 +1,17 @@
+jQuery(function($){
+ $('button.captchaPlay')
+ .click(function(){
+ var swf = document['captcha_audio'] || window['captcha_audio'];
+ var audio = current_url.setQuery('captcha_action','captchaAudio').setQuery('rand', (new Date).getTime());
+
+ if(swf.length > 1) swf = swf[0];
+
+ $('input[type=text]#secret_text').focus();
+ swf.setSoundTarget(audio,'1');
+ });
+
+ $('button.captchaReload')
+ .click(function(){
+ $("#captcha_image").attr("src", current_url.setQuery('captcha_action','captchaImage').setQuery('rand', (new Date).getTime()).setQuery('renew',1));
+ });
+});
diff --git a/addons/captcha/lang/en.lang.php b/addons/captcha/lang/en.lang.php
deleted file mode 100644
index e08259fde..000000000
--- a/addons/captcha/lang/en.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "Please type alphabets above in order. They are not case-sensitive.";
- $lang->captcha_reload = 'Refresh Image';
- $lang->captcha_play = 'Play sound of words';
- $lang->captcha_denied = 'You have typed wrong alphabets.';
-?>
diff --git a/addons/captcha/lang/jp.lang.php b/addons/captcha/lang/jp.lang.php
deleted file mode 100644
index 791d6ad96..000000000
--- a/addons/captcha/lang/jp.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "위 영어 알파벳을 순서대로 입력해 주세요. 대소문자는 구분하지 않습니다.";
- $lang->captcha_reload = '이미지 새로고침';
- $lang->captcha_play = '음성으로 듣기';
- $lang->captcha_denied = '잘못 입력하셨습니다';
-?>
diff --git a/addons/captcha/lang/ko.lang.php b/addons/captcha/lang/ko.lang.php
deleted file mode 100644
index 791d6ad96..000000000
--- a/addons/captcha/lang/ko.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "위 영어 알파벳을 순서대로 입력해 주세요. 대소문자는 구분하지 않습니다.";
- $lang->captcha_reload = '이미지 새로고침';
- $lang->captcha_play = '음성으로 듣기';
- $lang->captcha_denied = '잘못 입력하셨습니다';
-?>
diff --git a/addons/captcha/lang/lang.xml b/addons/captcha/lang/lang.xml
new file mode 100644
index 000000000..d78bdd578
--- /dev/null
+++ b/addons/captcha/lang/lang.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/captcha/lang/ru.lang.php b/addons/captcha/lang/ru.lang.php
deleted file mode 100644
index 791d6ad96..000000000
--- a/addons/captcha/lang/ru.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "위 영어 알파벳을 순서대로 입력해 주세요. 대소문자는 구분하지 않습니다.";
- $lang->captcha_reload = '이미지 새로고침';
- $lang->captcha_play = '음성으로 듣기';
- $lang->captcha_denied = '잘못 입력하셨습니다';
-?>
diff --git a/addons/captcha/lang/vi.lang.php b/addons/captcha/lang/vi.lang.php
deleted file mode 100644
index 791d6ad96..000000000
--- a/addons/captcha/lang/vi.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "위 영어 알파벳을 순서대로 입력해 주세요. 대소문자는 구분하지 않습니다.";
- $lang->captcha_reload = '이미지 새로고침';
- $lang->captcha_play = '음성으로 듣기';
- $lang->captcha_denied = '잘못 입력하셨습니다';
-?>
diff --git a/addons/captcha/lang/zh-CN.lang.php b/addons/captcha/lang/zh-CN.lang.php
deleted file mode 100644
index 791d6ad96..000000000
--- a/addons/captcha/lang/zh-CN.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "위 영어 알파벳을 순서대로 입력해 주세요. 대소문자는 구분하지 않습니다.";
- $lang->captcha_reload = '이미지 새로고침';
- $lang->captcha_play = '음성으로 듣기';
- $lang->captcha_denied = '잘못 입력하셨습니다';
-?>
diff --git a/addons/captcha/lang/zh-TW.lang.php b/addons/captcha/lang/zh-TW.lang.php
deleted file mode 100644
index 6e557f93d..000000000
--- a/addons/captcha/lang/zh-TW.lang.php
+++ /dev/null
@@ -1,6 +0,0 @@
-about_captcha = "請依序輸入圖片中的文字,不分大小寫。";
- $lang->captcha_reload = '更換';
- $lang->captcha_play = '播放';
- $lang->captcha_denied = '輸入錯誤';
-?>
diff --git a/addons/counter/conf/info.xml b/addons/counter/conf/info.xml
index 7114c2380..c3ea6dccb 100644
--- a/addons/counter/conf/info.xml
+++ b/addons/counter/conf/info.xml
@@ -1,62 +1,62 @@
-
-
- 기본 카운터 애드온
- アクセスカウンターアドオン
- 网站访问统计
- Counter Addon
- Counter Addon
- Counter Addon
- Addon contador básico
- Аддон счетчика
- 網站訪問統計
-
- XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다.
- 이 애드온을 켜셔야 접속 정보 수집이 됩니다.
-
-
- XEのアクセスカウンターモジュールで接続(アクセス)情報を記録します。
- このアドオンを「使用」に設定してから、接続(アクセス)情報が記録されます。
-
-
- 利用XE的网站访问统计模块记录网站访问信息。
- 把状态设置为"使用"时,才会记录网站访问信息.
-
-
- This addon logs access information based on the basic counter module within XE.
- The access information will be collected only if you turn on this addon.
-
-
- Addon này sẽ tổng hợp tất cả những lượt truy cập vào Website qua Module Counter có sẵn bên trong XE.
- Thông tin truy nhập chỉ được tập hợp khi bạn bật Addon này..
-
-
- Dieses Addon-Logs Zugriff auf Informationen basiert auf den grundlegenden Zähler-Modul innerhalb XE.
- Der Zugang zu Informationen wird nur erhoben, wenn Sie über dieses Addon.
-
-
- Este addon contador básico de XE permite llevar la información de acceso a la página web de los visitantes.
- Es necesario activar este addon para agregar la información de acceso.
-
-
- Этот аддон пишет в лог информацию о доступе к сайту, основанную на базовом модуле счетчика в XE.
- Для сбора информации необходимо включить этот аддон.
-
-
- 使用XE的網站訪問統計模組記錄網站訪問資料。
- 將狀態設置成"使用"時,才會紀錄網站訪問資料。
-
- 0.1
- 2007-02-28
-
-
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
-
-
+
+
+ 기본 카운터 애드온
+ アクセスカウンターアドオン
+ 网站访问统计
+ Counter Addon
+ Counter Addon
+ Counter Addon
+ Addon contador básico
+ Аддон счетчика
+ 網站訪問統計
+
+ XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다.
+ 이 애드온을 켜셔야 접속 정보 수집이 됩니다.
+
+
+ XEのアクセスカウンターモジュールで接続(アクセス)情報を記録します。
+ このアドオンを「使用」に設定してから、接続(アクセス)情報が記録されます。
+
+
+ 利用XE的网站访问统计模块记录网站访问信息。
+ 把状态设置为"使用"时,才会记录网站访问信息.
+
+
+ This addon logs access information based on the basic counter module within XE.
+ The access information will be collected only if you enable this addon.
+
+
+ Addon này sẽ tổng hợp tất cả những lượt truy cập vào Website qua Module Counter có sẵn bên trong XE.
+ Thông tin truy nhập chỉ được tập hợp khi bạn bật Addon này..
+
+
+ Dieses Addon-Logs Zugriff auf Informationen basiert auf den grundlegenden Zähler-Modul innerhalb XE.
+ Der Zugang zu Informationen wird nur erhoben, wenn Sie über dieses Addon.
+
+
+ Este addon contador básico de XE permite llevar la información de acceso a la página web de los visitantes.
+ Es necesario activar este addon para agregar la información de acceso.
+
+
+ Этот аддон пишет в лог информацию о доступе к сайту, основанную на базовом модуле счетчика в XE.
+ Для сбора информации необходимо включить этот аддон.
+
+
+ 使用XE的網站訪問統計模組記錄網站訪問資料。
+ 將狀態設置成"使用"時,才會紀錄網站訪問資料。
+
+ 0.1
+ 2007-02-28
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
diff --git a/addons/counter/counter.addon.php b/addons/counter/counter.addon.php
index d46ad7b9e..3d6c8115e 100644
--- a/addons/counter/counter.addon.php
+++ b/addons/counter/counter.addon.php
@@ -1,14 +1,14 @@
-procCounterExecute();
- }
-?>
+counterExecute();
+}
+?>
diff --git a/addons/member_communication/conf/info.xml b/addons/member_communication/conf/info.xml
index 25f3b7677..8fc13b5a7 100644
--- a/addons/member_communication/conf/info.xml
+++ b/addons/member_communication/conf/info.xml
@@ -1,58 +1,58 @@
-
-
- 커뮤니케이션
- コミュニケーション
- 会员交流
- Communication
- Truyền thông
- 커뮤니케이션
- 커뮤니케이션
- Общение
- 交流
-
- 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
- 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
-
-
- メッセージ・友達機能を使うにはこのアドオンを「使用」にして下さい。
-
-
- 此插件可激活短信箱及添加好友功能。
-
-
- This addon enables communication module in order to use message or friend function.
- Please enable this addon in case you want to use those functions.
-
-
- Addon này cho phép sử dụng Module truyền thông để sử dụng tin nhắn hay chức năng bạn bè.
- Hãy kích hoạt nếu bạn muốn sử dụng chức năng này.
-
-
- 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
- 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
-
-
- 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
- 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
-
-
- Активизирует модуль Общение, позволяет использование сообщений между друзьями.
-
-
- 讓會員擁有短訊和新增好友功能。
-
- 0.1
- 2008-05-28
-
-
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
-
-
+
+
+ 커뮤니케이션
+ コミュニケーション
+ 会员交流
+ Communication
+ Truyền thông
+ 커뮤니케이션
+ 커뮤니케이션
+ Общение
+ 交流
+
+ 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
+ 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
+
+
+ メッセージ・友達機能を使うにはこのアドオンを「使用」にして下さい。
+
+
+ 此插件可激活短信箱及添加好友功能。
+
+
+ This addon enables the communication module in order to use messaging or friend functions.
+ Please enable this addon in case you want to use those functions.
+
+
+ Addon này cho phép sử dụng Module truyền thông để sử dụng tin nhắn hay chức năng bạn bè.
+ Hãy kích hoạt nếu bạn muốn sử dụng chức năng này.
+
+
+ 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
+ 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
+
+
+ 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
+ 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
+
+
+ Активизирует модуль Общение, позволяет использование сообщений между друзьями.
+
+
+ 讓會員擁有短訊和新增好友功能。
+
+ 0.1
+ 2008-05-28
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
diff --git a/addons/member_communication/lang/en.lang.php b/addons/member_communication/lang/en.lang.php
deleted file mode 100644
index cc9cce249..000000000
--- a/addons/member_communication/lang/en.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = 'You have a new message. Do you want to check now?';
-?>
diff --git a/addons/member_communication/lang/es.lang.php b/addons/member_communication/lang/es.lang.php
deleted file mode 100644
index 51933d3f8..000000000
--- a/addons/member_communication/lang/es.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = 'Usted tiene un nuevo mensaje. Quiere comprobar ahora?';
-?>
diff --git a/addons/member_communication/lang/ge.lang.php b/addons/member_communication/lang/ge.lang.php
deleted file mode 100644
index d9b9dcb81..000000000
--- a/addons/member_communication/lang/ge.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = 'Sie haben eine neue Nachricht. Wollen Sie jetzt prüfen, ob?';
-?>
diff --git a/addons/member_communication/lang/jp.lang.php b/addons/member_communication/lang/jp.lang.php
deleted file mode 100644
index 7ff03c9fe..000000000
--- a/addons/member_communication/lang/jp.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = '%d個の新しいメッセージが届いています。 確認しますか?';
-?>
diff --git a/addons/member_communication/lang/ko.lang.php b/addons/member_communication/lang/ko.lang.php
deleted file mode 100644
index 697ef6d93..000000000
--- a/addons/member_communication/lang/ko.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = '%d개의 새로운 메시지가 도착하였습니다. 확인하시겠습니까?';
-?>
diff --git a/addons/member_communication/lang/lang.xml b/addons/member_communication/lang/lang.xml
new file mode 100644
index 000000000..0843743ac
--- /dev/null
+++ b/addons/member_communication/lang/lang.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/member_communication/lang/ru.lang.php b/addons/member_communication/lang/ru.lang.php
deleted file mode 100644
index 4e47c4c23..000000000
--- a/addons/member_communication/lang/ru.lang.php
+++ /dev/null
@@ -1,9 +0,0 @@
-alert_new_message_arrived = 'У Вас новые сообщения. Проверите сейчас?';
-?>
diff --git a/addons/member_communication/lang/vi.lang.php b/addons/member_communication/lang/vi.lang.php
deleted file mode 100644
index 4015a8be0..000000000
--- a/addons/member_communication/lang/vi.lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-alert_new_message_arrived = 'Bạn có một tin nhắn mới. bạn có muốn kiểm tra ngay bây giờ không?';
-?>
diff --git a/addons/member_communication/lang/zh-CN.lang.php b/addons/member_communication/lang/zh-CN.lang.php
deleted file mode 100644
index 497b4ef68..000000000
--- a/addons/member_communication/lang/zh-CN.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = '您有新消息。要确认吗?';
-?>
diff --git a/addons/member_communication/lang/zh-TW.lang.php b/addons/member_communication/lang/zh-TW.lang.php
deleted file mode 100644
index f2ffd16e8..000000000
--- a/addons/member_communication/lang/zh-TW.lang.php
+++ /dev/null
@@ -1,3 +0,0 @@
-alert_new_message_arrived = '您收到%d個新訊息。您想要檢視嗎?';
-?>
diff --git a/addons/member_communication/member_communication.addon.php b/addons/member_communication/member_communication.addon.php
index c34822a62..519c7db47 100644
--- a/addons/member_communication/member_communication.addon.php
+++ b/addons/member_communication/member_communication.addon.php
@@ -1,85 +1,71 @@
-module != 'member') {
-
- // 커뮤니케이션 모듈의 언어파일을 읽음
- Context::loadLang('./modules/communication/lang');
-
- // 회원 로그인 정보중에서 쪽지등의 메뉴를 추가
- $oMemberController = &getController('member');
- $oMemberController->addMemberMenu('dispCommunicationFriend', 'cmd_view_friend');
- $oMemberController->addMemberMenu('dispCommunicationMessages', 'cmd_view_message_box');
-
- // 새로운 쪽지에 대한 플래그가 있으면 쪽지 보기 팝업 띄움
- $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl);
- $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl);
-
- if(file_exists($flag_file)) {
- $new_message_count = FileHandler::readFile($flag_file);
- FileHandler::removeFile($flag_file);
- Context::loadLang('./addons/member_communication/lang');
-
- $script = sprintf('', sprintf(Context::getLang('alert_new_message_arrived'), $new_message_count), Context::getRequestUri().'?module=communication&act=dispCommunicationNewMessage');
-
- Context::addHtmlHeader( $script );
- }
-
- /**
- * 기능 수행 : 사용자 이름을 클릭시 요청되는 팝업메뉴의 메뉴에 쪽지 발송, 친구추가등의 링크 추가
- **/
- } elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') {
-
- $oMemberController = &getController('member');
- $member_srl = Context::get('target_srl');
- $mid = Context::get('cur_mid');
-
- // communication 모델 객체 생성
- $oCommunicationModel = &getModel('communication');
-
- // 자신이라면 쪽지함 보기 기능 추가
- if($logged_info->member_srl == $member_srl) {
-
- // 자신의 쪽지함 보기 기능 추가
- $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationMessages'), 'cmd_view_message_box', './modules/communication/tpl/images/icon_message_box.gif', 'self');
-
- // 친구 목록 보기
- $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationFriend'), 'cmd_view_friend', './modules/communication/tpl/images/icon_friend_box.gif', 'self');
-
- // 아니라면 쪽지 발송, 친구 등록 추가
- } else {
- // 대상 회원의 정보를 가져옴
- $oMemberModel = &getModel('member');
- $target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
- if(!$target_member_info->member_srl) return;
-
- // 로그인된 사용자 정보를 구함
- $logged_info = Context::get('logged_info');
-
- // 쪽지 발송 메뉴를 만듬
- if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $oCommunicationModel->isFriend($member_srl)))
- $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationSendMessage','receiver_srl',$member_srl), 'cmd_send_message', './modules/communication/tpl/images/icon_write_message.gif', 'popup');
-
- // 친구 등록 메뉴를 만듬 (이미 등록된 친구가 아닐 경우)
- if(!$oCommunicationModel->isAddedFriend($member_srl))
- $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationAddFriend','target_srl',$member_srl), 'cmd_add_friend', './modules/communication/tpl/images/icon_add_friend.gif', 'popup');
- }
- }
-?>
+module != 'member') {
+ // Load a language file from the communication module
+ Context::loadLang('./modules/communication/lang');
+ // Add menus on the member login information
+ $oMemberController = &getController('member');
+ $oMemberController->addMemberMenu('dispCommunicationFriend', 'cmd_view_friend');
+ $oMemberController->addMemberMenu('dispCommunicationMessages', 'cmd_view_message_box');
+ // Pop-up to display messages if a flag on new message is set
+ $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl);
+ $flag_file = $flag_path.$logged_info->member_srl;
+
+ if(file_exists($flag_file)) {
+ $new_message_count = trim(FileHandler::readFile($flag_file));
+ FileHandler::removeFile($flag_file);
+ Context::loadLang('./addons/member_communication/lang');
+ Context::loadFile(array('./addons/member_communication/tpl/member_communication.js'), true);
+
+ $text = preg_replace('@\r?\n@', '\\n', addslashes(Context::getLang('alert_new_message_arrived')));
+ $link = Context::getRequestUri().'?module=communication&act=dispCommunicationNewMessage';
+ $script = "";
+
+ Context::addHtmlFooter($script);
+ }
+} elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') {
+ $oMemberController = &getController('member');
+ $member_srl = Context::get('target_srl');
+ $mid = Context::get('cur_mid');
+ // Creates communication model object
+ $oCommunicationModel = &getModel('communication');
+ // Add a feature to display own message box.
+ if($logged_info->member_srl == $member_srl) {
+ // Add your own viewing Note Template
+ $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationMessages'), 'cmd_view_message_box', '', 'self');
+ // Display a list of friends
+ $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationFriend'), 'cmd_view_friend', '', 'self');
+ // If not, Add menus to send message and to add friends
+ } else {
+ // Get member information
+ $oMemberModel = &getModel('member');
+ $target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
+ if(!$target_member_info->member_srl) return;
+ // Get logged-in user information
+ $logged_info = Context::get('logged_info');
+ // Add a menu for sending message
+ if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $oCommunicationModel->isFriend($member_srl)))
+ $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationSendMessage','receiver_srl',$member_srl), 'cmd_send_message', '', 'popup');
+ // Add a menu for listing friends (if a friend is new)
+ if(!$oCommunicationModel->isAddedFriend($member_srl))
+ $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationAddFriend','target_srl',$member_srl), 'cmd_add_friend', '', 'popup');
+ }
+}
+?>
diff --git a/addons/member_communication/tpl/member_communication.js b/addons/member_communication/tpl/member_communication.js
new file mode 100644
index 000000000..d2245efa0
--- /dev/null
+++ b/addons/member_communication/tpl/member_communication.js
@@ -0,0 +1,29 @@
+(function($){
+
+window.xeNotifyMessage = function(text, count){
+ var $bar;
+
+ $bar = $('div.notifyMessage');
+ if(!$bar.length) {
+ $bar = $('')
+ .hide()
+ .css({
+ position : 'absolute',
+ background : '#ff0',
+ border : '1px solid #990',
+ textAlign : 'center'
+ })
+ .appendTo(document.body);
+ }
+
+ text = text.replace('%d', count);
+ h = $bar.html(''+text+'').height();
+ $bar.css('top', -h-4).show().animate({top:0});
+
+ // hide after 10 seconds
+ setTimeout(function(){
+ $bar.animate({top:-h-4}, function(){ $bar.hide() });
+ }, 10000);
+};
+
+})(jQuery);
diff --git a/addons/member_extra_info/conf/info.xml b/addons/member_extra_info/conf/info.xml
index 9a82ec315..f75c6d929 100644
--- a/addons/member_extra_info/conf/info.xml
+++ b/addons/member_extra_info/conf/info.xml
@@ -1,53 +1,53 @@
-
-
- 회원 확장 정보 출력
- 会員情報拡張表示
- 用户扩展信息
- Extra Member Info
- Bổ xung thông tin thành viên
- 회원 확장 정보 출력
- 회원 확장 정보 출력
- Экстраинформация о пользователях
- 用戶延伸資料
-
- 회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요.
-
-
- 会員が登録したイメージニックネーム、イメージマークを使うためにはこのアドオンをオンにして下さい。
-
-
- 此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。
-
-
- This addon displays a member's image name, image mark.
-
-
- Addon này sẽ hiển thị hình ảnh thay thế tên và hình đánh dấu của thành viên.
-
-
- This addon displays a member's image name, image mark.
-
-
- This addon displays a member's image name, image mark.
-
-
- Аддон изображает имя, марку картинки пользователя.
-
-
- 可將用戶資料中的暱稱圖片、用戶圖示、簽名檔等資料顯示到頁面當中。
-
- 0.2
- 2007-02-28
-
-
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
- NHN
-
-
+
+
+ 회원 확장 정보 출력
+ 会員情報拡張表示
+ 用户扩展信息
+ Extra Member Info
+ Bổ xung thông tin thành viên
+ 회원 확장 정보 출력
+ 회원 확장 정보 출력
+ Экстраинформация о пользователях
+ 用戶延伸資料
+
+ 회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요.
+
+
+ 会員が登録したイメージニックネーム、イメージマークを使うためにはこのアドオンをオンにして下さい。
+
+
+ 此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。
+
+
+ This addon displays a member's image name, image mark.
+
+
+ Addon này sẽ hiển thị hình ảnh thay thế tên và hình đánh dấu của thành viên.
+
+
+ This addon displays a member's image name, image mark.
+
+
+ This addon displays a member's image name, image mark.
+
+
+ Аддон изображает имя, марку картинки пользователя.
+
+
+ 可將用戶資料中的暱稱圖片、用戶圖示、簽名檔等資料顯示到頁面當中。
+
+ 0.2
+ 2007-02-28
+
+
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+ NHN
+
+
diff --git a/addons/member_extra_info/member_extra_info.addon.php b/addons/member_extra_info/member_extra_info.addon.php
index 585cc3f86..a107faaa4 100644
--- a/addons/member_extra_info/member_extra_info.addon.php
+++ b/addons/member_extra_info/member_extra_info.addon.php
@@ -1,23 +1,21 @@
-.... 로 정의가 된 부분을 찾아 회원번호를 구해서
- * 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다.
- **/
-
- /**
- * 출력되기 바로 직전일 경우에 이미지이름/이미지마크등을 변경
- **/
- if($called_position != "before_display_content" || Context::get('act')=='dispPageAdminContentModify') return;
-
- // 회원 이미지이름/ 마크/ 찾아서 대체할 함수를 담고 있는 파일을 include
- require_once('./addons/member_extra_info/member_extra_info.lib.php');
-
- // 1. 출력문서중에서
content
를 찾아 MemberController::transImageName() 를 이용하여 이미지이름/마크로 변경
- $output = preg_replace_callback('!<(div|span|a)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'memberTransImageName', $output);
-?>
+ ....
+ * Check if ther is image name and image mark. Then change it.
+ **/
+
+/**
+ * Just before displaying, change image name/ image mark
+ **/
+if($called_position != "before_display_content" || Context::get('act')=='dispPageAdminContentModify') return;
+// Include a file having functions to replace member image name/mark
+require_once('./addons/member_extra_info/member_extra_info.lib.php');
+// 1. Find a part