Skip to content

Commit

Permalink
사용자 차단 시스템 개선
Browse files Browse the repository at this point in the history
 - IP주소 차단 기능 추가
 - 기간 차단 기능 추가
 - 차단/차단 해제 명령어 추가
 - 클라이언트 IP주소 대신 X-Forwarded-For 헤더에 있는 IP주소를 사용할 것인지에 대한 옵션 추가
  • Loading branch information
kdhkr committed Apr 28, 2021
1 parent 9827368 commit 7c841e9
Show file tree
Hide file tree
Showing 11 changed files with 184 additions and 5 deletions.
12 changes: 10 additions & 2 deletions Server/lib/Game/kkutu.js
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,10 @@ exports.Client = function(socket, profile, sid){
}else DB.users.findOne([ '_id', my.id ]).on(function($user){
var first = !$user;
var black = first ? "" : $user.black;

/* Enhanced User Block System [S] */
const blockedUntil = (first || !$user.blockedUntil) ? null : $user.blockedUntil;
/* Enhanced User Block System [E] */

if(first) $user = { money: 0 };
if(black == "null") black = false;
if(black == "chat"){
Expand Down Expand Up @@ -449,7 +452,12 @@ exports.Client = function(socket, profile, sid){
my.checkExpire();
my.okgCount = Math.floor((my.data.playTime || 0) / PER_OKG);
}
if(black) R.go({ result: 444, black: black });
/* Enhanced User Block System [S] */
if(black){
if(blockedUntil) R.go({ result: 444, black: black, blockedUntil: blockedUntil });
else R.go({ result: 444, black: black });
}
/* Enhanced User Block System [E] */
else if(Cluster.isMaster && $user.server) R.go({ result: 409, black: $user.server });
else if(exports.NIGHT && my.isAjae === false) R.go({ result: 440 });
else R.go({ result: 200 });
Expand Down
110 changes: 107 additions & 3 deletions Server/lib/Game/master.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,70 @@ function processAdmin(id, value){
JLog.success("Dumping success.");
});*/
return null;
/* Enhanced User Block System [S] */
case 'ban':
try {
var args = value.split(",");
if(args.length == 2){
MainDB.users.update([ '_id', args[0] ]).set([ 'black', args[1] ]).on();
}else if(args.length == 3){
MainDB.users.update([ '_id', args[0] ]).set([ 'black', args[1] ], [ 'blockedUntil', addDate(parseInt(args[2])) ]).on();
}else return null;

JLog.info(`[Block] 사용자 #${args[0]}(이)가 이용제한 처리되었습니다.`);

if(temp = DIC[args[0]]){
temp.socket.send('{"type":"error","code":410}');
temp.socket.close();
}
}catch(e){
DIC[id].send('notice', { value: `명령을 처리하는 도중 오류가 발생하였습니다: ${e}` });
JLog.warn(`[Block] 명령을 처리하는 도중 오류가 발생하였습니다: ${e}`);
}
return null;
case 'ipban':
try {
var args = value.split(",");
if(args.length == 2){
MainDB.ip_block.update([ '_id', args[0] ]).set([ 'reasonBlocked', args[1] ]).on();
}else if(args.length == 3){
MainDB.ip_block.update([ '_id', args[0] ]).set([ 'reasonBlocked', args[1] ], [ 'ipBlockedUntil', addDate(parseInt(args[2])) ]).on();
}else return null;

JLog.info(`[Block] IP 주소 ${args[0]}(이)가 이용제한 처리되었습니다.`);
}catch(e){
DIC[id].send('notice', { value: `명령을 처리하는 도중 오류가 발생하였습니다: ${e}` });
JLog.warn(`[Block] 명령을 처리하는 도중 오류가 발생하였습니다: ${e}`);
}
return null;
case 'unban':
try {
MainDB.users.update([ '_id', value ]).set([ 'black', null ], [ 'blockedUntil', 0 ]).on();
JLog.info(`[Block] 사용자 #${value}(이)가 이용제한 해제 처리되었습니다.`);
}catch(e){
DIC[id].send('notice', { value: `명령을 처리하는 도중 오류가 발생하였습니다: ${e}` });
JLog.warn(`[Block] 명령을 처리하는 도중 오류가 발생하였습니다: ${e}`);
}
return null;
case 'ipunban':
try {
MainDB.ip_block.update([ '_id', value ]).set([ 'reasonBlocked', null ], [ 'ipBlockedUntil', 0 ]).on();
JLog.info(`[Block] IP 주소 ${value}(이)가 이용제한 해제 처리되었습니다.`);
}catch(e){
DIC[id].send('notice', { value: `명령을 처리하는 도중 오류가 발생하였습니다: ${e}` });
JLog.warn(`[Block] 명령을 처리하는 도중 오류가 발생하였습니다: ${e}`);
}
return null;
/* Enhanced User Block System [E] */
}
return value;
}
/* Enhanced User Block System [S] */
function addDate(num){
if(isNaN(num)) return;
return Date.now() + num * 24 * 60 * 60 * 1000;
}
/* Enhanced User Block System [E] */
function checkTailUser(id, place, msg){
var temp;

Expand Down Expand Up @@ -311,7 +372,9 @@ exports.init = function(_SID, CHAN){
MainDB.session.findOne([ '_id', key ]).limit([ 'profile', true ]).on(function($body){
$c = new KKuTu.Client(socket, $body ? $body.profile : null, key);
$c.admin = GLOBAL.ADMIN.indexOf($c.id) != -1;
$c.remoteAddress = info.connection.remoteAddress;
/* Enhanced User Block System [S] */
$c.remoteAddress = GLOBAL.USER_BLOCK_OPTIONS.USE_X_FORWARDED_FOR ? info.connection.remoteAddress : (info.headers['x-forwarded-for'] || info.connection.remoteAddress);
/* Enhanced User Block System [E] */

if(DIC[$c.id]){
DIC[$c.id].sendError(408);
Expand All @@ -334,13 +397,48 @@ exports.init = function(_SID, CHAN){
return;
}
}
/* Enhanced User Block System [S] */
if(GLOBAL.USER_BLOCK_OPTIONS.USE_MODULE && ((GLOBAL.USER_BLOCK_OPTIONS.BLOCK_IP_ONLY_FOR_GUEST && $c.guest) || !GLOBAL.USER_BLOCK_OPTIONS.BLOCK_IP_ONLY_FOR_GUEST)){
MainDB.ip_block.findOne([ '_id', $c.remoteAddress ]).on(function($body){
if ($body.reasonBlocked) {
if($body.ipBlockedUntil < Date.now()) {
MainDB.ip_block.update([ '_id', $c.remoteAddress ]).set([ 'ipBlockedUntil', 0 ], [ 'reasonBlocked', null ]).on();
JLog.info(`IP 주소 ${$c.remoteAddress}의 이용제한이 해제되었습니다.`);
}
else {
$c.socket.send(JSON.stringify({
type: 'error',
code: 446,
reasonBlocked: !$body.reasonBlocked ? GLOBAL.USER_BLOCK_OPTIONS.DEFAULT_BLOCKED_TEXT : $body.reasonBlocked,
ipBlockedUntil: !$body.ipBlockedUntil ? GLOBAL.USER_BLOCK_OPTIONS.BLOCKED_FOREVER : $body.ipBlockedUntil
}));
$c.socket.close();
return;
}
}
});
}
/* Enhanced User Block System [E] */
if($c.isAjae === null){
$c.sendError(441);
$c.socket.close();
return;
}
$c.refresh().then(function(ref){
if(ref.result == 200){
/* Enhanced User Block System [S] */
let isBlockRelease = false;

if(ref.blockedUntil < Date.now()) {
DIC[$c.id] = $c;
MainDB.users.update([ '_id', $c.id ]).set([ 'blockedUntil', 0 ], [ 'black', null ]).on();
JLog.info(`사용자 #${$c.id}의 이용제한이 해제되었습니다.`);
isBlockRelease = true;
}
/* Enhanced User Block System [E] */

/* Enhanced User Block System [S] */
if(ref.result == 200 || isBlockRelease){
/* Enhanced User Block System [E] */
DIC[$c.id] = $c;
DNAME[($c.profile.title || $c.profile.name).replace(/\s/g, "")] = $c.id;
MainDB.users.update([ '_id', $c.id ]).set([ 'server', SID ]).on();
Expand All @@ -356,9 +454,15 @@ exports.init = function(_SID, CHAN){
joinNewUser($c);
}
} else {
$c.send('error', {
/* Enhanced User Block System [S] */
if(ref.blockedUntil) $c.send('error', {
code: ref.result, message: ref.black, blockedUntil: ref.blockedUntil
});
else $c.send('error', {
code: ref.result, message: ref.black
});
/* Enhanced User Block System [E] */

$c._error = ref.result;
$c.socket.close();
// JLog.info("Black user #" + $c.id);
Expand Down
17 changes: 17 additions & 0 deletions Server/lib/Game/slave.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,23 @@ Server.on('connection', function(socket, info){
$c = new KKuTu.Client(socket, $body ? $body.profile : null, key);
$c.admin = GLOBAL.ADMIN.indexOf($c.id) != -1;

/* Enhanced User Block System [S] */
$c.remoteAddress = GLOBAL.USER_BLOCK_OPTIONS.USE_X_FORWARDED_FOR ? info.connection.remoteAddress : (info.headers['x-forwarded-for'] || info.connection.remoteAddress);
if(GLOBAL.USER_BLOCK_OPTIONS.USE_MODULE && ((GLOBAL.USER_BLOCK_OPTIONS.BLOCK_IP_ONLY_FOR_GUEST && $c.guest) || !GLOBAL.USER_BLOCK_OPTIONS.BLOCK_IP_ONLY_FOR_GUEST)){
MainDB.ip_block.findOne([ '_id', $c.remoteAddress ]).on(function($body){
if ($body.reasonBlocked) {
$c.socket.send(JSON.stringify({
type: 'error',
code: 446,
reasonBlocked: !$body.reasonBlocked ? GLOBAL.USER_BLOCK_OPTIONS.DEFAULT_BLOCKED_TEXT || $body.reasonBlocked,
ipBlockedUntil: !$body.ipBlockedUntil ? GLOBAL.USER_BLOCK_OPTIONS.BLOCKED_FOREVER || $body.ipBlockedUntil
}));
$c.socket.close();
return;
}
});
}
/* Enhanced User Block System [E] */
if(DIC[$c.id]){
DIC[$c.id].send('error', { code: 408 });
DIC[$c.id].socket.close();
Expand Down
3 changes: 3 additions & 0 deletions Server/lib/Web/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ Pub.ready = function(isPub){

DB.session = new mainAgent.Table("session");
DB.users = new mainAgent.Table("users");
/* Enhanced User Block System [S] */
DB.ip_block = new mainAgent.Table("ip_block");
/* Enhanced User Block System [E] */

if(exports.ready) exports.ready(Redis, Pg);
else JLog.warn("DB.onReady was not defined yet.");
Expand Down
1 change: 1 addition & 0 deletions Server/lib/Web/lang/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@
"error_443": "관리자에 의해 해당 계정으로의 채팅 이용이 제한되었습니다.",
"error_444": "관리자에 의해 해당 계정으로의 게임 이용이 제한되었습니다.\n제한 사유: ",
"error_445": "본인 확인에 성공했습니다. 끄투를 이용해 주셔서 감사합니다.",
"error_446": "관리자에 의해 해당 IP 주소로의 게임 이용이 제한되었습니다.\n제한 사유: ",
"error_450": "해당 사용자가 끄투에 접속하지 않았거나 이 서버에 접속해 있지 않습니다.",
"error_451": "커뮤니티 기능은 로그인 후 이용하실 수 있습니다.\n우측 상단의 로그인 단추를 눌러 로그인해 보세요!",
"error_452": "더 이상 친구를 추가할 수 없습니다.",
Expand Down
1 change: 1 addition & 0 deletions Server/lib/Web/lang/ko_KR.json
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@
"error_443": "관리자에 의해 해당 계정으로의 채팅 이용이 제한되었습니다.",
"error_444": "관리자에 의해 해당 계정으로의 게임 이용이 제한되었습니다.\n제한 사유: ",
"error_445": "본인 확인에 성공했습니다. 끄투를 이용해 주셔서 감사합니다.",
"error_446": "관리자에 의해 해당 IP 주소로의 게임 이용이 제한되었습니다.\n제한 사유: ",
"error_450": "해당 사용자가 끄투에 접속하지 않았거나 이 서버에 접속해 있지 않습니다.",
"error_451": "커뮤니티 기능은 로그인 후 이용하실 수 있습니다.\n우측 상단의 로그인 단추를 눌러 로그인해 보세요!",
"error_452": "더 이상 친구를 추가할 수 없습니다.",
Expand Down
3 changes: 3 additions & 0 deletions Server/lib/Web/lib/in_admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,9 @@
.append($("<td>").append(putter("ud-" + item._id + "-server", 't', item.server)))
.append($("<td>").append(putter("ud-" + item._id + "-lastLogin", 't', item.lastLogin)))
.append($("<td>").append(putter("ud-" + item._id + "-black", 'g', item.black)))
/* Enhanced User Block System [S] */
.append($("<td>").append(putter("ud-" + item._id + "-blockedUntil", 'g', item.blockedUntil)))
/* Enhanced User Block System [E] */
.append($("<td>").append(putter("ud-" + item._id + "-friends", 'g', JSON.stringify(item.friends || {}))));
});
});
Expand Down
20 changes: 20 additions & 0 deletions Server/lib/Web/lib/kkutu/body.js
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,26 @@ function onMessage(data){
alert("생년월일이 올바르게 입력되지 않아 게임 이용이 제한되었습니다. 잠시 후 다시 시도해 주세요.");
break;
}
/* Enhanced User Block System [S] */
if(data.blockedUntil) {
var blockedUntil = new Date(parseInt(data.blockedUntil));
var block = "\n제한 시점: " + blockedUntil.getFullYear() + "년 " + blockedUntil.getMonth() + 1 + "월 " +
blockedUntil.getDate() + "일 " + blockedUntil.getHours() + "시 " + blockedUntil.getMinutes() + "분까지";

alert("[#444] " + L['error_444'] + i + block);
break;
}
}else if(data.code == 446){
i = data.reasonBlocked;
if(data.ipBlockedUntil) {
var blockedUntil = new Date(parseInt(data.ipBlockedUntil));
var block = "\n제한 시점: " + blockedUntil.getFullYear() + "년 " + blockedUntil.getMonth() + 1 + "월 " +
blockedUntil.getDate() + "일 " + blockedUntil.getHours() + "시 " + blockedUntil.getMinutes() + "분까지";

alert("[#446] " + L['error_446'] + i + block);
break;
}
/* Enhanced User Block System [E] */
} else if (data.code === 447) {
alert("자동화 봇 방지를 위한 캡챠 인증에 실패했습니다. 메인 화면에서 다시 시도해 주세요.");
break;
Expand Down
1 change: 1 addition & 0 deletions Server/lib/Web/views/gwalli.pug
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ block Middle
td server
td lastLogin
td black
td blockedUntil
td friends
tbody#user-data
button#user-apply 적용
Expand Down
7 changes: 7 additions & 0 deletions Server/lib/sub/global.inc.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,12 @@
"PFX": "Your PFX Bundle Here",
"isPFX": false,
"isCA": false
},
"USER_BLOCK_OPTIONS": {
"USE_MODULE": false,
"USE_X_FORWARDED_FOR": false,
"BLOCK_IP_ONLY_FOR_GUEST": true,
"DEFAULT_BLOCKED_TEXT": "관리자에 의해 서비스 이용이 제한되었습니다.",
"BLOCKED_FOREVER": "영구 이용제한"
}
}
14 changes: 14 additions & 0 deletions db.sql
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ CREATE TABLE users (
equip json,
exordial text,
black text,
blockedUntil text,
server character varying(16),
password text,
friends json
Expand All @@ -276,6 +277,19 @@ CREATE TABLE users (

ALTER TABLE users OWNER TO postgres;

--
-- Name: ip_block; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE ip_block (
_id character varying(64) NOT NULL,
reasonBlocked text,
ipBlockedUntil text
);


ALTER TABLE ip_block OWNER TO postgres;

--
-- Name: COLUMN users.password; Type: COMMENT; Schema: public; Owner: postgres
--
Expand Down

0 comments on commit 7c841e9

Please sign in to comment.