Пример #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' => '');
}
Пример #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, '');
}
Пример #3
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' => '');
}
Пример #4
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' => '이메일로 아이디와 새로운 비밀번호를 전송했습니다');
}
Пример #5
0
function main()
{
    global $session;
    global $db_connect_info;
    $http_revision_id = trim($_GET['i']);
    $http_revision_target_id = trim($_GET['j']);
    $orginal_target = intval($http_revision_target_id) == 0;
    if (empty($http_revision_id) || empty($http_revision_target_id)) {
        return array('result' => false);
    }
    $db = new YwDatabase($db_connect_info);
    // 데이터베이스 연결을 체크합니다.
    if (!$db->connect()) {
        return array('result' => '서버와의 연결에 실패했습니다');
    }
    if (!$db->query("SELECT * FROM " . REVISION_TABLE . " WHERE `id`='" . $http_revision_id . "' LIMIT 1;")) {
        return array('result' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        return array('result' => '존재하지 않는 지식입니다');
    }
    $original = $db->get_result();
    // j값이 0일 경우 원본을 비교 대상으로 지정한다.
    if ($orginal_target) {
        $query = "SELECT * FROM " . ARTICLE_TABLE . " WHERE `id`='" . $revision['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' => '글을 읽어오던 중 서버 에러가 발생했습니다');
    }
    if ($db->total_results() < 1) {
        return array('result' => '존재하지 않는 지식입니다');
    }
    if ($orginal_target) {
        $result = $db->get_result();
        $revision['id'] = 0;
        $revision['article_title'] = $result['title'];
        $revision['snapshot_content'] = $result['content'];
        $revision['snapshot_tags'] = $result['tags'];
        $revision['timestamp'] = $result['timestamp'];
    } else {
        $revision = $db->get_result();
    }
    $db->close();
    return array('original' => $original, 'revision' => $revision);
}
Пример #6
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' => '');
}
Пример #7
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));
}
Пример #8
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' => '');
}