Skip to content

Commit 287fd60

Browse files
committed
Log activity when modifying account details
1 parent 0b2c0db commit 287fd60

File tree

15 files changed

+85
-57
lines changed

15 files changed

+85
-57
lines changed

app/Http/Controllers/Api/Client/AccountController.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Http\Response;
77
use Illuminate\Auth\AuthManager;
88
use Illuminate\Http\JsonResponse;
9+
use Pterodactyl\Facades\Activity;
910
use Pterodactyl\Services\Users\UserUpdateService;
1011
use Pterodactyl\Transformers\Api\Client\AccountTransformer;
1112
use Pterodactyl\Http\Requests\Api\Client\Account\UpdateEmailRequest;
@@ -43,14 +44,16 @@ public function index(Request $request): array
4344

4445
/**
4546
* Update the authenticated user's email address.
46-
*
47-
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
48-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
4947
*/
5048
public function updateEmail(UpdateEmailRequest $request): JsonResponse
5149
{
50+
$original = $request->user()->email;
5251
$this->updateService->handle($request->user(), $request->validated());
5352

53+
Activity::event('user:account.email-changed')
54+
->property(['old' => $original, 'new' => $request->input('email')])
55+
->log();
56+
5457
return new JsonResponse([], Response::HTTP_NO_CONTENT);
5558
}
5659

@@ -76,6 +79,8 @@ public function updatePassword(UpdatePasswordRequest $request): JsonResponse
7679
$guard->logoutOtherDevices($request->input('password'));
7780
}
7881

82+
Activity::event('user:account.password-changed')->log();
83+
7984
return new JsonResponse([], Response::HTTP_NO_CONTENT);
8085
}
8186
}

app/Http/Controllers/Api/Client/ApiKeyController.php

Lines changed: 15 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,14 @@
44

55
use Pterodactyl\Models\ApiKey;
66
use Illuminate\Http\JsonResponse;
7+
use Pterodactyl\Facades\Activity;
78
use Pterodactyl\Exceptions\DisplayException;
8-
use Illuminate\Contracts\Encryption\Encrypter;
9-
use Pterodactyl\Services\Api\KeyCreationService;
10-
use Pterodactyl\Repositories\Eloquent\ApiKeyRepository;
119
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
1210
use Pterodactyl\Transformers\Api\Client\ApiKeyTransformer;
13-
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
1411
use Pterodactyl\Http\Requests\Api\Client\Account\StoreApiKeyRequest;
1512

1613
class ApiKeyController extends ClientApiController
1714
{
18-
/**
19-
* @var \Pterodactyl\Services\Api\KeyCreationService
20-
*/
21-
private $keyCreationService;
22-
23-
/**
24-
* @var \Illuminate\Contracts\Encryption\Encrypter
25-
*/
26-
private $encrypter;
27-
28-
/**
29-
* @var \Pterodactyl\Repositories\Eloquent\ApiKeyRepository
30-
*/
31-
private $repository;
32-
33-
/**
34-
* ApiKeyController constructor.
35-
*/
36-
public function __construct(
37-
Encrypter $encrypter,
38-
KeyCreationService $keyCreationService,
39-
ApiKeyRepository $repository
40-
) {
41-
parent::__construct();
42-
43-
$this->encrypter = $encrypter;
44-
$this->keyCreationService = $keyCreationService;
45-
$this->repository = $repository;
46-
}
47-
4815
/**
4916
* Returns all of the API keys that exist for the given client.
5017
*
@@ -75,6 +42,11 @@ public function store(StoreApiKeyRequest $request)
7542
$request->input('allowed_ips')
7643
);
7744

45+
Activity::event('user:api-key.create')
46+
->subject($token->accessToken)
47+
->property('identifier', $token->accessToken->identifier)
48+
->log();
49+
7850
return $this->fractal->item($token->accessToken)
7951
->transformWith($this->getTransformer(ApiKeyTransformer::class))
8052
->addMeta(['secret_token' => $token->plainTextToken])
@@ -88,15 +60,16 @@ public function store(StoreApiKeyRequest $request)
8860
*/
8961
public function delete(ClientApiRequest $request, string $identifier)
9062
{
91-
$response = $this->repository->deleteWhere([
92-
'key_type' => ApiKey::TYPE_ACCOUNT,
93-
'user_id' => $request->user()->id,
94-
'identifier' => $identifier,
95-
]);
63+
$key = $request->user()->apiKeys()
64+
->where('key_type', ApiKey::TYPE_ACCOUNT)
65+
->where('identifier', $identifier)
66+
->first();
9667

97-
if (!$response) {
98-
throw new NotFoundHttpException();
99-
}
68+
Activity::event('user:api-key.delete')
69+
->property('identifer', $key->identifer)
70+
->log();
71+
72+
$key->delete();
10073

10174
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
10275
}

app/Http/Controllers/Api/Client/SSHKeyController.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Pterodactyl\Http\Controllers\Api\Client;
44

55
use Illuminate\Http\JsonResponse;
6+
use Pterodactyl\Facades\Activity;
67
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
78
use Pterodactyl\Transformers\Api\Client\UserSSHKeyTransformer;
89
use Pterodactyl\Http\Requests\Api\Client\Account\StoreSSHKeyRequest;
@@ -31,6 +32,11 @@ public function store(StoreSSHKeyRequest $request): array
3132
'fingerprint' => $request->getKeyFingerprint(),
3233
]);
3334

