KKuTu icon indicating copy to clipboard operation
KKuTu copied to clipboard

별명 변경 시스템 추가

Open lshqqytiger opened this issue 3 years ago • 73 comments

PR 설명

별명을 변경할 수 있도록 하는 PR입니다. 이 PR은 정상 작동이 확인되었습니다.

변경 사항

  • 별명 변경 기능 추가 (global.json의 NICKNAME_LIMIT 값을 수정해 별명 변경 후 n일 동안 다시 변경할 수 없게 설정할 수 있음)
  • 별명을 따로 지정하지 않은 유저 또는 처음 접속하는 유저의 경우 OAuth 별명을 그대로 사용
  • OAuth로부터 별명을 받아오지 못한 경우 임시로 처리
  • 별명을 변경한 유저의 경우 상단 바의 로그인/로그아웃 버튼에 변경한 별명이 표시
  • 실시간으로 별명, 소개 갱신

DB 변경 사항

  • users 테이블에 컬럼 nickname(text), nickChanged(text) 추가

개선 예정

  • ~~별명 변경 사항이 재접속 없이 적용되도록 변경 예정~~
  • OAuth로부터 별명을 받아오지 못한 유저는 접속 시 닉네임을 설정할 수 있게 기능 추가
  • ~~nickChanged 기록~~

적용 시 주의 사항 및 피드백 요청 사항

  • DB 변경 사항을 모두 적용해 주셔야 합니다.
  • 여러 단계를 거쳐 수정된 코드이므로 비효율적인 부분이나 불필요한 부분이 있을 수 있습니다. comment 또는 review 해주시면 검토 후 반영하겠습니다.

lshqqytiger avatar May 08 '21 07:05 lshqqytiger

칼럼도 추가했고, 코드도 전부다 추가했는데 이런 오류가 뜹니다. wrwerrewrwe /home/ubuntu/KKuTu/Server/lib/Web/routes/major.js:137 var changedDate = new Date(data.nickChanged); ^

TypeError: Cannot read property 'nickChanged' of undefined at /home/ubuntu/KKuTu/Server/lib/Web/routes/major.js:137:37 at callback (/home/ubuntu/KKuTu/Server/lib/sub/collection.js:316:13) at Result.preCB (/home/ubuntu/KKuTu/Server/lib/sub/collection.js:298:6) at Result.Query.handleReadyForQuery (/home/ubuntu/KKuTu/Server/lib/node_modules/pg/lib/query.js:144:10) at Connection. (/home/ubuntu/KKuTu/Server/lib/node_modules/pg/lib/client.js:180:19) at Connection.emit (events.js:198:13) at Socket. (/home/ubuntu/KKuTu/Server/lib/node_modules/pg/lib/connection.js:133:12) at Socket.emit (events.js:198:13) at addChunk (_stream_readable.js:288:12) at readableAddChunk (_stream_readable.js:269:11) Worker 15130 died

대체 왜 그럴까요

ghost avatar May 08 '21 12:05 ghost

테스트 및 제보 감사합니다. major.js 파일을 수정하였습니다. 다시 적용해보세요.

lshqqytiger avatar May 08 '21 13:05 lshqqytiger

global.json에서 별명 변경 후 7일동안 닉네임을 변경하지 못하게 설정한 뒤 닉네임을 변경했을 때

[2021-05-09 12:19:09] New user #discord-632850679962140672 C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\Web\routes\major.js:141 if(GLOBAL.NICKNAME_LIMIT.ENABLED && new Date() < new Date(changedDate.setDate(changedDate.getDate() + Number(GLOBAL.nickLimit.TERM)))) return res.send({ error: 457 }); ^ TypeError: Cannot read property 'TERM' of undefined at C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\Web\routes\major.js:141:147 at callback (C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\sub\collection.js:316:13) at Result.preCB (C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\sub\collection.js:298:6) at Result.Query. handleReadyForQuery (C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\node_modules\pg\lib\query.js:144:10) at Connection.<anonymous> (C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\node_modules\pg\lib\client.js:180:19) at Connection.emit (events.js:210:5) at Socket.<anonymous> (C:\Users\Administrator\Desktop\KKuTu-master\Server\lib\node_modules\pg\lib\connection.js:133:12) at Socket.emit (events.js:210:5) at addChunk (_stream_readable.js:308:12) at readableAddChunk (_stream_readable.js:289:11)

라는 오류가 서버 매니저에 뜨며 Worker가 죽고 서버가 꺼집니다.

whskr avatar May 09 '21 03:05 whskr

ready.js에서는 nickLimit이지만 major.js에서는 NICKNAME_LIMIT입니다. ready.js에서는 웹소켓으로 값을 받아오는데 major.js에서는 global.json으로 직접 접근하기 때문에 구분을 잘해주어야 합니다.

