Commit a76fe295 authored by nanahira's avatar nanahira

Merge branch 'master' of ../srvpro

parents fd2bf6ea 6df616b8
Pipeline #42181 passed with stages
in 9 minutes and 15 seconds
......@@ -262,7 +262,7 @@ real_windbot_server_ip = null
long_resolve_cards = []
ReplayParser = null
athleticChecker = null
users_cache = {}
# users_cache = {}
geoip = null
dataManager = null
windbots = []
......@@ -572,25 +572,25 @@ loadLFList = (path) ->
geoip = require('geoip-country-lite')
if settings.modules.mycard.enabled
pgClient = require('pg').Client
pg_client = global.pg_client = new pgClient(settings.modules.mycard.auth_database)
pg_client.on 'error', (err) ->
log.warn "PostgreSQL ERROR: ", err
return
pg_query = pg_client.query('SELECT username, id from users')
pg_query.on 'error', (err) ->
log.warn "PostgreSQL Query ERROR: ", err
return
pg_query.on 'row', (row) ->
#log.info "load user", row.username, row.id
users_cache[row.username] = row.id
return
pg_query.on 'end', (result) ->
log.info "users loaded", result.rowCount
return
pg_client.on 'drain', pg_client.end.bind(pg_client)
log.info "loading mycard user..."
pg_client.connect()
# pgClient = require('pg').Client
# pg_client = global.pg_client = new pgClient(settings.modules.mycard.auth_database)
# pg_client.on 'error', (err) ->
# log.warn "PostgreSQL ERROR: ", err
# return
# pg_query = pg_client.query('SELECT username, id from users')
# pg_query.on 'error', (err) ->
# log.warn "PostgreSQL Query ERROR: ", err
# return
# pg_query.on 'row', (row) ->
# #log.info "load user", row.username, row.id
# users_cache[row.username] = row.id
# return
# pg_query.on 'end', (result) ->
# log.info "users loaded", result.rowCount
# return
# pg_client.on 'drain', pg_client.end.bind(pg_client)
# log.info "loading mycard user..."
# pg_client.connect()
if settings.modules.arena_mode.enabled and settings.modules.arena_mode.init_post.enabled
postData = qs.stringify({
ak: settings.modules.arena_mode.init_post.accesskey,
......@@ -2531,15 +2531,15 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
checksum += buf.readUInt8(i)
(checksum & 0xFF) == 0
create_room_with_action = (buffer, decrypted_buffer)->
create_room_with_action = (buffer)->
if client.isClosed
return
firstByte = buffer.readUInt8(1)
action = firstByte >> 4
opt0 = firstByte & 0xf
if buffer != decrypted_buffer and action in [1, 2, 4]
ygopro.stoc_die(client, '${invalid_password_unauthorized}')
return
# if buffer != decrypted_buffer and action in [1, 2, 4]
# ygopro.stoc_die(client, '${invalid_password_unauthorized}')
# return
# 1 create public room
# 2 create private room
......@@ -2648,13 +2648,13 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
decrypted_buffer = null
if id = users_cache[client.name]
secret = id % 65535 + 1
decrypted_buffer = Buffer.allocUnsafe(6)
for i in [0, 2, 4]
decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i)
if check_buffer_indentity(decrypted_buffer)
return create_room_with_action(decrypted_buffer, decrypted_buffer)
# if id = users_cache[client.name]
# secret = id % 65535 + 1
# decrypted_buffer = Buffer.allocUnsafe(6)
# for i in [0, 2, 4]
# decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i)
# if check_buffer_indentity(decrypted_buffer)
# return create_room_with_action(decrypted_buffer, decrypted_buffer)
try
userUrl = "#{settings.modules.mycard.auth_base_url}/users/#{encodeURIComponent(client.name)}.json"
......@@ -2664,8 +2664,8 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
timeout: 4000
params:
api_key: settings.modules.mycard.auth_key,
api_username: client.name,
skip_track_visit: true
# api_username: client.name,
# skip_track_visit: true
userData = userDataRes.data
#console.log userData
catch e
......@@ -2675,17 +2675,29 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
return
if client.isClosed
return
users_cache[client.name] = userData.user.id
secret = userData.user.id % 65535 + 1
# users_cache[client.name] = userData.user.id
possible_ids = [
userData.user.u16Secret,
userData.user.u16SecretPrevious,
userData.user.id, # TODO: remove this line after use u16Secret
].filter((id) -> id != null)
try_decrypt_buffer_with_id = (id) ->
secret = id % 65535 + 1
decrypted_buffer = Buffer.allocUnsafe(6)
for i in [0, 2, 4]
decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i)
if check_buffer_indentity(decrypted_buffer)
buffer = decrypted_buffer
if !check_buffer_indentity(buffer)
ygopro.stoc_die(client, '${invalid_password_checksum}')
return decrypted_buffer
return null
decrypted_buffer = null
for possible_id in possible_ids
decrypted_buffer = try_decrypt_buffer_with_id(possible_id)
if decrypted_buffer
break
if !decrypted_buffer
ygopro.stoc_die(client, '${invalid_password_unauthorized}')
return
return create_room_with_action(buffer, decrypted_buffer)
return create_room_with_action(decrypted_buffer)
else if settings.modules.challonge.enabled
if info.version != settings.version and settings.alternative_versions.includes(info.version)
......
// Generated by CoffeeScript 2.7.0
(function() {
// 标准库
var Aragami, CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_get_save_data, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_replays_and_kick, CLIENT_send_vip_status, CLIENT_set_ip, CLIENT_use_cdkey, PQueue, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, YGOProDeck, _, _async, addCallback, aragami, aragami_classes, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, concat_name, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, getRealIp, get_memory_usage, gpt_tokenizer, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, isTrustedProxy, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, moment_long_ago_string, moment_now, moment_now_string, msg_polyfill, mustache, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, toIpv4, toIpv6, url, users_cache, util, utility, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib;
var Aragami, CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_get_save_data, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_replays_and_kick, CLIENT_send_vip_status, CLIENT_set_ip, CLIENT_use_cdkey, PQueue, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, YGOProDeck, _, _async, addCallback, aragami, aragami_classes, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, concat_name, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, getRealIp, get_memory_usage, gpt_tokenizer, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, isTrustedProxy, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, moment_long_ago_string, moment_now, moment_now_string, msg_polyfill, mustache, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, toIpv4, toIpv6, url, util, utility, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib;
net = require('net');
......@@ -323,8 +323,7 @@
athleticChecker = null;
users_cache = {};
// users_cache = {}
geoip = null;
dataManager = null;
......@@ -391,7 +390,7 @@
};
init = async function() {
var AthleticChecker, Challonge, DataManager, chat_color, config, cppversion, defaultConfig, default_data, dirPath, dns, e, expansions, get_rooms_count, http_server, https, httpsOptions, https_server, imported, j, key, keysFromEnv, l, len, len1, len2, len3, m, main_http_server, mkdirList, n, neosHttpServer, neosWsServer, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, postData, ref, settingKey, val, valFromDefault, vip_info, ws;
var AthleticChecker, Challonge, DataManager, chat_color, config, cppversion, defaultConfig, default_data, dirPath, dns, e, expansions, get_rooms_count, http_server, https, httpsOptions, https_server, imported, j, key, keysFromEnv, l, len, len1, len2, len3, m, main_http_server, mkdirList, n, neosHttpServer, neosWsServer, plugin_filename, plugin_list, plugin_path, postData, ref, settingKey, val, valFromDefault, vip_info, ws;
log.info('Reading config.');
await createDirectoryIfNotExists("./config");
await importOldConfig();
......@@ -724,25 +723,25 @@
geoip = require('geoip-country-lite');
}
if (settings.modules.mycard.enabled) {
pgClient = require('pg').Client;
pg_client = global.pg_client = new pgClient(settings.modules.mycard.auth_database);
pg_client.on('error', function(err) {
log.warn("PostgreSQL ERROR: ", err);
});
pg_query = pg_client.query('SELECT username, id from users');
pg_query.on('error', function(err) {
log.warn("PostgreSQL Query ERROR: ", err);
});
pg_query.on('row', function(row) {
//log.info "load user", row.username, row.id
users_cache[row.username] = row.id;
});
pg_query.on('end', function(result) {
log.info("users loaded", result.rowCount);
});
pg_client.on('drain', pg_client.end.bind(pg_client));
log.info("loading mycard user...");
pg_client.connect();
// pgClient = require('pg').Client
// pg_client = global.pg_client = new pgClient(settings.modules.mycard.auth_database)
// pg_client.on 'error', (err) ->
// log.warn "PostgreSQL ERROR: ", err
// return
// pg_query = pg_client.query('SELECT username, id from users')
// pg_query.on 'error', (err) ->
// log.warn "PostgreSQL Query ERROR: ", err
// return
// pg_query.on 'row', (row) ->
// #log.info "load user", row.username, row.id
// users_cache[row.username] = row.id
// return
// pg_query.on 'end', (result) ->
// log.info "users loaded", result.rowCount
// return
// pg_client.on 'drain', pg_client.end.bind(pg_client)
// log.info "loading mycard user..."
// pg_client.connect()
if (settings.modules.arena_mode.enabled && settings.modules.arena_mode.init_post.enabled) {
postData = qs.stringify({
ak: settings.modules.arena_mode.init_post.accesskey,
......@@ -3156,7 +3155,7 @@
});
ygopro.ctos_follow('JOIN_GAME', true, async function(buffer, info, client, server, datas) {
var available_logs, check_buffer_indentity, check_version, create_room_name, create_room_with_action, decrypted_buffer, duelLog, e, exactBan, i, id, index, j, l, len, len1, len2, len3, m, matching_match, matching_participant, n, polyfill_version, pre_room, recover_match, ref, ref1, replay, replay_id, replays, room, secret, struct, tournament_data, userData, userDataRes, userUrl;
var available_logs, check_buffer_indentity, check_version, create_room_name, create_room_with_action, decrypted_buffer, duelLog, e, exactBan, index, j, l, len, len1, len2, m, matching_match, matching_participant, polyfill_version, possible_id, possible_ids, pre_room, recover_match, replay, replay_id, replays, room, struct, tournament_data, try_decrypt_buffer_with_id, userData, userDataRes, userUrl;
check_version = async function() {
var bad_version, blocker_obj, clean_blocker, client_key;
bad_version = function(msg) {
......@@ -3314,7 +3313,7 @@
}
return (checksum & 0xFF) === 0;
};
create_room_with_action = async function(buffer, decrypted_buffer) {
create_room_with_action = async function(buffer) {
var action, e, firstByte, len2, m, matchPermitRes, match_permit, name, opt0, opt1, opt2, opt3, options, player, ref, ref1, room, room_title, title;
if (client.isClosed) {
return;
......@@ -3322,10 +3321,10 @@
firstByte = buffer.readUInt8(1);
action = firstByte >> 4;
opt0 = firstByte & 0xf;
if (buffer !== decrypted_buffer && (action === 1 || action === 2 || action === 4)) {
ygopro.stoc_die(client, '${invalid_password_unauthorized}');
return;
}
// if buffer != decrypted_buffer and action in [1, 2, 4]
// ygopro.stoc_die(client, '${invalid_password_unauthorized}')
// return
// 1 create public room
// 2 create private room
// 3 join room by id
......@@ -3459,30 +3458,25 @@
}
};
decrypted_buffer = null;
if (id = users_cache[client.name]) {
secret = id % 65535 + 1;
decrypted_buffer = Buffer.allocUnsafe(6);
ref = [0, 2, 4];
for (m = 0, len2 = ref.length; m < len2; m++) {
i = ref[m];
decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i);
}
if (check_buffer_indentity(decrypted_buffer)) {
return create_room_with_action(decrypted_buffer, decrypted_buffer);
}
}
try {
// if id = users_cache[client.name]
// secret = id % 65535 + 1
// decrypted_buffer = Buffer.allocUnsafe(6)
// for i in [0, 2, 4]
// decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i)
// if check_buffer_indentity(decrypted_buffer)
// return create_room_with_action(decrypted_buffer, decrypted_buffer)
userUrl = `${settings.modules.mycard.auth_base_url}/users/${encodeURIComponent(client.name)}.json`;
//console.log(userUrl)
userDataRes = (await axios.get(userUrl, {
responseType: 'json',
timeout: 4000,
params: {
api_key: settings.modules.mycard.auth_key,
api_username: client.name,
skip_track_visit: true
api_key: settings.modules.mycard.auth_key
}
}));
// api_username: client.name,
// skip_track_visit: true
userData = userDataRes.data;
} catch (error1) {
//console.log userData
......@@ -3496,22 +3490,41 @@
if (client.isClosed) {
return;
}
users_cache[client.name] = userData.user.id;
secret = userData.user.id % 65535 + 1;
// users_cache[client.name] = userData.user.id
possible_ids = [
userData.user.u16Secret,
userData.user.u16SecretPrevious,
userData.user.id // TODO: remove this line after use u16Secret
].filter(function(id) {
return id !== null;
});
try_decrypt_buffer_with_id = function(id) {
var i, len2, m, ref, secret;
secret = id % 65535 + 1;
decrypted_buffer = Buffer.allocUnsafe(6);
ref1 = [0, 2, 4];
for (n = 0, len3 = ref1.length; n < len3; n++) {
i = ref1[n];
ref = [0, 2, 4];
for (m = 0, len2 = ref.length; m < len2; m++) {
i = ref[m];
decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i);
}
if (check_buffer_indentity(decrypted_buffer)) {
buffer = decrypted_buffer;
return decrypted_buffer;
}
if (!check_buffer_indentity(buffer)) {
ygopro.stoc_die(client, '${invalid_password_checksum}');
return null;
};
decrypted_buffer = null;
for (m = 0, len2 = possible_ids.length; m < len2; m++) {
possible_id = possible_ids[m];
decrypted_buffer = try_decrypt_buffer_with_id(possible_id);
if (decrypted_buffer) {
break;
}
}
if (!decrypted_buffer) {
ygopro.stoc_die(client, '${invalid_password_unauthorized}');
return;
}
return create_room_with_action(buffer, decrypted_buffer);
return create_room_with_action(decrypted_buffer);
} else if (settings.modules.challonge.enabled) {
if (info.version !== settings.version && settings.alternative_versions.includes(info.version)) {
info.version = settings.version;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment