343 lines
10 KiB
PHP
343 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* @author Amin Mahmoudi (MasterkinG)
|
|
* @copyright Copyright (c) 2019 - 2022, MsaterkinG32 Team, Inc. (https://masterking32.com)
|
|
* @link https://masterking32.com
|
|
* @Description : It's not masterking32 framework !
|
|
**/
|
|
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\PHPMailer\Exception;
|
|
|
|
$error_msg = "";
|
|
$success_msg = "";
|
|
|
|
function getIP()
|
|
{
|
|
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
|
|
//ip from share internet
|
|
$ip = $_SERVER['HTTP_CLIENT_IP'];
|
|
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
|
|
//ip pass from proxy
|
|
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
|
|
} else {
|
|
$ip = $_SERVER['REMOTE_ADDR'];
|
|
}
|
|
return $ip;
|
|
}
|
|
|
|
function get_config($name)
|
|
{
|
|
global $config;
|
|
if (!empty($name)) {
|
|
if (isset($config[$name])) {
|
|
return $config[$name];
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function error_msg($input = false)
|
|
{
|
|
global $error_error;
|
|
if (!empty($error_error)) {
|
|
echo "<p class=\"alert alert-danger\">$error_error</p>";
|
|
} elseif (!empty($input)) {
|
|
$error_error = $input;
|
|
}
|
|
}
|
|
|
|
function success_msg($input = false)
|
|
{
|
|
global $success_msg;
|
|
if (!empty($success_msg)) {
|
|
echo "<p class=\"alert alert-success\">$success_msg</p>";
|
|
} elseif (!empty($input)) {
|
|
$success_msg = $input;
|
|
}
|
|
}
|
|
|
|
function GetRaceID($race)
|
|
{
|
|
switch ($race) {
|
|
case "HUMAN":
|
|
return 1;
|
|
case "ORC":
|
|
return 2;
|
|
case "DWARF":
|
|
return 3;
|
|
case "NIGHTELF":
|
|
return 4;
|
|
case "SCOURGE":
|
|
return 5;
|
|
case "TAUREN":
|
|
return 6;
|
|
case "GNOME":
|
|
return 7;
|
|
case "TROLL":
|
|
return 8;
|
|
case "BLOODELF":
|
|
return 10;
|
|
case "DRAENEI":
|
|
return 11;
|
|
default:
|
|
exit("error");
|
|
}
|
|
}
|
|
|
|
function GetClassID($class)
|
|
{
|
|
switch ($class) {
|
|
case "WARRIOR":
|
|
return 1;
|
|
case "PALADIN":
|
|
return 2;
|
|
case "HUNTER":
|
|
return 3;
|
|
case "ROGUE":
|
|
return 4;
|
|
case "PRIEST":
|
|
return 5;
|
|
case "DEATHKNIGHT":
|
|
return 6;
|
|
case "SHAMAN":
|
|
return 7;
|
|
case "MAGE":
|
|
return 8;
|
|
case "WARLOCK":
|
|
return 9;
|
|
case "DRUID":
|
|
return 11;
|
|
default:
|
|
exit("<br>YOUR CHARACTER CLASS IS NOT BLIZZLIKE FOR 3.3.5a<br>");
|
|
}
|
|
}
|
|
|
|
function get_human_time_from_sec($seconds)
|
|
{
|
|
$interval = new DateInterval("PT{$seconds}S");
|
|
$now = new DateTimeImmutable('now', new DateTimeZone('utc'));
|
|
return $now->diff($now->add($interval))->format('%a:%h:%i');
|
|
}
|
|
|
|
function send_phpmailer($email, $subject, $message)
|
|
{
|
|
try {
|
|
$mail = new PHPMailer(true);
|
|
if (get_config('debug_mode')) {
|
|
$mail->SMTPDebug = 2;
|
|
}
|
|
$mail->isSMTP();
|
|
$mail->Host = get_config('smtp_host');
|
|
$mail->SMTPAuth = get_config('smtp_auth');
|
|
$mail->Username = get_config('smtp_user');
|
|
$mail->Password = get_config('smtp_pass');
|
|
$mail->SMTPSecure = get_config('smtp_secure');
|
|
$mail->Port = get_config('smtp_port');
|
|
|
|
//Recipients
|
|
$mail->setFrom(get_config('smtp_mail'));
|
|
$mail->addAddress($email); // Add a recipient
|
|
$mail->addReplyTo(get_config('smtp_mail'));
|
|
|
|
// Content
|
|
$mail->isHTML(true);
|
|
$mail->Subject = $subject;
|
|
$mail->Body = $message;
|
|
|
|
$mail->send();
|
|
} catch (Exception $e) {
|
|
if (get_config('debug_mode')) {
|
|
echo 'Message: ' . $e->getMessage();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function generateRandomString($length = 10)
|
|
{
|
|
$characters = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
$charactersLength = strlen($characters);
|
|
$randomString = '';
|
|
for ($i = 0; $i < $length; $i++) {
|
|
$randomString .= $characters[rand(0, $charactersLength - 1)];
|
|
}
|
|
return $randomString;
|
|
}
|
|
|
|
|
|
function RemoteCommandWithSOAP($COMMAND)
|
|
{
|
|
global $soap_connection_info;
|
|
|
|
if (empty($COMMAND)) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
$conn = new SoapClient(NULL, array(
|
|
'location' => 'http://' . get_config('soap_host') . ':' . get_config('soap_port') . '/',
|
|
'uri' => get_config('soap_uri'),
|
|
'style' => get_config('soap_style'),
|
|
'login' => get_config('soap_username'),
|
|
'password' => get_config('soap_password')
|
|
));
|
|
$conn->executeCommand(new SoapParam($COMMAND, 'command'));
|
|
unset($conn);
|
|
return true;
|
|
} catch (Exception $e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function validate_hcaptcha($value)
|
|
{
|
|
try {
|
|
$data = array(
|
|
'secret' => get_config('captcha_secret'),
|
|
'response' => $_POST['h-captcha-response']
|
|
);
|
|
$verify = curl_init();
|
|
curl_setopt($verify, CURLOPT_URL, "https://hcaptcha.com/siteverify");
|
|
curl_setopt($verify, CURLOPT_POST, true);
|
|
curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
|
|
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
|
|
$response = curl_exec($verify);
|
|
$responseData = json_decode($response);
|
|
if ($responseData->success) {
|
|
return true;
|
|
}
|
|
} catch (Exception $e) {
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function validate_recaptcha($value)
|
|
{
|
|
try {
|
|
$verify = curl_init();
|
|
curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify?secret=" . get_config('captcha_secret') . "&response=" . $_POST['g-recaptcha-response']);
|
|
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
|
|
$response = curl_exec($verify);
|
|
$responseData = json_decode($response, true);
|
|
if ($responseData["success"] == true) {
|
|
return true;
|
|
}
|
|
} catch (Exception $e) {
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function captcha_validation()
|
|
{
|
|
if (empty(get_config('captcha_type')) && !empty($_POST['captcha']) && !empty($_SESSION['captcha'])) {
|
|
if (strtolower($_SESSION['captcha']) != strtolower($_POST['captcha'])) {
|
|
error_msg('Captcha is not valid.');
|
|
return false;
|
|
}
|
|
unset($_SESSION['captcha']);
|
|
} else if (!empty(get_config('captcha_type')) && get_config('captcha_type') > 2) {
|
|
return true;
|
|
} elseif (!empty(get_config('captcha_type')) && get_config('captcha_type') == 1 && !empty($_POST['h-captcha-response'])) {
|
|
if (!validate_hcaptcha($_POST['h-captcha-response'])) {
|
|
error_msg('HCaptcha is not valid.');
|
|
return false;
|
|
}
|
|
} elseif (!empty(get_config('captcha_type')) && get_config('captcha_type') == 2 && !empty($_POST['g-recaptcha-response'])) {
|
|
if (!validate_recaptcha($_POST['g-recaptcha-response'])) {
|
|
error_msg('ReCaptcha is not valid.');
|
|
return false;
|
|
}
|
|
} else {
|
|
error_msg('Captcha is required.');
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function getCaptchaJS()
|
|
{
|
|
if (!empty(get_config('captcha_type'))) {
|
|
if (get_config('captcha_type') == 1) {
|
|
return '<script src="https://hcaptcha.com/1/api.js?hl=' . get_config('captcha_language') . '" async defer></script><style>.h-captcha { display: inline-block;}</style>';
|
|
} else if (get_config('captcha_type') == 2) {
|
|
return '<script src="https://www.google.com/recaptcha/api.js?hl=' . get_config('captcha_language') . '" async defer></script><style>.g-recaptcha { display: inline-block;}</style>';
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
function GetCaptchaHTML()
|
|
{
|
|
if (!empty(get_config('captcha_type'))) {
|
|
if (get_config('captcha_type') == 1) {
|
|
return '<div class="row text-center"><div class="col-md-12 text-center"><div class="h-captcha" data-sitekey="' . get_config('captcha_key') . '" style=\'margin:10px auto\'></div></div></div>';
|
|
} else if (get_config('captcha_type') == 2) {
|
|
return '<div class="row text-center"><div class="col-md-12 text-center"><div class="g-recaptcha" data-sitekey="' . get_config('captcha_key') . '" style=\'margin:10px auto\'></div></div></div>';
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
return '<div class="input-group"><span class="input-group">Captcha</span><input type="text" class="form-control" placeholder="Captcha" name="captcha"></div><p style="text-align: center;margin-top: 10px;"><img src="' . user::$captcha->inline() . '" style="border - radius: 5px;"/></p>';
|
|
}
|
|
|
|
// Its from Trinitycore/account-creator
|
|
function calculateSRP6Verifier($username, $password, $salt)
|
|
{
|
|
// algorithm constants
|
|
$g = gmp_init(7);
|
|
$N = gmp_init('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);
|
|
|
|
// calculate first hash
|
|
$h1 = sha1(strtoupper($username . ':' . $password), TRUE);
|
|
|
|
// calculate second hash
|
|
$h2 = sha1($salt . $h1, TRUE);
|
|
|
|
// convert to integer (little-endian)
|
|
$h2 = gmp_import($h2, 1, GMP_LSW_FIRST);
|
|
|
|
// g^h2 mod N
|
|
$verifier = gmp_powm($g, $h2, $N);
|
|
|
|
// convert back to a byte array (little-endian)
|
|
$verifier = gmp_export($verifier, 1, GMP_LSW_FIRST);
|
|
|
|
// pad to 32 bytes, remember that zeros go on the end in little-endian!
|
|
$verifier = str_pad($verifier, 32, chr(0), STR_PAD_RIGHT);
|
|
|
|
// done!
|
|
return $verifier;
|
|
}
|
|
|
|
// Returns SRP6 parameters to register this username/password combination with
|
|
function getRegistrationData($username, $password)
|
|
{
|
|
// generate a random salt
|
|
$salt = random_bytes(32);
|
|
|
|
// calculate verifier using this salt
|
|
$verifier = calculateSRP6Verifier($username, $password, $salt);
|
|
|
|
// done - this is what you put in the account table!
|
|
return array($salt, $verifier);
|
|
}
|
|
|
|
//From TrinityCore/AOWOW
|
|
function verifySRP6($user, $pass, $salt, $verifier)
|
|
{
|
|
$g = gmp_init(7);
|
|
$N = gmp_init('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);
|
|
$x = gmp_import(
|
|
sha1($salt . sha1(strtoupper($user . ':' . $pass), TRUE), TRUE),
|
|
1,
|
|
GMP_LSW_FIRST
|
|
);
|
|
$v = gmp_powm($g, $x, $N);
|
|
return ($verifier === str_pad(gmp_export($v, 1, GMP_LSW_FIRST), 32, chr(0), STR_PAD_RIGHT));
|
|
} |