#447 Member모듈에서 로그인/회원가입/정보-비밀번호 수정등 비밀번호 관련 정보의 전송에 대해 SSL사용을 설정할 수 있도록 변경. 단 서버에서 SSL지원이 되어야 하며 현재 기본포트에 대해서만 개발 완료되었음. 로그인 위젯의 경우 기본 위젯에 대해 보안페이지 설정 기능을 추가

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@4109 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2008-04-16 06:27:41 +00:00
parent a588225372
commit 89090a5cb9
32 changed files with 345 additions and 128 deletions

View file

@ -10,6 +10,10 @@
* php5 쓰고 싶당.. .
**/
define('FOLLOW_REQUEST_SSL',0);
define('ENFORCE_SSL',1);
define('RELEASE_SSL',2);
class Context {
var $request_method = 'GET'; ///< @brief GET/POST/XMLRPC 중 어떤 방식으로 요청이 왔는지에 대한 값이 세팅. GET/POST/XML 3가지가 있음
@ -19,8 +23,8 @@
var $db_info = NULL; ///< @brief DB 정보
var $ssl_actions = array(); ///< @brief ssl로 전송해야 할 action등록 (common/js/xml_handler.js에서 ajax통신시 활용)
var $js_files = array(); ///< @brief display시에 사용하게 되는 js files의 목록
var $css_files = array(); ///< @brief display시에 사용하게 되는 css files의 목록
var $html_header = NULL; ///< @brief display시에 사용하게 되는 <head>..</head>내의 스크립트코드
@ -129,9 +133,6 @@
if(file_exists('./.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true;
else $this->allow_rewrite = false;
// 상대 경로 설정
$this->path = $this->getRequestUri();
// 기본 JS/CSS 등록
$this->addJsFile("./common/js/x.js");
$this->addJsFile("./common/js/common.js");
@ -148,7 +149,7 @@
if(!$val) continue;
$url .= ($url?'&':'').$key.'='.$val;
}
Context::set('current_url',sprintf('%s?%s',$this->path, $url));
Context::set('current_url',sprintf('%s?%s', $this->getRequestUri(), $url));
} else {
Context::set('current_url',$this->getUrl());
}
@ -576,33 +577,36 @@
$var_count = count($get_vars);
if(!$var_count) return '';
if($get_vars['act'] && $this->isExistsSSLAction($get_vars['act'])) $path = $this->getRequestUri(ENFORCE_SSL);
else $path = $this->getRequestUri(RELEASE_SSL);
// rewrite모듈을 사용하고 인자의 값이 4개 이하일 경우
if($this->allow_rewrite && $var_count < 4) {
$var_keys = array_keys($get_vars);
if($var_count == 1) {
if($var_keys[0]=='mid') return $this->path.$get_vars['mid'];
elseif($var_keys[0]=='document_srl') return $this->path.$get_vars['document_srl'];
if($var_keys[0]=='mid') return $path.$get_vars['mid'];
elseif($var_keys[0]=='document_srl') return $path.$get_vars['document_srl'];
} elseif($var_count == 2) {
asort($var_keys);
$target = implode('.',$var_keys);
if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']);
elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['document_srl']);
elseif($target=='act.document_srl') return sprintf('%s%s/%s',$this->path,$get_vars['document_srl'],$get_vars['act']);
elseif($target=='mid.page') return sprintf('%s%s/page/%s',$this->path,$get_vars['mid'],$get_vars['page']);
elseif($target=='category.mid') return sprintf('%s%s/category/%s',$this->path,$get_vars['mid'],$get_vars['category']);
if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$path,$get_vars['mid'],$get_vars['act']);
elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$path,$get_vars['mid'],$get_vars['document_srl']);
elseif($target=='act.document_srl') return sprintf('%s%s/%s',$path,$get_vars['document_srl'],$get_vars['act']);
elseif($target=='mid.page') return sprintf('%s%s/page/%s',$path,$get_vars['mid'],$get_vars['page']);
elseif($target=='category.mid') return sprintf('%s%s/category/%s',$path,$get_vars['mid'],$get_vars['category']);
} elseif($var_count == 3) {
asort($var_keys);
$target = implode('.',$var_keys);
if($target=='act.document_srl.key') {
return sprintf('%s%s/%s/%s',$this->path,$get_vars['document_srl'],$get_vars['key'],$get_vars['act']);
return sprintf('%s%s/%s/%s',$path,$get_vars['document_srl'],$get_vars['key'],$get_vars['act']);
} elseif($target=='category.mid.page') {
return sprintf('%s%s/category/%s/page/%s',$this->path,$get_vars['mid'],$get_vars['category'],$get_vars['page']);
return sprintf('%s%s/category/%s/page/%s',$path,$get_vars['mid'],$get_vars['category'],$get_vars['page']);
} elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='tag') {
return sprintf('%s%s/tag/%s',$this->path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword']));
return sprintf('%s%s/tag/%s',$path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword']));
} elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='regdate') {
if(strlen($get_vars['search_keyword'])==8) return sprintf('%s%s/%04d/%02d/%02d',$this->path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2),substr($get_vars['search_keyword'],6,2));
elseif(strlen($get_vars['search_keyword'])==6) return sprintf('%s%s/%04d/%02d',$this->path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2));
if(strlen($get_vars['search_keyword'])==8) return sprintf('%s%s/%04d/%02d/%02d',$path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2),substr($get_vars['search_keyword'],6,2));
elseif(strlen($get_vars['search_keyword'])==6) return sprintf('%s%s/%04d/%02d',$path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2));
}
}
}
@ -613,14 +617,26 @@
$url .= ($url?'&':'').$key.'='.urlencode($val);
}
return $this->path.'?'.htmlspecialchars($url);
return $path.'?'.htmlspecialchars($url);
}
/**
* @brief 요청이 들어온 URL에서 argument를 제거하여 return
**/
function getRequestUri() {
return sprintf("http://%s%s",$_SERVER['HTTP_HOST'], getScriptPath());
function getRequestUri($ssl_mode = FOLLOW_REQUEST_SSL) {
switch($ssl_mode) {
case FOLLOW_REQUEST_SSL :
if($_SERVER['HTTPS']=='on') $use_ssl = true;
else $use_ssl = false;
break;
case ENFORCE_SSL :
$use_ssl = true;
break;
case RELEASE_SSL :
$use_ssl = false;
break;
}
return sprintf("%s://%s%s",$use_ssl?'HTTPS':'HTTP',$_SERVER['HTTP_HOST'], getScriptPath());
}
/**
@ -711,6 +727,38 @@
return clone($this->get_vars);
}
/**
* @brief SSL로 인증되어야 action이 있을 경우 등록
* common/js/xml_handler.js에서 action들에 대해서 https로 전송되도록
**/
function addSSLAction($action) {
$oContext = &Context::getInstance();
return $oContext->_addSSLAction($action);
}
function _addSSLAction($action) {
if(in_array($action, $this->ssl_actions)) return;
$this->ssl_actions[] = $action;
}
function getSSLActions() {
$oContext = &Context::getInstance();
return $oContext->_getSSLActions();
}
function _getSSLActions() {
return $this->ssl_actions;
}
function isExistsSSLAction($action) {
$oContext = &Context::getInstance();
return $oContext->_isExistsSSLAction($action);
}
function _isExistsSSLAction($action) {
return in_array($action, $this->ssl_actions);
}
/**
* @brief js file을 추가
**/

View file

@ -45,14 +45,13 @@
$layout_file = $oModule->getLayoutFile();
$edited_layout_file = $oModule->getEditedLayoutFile();
}
if(!$layout_path) $layout_path = './common/tpl/';
if(!$layout_file) $layout_file = 'default_layout.html';
$zbxe_final_content = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
// 각 위젯, 에디터 컴포넌트의 코드 변경
if(__DEBUG__==3) $start = getMicroTime();

