Skip to content

Commit 37a8b48

Browse files
authored
Merge pull request #136 from skull132/feature/unlinked-server-auth
Implement forum-user-auth for WI
2 parents 131b121 + ceb28d2 commit 37a8b48

File tree

4 files changed

+59
-23
lines changed

4 files changed

+59
-23
lines changed

app/Http/Controllers/Auth/ServerController.php

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use App\Models\User;
88
use App\Services\Server\ServerQuery;
9+
use App\Services\Server\Helpers;
910
use Illuminate\Http\Request;
1011
use Illuminate\Support\Facades\Auth;
1112
use Illuminate\Support\Facades\Log;
@@ -87,27 +88,40 @@ public function endLogin(Request $request)
8788
}
8889

8990
$client_token = $request->session()->pull('server_client_token');
91+
$byond_key_is_linked = $request->user()->byond_key != null;
9092

91-
if ($request->user()->byond_key == null) {
92-
Log::debug("server.login - Unable to Auth - User has no ckey linked");
93-
return view('auth.server.nokey');
93+
$ckey_is_external = False;
94+
if ($byond_key_is_linked) {
95+
$ckey_is_external = ServerPlayer::where('ckey', $request->user()->byond_key)->select('ckey_is_external')->firstOrFail();
96+
} else {
97+
$ckey_is_external = True;
9498
}
99+
95100
$query = new ServerQuery;
96101
try {
97-
Log::debug("server.login - Sending auth_client request to server for ckey: " . $request->user()->byond_key);
102+
Log::debug("server.login - Sending auth_client request to server for ckey and forum account: " . $request->user()->byond_key . ", " . $request->user()->name);
98103
$query->setUp(config('aurora.gameserver_address'), config('aurora.gameserver_port'), config('aurora.gameserver_auth'));
99104
$query->runQuery([
100105
'query' => 'auth_client',
101106
'clienttoken' => $client_token,
102-
'key' => $request->user()->byond_key
107+
'key' => $request->user()->byond_key,
108+
'forumuser' => $request->user()->name,
109+
'use-external-key' => $ckey_is_external
103110
]);
104111
} catch (\Exception $e) {
105112
Log::debug("server.login - Error while sending auth_client request to server: " . $e->getMessage());
106113
abort(500, $e->getMessage());
107114
}
108115

109116
if ($query->response->statuscode == '200') {
110-
Log::debug("server.login - Ckey Succesfully logged in: " . $request->user()->byond_key);
117+
Log::debug("server.login - Ckey or external user succesfully logged in: " . $request->user()->byond_key . ", " . $request->user()->name);
118+
119+
// User was authorized but no BYOND key is linked yet. Ergo, external ckey was used. Link it.
120+
if ($byond_key_is_linked == False) {
121+
$fake_ckey = "GuestF-" . Helpers::sanitize_ckey($request->user()->name);
122+
$request->user()->linkWithCkey($fake_ckey);
123+
}
124+
111125
return view('auth.server.success');
112126
} else {
113127
Log::debug("server.login - Invalid status-code while sending auth_client request to server: " . $query->response->statuscode);

app/Http/Controllers/User/LinkController.php

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,8 @@ public function index(Request $request)
4949
//Check if the linking request is set to something other than new
5050
if ($linking_request->status == "confirmed") {
5151
//If its confirmed write it to the forum db
52-
$sanitized_key = Helpers::sanitize_ckey($linking_request->player_ckey);
53-
$request->user()->byond_key = $sanitized_key;
54-
$request->user()->save();
55-
56-
//Update the forum
57-
$base_url = config('aurora.forum_url');
58-
if ($base_url) {
59-
$request_url = $base_url . 'api/core/members/' . $request->user()->id .
60-
'?key=' . config('aurora.forum_api_key') .
61-
'&customFields[' . config('aurora.forum_byond_attribute') . ']=' . $sanitized_key;
62-
$client = new \GuzzleHttp\Client();
63-
$client->request('POST', $request_url);
64-
}
6552

53+
$request->user()->linkWithCkey($byond_key);
6654

6755
//Set the status of the linking request to linked and set the deleted_at date
6856
DB::connection('server')->table('player_linking')
@@ -118,13 +106,17 @@ public function add(Request $request)
118106

119107
$ckey = Helpers::sanitize_ckey($request->input("Byond_Username"));
120108

121-
#Check if a player with that ckey exists
122-
$player_count = ServerPlayer::where('ckey', $ckey)->count();
109+
$player = ServerPlayer::where('ckey', $ckey)->first();
123110

124-
if ($player_count != 1) {
111+
#Check if a player with that ckey exists
112+
if (is_null($player)) {
125113
return redirect()->route('user.link')->withErrors(array("Could not find player with the ckey" . $ckey . ". You need to join on the server before you can link your account."));
126114
}
127115

116+
if ($player->ckey_is_external) {
117+
return redirect()->route('user.link')->withErrors(array("Your ckey " . $ckey . " is an external ckey. Linking forum accounts to these keys is currently not supported."));
118+
}
119+
128120
//Only add a new linking request if there is no existing one (where the deleted_at date is not set)
129121
if (DB::connection('server')->table('player_linking')->where('forum_id', '=', $request->user()->user_id)->where('deleted_at', '=', NULL)->count() == 0) {
130122

app/Models/ServerPlayer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ServerPlayer extends Model
2828
public $timestamps = FALSE;
2929
protected $connection = 'server';
3030
protected $table = 'player';
31-
protected $fillable = ['ckey', 'ip', 'whitelist_status'];
31+
protected $fillable = ['ckey', 'ip', 'whitelist_status', 'ckey_is_external'];
3232
protected $primaryKey = 'id';
3333
protected $dates = ['firstseen', 'lastseen'];
3434

app/Models/User.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Illuminate\Foundation\Auth\User as Authenticatable;
99
use App\Models\ServerPlayer;
1010
use App\Models\SiteRole;
11+
use App\Services\Server\Helpers;
1112

1213
class User extends Authenticatable
1314
{
@@ -149,4 +150,33 @@ public function checkPlayerChar($char_id)
149150
return NULL;
150151
}
151152
}
153+
154+
/**
155+
* Linked the user account to a specified ckey. Will also create the link in the forums.
156+
*
157+
* Will throw if the user is already linked with a byond key.
158+
*
159+
* @param $byond_key
160+
*/
161+
public function linkWithCkey($byond_key)
162+
{
163+
if ($this->byond_linked == True) {
164+
throw new \Exception("User already linked with a ckey.");
165+
}
166+
167+
$sanitized_key = Helpers::sanitize_ckey($byond_key);
168+
$this->byond_key = $sanitized_key;
169+
$this->byond_linked = True;
170+
$this->save();
171+
172+
//Update the forum
173+
$base_url = config('aurora.forum_url');
174+
if ($base_url) {
175+
$request_url = $base_url . 'api/core/members/' . $this->id .
176+
'?key=' . config('aurora.forum_api_key') .
177+
'&customFields[' . config('aurora.forum_byond_attribute') . ']=' . $sanitized_key;
178+
$client = new \GuzzleHttp\Client();
179+
$client->request('POST', $request_url);
180+
}
181+
}
152182
}

0 commit comments

Comments
 (0)