Refacto
This commit is contained in:
76
src/fivemserver/get_server_token.py
Normal file
76
src/fivemserver/get_server_token.py
Normal file
@@ -0,0 +1,76 @@
|
||||
import base64
|
||||
import requests
|
||||
from cryptography.hazmat.primitives import serialization, hashes
|
||||
from cryptography.hazmat.primitives.asymmetric import ec
|
||||
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
|
||||
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
||||
|
||||
from config.constants import Urls
|
||||
|
||||
class GetServerTokenForDiscord:
|
||||
derived_key: bytes | None = None
|
||||
|
||||
@staticmethod
|
||||
def authenticate(server = Urls.API_URL.value):
|
||||
|
||||
if server is None:
|
||||
server = Urls.API_URL.value
|
||||
# ==========================
|
||||
# Génération clé ECDH client
|
||||
# ==========================
|
||||
client_private = ec.generate_private_key(ec.SECP256R1())
|
||||
client_public = client_private.public_key()
|
||||
|
||||
client_pub_pem = client_public.public_bytes(
|
||||
encoding=serialization.Encoding.PEM,
|
||||
format=serialization.PublicFormat.SubjectPublicKeyInfo
|
||||
)
|
||||
|
||||
# ==========================
|
||||
# AUTH
|
||||
# ==========================
|
||||
auth = requests.post(server + "/api_v2/auth", verify=False, json={
|
||||
"client_pub": base64.b64encode(client_pub_pem).decode()
|
||||
}).json()
|
||||
|
||||
server_pub = serialization.load_pem_public_key(
|
||||
base64.b64decode(auth["server_pub"])
|
||||
)
|
||||
|
||||
shared_key = client_private.exchange(ec.ECDH(), server_pub)
|
||||
|
||||
GetServerTokenForDiscord.derived_key = HKDF(
|
||||
algorithm=hashes.SHA256(),
|
||||
length=32,
|
||||
salt=None,
|
||||
info=b"fivem-private-server"
|
||||
).derive(shared_key)
|
||||
|
||||
return auth["session_id"]
|
||||
|
||||
@staticmethod
|
||||
def get_token(session_id: bytes, server = Urls.API_URL.value):
|
||||
# ==========================
|
||||
# DISCORD TOKEN
|
||||
# ==========================
|
||||
if server is None:
|
||||
server = Urls.API_URL.value
|
||||
download = requests.post(server + "/api_v2/tkn_auth", verify=False, headers={
|
||||
"x-session-id": session_id
|
||||
}).json()
|
||||
|
||||
nonce = base64.b64decode(download["nonce"])
|
||||
encrypted_data = base64.b64decode(download["data"])
|
||||
|
||||
aesgcm = AESGCM(GetServerTokenForDiscord.derived_key) # type: ignore[arg-type]
|
||||
return aesgcm.decrypt(nonce, encrypted_data, None)
|
||||
|
||||
@staticmethod
|
||||
def register_discord_user(user_id: str, server = Urls.API_URL.value) -> str:
|
||||
if server is None:
|
||||
server = Urls.API_URL.value
|
||||
registeredId = requests.post(server + "/api_v2/connection/register", verify=False, json={
|
||||
"x-session-id": user_id
|
||||
}).json()
|
||||
|
||||
return registeredId["discord_id"]
|
||||
23
src/fivemserver/whitelistmanager.py
Normal file
23
src/fivemserver/whitelistmanager.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import requests
|
||||
from urllib3 import disable_warnings
|
||||
from urllib3.exceptions import InsecureRequestWarning
|
||||
|
||||
# Supress only InsecureRequestWarning
|
||||
disable_warnings(InsecureRequestWarning)
|
||||
|
||||
WHITELIST_URL_ENDPOINT = f'iswhitelist/'
|
||||
|
||||
class WhiteList:
|
||||
@staticmethod
|
||||
def checkwhitelist(url, discord_user_id: str) -> bool:
|
||||
print('🗒️ Vérification de la whitelist...')
|
||||
|
||||
response = requests.get(url + WHITELIST_URL_ENDPOINT + discord_user_id, verify=False)
|
||||
api_data = response.json()
|
||||
|
||||
if api_data['whitelisted']:
|
||||
print("👍 Vous êtes en whitelist")
|
||||
return True
|
||||
else:
|
||||
print('🙅♂️ Désole mais vous n\'êtes pas whitelisté sur le serveur.')
|
||||
return False
|
||||
Reference in New Issue
Block a user