diff --git a/app/Http/Controllers/OAuth/OAuthClientController.php b/app/Http/Controllers/OAuth/OAuthClientController.php new file mode 100644 index 000000000..c3c54541d --- /dev/null +++ b/app/Http/Controllers/OAuth/OAuthClientController.php @@ -0,0 +1,40 @@ +user()->clients()->where('revoked', false)->find($clientId); + + if (! $client) { + return new Response('', 404); + } + + if ($client->hasGrantType('personal_access')) { + return new Response(json_encode([ + 'error' => 'Cannot delete the personal access client. This client is required for personal access token functionality.', + ]), 403, ['Content-Type' => 'application/json']); + } + + // Check legacy column as well + if (isset($client->personal_access_client) && $client->personal_access_client) { + return new Response(json_encode([ + 'error' => 'Cannot delete the personal access client. This client is required for personal access token functionality.', + ]), 403, ['Content-Type' => 'application/json']); + } + + $clients->delete($client); + + return new Response('', Response::HTTP_NO_CONTENT); + } +} diff --git a/resources/assets/js/components/passport/Clients.vue b/resources/assets/js/components/passport/Clients.vue index a6e72902b..8c891a656 100644 --- a/resources/assets/js/components/passport/Clients.vue +++ b/resources/assets/js/components/passport/Clients.vue @@ -455,10 +455,21 @@ * Destroy the given client. */ destroy(client) { + if (!confirm('Are you sure you want to delete this OAuth client? Any applications using it will stop working immediately.')) { + return; + } + axios.delete('/oauth/clients/' + client.id) - .then(response => { - this.getClients(); - }); + .then(response => { + this.getClients(); + }) + .catch(error => { + if (error.response && error.response.data && error.response.data.error) { + alert(error.response.data.error); + } else { + alert('Failed to delete client. Please try again.'); + } + }); } } } diff --git a/routes/web.php b/routes/web.php index 325ad2d5d..e6576cc81 100644 --- a/routes/web.php +++ b/routes/web.php @@ -110,7 +110,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact ]); Route::delete('/clients/{client_id}', [ - 'uses' => '\Laravel\Passport\Http\Controllers\ClientController@destroy', + 'uses' => '\App\Http\Controllers\OAuth\OAuthClientController@destroy', 'as' => 'clients.destroy', ]);