if(GLOBAL.NICKNAME_LIMIT.ENABLED && new Date() < new Date(changedDate.setDate(changedDate.getDate() + Number(GLOBAL.NICKNAME_LIMIT.TERM)))) return res.send({ error: 457 });

lshqqytiger avatar May 09 '21 03:05 lshqqytiger

오류도 안 뜨고 별명 변경도 잘 되는데 변경 후 7일동안 별명을 변경하지 못하게 설정해도 계속해서 별명이 바꿔지네요 🤔

whskr avatar May 09 '21 03:05 whskr

제가 지금 테스트가 불가능해서 아래 코드로 테스트좀 해주실 수 있으실까요

var changedDate = new Date(requester.nickChanged || 0);

changedDate.setDate(changedDate.getDate()+GLOBAL.NICKNAME_LIMIT.TERM);
if(GLOBAL.NICKNAME_LIMIT.ENABLED && new Date() < changedDate) return res.send({ error: 457 });	
if(data) return res.send({ error: 456 });

MainDB.users.update([ '_id', req.session.profile.id ]).set([ 'nickname', nickname ], [ 'nickChanged', new Date() ]).on();					MainDB.session.update([ '_id', req.session.id ]).set([ 'nickname', nickname ]).on();
return res.send({ result: 200 });

lshqqytiger avatar May 09 '21 04:05 lshqqytiger

그래도 계속 별명 변경이 되네요

whskr avatar May 09 '21 05:05 whskr

GLOBAL.NICKNAME_LIMIT.TERM을 Number(GLOBAL.NICKNAME_LIMIT.TERM)로 바꿔보세요

lshqqytiger avatar May 09 '21 05:05 lshqqytiger

방식을 조금 바꿨습니다. 적용 후 다시 테스트 해보시면 아마 될 것 같습니다.

lshqqytiger avatar May 09 '21 06:05 lshqqytiger

Files Changed 탭의 수정 사항을 모두 적용하고 서버 껐다 켜서 로그인 할 때

Error (개인정보 같은 것은 가렸습니다.) 라는 오류가 끄투 서버 매니저에 뜨며 로그인이 되지 않습니다.

db.sql에 CREATE TABLE session안에도 nickname text, 추가해서 "dropdb → createdb → 다시 데이터베이스 구축하기" 이런식으로 하려 했지만 dropdb에서 이상한 깨진 문자들이 나오면서 main 데이터베이스를 삭제할 수 없다네요.

riruhyun avatar May 10 '21 01:05 riruhyun

session 테이블에 nickname이란 칼럼이 없다고 하네요. 칼럼을 추가해봤나요?

jhj1228 avatar May 10 '21 01:05 jhj1228

session 테이블에 nickname이란 칼럼이 없다고 하네요. 칼럼을 추가해봤나요?

아 nickname 칼럼 추가하니 됐네요, SQL쪽은 잘 몰라서요.. 감사합니다

riruhyun avatar May 10 '21 02:05 riruhyun

추가적으로 PR 올리시기 전에 테스트는 해주시면 좋을 것 같아요

kdwkr avatar May 10 '21 04:05 kdwkr

PR 적용 후 같은 로그가 반복되서 보여집니다. fewgsraf

jhj1228 avatar May 12 '21 05:05 jhj1228

291번째 줄 부분을 잘못 수정하신 것 같습니다.

JLog.log(`Chan @${channel} Msg #${my.id}: ${msg}`);
if(JSON.parse(msg).type != 'reloadData') JLog.log(`Chan @${channel} Msg #${my.id}: ${msg}`);

이렇게 되어있는 것 같은데 아래와 같이 수정해주세요.

if(JSON.parse(msg).type != 'reloadData') JLog.log(`Chan @${channel} Msg #${my.id}: ${msg}`);

lshqqytiger avatar May 12 '21 07:05 lshqqytiger

해결되었습니다. 감사합니다.

jhj1228 avatar May 12 '21 07:05 jhj1228

session테이블에 nickname칼럼을 생성하는 sql구문이 없는것같습니다. 확인부탁드립니다.

norhu1130 avatar May 14 '21 12:05 norhu1130

image 이런 문제도 있습니다.

norhu1130 avatar May 14 '21 13:05 norhu1130

닉네임에서 html 코드를 삽입시에, html코드 그대로 나옵니다. 예 : <h1>test image

kmsimproject2 avatar May 30 '21 04:05 kmsimproject2

XSS 취약점의 경우 끄투에 원래 존재하는 문제로, 이 PR에서 다룰 경우 PR의 원래 목적과 다른 내용이 추가되게 됩니다. 따라서, 서버 주인이 지정한 정규식에 어긋나는 경우 해당 부분만 삭제하고 DB에 반영할지 아니면 아예 닉네임을 변경하지 않을지 선택할 수 있게 수정했습니다.

lshqqytiger avatar May 30 '21 08:05 lshqqytiger

