13 ]; $Errors = (object) [ "Username" => false, "Password" => false, "ConfirmPassword" => false, "RegistrationKey" => false, "ReCAPTCHA" => false ]; $Fields = (object) [ "Username" => "", "Password" => "", "ConfirmPassword" => "", "RegistrationKey" => "" ]; $BlacklistedASNs = [ ]; $MaximumAccounts = count(Users::GetAlternateAccounts(GetIPAddress())) >= 2; $RequestSent = false; if($_SERVER['REQUEST_METHOD'] == 'POST' && !$MaximumAccounts) { $RequestSent = true; $Fields->Username = $_POST['Username'] ?? ""; $Fields->Password = $_POST['Password'] ?? ""; $Fields->ConfirmPassword = $_POST['ConfirmPassword'] ?? ""; $Fields->RegistrationKey = $_POST['RegistrationKey'] ?? ""; if(empty($Fields->Username)) $Errors->Username = "Please enter a username"; else if(strlen($Fields->Username) < 3 || strlen($Fields->Username) > 16) $Errors->Username = "Your username can only be between three and sixteen characters long"; else if(!ctype_alnum($Fields->Username)) $Errors->Username = "Your username can only contain letters and numbers"; else { $Blacklisted = db::run( "SELECT COUNT(*) FROM namefilter WHERE (exact AND username = :name) OR (NOT exact AND :name LIKE CONCAT('%', username, '%'))", [":name" => strtolower($Fields->Username)] )->fetchColumn() > 0; if($Blacklisted) $Errors->Username = "That username is unavailable. Sorry!"; $AlreadyUsed = db::run( "SELECT COUNT(*) FROM users WHERE username = :name", [":name" => $Fields->Username] )->fetchColumn() > 0; if($AlreadyUsed) $Errors->Username = "Someone already has that username! Try choosing a different one."; } if(empty($Fields->Password)) $Errors->Password = "Please enter a password"; else if(strlen(preg_replace('/[0-9]/', "", $Fields->Password)) < 6) $Errors->Password = "Your password is too weak. Make sure it contains at least six non-numeric characters"; else if(strlen(preg_replace('/[^0-9]/', "", $Fields->Password)) < 2) $Errors->Password = "Your password is too weak. Make sure it contains at least two numbers"; if(empty($Fields->ConfirmPassword)) $Errors->ConfirmPassword = "Please confirm your password"; else if($Fields->Password != $Fields->ConfirmPassword) $Errors->ConfirmPassword = "Confirmation password does not match with your password"; if(!isset($keys[$Fields->RegistrationKey])) $Errors->RegistrationKey = "Invalid registration key"; else { $KeyUses = db::run("SELECT COUNT(*) FROM users WHERE keyUsed = :key", [":key" => $Fields->RegistrationKey])->fetchColumn(); if($KeyUses >= $keys[$Fields->RegistrationKey]) $Errors->RegistrationKey = "Invalid registration key"; } if(!VerifyReCAPTCHA()) $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again."; if(!$Errors->Username && !$Errors->Password && !$Errors->ConfirmPassword && !$Errors->RegistrationKey && !$Errors->ReCAPTCHA) { // fake error message - subtle difference to tell if its a proxy error $ASNumber = GetASNumber(GetIPAddress()); if ($ASNumber === false) { $Errors->ReCAPTCHA = "An unexpected error occurred"; } else if (in_array($ASNumber, $BlacklistedASNs)) { $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again"; } else { $IPInfo = GetIPInfo(GetIPAddress()); if ($IPInfo->proxy == "yes") $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again"; if ($IPInfo->type == "OpenVPN") $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again"; } } if(!$Errors->Username && !$Errors->Password && !$Errors->ConfirmPassword && !$Errors->RegistrationKey && !$Errors->ReCAPTCHA) { $auth = new Auth($Fields->Password); $pwhash = $auth->CreatePassword(); db::run( "INSERT INTO users (username, password, keyUsed, email, jointime, lastonline, regip, nextCurrencyStipend, status) VALUES (:name, :hash, :key, 'placeholder', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :ip, UNIX_TIMESTAMP()+86400, 'I\'m new to Polygon!')", [":name" => $Fields->Username, ":hash" => $pwhash, ":key" => $Fields->RegistrationKey, ":ip" => GetIPAddress()] ); $UserID = $pdo->lastInsertId(); db::run( "INSERT INTO ownedAssets (assetId, userId, wearing, timestamp) VALUES (162, :uid, 1, UNIX_TIMESTAMP()); INSERT INTO ownedAssets (assetId, userId, wearing, timestamp) VALUES (310, :uid, 1, UNIX_TIMESTAMP())", [":uid" => (int)$UserID] ); session::createSession($UserID); // Polygon::RequestRender("Avatar", $UserID); // this is just malwarebytes's avatar - he still has the default avatar and is banned so eh copy(ROOT."/thumbs/avatars/32-420x420.png", ROOT."/thumbs/avatars/$UserID-420x420.png"); copy(ROOT."/thumbs/avatars/32-352x352.png", ROOT."/thumbs/avatars/$UserID-352x352.png"); copy(ROOT."/thumbs/avatars/32-250x250.png", ROOT."/thumbs/avatars/$UserID-250x250.png"); copy(ROOT."/thumbs/avatars/32-110x110.png", ROOT."/thumbs/avatars/$UserID-110x110.png"); copy(ROOT."/thumbs/avatars/32-100x100.png", ROOT."/thumbs/avatars/$UserID-100x100.png"); copy(ROOT."/thumbs/avatars/32-75x75.png", ROOT."/thumbs/avatars/$UserID-75x75.png"); copy(ROOT."/thumbs/avatars/32-48x48.png", ROOT."/thumbs/avatars/$UserID-48x48.png"); Discord::SendToWebhook(["content" => "[".date('d/m/Y h:i:s A')."] **{$Fields->Username}** just joined! (ID {$UserID} - registered from a {$IPInfo->type} IP)"], Discord::WEBHOOK_POLYGON_JOINLOG, false); die(header("Location: /")); } } pageBuilder::$JSdependencies[] = "https://www.google.com/recaptcha/api.js"; pageBuilder::$pageConfig["title"] = "Welcome"; pageBuilder::buildHeader(); ?>