Skip to content

Commit

Permalink
🐛 Fixed some bugs.
Browse files Browse the repository at this point in the history
  • Loading branch information
mukeran committed Jul 4, 2020
1 parent ab979f3 commit 11cbb89
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 24 deletions.
3 changes: 2 additions & 1 deletion src/model/session.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ const SessionSchema = new mongoose.Schema({
sessionId: { type: String, required: true },
ip: { type: String, required: true }, // 用户IP
controlPort: { type: String, required: true }, // 连接服务器控制信息端口
transferPort: String // 文件传输用端口
transferPort: String, // 文件传输用端口
isNAT: { type: Boolean, default: false }
})

/**
Expand Down
14 changes: 14 additions & 0 deletions src/request/offlineTransfer.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ function sendOfflineTransfers (client) {
.then(async offlineTransfers => {
const requests = []
await Promise.all(offlineTransfers.map(offlineTransfer => {
if (offlineTransfer.deadline.getTime() < new Date().getTime()) {
OfflineTransferModel.deleteOne({ _id: offlineTransfer._id })
.then(() => {
logger.debug(`Deleted expired offline transfer ${offlineTransfer._id}`)
})
return
}
return UserModel.findOne({ _id: offlineTransfer.fromUserId })
.then(user => {
requests.push({
Expand Down Expand Up @@ -50,6 +57,13 @@ function sendOfflineTransfersByUserId (userId) {
.then(async offlineTransfers => {
const requests = []
await Promise.all(offlineTransfers.map(offlineTransfer => {
if (offlineTransfer.deadline.getTime() < new Date().getTime()) {
OfflineTransferModel.deleteOne({ _id: offlineTransfer._id })
.then(() => {
logger.debug(`Deleted expired offline transfer ${offlineTransfer._id}`)
})
return
}
return UserModel.findOne({ _id: offlineTransfer.fromUserId })
.then(user => {
requests.push({
Expand Down
61 changes: 44 additions & 17 deletions src/response/friend.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ function requestFriendList (packet, client) {
for (const index in data.friends) {
const friendId = data.friends[index]
const friend = {
isNAT: false,
isOnline: false
}
let isNotFound = false
Expand All @@ -46,6 +45,7 @@ function requestFriendList (packet, client) {
if (session !== null) {
friend.ip = session.ip
friend.port = session.transferPort
friend.isNAT = session.isNAT
if (new Date().getTime() <= new Date(friend.lastSeen).getTime() + 3 * config.connection.ALIVE_PERIOD) {
friend.isOnline = true
}
Expand Down Expand Up @@ -79,18 +79,39 @@ function sendFriendRequest (packet, client) {
sendResponse(client, { status: status.user.NO_SUCH_USER }, packet)
return
}
FriendRequestsModel.create({
fromUserId: fromUserSession.userId,
toUserId: toUser._id
})
.then(() => {
sendResponse(client, { status: status.OK }, packet)
SessionModel.findOne({ userId: toUser._id })
.then(session => {
if (session !== null) {
const toClient = clients.get(session.ip, session.controlPort)
request.sendFriendRequests(toClient)
if (fromUserSession.userId === toUser._id.toString()) {
sendResponse(client, { status: status.user.CANNOT_OPERATE_SELF }, packet)
return
}
UserModel.findOne({ _id: fromUserSession.userId })
.then(fromUser => {
if (fromUser.friends.indexOf(toUser._id.toString()) !== -1) {
sendResponse(client, { status: status.user.ALREADY_FRIEND }, packet)
return
}
FriendRequestsModel.findOne({
fromUserId: fromUserSession.userId,
toUserId: toUser._id
})
.then(result => {
if (result !== null) {
sendResponse(client, { status: status.user.FRIEND_REQUEST_EXISTED }, packet)
return
}
FriendRequestsModel.create({
fromUserId: fromUserSession.userId,
toUserId: toUser._id
})
.then(() => {
sendResponse(client, { status: status.OK }, packet)
SessionModel.findOne({ userId: toUser._id })
.then(session => {
if (session !== null) {
const toClient = clients.get(session.ip, session.controlPort)
request.sendFriendRequests(toClient)
}
})
})
})
})
})
Expand All @@ -109,13 +130,19 @@ function deleteFriend (packet, client) {
sendResponse(client, { status: status.ACCESS_DENIED }, packet)
return
}
UserModel.findOne({ _id: session.userId })
const p1 = UserModel.findOne({ _id: session.userId })
.then(data => {
const newFriends = data.friends.filter(friend => friend !== userId)
UserModel.updateOne({ _id: session.userId }, { $set: { friends: newFriends } })
.then(() => {
sendResponse(client, { status: status.OK }, packet)
})
return UserModel.updateOne({ _id: session.userId }, { $set: { friends: newFriends } })
})
const p2 = UserModel.findOne({ _id: userId })
.then(data => {
const newFriends = data.friends.filter(friend => friend !== session.userId)
return UserModel.updateOne({ _id: userId }, { $set: { friends: newFriends } })
})
Promise.all([p1, p2])
.then(() => {
sendResponse(client, { status: status.OK }, packet)
})
})
.catch(err => {
Expand Down
10 changes: 5 additions & 5 deletions src/response/offlineTransfer.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ function queryOfflineTransfers (packet, client) {
await Promise.all(offlineTransfers.map(offlineTransfer => {
if (offlineTransfer.deadline.getTime() < new Date().getTime()) {
OfflineTransferModel.deleteOne({ _id: offlineTransfer._id })
.then(offlineTransferRequest => {
console.log('Offline transfer request: ' + offlineTransferRequest._id + ' is already out of date')
.then(() => {
logger.debug(`Deleted expired offline transfer ${offlineTransfer._id}`)
})
return
}
Expand Down Expand Up @@ -97,10 +97,10 @@ function answerOfflineTransfer (packet, client) {
return
}
if (transferRequest.deadline.getTime() < new Date().getTime()) {
sendResponse(client, { status: status.NOT_FOUND }, packet)
OfflineTransferModel.deleteOne({ _id: transferRequest._id })
.then(offlineTransferRequest => {
console.log('Offline transfer request: ' + offlineTransferRequest._id + ' is already out of date')
sendResponse(client, { status: status.NOT_FOUND }, packet)
.then(() => {
logger.debug(`Deleted expired offline transfer ${transferRequest._id}`)
})
return
}
Expand Down
29 changes: 29 additions & 0 deletions src/response/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const { logger } = require('../logger')
const crypto = require('crypto')
const request = require('../request')
const { assert } = require('console')
const net = require('net')

/**
* Register as a user
Expand Down Expand Up @@ -76,6 +77,7 @@ function login (packet, client) {
.then(() => { // Send all friend requests of current user to client
request.sendFriendRequests(client)
request.sendOfflineTransfers(client)
testNAT(client.remoteAddress, transferPort, data._id)
})
UserModel.updateOne({ _id: user._id }, { $set: { lastAliveTime: new Date() } }).then(() => {})
})
Expand Down Expand Up @@ -231,6 +233,7 @@ function resumeSession (packet, client) {
sendResponse(client, { status: status.OK }, packet)
request.sendFriendRequests(client)
request.sendOfflineTransfers(client)
testNAT(client.remoteAddress, transferPort, session._id)
})
})
.catch(err => {
Expand All @@ -250,6 +253,7 @@ function updateTransferPort (packet, client) {
SessionModel.updateOne(session, { $set: { transferPort: port } })
.then(() => {
sendResponse(client, { status: status.OK }, packet)
testNAT(client.remoteAddress, port, session._id)
})
})
.catch(err => {
Expand All @@ -258,6 +262,31 @@ function updateTransferPort (packet, client) {
})
}

function testNAT (host, port, _id) {
if (typeof port === 'undefined' || port === null || port === 0) return
const setNAT = (status) => {
SessionModel.updateOne({ _id }, { $set: { isNAT: status } })
.then(() => {
logger.debug(`Updated session ${_id}'s isNAT to ${status}`)
})
}
const socket = net.createConnection(port, host)
const timeout = setTimeout(() => {
socket.destroy()
setNAT(true)
}, 5000)
socket.on('error', () => {
clearTimeout(timeout)
socket.destroy()
setNAT(true)
})
socket.on('connect', () => {
clearTimeout(timeout)
socket.end()
setNAT(false)
})
}

module.exports = {
register,
login,
Expand Down
5 changes: 4 additions & 1 deletion src/status.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ module.exports = {
user: {
DUPLICATED_USERNAME: 1,
WRONG_USERNAME_OR_PASSWORD: 2,
NO_SUCH_USER: 3
NO_SUCH_USER: 3,
CANNOT_OPERATE_SELF: 4,
FRIEND_REQUEST_EXISTED: 5,
ALREADY_FRIEND: 6
},
transfer: {
REQUEST: 1,
Expand Down

0 comments on commit 11cbb89

Please sign in to comment.