- Added authorization checks using the `authorize` method in various Livewire components to ensure only authorized users can update server settings. - Updated `ServerPolicy` to restrict update permissions to admin users and their respective teams. - Enhanced security and access control for server management functionalities.
103 lines
3.4 KiB
PHP
103 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Server;
|
|
|
|
use App\Actions\Server\ConfigureCloudflared;
|
|
use App\Models\Server;
|
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
|
use Livewire\Attributes\Validate;
|
|
use Livewire\Component;
|
|
|
|
class CloudflareTunnel extends Component
|
|
{
|
|
use AuthorizesRequests;
|
|
|
|
public Server $server;
|
|
|
|
#[Validate(['required', 'string'])]
|
|
public string $cloudflare_token;
|
|
|
|
#[Validate(['required', 'string'])]
|
|
public string $ssh_domain;
|
|
|
|
#[Validate(['required', 'boolean'])]
|
|
public bool $isCloudflareTunnelsEnabled;
|
|
|
|
public function getListeners()
|
|
{
|
|
$teamId = auth()->user()->currentTeam()->id;
|
|
|
|
return [
|
|
"echo-private:team.{$teamId},CloudflareTunnelConfigured" => 'refresh',
|
|
];
|
|
}
|
|
|
|
public function refresh()
|
|
{
|
|
$this->server->refresh();
|
|
$this->isCloudflareTunnelsEnabled = $this->server->settings->is_cloudflare_tunnel;
|
|
}
|
|
|
|
public function mount(string $server_uuid)
|
|
{
|
|
try {
|
|
$this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail();
|
|
if ($this->server->isLocalhost()) {
|
|
return redirect()->route('server.show', ['server_uuid' => $server_uuid]);
|
|
}
|
|
$this->isCloudflareTunnelsEnabled = $this->server->settings->is_cloudflare_tunnel;
|
|
} catch (\Throwable $e) {
|
|
return handleError($e, $this);
|
|
}
|
|
}
|
|
|
|
public function toggleCloudflareTunnels()
|
|
{
|
|
try {
|
|
$this->authorize('update', $this->server);
|
|
remote_process(['docker rm -f coolify-cloudflared'], $this->server, false, 10);
|
|
$this->isCloudflareTunnelsEnabled = false;
|
|
$this->server->settings->is_cloudflare_tunnel = false;
|
|
$this->server->settings->save();
|
|
if ($this->server->ip_previous) {
|
|
$this->server->update(['ip' => $this->server->ip_previous]);
|
|
$this->dispatch('success', 'Cloudflare Tunnel disabled.<br><br>Manually updated the server IP address to its previous IP address.');
|
|
} else {
|
|
$this->dispatch('warning', 'Cloudflare Tunnel disabled. Action required: Update the server IP address to its real IP address in the Advanced settings.');
|
|
}
|
|
} catch (\Throwable $e) {
|
|
return handleError($e, $this);
|
|
}
|
|
}
|
|
|
|
public function manualCloudflareConfig()
|
|
{
|
|
$this->authorize('update', $this->server);
|
|
$this->isCloudflareTunnelsEnabled = true;
|
|
$this->server->settings->is_cloudflare_tunnel = true;
|
|
$this->server->settings->save();
|
|
$this->server->refresh();
|
|
$this->dispatch('success', 'Cloudflare Tunnel enabled.');
|
|
}
|
|
|
|
public function automatedCloudflareConfig()
|
|
{
|
|
try {
|
|
$this->authorize('update', $this->server);
|
|
if (str($this->ssh_domain)->contains('https://')) {
|
|
$this->ssh_domain = str($this->ssh_domain)->replace('https://', '')->replace('http://', '')->trim();
|
|
$this->ssh_domain = str($this->ssh_domain)->replace('/', '');
|
|
}
|
|
$activity = ConfigureCloudflared::run($this->server, $this->cloudflare_token, $this->ssh_domain);
|
|
$this->dispatch('activityMonitor', $activity->id);
|
|
} catch (\Throwable $e) {
|
|
return handleError($e, $this);
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.server.cloudflare-tunnel');
|
|
}
|
|
}
|