XSS 취약점의 경우 끄투에 원래 존재하는 문제로, 이 PR에서 다룰 경우 PR의 원래 목적과 다른 내용이 추가되게 됩니다. 따라서, 서버 주인이 지정한 정규식에 어긋나는 경우 confirm 창이 뜨게끔 수정했습니다.

확인하였습니다. 감사합니다.

kmsimproject2 avatar May 30 '21 08:05 kmsimproject2

C:\Users\asdf\Desktop\KKuTu-5663dd47d53b05c6c16f1e0568eef5b5095e3ca2\Server\lib\Web\routes\major.js:129 f(exordial || exordial === ""){ ^ SyntaxError: Unexpected token '{' at wrapSafe (internal/modules/cjs/loader.js:915:16) at Module._compile (internal/modules/cjs/loader.js:963:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) at Module.load (internal/modules/cjs/loader.js:863:32) at Function.Module._load (internal/modules/cjs/loader.js:708:14) at Module.require (internal/modules/cjs/loader.js:887:19) at require (internal/modules/cjs/helpers.js:74:18) at C:\Users\ealjs\Desktop\KKuTu-5663dd47d53b05c6c16f1e0568eef5b5095e3ca2\Server\lib\Web\main.js:207:2 at Array.forEach (&lt;anonymous>) at Object.&lt;anonymous> (C:\Users\asdf\Desktop\KKuTu-5663dd47d53b05c6c16f1e0568eef5b5095e3ca2\Server\lib\Web\main.js:206:8) Worker 11156 died W: CLOSED WITH CODE 0 이렇게 하고 끄투가 죽어버립니다. major.js에 문제가 있는 거 같은데 전 분명히 저기에 나와 있는대로 따라했는데 왜 오류가 있는건지 궁금합니다

MegaKkutu avatar May 31 '21 02:05 MegaKkutu

major.js 129번째 줄에 iff만 적으신 것 같습니다.

lshqqytiger avatar May 31 '21 02:05 lshqqytiger

그건 해결이 되었습니다만.. 제가 끄투 서버 로그인을 한 후에 들어가니 Error: C:\Users\asdf\Desktop\KKuTu-5663dd47d53b05c6c16f1e0568eef5b5095e3ca2\Server\lib\Web\views\kkutu.pug:354:1 352| button#replay-view= L('replayView') 353| +Dialog('DressDiag', 600, 280, L('dress')) > 354| div.dialog-bar ---------^ 355| h4(style='width: 150px;')= L('myNickname') 356| input#dress-nickname(type='textfield', placeholder=L('myNicknameX'), style='width: 435px;', maxlength=12) 357| div.dialog-bar Invalid indentation, you can use tabs or spaces but not both 이렇게 뜹니다. 분명히 다 적었는데.. 혹시 min,js 에 있는 부분도 수정해야 되나요?

MegaKkutu avatar Jun 01 '21 04:06 MegaKkutu

min.js는 직접 수정하는 것이 아닙니다. js 파일들을 수정하고 그런트를 돌려야 합니다 😙

whskr avatar Jun 01 '21 04:06 whskr

스페이스와 탭을 둘 다 사용해 발생한 오류입니다. (pug 쪽) 스페이스나 탭 중 하나만 사용해주세요. in_game_kkutu.min.js, in_admin.min.js를 수정해야 하지만 직접 수정은 권장하지 않고 grunt를 사용하시면 됩니다. (grunt도 ES6 이후 문법을 지원하지 않는다는 단점은 있음)

lshqqytiger avatar Jun 01 '21 04:06 lshqqytiger

저는 끄투블루님이 설명한 방법대로 하여서 grunt를 사용하지 않았습니다. 스페이스나 탭 중 하나만 사용하였다는것이..

MegaKkutu avatar Jun 02 '21 00:06 MegaKkutu

저는 끄투블루님이 설명한 방법대로 하여서 grunt를 사용하지 않았습니다. 스페이스나 탭 중 하나만 사용하였다는것이..

? grunt.bat를 돌리시고 리눅스 환경이라면 sudo grunt를 돌리시면 되는데요

kmsimproject avatar Jun 03 '21 08:06 kmsimproject

스페이스(일반적인 띄어쓰기)와 탭(탭 키를 사용한 띄어쓰기)을 혼용할 경우 pug에서는 오류가 납니다. 끄투 코드는 전부 기본적으로 탭을 사용해 작성되어있고 그 위에 추가로 작성을 할 경우 탭을 사용해야 합니다. 참고

lshqqytiger avatar Jun 03 '21 08:06 lshqqytiger

모바일(m_kkutu.pug)에는 span#NICKNAME_LIMIT= locals.NICKNAME_LIMIT ? JSON.stringify(locals.NICKNAME_LIMIT) : "{}" 추가 안하시나요? JS는 PC랑 같은거 공유하는데 모바일만 저 요소가 없어서 오류나고 시작조차 안되네요.

rhrhrhrhrhrh avatar Jun 05 '21 18:06 rhrhrhrhrhrh