$link, "affillink" => $affillink, "password" => $password])); /** * Get Parameters (Result informations) * 1. affillink (With Affiliate Redirect) * 2. link * 5. Password (hmac with adgoal private key and the two parameters) */ $request->validate([ 'affillink' => ['required', 'url', 'active_url'], 'link' => ['required', 'url', 'active_url'], # Validation of redirect request so that one cannot generate random redirect URLs pointing to our domains 'password' => function($attribute, $value, $fail) use($request) { // Check if hmac matches $correctPassword = self::generatePassword($request->input('affillink'), $request->input('link')); if(!hash_equals($correctPassword, $value)){ $fail('The given password is incorrect!'); } } ]); $this->storePartnerCallFast($request->input('affillink'), $request->input('link')); return redirect($request->input('affillink')); } /** * Stores Click information into Redis Cache for fast execution since this is synchronous call * at search time. * A Cronjob will pick the data up and store it into Mariadb later (see self::storePartnerCall) */ private function storePartnerCallFast($affillink, $link) { # Generate Data to store $host = parse_url($link, PHP_URL_HOST); if(empty($host)){ return; } $storeObject = [ "host" => $host, "affillink" => $affillink, "link" => $link, ]; # Store Data in Redis $redis = Redis::connection(config('cache.stores.redis.connection')); $redis->rpush($this::REDIS_STORAGE_KEY, json_encode($storeObject)); } public static function storePartnerCalls() { $redis = Redis::connection(config('cache.stores.redis.connection')); DB::transaction(function() use($redis){ while(!empty($data = $redis->lpop(self::REDIS_STORAGE_KEY))){ $data = json_decode($data, true); # Insert data into mariadb table DB::insert('insert into affiliate_clicks (hostname, affillink, link) values (?, ?, ?)', [$data["host"], $data["affillink"], $data["link"]]); } }); } /** * Generates a Redirect URL for our partnershops */ public static function generateRedirectUrl($affillink, $link){ $password = self::generatePassword($affillink, $link); return LaravelLocalization::getLocalizedURL( LaravelLocalization::getCurrentLocale(), route('adgoal-redirect', ["link" => $link, "affillink" => $affillink, "password" => $password]) ); } /** * Generates hmac password to validate redirect URLs */ public static function generatePassword($affillink, $link){ return hash_hmac("sha256", $affillink . $link, config('metager.metager.adgoal.private_key')); } /** * Routes for the Admin Interface */ public function adminIndex(Request $request){ return view('admin.affiliates.index') ->with('title', "Affilliates Overview - MetaGer") ->with('css', [ mix('/css/admin/affilliates/index.css') ]) ->with('darkcss', [ mix('/css/admin/affilliates/index-dark.css') ]) ->with('js', [ mix('/js/admin/affilliates.js') ]); } public function blacklistJson(Request $request){ $request->validate([ "blacklist" => 'boolean' ]); $count = 5; # How Many results to return $skip = 0; # How many results to skip $blacklist = $request->input('blacklist', true); $total = DB::select("select count(*) as total_rows from affiliate_blacklist"); $total = intval($total[0]->{"total_rows"}); $blacklistItems = DB::select('select * from affiliate_blacklist where blacklist = ? order by created_at desc limit ? offset ?', [$blacklist, $count, $skip]); $result = [ "count" => $count, "skip" => $skip, "total" => $total, "results" => $blacklistItems ]; return response()->json($result); } public function whitelistJson(Request $request){ $input = $request->all(); $input["blacklist"] = true; $request->replace($input); return $this->blacklistJson($request); } }