Basit whitelist sistemi

leqions

Üye
Üye
Mesaj
74
Çözümler
4
Beğeni
88
Puan
669
Ticaret Puanı
0
Merhaba arkadaşlar. Basit bir whitelist sistemiyle karşınızdayım. Aslında oyun içinde bir şeylerin test edilmesi gerektiğinde sadece GM'lerin giriş yapmasına izin verecek bir şey düşünmüştüm, sonra daha basit olsun diye hesap IDsi ile kontrol sağlayayım dedim. Bir Metin2 sunucusunda whitelist olayı ne kadar lüzumlu olur, ne sebeple kullanılır bilemiyorum. Fakat hazır yapmışken belki birinin işine yarar diye paylaşıyorum :)

NOT: Windows Altyapı Server Files üzerinde çalıştırdım. BSD için ufak değişiklikler yapılması gerekebilir.

Oyuna giriş yapılırken Whitelist tablosunda girilen ID'yi arar, tabloda yoksa "Hesabınız whitelist'te tanımlı değil." uyarısı verir ve girişe engel olur.

whitelist.sql:
/*
 Navicat Premium Data Transfer

 Source Server         : winMT2
 Source Server Type    : MySQL
 Source Server Version : 50626 (5.6.26-log)
 Source Host           : localhost:3306
 Source Schema         : common

 Target Server Type    : MySQL
 Target Server Version : 50626 (5.6.26-log)
 File Encoding         : 65001

 Date: 18/03/2024 17:30:22
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for whitelist
-- ----------------------------
DROP TABLE IF EXISTS `whitelist`;
CREATE TABLE `whitelist`  (
  `login` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;


Server / game src:
cmd.cpp
cmd.cpp:
//ACMD'lerin tanımlandığı yere bunu ekle:

#ifdef WHITELIST
ACMD(do_whitelist);
ACMD(do_add_to_whitelist);
#endif


//bu satırı bul:

{ "!RESERVED!",    NULL,            0,            POS_DEAD,    GM_IMPLEMENTOR    },

//altına bunu ekle:

#ifdef WHITELIST
    { "whitelist", do_whitelist,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
    { "addwhitelist", do_add_to_whitelist,    0,            POS_DEAD,    GM_IMPLEMENTOR    },
#endif


cmd_gm.cpp
cmd_gm.cpp:
//#include tanımlamalarının bittiği yere bunu ekle:
#ifdef WHITELIST
extern int g_whiteList;
#endif


//ACMD fonksiyonlarının tanımlandığı bölümde herhangi bir yere ekle:
// (benimki ACMD(do_pcbang_update) {} 'in altında. )

#ifdef WHITELIST
ACMD(do_whitelist)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));
    if (!*arg1)
    {
        if (ch)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /whitelist 1 veya 0");
        }
    }
    else if (std::string(arg1) != "1" && std::string(arg1) != "0")
    {
        if (ch)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /whitelist 1 veya 0");
        }
    }
    else
    {
        if (std::string(arg1) == "1")
        {
            g_whiteList = true;
            if(ch){ ch->ChatPacket(CHAT_TYPE_INFO, "Whitelist aktive edildi."); }
        }
        else if (std::string(arg1) == "0")
        {
            g_whiteList = false;
            if (ch) { ch->ChatPacket(CHAT_TYPE_INFO, "Whitelist devre disi birakildi."); }
        }
    }
}

ACMD(do_add_to_whitelist)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));
    if (!*arg1)
    {
        if (ch)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /addwhitelist KULLANICI_ID");
        }
    }
    else
    {
        const char* login = arg1;
        char szQuery[512];

        snprintf(szQuery, sizeof(szQuery), "SELECT login FROM account.account%s WHERE login='%s'", get_table_postfix(), login);

        std::unique_ptr<SQLMsg> pMsg(AccountDB::instance().DirectQuery(szQuery));

        if (pMsg->Get()->uiNumRows > 0)
        {
                snprintf(szQuery, sizeof(szQuery), "SELECT login FROM common.whitelist WHERE login='%s'", login);

                std::unique_ptr<SQLMsg> pMsg2(AccountDB::instance().DirectQuery(szQuery));
                if (pMsg2->Get()->uiNumRows > 0)
                {
                    if (ch)
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, "Bu ID zaten Whitelist'te mevcut.");
                    }
                }
                else
                {
                    snprintf(szQuery, sizeof(szQuery), "INSERT INTO common.whitelist VALUES ('%s')", login);
                    std::unique_ptr<SQLMsg> pMsg3(AccountDB::instance().DirectQuery(szQuery));
                    if (pMsg3) {
                        if (ch)
                        {
                            ch->ChatPacket(CHAT_TYPE_INFO, "ID Whitelist'e eklendi!");
                        }
                    }
                }
        }
        else
        {
            if (ch)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "Account tablosunda boyle bir ID bulunamadi.");
            }
        }

    }
}
#endif


config.cpp
config.cpp:
//#include'ların tanımlandığı yer bittikten sonra bunu ekle:
#ifdef WHITELIST
BOOL g_whiteList = false;
#endif

//sayfada bulunan en son TOKEN("...."){...} tanımlamasını bul ve hemen altına ekle:
#ifdef WHITELIST
        TOKEN("white_list")
        {
            //fprintf(stderr, "WHITELIST: %s\n", value_string);
            sys_log(0, "WHITELIST: %s\n", value_string);
            int tmp = 0;

            str_to_number(tmp, value_string);

            if (0 == tmp)
                g_whiteList = false;
            else
                g_whiteList = true;

            continue;
        }
#endif

input_login.cpp
input_login.cpp:
//#include'ların tanımlandığı yer bittikten sonra bunu ekle:

#ifdef WHITELIST
extern int g_whiteList;
#endif


//bunu bul:
void CInputLogin::LoginByKey(LPDESC d, const char * data) {...}
//ve içindeki
sys_log(0, "LOGIN_BY_KEY: %s key %u", login, pinfo->dwLoginKey);
//satırının üzerine bunu ekle:

#ifdef WHITELIST
    if (g_whiteList)
    {
        char szQuery[512];
        snprintf(szQuery, sizeof(szQuery), "SELECT login FROM common.whitelist");

        std::unique_ptr<SQLMsg> pMsg(AccountDB::instance().DirectQuery(szQuery));

        if (pMsg->Get()->uiNumRows == 0)
        {
            fprintf(stderr, "WHITELIST: Tabloda hicbir id tanimli degil veya sorgu hatasi : %s\n", szQuery);
            LoginFailure(d, "NOWLIST");
            return;
        }

        MYSQL_ROW row;

        bool found = false;

        sys_log(0, "WHITELIST: GIRIS DENEMESI: -> %s", pinfo->login);
        while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
        {
            std::string mylogin = row[0];
            if (mylogin == pinfo->login)
            {
                sys_log(0, "WHITELIST: GIRIS SAGLANDI! -> %s", pinfo->login);
                found = true;
            }
        }

        if (!found)
        {
            sys_log(0, "WHITELIST: LISTE DISI -> %s", pinfo->login);
            LoginFailure(d, "NOWLIST");
            return;
        }
    }
#endif


service.h
service.h:
//en alta bunu ekle:

#define WHITELIST

Client (pack):
locale/tr/locale_game.txt
locale/tr/locale_game.txt:
LOGIN_FAILURE_WHITELIST    Hesabınız whitelist'te tanımlı değil.

root/intrologin.py
root/intrologin.py:
#bunu bul:

self.loginFailureMsgDict={
    #....
}

#içine, en alta ekle:

            "NOWLIST"    : localeInfo.LOGIN_FAILURE_WHITELIST,


#bunu bul:
self.loginFailureFuncDict = {   ......   }

#içine, en alta ekle:
            "NOWLIST"    : self.__DisconnectAndInputPassword,

Kullanım:
Sabit olsun istiyorsanız kanalların CONFIG dosyalarında WHITE_LIST: 1 tokeniyle aktive edebilirsiniz.
Aynı zamanda oyun içinde de GM karakterle /whitelist 1 veya /whitelist 0 komutlarıyla aktive edebilir veya devre dışı bırakabilirsiniz.
Veritabanı common içinde, yukardaki sql dosyasında okuttuğumuz whitelist tablosuna istediğiniz ID'yi ekleyip oyuna giriş izni verebilirsiniz.
Oyun içinde de /addwhitelist kullanıcı_id komutuyla whitelist tablosuna ID ekleyebilirsiniz.
 
mantıklıymış eline sağlık
 
Geri
Üst