Ejemplo n.º 1
0
function main()
{
    global $session;
    global $db_connect_info;
    global $http_user_name;
    global $http_user_email;
    if ($session->started()) {
        navigateTo(HREF_MAIN);
    }
    $http_user_name = trim($_POST['user-name']);
    $http_user_password = trim($_POST['user-password']);
    $http_user_password_re = trim($_POST['user-password-re']);
    $http_user_email = trim($_POST['user-email']);
    // 입력 값의 유효성을 검증한다.
    if (empty($http_user_name) || empty($http_user_password) || empty($http_user_email)) {
        return array('result' => true, 'message' => '');
    }
    if (strlen($http_user_name) < 2) {
        return array('result' => false, 'message' => '아이디는 3자 이상으로 입력해 주세요');
    }
    if (strlen($http_user_password) < 5) {
        return array('result' => false, 'message' => '비밀번호는 4자 이상으로 입력해 주세요');
    }
    if (strcmp($http_user_password, $http_user_password_re) != 0) {
        return array('result' => false, 'message' => '비밀번호와 비밀번호 확인이 일치하지 않습니다');
    }
    // 이메일 포멧의 유효성을 검증한다.
    if (!filter_var($http_user_email, FILTER_VALIDATE_EMAIL)) {
        return array('result' => false, 'message' => '올바르지 않은 이메일 주소입니다');
    }
    // reCAPTCHA를 검증한다.
    if (!getReCaptcha()) {
        return array('result' => false, 'message' => 'reCAPTCHA가 올바르게 입력되지 않았습니다');
    }
    $db = new YwDatabase($db_connect_info);
    // 데이터베이스 연결을 체크한다.
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    // 아이디와 이메일 유효성을 검증한다.
    if (!$db->query("SELECT `name` FROM " . USER_TABLE . " WHERE `name`='" . $db->purify($http_user_name) . "' OR `email`='" . $db->purify($http_user_email) . "';")) {
        return array('result' => false, 'message' => '유저 정보를 불러오는데 실패하였습니다');
    }
    if ($db->total_results() > 0) {
        $result = $db->get_result();
        if (strcmp($http_user_name, $result['name']) == 0) {
            return array('result' => false, 'message' => '이미 사용중인 아이디입니다');
        } else {
            return array('result' => false, 'message' => '이미 사용중인 이메일 주소입니다');
        }
    }
    // 서버로 데이터를 전송한다.
    if (!$db->query("INSERT INTO " . USER_TABLE . " (`name`, `password`, `email`) VALUES ('" . $db->purify($http_user_name) . "', '" . passwordHash($http_user_password) . "', '" . $db->purify($http_user_email) . "');")) {
        return array('result' => false, 'message' => '계정을 생성하는데 실패했습니다');
    }
    $db->log($http_user_name, LOG_SIGNUP, '1');
    $db->close();
    navigateTo(HREF_SIGNIN . '?signup=1');
    return array('result' => true, 'message' => '');
}
Ejemplo n.º 2
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_article_title = trim(strip_tags(empty($_POST['article-title']) ? '' : $_POST['article-title']));
    if (!$session->started()) {
        navigateTo(HREF_SIGNIN . '?redirect=' . HREF_CREATE . '?t=' . $http_article_title);
    }
    if (strlen(preg_replace('/\\s+/', '', $http_article_title)) < 2) {
        return array('result' => true, 'message' => '');
    }
    if (is_numeric($http_article_title)) {
        return array('result' => false, 'message' => '지식 제목으로 숫자를 사용할 수 없습니다');
    }
    $db = new YwDatabase($db_connect_info);
    if (!$db->connect()) {
        return array('result' => false, 'title' => $http_article_title, 'message' => '서버와의 연결에 실패했습니다');
    }
    if (!$db->query("SELECT 1 FROM " . ARTICLE_TABLE . " WHERE `title`='" . $http_article_title . "';")) {
        return array('result' => false, 'title' => $http_article_title, 'message' => '지식 정보를 조회하는데 실패했습니다');
    }
    if ($db->total_results() > 0) {
        return array('result' => false, 'title' => $http_article_title, 'message' => '이미 존재하는 지식입니다');
    }
    // 지식 등록
    if (!$db->query("INSERT INTO " . ARTICLE_TABLE . " (`title`) VALUES ('" . $db->purify($http_article_title) . "');")) {
        return array('result' => false, 'title' => $http_article_title, 'message' => '지식을 추가하는 중 서버 오류가 발생했습니다');
    }
    $db->log($session->name, LOG_CREATE, $http_article_title);
    $db->close();
    navigateTo(HREF_WRITE . '/' . $http_article_title);
    return array('result' => true, 'title' => $http_article_title, '');
}
Ejemplo n.º 3
0
function main()
{
    $http_query = trim(empty($_GET['q']) ? $_POST['q'] : $_GET['q']);
    $http_page = intval(empty($_GET['p']) ? '0' : $_GET['p']);
    if (empty($http_query)) {
        return array('result' => false, 'message' => '검색어가 없습니다');
    }
    // 검색 모드
    $tag_search_mode = strlen($http_query) > 1 && strcmp($http_query[0], "@") == 0;
    if ($tag_search_mode) {
        $http_query = substr($http_query, 1);
    }
    // 쿼리 유효성 검증
    $http_query = preg_replace('/\\s+/', ' ', $http_query);
    if (strlen($http_query) < 1) {
        return array('result' => false, 'message' => '검색어가 없습니다');
    }
    // 검색 쿼리 취득
    $keywords = explode(' ', $http_query);
    $query = $tag_search_mode ? getTagSearchQuery($keywords) : getContentSearchQuery($keywords);
    global $db_connect_info;
    $db = new YwDatabase($db_connect_info);
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    // 정확히 제목이 일치하는 항목이 있으면 바로 이동
    if (count($keywords) == 1) {
        if (!$db->query("SELECT 1 FROM " . ARTICLE_TABLE . " WHERE `title`='" . $keywords[0] . "';")) {
            return array('result' => false, 'message' => '검색 결과를 가져오는데 실패했습니다' . ("SELECT 1 FROM " . ARTICLE_TABLE . " WHERE `title`='" . $keywords[0] . "';"));
        }
        if ($db->total_results() > 0) {
            navigateTo(HREF_READ . '/' . $keywords[0]);
        }
    }
    $start_time = microtime(true);
    // 전체 검색 결과를 얻기 위해 먼저 서치
    if (!$db->query($query)) {
        return array('result' => false, 'message' => '검색 결과를 가져오는데 실패했습니다2');
    }
    $elapsed_time = round(microtime(true) - $start_time, 5);
    $total_articles = $db->total_results();
    // 현재 페이지 결과 가져오기
    $query .= " LIMIT " . $http_page * MAX_ARTICLES . ", " . MAX_ARTICLES . ";";
    if (!$db->query($query)) {
        return array('result' => false, 'message' => '검색 결과를 가져오는데 실패했습니다3');
    }
    $search_result = array();
    while ($result = $db->get_result()) {
        array_push($search_result, $result);
    }
    return array('result' => true, 'search_result' => $search_result, 'keywords' => $keywords, 'total_results' => $total_articles, 'elapsed_time' => $elapsed_time);
}
Ejemplo n.º 4
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_article_title = trim($_GET['t']);
    $http_article_id = trim($_GET['i']);
    $http_no_redirect = isset($_GET['no-redirect']);
    $read_by_id = !empty($http_article_id);
    if (empty($http_article_title) && empty($http_article_id)) {
        return array('result' => false, 'message' => '');
    }
    $db = new YwDatabase($db_connect_info);
    // 데이터베이스 연결을 체크합니다.
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    if ($read_by_id) {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `id`='{$http_article_id}' LIMIT 1;";
    } else {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `title`='{$http_article_title}' LIMIT 1;";
    }
    if (!$db->query($query)) {
        return array('result' => false, 'message' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        if (!$read_by_id) {
            navigateTo(HREF_SUGGEST . '?t=' . $http_article_title);
        }
        return array('result' => false, 'message' => '존재하지 않는 지식입니다');
    }
    $article = $db->get_result();
    $article_id = intval($result['id']);
    $article_title = $result['title'];
    $article_content = $result['content'];
    $article_tags = $result['tags'];
    $article_hits = $result['hits'];
    // 리다이렉트 문서인지 체크
    $stripped_content = trim(strip_tags($article['content']));
    if (!$http_no_redirect && startsWith($stripped_content, REDIRECT_KEYWORD)) {
        navigateTo(HREF_READ . '/' . trim(explode(' ', $stripped_content)[1]) . '?from=' . $article['title']);
    }
    // 조회수 증가
    if ($session->visit(intval($article['id']))) {
        $db->query("UPDATE " . ARTICLE_TABLE . " SET `hits`=`hits`+1, `today_hits`=`today_hits`+1 WHERE `id`='" . $article['id'] . "';");
    }
    $db->close();
    return array('result' => true, 'article' => $article, 'message' => '');
}
Ejemplo n.º 5
0
function main()
{
    global $session;
    global $db_connect_info;
    global $http_user_email;
    if ($session->started()) {
        navigateTo(HREF_MAIN);
    }
    $http_user_email = trim($_POST['user-email']);
    // 입력 값의 유효성을 검증한다.
    if (empty($http_user_email)) {
        return array('result' => true, 'message' => '');
    }
    // 이메일 포멧의 유효성을 검증한다.
    if (!filter_var($http_user_email, FILTER_VALIDATE_EMAIL)) {
        return array('result' => false, 'message' => '이메일 주소가 올바르지 않습니다');
    }
    // reCAPTCHA를 검증한다.
    if (!getReCaptcha()) {
        return array('result' => false, 'message' => 'reCAPTCHA가 올바르게 입력되지 않았습니다');
    }
    $db = new YwDatabase($db_connect_info);
    // 데이터베이스 연결을 체크한다.
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    // 아이디와 이메일 유효성을 검증한다.
    if (!$db->query("SELECT `name` FROM " . USER_TABLE . " WHERE `email`='" . $db->purify($http_user_email) . "';")) {
        return array('result' => false, 'message' => '이메일 주소를 조회하는데 실패했습니다');
    }
    if ($db->total_results() < 1) {
        return array('result' => false, 'message' => '존재하지 않는 이메일 주소입니다');
    }
    $result = $db->get_result();
    $user_name = $result['name'];
    // 새로운 비밀번호를 생성한다.
    $generated_password = bin2hex(openssl_random_pseudo_bytes(6));
    if (!$db->query("UPDATE " . USER_TABLE . " SET `password`='" . passwordHash($generated_password) . "' WHERE `email`='" . $db->purify($http_user_email) . "';")) {
        return array('result' => false, 'message' => '비밀번호를 업데이트하는데 실패했습니다');
    }
    $email_content = "<b>" . $user_name . "</b> 회원님의 새 비밀번호는 <b>" . $generated_password . "</b>입니다.";
    if (!getMailer($http_user_email, "연세위키 비밀번호를 알려드립니다", $email_content)) {
        return array('result' => false, 'message' => '이메일 발송에 실패했습니다');
    }
    $db->log($user_name, LOG_RESET, '1');
    $db->close();
    return array('result' => true, 'message' => '이메일로 아이디와 새로운 비밀번호를 전송했습니다');
}
Ejemplo n.º 6
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_article_title = trim($_GET['t']);
    $http_article_id = trim($_GET['i']);
    $http_revisions_page = intval(isset($_GET['p']) ? $_GET['p'] : '0');
    $read_by_id = !empty($http_article_id);
    if (empty($http_article_title) && empty($http_article_id)) {
        return array('result' => false, '');
    }
    $db = new YwDatabase($db_connect_info);
    if (!$db->connect()) {
        return array('result' => false, '서버와의 연결에 실패했습니다');
    }
    if ($read_by_id) {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `id`='{$http_article_id}' LIMIT 1;";
    } else {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `title`='{$http_article_title}' LIMIT 1;";
    }
    if (!$db->query($query)) {
        return array('result' => false, '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        if (!$read_by_id) {
            navigateTo(HREF_SUGGEST . '?t=' . $http_article_title);
        }
        return array('result' => false, '존재하지 않는 지식입니다');
    }
    $article = $db->get_result();
    if (!$db->query("SELECT * FROM " . REVISION_TABLE . " WHERE `article_id`=" . $article['id'] . " ORDER BY `timestamp` DESC LIMIT " . $http_revisions_page * MAX_REVISIONS . "," . MAX_REVISIONS . ";")) {
        return array('result' => false, 'page' => $http_revisions_page, '지식의 역사를 불러오는데 실패했습니다');
    }
    $article['revisions'] = array();
    while ($result = $db->get_result()) {
        array_push($article['revisions'], $result);
    }
    return array('result' => true, 'page' => $http_revisions_page, 'article' => $article, '');
}
Ejemplo n.º 7
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_user_name = trim(strip_tags($_POST['user-name']));
    $http_user_password = trim($_POST['user-password']);
    $http_redirect = empty($_POST['redirect']) ? HREF_MAIN : $_POST['redirect'];
    if ($session->started()) {
        navigateTo(HREF_MAIN);
    }
    if (empty($http_user_name) || empty($http_user_password)) {
        return array('result' => true, 'message' => '');
    }
    $db = new YwDatabase($db_connect_info);
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    // 아이디가 유효한지 확인합니다.
    if (!$db->query("SELECT * FROM " . USER_TABLE . " WHERE `name`='" . $db->purify($http_user_name) . "';")) {
        return array('result' => false, 'message' => '유저 정보를 불러오는데 실패했습니다');
    }
    if ($db->total_results() < 1) {
        return array('result' => false, 'message' => '존재하지 않는 아이디입니다');
    }
    $result = $db->get_result();
    // 비밀번호가 일치하는지 확인합니다.
    if (strcmp(passwordHash($http_user_password), $result['password']) != 0) {
        $db->log($session->ip, LOG_SIGNIN, '0');
        return array('result' => false, 'message' => '비밀번호가 올바르지 않습니다');
    }
    // 세션 등록
    $session->start($result['name'], $result['id'], intval($result['permission']));
    $db->log($session->name, LOG_SIGNIN, '1');
    $db->close();
    navigateTo($http_redirect);
    return array('result' => true, 'message' => '');
}
Ejemplo n.º 8
0
function main()
{
    global $session;
    global $db_connect_info;
    global $page_focus;
    $http_user_email = trim($_POST['user-email']);
    $http_user_password = $_POST['user-password'];
    $http_user_new_password = $_POST['user-new-password'];
    $http_user_new_password_re = $_POST['user-new-password-re'];
    $http_student_id = trim($_POST['student-id']);
    $http_student_password = $_POST['student-password'];
    $http_user_password_drop = $_POST['user-drop-password'];
    // 0: 계정 정보, 1: 재학생 인증, 2: 이메일 변경, 4: 비번 변경, 4: 계정 삭제
    $page_focus = 0;
    if (!$session->started()) {
        navigateTo(HREF_MAIN);
    }
    $db = new YwDatabase($db_connect_info);
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    // 유저 정보 불러오기
    if (!$db->query("SELECT * FROM " . USER_TABLE . " WHERE `id`=" . $session->id . ";")) {
        return array('result' => false, 'message' => '유저 정보를 불러오는데 실패했습니다');
    }
    $user = $db->get_result();
    $user['login_history'] = array();
    // 최근 3일간 로그인 기록 가져오기
    if (!$db->query("SELECT * FROM " . LOG_TABLE . " WHERE `user_name`='" . $user['name'] . "' AND `behavior`='signin' AND `timestamp` >= (CURDATE() - INTERVAL 3 DAY) " . "ORDER BY `timestamp` DESC LIMIT 30;")) {
        return array('result' => false, 'user' => $user, 'message' => '최근 로그인 기록을 로드하는데 실패했습니다');
    }
    while ($result = $db->get_result()) {
        array_push($user['login_history'], $result);
    }
    if (!empty($http_student_id)) {
        $page_focus = 1;
        // 중복 학번 검사
        if (!$db->query("SELECT 1 FROM " . USER_TABLE . " WHERE `code`='" . $db->purify($http_student_id) . "';")) {
            return array('result' => false, 'user' => $user, 'message' => '학번을 조회하지 못했습니다');
        }
        if ($db->total_results() > 0) {
            return array('result' => false, 'user' => $user, 'message' => '이미 인증에 사용된 연세포탈 계정입니다');
        }
        // 포탈 로그인 인증
        if (!getYonseiAuth($http_student_id, $http_student_password)) {
            return array('result' => false, 'message' => '학번이나 비밀번호가 올바르지 않습니다');
        }
        if (!$db->query("UPDATE " . USER_TABLE . " SET `code`='" . $http_student_id . "'" . (intval($user['permission']) < 1 ? ", `permission`=1" : "") . " WHERE `id`=" . $user['id'] . ";")) {
            return array('result' => false, 'message' => '서버 오류로 인증을 완료하지 못했습니다');
        }
        if ($user_permission < 1) {
            $session->setPermission(1);
        }
        $db->log($session->name, LOG_STUDENT_AUTH, $http_student_id);
        navigateTo(HREF_DASHBOARD . '?auth=1');
        return array('result' => true, 'user' => $user, 'message' => '재학생 인증을 완료했습니다');
    }
    // 이메일 변경
    if (!empty($http_user_email)) {
        $page_focus = 2;
        if (!filter_var($http_user_email, FILTER_VALIDATE_EMAIL)) {
            return array('result' => false, 'user' => $user, 'message' => '이메일 주소가 올바르지 않습니다');
        }
        if (strcmp($user['email'], $http_user_email) == 0) {
            return array('result' => false, 'user' => $user, 'message' => '동일한 이메일 주소가 입력되었습니다');
        }
        if (!$db->query("SELECT 1 FROM " . USER_TABLE . " WHERE `email`='" . $db->purify($http_user_email) . "';")) {
            return array('result' => false, 'user' => $user, 'message' => '이메일 주소 조회에 실패했습니다');
        }
        if ($db->total_results() > 0) {
            return array('result' => false, 'user' => $user, 'message' => '이미 사용중인 이메일 주소입니다');
        }
        if (!$db->query("UPDATE " . USER_TABLE . " SET `email`='" . $db->purify($http_user_email) . "' WHERE `id`=" . $user['id'] . ";")) {
            return array('result' => false, 'user' => $user, 'message' => '이메일 주소 변경에 실패하였습니다');
        }
        $db->log($session->name, LOG_CHANGE_EMAIL, $user['email']);
        $user['email'] = $http_user_email;
        return array('result' => true, 'user' => $user, 'message' => '이메일 주소를 변경하였습니다');
    }
    // 비밀번호 변경
    if (!empty($http_user_new_password)) {
        $page_focus = 3;
        if (strcmp($http_user_new_password, $http_user_new_password_re) != 0) {
            return array('result' => false, 'user' => $user, 'message' => '비밀번호와 비밀번호 확인이 일치하지 않습니다');
        }
        if (strlen($http_user_new_password) < 4) {
            return array('result' => false, 'user' => $user, 'message' => '비밀번호는 4자 이상으로 입력해 주세요');
        }
        $http_user_password = passwordHash($http_user_password);
        $http_user_new_password = passwordHash($http_user_new_password);
        if (strcmp($user['password'], $http_user_password) != 0) {
            return array('result' => false, 'user' => $user, 'message' => '현재 비밀번호가 올바르지 않습니다');
        }
        if (!$db->query("UPDATE " . USER_TABLE . " SET `password`='" . $http_user_new_password . "' WHERE `id`=" . $user['id'] . ";")) {
            return array('result' => false, 'user' => $user, 'message' => '서버 오류로 비밀번호를 변경하지 못했습니다');
        }
        $db->log($session->name, LOG_CHANGE_PASSWORD, $user['password']);
        return array('result' => true, 'user' => $user, 'message' => '비밀번호를 변경하였습니다.');
    }
    // 계정 삭제
    if (!empty($http_user_password_drop)) {
        $page_focus = 4;
        if (strcmp($user['password'], passwordHash($http_user_password_drop)) != 0) {
            return array('result' => false, 'user' => $user, 'message' => '비밀번호가 올바르지 않습니다');
        }
        if (!$db->query("DELETE FROM " . USER_TABLE . " WHERE `id`=" . $user['id'] . ";")) {
            return array('result' => false, 'user' => $user, 'message' => '서버 오류로 계정을 삭제하지 못했습니다');
        }
        $db->log($session->name, LOG_DELETE_ACCOUNT, '');
        navigateTo(HREF_SIGNOUT);
        return array('result' => true, 'user' => $user, 'message' => '');
    }
    return array('result' => true, 'user' => $user);
}
Ejemplo n.º 9
0
<?php

