/** 외부로그인 * @class io * @param -skin: 로그인되어 있을 떄 스킨 -skin_not: 로그인이 되어있지 않을 때 스킨 -id: 스킨 적용할 게시판 번호 or 아이디 -group: 스킨 적용할 그룹 번호 -skip_style: 기본 스타일 로드를 스킵할지 선택 합니다. * @return Array 스킨이 있을 경우엔 리턴 안됨 */ function outlogin($param) { global $mini; $param = param($param); $skin = ''; // 없을 경우 기본 그룹으로 지정 if (empty($param['id']) && empty($param['group'])) { $param['group'] = 1; } $q = ''; if (!empty($param['id'])) { $q = "id={$param['id']}"; $data_board = getBoard($param['id'], 1); $data_site = getSite($data_board['site'], 1); } if (!empty($param['group'])) { $q = "group={$param['group']}"; $data_site = getSite($param['group'], 1); } // 로그인 되어 있을 떄 if (!empty($mini['log'])) { $val =& $mini['member']; $val = array_merge($val, array('url_logout' => "{$mini['dir']}login.php?mode=logout&url=" . url(), 'url_myinfo' => "{$mini['dir']}member.php?mode=modify&no={$mini['member']['no']}&{$q}&url=" . url(), 'url_mymenu' => "{$mini['dir']}mymenu.php?mode=memo&no={$mini['member']['no']}&{$q}&url=" . url(), 'url_admin' => "{$mini['dir']}admin/", 'js_back' => "onclick='history.back();'", 'js_back2' => "onclick='history.go(-2);'", 'is_admin' => !empty($mini['member']['level_admin']), 'is_god' => !empty($mini['member']['level_admin']) && $mini['member']['level_admin'] == 4, 'date' => $mini['date'], 'ip' => $mini['ip'])); if (!empty($val['url_myinfo'])) { $val['pop_myinfo'] = "iiPopup.init({ url: \"{$val['url_myinfo']}\", width:iiSize[\"myinfo\"][0], height:iiSize[\"myinfo\"][1], close: true });"; } if (!empty($val['url_mymenu'])) { $val['pop_mymenu'] = "iiPopup.init({ url: \"{$val['url_mymenu']}\", width:iiSize[\"mymenu\"][0], height:iiSize[\"mymenu\"][1] });"; } if (!empty($param['skin'])) { $skin = $param['skin']; } } else { $val = array('form_start' => "\n\t\t\t\t<form id='form_login' name='form_login' action='{$mini['dir']}login.php?url=" . url() . "' method='post'>\n\t\t\t\t<input type='hidden' name='mode' value='login' />\n\t\t\t", 'form_end' => "</form>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/mootools.js'></script>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/ii.js'></script>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/ii.form.js'></script>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/size.js'></script>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/md5.js'></script>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/sha1.js'></script>\n\t\t\t\t<script type='text/javascript'>\n\t\t\t\t//<![CDATA[\n\t\t\t\t\tvar miniDir = '{$mini['dir']}';\n\t\t\t\t\tvar secure_pass = '******'secure_pass']}';\n\t\t\t\t\tvar ip = '{$mini['ip']}';\n\t\t\t\t\tvar session_id = Cookie.get('" . ini_get('session.name') . "');\n\n\n//\t\t\t\t\tvar form_outlogin = \$('outlogin');\n//\t\t\t\t\tform_outlogin.submitAction = function () {\n//\t\t\t\t\t\terror(\"랄라\");\n//\t\t\t\t\t\treturn false;\n//\t\t\t\t\t};\n//\t\t\t\t\tform_outlogin.setForm();\n\t\t\t\t//]]>\n\t\t\t\t</script>\n\t\t\t\t<script type='text/javascript' src='{$mini['dir']}js/mini.login.js'></script>\n\t\t\t", 'form_autologin' => "<input type='checkbox' name='autologin' value='1' id='outlogin_autologin' />", 'url_login' => "{$mini['dir']}login.php?{$q}&url=" . url(), 'url_join' => "{$mini['dir']}member.php?{$q}&url=" . url(), 'url_find' => "{$mini['dir']}login.find.php?{$q}&url=" . url(), 'date' => $mini['date'], 'ip' => $mini['ip']); if (!empty($val['url_find'])) { $val['pop_find'] = "iiPopup.init({ url: \"{$val['url_find']}\", width:iiSize[\"find\"][0], height:iiSize[\"find\"][1] });"; } $val['pop_login'] = "******"{$val['url_login']}\", width:iiSize[\"login\"][0], height:iiSize[\"login\"][1] });"; $val['pop_join'] = "iiPopup.init({ url: \"{$val['url_join']}\", width:iiSize[\"join\"][0], height:iiSize[\"join\"][1], close: true });"; if (!empty($param['skin_not'])) { $skin = $param['skin_not']; } } urlToLink($val); // 변환 if (!empty($skin)) { $preg_left = $preg_right = array(); $preg_left[] = "/\\[:([a-z0-9_]+)\\.([a-z0-9_]+)\\.([a-z0-9_]+):\\]/ie"; $preg_right[] = "\$val['\\1']['\\2']['\\3']"; $preg_left[] = "/\\[:([a-z0-9_]+)\\.([a-z0-9_]+):\\]/ie"; $preg_right[] = "\$val['\\1']['\\2']"; $preg_left[] = "/\\[:([a-z0-9_]+):\\]/ie"; $preg_right[] = "\$val['\\1']"; $skin = preg_replace($preg_left, $preg_right, $skin); echo $skin; } else { return $val; } }
/** 최근게시물 * @class io * @param -id: 게시판아이디 -table: 임의지정테이블 -mode: 최근게시물모드 [!|issue|writer|relate|popup|memo] -order: 임의정렬쿼리 -where: 임의검색쿼리 -count: 출력수 -cut_title: 제목길이 -cut_ment: 내용길이 -skin: 게시물 스킨 -skin_not: 게시물이 없을 떄 스킨 -skin_first: 첫 게시물 스킨 -debug: debug모드 -is_key: 키테이블 사용여부 -type: 종류 [post!|cmt|memo|member] * @return Array 스킨이 있을 경우엔 리턴 안됨 */ function mhot($param) { global $mini; $param = param($param); def($param['cut_title'], 0); def($param['cut_ment'], 0); def($param['count'], 5); def($param['type'], 'post'); // 설정 기본값 def($mini['setting']['issue_interval'], 48); if (preg_match("/[^0-9]/", $mini['setting']['issue_interval'])) { $mini['setting']['issue_interval'] = 48; } if (preg_match("/[^0-9\\,]/", $param['count'])) { __error('출력개수에는 숫자와 ,만 입력 가능합니다' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } if ($param['count'] > 100) { __error('출력개수는 100개를 초과할 수 없습니다' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } $where = $order = $board_data = $table = ''; $data = $sel_board = array(); // 복수 게시판 지정(keyTable 이 사용된다) if (!empty($param['id']) && (strpos($param['id'], '[') !== false || $param['id'] == '*')) { $is_multi = 1; // 게시판 나눠넣기 if (strpos($param['id'], '[') !== false) { $sel_board = getStr($param['id']); } } // 테이블 임의지정 if (!empty($param['table'])) { $table = $param['table']; } // 키테이블 지정 if (!empty($param['is_key'])) { $table = $mini['name']['search']; } // 아이디로 테이블 지정 if (!$table && !empty($param['id']) && $param['id'] != '*') { if (!empty($mini['board']) && !empty($mini['board']['id']) && $mini['board']['id'] == $param['id']) { $board_data =& $mini['board']; } else { $board_data = getBoard($param['id'], 1); } $table = $param['type'] == 'post' ? $board_data['table'] : $board_data['table_cmt']; } // 키테이블인데 글, 댓글이 아닐 경우 에러 if (!empty($param['is_key']) && $param['type'] != 'post' && $param['type'] != 'cmt') { __error('검색테이블을 참조할 때는 글, 댓글 형식만 사용하실 수 있습니다' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } // 특별 모드 if (!empty($param['mode'])) { switch ($param['mode']) { case 'issue': $where .= " and (issue=1 or (date>=DATE_ADD('{$mini['date']}', INTERVAL -{$mini['setting']['issue_interval']} HOUR) and date<=DATE_ADD('{$mini['date']}', INTERVAL 1 DAY)))"; $order .= ",issue*999999 + hit + vote*10 desc"; break; case 'writer': if (empty($mini['setting']['writer_no'])) { return 0; } $where .= " and target_member={$mini['setting']['writer_no']}"; $order .= ",no desc"; break; case 'relate': if (empty($mini['setting']['relate'])) { return 0; } $where .= " and " . sqlSel(explode(",", $mini['setting']['relate'])); $order .= ",no desc"; break; case 'popup': $where .= " and popup=1"; $order .= ",no desc"; break; case 'memo': $table = $mini['name']['memo']; $param['count'] = 20; $param['type'] = 'memo'; if (!empty($mini['log'])) { $where .= " and target_member={$mini['member']['no']} and date_read=0 and del_target=0"; $order .= ",no"; } break; } } // 여러 테이블 검색시 게시판 정보 로드 및 쿼리 설정 if (!empty($is_multi)) { $q_admin = ''; if (!empty($param['id']) && !empty($sel_board)) { $q_admin .= 'WHERE ' . sqlSel($sel_board); // $where .= " and ".sqlSel($sel_board, 'id'); } $data_board = sql("\n\t\t\tq: SELECT * FROM {$mini['name']['admin']} {$q_admin}\n\t\t\tmode: array\n\t\t"); $board_name = $board_data_arr = array(); if (!empty($data_board)) { foreach ($data_board as $key => $val) { $board_name[$val['no']] = $val['name']; parseBoard($val); $board_data_arr[$val['no']] = $val; } unset($data_board); } } // 키 테이블 검색시 종류에 따라 쿼리 설정 if (!empty($param['is_key'])) { $where .= $param['type'] == 'post' ? " and cmt_no=0" : " and cmt_no!=0"; } // 테이블명이 지정되지 않았다면 에러 if (empty($param['id']) && empty($param['table']) && empty($table)) { __error('게시판 아이디나 테이블명을 입력해주세요' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } // 임의 설정 추가 if (!empty($param['where'])) { if (!preg_match("/^ ?(and|or)/i", $param['where'])) { $param['where'] = " and ({$param['where']})"; } $where .= $param['where']; } if (!empty($param['order'])) { if (!preg_match("/^\\,/i", $param['order'])) { $param['order'] = ",{$param['order']}"; } $order .= $param['order']; } else { if (empty($order)) { $order = ",date desc"; } } // 쪽지인데 로그인이 안되어 있다면 넘김 if (!empty($param['mode']) && $param['mode'] == 'memo' && empty($mini['log'])) { return false; } else { // 쿼리날림 if ($where) { $where = "WHERE " . substr($where, 4); } if ($order) { $order = "ORDER BY " . substr($order, 1); } // 복수 게시판일 경우 if (!empty($is_multi)) { // 전체 게시판일 때 if (empty($sel_board) && $param['id'] == '*') { $sel_board = array_keys($board_data_arr); } if (!empty($sel_board)) { $tmp_data = array(); $tmp_data_order = array(); $order_name = $order_type = ''; $order_data = array(); $data = array(); // order 분석 if (count(explode(",", $order)) > 1) { __error('정렬 기준은 한개만 가능합니다' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } $tmp_order = explode(" ", str_replace("ORDER BY ", "", $order)); $order_name = $tmp_order[0]; $order_type = empty($tmp_order[1]) ? 'asc' : $tmp_order[1]; unset($tmp_order); foreach ($sel_board as $val) { // 키테이블 사용시 if (!empty($param['is_key'])) { $tmp_where = !empty($where) ? $where . " and id={$val}" : "WHERE id={$val}"; $table = $mini['name']['search']; } else { $tmp_where = $where; $table = $param['type'] == 'post' ? $mini['name']['board'] . $val : $mini['name']['cmt'] . $val; } $tmp_data = array_merge($tmp_data, sql(array('q' => "SELECT * FROM {$table} {$tmp_where} " . (!empty($param['is_key']) ? "GROUP BY num" : "") . " {$order} LIMIT {$param['count']}", 'mode' => 'array', 'extra_name' => 'id', 'extra_value' => $val))); } // 정렬 기준에 따라서 나눔 foreach ($tmp_data as $key => $val) { $order_data[$key] = $val[$order_name]; } // 정렬 if ($order_type == 'asc') { asort($order_data); } else { arsort($order_data); } // 정렬한 순서대로 data 정의 $i = 0; foreach ($order_data as $key => $val) { if ($i >= $param['count']) { break; } $data[$i] = $tmp_data[$key]; ++$i; } unset($tmp_data); unset($order_data); } } else { $data = sql(array('q' => "SELECT * FROM {$table} {$where} " . (!empty($param['is_key']) ? "GROUP BY num" : "") . " {$order} LIMIT {$param['count']}", 'mode' => 'array')); } if (!empty($data)) { $a = 0; $count_data = count($data); foreach ($data as $key => $val) { // 여러 게시판 사용시 게시판 정보 입력 if (!empty($is_multi)) { if (!empty($board_name[$data[$key]['id']])) { $data[$key]['board_name'] = $board_name[$data[$key]['id']]; } if (!empty($data[$key]['id'])) { $data[$key]['url_board'] = "{$mini['dir']}mini.php?id={$data[$key]['id']}"; } if (!empty($board_data_arr)) { $mini['board_data'] = $board_data_arr[$data[$key]['id']]; } } else { $mini['board_data'] = $board_data; } if (!empty($param['is_key'])) { // 키 테이블 사용 시 진짜 자료 로드 $val2 = sql("SELECT * FROM " . (!empty($data[$key]['cmt_no']) ? $mini['name']['cmt'] : $mini['name']['board']) . "{$data[$key]['id']} WHERE " . (!empty($data[$key]['cmt_no']) ? "no={$data[$key]['cmt_no']}" : "num={$data[$key]['num']}")); $data[$key] = array_merge($data[$key], $val2); } // title 은 포함된 변수가 많기 때문에 먼저 잘라준다 if (!empty($param['cut_title']) && !empty($data[$key]['title'])) { $data[$key]['title'] = strCut($data[$key]['title'], $param['cut_title']); } // 가공 함수 실행 $tmp_func = "parse" . ($param['type'] == 'cmt' ? 'comment' : $param['type']); if ($count_data == 1) { $tmp_func($data[$key], 'view'); } else { $tmp_func($data[$key], ''); } // 내용 자르기 if (!empty($param['cut_ment']) && !empty($data[$key]['ment'])) { $data[$key]['ment'] = strCut($data[$key]['ment'], $param['cut_ment']); $data[$key]['ment_notag'] = strCut($data[$key]['ment_notag'], $param['cut_ment']); } // if (!empty($param['debug'])) { // echo nl2br(print_r($data[$key], 1)); // exit; // } if (!empty($param['skin'])) { $skin = ''; if ($a == 0 && !empty($param['skin_first'])) { $skin = $param['skin_first']; } else { $skin = $param['skin']; } // 논리문 $preg_left = $preg_right = array(); $preg_left[] = "/\\[:([a-z0-9_]+)\\.([a-z0-9_]+)\\.([a-z0-9_]+):\\]/ie"; $preg_right[] = "\$data[{$key}]['\\1']['\\2']['\\3']"; $preg_left[] = "/\\[:([a-z0-9_]+)\\.([a-z0-9_]+):\\]/ie"; $preg_right[] = "\$data[{$key}]['\\1']['\\2']"; $preg_left[] = "/\\[:([a-z0-9_]+):\\]/ie"; $preg_right[] = "\$data[{$key}]['\\1']"; $skin = preg_replace($preg_left, $preg_right, $skin); echo $skin; } $a++; } if (empty($param['skin'])) { if (count($data) == 1 && $param['count'] == 1) { return current($data); } else { return $data; } } } else { if (!empty($param['skin_not'])) { echo $param['skin_not']; } } } }
/** 댓글 삭제 * @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"); } } }
<tr> <th><select onchange="if(this.value){document.location='?size='+this.value;}"><option value="">--</option><?php foreach (range(2, 6) as $iSize) { echo '<option' . ($g_iSize === $iSize ? ' selected="1"' : '') . ' value="' . $iSize . '">Size ' . $iSize . ' board</option>'; } ?> </select></th> <th colspan="2" id="playtime">00:00</th> </tr> <tr> <td><?php echo getBoard($arrEmptyBoard, $g_iSize, 'solution'); ?> </td> <td><?php echo getBoard($arrBoard, $g_iSize, 'available'); ?> </td> </tr> <tr> <td align="center"><input type="button" value="Check ^" onclick="return checkSolution('solution');" /></td> <td align="center"><input type="button" value="Check ^" onclick="return checkSolution('available');" /></td> </tr> </table> <script type="text/javascript"> <!--// var g_iStartTime = Math.floor($time()/1000), g_bDoCheck = true, g_selected = null, op0 = 1, op1 = 0.5, g_iSize = <?php echo $g_iSize; ?> ;
/** * 로그인 * @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']}"); }
/** 코멘트 목록 뽑기 * @class io * @param -name: 검색배열이름 (list_cmt) -id: 게시판아이디, board_data가 있으면 없어도 된다 -page: 페이지 (마지막페이지) -target_post: 대상게시물번호. view가 있으면 없어도 된다 $board_data: 게시판정보 $view: 게시물정보 * @return Array */ function getListCmt($param, $board_data = '', $view = '') { global $mini; $param = param($param); $output = array(); iss($param['page']); def($param['name'], 'list_cmt'); def($_REQUEST['cPage'], $param['page']); def($_REQUEST['cPage'], 999999999999); //// 게시판정보 if (empty($board_data) && !empty($param['id'])) { getBoard($param['id']); if (empty($mini['site']) || $mini['site']['no'] != $mini['board']['site']) { getSite($mini['board']['site']); } } else { if (empty($board_data) && !empty($mini['board'])) { $board_data = $mini['board']; } } //// 게시물정보 if (empty($view)) { $view = sql("SELECT * FROM {$board_data['table']} WHERE no={$param['target_post']}"); if (!is_array($view)) { __error('게시물이 존재하지 않습니다' . ' (' . __FILE__ . ' line ' . __LINE__ . ' in ' . __FUNCTION__ . ')'); } parsePost($view); $output['view'] = $view; } else { $param['target_post'] = $view['no']; } $is_comment_page = !empty($board_data['use_comment_page']) && !empty($board_data['list_count_comment']) ? 1 : 0; if (!$is_comment_page) { $board_data['list_count_comment'] = 9999999; } //// 공지사항 제외 $is_first = 0; if ($is_comment_page || empty($_REQUEST['cQuick']) && empty($_REQUEST['cS']) && empty($_REQUEST['cSort'])) { $_REQUEST['cS']['notice!'] = 0; $is_first = 1; } $_REQUEST['cAnd'] = 1; //// 검색 처리 setSearch("\n\t\t\tname: {$param['name']}\n\t\t\tquickName: cQuick\n\t\t\tsName: cS\n\t\t\tandName: cAnd\n\t\t\tis_simple: 1\n\t\t"); //// 기본 검색쿼리 지정 check($param['target_post'], 'type:num, name:게시물번호'); $tmp_trackback = !empty($board_data['use_trackback_cmt']) ? '' : " and trackback=''"; $mini['list'][$param['name']]['where'] = !empty($mini['list'][$param['name']]['where']) ? $mini['list'][$param['name']]['where'] . " and target_post={$param['target_post']}{$tmp_trackback}" : "WHERE target_post={$param['target_post']}{$tmp_trackback}"; //// 공지사항 로드 if ($is_first) { $notice = sql("q:SELECT * FROM {$board_data['table_cmt']} WHERE notice=1 and target_post={$param['target_post']} ORDER BY num, mode:array"); $output['notice'] = $notice; } //// 정렬 처리 setSort("\n\t\t\tname: {$param['name']}\n\t\t\tsortName: cSort\n\t\t\ttable: {$board_data['table_cmt']}\n\t\t\torder: ORDER BY num, reply\n\t\t\torder_desc: ORDER BY num DESC, reply ASC\n\t\t"); //// 리스트 $data = getList("\n\t\t\tname: {$param['name']}\n\t\t\tlist: {$board_data['list_count_comment']}\n\t\t\ttable: {$board_data['table_cmt']}\n\t\t\tpageName: cPage\n\t\t\tdivName: cDiv\n\t\t\tstartName: cStart\n\t\t"); $output['data'] = $data; // pr($mini['list'][$param['name']]); //// 트랙백 같이 뽑기 /* $t_data = array(); if (!empty($board_data['use_trackback_cmt'])) { $t_data = sql("q:SELECT * FROM {$board_data['table_cmt']} WHERE target_post={$view['no']} and trackback!='' ORDER BY num, mode:array"); $output['data'] = array_merge($t_data, $output['data']); unset($t_data); } */ //// 트랙백 따로 뽑기 if ($is_first && empty($board_data['use_trackback_cmt'])) { $t_data = sql("q:SELECT * FROM {$board_data['table_cmt']} WHERE target_post={$view['no']} and trackback!='' ORDER BY num, mode:array"); $output['trackback'] = $t_data; } return $output; }
<?php if (isset($_GET['board'])) { require_once 'lib/dataLoader.php'; $boards = getBoard('database'); $data = $_GET['board']; $data = check_input($data); $finalBoard = null; foreach ($boards as $theBoard) { if ($theBoard->board["key"] == $data) { $finalBoard = $theBoard; } } $output = ""; $content = getBoardContent($data); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Project Manager</title> <link rel="stylesheet" href="css/global.css" media="screen" title="no title" charset="utf-8"> <link href='https://fonts.googleapis.com/css?family=Oswald:400,300,700' rel='stylesheet' type='text/css'> </head> <body> <div id="board" data-id="<?php echo $data; ?> "></div> <div class="container"> <a class="homeLink" href="index.php">Home</a>