View file

@ -334,12 +334,20 @@
$oModule->setModule($module);
$oModule->setModulePath($class_path);
// 요청된 module에 constructor가 있으면 실행
if(!isset($GLOBALS['_called_constructor'][$module])) {
$GLOBALS['_called_constructor'][$module] = true;
if(@method_exists($oModule, $module)) $oModule->{$module}();
}
// GLOBALS 변수에 생성된 객체 저장
$GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule;
}
if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time;
// init method가 있으면 실행
// 객체 리턴
return $GLOBALS['_loaded_module'][$module][$type][$kind];
}

View file

@ -48,7 +48,17 @@ String.prototype.setQuery = function(key, val) {
} else {
if(val.toString().trim()) uri = uri+"?"+key+"="+val;
}
//uri = uri.replace(request_uri+'?',request_uri+'index.php?');
uri = uri.replace(/^https:\/\//i,'http://');
if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && uri.getQuery('act')) {
var act = uri.getQuery('act');
for(i=0;i<ssl_actions.length;i++) {
if(ssl_actions[i]==act) {
uri = uri.replace(/^http:\/\//i,'https://');
break;
}
}
}
return uri;
}
@ -989,3 +999,13 @@ if(xIE4Up) {
}
}
}
/* 보안 로그인 모드로 전환 */
function toggleSecuritySignIn() {
var href = location.href;
if(/https:\/\//i.test(href)) location.href = href.replace(/^https/i,'http');
else location.href = href.replace(/^http/i,'https');
}

View file

@ -19,15 +19,6 @@ function exec_xml(module, act, params, callback_func, response_tags, callback_fu
if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = new Array('error','message');
var waiting_obj = xGetElementById("waitingforserverresponse");
if(show_waiting_message && waiting_obj) {
xInnerHtml(waiting_obj, waiting_message);
xTop(waiting_obj, xScrollTop()+20);
xLeft(waiting_obj, xScrollLeft()+20);
waiting_obj.style.visibility = "visible";
}
oXml.request(xml_response_filter, oXml, callback_func, response_tags, callback_func_arg, fo_obj);
}
@ -95,7 +86,7 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
+ "<params>\n"
for (var key in this.params) {
if(!this.params.hasOwnProperty(key)) continue;
if(!this.params.hasOwnProperty(key)) continue;
var val = this.params[key];
rd += "<"+key+"><![CDATA["+val+"]]></"+key+">\n";
}
@ -103,12 +94,43 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
rd += "</params>\n"
+ "</methodCall>\n";
// ssl action
if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && typeof(this.params['act'])!='undefined' && /^https:\/\//i.test(location.href) ) {
var action = this.params['act'];
for(i=0;i<ssl_actions.length;i++) {
if(ssl_actions[i]==action) {
this.xml_path = this.xml_path.replace(/^http:\/\//i,'https://');
break;
}
}
}
if(this.obj_xmlHttp.readyState!=0) {
this.obj_xmlHttp.abort();
this.obj_xmlHttp = this.getXmlHttp();
}
this.obj_xmlHttp.onreadystatechange = function () {callBackFunc(xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj)};
this.obj_xmlHttp.open("POST", this.xml_path, true);
// 모든 xml데이터는 POST방식으로 전송. try-cacht문으로 오류 발생시 대처
try {
this.obj_xmlHttp.open("POST", this.xml_path, true);
} catch(e) {
alert(e);
return;
}
// ajax 통신중 대기 메세지 출력 (show_waiting_message값을 false로 세팅시 보이지 않음)
var waiting_obj = xGetElementById("waitingforserverresponse");
if(show_waiting_message && waiting_obj) {
xInnerHtml(waiting_obj, waiting_message);
xTop(waiting_obj, xScrollTop()+20);
xLeft(waiting_obj, xScrollLeft()+20);
waiting_obj.style.visibility = "visible";
}
this.obj_xmlHttp.send(rd);
}

View file

@ -1,4 +1,4 @@
{@ $js_files = Context::getJsFile() }{@ $css_files = Context::getCssFile() }<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="{Context::getLangType()}" xml:lang="{Context::getLangType()}" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@ -17,6 +17,7 @@
<!--@end-->
<meta http-equiv="imagetoolbar" content="no" />
<title>{Context::getBrowserTitle()}</title>
{@ $js_files = Context::getJsFile() }
<!--@foreach($js_files as $key => $js_file)-->
<!--@if($js_file['targetie'])-->
<!--[if {$js_file['targetie']}]>
@ -26,6 +27,8 @@
<![endif]-->
<!--@end-->
<!--@end-->
{@ $css_files = Context::getCssFile() }
<!--@foreach($css_files as $key => $css_file)-->
<!--@if($css_file['targetie'])-->
<!--[if {$css_file['targetie']}]>
@ -38,11 +41,14 @@
<!--@if($rss_url)-->
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="{$rss_url}" />
<!--@end-->
{@ $ssl_actions = Context::getSSLActions() }
<script type="text/javascript">//<![CDATA[
var current_url = "{$current_url}";
var request_uri = "{$request_uri}";
var current_mid = "{$mid}";
var waiting_message = "{$lang->msg_call_server}";
var ssl_actions = new Array(<!--@if(count($ssl_actions))-->"{implode('","',$ssl_actions)}"<!--@end-->);
//]]></script>
{Context::getHtmlHeader()}

View file

