블로그는 자신만의 공간으로 자신만이 포스팅하고 자신만이관리한다
한마디로 혼자놀기...ㅋㅋ
혼자놀기가 나쁘다는것은 아니다
나도 매일같이 혼자 놀았으니까..
하지만 주변 친구들이 많거나.. 여자친구가 있으면.. 커뮤니티 블로그.. 커플 블로그는 어떨까

간단한 태터툴즈 패치를 통해서 그 염원을 이룰수가있다
실제로 이블로그는 커플블로그로 그패치를 적용해 한창 사용하고 있다..

다중 사용자의 그것과는 틀리다
블로그하나에 여러개의 개정으로 로그인할수있는것이고
각자의 아이디(이메일주소)와 패스워드 이름이 부여된다.


패치내용은 다음과 같다(여기서 태터툴즈 설치된 최상위 디렉토리는 /blog 이다)
1. ??_Users 데이터베이스 테이블에 admin 필드를 추가 (사용자 구분을 위한 필드)
2. /blog/blog/login/index.php 로그인할때 Session 을 저장한다
3. /blog/blog/comment/* 리플을 달때 사용자들을 구분해준다
4. /blog/blog/owner/setting/account 계정정보 출력
5. /blog/blog/owner/setting/account/password 패스워드 변경
6. /blog/blog/owner/setting/account/profile 프로필 변경

다음과 같은 패치를 통해서 사용자 로그인, 리플등록수정, 글등록, 사용자 정보수정이 가능하다

그럼 이제 패치를 해보자
추가해줘야할부분이 파란색으로 된 부분이다
1. 다음과 같이 sql 쿼리를실행한다
  ALTER TABLE `my_Users` ADD `admin` INT( 11 ) NOT NULL DEFAULT '1';
  PHP 로 작성하면 다음과 같다
[LINUX]<?php
include "../config.php";
$chakani_sql = mysql_connect($database['server'],$database['username'],$database['password']);
mysql_select_db($database['database']) or die("Fail Select DB");
mysql_query("ALTER TABLE `$database['prefix']Users` ADD `admin` INT( 11 ) NOT NULL DEFAULT '1'");
mysql_close($chakani_sql);
?>
[/LINUX]
  이 php 문을 /blog/blog/sql.php 로 저장한다. 그리고 http://홈페이지주소/sql.php  를 실행시키면된다

사용자 등록은 다음과 같은 쿼리문으로 등록할수있다
[LINUX]<?php
include "../config.php";
$user_id = "자신의 USERID";
$admin = "구분할숫자"; // 다른것과 같게 하지말고 전의 사용자의 admin 에서 1을 증가해서 넣는다
$email="이메일주소"; // 사용할아이디
$password = "패스워드";
$name = "이름";
$time = time();
$host = "자신의 호스트번호";
$chakani_sql = mysql_connect($database['server'],$database['username'],$database['password']);
mysql_select_db($database['database']) or die("Fail Select DB");
mysql_query("INSERT INTO `$database['prefix']Users` (`userid`, `admin`, `loginid`, `password`, `name`, `created`, `lastLogin`, `host`) VALUES ('$user_id', '$admin', '$email', MD5('$password'), '$name', '$time', '0', '$host')");
mysql_close($chakani_sql);
?>
[/LINUX]
이것역시 /blog/blog/add.php 로 저장한다 그리고 http://홈페이지주소/add.php  를 실행시키면된다
그러면 사용자 추가 끝


2. /blog/blog/login/index.php 를 패치한다
  289 줄의 함수 authorizeSession
  316 줄의 함수 login 이 그대상이다
[LINUX]function authorizeSession($userid, $admin){
       global $database,$service;
       if(!is_numeric($userid))
               return false;
       $_SESSION['userid']=$userid;
       $_SESSION['admin']=$admin;
       if(isSessionAuthorized(session_id()))
               return true;
       for($i=0;$i<100;$i++){
               $id=dechex(rand(0x10000000,0x7FFFFFFF)).dechex(rand(0x10000000,0x7FFFFFFF)).dechex(rand(0x10000000,0x7FFFFFFF)).dechex(rand(0x10000000,0x7FFFFFFF));
               $result=mysql_query("INSERT INTO {$database['prefix']}Sessions(id, address, userid, created, updated) VALUES('$id', '{$_SERVER['REMOTE_ADDR']}', $userid, UNIX_TIMESTAMP(), UNIX_TIMESTAMP())");
               if($result&&(mysql_affected_rows()==1)){
                       @session_id($id);
                       header("Set-Cookie: TSSESSION=$id; path=/; domain={$service['domain']}");
                       return true;
               }
       }
       return false;
}
[/LINUX]

[LINUX]function login($loginid,$password){
       global $database;
       global $service;
       $loginid=mysql_escape_string($loginid);
       if((strlen($password)==32)&&preg_match('/[0-9a-f]/i',$password))
               $secret='(`password` = \''.md5($password)."' OR `password` = '$password')";
       else
               $secret='`password` = \''.md5($password).'\'';
       if($result=mysql_query("SELECT userid, admin, loginid, name FROM {$database['prefix']}Users WHERE loginid = '$loginid' AND $secret")){
               if($session=mysql_fetch_array($result)){
                       authorizeSession($session['userid'], $session['admin']);
                       if(empty($_POST['save']))
                               setcookie('TSSESSION_LOGINID','',time()-31536000,$service['path'].'/',$service['domain']);
                       else
                               setcookie('TSSESSION_LOGINID',$loginid,time()+31536000,$service['path'].'/',$service['domain']);
                       executeQuery("UPDATE  {$database['prefix']}Users SET lastLogin = unix_timestamp() WHERE loginid = '$loginid'");
                       return true;
               }
       }
       return false;
}
[/LINUX]

3. 리플 패치를 해보자
  /blog/blog/comment/add/item.php 의 559번째줄 과 /blog/blog/comment/comment/item.php 의 627번째불, /blog/blog/comment/delete/item.php 의 574 번째 줄을 수정한다
  줄수는 모두 틀리지만 패치해야하는 내용은 같다
  list($user['loginid'],$user['name'])=fetchQueryRow("select loginid, name from {$database['prefix']}Users where userid = {$user['id']} and admin=$_SESSION[admin]");


여기 까지 패치를 하면 로그인하고 글쓰고 리풀을 다는데는 문제가 없다
다만 계정정보 관리에서 패스워드와 프로필의 업데이트가 안된다..


4. 로그인 -> 환경설정 -> 계정정보 출력을 해보자
  /blog/blog/owner/setting/account/index.php 의 367 번째줄
  list($user['loginid'],$user['name'])=fetchQueryRow("select loginid, name from {$database['prefix']}Users where userid = {$user['id']} and admin=$_SESSION[admin]");
 
5. 로그인 -> 환경설정 -> 계정정보 -> 패스워드 변경
  /blog/blog/owner/setting/account/password/index.php 의 338번째줄
  list($user['loginid'],$user['name'])=fetchQueryRow("select loginid, name from {$database['prefix']}Users where userid = {$user['id']} and admin=$_SESSION[admin]");
  117번째 줄의 함수 changePassword 수정
[LINUX]function changePassword($owner,$pwd,$prevPwd){
       global $database, $_SESSION;
       if(!strlen($pwd)||!strlen($prevPwd))
               return false;
       if((strlen($prevPwd)==32)&&preg_match('/[0-9a-f]/i',$prevPwd))
               $secret='(`password` = \''.md5($prevPwd)."' OR `password` = '$prevPwd')";
       else
               $secret='`password` = \''.md5($prevPwd).'\'';
       $count=fetchQueryCell("select count(*) from {$database['prefix']}Users where userid = $owner and $secret");
       if($count==0)
               return false;
       $pwd=md5($pwd);
       $sql="UPDATE `{$database['prefix']}Users` SET password = '$pwd' WHERE `userid` = $owner and admin=$_SESSION[admin]";
       return executeQuery($sql);
}
[/LINUX]
6. 로그인 -> 환경설정 -> 계정정보 -> 프로필 변경
  /blog/blog/owner/setting/account/profile/index.php 의 335번째줄
  list($user['loginid'],$user['name'])=fetchQueryRow("select loginid, name from {$database['prefix']}Users where userid = {$user['id']} and admin=$_SESSION[admin]");
  114번째 줄의 함수 changeSetting
[LINUX]function changeSetting($owner,$email,$nickname){
       global $database, $_SESSION;
       $email=mysql_escape_string($email);
       $nickname=mysql_escape_string($nickname);
       if($email==''||$nickname==''){
               return false;
       }
       $sql="UPDATE `{$database['prefix']}Users` SET loginid = '$email', name = '$nickname' WHERE `userid` = $owner and admin=$_SESSION[admin]";
       $result=mysql_query($sql);
       if(!$result){
               return false;
       }else{
               return true;
       }
}
[/LINUX]

이밖에도 블로그 아이콘을 사용자마다 틀리게 패치를 했지만
블로그 아이콘을 구분하는 기준이 이름밖에 없어서
사용자가 이름을 바꾸면 표시를 못하기때문에 설명에서 뺐다..ㅎㅎ

그럼 이제 커플로그를 사용해보자..


첨부된 파일은 현재 http://chakani.net  에 적용된 패치내용이다
참고 해도 좋고 /blog 아래에서 압축을 풀면 한번에 패치가 되버린다(이거 주의..)
태터 툴즈 V1.0.5 를 기반으로 작성되었다
하지만 패치는 V1.0.4 에서도 적용가능하다
CHAKANI_patch060511.tar.bz2

커플로그 패치 V0.1

2006/05/11 10:59 2006/05/11 10:59

트랙백 주소 :: http://me.chakani.net/trackback/123

댓글을 달아 주세요

  1. Chester 2006/05/11 15:19  댓글주소  수정/삭제  댓글쓰기

    간단하게 팀블로그 작성이 가능하겠군요. 그런데 이거 멀티유저모드에서는 어떻게 적용하면 되지요 ??

  2. ♡차칸아이♡ 2006/05/11 23:17  댓글주소  수정/삭제  댓글쓰기

    다중사용자에서는 테스트는 안해봤지만 똑같이 적용될것 같은데요..
    새로등록되는 사용자는 아이디, 이름, admin 값만 틀리게하고 나머지는 같게 등록하니까요
    userid 하고 host 이 값이 같으면 될것은데요

  3. 제로 2006/05/18 15:55  댓글주소  수정/삭제  댓글쓰기

    userid의 경우 primary값이면서 자동값을 가지고 있어서 동일한 값을 줄수가 없네요... 아마도 개인사용자용은 userid에 paimary값을 넣을 필요가 없어서 안걸려 있을수도 있겠지만요 ㅠ ㅜ

  4. 제로 2006/05/18 15:59  댓글주소  수정/삭제  댓글쓰기

    저는 asp랑 ms-sql을 가지고 놀았기에... php와 my-sql만 보면 속이 울렁거리네요... +__+;;
    저런경우에 아예 컬럼값을 하나 더 줘서.. .디폴트로 비어있게 하고.. 거기에 userid값을 준후에 로그인시 select구문에서 새로만든 컬럼값이 비어있지 않을경우 그 값을 userid에 대입후 로긴하게 하는건 어떨가 하는 생각이 드는데요... 가능할까요?

    • ♡차칸아이♡ 2006/05/19 00:06  댓글주소  수정/삭제

      아!! 이거 할때 초기에 했던것이라서 잊었던 부분이군요 ^^;;
      맞습니다 그부분에서 걸리는데 primary 값하고 autoindex 값을 해제한 디비를 사용했었습니다
      DB 에서 그값만 해제시켜주면 됩니다.

  5. hongback 2006/05/19 01:32  댓글주소  수정/삭제  댓글쓰기

    좋은 플러그인이군요. 이것때문에 다중사용자모드로 설치해서 사용하는데 불편해 죽겠더라구요. 저의 고민을 깔끔하게 해결해 주셨군요. 감사합니다.

  6. 그니 2006/05/22 01:01  댓글주소  수정/삭제  댓글쓰기

    죄송합니다만.. 질문좀 드려도 될런지요..
    아래 부분에서...


    $user_id = "자신의 USERID";
    $admin = "구분할숫자"; // 다른것과 같게 하지말고 전의 사용자의 admin 에서 1을 증가해서 넣는다
    $email="이메일주소"; // 사용할아이디
    $password = "패스워드";
    $name = "이름";
    $time = time();
    $host = "자신의 호스트번호";


    이메일주소, 패스워드, 이름은 다른 사람의 로그인 정보를 넣는것일테고..
    그 외의 부분...
    자신의 userid, 구분할숫자.. 호스트번호에는 뭘 넣어야 할지가 막막합니다..
    기존에 사용하던 제보보드는 나름대로 이거저거 많이 수정해가면서 사용해왔는데..
    태터는 초짜라.. 이거 원 무슨 소리인지.. ㅡㅡ;;


    참고로 현재 혼자 사용중이며.. 집사람 로긴 정보를 넣어볼려고 하는 중입니다..
    즉, 사용자 1명 추가를 할려고 하는 상태이죠..

    • ♡차칸아이♡ 2006/05/22 09:34  댓글주소  수정/삭제

      간단하게 다음과 같은 php 문을 실행하면됩니다

      <?php
      include "../config.php";

      $user_id = "자신의 로그인하는 이메일주소";

      $email="이메일주소"; // 사용할아이디
      $password = "패스워드";
      $name = "이름";


      $chakani_sql = mysql_connect($database['server'],$database['username'],$database['password']);
      mysql_select_db($database['database']) or die("Fail Select DB";);

      $Uresult = mysql_query("SELECT * FROM ".$database['prefix']."Users WHERE loginid='$user_id'";);
      $Urow = mysql_fetch_array($Uresult);

      $Aresult = mysql_query("SELECT * FROM ".$database['prefix']."Users WHERE userid='$Urow[userid]' ORDER BY admin DESC";);
      $Arow = mysql_fetch_array($Aresult);

      $admin = $Arow[admin]+1;


      $time = time();
      mysql_query("INSERT INTO `$database['prefix']Users` (`userid`, `admin`, `loginid`, `password`, `name`, `created`, `lastLogin`, `host`) VALUES ('$Urow[userid]', '$admin', '$email', MD5('$password'), '$name', '$time', '0', '$Urow[host]')";);


      mysql_close($chakani_sql);
      ?>

    • 그니 2006/05/23 03:53  댓글주소  수정/삭제

      히궁.. 이것두 실패했습니다.. 오류가 나오네요...


      그리고 새로 올려주신것 봤습니다..
      그걸로 다시 해봐야겠습니다.. ^^
      신경써주셔서 감사합니다..


      이것만 성공하면.. 태터로 갈아탈 준비가 거의 되어가는데~~

  7. 제로 2006/05/22 01:38  댓글주소  수정/삭제  댓글쓰기

    그니//같이 사용할 태터 관리자(운영자?)의 DB정보를 보면 호스트번호와 userid의 숫자가 있습니다. 그 숫자를 동일하게 넣어주면 됩니다...
    요청 드릴께 있어서 왔다가 답을 달고 가네요 +__+;;

  8. 제로 2006/05/22 01:40  댓글주소  수정/삭제  댓글쓰기

    차칸아이님 먼저 위에 올렸었던 질문은 DB에서 primar값과 autoindex값을 해제해서 넘어갔습니다. 그런데 추가한 사용자로 로그인을 하고 새로운글을 남기면 원 블로그의 주인의 이름으로 표시가 되더군요... 아무래도 글을 저장할때 세션의 유저명을 넣지 않고 사전에 db에서 불러온 원 사용자의 이름을 저장하는것 같습니다. (개인적인 생각이니 틀렸따고 미워하지는 말아주세요 ㅠ ㅜ)
    저 부분도 수정하셔서 올려주시면 더욱 완벽하게 될것 같아서 요청을 드립니다.
    가능할까요?

    • ♡차칸아이♡ 2006/05/22 09:25  댓글주소  수정/삭제

      이름이 표시되는 부분은 방명록하고 리플에 관해서 패치가되어있습니다
      포스팅에서 이름을 표시할려면(DB 에 이름을 넣는 부분없이 onwer 변수로 구분하기때문에) DB 안에 새로운 테이블 하나를 추가해야하는 문제가 발생합니다
      만약 테이블을 추가해도 괜찮다면 작업에 착수하겠습니다 ^^
      리플 달아주시길..ㅎㅎ

  9. 제로 2006/05/22 11:41  댓글주소  수정/삭제  댓글쓰기

    신경써주셔서 감사합니다. ㅠ ㅜ
    감동의 눈물입니다..흑흑~
    어차피 이미 테이블은 추가된 상태니까요 ^^ 더 추가된다 해도 문제될껀 없습니다.
    단지 차칸아이님의 시간을 뺴앗게 되는게 죄송스러울 따름입니다.
    그럼 죄송스럽지만 부탁을 드리겠습니다. ^^ 감사합니다~!!!

  10. 지성아빠 2006/08/28 19:24  댓글주소  수정/삭제  댓글쓰기

    테터툴즈 플러그인 자료실에 있는 팀블로깅 패치와 이거랑 다른건가요?

    저도 와이프랑 같이 테터툴즈를 사용하고 싶어서요...

    죄송하지만..답변 부탁드려요..수고하세요...

    • ♡차칸아이♡ 2006/08/28 20:57  댓글주소  수정/삭제

      태터툴즈 플러그인 게시판에 발표한것의 모태라고나 할수있습니다
      이것을 시작으로 팀블로그를 만들었거든요
      현재의 포스팅은 태터툴즈 1.0.5 에만 적용할수있는것이고 그기능역시 상당히 제약적입니다
      최신버전을 참고하시는게 좋을것 같아요 ^^

[로그인][오픈아이디란?]