test: add behavioral ssh key stale-file regression
This commit is contained in:
parent
4bf94fac2d
commit
2f96a759df
1 changed files with 56 additions and 0 deletions
|
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
use App\Helpers\SshMultiplexingHelper;
|
use App\Helpers\SshMultiplexingHelper;
|
||||||
use App\Models\PrivateKey;
|
use App\Models\PrivateKey;
|
||||||
|
use Illuminate\Support\Facades\File;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -130,4 +132,58 @@ public function test_private_key_saved_event_resyncs_on_key_change()
|
||||||
'PrivateKey saved event should resync key file'
|
'PrivateKey saved event should resync key file'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_validate_ssh_key_rewrites_stale_file_and_fixes_permissions()
|
||||||
|
{
|
||||||
|
$diskRoot = sys_get_temp_dir().'/coolify-ssh-test-'.Str::uuid();
|
||||||
|
File::ensureDirectoryExists($diskRoot);
|
||||||
|
config(['filesystems.disks.ssh-keys.root' => $diskRoot]);
|
||||||
|
app('filesystem')->forgetDisk('ssh-keys');
|
||||||
|
|
||||||
|
$privateKey = new class extends PrivateKey
|
||||||
|
{
|
||||||
|
public int $storeCallCount = 0;
|
||||||
|
|
||||||
|
public function refresh()
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getKeyLocation()
|
||||||
|
{
|
||||||
|
return Storage::disk('ssh-keys')->path("ssh_key@{$this->uuid}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function storeInFileSystem()
|
||||||
|
{
|
||||||
|
$this->storeCallCount++;
|
||||||
|
$filename = "ssh_key@{$this->uuid}";
|
||||||
|
$disk = Storage::disk('ssh-keys');
|
||||||
|
$disk->put($filename, $this->private_key);
|
||||||
|
$keyLocation = $disk->path($filename);
|
||||||
|
chmod($keyLocation, 0600);
|
||||||
|
|
||||||
|
return $keyLocation;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$privateKey->uuid = (string) Str::uuid();
|
||||||
|
$privateKey->private_key = 'NEW_PRIVATE_KEY_CONTENT';
|
||||||
|
|
||||||
|
$filename = "ssh_key@{$privateKey->uuid}";
|
||||||
|
$disk = Storage::disk('ssh-keys');
|
||||||
|
$disk->put($filename, 'OLD_PRIVATE_KEY_CONTENT');
|
||||||
|
$staleKeyPath = $disk->path($filename);
|
||||||
|
chmod($staleKeyPath, 0644);
|
||||||
|
|
||||||
|
$reflection = new \ReflectionMethod(SshMultiplexingHelper::class, 'validateSshKey');
|
||||||
|
$reflection->setAccessible(true);
|
||||||
|
$reflection->invoke(null, $privateKey);
|
||||||
|
|
||||||
|
$this->assertSame('NEW_PRIVATE_KEY_CONTENT', $disk->get($filename));
|
||||||
|
$this->assertSame(1, $privateKey->storeCallCount);
|
||||||
|
$this->assertSame(0600, fileperms($staleKeyPath) & 0777);
|
||||||
|
|
||||||
|
File::deleteDirectory($diskRoot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue