#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);
}
@ -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)};
// 모든 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';
@ -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,25 +12,36 @@
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="default_login" id="login">
<form action="./" method="post" 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>
<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-->
<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>
<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>
@ -38,14 +49,15 @@
<!-- 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 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;"/>