Versioncompatibility for client/rcc #3
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
Graphictoria 2022
|
||||||
|
Error helper
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Helpers;
|
||||||
|
|
||||||
|
class ErrorHelper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns a JSON array with the error code and message.
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
private static function error($data, $code = 400)
|
||||||
|
{
|
||||||
|
return response(['errors' => [$data]], 400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,31 +2,32 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Graphictoria 2022
|
Graphictoria 2022
|
||||||
JSON Pretty Printer
|
Grid helper
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace App\Helpers;
|
namespace App\Helpers;
|
||||||
|
|
||||||
use App\Helpers\COMHelper;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
use App\Helpers\COMHelper;
|
||||||
use App\Models\WebsiteConfiguration;
|
use App\Models\WebsiteConfiguration;
|
||||||
|
|
||||||
class GridHelper
|
class GridHelper
|
||||||
{
|
{
|
||||||
public static function isIpWhitelisted($request) {
|
public static function isIpWhitelisted(Request $request) {
|
||||||
$ip = $request->ip();
|
$ip = $request->ip();
|
||||||
$whitelistedIps = explode(';', WebsiteConfiguration::where('name', 'WhitelistedIPs')->first()->value);
|
$whitelistedIps = explode(';', WebsiteConfiguration::where('name', 'WhitelistedIPs')->first()->value);
|
||||||
|
|
||||||
return in_array($ip, $whitelistedIps);
|
return in_array($ip, $whitelistedIps);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isAccessKeyValid($request) {
|
public static function isAccessKeyValid(Request $request) {
|
||||||
$accessKey = WebsiteConfiguration::where('name', 'ComputeServiceAccessKey')->first()->value;
|
$accessKey = WebsiteConfiguration::where('name', 'ComputeServiceAccessKey')->first()->value;
|
||||||
|
|
||||||
return ($request->header('AccessKey') == $accessKey);
|
return ($request->header('AccessKey') == $accessKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function hasAllAccess($request) {
|
public static function hasAllAccess(Request $request) {
|
||||||
if(COMHelper::isCOM()) return true;
|
if(COMHelper::isCOM()) return true;
|
||||||
if(GridHelper::isIpWhitelisted($request) && GridHelper::isAccessKeyValid($request)) return true;
|
if(GridHelper::isIpWhitelisted($request) && GridHelper::isAccessKeyValid($request)) return true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers\Apis;
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
use App\Helpers\JSON;
|
use App\Helpers\JSON;
|
||||||
use App\Helpers\GridHelper;
|
use App\Helpers\GridHelper;
|
||||||
|
use App\Helpers\ErrorHelper;
|
||||||
|
|
||||||
use App\Models\FFlag;
|
use App\Models\FFlag;
|
||||||
use App\Models\Fbucket;
|
use App\Models\Fbucket;
|
||||||
|
|
@ -38,16 +39,6 @@ class AppSettings extends Controller
|
||||||
'Boolean' => 'Flag'
|
'Boolean' => 'Flag'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a JSON array with the error code and message.
|
|
||||||
*
|
|
||||||
* @return Response
|
|
||||||
*/
|
|
||||||
private function error($data, $code = 400)
|
|
||||||
{
|
|
||||||
return response(['errors' => [$data]], 400);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a JSON array of settings for the specified bucket.
|
* Returns a JSON array of settings for the specified bucket.
|
||||||
*
|
*
|
||||||
|
|
@ -66,7 +57,7 @@ class AppSettings extends Controller
|
||||||
$bucketIds = array_merge($bucketIds, json_decode($primaryBucket->inheritedGroupIds));
|
$bucketIds = array_merge($bucketIds, json_decode($primaryBucket->inheritedGroupIds));
|
||||||
|
|
||||||
if($primaryBucket->protected == 1 && !GridHelper::hasAllAccess($request)) {
|
if($primaryBucket->protected == 1 && !GridHelper::hasAllAccess($request)) {
|
||||||
return $this->error([
|
return ErrorHelper::error([
|
||||||
'code' => 2,
|
'code' => 2,
|
||||||
'message' => 'You do not have access to this bucket.'
|
'message' => 'You do not have access to this bucket.'
|
||||||
], 401);
|
], 401);
|
||||||
|
|
@ -98,7 +89,7 @@ class AppSettings extends Controller
|
||||||
|
|
||||||
return JSON::EncodeResponse($flags);
|
return JSON::EncodeResponse($flags);
|
||||||
} else {
|
} else {
|
||||||
return $this->error([
|
return ErrorHelper::error([
|
||||||
'code' => 1,
|
'code' => 1,
|
||||||
'message' => 'The requested bucket does not exist.'
|
'message' => 'The requested bucket does not exist.'
|
||||||
]);
|
]);
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Apis;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
use App\Models\WebsiteConfiguration;
|
||||||
|
use App\Helpers\GridHelper;
|
||||||
|
|
||||||
|
class VersionCompatibility extends Controller
|
||||||
|
{
|
||||||
|
function getVersions(Request $request)
|
||||||
|
{
|
||||||
|
if(!GridHelper::hasAllAccess($request)) {
|
||||||
|
return ErrorHelper::error([
|
||||||
|
'code' => 1,
|
||||||
|
'message' => 'You do not have access to this resource.'
|
||||||
|
], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json([
|
||||||
|
'data' => [
|
||||||
|
explode(';', WebsiteConfiguration::where('name', 'VersionCompatibilityVersions')->first()->value)
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMD5Hashes(Request $request)
|
||||||
|
{
|
||||||
|
if(!GridHelper::hasAllAccess($request)) {
|
||||||
|
return ErrorHelper::error([
|
||||||
|
'code' => 1,
|
||||||
|
'message' => 'You do not have access to this resource.'
|
||||||
|
], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json([
|
||||||
|
'data' => [
|
||||||
|
explode(';', WebsiteConfiguration::where('name', 'VersionCompatibilityHashes')->first()->value)
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -25,4 +25,13 @@ class GamesController extends Controller
|
||||||
return response()->json(['available' => $status->operational])
|
return response()->json(['available' => $status->operational])
|
||||||
->header('Content-Type', 'application/json');
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validatePlaceJoin()
|
||||||
|
{
|
||||||
|
// todo: move to backend and make this actually return if the player is validated
|
||||||
|
// this is only here for testing
|
||||||
|
|
||||||
|
return response('true', null)
|
||||||
|
->header('Content-Type', 'text/plain');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,10 @@ class GridTest extends Controller
|
||||||
game:GetService("ContentProvider"):SetThreadPool(16)
|
game:GetService("ContentProvider"):SetThreadPool(16)
|
||||||
game:GetService("Stats"):SetReportUrl("http://api.gtoria.net/teststat")
|
game:GetService("Stats"):SetReportUrl("http://api.gtoria.net/teststat")
|
||||||
|
|
||||||
local p = game:GetService("Players"):CreateLocalPlayer(0)
|
game:GetService("ContentProvider"):SetBaseUrl("http://www.roblox.com/")
|
||||||
p.CharacterAppearance = "http://api.gtoria.net/user/getCharacter.php?key=D869593BF742A42F79915993EF1DB&mode=ch&sid=1&uid=15"
|
game:LoadWorld(23173663)
|
||||||
p:LoadCharacter(false)
|
|
||||||
|
|
||||||
return game:GetService("ThumbnailGenerator"):Click("PNG", 2048, 2048, true, false)
|
return game:GetService("ThumbnailGenerator"):Click("PNG", 1920, 1080, false, false)
|
||||||
TestScript;
|
TestScript;
|
||||||
|
|
||||||
$test = new SoapService('http://127.0.0.1:64989');
|
$test = new SoapService('http://127.0.0.1:64989');
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Models\WebsiteConfiguration;
|
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
use Symfony\Component\HttpFoundation\Cookie;
|
use Symfony\Component\HttpFoundation\Cookie;
|
||||||
|
|
||||||
|
use App\Models\WebsiteConfiguration;
|
||||||
|
|
||||||
class MaintenanceController extends Controller
|
class MaintenanceController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@ class RouteServiceProvider extends ServiceProvider
|
||||||
->namespace($this->namespace)
|
->namespace($this->namespace)
|
||||||
->group(base_path('routes/appsettings.php'));
|
->group(base_path('routes/appsettings.php'));
|
||||||
|
|
||||||
|
Route::domain('versioncompatibility.api.' . env('APP_URL'))
|
||||||
|
->middleware('api')
|
||||||
|
->namespace($this->namespace)
|
||||||
|
->group(base_path('routes/versioncompatibility.php'));
|
||||||
|
|
||||||
Route::domain('impulse.' . env('APP_URL'))
|
Route::domain('impulse.' . env('APP_URL'))
|
||||||
->middleware('admin')
|
->middleware('admin')
|
||||||
->namespace($this->namespace)
|
->namespace($this->namespace)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class CreateFflagsTable extends Migration
|
||||||
Schema::create('fflags', function (Blueprint $table) {
|
Schema::create('fflags', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->string('name');
|
$table->string('name');
|
||||||
$table->string('value');
|
$table->longText('value');
|
||||||
$table->enum('dataType', ['Log', 'Int', 'String', 'Boolean']);
|
$table->enum('dataType', ['Log', 'Int', 'String', 'Boolean']);
|
||||||
$table->enum('type', ['Unscoped', 'Fast', 'Dynamic', 'Synchronised']);
|
$table->enum('type', ['Unscoped', 'Fast', 'Dynamic', 'Synchronised']);
|
||||||
$table->bigInteger('bucketId');
|
$table->bigInteger('bucketId');
|
||||||
|
|
|
||||||
|
|
@ -33,5 +33,15 @@ class WebConfigurationSeeder extends Seeder
|
||||||
'name' => 'WhitelistedIPs',
|
'name' => 'WhitelistedIPs',
|
||||||
'value' => '127.0.0.1'
|
'value' => '127.0.0.1'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
WebsiteConfiguration::create([
|
||||||
|
'name' => 'VersionCompatibilityVersions',
|
||||||
|
'value' => '0.1.0pcplayer' // version1;version2;version3
|
||||||
|
]);
|
||||||
|
|
||||||
|
WebsiteConfiguration::create([
|
||||||
|
'name' => 'VersionCompatibilityHashes',
|
||||||
|
'value' => 'debughash' // hash1;hash2;hash3
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="102.4" height="102.4" viewBox="0 0 1024 1024">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: currentcolor;
|
||||||
|
fill-rule: evenodd;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<path id="Polygon_1" data-name="Polygon 1" class="cls-1" d="M718.719-.012L1020.99,562.653,579.262,1024,3.994,746.459,90.183,113.587ZM637.405,554.647c-1.474-51.324-42.032-83.369-102.451-104.469-41.717-14.529-68.9-18.909-69.359-34.867-0.341-11.861,14.321-22,35.191-22.618,18.26-.537,47.9,6.576,59.806,24.572l57.1-53.048c-12.388-26.4-43.108-46.43-83.659-53.439l-1.35-47.011-79.209,2.33,1.393,48.521c-52.507,14.71-91.52,52.981-90.146,100.855,1.5,52.4,43.837,80.079,92.761,97.632,37.9,13.993,77.486,28.584,78,46.483,0.409,14.233-20.493,21.97-42.074,22.605-32.016.942-62.031-11.125-78.534-32.006l-59.849,56.582c16.806,31.448,59.675,53.065,109.907,58.278l1.319,45.933,79.209-2.33-1.419-49.384C598.437,644.069,638.892,606.4,637.405,554.647ZM559.964,929.165L83.555,696.984,157.472,172.64,679.564,80.758,928.319,548.316Zm-10.7-92.114L167.181,650.975,226.463,230.75l418.723-73.637,199.5,374.714Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -51,8 +51,11 @@ const Navbar = (props) => {
|
||||||
<>
|
<>
|
||||||
<SearchBar />
|
<SearchBar />
|
||||||
{props.user?
|
{props.user?
|
||||||
<div className={`flex row`}>
|
<div className='flex'>
|
||||||
<div className={`flex row col flex alc`}>Bank: ${props.user.bank}</div>
|
<p className='my-auto me-3 text-muted'>
|
||||||
|
<img src='/images/symbols/token.svg' height='20' width='20' className='img-fluid me-1' />
|
||||||
|
${props.user.bank}
|
||||||
|
</p>
|
||||||
<li className="nav-item dropdown col flex alc">
|
<li className="nav-item dropdown col flex alc">
|
||||||
<button className="btn btn-secondary nav-link dropdown-toggle" href="#" id="graphictoria-nav-dropdown" role="button" data-bs-toggle="dropdown" area-expanded="false">{props.user.username}</button>
|
<button className="btn btn-secondary nav-link dropdown-toggle" href="#" id="graphictoria-nav-dropdown" role="button" data-bs-toggle="dropdown" area-expanded="false">{props.user.username}</button>
|
||||||
<ul className="dropdown-menu graphictoria-nav-dropdown" area-labelledby="graphictoria-nav-dropdown">
|
<ul className="dropdown-menu graphictoria-nav-dropdown" area-labelledby="graphictoria-nav-dropdown">
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,6 @@ const App = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const authMiddleware = (to, from, next) => {
|
const authMiddleware = (to, from, next) => {
|
||||||
console.log(user);
|
|
||||||
if (to.meta.auth) {
|
if (to.meta.auth) {
|
||||||
if (user)
|
if (user)
|
||||||
next();
|
next();
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ const LoginForm = (props) => {
|
||||||
<form onSubmit={(e)=>{
|
<form onSubmit={(e)=>{
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
SubmitLogin(new FormData(e.target));
|
SubmitLogin(new FormData(e.target));
|
||||||
}} class="fs">
|
}} className="fs">
|
||||||
<input type="username" className={`form-control mb-4 ${(validity.inputs.find(input=>input == `username`)? `is-invalid` : ``)}`} placeholder="Username" name="username"/>
|
<input type="username" className={`form-control mb-4 ${(validity.inputs.find(input=>input == `username`)? `is-invalid` : ``)}`} placeholder="Username" name="username"/>
|
||||||
<input type="password" className={`form-control mb-4 ${(validity.inputs.find(input=>input == `password`)? `is-invalid` : ``)}`} placeholder="Password" name="password"/>
|
<input type="password" className={`form-control mb-4 ${(validity.inputs.find(input=>input == `password`)? `is-invalid` : ``)}`} placeholder="Password" name="password"/>
|
||||||
<div className="d-flex mb-3">
|
<div className="d-flex mb-3">
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use App\Http\Controllers\AppSettings;
|
use App\Http\Controllers\Apis\AppSettings;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
use App\Http\Controllers\Apis\VersionCompatibility;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| API Routes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Here is where you can register API routes for your application. These
|
||||||
|
| routes are loaded by the RouteServiceProvider within a group which
|
||||||
|
| is assigned the "api" middleware group. Enjoy building your API!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
Route::get('/', function(){
|
||||||
|
return 'API OK';
|
||||||
|
});
|
||||||
|
|
||||||
|
// RCC Security Backbone
|
||||||
|
Route::get('/GetAllowedSecurityVersions', 'VersionCompatibility@getVersions');
|
||||||
|
Route::get('/GetAllowedSecurityKeys', 'VersionCompatibility@getVersions');
|
||||||
|
Route::get('/GetAllowedMD5Hashes', 'VersionCompatibility@getMD5Hashes');
|
||||||
|
Route::get('/GetAllowedMemHashes', 'VersionCompatibility@getMemHashes');
|
||||||
|
|
||||||
|
// Client/Launcher apis
|
||||||
|
Route::get('/GetCurrentClientVersionUpload', 'VersionCompatibility@getClientVersion');
|
||||||
|
|
||||||
|
Route::fallback(function(){
|
||||||
|
return response('{"errors":[{"code":404,"message":"NotFound"}]}', 404)
|
||||||
|
->header('Cache-Control', 'private')
|
||||||
|
->header('Content-Type', 'application/json; charset=utf-8');
|
||||||
|
});
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
use App\Http\Controllers\GamesController;
|
||||||
use App\Http\Controllers\GridTest;
|
use App\Http\Controllers\GridTest;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -14,6 +15,10 @@ use App\Http\Controllers\GridTest;
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// client apis
|
||||||
|
Route::get('/universes/validate-place-join', 'GamesController@validatePlaceJoin');
|
||||||
|
|
||||||
|
// other
|
||||||
Route::get('/javascript', function(){
|
Route::get('/javascript', function(){
|
||||||
return view('javascript');
|
return view('javascript');
|
||||||
})->middleware('auth');
|
})->middleware('auth');
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue