/** 댓글 삭제 * @class write * @param $no: 댓글 번호, 배열로 복수개 가능 $board_data: 게시판 설정 data -id: 게시판 아이디. 게시판 설정 data가 없을 때 아이디를 토대로 설정을 로드한다. -del_post: 권한에 상관없이 무조건 지워진다 */ function delCmt($no, $board_data = '', $param = '', $data_post = '') { global $mini; $param = param($param); iss($param['id']); $output = array(); $output['success'] = $output['fail'] = 0; $output['msg'] = ''; //// 게시판 설정 if (!is_array($board_data)) { if ($param['id']) { $board_data = getBoard($param['id'], 1); } else { __error('게시판 설정이 없습니다'); } } //// 댓글 번호 if (!is_array($no)) { $tmp = $no; $no = array(); $no[0] = $tmp; } //// 삭제 foreach ($no as $key => $val) { $result = 1; check($val, "type:num, name:댓글번호"); // 데이터 로드 $data_ex = sql("SELECT * FROM {$board_data['table_cmt']} WHERE no={$val}"); if (!is_array($data_ex)) { continue; } if ($data_ex['is_del'] && empty($mini['member']['level_admin'])) { continue; } // 잠긴댓글 if (empty($mini['member']['level_admin']) && !empty($data_ex['is_lock'])) { __error('댓글이 잠겨 있어 수정, 삭제를 할 수 없습니다'); } // 회원정보 로드 if (!empty($data_ex['target_member'])) { $mdata = sql("SELECT * FROM {$mini['name']['member']} WHERE no={$data_ex['target_member']}"); if (is_array($mdata)) { parseMember($mdata); } else { $data_ex['target_member'] = 0; $data_ex['pass'] = md5(); } } // 권한 체크 if (!empty($data_ex['target_member']) && empty($param['del_post'])) { if (empty($mini['log'])) { __error("[{$data_ex['no']}] 권한이 없습니다. [로그인이 필요합니다]"); } if (empty($mini['member']['level_admin']) && empty($mdata['level_admin']) && $mdata['no'] != $mini['member']['no']) { __error("[{$data_ex['no']}] 권한이 없습니다. [자신이 쓴 댓글만 수정할 수 있습니다]"); } if (!empty($mdata['level_admin']) && $mdata['no'] != $mini['member']['no'] && $mdata['level_admin'] >= $mini['member']['level_admin']) { __error("[{$data_ex['no']}] 권한이 없습니다. [자신보다 높거나 같은 권한의 관리자가 쓴 댓글 입니다]"); } } else { if (empty($param['del_post'])) { if (count($no) > 1 && empty($mini['member']['level_admin'])) { __error('비회원의 댓글는 한번에 한개씩 삭제하실 수 있습니다.'); } if (empty($mini['member']['level_admin'])) { if (empty($_REQUEST['pass_encode'])) { __error(array('mode' => 'goto', 'url' => "pass.php?id={$_REQUEST['id']}&group={$_REQUEST['group']}&url=" . url())); } if (!empty($mini['log'])) { __error("[{$data_ex['no']}] 권한이 없습니다. [비회원이 쓴댓글 입니다]"); } if ($_REQUEST['pass_encode'] != md5("{$data_ex['pass']}|{$mini['ip']}|" . session_id())) { __error("[{$data_ex['no']}] 권한이 없습니다. [비밀번호가 일치하지 않습니다]"); } } } } // 대상 게시물 로드 if (empty($data_post)) { $data_post = sql("SELECT * FROM {$board_data['table']} WHERE no={$data_ex['target_post']}"); } // 휴지통 if (!empty($board_data['use_trash'])) { $trash = $trash_tmp = array(); foreach ($data_ex as $key2 => $val2) { switch ($key2) { case 'category': case 'tag': case 'target_member': case 'target_post': case 'name': case 'mail': case 'title': case 'ment': case 'ip': case 'date': case 'trackback': $trash[$key2] = $val2; break; case 'no': case 'prev': case 'next': break; default: $trash_tmp[$key2] = $val2; } } // 댓글 자식 구하기 $tmp = sql("q:SELECT no FROM {$mini['board']['table_cmt']} WHERE target_post={$data_ex['target_post']} and num={$data_ex['num']} and reply > {$data_ex['reply']} ORDER BY reply, mode:firstFieldArray"); $tmp_child = is_array($tmp) ? "[" . implode("][", $tmp) . "]" : ""; $trash = array_merge($trash, array('target_member_in' => !empty($mini['log']) ? $mini['member']['no'] : 0, 'ip_in' => $mini['ip'], 'date_in' => $mini['date'], 'num' => $data_ex['no'], 'id' => $board_data['no'], 'field' => serialize($trash_tmp), 'child' => $tmp_child)); sql("INSERT INTO {$mini['name']['trash']} " . query($trash, 'insert')); } // 자식 댓글이 있을 경우 삭제 댓글 처리함 $count_reply = sql("q:SELECT no FROM {$board_data['table_cmt']} WHERE target_post={$data_ex['target_post']} and parent LIKE '%[{$data_ex['no']}]%', mode:firstFieldArray"); if (!empty($count_reply) && empty($mini['member']['level_admin']) && empty($param['del_post'])) { $name = !empty($mini['log']) ? $mini['member']['name'] : $data_ex['name']; sql("UPDATE {$board_data['table_cmt']} SET ment='{$name}에 의해 삭제 되었습니다. [" . date("Y/m/d H:i:s") . "]', field='', is_del=1 WHERE no={$data_ex['no']}"); } else { // 쿼리 sql("DELETE FROM {$board_data['table_cmt']} WHERE no={$val}"); // 답변 댓글 당기기 sql("UPDATE {$board_data['table_cmt']} SET reply=reply-1 WHERE target_post={$data_ex['target_post']} and reply > {$data_ex['reply']} and reply > 0"); // 답변 댓글 모두 제거 if (!empty($count_reply)) { delCmt($count_reply, $board_data); } } // 검색어 제거 delIndex($data_post['num'], $data_ex['no']); // 게시물의 댓글 수 빼기 if (empty($data_ex['is_del'])) { sql("UPDATE {$board_data['table']} SET " . (!empty($data_ex['trackback']) ? "count_trackback=count_trackback-1" : "count_comment=count_comment-1") . " WHERE no={$data_ex['target_post']}"); } // 포인트 if ($board_data['point_comment'] !== 0 && !empty($mini['log']) && !empty($data_ex['target_member']) && (empty($board_data['use_cmt_point_one']) || !sql("SELECT COUNT(*) FROM {$board_data['table_cmt']} WHERE target_post={$data_post['no']} and target_member={$data_ex['target_member']}"))) { setPoint("\n\t\t\t\t\t\ttarget: {$data_ex['target_member']}\n\t\t\t\t\t\tpoint: {$board_data['point_comment']}\n\t\t\t\t\t\tmsg: 댓글 삭제\n\t\t\t\t\t\tparent_no: {$board_data['no']}\n\t\t\t\t\t\tdata_no: {$data_ex['no']}\n\t\t\t\t\t\tis_del: 1\n\t\t\t\t\t"); } } }
/** * 로그인 * @class login * @param $data: POST array -site: 그룹번호 -board: 게시판번호 -is_passed: 무조건로그인[0!|1] */ function setLogin(&$data, $param) { global $mini; $param = param($param); iss($data['uid']); iss($data['pass']); iss($data['pass_encode']); iss($data['autologin']); iss($mini['set']['use_login_session']); iss($pass_after); iss($key_login); iss($autologin_after); def($mini['this']['script'], $_REQUEST['script']); def($mini['this']['script'], 'back'); def($mini['set']['lock_login'], 5); def($param['is_passed'], 0); $site_data = $board_data = array(); $site = ''; if (empty($param['site'])) { __error('선택된 그룹이 없습니다.' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } //// 그룹 로드 if (!empty($mini['site']) && $mini['site']['no'] == $param['site']) { $site_data = $mini['site']; } else { $site_data = getSite($param['site'], 1); } //// 게시판 로드 if (!empty($param['board'])) { if (!empty($mini['board']) && $mini['board']['no'] == $param['board']) { $board_data = $mini['board']; } else { $board_data = getBoard($param['board'], 1); } } else { if (!empty($mini['board']['site']) && $mini['board']['site'] == $site_data['no']) { $board_data = $mini['board']; } } //// 변수 검사 check($data['uid'], "name: 아이디"); if (!$param['is_passed']) { check($data['pass_encode'], "type:id, name:암호화된 비밀번호, min:16, max:40"); } if (!isset($site_data)) { __error('선택된 그룹이 없습니다.'); } $data['uid'] = mysql_escape_string($data['uid']); //// 미니아이 로그인 if (preg_match("/^\\@/", $data['uid'])) { __error('준비중 입니다.'); } else { $site = "[{$site_data['no']}]"; // 그룹의 그룹연결 if (!empty($site_data['site_link'])) { $site .= $site_data['site_link']; } // 게시판의 그룹연결 if (!empty($board_data['site_link'])) { $site .= $board_data['site_link']; } } //// 데이터 로드 $tmp_data = sql("q:SELECT * FROM {$mini['name']['member']} WHERE uid='{$data['uid']}', mode:array"); //// 아이디 확인 if (!is_array($tmp_data)) { __error('일치하는 회원이 없습니다'); } //// 그룹 확인 $check = 0; foreach ($tmp_data as $key => $val) { if (inStr($val['site'], $site) || count(array_intersect(getStr($site), getStr($val['site_link']))) || inStr('god', $val['admin']) || inStr('admin', $val['admin'])) { $check = 1; $data_ex = $val; } } if (!$check) { __error('일치하는 회원이 없습니다'); } //// 컨버팅 회원 확인 if (preg_match("/^\\!/", $data_ex['pass'])) { if (!empty($mini['complete']['ajax'])) { __complete(array('mode' => 'ajax,reload.parent', 'script' => "window.open(\"{$mini['dir']}login.conv.php?no={$data_ex['no']}\", \"conv\", \"width=400, height=400, scrollbars=2\");")); } else { __complete(array('mode' => 'move', 'url' => "{$mini['dir']}login.conv.php?no={$data_ex['no']}")); } } //// 실패 회수 확인 if ($data_ex['lock_login'] >= $mini['set']['lock_login'] && $data_ex['no'] != 1) { __error("로그인을 {$mini['set']['lock_login']}회 이상 실패하여 아이디가 잠겼습니다. 관리자에게 문의하세요"); } //// 비밀번호 확인 if (!$param['is_passed'] && $data['pass_encode'] != md5("{$data_ex['pass']}|{$mini['ip']}|" . session_id())) { if ($data_ex['pass'] == 'reset!') { __error('비밀번호가 초기화 되었습니다. 아이디/비밀번호 찾기를 통해 새 비밀번호로 설정해 주세요'); } sql("UPDATE {$mini['name']['member']} SET lock_login = lock_login + 1 WHERE no={$data_ex['no']}"); addLog("\n\t\t\t\tmode: login_lock_login\n\t\t\t\ttarget_member: {$data_ex['no']}\n\t\t\t\tfield1: {$data_ex['lock_login']}\n\t\t\t"); __error("비밀번호가 일치하지 않습니다 (" . ($data_ex['lock_login'] + 1) . "회 오류)"); } //// 암호화 // 자동 로그인 if ($data['autologin']) { $pass_after = ''; $key_login = md5($mini['date']); $autologin_after = md5("{$data_ex['pass']}|{$mini['ip']}|{$key_login}"); $interval = time() + 2592000; // 30 days after } else { $pass_after = md5("{$data_ex['pass']}|{$mini['ip']}"); $key_login = $autologin_after = ''; $interval = 0; } //// 굽기 // 세션 if ($mini['set']['use_login_session']) { $_SESSION['m_no'] = $data_ex['no']; $_SESSION['m_pass'] = $pass_after; } else { setcookie("m_no", $data_ex['no'], $interval, '/'); setcookie("m_pass", $pass_after, $interval, '/'); } // 자동로그인 if ($data['autologin']) { setcookie("m_no", $data_ex['no'], $interval, '/'); setcookie("m_autologin", $autologin_after, $interval, '/'); } else { setcookie("m_autologin", '', 0, '/'); } //// 로그인 기록 추가 def($mini['set']['login_history_count'], 10); $data_ex['history_login'] .= "{$mini['ip']}|{$mini['date']}\n"; $tmp = explode("\n", $data_ex['history_login']); if (count($tmp) > $mini['set']['login_history_count']) { unset($tmp[0]); } $data_ex['history_login'] = is_array($tmp) ? implode("\n", $tmp) : ""; //// 로그인 포인트 설정 if (!empty($site_data['point_login'])) { if (!sql("SELECT COUNT(*) FROM {$mini['name']['log']} WHERE mode='point' and target_member={$data_ex['no']} and field3='로그인' and date >= '" . date("Y/m/d 00:00:00", $mini['time']) . "'")) { setPoint("\n\t\t\t\t\ttarget: {$data_ex['no']}\n\t\t\t\t\tmsg: 로그인\n\t\t\t\t\tpoint: {$site_data['point_login']}\n\t\t\t\t"); } } //// 다중 자동로그인 설정 //+ 정식버젼에서 지울 구문임 if (!empty($data_ex['ip']) && strpos($data_ex['ip'], '[') === false) { $data_ex['ip'] = "[{$data_ex['ip']}]"; } if (!empty($data_ex['key_login']) && strpos($data_ex['key_login'], '[') === false) { $data_ex['key_login'] = "******"; } if (empty($key_login)) { $key_login = '******'; } // 입력 $data_ex['ip'] .= "[{$mini['ip']}]"; $data_ex['key_login'] .= "[{$key_login}]"; // 3개 한정 $arr_ip = getStr($data_ex['ip']); if (count($arr_ip) > 5) { unset($arr_ip[0]); $data_ex['ip'] = "[" . implode("][", $arr_ip) . "]"; } $arr_key_login = getStr($data_ex['key_login']); if (count($arr_key_login) > 5) { unset($arr_key_login[0]); $data_ex['key_login'] = "******" . implode("][", $arr_key_login) . "]"; } //// DB수정 sql("UPDATE {$mini['name']['member']} SET ip='{$data_ex['ip']}', date_login='******'date']}', key_login='******'key_login']}', lock_login=0, count_login=count_login+1, history_login='******'history_login']}' WHERE no={$data_ex['no']}"); }