diff --git a/game-server/app/servers/connector/filter/global.ts b/game-server/app/servers/connector/filter/global.ts index b9de897d3..b0c832adb 100644 --- a/game-server/app/servers/connector/filter/global.ts +++ b/game-server/app/servers/connector/filter/global.ts @@ -1,8 +1,8 @@ -import {Application, RouteRecord, FrontendOrBackendSession, HandlerCallback, pinus} from "pinus"; +import {Application, RouteRecord, FrontendOrBackendSession, HandlerCallback, pinus, FrontendSession} from "pinus"; // import { checkEvent } from '../../../services/eventSercive'; import { refresh } from '../../../services/refreshService'; import { checkPrivateChat, checkGuildChat, checkOtherChat, checkRoleName, checkGuildName } from "../../../services/sdkService"; -import { resResult, checkWhiteListWithUid, genCode } from "../../../pubUtils/util"; +import { resResult, checkWhiteList, genCode } from "../../../pubUtils/util"; import { BLOCK_TYPE, CHANNEL_PREFIX, MSG_TYPE, STATUS } from "../../../consts"; import { UserModel } from "../../../db/User"; import { SERVER_DEBUG_MODE } from "../../../pubUtils/dicParam"; @@ -21,6 +21,8 @@ Filter.prototype.before = async function (routeRecord: RouteRecord, msg: any, se const sid: string = session.get('sid'); const roleId: string = session.get('roleId'); const uid: number = session.get('userid'); + const ip: string = session.get('ip'); + console.log('*********** global before ip', ip) let guildCode = session.get('guildCode'); let blockType = session.get('blockType'); if(blockType == BLOCK_TYPE.BLOCK) return next(new Error(), resResult(STATUS.BLOCKED)); @@ -36,15 +38,14 @@ Filter.prototype.before = async function (routeRecord: RouteRecord, msg: any, se } } - session.push('teamCode', () => {}); if(sid) { const mainten = getServerMainten(serverId); - console.log('***** maintenServers', mainten) if(mainten) { // 该服务器维护 if(mainten.startTime > nowSeconds() || mainten.endTime < nowSeconds()) return next(null) - let isWhiteList = await checkWhiteListWithUid(uid); + + let isWhiteList = await checkWhiteList(this.app.get('env'), ip, uid, serverId); if(isWhiteList) return next(null); pinus.app.get('channelService').pushMessageByUids('onServerMaintenance', resResult(STATUS.SERVER_MAINTENANCE), [{ uid: roleId, sid }]); diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index b6617a3a0..21cc3eec2 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -120,6 +120,8 @@ export class EntryHandler { async addSession(role: RoleType, session: FrontendSession) { const self = this; + let ip = session.remoteAddress.ip.replace('::ffff:', ''); + await session.abind(role.roleId); session.set('userid', role.userInfo.uid); session.set('uid', role.roleId); @@ -132,6 +134,7 @@ export class EntryHandler { session.set('sid', self.app.get('serverId')); session.set('serverId', role.serverId); session.set('guildCode', role.guildCode); + session.set('ip', ip); session.push('userid', () => { }); session.push('sid', () => { }); session.push('roleId', () => { }); @@ -141,6 +144,7 @@ export class EntryHandler { session.push('updatedMailAt', () => { }); session.push('guildCode', () => { }); session.push('blockType', () => { }); + session.push('ip', () => { }); // console.log(role.guildCode) // session.push('rid', function (err) { // if (err) { diff --git a/shared/db/WhiteList.ts b/shared/db/WhiteList.ts index a91c3cc97..ed1e4c012 100644 --- a/shared/db/WhiteList.ts +++ b/shared/db/WhiteList.ts @@ -1,22 +1,30 @@ import BaseModel from './BaseModel'; import { prop, DocumentType, getModelForClass } from '@typegoose/typegoose'; -import { WHITE_LIST_TYPE } from '../consts'; export default class WhiteList extends BaseModel { - @prop({ required: true, enum: WHITE_LIST_TYPE }) - type: WHITE_LIST_TYPE; // 区号 + @prop({ required: true }) + regionId: number; // 大区区号 @prop({ required: true }) - str: string; // ip或手机号 + env: string; // 环境变量 - public static async checkIp(ip: string) { - const rec: WhiteListModelType = await WhiteListModel.findOne({ type: WHITE_LIST_TYPE.IP, str: ip }).lean(); + @prop({ required: true }) + ip: string; // ip + + @prop({ required: true }) + serverId: number; // 小区id + + @prop({ required: true }) + uid: number; // 玩家uid + + public static async checkIp(env: string, ip: string) { + const rec = await WhiteListModel.exists({ env, ip }); return rec; } - public static async checkTel(tel: string) { - const rec: WhiteListModelType = await WhiteListModel.findOne({ type: WHITE_LIST_TYPE.TEL, str: tel }).lean(); + public static async checkUid(env: string, serverId: number, uid: number) { + const rec = await WhiteListModel.exists({ env, serverId, uid }); return rec; } } diff --git a/shared/domain/backEndField/params.ts b/shared/domain/backEndField/params.ts index 028491e44..b78f92049 100644 --- a/shared/domain/backEndField/params.ts +++ b/shared/domain/backEndField/params.ts @@ -3,7 +3,6 @@ import { isArray } from 'underscore'; import GMMail from "../../db/GMMail"; import ServerStategy from "../../db/ServerStategy"; import { RegionType } from "../../db/Region"; -import { nowSeconds } from "../../pubUtils/timeUtil"; export class UpdateMailParams { hasGoods: boolean = false; // 是否有道具 diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index 191b8a1af..54ebd39f9 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -11,7 +11,6 @@ import { findIndex } from 'underscore'; import { getTimeFunM } from './timeUtil'; import { Floor } from '../domain/activityField/gachaField'; import { WhiteListModel } from '../db/WhiteList'; -import { UserModel } from '../db/User'; const randomName = require("chinese-random-name"); const moment = require('moment'); const crypto = require('crypto'); @@ -659,20 +658,13 @@ export function getFloorStatus(gachaId: number, floor: Floor[]) { }); } -export async function checkWhiteListWithUid(uid: number) { - let user = await UserModel.findUserByUid(uid); - if(!user) return false; - let { tel, ip } = user; - return await checkWhiteList(tel, ip); -} - -export async function checkWhiteList(tel: string, ip: string) { - if(tel) { - let result = await WhiteListModel.checkTel(tel); +export async function checkWhiteList(env: string, ip: string, uid: number, serverId: number) { + if(ip) { + let result = await WhiteListModel.checkIp(env, ip); if(!!result) return true; } - if(ip) { - let result = await WhiteListModel.checkIp(ip); + if(uid && serverId) { + let result = await WhiteListModel.checkUid(env, serverId, uid); if(!!result) return true; } return false diff --git a/web-server/app/middleware/checkMainten.ts b/web-server/app/middleware/checkMainten.ts index debf1f4d6..ab60d479d 100644 --- a/web-server/app/middleware/checkMainten.ts +++ b/web-server/app/middleware/checkMainten.ts @@ -9,7 +9,7 @@ module.exports = () => { if (serverId) { let server = await ServerlistModel.findByServerId(serverId); if (server && server.maintenance && server.maintenance.isOpen && server.maintenance.startTime < nowSeconds() && server.maintenance.endTime > nowSeconds()) { - let isWhiteList = await checkWhiteList(ctx.tel, ctx.request.ip); + let isWhiteList = await checkWhiteList(ctx.app.config.realEnv, ctx.clientIp, ctx.uid, serverId); if (isWhiteList) { await next(); } else { diff --git a/web-server/app/middleware/getIp.ts b/web-server/app/middleware/getIp.ts new file mode 100644 index 000000000..657ef2856 --- /dev/null +++ b/web-server/app/middleware/getIp.ts @@ -0,0 +1,12 @@ +import { Context } from 'egg'; + +module.exports = () => { + return async function parmsDecode(ctx: Context, next) { + + let xRealIp = typeof ctx.header['x-real-ip'] == 'string'? ctx.header['x-real-ip']: ctx.header['x-real-ip'][0]; + ctx.clientIp = xRealIp||ctx.request.ip; + console.log('*****', ctx.clientIp); + await next(); + }; +}; + diff --git a/web-server/app/middleware/tokenParser.ts b/web-server/app/middleware/tokenParser.ts index 3b0aa1120..2eb4a915e 100644 --- a/web-server/app/middleware/tokenParser.ts +++ b/web-server/app/middleware/tokenParser.ts @@ -3,6 +3,7 @@ import { UserModel } from '@db/User'; module.exports = () => { return async function tokenParser(ctx, next) { + if (!ctx.request.body || !ctx.request.body.token) { console.error('token not found'); ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); diff --git a/web-server/app/router.ts b/web-server/app/router.ts index c4a677f17..5594b7d2e 100644 --- a/web-server/app/router.ts +++ b/web-server/app/router.ts @@ -2,6 +2,7 @@ import { Application } from 'egg'; export default (app: Application) => { const { controller, router } = app; + const tokenParser = app.middleware.tokenParser(); const checkMainten = app.middleware.checkMainten(); router.get('/dev', controller.home.dev); diff --git a/web-server/app/service/Auth.ts b/web-server/app/service/Auth.ts index 1c7f3e857..5191f2e4b 100644 --- a/web-server/app/service/Auth.ts +++ b/web-server/app/service/Auth.ts @@ -29,7 +29,6 @@ export default class Auth extends Service { public async deviceLogin(isGuest: boolean, token: string, deviceId: string, platform: string, pkgName: string, serverType: string, getuiCID: string) { const ctx = this.ctx; - const ip = ctx.request.ip; let user = await UserModel.findUserByToken(token); @@ -46,7 +45,7 @@ export default class Auth extends Service { }); } else { - user = await UserModel.createUser(isGuest, tel, token, platform, pkgName, serverType, deviceId, 0, ip); + user = await UserModel.createUser(isGuest, tel, token, platform, pkgName, serverType, deviceId, 0, ctx.clientIp); if (getuiCID) {//更新个推cid await UserModel.updateGetuiCID(tel, getuiCID); } @@ -66,7 +65,7 @@ export default class Auth extends Service { } } else { const token = ctx.service.utils.generateStr(256); - user = await UserModel.updateToken(user.tel, token, deviceId, ip); + user = await UserModel.updateToken(user.tel, token, deviceId, ctx.clientIp); if (getuiCID) {//更新个推cid await UserModel.updateGetuiCID(user.tel, getuiCID); } @@ -188,7 +187,6 @@ export default class Auth extends Service { */ public async smsLogin(tel: string, deviceId: string, code: string, platform: string, pkgName: string, serverType: string, getuiCID: string) { const ctx = this.ctx; - const ip = ctx.request.ip; // 参数检查 const telVerify = this.checkTelNo(tel); if (telVerify.status !== 0) { @@ -218,7 +216,7 @@ export default class Auth extends Service { // 用户注册登录 const token = ctx.service.utils.generateStr(256); - const user = await UserModel.createOrUpdate(false, tel, token, platform, pkgName, serverType, deviceId, ip); + const user = await UserModel.createOrUpdate(false, tel, token, platform, pkgName, serverType, deviceId, ctx.clientIp); if (getuiCID) {//更新个推cid await UserModel.updateGetuiCID(tel, getuiCID); } @@ -403,7 +401,6 @@ export default class Auth extends Service { const { channelType, pst, clientId, deviceId, platform, platformAppid, childGameId, pkgName, serverType, getuiCID } = params; const ctx = this.ctx; - const ip = ctx.request.ip; let requestResult = await loginValidata(channelType, { clientId, pst, platformAppid, childGameId }); if(!requestResult) return this.ctx.service.utils.resResult(STATUS.CHANNEL_ERR); @@ -416,7 +413,7 @@ export default class Auth extends Service { const token = ctx.service.utils.generateStr(256); let user = await UserModel.createOrUpdateChannelUser(channelId, channelType, { ...requestResult.data, childGameId, platformAppid - }, token, platform, pkgName, serverType, deviceId, ip); + }, token, platform, pkgName, serverType, deviceId, ctx.clientIp); if (getuiCID) {//更新个推cid await UserModel.updateGetuiCIDByChannel(channelId, getuiCID); } diff --git a/web-server/app/service/Sdk.ts b/web-server/app/service/Sdk.ts index a831db5ab..1f4c4b69f 100644 --- a/web-server/app/service/Sdk.ts +++ b/web-server/app/service/Sdk.ts @@ -29,14 +29,12 @@ export default class Sdk extends Service { public async pay37Callback(params: PayCallback37Data) { const { ctx } = this; const { app } = ctx; - let ip = typeof ctx.header['x-real-ip'] == 'string'? ctx.header['x-real-ip']: ctx.header['x-real-ip'][0]; - console.log('*****pay37Callback', ip) let checkResult = this.check37Sign(params); if(!checkResult) return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.MD5_ERR, ''); console.log('*****pay37Callback check sign ok') - if(gameData.whiteip.indexOf(ip) == -1) { + if(gameData.whiteip.indexOf(ctx.clientIp) == -1) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.IP_LIMIT, ''); } @@ -95,9 +93,6 @@ export default class Sdk extends Service { } public treatRoleOrGuildNameValidate(params: RoleNameCallBackParam|GuildNameCallBackParam|GetGuildInfoByUserParam) { - const { ctx } = this; - let ip = ctx.header['x-real-ip']; - console.log('*****', ip) if(!params.checkParams()) return SDK_37_TREAT_CODE.WRONG_PARAMS; diff --git a/web-server/config/config.default.ts b/web-server/config/config.default.ts index 2ff815dcb..f8964e79f 100644 --- a/web-server/config/config.default.ts +++ b/web-server/config/config.default.ts @@ -18,7 +18,7 @@ export default (appInfo: EggAppInfo) => { allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH', }; // add your egg config in here - config.middleware = [ 'parmsDecode' ]; + config.middleware = [ 'parmsDecode', 'getIp' ]; config.mongoose = { url: 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098', // 内网 diff --git a/web-server/package.json b/web-server/package.json index 59afd8fcd..b32eae575 100644 --- a/web-server/package.json +++ b/web-server/package.json @@ -26,7 +26,8 @@ "distribute": "cross-env EGG_SERVER_ENV=distribute npm run dev", "lylocal": "cross-env EGG_SERVER_ENV=lylocal npm run dev", "alpha": "cross-env EGG_SERVER_ENV=alpha npm run dev", - "stable": "cross-env EGG_SERVER_ENV=stable npm run dev" + "stable": "cross-env EGG_SERVER_ENV=stable npm run dev", + "deve": "cross-env EGG_SERVER_ENV=dev npm run dev" }, "dependencies": { "@types/underscore": "^1.11.3", diff --git a/web-server/typings/app/middleware/index.d.ts b/web-server/typings/app/middleware/index.d.ts index f795f5782..557b17ea3 100644 --- a/web-server/typings/app/middleware/index.d.ts +++ b/web-server/typings/app/middleware/index.d.ts @@ -3,6 +3,7 @@ import 'egg'; import ExportCheckMainten from '../../../app/middleware/checkMainten'; +import ExportGetIp from '../../../app/middleware/getIp'; import ExportGmTokenParser from '../../../app/middleware/gmTokenParser'; import ExportParmsDecode from '../../../app/middleware/parmsDecode'; import ExportTokenParser from '../../../app/middleware/tokenParser'; @@ -10,6 +11,7 @@ import ExportTokenParser from '../../../app/middleware/tokenParser'; declare module 'egg' { interface IMiddleware { checkMainten: typeof ExportCheckMainten; + getIp: typeof ExportGetIp; gmTokenParser: typeof ExportGmTokenParser; parmsDecode: typeof ExportParmsDecode; tokenParser: typeof ExportTokenParser;