mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-11-04 06:26:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Services\Ssh;
 | 
						|
 | 
						|
use App\Models\User;
 | 
						|
use App\Models\UserSSHKey;
 | 
						|
use Exception;
 | 
						|
use phpseclib3\Crypt\DSA;
 | 
						|
use phpseclib3\Crypt\PublicKeyLoader;
 | 
						|
use phpseclib3\Crypt\RSA;
 | 
						|
use phpseclib3\Exception\NoKeyLoadedException;
 | 
						|
 | 
						|
class KeyCreationService
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @throws Exception
 | 
						|
     */
 | 
						|
    public function handle(User $user, string $name, string $publicKey): UserSSHKey
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $key = PublicKeyLoader::loadPublicKey($publicKey);
 | 
						|
        } catch (NoKeyLoadedException) {
 | 
						|
            throw new Exception('The public key provided is not valid');
 | 
						|
        }
 | 
						|
 | 
						|
        if ($key instanceof DSA) {
 | 
						|
            throw new Exception('DSA keys are not supported');
 | 
						|
        }
 | 
						|
 | 
						|
        if ($key instanceof RSA && $key->getLength() < 2048) {
 | 
						|
            throw new Exception('RSA keys must be at least 2048 bytes in length');
 | 
						|
        }
 | 
						|
 | 
						|
        $fingerprint = $key->getFingerprint('sha256');
 | 
						|
        if ($user->sshKeys()->where('fingerprint', $fingerprint)->exists()) {
 | 
						|
            throw new Exception('The public key provided already exists on your account');
 | 
						|
        }
 | 
						|
 | 
						|
        /** @var UserSSHKey $sshKey */
 | 
						|
        $sshKey = $user->sshKeys()->create([
 | 
						|
            'name' => $name,
 | 
						|
            'public_key' => $key->toString('PKCS8'),
 | 
						|
            'fingerprint' => $fingerprint,
 | 
						|
        ]);
 | 
						|
 | 
						|
        return $sshKey;
 | 
						|
    }
 | 
						|
}
 |