Skip to content
This repository has been archived by the owner on Oct 7, 2024. It is now read-only.

Commit

Permalink
Merge pull request #61 from NfoAlex/NameCheckWhenRegister
Browse files Browse the repository at this point in the history
Name check when register
  • Loading branch information
NfoAlex authored Aug 12, 2023
2 parents 0e78ba7 + b8f4bf2 commit 3a63c8f
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 108 deletions.
233 changes: 133 additions & 100 deletions auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,75 +18,75 @@ let authUser = async function authUser(cred) {
let index = Object.keys(db.dataUser.user)[i];

//ユーザー名とパスワードの一致を確認してセッションIDを生成する
if (
db.dataUser.user[index].name === username &&
(
bcrypt.compare(password, db.dataUser.user[index].pw) || //ハッシュ化とパスワード比較
db.dataUser.user[index].pw === password //一応平文前提でも、そしてハッシュ化する(次期ビルドで削除)
)
) {
//セッションID入れるよう
let _session = "";

//BANされているならそう結果を返す
if ( db.dataUser.user[index].state.banned ) {
return {result: false};
if ( db.dataUser.user[index].name === username ) {
//パスワードのハッシュ値計算
let passComparedResult = await bcrypt.compare(password, db.dataUser.user[index].pw);
//認証成功したら
if ( passComparedResult ) {
//セッションID入れるよう
let _session = "";

//BANされているならそう結果を返す
if ( db.dataUser.user[index].state.banned ) {
return {result: false};

}

//セッションID用に24文字のコードを生成
let sessionidCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //セッションIDに使う英数字
let sessionidLength = 24; //文字数
_session = Array.from(Array(sessionidLength)).map(()=>sessionidCharset[Math.floor(Math.random()*sessionidCharset.length)]).join('');

let username = db.dataUser.user[index].name; //ユーザー名取得

//ログイン時間を記録する用
let t = new Date();
//ログイン時間(分まで)を変数へ格納
let _loginTime = t.getFullYear() + (t.getMonth()+1).toString().padStart(2,0) + t.getDate().toString().padStart(2,0) + t.getHours().toString().padStart(2,0) + t.getMinutes().toString().padStart(2,0);
try {
//セッションコードとデバイスを設定
db.dataUser.user[index].state.sessions[_session] = {
sessionName: "とあるデバイス",
loggedinTime: _loginTime,
loggedinTimeFirst: _loginTime
};
} catch(e) {
//セッションいれるところすらないなら作る
db.dataUser.user[index].state.sessions = {};
db.dataUser.user[index].state.sessions[_session] = {
sessionName: "とあるデバイス",
loggedinTime: _loginTime,
loggedinTimeFirst: _loginTime
};
}

// !!!! ↓↓次期ビルドで削除↓↓ !!!!
/************************************************************/
//パスワードが平文保存されているならハッシュ化して保存
if ( db.dataUser.user[index].pw === password ) {
db.dataUser.user[index].pw = await bcrypt.hash(cred.password, 10);

}
//以前の形式のせっしょんIDがあるなら削除
if ( db.dataUser.user[index].state.session_id !== undefined ) {
delete db.dataUser.user[index].state.session_id;
}
/************************************************************/

//サーバーのJSONファイルを更新
fs.writeFileSync("./user.json", JSON.stringify(db.dataUser, null, 4));

return {
result: true, //ログイン成功の印
userid: index, //ユーザーID
username: username, //ユーザー名
sessionid: _session, //セッションコード
role: db.dataUser.user[index].role, //ロール
channelJoined: db.dataUser.user[index].channel //参加しているチャンネル
}; //ユーザーの情報を送信

}

//セッションID用に24文字のコードを生成
let sessionidCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //セッションIDに使う英数字
let sessionidLength = 24; //文字数
_session = Array.from(Array(sessionidLength)).map(()=>sessionidCharset[Math.floor(Math.random()*sessionidCharset.length)]).join('');

let username = db.dataUser.user[index].name; //ユーザー名取得

//ログイン時間を記録する用
let t = new Date();
//ログイン時間(分まで)を変数へ格納
let _loginTime = t.getFullYear() + (t.getMonth()+1).toString().padStart(2,0) + t.getDate().toString().padStart(2,0) + t.getHours().toString().padStart(2,0) + t.getMinutes().toString().padStart(2,0);
try {
//セッションコードとデバイスを設定
db.dataUser.user[index].state.sessions[_session] = {
sessionName: "とあるデバイス",
loggedinTime: _loginTime,
loggedinTimeFirst: _loginTime
};
} catch(e) {
//セッションいれるところすらないなら作る
db.dataUser.user[index].state.sessions = {};
db.dataUser.user[index].state.sessions[_session] = {
sessionName: "とあるデバイス",
loggedinTime: _loginTime,
loggedinTimeFirst: _loginTime
};
}

// !!!! ↓↓次期ビルドで削除↓↓ !!!!
/************************************************************/
//パスワードが平文保存されているならハッシュ化して保存
if ( db.dataUser.user[index].pw === password ) {
db.dataUser.user[index].pw = await bcrypt.hash(cred.password, 10);

}
//以前の形式のせっしょんIDがあるなら削除
if ( db.dataUser.user[index].state.session_id !== undefined ) {
delete db.dataUser.user[index].state.session_id;
}
/************************************************************/

//サーバーのJSONファイルを更新
fs.writeFileSync("./user.json", JSON.stringify(db.dataUser, null, 4));

return {
result: true, //ログイン成功の印
userid: index, //ユーザーID
username: username, //ユーザー名
sessionid: _session, //セッションコード
role: db.dataUser.user[index].role, //ロール
channelJoined: db.dataUser.user[index].channel //参加しているチャンネル
}; //ユーザーの情報を送信

}

}
Expand All @@ -99,14 +99,18 @@ let authUser = async function authUser(cred) {

//パスワードを変更
let changePassword = async function changePassword(dat) {
//現在のパスワードをハッシュ比較
let passComparedResult = await bcrypt.compare(dat.currentPassword, db.dataUser.user[dat.reqSender.userid].pw);

//今のパスワードが一致しないならここで停止
if (
if (
db.dataUser.user[dat.reqSender.userid].pw !== dat.currentPassword && //平文でも比較 次期ビルドで削除
!bcrypt.compare(dat.currentPassword, db.dataUser.user[dat.reqSender.userid].pw)
!passComparedResult
) {
return -1;
}

//パスワードをハッシュ化
let newPassword = await bcrypt.hash(dat.newPassword, 10);

//パスワード変更
Expand Down Expand Up @@ -171,9 +175,9 @@ let registerUser = async function registerUser(dat) { //dat=[0=>name(名前), 1=
//招待制だったらコードを確認
if ( db.dataServer.registration.invite.inviteOnly && db.dataServer.registration.available ) { //招待制かどうか
//招待コードが一致しているかどうか
if ( db.dataServer.registration.invite.inviteCode !== dat[1] ) {
if ( db.dataServer.registration.invite.inviteCode !== dat.code ) {
console.log("auth :: registerUser : 招待コード違うわ");
return {key:-1, userid:-1};
return {result: "FAILED", pass:"", userid:""};

}
console.log("auth :: registerUser : 招待コード合ってる!");
Expand All @@ -182,43 +186,72 @@ let registerUser = async function registerUser(dat) { //dat=[0=>name(名前), 1=

//ID格納用
let newID = "";
//ID生成
for ( let i=0; i<8; i++ ) {
newID += Math.trunc(Math.random() * 9); //乱数を追加

}

//パスワードを生成
const pwGenerated = generateKey();
//DBに書くためにハッシュ化する
const pwHashed = await bcrypt.hash(pwGenerated, 10);
//setIntervalを格納する変数
let CheckIDInterval = null;

//DBに登録
db.dataUser.user[newID] = {
"name": dat[0],
"role": "Member",
"pw": pwHashed,
"icon": "",
"state": {
"loggedin": false,
"session_id": "",
"sessions": {},
"banned": false
},
"channel": db.dataServer.config.CHANNEL.CHANNEL_DEFAULT_JOINONREGISTER
};

console.log("registerUser :: 登録結果 ↓");
console.log(db.dataUser.user[newID]);

//サーバーのJSONファイルを更新
fs.writeFileSync("./user.json", JSON.stringify(db.dataUser, null, 4));
//ユーザー名の空きを調べる
for ( let index in db.dataUser.user ) {
//ユーザー名がすでに使われていたら停止
if ( db.dataUser.user[index].name === dat.username ) {
return {result: "FAILED", pass:"", userid:""};

//デフォルトアイコンを新規ユーザー用にクローン
fs.copyFileSync("./img/default.jpeg", "./img/" + newID + ".jpeg");
}

}

//パスワードを返す
return {key:pwGenerated, userid:newID};
//ユーザーIDの空きを調べて作る
return new Promise((resolve) => {
CheckIDInterval = setInterval(() => {
//ID用変数を初期化
newID = "";
//IDへ乱数生成して格納
for ( let i=0; i<8; i++ ) {
newID += Math.trunc(Math.random() * 9); //乱数を追加

}

//もし生成したIDが空いてるならここで次の処理へ
if ( db.dataUser.user[newID] === undefined ) resolve();

}, 10);


}).then(() => {
//IDの空き確認用Intervalを停止
clearInterval(CheckIDInterval);

//DBに登録
db.dataUser.user[newID] = {
"name": dat.username,
"role": "Member",
"pw": pwHashed,
"icon": "",
"state": {
"loggedin": false,
"session_id": "",
"sessions": {},
"banned": false
},
"channel": db.dataServer.config.CHANNEL.CHANNEL_DEFAULT_JOINONREGISTER
};

console.log("registerUser :: 登録結果 ↓");
console.log(db.dataUser.user[newID]);

//サーバーのJSONファイルを更新
fs.writeFileSync("./user.json", JSON.stringify(db.dataUser, null, 4));

//デフォルトアイコンを新規ユーザー用にクローン
fs.copyFileSync("./img/default.jpeg", "./img/" + newID + ".jpeg");

//パスワードを返す
return {result: "SUCCESS", pass:pwGenerated, userid:newID};

});

}

Expand Down
25 changes: 17 additions & 8 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ let sendUrlPreview = function sendUrlPreview(urlDataItem, channelid, msgId) {
io.to("loggedin").emit("messageUpdate", dat); //履歴を返す

}

//外部スクリプトで使う用
exports.sendUrlPreview = sendUrlPreview;

////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -1191,17 +1191,26 @@ io.on("connection", (socket) => {

//新規登録
socket.on("register", async (dat) => {
//ユーザー名が2文字以下なら停止
if ( dat.username.length <= 2 ) {
socket.emit("registerEnd", {"pass":"", "result": "FAILED"});
return;

}

//DBにユーザーを登録、パスワードとユーザーIDの取得
//↓useridがついて来るがシステムメッセージにしか使っていない
let createdUserAuth = await auth.registerUser(dat);

//返り値が-1じゃないなら
if ( createdUserAuth.key !== -1 ) {
socket.emit("registerEnd", createdUserAuth.key); //パスワードを送信
//成功したら送信
if ( createdUserAuth.result === "SUCCESS" ) {
socket.emit("registerEnd", {"pass":createdUserAuth.pass, "result":"SUCCESS"}); //パスワードを送信

//記録するシステムメッセージ
let SystemMessageLogging = {
userid: "SYSTEM",
channelid: db.dataServer.config.CHANNEL.CHANNEL_DEFAULT_REGISTERANNOUNCE,
role: "SYSTEM",
replyData: {
isReplying: false,
messageid: "",
Expand All @@ -1219,11 +1228,11 @@ io.on("connection", (socket) => {
};

//システムメッセージを記録して送信
let SystemMessageResult = msg.msgMix(SystemMessageLogging);
io.to("loggedin").emit("messageReceive", SystemMessageResult);
msg.msgMix(SystemMessageLogging);
io.to("loggedin").emit("messageReceive", SystemMessageLogging);

} else {
socket.emit("registerEnd", -1);
} else { //失敗したら失敗を伝える
socket.emit("registerEnd", {"pass":"", "result": createdUserAuth.result});

}

Expand Down

0 comments on commit 3a63c8f

Please sign in to comment.