@ -45,6 +45,8 @@
$lang->signature_max_height = 'Max Signature Height';
$lang->enable_openid = 'Enable OpenID';
$lang->enable_join = 'Allow Member Join';
$lang->enable_ssl = 'Enable SSL';
$lang->security_sign_in = 'Sign in using enhanced security';
$lang->limit_day = 'Temporary Limit Date';
$lang->limit_date = 'Limit Date';
$lang->after_login_url = 'URL after Login';
@ -64,7 +66,7 @@
$lang->webmaster_email = "Webmaster's Email";
$lang->about_keep_signed = 'Though the browser is closed, you might be kept signed.\n\nIf you use this feature at the shared computer, your personal information might be accessed by others, thus do not use this feature at the shared computer. ';
$lang->about_webmaster_name = "Please input webmaster's name which will be used for certification mails or other site administration. (default : webmaster)";
$lang->about_webmaster_name = "Please input webmaster's name which will be used for certification mails or other site administration. (default : webmaster)";
$lang->about_webmaster_email = "Please input webmaster's email address.";
$lang->search_target_list = array(
@ -184,6 +186,7 @@
$lang->about_enable_openid = 'Allow users to sign up as OpenID';
$lang->about_enable_join = 'Allow users to sign up';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = 'You can limit certification date after sign up';
$lang->about_limit_date = 'User cannot login until assigned date';
$lang->about_after_login_url = 'You can set URL after login. Blank means current page.';

View file

@ -44,6 +44,8 @@
$lang->image_mark_max_height = 'Altura Máxima';
$lang->enable_openid = 'Activar OpenID';
$lang->enable_join = 'Permitir el registro del usuario';
$lang->enable_ssl = 'Activar SSL';
$lang->security_sign_in = 'Sign in using enhanced security';
$lang->limit_day = 'Límite de la fecha temporal';
$lang->limit_date = 'Límite de fecha';
$lang->after_login_url = 'URL después del inicio de sesión';
@ -181,6 +183,7 @@
$lang->about_enable_openid = 'Selecciona esta opción si activado OpenID';
$lang->about_enable_join = 'Debe seleccionar esta opción para permitir el registro de los usuarios';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = 'Usted puede limitar la fecha de la certificación luego de registrar';
$lang->about_limit_date = 'Usuario no podra conectarse hasta la fecha indicada';
$lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.';

View file

@ -45,6 +45,8 @@
$lang->signature_max_height = '署名欄の高さの制限';
$lang->enable_openid = 'OpenID使用';
$lang->enable_join = '会員加入を許可する';
$lang->enable_ssl = 'SSL使用';
$lang->security_sign_in = 'Sign in using enhanced security';
$lang->limit_day = '臨時制限日';
$lang->limit_date = '制限日';
$lang->after_login_url = 'ログイン後表示するページのURL';
@ -184,6 +186,7 @@
$lang->about_enable_openid = 'OpenIDをサポートする際にチェックを入れます。';
$lang->about_enable_join = 'チェックを入れないとユーザが会員に加入できません。';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = '会員加入後一定の期間中、認証制限を行うことができます。';
$lang->about_limit_date = '指定された期間まで該当ユーザはログインできなくします。';
$lang->about_after_login_url = 'ログイン後表示されるページのURLを指定できます。指定のない場合、現在のページが維持されます。';

View file

@ -45,6 +45,8 @@
$lang->signature_max_height = '서명 높이 제한';
$lang->enable_openid = 'OpenID 지원';
$lang->enable_join = '회원 가입 허가';
$lang->enable_ssl = 'SSL 기능 사용';
$lang->security_sign_in = '보안로그인 사용';
$lang->limit_day = '임시 제한 일자';
$lang->limit_date = '제한일';
$lang->after_login_url = '로그인 후 이동할 URL';
@ -184,6 +186,7 @@
$lang->about_enable_openid = 'OpenID 지원을 할 경우 체크하시면 됩니다';
$lang->about_enable_join = '체크를 하셔야 사용자들이 회원가입을 할 수 있습니다';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = '회원 가입후 정해진 일자동안 인증 제한을 할 수 있습니다';
$lang->about_limit_date = '지정된 일자까지 해당 사용자는 로그인을 할 수 없습니다';
$lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.';

View file

@ -44,6 +44,8 @@
$lang->image_mark_max_height = 'Макс. высота';
$lang->enable_openid = 'Включить открытый ID (OpenID)';
$lang->enable_join = 'Позволить пользователям регистрироваться';
$lang->enable_ssl = 'SSL 기능 사용';
$lang->security_sign_in = 'Sign in using enhanced security';
$lang->limit_day = 'Временный лимит даты';
$lang->limit_date = 'Дата лимита';
$lang->after_login_url = '로그인 후 이동할 URL';
@ -181,6 +183,7 @@
$lang->about_enable_openid = 'Позволить пользователям регистрироваться как OpenID';
$lang->about_enable_join = 'Позволить пользователям регистрироваться';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = 'Вы можете ограничить дату сертификации после регистрации';
$lang->about_limit_date = 'Пользователь не может войти до указанной даты';
$lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.';

View file

@ -45,6 +45,8 @@
$lang->signature_max_height = '签名高度限制';
$lang->enable_openid = '支持OpenID';
$lang->enable_join = '允许会员注册';
$lang->enable_ssl = 'SSL 기능 사용';
$lang->security_sign_in = 'Sign in using enhanced security';
$lang->limit_day = '认证限制';
$lang->limit_date = '限制日期';
$lang->after_login_url = '登录后页面转向';
@ -184,6 +186,7 @@
$lang->about_enable_openid = '要想网站支持OpenID时请勾选此项。';
$lang->about_enable_join = '选择此项后用户才可以注册。';
$lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다';
$lang->about_limit_day = '注册会员后的认证有效期限。';
$lang->about_limit_date = '直到指定日期该用户不能登录。';
$lang->about_after_login_url = '可以指定登录后的页面转向url(留空为当前页面)。';

View file

@ -83,10 +83,11 @@
**/
function procMemberAdminInsertConfig() {
// 기본 정보를 받음
$args = Context::gets('webmaster_name','webmaster_email','skin','colorset','enable_openid','enable_join','limit_day','after_login_url','after_logout_url','redirect_url','agreement','profile_image','profile_image_max_width','profile_image_max_height','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height','signature_max_height','editor_skin');
$args = Context::gets('webmaster_name','webmaster_email','skin','colorset','enable_openid','enable_join','enable_ssl','limit_day','after_login_url','after_logout_url','redirect_url','agreement','profile_image','profile_image_max_width','profile_image_max_height','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height','signature_max_height','editor_skin');
if(!$args->skin) $args->skin = "default";
if(!$args->colorset) $args->colorset = "white";
if($args->enable_join!='Y') $args->enable_join = 'N';
if($args->enable_ssl!='Y') $args->enable_ssl = 'N';
if($args->enable_openid!='Y') $args->enable_openid= 'N';
if($args->profile_image !='Y') $args->profile_image = 'N';
if($args->image_name!='Y') $args->image_name = 'N';

View file

@ -7,6 +7,30 @@
class member extends ModuleObject {
/**
* @brief constructor
**/
function member() {
if(!Context::isInstalled()) return;
$oModuleModel = &getModel('module');
$member_config = $oModuleModel->getModuleConfig('member');
// SSL 사용시 회원가입/정보/비밀번호등과 관련된 action에 대해 SSL 전송하도록 지정
if($member_config->enable_ssl == 'Y') {
Context::addSSLAction('dispMemberLoginForm');
Context::addSSLAction('dispMemberModifyPassword');
Context::addSSLAction('dispMemberSignUpForm');
Context::addSSLAction('dispMemberModifyInfo');
Context::addSSLAction('dispMemberOpenIDLogin');
Context::addSSLAction('procMemberLogin');
Context::addSSLAction('procMemberModifyPassword');
Context::addSSLAction('procMemberInsert');
Context::addSSLAction('procMemberModifyInfo');
Context::addSSLAction('procMemberOpenIDLogin');
}
}
/**
* @brief 설치시 추가 작업이 필요할시 구현
**/

View file

@ -66,7 +66,7 @@
$this->setError(-1);
$this->setMessage($error['description']);
} else {
$openid->SetApprovedURL( sprintf('%s?module=member&act=procMemberOpenIDValidate', Context::getRequestUri()) );
$openid->SetApprovedURL( sprintf('%s?module=member&act=procMemberOpenIDValidate', Context::getRequestUri(RELEASE_SSL)) );
$url = $openid->GetRedirectURL();
$this->add('redirect_url', $url);
}

View file

@ -15,7 +15,7 @@
<!--#include("./common_header.html")-->
<div class="boardHeader">
<h3>{$lang->msg_new_member}</h3>
<h3>{$lang->cmd_signup}</h3>
</div>
<form id="fo_insert_member" action="./" method="get" onsubmit="return procFilter(this, signup)">

View file

@ -37,6 +37,13 @@
{$lang->about_enable_join}
</td>
</tr>
<tr>
<th scope="row">{$lang->enable_ssl}</th>
<td>
<input type="checkbox" name="enable_ssl" value="Y" <!--@if($config->enable_ssl=='Y')-->checked="checked"<!--@end--> class="checkbox" />
{$lang->about_enable_ssl}
</td>
</tr>
<tr>
<th scope="row">{$lang->limit_day}</th>
<td>

View file

@ -29,6 +29,13 @@
$this->member_config = $oModuleModel->getModuleConfig('member');
Context::set('member_config', $this->member_config);
// ssl 사용시 현재 https접속상태인지에 대한 flag및 https url 생성
$ssl_mode = false;
if($this->member_config->enable_ssl == 'Y') {
if(preg_match('/^https:\/\//i',Context::getRequestUri())) $ssl_mode = true;
}
Context::set('ssl_mode',$ssl_mode);
// 템플릿 컴파일
$oTemplate = &TemplateHandler::getInstance();
return $oTemplate->compile($tpl_path, $tpl_file);

View file

@ -1,46 +1,60 @@
.fc_01 { color:#797771; }
.fc_02 { color:#9A9893; }
.default_login { color:#797771;}
.openid_login { display:none; }
.box_login { border:solid 3px #D5D8DB; background:#FFFFFE; margin-bottom:10px;}
/* login form */
.default_login form { position:relative; }
.default_login .form_field { padding:5px 60px 5px 5px; white-space:nowrap; overflow:hidden; height:45px; }
.box_login .user_info { padding:5px 0 0 5px; height:22px; }
.default_login .form_field .openIDTitle { width:99%; white-space:nowrap; overflow:hidden; background:url("../images/openid_login_bg.gif") no-repeat left top; padding:1px 0 0 18px; margin-bottom:8px; color:#888888; font-weight:bold; }
.default_login .form_field .openIDTitle input { margin:0; padding:0; height:14px; }
.default_login .form_field input.input { display:block; width:99%; background-color: #ffffff; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:2px; height:14px; color:#666666; margin:2px 0 2px 0;}
.box_login .hr_dot_01 { background:url(../images/default/hr_dot_01.gif) repeat-x; height:2px; overflow:hidden; clear:both; margin:6px; }
.box_login .item { background:url(../images/default/bul_01.gif) no-repeat 5px 5px; height:16px; padding:3px 0px 0px 20px; margin-left:5px; margin-top:2px; }
.box_login .item a { color:#666666; text-decoration:none; }
.box_login .item { font-size:11px; letter-spacing:-1px; margin-right:10px; padding:3px 0px 0px 20px; white-space:nowrap; }
.box_login .profile { width:70px; float:left; background:url(../images/default/icon_profile.gif) no-repeat left; }
.box_login .message { width:70px; float:left; background:url(../images/default/icon_note.gif) no-repeat left; }
.box_login .friend { float:left; background:url(../images/default/icon_friend.gif) no-repeat left; }
.box_login .administrative { float:left; background:url(../images/default/icon_key.gif) no-repeat left; margin-right:0px; }
.box_login .administrative a { color:#D80D0F; }
.box_login .lastlogin { clear:both; padding-bottom:5px;}
.default_login input.submit { width:45px; height:45px; background:url(../images/default/login_btn_submit.gif) no-repeat; border:none; margin:0; cursor:pointer; position:absolute; right:5px; top:5px; }
.box_login .form_field { float:left; margin:9px 9px 0 9px; _margin:3px 3px 0 3px; height:55px; }
.box_login .form_field div { margin-top:2px; margin-bottom:3px; }
.box_login input.submit { width:45px; height:45px; background:url(../images/default/login_btn_submit.gif) no-repeat; border:none; margin:9px 0 0 0; _margin:5px 0 0 0; cursor:pointer; }
.box_login .input { width:140px; background-color: #ffffff; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:2px; height:14px; margin:0px; cursor:text; color:#666666;}
.box_login ul { margin:0; padding:0; }
.box_login ul.option { clear:both; height:20px; margin:0 0 0 9px;}
.box_login ul.option li { float:left; list-style:none;}
.box_login ul.option li a.btn { background:url(../images/default/bul_01.gif) no-repeat left; padding-left:10px; margin-left:14px; }
.box_login .checkbox { width:15px; height:15px; margin:-1px 0px 0px -1px; margin-right:2px; }
.box_login .clear { clear:both; }
.box_login ul { margin:0; padding:0; }
.box_login ul.extra_option { clear:both; height:40px; }
.box_login ul.extra_option li a {text-decoration:none;}
.box_login ul.extra_option li a.btn { background:url(../images/default/bul_01.gif) no-repeat left; padding-left:10px; margin-left:10px; }
.default_login form p.securitySignIn { clear:both; padding:0 0 0 18px; margin:4px 0 4px 7px; }
.default_login form p.noneSSL { background:url("../images/none_ssl.png") no-repeat left top; }
.default_login form p.SSL { background:url("../images/ssl.png") no-repeat left top; }
.default_login form p.noneSSL a { color:#BF6801; text-decoration:none; }
.default_login form p.SSL a { color:#9CAC74; text-decoration:none; }
.openid_login { clear:both; height:38px; border:3px solid #D5D8DB; background-color:#FFFFFF; margin:0 0 10px 0; }
.openid_login .openid_user_id { width:110px; _width:100px; background: url(../images/openid_login_bg.gif) left no-repeat; background-color: #ffffff; background-position: 0 50%; padding:3px 3px 3px 18px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:16px; line-height:1em; vertical-align:middle; margin-bottom:.5em; color:#666666;}
.default_login p { padding:0; margin:0 0 0 5px; }
.openid_login .wButtonTypeA { display:block; cursor:pointer; background:url(../images/default/buttonTypeACenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; white-space:nowrap;border:0px;}
.openid_login .wButtonTypeA:hover { text-decoration:none;}
.openid_login .wButtonTypeA img { vertical-align:middle;}
.openid_login .wButtonTypeA input { border:none; cursor:pointer; background:url(../images/default/buttonTypeACenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; white-space:nowrap;border:0px; vertical-align:middle; }
.openid_login .wButtonTypeA .leftCap { width:2px; height:24px; background:url(../images/default/buttonTypeALeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;}
.openid_login .wButtonTypeA .rightCap { width:2px; height:24px; background:url(../images/default/buttonTypeARight.gif) no-repeat; margin:0 -1px 0 .4em;}
.openid_login .wButtonTypeA .icon { margin:0 .2em;}
.openid_login .wButtonWrite ul { text-align:center; clear:both; display:block; margin:0; padding:0; }
.openid_login .wButtonWrite li { margin-top:.5em; float:left; margin-left:.3em; list-style:none;}
.default_login .checkbox { width:15px; height:15px; margin:-1px 0px 0px -1px; margin-right:2px; }
.default_login .clear { clear:both; }
.default_login ul.extra_option { margin:5px 0 0 0; padding:0; clear:both; height:40px; }
.default_login ul.extra_option li { background:url(../images/default/bul_01.gif) no-repeat 7px 3px; padding-left:20px; margin-left:5px; margin-bottom:3px;}
.default_login ul.extra_option li a {text-decoration:none; color:#666666;}
.default_openid_login { display:none; clear:both; height:38px; border:3px solid #D5D8DB; background-color:#FFFFFF; margin:0 0 10px 0; }
.default_openid_login .openid_user_id { width:110px; _width:100px; background: url(../images/openid_login_bg.gif) left no-repeat; background-color: #ffffff; background-position: 0 50%; padding:3px 3px 3px 18px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:16px; line-height:1em; vertical-align:middle; margin-bottom:.5em; color:#666666;}
.default_openid_login .wButtonTypeA { display:block; cursor:pointer; background:url(../images/default/buttonTypeACenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; white-space:nowrap;border:0px;}
.default_openid_login .wButtonTypeA:hover { text-decoration:none;}
.default_openid_login .wButtonTypeA img { vertical-align:middle;}
.default_openid_login .wButtonTypeA input { border:none; cursor:pointer; background:url(../images/default/buttonTypeACenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; white-space:nowrap;border:0px; vertical-align:middle; }
.default_openid_login .wButtonTypeA .leftCap { width:2px; height:24px; background:url(../images/default/buttonTypeALeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;}
.default_openid_login .wButtonTypeA .rightCap { width:2px; height:24px; background:url(../images/default/buttonTypeARight.gif) no-repeat; margin:0 -1px 0 .4em;}
.default_openid_login .wButtonTypeA .icon { margin:0 .2em;}
.default_openid_login .wButtonWrite ul { text-align:center; clear:both; display:block; margin:0; padding:0; }
.default_openid_login .wButtonWrite li { margin-top:.5em; float:left; margin-left:.3em; list-style:none;}
/* logged info */
.default_login .loginUser { position:relative; padding:5px; }
.default_login .loginUser .userNickName { margin-right:50px; white-space:nowrap; overflow:hidden; }
.default_login .loginUser .logoutButton { position:absolute; right:5px; top:5px; }
.default_login .hr_dot_01 { background:url(../images/default/hr_dot_01.gif) repeat-x; height:2px; overflow:hidden; clear:both; margin:6px; }
.default_login .item { background:url(../images/default/bul_01.gif) no-repeat 5px 5px; height:16px; padding:3px 0px 0px 20px; margin-left:5px; margin-top:2px; }
.default_login .item a { color:#666666; text-decoration:none; }
.default_login .item { font-size:11px; letter-spacing:-1px; margin-right:10px; padding:3px 0px 0px 20px; white-space:nowrap; }
.default_login .profile { width:70px; float:left; background:url(../images/default/icon_profile.gif) no-repeat left; }
.default_login .message { width:70px; float:left; background:url(../images/default/icon_note.gif) no-repeat left; }
.default_login .friend { float:left; background:url(../images/default/icon_friend.gif) no-repeat left; }
.default_login .administrative { float:left; background:url(../images/default/icon_key.gif) no-repeat left; margin-right:0px; }
.default_login .administrative a { color:#D80D0F; }
.default_login .lastlogin { clear:both; padding:5px; white-space:wrap; font-size:8pt; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 929 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -11,12 +11,6 @@ function doFocusUserId(fo_id) {
/* 로그인 후 */
function completeLogin(ret_obj, response_tags, params, fo_obj) {
if(fo_obj.remember_user_id && fo_obj.remember_user_id.checked) {
var expire = new Date();
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
xSetCookie('user_id', fo_obj.user_id.value, expire);
}
var url = current_url.setQuery('act','');
location.href = url;
}
@ -28,4 +22,18 @@ function completeOpenIDLogin(ret_obj, response_tags) {
}
/* 오픈 아이디 폼 변환 */
function toggleLoginForm(obj) {
if(xGetElementById('login').style.display != "none") {
xGetElementById('login').style.display = "none";
xGetElementById('openid_login').style.display = "block";
xGetElementById('use_open_id_2').checked = true;
xGetElementById('fo_openid_login_widget').user_id.focus();
} else {
xGetElementById('openid_login').style.display = "none";
xGetElementById('login').style.display = "block";
xGetElementById('use_open_id').checked = false;
xGetElementById('use_open_id_2').checked = false;
xGetElementById('fo_login_widget').user_id.focus();
}
}

View file

@ -12,40 +12,52 @@
xAddEventListener(window, "load", function(){ doFocusUserId("fo_login_widget"); });
</script>
<div class="box_login fc_01" id="box_login">
<form action="./" method="get" onsubmit="return procFilter(this, widget_login)" id="fo_login_widget">
<div class="form_field">
<div>
<input name="user_id" type="text" class="input" id="login_form_user_id" />
</div>
<div>
<input name="password" type="password" class="input" />
</div>
</div>
<div class="default_login" id="login">
<form action="./" method="post" onsubmit="return procFilter(this, widget_login)" id="fo_login_widget">
<div><input type="submit" value=" " class="submit" /></div>
<ul class="option">
<li><input type="checkbox" name="keep_signed" id="keepid" value="Y" onclick="if(this.checked) return confirm(keep_signed_msg);"/></li>
<li><label for="keepid">{$lang->keep_signed}</label></li>
</ul>
<ul class="extra_option">
<li><a href="{getUrl('act','dispMemberSignUpForm')}" class="fc_02 btn">{$lang->cmd_signup}</a></li>
<li><a href="{getUrl('act','dispMemberFindAccount')}" class="fc_02 btn">{$lang->cmd_find_member_account}</a></li>
</ul>
</form>
<div class="clear"></div>
<div class="form_field">
<input name="user_id" type="text" class="input" id="login_form_user_id" />
<input name="password" type="password" class="input" />
</div>
<input type="submit" value=" " class="submit" />
<!--@if($member_config->enable_ssl=='Y')-->
<p class="securitySignIn <!--@if($ssl_mode)-->SSL<!--@else-->noneSSL<!--@end-->">
<a href="#" onclick="toggleSecuritySignIn(); return false;">{$lang->security_sign_in}</a>
</p>
<!--@end-->
<p>
<input type="checkbox" name="keep_signed" id="keepid" value="Y" onclick="if(this.checked) return confirm(keep_signed_msg);"/>
<label for="keepid">{$lang->keep_signed}</label>
</p>
<!--@if($member_config->enable_openid=='Y')-->
<p>
<input name="use_open_id" id="use_open_id" type="checkbox" value="Y" onclick="toggleLoginForm(this); return false;"/>
<label for="use_open_id">Open ID</label>
</p>
<!--@end-->
<ul class="extra_option">
<li><a href="{getUrl('act','dispMemberSignUpForm')}">{$lang->cmd_signup}</a></li>
<li><a href="{getUrl('act','dispMemberFindAccount')}">{$lang->cmd_find_member_account}</a></li>
</ul>
</form>
<div class="clear"></div>
</div>
<!-- OpenID -->
<!--@if($member_config->enable_openid=='Y')-->
<div class="openid_login fc_01" id="box_login">
<form action="./" method="post" onsubmit="return procFilter(this, openid_login)" >
<div class="wButtonWrite">
<ul>
<li><input type="text" name="user_id" class="openid_user_id" /></li>
<li><span class="wButtonTypeA"><img src="./images/blank.gif" alt="" class="leftCap" /><input type="submit" value="{$lang->cmd_login}" accesskey="s" /><img src="./images/blank.gif" alt="" class="rightCap" /></span></li>
</ul>
</div>
<div class="default_login openid_login" id="openid_login">
<form action="./" method="post" onsubmit="return procFilter(this, openid_login)" id="fo_openid_login_widget">
<div class="form_field">
<div class="openIDTitle">
OpenID <input name="use_open_id_2" id="use_open_id_2" type="checkbox" value="Y" onclick="toggleLoginForm(this); return false;" checked="true"/>
</div>
<input type="text" name="user_id" class="input" />
</div>
<input type="submit" value=" " class="submit" />
</form>
</div>
<!--@end-->

View file

@ -1,13 +1,17 @@
<!-- colorset의 값에 따라 css 파일을 import 한다 -->
<!--@if($colorset=="default"||!$colorset)-->
<!--@if(!$colorset)-->
{@ $colorset = "default"}
<!--@end-->
<!--@if($colorset=="default")-->
<!--%import("css/default.css")-->
<!--@end-->
<!--%import("./filter/logout.xml")-->
<div class="box_login">
<div class="user_info">
<div class="fl"><div class="member_{$logged_info->member_srl} fl fc_01">{$logged_info->nick_name}</div></div>
<div class="fr tRight"><a href="{getUrl('act','dispMemberLogout')}" class="button"><span>{$lang->cmd_logout}</span></a></div>
<div class="default_login">
<div class="loginUser">
<div class="userNickName"><div class="member_{$logged_info->member_srl}">{$logged_info->nick_name}</div></div>
<a href="{getUrl('act','dispMemberLogout')}" class="logoutButton"><img src="./images/{$colorset}/logout_btn.gif" alt="{$lang->cmd_logout}" /></a>
</div>
<div class="hr_dot_01"></div>
@ -18,5 +22,5 @@
<!--@if($logged_info->is_admin=="Y")-->
<div class="item administrative"><a href="{getUrl('','module','admin')}" onclick="window.open(this.href);return false;">{$lang->cmd_management}</a></div>
<!--@end-->
<div class="item lastlogin fc_02">{$lang->last_login} : {zDate($logged_info->last_login, "Y-m-d H:i")}</div>
<div class="lastlogin">{$lang->last_login} : {zDate($logged_info->last_login, "Y-m-d H:i")}</div>
</div>

View file

@ -6,6 +6,13 @@
.login_black form .idpw { float:left; width:110px;}
.login_black form .idpw input { border:1px solid #6b6b6b; color:#cbcbcb; width:105px; background:#515151; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;}
.login_black form .login { float:right;}
.login_black form p.securitySignIn { clear:both; padding:0 0 0 18px; margin:4px 0 0 0; }
.login_black form p.noneSSL { background:url("../images/none_ssl.png") no-repeat left top; }
.login_black form p.SSL { background:url("../images/ssl.png") no-repeat left top; }
.login_black form p.noneSSL a { color:#BF6801; text-decoration:none; }
.login_black form p.SSL a { color:#9CAC74; text-decoration:none; }
.login_black form p.save { margin:0; clear:both; padding:.3em 0;}
.login_black form p.save input { vertical-align:middle; _margin:-3px;}
*:first-child+html body#black .login_black form p input { margin:-3px; }

View file

@ -6,6 +6,13 @@
.login_default form .idpw { float:left; width:110px; }
.login_default form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;}
.login_default form .login { float:right;}
.login_default form p.securitySignIn { clear:both; padding:0 0 0 18px; margin:4px 0 0 0; }
.login_default form p.noneSSL { background:url("../images/none_ssl.png") no-repeat left top; }
.login_default form p.SSL { background:url("../images/ssl.png") no-repeat left top; }
.login_default form p.noneSSL a { color:#BF6801; text-decoration:none; }
.login_default form p.SSL a { color:#9CAC74; text-decoration:none; }
.login_default form p.save { margin:0; clear:both; padding:.3em 0;}
.login_default form p.save input { vertical-align:middle; _margin:-3px;}
*:first-child+html body .login_default form p input { margin:-3px; }

View file

@ -6,6 +6,13 @@
.login_white form .idpw { float:left; width:110px;}
.login_white form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;}
.login_white form .login { float:right;}
.login_white form p.securitySignIn { clear:both; padding:0 0 0 18px; margin:4px 0 0 0; }
.login_white form p.noneSSL { background:url("../images/none_ssl.png") no-repeat left top; }
.login_white form p.SSL { background:url("../images/ssl.png") no-repeat left top; }
.login_white form p.noneSSL a { color:#BF6801; text-decoration:none; }
.login_white form p.SSL a { color:#9CAC74; text-decoration:none; }
.login_white form p.save { margin:0; clear:both; padding:.3em 0;}
.login_white form p.save input { vertical-align:middle; _margin:-3px;}
*:first-child+html body#white .login_white form p input { margin:-3px; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -11,12 +11,6 @@ function doFocusUserId(fo_id) {
/* 로그인 후 */
function completeLogin(ret_obj, response_tags, params, fo_obj) {
if(fo_obj.remember_user_id && fo_obj.remember_user_id.checked) {
var expire = new Date();
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
xSetCookie('user_id', fo_obj.user_id.value, expire);
}
var url = current_url.setQuery('act','');
location.href = url;
}

View file

@ -18,7 +18,7 @@
<fieldset id="login" class="login_{$colorset}">
<legend>{$lang->cmd_login}</legend>
<form action="./" method="get" onsubmit="return procFilter(this, widget_login)" id="fo_login_widget">
<form action="./" method="post" onsubmit="return procFilter(this, widget_login)" id="fo_login_widget">
<div class="idpwWrap">
<div class="idpw">
@ -27,11 +27,15 @@
</div>
<input type="image" src="./images/{$colorset}/buttonLogin.gif" alt="login" class="login" />
</div>
<!--@if($member_config->enable_ssl=='Y')-->
<p class="securitySignIn <!--@if($ssl_mode)-->SSL<!--@else-->noneSSL<!--@end-->">
<a href="#" onclick="toggleSecuritySignIn(); return false;">{$lang->security_sign_in}</a>
</p>
<!--@end-->
<p class="save">
<input type="checkbox" name="keep_signed" id="keepid" value="Y" onclick="if(this.checked) return confirm(keep_signed_msg);"/>
<label for="keepid">{$lang->keep_signed}</label>
<!--@if($member_config->enable_openid=='Y')-->
<br />
<input name="use_open_id" id="use_open_id" type="checkbox" value="Y" onclick="toggleLoginForm(this); return false;"/>