35+
Activity::event('user:ssh-key.create')
36+
->subject($model)
37+
->property('fingerprint', $request->getKeyFingerprint())
38+
->log();
39+
3440
return $this->fractal->item($model)
3541
->transformWith($this->getTransformer(UserSSHKeyTransformer::class))
3642
->toArray();
@@ -41,7 +47,14 @@ public function store(StoreSSHKeyRequest $request): array
4147
*/
4248
public function delete(ClientApiRequest $request, string $identifier): JsonResponse
4349
{
44-
$request->user()->sshKeys()->where('fingerprint', $identifier)->delete();
50+
$key = $request->user()->sshKeys()->where('fingerprint', $identifier)->firstOrFail();
51+
52+
$key->delete();
53+
54+
Activity::event('user:ssh-key.delete')
55+
->subject($key)
56+
->property('fingerprint', $key->fingerprint)
57+
->log();
4558

4659
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
4760
}

app/Http/Controllers/Api/Client/TwoFactorController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Http\Request;
77
use Illuminate\Http\Response;
88
use Illuminate\Http\JsonResponse;
9+
use Pterodactyl\Facades\Activity;
910
use Illuminate\Contracts\Validation\Factory;
1011
use Illuminate\Validation\ValidationException;
1112
use Pterodactyl\Services\Users\TwoFactorSetupService;
@@ -89,6 +90,8 @@ public function store(Request $request)
8990

9091
$tokens = $this->toggleTwoFactorService->handle($request->user(), $request->input('code'), true);
9192

93+
Activity::event('user:two-factor.create')->log();
94+
9295
return new JsonResponse([
9396
'object' => 'recovery_tokens',
9497
'attributes' => [
@@ -117,6 +120,8 @@ public function delete(Request $request)
117120
'use_totp' => false,
118121
]);
119122

123+
Activity::event('user:two-factor.delete')->log();
124+
120125
return new JsonResponse([], Response::HTTP_NO_CONTENT);
121126
}
122127
}

app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public function index(ReportBackupCompleteRequest $request, string $backup)
4545
throw new BadRequestHttpException('Cannot update the status of a backup that is already marked as completed.');
4646
}
4747

48-
$action = $request->boolean('successful') ? 'server:backup.complete' : 'server:backup.failed';
48+
$action = $request->boolean('successful') ? 'server:backup.complete' : 'server:backup.fail';
4949
$log = Activity::event($action)->subject($model, $model->server)->property('name', $model->name);
5050

5151
$log->transaction(function () use ($model, $request) {

app/Http/Controllers/Auth/LoginController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public function login(Request $request): JsonResponse
7272
return $this->sendLoginResponse($user, $request);
7373
}
7474

75-
Activity::event('login.checkpoint')->withRequestMetadata()->subject($user)->log();
75+
Activity::event('auth:checkpoint')->withRequestMetadata()->subject($user)->log();
7676

7777
$request->session()->put('auth_confirmation_token', [
7878
'user_id' => $user->id,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
use Pterodactyl\Facades\LogTarget;
8+
9+
class AccountActivitySubject
10+
{
11+
/**
12+
* Sets the actor and default subject for all requests passing through this
13+
* middleware to be the currently logged in user.
14+
*/
15+
public function handle(Request $request, Closure $next)
16+
{
17+
LogTarget::setActor($request->user());
18+
LogTarget::setSubject($request->user());
19+
20+
return $next($request);
21+
}
22+
}

app/Http/Middleware/ServerActivityLogs.php renamed to app/Http/Middleware/ServerActivitySubject.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Pterodactyl\Models\Server;
88
use Pterodactyl\Facades\LogTarget;
99

10-
class ServerActivityLogs
10+
class ServerActivitySubject
1111
{
1212
/**
1313
* Attempts to automatically scope all of the activity log events registered

app/Listeners/Auth/AuthenticationListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function handle($event): void
2929
}
3030
}
3131

32-
$activity->event($event instanceof Failed ? 'login.failed' : 'login.success')->log();
32+
$activity->event($event instanceof Failed ? 'auth:fail' : 'auth:success')->log();
3333
}
3434

3535
public function subscribe(Dispatcher $events): void

app/Listeners/Auth/PasswordResetListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function __construct(Request $request)
1717

1818
public function handle(PasswordReset $event)
1919
{
20-
Activity::event('login.password-reset')
20+
Activity::event('event:password-reset')
2121
->withRequestMetadata()
2222
->subject($event->user)
2323
->log();

0 commit comments

Comments
 (0)