Exemple #1
0
/** 댓글 삭제
 * @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");
        }
    }
}
Exemple #2
0
/**
 * 로그인
 * @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']}");
}