From 19881bd41fafcf4c2bcb3e27a47ed7f9783b5d8f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 6 Nov 2017 20:58:53 +1100 Subject: [PATCH] Cloudflare DNS Zone Updates (#1733) * Add subdomain to cloudflare * Fire subdomain event when saving client portal settings * Refactor to include zones * JSON decode to array * Proxy requests --- .env.example | 6 +++ app/Events/SubdomainWasUpdated.php | 21 +++++++++ app/Http/Controllers/AccountController.php | 6 +++ app/Listeners/DNSListener.php | 22 ++++++++++ app/Ninja/DNS/Cloudflare.php | 50 ++++++++++++++++++++++ app/Providers/EventServiceProvider.php | 5 +++ 6 files changed, 110 insertions(+) create mode 100644 app/Events/SubdomainWasUpdated.php create mode 100644 app/Listeners/DNSListener.php create mode 100644 app/Ninja/DNS/Cloudflare.php diff --git a/.env.example b/.env.example index 36f8816f87..067a355aa2 100644 --- a/.env.example +++ b/.env.example @@ -99,3 +99,9 @@ WEPAY_THEME='{"name":"Invoice Ninja","primary_color":"0b4d78","secondary_color": BLUEVINE_PARTNER_UNIQUE_ID= BLUEVINE_PARTNER_TOKEN= + +CLOUDFLARE_DNS_ENABLED=false +CLOUDFLARE_API_KEY= +CLOUDFLARE_EMAIL= +CLOUDFLARE_TARGET_IP_ADDRESS= +CLOUDFLARE_ZONE_IDS={} \ No newline at end of file diff --git a/app/Events/SubdomainWasUpdated.php b/app/Events/SubdomainWasUpdated.php new file mode 100644 index 0000000000..a576daeb9e --- /dev/null +++ b/app/Events/SubdomainWasUpdated.php @@ -0,0 +1,21 @@ +account = $account; + } +} diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 04d3e57d01..f41b9e4cad 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Events\SubdomainWasUpdated; use App\Events\UserSettingsChanged; use App\Events\UserSignedUp; use App\Http\Requests\SaveClientPortalSettings; @@ -768,7 +769,12 @@ class AccountController extends BaseController */ public function saveClientPortalSettings(SaveClientPortalSettings $request) { + $account = $request->user()->account; + + if($account->subdomain !== $request->subdomain) + event(new SubdomainWasUpdated($account)); + $account->fill($request->all()); $account->client_view_css = $request->client_view_css; $account->subdomain = $request->subdomain; diff --git a/app/Listeners/DNSListener.php b/app/Listeners/DNSListener.php new file mode 100644 index 0000000000..83d6253a74 --- /dev/null +++ b/app/Listeners/DNSListener.php @@ -0,0 +1,22 @@ +account); + } +} diff --git a/app/Ninja/DNS/Cloudflare.php b/app/Ninja/DNS/Cloudflare.php new file mode 100644 index 0000000000..56b7bea192 --- /dev/null +++ b/app/Ninja/DNS/Cloudflare.php @@ -0,0 +1,50 @@ +'A', 'name'=>$account->subdomain, 'content'=>env('CLOUDFLARE_TARGET_IP_ADDRESS',''),'proxied'=>true]); + + $opts = [ + CURLOPT_URL => 'https://api.cloudflare.com/client/v4/zones/'.$zone.'/dns_records', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POST => 1, + CURLOPT_POSTFIELDS => $jsonEncodedData, + CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', + 'Content-Length: '.strlen($jsonEncodedData), + 'X-Auth-Email: '.env('CLOUDFLARE_EMAIL', ''), + 'X-Auth-Key: '.env('CLOUDFLARE_API_KEY', '') + ], + ]; + + curl_setopt_array($curl, $opts); + + $result = curl_exec($curl); + $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + curl_close($curl); + + if ($status != 200) + Utils::logError('unable to update subdomain ' . $account->subdomain . ' @ Cloudflare - '.$result); + + } + + + } + + +} \ No newline at end of file diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index ab581e3f79..ecde08cd35 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -200,6 +200,11 @@ class EventServiceProvider extends ServiceProvider 'Illuminate\Queue\Events\JobExceptionOccurred' => [ 'App\Listeners\InvoiceListener@jobFailed' + ], + + //DNS + 'App\Events\SubdomainWasUpdated' => [ + 'App\Listeners\DNSListener@addDNSRecord' ] /*