웹마스터 팁
익명게시판에서 관리자가 글 수정시 글의 권한이 넘어가지 않도록 하기.
2014.06.11 07:13
1. 개요
이 코드는 1.7.5.2 버전이상에서 테스트 했습니다.
member_srl 을 기록하여 익명게시판에 글 수정권한을 유저가 가지도록 하는데 이를 운영진이 글을 수정하엿을 경우 그 글의 권한이 운영진으로 넘어가게 됩니다. 그렇게 되면서 그 글을 적었던 유저는 그 글을 삭제, 수정 권한이 뺐기는 문제가 있습니다.
2. 해결 방안
기본적으로 XE 게시판 모듈에서 글쓰기와 글수정은 한곳에서 이루어지며, 글 수정의 경우 update 하는 방안으로 처리가 되고 있습니다. 이를 이용하여 동시 다발적으로 member_srl 을 처리하는 부분을 각각 나눠서 글 수정시에는 member_srl 을 다시 기록하지 않도록 하는 것이 바람직합니다.
3. 코드 제공.
https://github.com/xpressengine/xe-core/pull/778/files
을 기본바탕으로 보고 따라코드 적으시면 됩니다.
xe/modules/board/board.controller.php
파일에서
63번째줄부터 77번째줄까지 (빈 줄도 함께 잘라내세요..)을 잘라내기로 짜릅니다. (지워지면서 복사 붙여넣기 되어야 합니다.)
// if use anonymous is true
if($this->module_info->use_anonymous == 'Y')
{
$this->module_info->admin_mail = '';
$obj->notify_message = 'N';
$obj->member_srl = -1*$logged_info->member_srl;
$obj->email_address = $obj->homepage = $obj->user_id = '';
$obj->user_name = $obj->nick_name = 'anonymous';
$bAnonymous = true;
$oDocument->add('member_srl', $obj->member_srl);
}
else
{
$bAnonymous = false;
}
이 코드입니다.
이 잘라낸 코드는 if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl)
이라고 적혀있는 if문 속에 넣어주시면 됩니다./100번째줄에 넣으세요./
넣어주실때 $obj->member_srl = -1*$logged_info->member_srl;
문구는 지워야합니다.
// if use anonymous is true
if($this->module_info->use_anonymous == 'Y')
{
$this->module_info->admin_mail = '';
$obj->notify_message = 'N';
$obj->email_address = $obj->homepage = $obj->user_id = '';
$obj->user_name = $obj->nick_name = 'anonymous';
$bAnonymous = true;
$oDocument->add('member_srl', $obj->member_srl);
}
else
{
$bAnonymous = false;
}
이렇게 되어야 합니다..
그리고 121번째줄에도 마찬가지로 붙여넣으시고 해당 member_srl 은 지우시지 않으셔도 됩니다
// if use anonymous is true
if($this->module_info->use_anonymous == 'Y')
{
$this->module_info->admin_mail = '';
$obj->notify_message = 'N';
$obj->member_srl = -1*$logged_info->member_srl;
$obj->email_address = $obj->homepage = $obj->user_id = '';
$obj->user_name = $obj->nick_name = 'anonymous';
$bAnonymous = true;
$oDocument->add('member_srl', $obj->member_srl);
}
else
{
$bAnonymous = false;
}
이렇게 해서 procBoardInsertDocument
의 총 코드는 아래코드와 같아야 합니다.
function procBoardInsertDocument()
{
// check grant
if($this->module_info->module != "board")
{
return new Object(-1, "msg_invalid_request");
}
if(!$this->grant->write_document)
{
return new Object(-1, 'msg_not_permitted');
}
$logged_info = Context::get('logged_info');
// setup variables
$obj = Context::getRequestVars();
$obj->module_srl = $this->module_srl;
if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N';
$obj->commentStatus = $obj->comment_status;
settype($obj->title, "string");
if($obj->title == '') $obj->title = cut_str(strip_tags($obj->content),20,'...');
//setup dpcument title tp 'Untitled'
if($obj->title == '') $obj->title = 'Untitled';
// unset document style if the user is not the document manager
if(!$this->grant->manager)
{
unset($obj->title_color);
unset($obj->title_bold);
}
// generate document module model object
$oDocumentModel = getModel('document');
// generate document module의 controller object
$oDocumentController = getController('document');
// check if the document is existed
$oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager);
if((!$obj->status && $obj->is_secret == 'Y') || strtoupper($obj->status == 'SECRET'))
{
$use_status = explode('|@|', $this->module_info->use_status);
if(!is_array($use_status) || !in_array('SECRET', $use_status))
{
$obj->status = 'PUBLIC';
}
}
// update the document if it is existed
if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl)
{
if(!$oDocument->isGranted())
{
return new Object(-1,'msg_not_permitted');
}
if($this->module_info->protect_content=="Y" && $oDocument->get('comment_count')>0 && $this->grant->manager==false)
{
return new Object(-1,'msg_protect_content');
}
if(!$this->grant->manager)
{
// notice & document style same as before if not manager
$obj->is_notice = $oDocument->get('is_notice');
$obj->title_color = $oDocument->get('title_color');
$obj->title_bold = $oDocument->get('title_bold');
}
// modify list_order if document status is temp
if($oDocument->get('status') == 'TEMP')
{
$obj->last_update = $obj->regdate = date('YmdHis');
$obj->update_order = $obj->list_order = (getNextSequence() * -1);
}
// if use anonymous is true
if($this->module_info->use_anonymous == 'Y')
{
$this->module_info->admin_mail = '';
$obj->notify_message = 'N';
$obj->email_address = $obj->homepage = $obj->user_id = '';
$obj->user_name = $obj->nick_name = 'anonymous';
$bAnonymous = true;
$oDocument->add('member_srl', $obj->member_srl);
}
else
{
$bAnonymous = false;
}
$output = $oDocumentController->updateDocument($oDocument, $obj);
$msg_code = 'success_updated';
// insert a new document otherwise
} else {
// if use anonymous is true
if($this->module_info->use_anonymous == 'Y')
{
$this->module_info->admin_mail = '';
$obj->notify_message = 'N';
$obj->member_srl = -1*$logged_info->member_srl;
$obj->email_address = $obj->homepage = $obj->user_id = '';
$obj->user_name = $obj->nick_name = 'anonymous';
$bAnonymous = true;
$oDocument->add('member_srl', $obj->member_srl);
}
else
{
$bAnonymous = false;
}
$output = $oDocumentController->insertDocument($obj, $bAnonymous);
$msg_code = 'success_registed';
$obj->document_srl = $output->get('document_srl');
// send an email to admin user
if($output->toBool() && $this->module_info->admin_mail)
{
$oMail = new Mail();
$oMail->setTitle($obj->title);
$oMail->setContent( sprintf("From : <a href=\"%s\">%s</a><br/>\r\n%s", getFullUrl('','document_srl',$obj->document_srl), getFullUrl('','document_srl',$obj->document_srl), $obj->content));
$oMail->setSender($obj->user_name, $obj->email_address);
$target_mail = explode(',',$this->module_info->admin_mail);
for($i=0;$i<count($target_mail);$i++)
{
$email_address = trim($target_mail[$i]);
if(!$email_address) continue;
$oMail->setReceiptor($email_address, $email_address);
$oMail->send();
}
}
}
// if there is an error
if(!$output->toBool())
{
return $output;
}
// return the results
$this->add('mid', Context::get('mid'));
$this->add('document_srl', $output->get('document_srl'));
// alert a message
$this->setMessage($msg_code);
}
여기까지 오시느라 수고 많으셧습니다.
댓글로 질문 남겨주셔도 좋습니다
댓글 5
제목 | 글쓴이 | 날짜 |
---|---|---|
조건별로 스킨 바꾸기 | 라르게덴 | 2008.07.11 |
댓글 입력창에 배경 이미지 삽입하는 방법 [4] | 팔공산 | 2008.07.11 |
최근게시물에 권한주어서 회원만 내용물보게하기 [1] | 팔공산 | 2008.07.11 |
다른 브라우저에서 내 사이트가 어떻게 보이나 확인하자~ [3] | 비나무 | 2008.07.10 |
최고관리자 이외에는 ''회원정보보기''를 막기 [13] | 비나무 | 2008.07.10 |
방명록 스킨을 통한 글 작성시 임시저장 가능케 하기(수정) | 라르게덴 | 2008.07.08 |
1.04 엡데이트후 재설치등으로 로그인안될때 해결법 [5] | 좀비이 | 2008.07.08 |
폼메일 응용해서 쓰세요... [6] | 코리아프럼 | 2008.07.08 |
FTP로 지워지지 않는 파일 삭제방법. [9] | pakjce | 2008.07.05 |
list게시판 목록 제목 줄바꿈 안하기 [4] | 팔공산 | 2008.07.05 |
메뉴에 이미지 버튼 사용하기 팁이요~ 이미지첨부! [3] | Zzini.net | 2008.07.05 |
1차 메뉴에서 하위 메뉴 없을때 생기는 여백 없애는 방법 [7] | 제로시오 | 2008.07.04 |
[팁]페이지별 댓글 출력 초간단 팁.. [4] | 키티나 | 2008.07.04 |
주소창에 보이는 아이콘 넣기..제로보드 XE에서 [2] | 은바가지 | 2008.07.03 |
위지웍 에디터를 오페라 브라우져에서는 사용 안하기 | 라르게덴 | 2008.07.02 |
동일한 계정내에서의 포워딩 방법 [2] | 하이쿠 | 2008.07.01 |
php폼메일 관련 한번 올려봅니다. 사용하실분들은 수정하셔서 사용해보세요.. [10] | 코리아프럼 | 2008.06.26 |
[1원짜리팁] 큰 이미지 썸네일 못생성& 확장변수 원하는 곳에 배치하기 ^^ [2] | 파파민 | 2008.06.23 |
Autolink에 주소 복사 추가 & 본문 글 주소 복사 추가 [4] | 탑심 | 2008.06.22 |
업그레이드 쉽고,안전하게 하기 [5] | wannabewize | 2008.06.21 |