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' => ''); }
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, ''); }
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' => ''); }
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' => '이메일로 아이디와 새로운 비밀번호를 전송했습니다'); }
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); }
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' => ''); }
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)); }
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' => ''); }