/**
 * YaongWiki Engine
 *
 * @version 1.1
 * @author HyunJun Kim
 * @date 2016. 01. 31
 */
require_once 'common.php';
if (empty($_GET["t"])) {
    navigateTo(HREF_404);
}
$title = $_GET["t"];
$page_title = $title;
$page_location = HREF_SUGGEST . '?t=' . $title;
include 'frame.header.php';
?>

<div class="container">
  <h1><?php 
echo '<a style="text-decoration: none;" href="' . $page_location . '">' . $title . '</a>';
?>
</h1>
  <br/>
  <hr/>
  <blockquote>
        <p>이 항목은 지금 존재하지 않습니다. 여기에 당신의 <a href="<?php 
echo HREF_CREATE . '?t=' . $title;
?>
">지식을 공유해</a> 주세요.</p>
Ejemplo n.º 10
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_revision_id = trim($_GET['i']);
    $http_revision_target_id = trim($_GET['j']);
    $http_pure = !empty($_GET['pure']);
    $http_rollback = !empty($_GET['rollback']);
    $orginal_target = intval($http_revision_target_id) == 0;
    if (empty($http_revision_id) || !isset($http_revision_target_id)) {
        return array('result' => false, 'message' => '');
    }
    $db = new YwDatabase($db_connect_info);
    // 데이터베이스 연결을 체크합니다.
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    if (!$db->query("SELECT * FROM " . REVISION_TABLE . " WHERE `id`='" . $http_revision_id . "' LIMIT 1;")) {
        return array('result' => false, 'message' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        return array('result' => false, 'message' => '존재하지 않는 지식입니다');
    }
    $original = $db->get_result();
    if (!$db->query("SELECT * FROM " . ARTICLE_TABLE . " WHERE `id`='" . $original['article_id'] . "' LIMIT 1;")) {
        return array('result' => false, 'message' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($http_rollback) {
        $article = $db->get_result();
        if (!$session->started()) {
            return array('result' => false, 'message' => '로그인한 사용자만 되돌릴 수 있습니다.');
        }
        if ($session->permission < intval($article['permission'])) {
            return array('result' => false, 'message' => '되돌리기 위한 권한이 부족합니다');
        }
        if (!$db->query("UPDATE " . ARTICLE_TABLE . " SET " . "`content`='" . $original['snapshot_content'] . "', " . "`title`='" . $original['article_title'] . "', " . "`tags`='" . $original['snapshot_tags'] . "' " . "WHERE `id`='" . $original['article_id'] . "';")) {
            return array('result' => false, 'message' => '되돌리기에 실패했습니다');
        }
        if (!$db->query("SELECT `revision` FROM " . REVISION_TABLE . " WHERE `article_id`='" . $original['article_id'] . "' ORDER BY `timestamp` DESC LIMIT 1;")) {
            return array('result' => false, 'message' => '되돌리기에 실패했습니다');
        }
        if ($db->total_results() < 1) {
            $article_recent_revision_number = 0;
        } else {
            $result = $db->get_result();
            $article_recent_revision_number = intval($result['revision']);
        }
        if (!$db->query("INSERT INTO " . REVISION_TABLE . " (`article_id`, `article_title`, `revision`, `user_name`, `snapshot_content`, `snapshot_tags`, `fluctuation`, `comment`) " . "VALUES (" . "'" . $article['id'] . "', " . "'" . $article['title'] . "', " . "'" . ($article_recent_revision_number + 1) . "', " . "'" . $session->name . "', " . "'" . $article['content'] . "', " . "'" . $article['tags'] . "', " . (strlen($original['snapshot_content']) - strlen($article['content'])) . ", " . "'" . $original['revision'] . "에서 복구함');")) {
            return array('result' => false, 'message' => '되돌리기에 실패했습니다');
        }
        // 되돌리기 성공
        navigateTo(HREF_READ . '/' . $article['id']);
        return array('result' => true);
    }
    // j값이 0일 경우 원본을 비교 대상으로 지정한다.
    if ($orginal_target) {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `id`='" . $original['article_id'] . "' LIMIT 1;";
    } else {
        $query = "SELECT * FROM " . REVISION_TABLE . " WHERE `id`='" . $http_revision_target_id . "' LIMIT 1;";
    }
    if (!$db->query($query)) {
        return array('result' => false, 'message' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        return array('result' => false, 'message' => '존재하지 않는 지식입니다');
    }
    if ($orginal_target) {
        $result = $db->get_result();
        $revision['id'] = 0;
        $revision['article_title'] = $result['title'];
        $revision['revision'] = '현재';
        $revision['snapshot_content'] = $result['content'];
        $revision['snapshot_tags'] = $result['tags'];
        $revision['timestamp'] = $result['timestamp'];
    } else {
        $revision = $db->get_result();
    }
    $db->close();
    return array('result' => true, 'original' => $original, 'revision' => $revision, 'original_json' => json_encode($original), 'revision_json' => json_encode($revision));
}
Ejemplo n.º 11
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_article_title = trim(!empty($_POST['article-title']) ? $_POST['article-title'] : $_GET['t']);
    $http_article_id = trim(!empty($_POST['article-id']) ? $_POST['article-id'] : $_GET['i']);
    $http_article_new_title = strip_tags(trim($_POST['article-new-title']));
    $http_article_content = $_POST['article-content'];
    $http_article_tags = preg_replace('!\\s+!', ' ', strip_tags($_POST['article-tags']));
    $http_article_delete = isset($_POST['article-delete']);
    $http_article_change_permission = isset($_POST['article-permission']);
    $http_article_permission = abs(intval($_POST['article-permission']));
    $http_article_comment = strip_tags($_POST['article-comment']);
    $read_by_id = !empty($http_article_id);
    // 파라미터가 충분하지 않음
    if (empty($http_article_title) && empty($http_article_id)) {
        navigateTo(HREF_MAIN);
    }
    // 로그인 되어있지 않을 경우 로그인 유도
    if (!$session->started()) {
        navigateTo(HREF_SIGNIN . '?redirect=' . HREF_WRITE . '/' . ($read_by_id ? $http_article_id : $http_article_title));
    }
    $db = new YwDatabase($db_connect_info);
    if (!$db->connect()) {
        return array('result' => false, 'message' => '서버와의 연결에 실패했습니다');
    }
    if ($read_by_id) {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `id`='{$http_article_id}' LIMIT 1;";
    } else {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `title`='{$http_article_title}' LIMIT 1;";
    }
    if (!$db->query($query)) {
        return array('result' => false, 'message' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        if (!$read_by_id) {
            navigateTo(HREF_SUGGEST . '?t=' . $http_article_title);
        }
        return array('result' => false, 'message' => '존재하지 않는 지식입니다');
    }
    $article = $db->get_result();
    $article_old = $article;
    // 편집 권한 검사
    if (intval($article['permission']) > $session->permission) {
        return array('result' => false, 'article' => $article, 'message' => '이 지식을 편집하기 위한 권한이 부족합니다');
    }
    // 별다른 편집 문자열이 들어오지 않았으면 편집 모드로 들어간다.
    if (empty($http_article_content)) {
        return array('result' => true, 'article' => $article, 'message' => '');
    }
    // 게시글 삭제 명령
    if ($http_article_delete) {
        if (!$db->query("DELETE FROM " . ARTICLE_TABLE . " WHERE `id`='" . $article['id'] . "';")) {
            return array('result' => false, 'message' => '게시글 삭제에 실패했습니다');
        }
        if (DELETE_REVISIONS) {
            $db->query("DELETE FROM " . REVISION_TABLE . " WHERE `article_id`='" . $article['id'] . "';");
        }
        navigateTo(HREF_READ . '/' . $article['title']);
    }
    // 글 내용 필터링
    if ($session->permission < PERMISSION_NO_FILTERING) {
        $http_article_content = getHtmlPurifier($http_article_content);
    }
    $article['content'] = $http_article_content;
    $article['tags'] = $http_article_tags;
    $query = "UPDATE " . ARTICLE_TABLE . " SET ";
    // 타이틀 유효성 검사
    if (!empty($http_article_new_title) && strcmp($http_article_new_title, $article['title']) != 0) {
        if (strlen(preg_replace('/\\s+/', '', $http_article_new_title)) < 2) {
            return array('result' => false, 'article' => $article, 'message' => '제목은 최소 두 글자 이상이어야 합니다');
        }
        if (is_numeric($http_article_new_title)) {
            return array('result' => false, 'article' => $article, 'message' => '지식 제목으로 숫자를 사용할 수 없습니다');
        }
        if (!$db->query("SELECT 1 FROM " . ARTICLE_TABLE . " WHERE `title`='" . $db->purify($http_article_new_title) . "';")) {
            return array('result' => false, 'article' => $article, 'message' => '지식 제목을 검증하는데 서버 오류가 발생했습니다');
        }
        if ($db->total_results() > 0) {
            return array('result' => false, 'article' => $article, 'message' => '이미 존재하는 지식 제목입니다');
        }
        $article['title'] = $http_article_new_title;
        $query .= "`title`='" . $db->purify($http_article_new_title) . "', ";
    }
    // 퍼미션 유효성 검사
    if ($http_article_change_permission) {
        if ($http_article_permission > $session->permission) {
            return array('result' => false, 'article' => $article, 'message' => '자신의 권한보다 지식 수정 권한을 크게 설정할 수 없습니다');
        }
        $article['permission'] = $http_article_permission;
        $query .= "`permission`='" . $http_article_permission . "', ";
    }
    // 태그. 중간 공백을 하나로 설정한다.
    $query .= "`tags`='" . $db->purify($http_article_tags) . "', ";
    $query .= "`content`='" . $db->purify($http_article_content) . "' ";
    $query .= "WHERE `id`='" . $article['id'] . "';";
    if (!$db->query($query)) {
        return array('result' => false, 'article' => $article, 'message' => '지식 업데이트 중 서버 오류가 발생했습니다');
    }
    // 가장 최근의 revision 레코드 넘버를 가져온다.
    if (!$db->query("SELECT `revision` FROM " . REVISION_TABLE . " WHERE `article_id`='" . $article['id'] . "' ORDER BY `timestamp` DESC LIMIT 1;")) {
        return array('result' => false, 'article' => $article, 'message' => '수정 기록을 불러오던 중 서버 오류가 발생했습니다');
    }
    $result = $db->get_result();
    if ($db->total_results() < 1) {
        $article_recent_revision_number = 0;
    } else {
        $article_recent_revision_number = intval($result['revision']);
    }
    if (!$db->query("INSERT INTO " . REVISION_TABLE . " (`article_id`, `article_title`, `revision`," . " `user_name`, `snapshot_content`, `snapshot_tags`, `fluctuation`, `comment`) VALUES ('" . $article_old['id'] . "', '" . $db->purify($article_old['title']) . "', " . ($article_recent_revision_number + 1) . ", '" . $session->name . "', '" . $db->purify($article_old['content']) . "', '" . $db->purify($article_old['tags']) . "', " . (strlen($http_article_content) - strlen($article_old['content'])) . ", '" . $db->purify($http_article_comment) . "');")) {
        return array('result' => false, 'message' => "수정 기록을 추가하던 중 서버 오류가 발생했습니다");
    }
    $db->log($session->name, LOG_WRITE, $article['id'] . '/' . ($article_recent_revision_number + 1));
    $db->close();
    navigateTo(HREF_READ . '/' . $article['title'] . '?update=1');
    return array('result' => true, 'article' => $article, 'message' => '');
}