2021-08-08 16:23:02 +00:00
|
|
|
<?php
|
|
|
|
|
2021-08-08 17:48:35 +00:00
|
|
|
namespace Pterodactyl\Repositories\SecurityKeys;
|
2021-08-08 16:23:02 +00:00
|
|
|
|
|
|
|
use Pterodactyl\Models\User;
|
|
|
|
use Illuminate\Container\Container;
|
2022-02-14 00:06:53 +00:00
|
|
|
use Pterodactyl\Models\SecurityKey;
|
2021-08-08 16:23:02 +00:00
|
|
|
use Webauthn\PublicKeyCredentialSource;
|
|
|
|
use Webauthn\PublicKeyCredentialUserEntity;
|
|
|
|
use Webauthn\PublicKeyCredentialSourceRepository as PublicKeyRepositoryInterface;
|
|
|
|
|
|
|
|
class PublicKeyCredentialSourceRepository implements PublicKeyRepositoryInterface
|
|
|
|
{
|
|
|
|
protected User $user;
|
|
|
|
|
|
|
|
public function __construct(User $user)
|
|
|
|
{
|
|
|
|
$this->user = $user;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find a single hardware security token for a user by uzing the credential ID.
|
|
|
|
*/
|
|
|
|
public function findOneByCredentialId(string $id): ?PublicKeyCredentialSource
|
|
|
|
{
|
2021-08-08 17:48:35 +00:00
|
|
|
/** @var \Pterodactyl\Models\SecurityKey $key */
|
|
|
|
$key = $this->user->securityKeys()
|
2022-02-13 19:57:45 +00:00
|
|
|
->where('public_key_id', base64_encode($id))
|
2021-08-08 16:23:02 +00:00
|
|
|
->first();
|
|
|
|
|
2022-02-13 19:15:18 +00:00
|
|
|
return optional($key)->getPublicKeyCredentialSource();
|
2021-08-08 16:23:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find all of the hardware tokens that exist for the user using the given
|
|
|
|
* entity handle.
|
|
|
|
*/
|
|
|
|
public function findAllForUserEntity(PublicKeyCredentialUserEntity $entity): array
|
|
|
|
{
|
2021-08-08 17:48:35 +00:00
|
|
|
$results = $this->user->securityKeys()
|
2021-08-08 16:23:02 +00:00
|
|
|
->where('user_handle', $entity->getId())
|
|
|
|
->get();
|
|
|
|
|
2021-08-08 17:48:35 +00:00
|
|
|
return $results->map(function (SecurityKey $key) {
|
2022-02-13 19:15:18 +00:00
|
|
|
return $key->getPublicKeyCredentialSource();
|
2021-08-08 16:23:02 +00:00
|
|
|
})->values()->toArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Save a credential to the database and link it with the user.
|
2021-08-08 17:48:35 +00:00
|
|
|
*
|
|
|
|
* @throws \Throwable
|
2021-08-08 16:23:02 +00:00
|
|
|
*/
|
|
|
|
public function saveCredentialSource(PublicKeyCredentialSource $source): void
|
|
|
|
{
|
2022-02-13 20:06:08 +00:00
|
|
|
// no-op — we handle creation of the keys in StoreSecurityKeyService
|
|
|
|
//
|
|
|
|
// If you put logic in here it is triggered on each login.
|
2021-08-08 16:23:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a new instance of the repository with the provided user attached.
|
|
|
|
*/
|
|
|
|
public static function factory(User $user): self
|
|
|
|
{
|
|
|
|
return Container::getInstance()->make(static::class, ['user' => $user]);
|
|
|
|
}
|
|
|
|
}
|