AutoSet 에 그누보드 설치시 에러

윈도우서버에 그누보드를 설치하면서 에러가 발생하였다.

AutoSet 최신 버전은 어떤지 모르겠지만, 깔린 건 “v 6.3.1” … (얼마나 오래된 버전인지ㅠ)

아무튼 “data” 폴더 접근할 때 “500 에러”가 발생.

“.htaccess” 파일을 삭제하니 정상적으로 사용이 가능한 것을 확인

“http-vhosts” 에서”AllowOverride All”로 수정

웹서버 재시동하니 정상적으로 작동되는 것을 확인하고 마무리 ^^

 

(수정 후, 구글링해보니 http://sir.kr/qa/25353 와 같은 글이 있는 것 발견)

그누보드에서 티스토리 스킨을 사용한다면?!

길호넷을 그누보드에서 워드프레스로 바꾼 제일 큰 이유는 디자인 때문이다.

워드프레스는 “테마”를 통해 레이아웃 디자인은 손쉽게 바꿀 수 있도록 되어 있다.

또한, 많은 사용자들을 확보하고 있어 “테마”를 만드는 개인, 회사 등 엄청 많아 테마 고르는 것 또한 하나의 즐거움이 될 수 있다.

쓸만한 테마는 대부분 유료지만 가격이 상대적으로 저렴하다.
(대부분, 50$ 미만)

예전에도 수시로 생각했던 거지만, 티스토리 스킨을 활용하여 그누보드 레이아웃을 바꾸면 어떨까 하고 생각을 해 본 적이 있다.

티스토리 스킨의 레이아웃 파일에서 컨텐츠가 출력되는 영역을 기준으로 상하로 분리하고, 기본적인 변수, 옵션 등을 처리해 준 후, head.php, tail.php 에서 각각 출력하게끔 하면 손쉽게 티스토리 스킨을 이용하여 그누보드에 적용 하여 사용할 수 있다.

(다만, 티스토리 스킨의 저작권에 대해 생각해 봐야 될 문제라서 계속 보류 중이였지만….)

워드프레스, 그누보드 연동

현재 길호넷에서 워드프레스와 그누보드를 연동한 방식입니다.

사이트를 좀 더 안정화를 시킨 후 소스를 공개하려고 하였는데, 그누보드 사용자분의 요청(?)으로 급조하여 만든걸 올립니다. (http://sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=741180)

추후, 그누보드의 head.php, tail.php 에서 워드프레스에서 생성된 페이지를 직접 불러들이고, 캐쉬 처리 및 컨텐츠 영역을 상하로 나눈 후 출력하는것을 생각하고 있습니다.

– 워드프레스 회원 DB 를 기반으로 그누보드와 연동되어, 게시판 글 작성시 워드프레스의 로그인에 따라 액션을 취합니다.
– 그누보드를 gnu.kilho.net 로 사용하고 있습니다. 따라서 워드프레스에서 서브도메인과 쿠키를 공유할 수 있게 하여야 합니다.
(길호넷에서는 “root Cookie” 라는 플러그인을 사용하였습니다)
– 워드프레스와 그누보드가 각각의 서버로 운영되고 있습니다. 소스 내용 중 자신의 워드프레스가 설치된 서버IP, 워드프레스가 설치된 도메인 정보를 각각 수정하세요.
– 워드프레스가 설치된 서버에 아래 소스를 “wp-sso.php” 로 저장합니다.

<?
	/********************************************************
	 * WordPress SSO(Single Site On) Helper Object 
	 * by Oh Kilho (http://www.kilho.net)
	 *******************************************************/

	include 'wp-load.php';
	
	$wp_cookie = $_COOKIE&#91;'wordpress_logged_in_'.md5(get_site_option('siteurl'))&#93;;
	$wp_user = $_POST&#91;'user'&#93;;
	$wp_pass = $_POST&#91;'pass'&#93;;

	if($wp_user&&$wp_pass)
	{
		if(user_pass_ok($wp_user, $wp_pass))
			$user = get_user_by('login', $wp_user);
	}else{
		if($wp_cookie)
		{
			wp_set_current_user(wp_validate_auth_cookie($wp_cookie, 'logged_in'));
			$user = wp_get_current_user();
		}
	}

	if($user)
	{
		echo '<id>'.$user->user_login.'</id>';
		echo '<nick>'.$user->display_name.'</nick>';
		echo '<email>'.$user->user_email.'</email>';
		echo '<url>'.$user->user_url.'</url>';
	}
?>

– 그누보드가 설치된 서버의 “/extend/” 디렉토리에 아래 소스를 “wp-sso.php”로 저장합니다.

<?
/*
 그누보드 확장 모듈 : 워드프레스 SSO 처리
 */
$wp_server_domain = '워드프레스 설치된 도메인'; // xxx.com
$wp_server_addr = '워드프레스 설치된 서버 IP'; // xxx.xxx.xxx.xxx
$wp_server_path = '워드프레스 설치된 경로'; // 루트일 땐 '/' 로 작성

$wp_cookie_name = 'wordpress_logged_in_'.md5('http://'.$wp_server_domain);
$wp_cookie_value = $_COOKIE&#91;$wp_cookie_name&#93;;

if ($_SESSION&#91;'ss_mb_id'&#93;)
{
	// 총 관리자인 경우 열외 - 그누보드를 자체적으로 살펴볼 권한을 줘야징
	if(!$wp_cookie_value&&$is_admin != 'super')
	{
		// 이호경님 제안 코드
		session_unset(); // 모든 세션변수를 언레지스터 시켜줌 
		session_destroy(); // 세션해제함 

		// 페이지를 재실행
		echo "<script type='text/javascript'> window.location.reload(); </script>";
		exit;
	}
}else{
	if($wp_cookie_value)
	{
		// 메인 서버에서 정보 취득
		$fp = fsockopen($wp_server_addr,80,$errno,$errstr,3);

		if($fp)
		{
			fputs($fp, "GET {$wp_server_path}wp-sso.php HTTP/1.1\r\n");
			fputs($fp, "Accept: */*\r\n");
			fputs($fp, "Accept-Language: ko\r\n");
			fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1)\r\n");
			fputs($fp, "Host: $wp_server_domain\r\n");
			fputs($fp, "Connection: Close\r\n");
			fputs($fp, "Cookie: $wp_cookie_name=$wp_cookie_value\r\n");
			fputs($fp, "\r\n");

			$data = '';
			while(!feof($fp))
			{
				$data .= fgets($fp,1024);
			}

			fclose($fp);

			if($data)
			{
				foreach(array('id', 'nick', 'email', 'url', 'password') as $value)
				{
					preg_match('@<'.$value.'>(.*?)</'.$value.'>@',$data,$matches); 
					$wp_user[$value] = $matches[1];
				}
				$wp_user[pass] = substr(str_shuffle('abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'), 0, 12);

				$sql = " select mb_id from $g4[member_table] where mb_id='$wp_user[id]' ";
				$row = sql_fetch($sql);
				if($row[mb_id]!=$wp_user[id])
				{
					$sql = " insert into $g4[member_table]
									set mb_id = '$wp_user[id]',
										mb_password = password('$wp_user[pass]'),
										mb_name = '$wp_user[nick]',
										mb_nick = '$wp_user[nick]',
										mb_email = '$wp_user[email]',
										mb_homepage = '$wp_user[url]',
										mb_datetime = '$g4[time_ymdhis]',
										mb_ip = '$_SERVER[REMOTE_ADDR]',
										mb_level = '$config[cf_register_level]' ";
					sql_query($sql);
				}else{
					$sql = " update $g4[member_table]
									set mb_nick = '$wp_user[nick]',
										mb_email = '$wp_user[email]',
										mb_homepage = '$wp_user[url]'
									where mb_id = '$wp_user[id]' ";
					sql_query($sql);
				}
				unset($row);

				$mb = get_member($wp_user[id]);


				// 회원아이디 세션 생성
				set_session('ss_mb_id', $mb[mb_id]);
				// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106
				set_session('ss_mb_key', md5($mb[mb_datetime] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));

				// 페이지를 재실행
				echo "<script type='text/javascript'> window.location.reload(); </script>";
				exit;
			}
		}else{
			echo 'Connection failed';
			exit;
		}

	}
}
?>

그누보드 연동 완료

워드프레스 회원 DB 를 기반으로 그누보드와 연동 시켜, 게시판에서 로그인 시 글 작성이 가능하게 하였음.

  1. 서브 도메인과 쿠키공유
  2. 워드프레스가 설치된 서버에 아래 소스를 “wp-sso.php” 로 저장
    <?
    	include 'wp-load.php';
    	
    	$cookie_name = 'wordpress_logged_in_'.md5(get_site_option('siteurl'));
    	$cookie = $_COOKIE&#91;$cookie_name&#93;;
    
    	wp_set_current_user(wp_validate_auth_cookie($cookie, 'logged_in'));
    
    	if($user = wp_get_current_user())
    	{
    		echo '<id>'.$user->user_login.'</id>';
    		//echo '<nick>'.$user->user_nicename.'</nick>';
    		echo '<nick>'.$user->display_name.'</nick>';
    		echo '<email>'.$user->user_email.'</email>';
    		echo '<url>'.$user->user_url.'</url>';
    	}
    ?>
  3. 그누보드 세션값이 없고, 워드프레스 쿠키 값이 있을 경우 2번 모듈을 서버에서 처리하여 SSO(Single Sign On) 기능 구현
  4. 그누보드 세션값이 있고, 워드프레스 쿠키 값이 없을 경우 세션을 비우고 해당 페이지 갱싱
  5. 그누보드 페이지 로딩 이벤트 발생시 해당 페이지 리사이징

 

 

그누보드 백업 예행 연습

기존 사용중인 DB 를 euc-kr 에서 utf8 로 변환하기 위해, 백업을 정성스레(??) 받은 후

editplus 로 열었더니, 현재 인코딩에서 손실될 수 있는 문자가 포함되어 있다고 함,

일딴 무시하고 UTF8 로 바꾸고 Import …. 젠장 ㅠㅠ 깨진 글자들 때문에 안됨

급하게 검색~~~~ 결국 방법이 안보임..

(덤프 할 때 –default-character-set 까지 옵션 다 주고 해도 안되는 이런 경우는 ㅠㅠ)

어쩔수 없이 아래와 같은 소스를 발견, 입맛에 맞게 수정 (UTF8변환, 원하는 테이블 선택)

이전  확인 완료!!!!  – 이전하는건 역시나 귀찮코, 피곤해 ㅠㅠ

 

<?
$mysql_host = '********';
$mysql_db = '********';
$mysql_user = '********';
$mysql_pass = '********';

$fileName = 'db-backup';
$extention = "sql";

// 필요한 테이블만~
$select&#91;&#93; = 'g4_board';
$select&#91;&#93; = 'g4_board_file';
$select&#91;&#93; = 'g4_board_good';
$select&#91;&#93; = 'g4_board_new';
$select&#91;&#93; = 'g4_config';
$select&#91;&#93; = 'g4_group';
$select&#91;&#93; = 'g4_group_member';
$select&#91;&#93; = 'g4_write_cast';
$select&#91;&#93; = 'g4_write_delphibbs';
$select&#91;&#93; = 'g4_write_english';
$select&#91;&#93; = 'g4_write_girl';
$select&#91;&#93; = 'g4_write_gy';
$select&#91;&#93; = 'g4_write_humor';
$select&#91;&#93; = 'g4_write_module';
$select&#91;&#93; = 'g4_write_mypage';
$select&#91;&#93; = 'g4_write_notice';
$select&#91;&#93; = 'g4_write_poll';
$select&#91;&#93; = 'g4_write_qna';
$select&#91;&#93; = 'g4_write_skin';
$select&#91;&#93; = 'g4_write_talk';
$select&#91;&#93; = 'g4_write_temp';
$select&#91;&#93; = 'g4_write_temppds';
$select&#91;&#93; = 'g4_write_test';
$select&#91;&#93; = 'g4_write_tiptech';
$select&#91;&#93; = 'g4_write_varios';

$all = false; //완전한 Insert 문을 작성하려면 true
$drop = true; //drop table 구문을 포함하려면 true
 
mysql_connect( $mysql_host, $mysql_user, $mysql_pass ) || die("데이타 베이스 접속에 실패하였습니다.");
mysql_select_db( $mysql_db ) || die("DB 접속 실패");
 
function bak_getTableNames($db)
{
	$result&#91;0&#93; = mysql_list_tables($db);
	$result&#91;1&#93; = mysql_num_rows($result&#91;0&#93;);
	return $result;
}
 
function bak_getFields($table)
{
	global $all;
	$result = mysql_query("show fields from $table");
	$i = 0;
	while($keys = mysql_fetch_array($result)) 
	{
		if(!$i) $defaultOrder = $keys&#91;Field&#93;;
		if($keys&#91;Key&#93; == 'PRI') 
		{
			$orderby = $keys&#91;Field&#93;;
			break;
		}
		$i++;
	}
	if(!$orderby) $orderby = $defaultOrder;
	$result = mysql_query("select * from $table order by $orderby");
	$nums = mysql_num_fields($result);
	if($all == true) 
	{
		for($i=0;$i<$nums;$i++) 
		{
			$fields&#91;&#93; = mysql_field_name($result,$i);
		}
		$fields = "(".implode(",",$fields).") ";
	}
	while($rows = mysql_fetch_row($result)) 
	{
		for($i=0;$i<$nums;$i++) 
		{
			$temp = $rows&#91;$i&#93;;
			$temp = str_replace("'","''", $temp);
			$temp = str_replace("","\", $temp);
			$temp = str_replace("n",'n', $temp);
			$temp = str_replace("r",'r', $temp);
			
			$temp = iconv('CP949', 'UTF-8', $temp);
			$insertValues&#91;$i&#93; = $temp;
		}
		$return .= "INSERT INTO $table ".$fields."values ('".implode("','",$insertValues)."');n";
	}
	return $return;
}
 
$tables = bak_getTableNames($mysql_db);

if($tables&#91;1&#93; > 0) 
{
	$backText = "
# MysqlDump
# 호스트: ".$mysql_host."
# 처리한 시간: ".date('Y년 n월 j일 H시 i분')."
# 서버 버전: ".mysql_get_server_info()."
# 데이터베이스 : `".$mysql_db."`
# --------------------------------------------------------nnnnn";

	while($rows = mysql_fetch_row($tables[0])) 
	{
		$chk = false;
		for($i=0;$i<count($select);$i++)
		{
			if($rows&#91;0&#93;==$select&#91;$i&#93;)
			{
				$chk = true;
				break;
			}
		}
		
		if(!$chk)continue;

		$backText .= "
#
# 테이블 구조 `".$rows&#91;0&#93;."`
#nn";
		$skima = mysql_fetch_array(mysql_query("SHOW CREATE TABLE ".$mysql_db.".".$rows&#91;0&#93;));
		if($drop == true) $backText .= "DROP TABLE IF EXISTS ".$skima&#91;0&#93;.";nn";
		$backText .= "CREATE TABLE if not exists ".$skima&#91;0&#93;." ";
		$pos = strpos($skima&#91;1&#93;," (");
		$backText .= str_replace("`","",substr($skima&#91;1&#93;,($pos+1))).";";

		$insert = bak_getFields($rows&#91;0&#93;);
		$backText .= "
#
# 테이블 '".$rows&#91;0&#93;."' insert 문
#";
		if($insert) $backText .= "nnn".$insert;
		$backText .= "nnnnn";
	}

	header("Content-Type: application/octetstream");
	header("Content-Disposition: attachment; filename=".$fileName.".".$extention);
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');
	echo $backText;
}
?>